はじめに
今回の記事では、ROS 2において、launchファイルを用いて複数のノードを起動する方法について記載していきます。ROSの際はlaunchファイルをxml形式で記述してきましたが、ROS 2ではpython、xml、yamlで記述する方法が提供されています。今回の記事ではこの3つの記述方法の内、pythonでのやり方について記載していきます。
前提条件
今回の記事は、以下の環境で動かすことを前提に記載しています。
条件 | |
---|---|
OS | Ubuntu 22.04 |
ROS | ROS 2 humble |
準備
launchファイルを格納するディレクトリ作成
ROSの時と同様、以下のコマンドでパッケージ内にlaunchディレクトリを作成します。今回の例では、前回の記事で作成したpub_sub_cpp_01パッケージ内にlaunchディレクトリを作成しています。
cd ~/ros2_ws/src/pub_sub_cpp_01/
mkdir launch
package.xmlの編集
~/ros2_ws/src/pub_sub_cpp_01/package.xml のを記述している場所に以下を追記します。
<exec_depend>ros2launch</exec_depend>
CMakeLists.txtの編集
~/ros2_ws/src/pub_sub_cpp_01/CMakeLists.txtに以下を追記します。追記しなくても実行できますが、launchファイルを配置したディレクトリ以外でros2 launch コマンドを実行すると、launchファイルを見つけられないので、追記を推奨します。
install(DIRECTORY launch
DESTINATION share/${PROJECT_NAME})
launchファイルの作成
以下のファイルを~/ros2_ws/src/pub_sub_cpp_01/launch に配置します。今回ファイル名は、pub_sub_cpp_01_launch.pyとしています。6~15行目に記述しているように、Node()を追記することで起動するノードを追加することができます。また、今回の例では、パッケージ名、名前空間、実行ファイル名のみを記載していますが、remappingsを使用することで、トピックの再マッピングも可能です。名前空間については、同じノードを複数起動したい場合にnamespaceにそれぞれ異なる名前を設定する事で、同じノードを区別して実行することが可能になります。
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='pub_sub_cpp_01',
namespace='kccs_pub_sub_cpp_01',
executable='publisher'
),
Node(
package='pub_sub_cpp_01',
namespace='kccs_pub_sub_cpp_01',
executable='subscriber'
)
])
ビルド
以下のコマンドでビルドします。ビルドしなくとも直接launchディレクトリに移動して、ros2 launch pub_sub_cpp_01_launch.py とコマンドを打てば実行可能です。
cd ~/ros2_ws
colcon build
実行
以下のどちらかのコマンドを実行します。
cd ros2_ws/src/pub_sub_cpp_01/launch
ros2 launch pub_sub_cpp_01_launch.py
ros2 launch pub_sub_cpp_01 pub_sub_cpp_01_launch.py
実行結果
おわりに
今回の記事では、ROS 2でのlaunchファイルの書き方について記載しました。次回の記事では、今回の内容からは少し逸れますが、ament_cmake_autoについて記載する予定です。ament_cmake_autoを使用しなくともビルドは可能ですが、使用した方がビルド設定を比較的楽に記述できますので、興味がある方は是非ご覧ください。