Pythonパッケージ内にlaunchを作る場合 → python用の作成方法を見てください
C++パッケージ内にlaunchを作る場合 → C++用の作成方法を見てください
srcコードをpythonで記載しているディレクトリ内にlaunchファイルを作成するときのlaunchファイルの書き方になります。
複数のノードを同時に立ち上げたいときにlaunchファイルを作ると楽になる。
Pythonのtopic通信のプログラムを例にlaunchファイルを作成します。
今回は、mypublisherとmysubscriberの2つのパッケージからpublihser_nodeとsubscriber_nodeを立ち上げるlaunchファイルを作ります。
topic通信プログラムで説明したmypublisherのディレクトリの中にlaunchディレクトリを作成します。
$ mkdir -p ~/ros2_ws/src/tests/mypublisher/launch
作成したlaunchディレクトリに移動してpubsub_launch.pyファイルを作成。pubsub_launch.pyの「pubsub_launch」と書いてあるところの名前は好きに決めて良い。
$ cd ~/ros2_ws/src/tests/mypublisher/launch
$ gedit pubsub_launch.py
pubsub_launch.pyに下記のコードを記載する。
#pubsub_launch.py
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='mypublisher',
namespace='pubsub', # namespaceを一致させる。何も書かない場合はもう一方も何も書かなければOK.
executable='publisher_node',
),
Node(
package='mysubscriber',
namespace='pubsub', # namespaceを一致させる。何も書かない場合はもう一方も何も書かなければOK.
executable='subscriber_node',
),
])
packageは「パッケージ名」。publisher_nodeとsubscriber_nodeを作ったときのパッケージ名mypublisherとmysubscriberを記載。
namespaceは「名前空間」。通信したいノード同士は同じ名前空間にする必要がある。今回は「pubsub」と記載。
excutableはmypublisherパッケージからは実行ファイルpublisher_node、mysubscriberパッケージからは実行ファイルsubscriber_nodeを記載。
次に、mypublisherパッケージのsetpu.pyを修正する。
$ cd ~/ros2_ws/src/test/mypublisher
$ gedit setup.py
setup.pyの内容は下記のように追記。3箇所だけです。
import os #追加
from glob import glob #追加
from setuptools import setup
package_name = 'mypublisher'
setup(
name=package_name,
version='0.0.0',
packages=[package_name],
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
(os.path.join('share', package_name), glob('launch/pubsub_launch.py')), #追加
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='takubo',
maintainer_email='takubo@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'subscriber_node = mypublishser.publisher_node:main'
],
},
)
終わったら、保存して下記のコマンドでビルド。
$ cd ~/ros2_ws/
$ colcon build
$ source ~/ros2_ws/install/setup.bash
下記を実行すれば、publisher_nodeとsubscriber_nodeが同時に立ち上がるようになります。
$ ros2 launch mypublisher pubsub_launch.py
以上で終わり。
ROS1より面倒になったような気がします。
srcコードをC++で記載しているディレクトリ内にlaunchファイルを作成するときのlaunchファイルの書き方になります。
Topic通信の作り方(C++)のパッケージ内にlaunchファイルを作成するときの記載方法を説明します。
まず、パッケージのpackage.xmlを下記のように1行追加します。(下記は一応全部のソースを記載します。)
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>mypubsub</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="takubo@*****.ac.jp">username</maintainer> # username and email
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<exec_depend>launch_ros</exec_depend> #この行を追加
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
次に、CMakefiles.txtを修正します。これも1行追加するだけ。
cmake_minimum_required(VERSION 3.5)
project(mypubsub)
# Default to C99
if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif()
# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
add_executable(publisher_node src/publisher_node.cpp)
add_executable(subscriber_node src/subscriber_node.cpp)
target_include_directories(publisher_node PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
ament_target_dependencies(publisher_node rclcpp std_msgs)
ament_target_dependencies(subscriber_node rclcpp std_msgs)
install(TARGETS publisher_node subscriber_node
DESTINATION lib/${PROJECT_NAME})
install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) #追加
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()
最後に、launchファイルを書きます。
cd ~/ros2_ws/src/cpp_pkg/mypubsub/
mkdir launch
cd launch
gedit pubsub_launch.py
pubsub_launcb.pyの内容は下記の通り。
書き方はptyonの書式なので同じ記載方法となります。C++とpythonの違いは、package.xmlとCMakefiles.txtの設定ファイルの部分のみ。
#pubsub.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='mypubsub',
namespace='pubsub', # namespaceを一致させる。何も書かない場合はもう一方も何も書かなければOK.
executable='publisher_node',
output='screen'
),
Node(
package='mypubsub',
namespace='pubsub', # namespaceを一致させる。何も書かない場合はもう一方も何も書かなければOK.
executable='subscriber_node',
output='screen'
),
])