ROS2で複数のノードを起動するのに、いちいちros2 run package1 node
、ros2 run package2 node
...と実行するのは面倒ですよね。
ros2 launch
を使えば、複数のノードを一括で起動できます。
今回はlaunchファイルを作成してから使うまでの流れを紹介します。
launchファイルを作成する
launchに必要なファイルを作成しましょう。
まず、パッケージのディレクトリ内にlaunchファイルを保管するlaunch/
ディレクトリを作ります。
その中に起動したいノードを記述するfilename_launch.py
(慣例的にファイル名はsuffixに.launch.pyか_launch.pyとする)を作成。
以下のように起動したいノードを記述します。
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
# 起動したいノードを記述
Node(
package=‘package1’,
executable=‘node’,
),
Node(
package=‘package2’,
executable=‘node’,
)
])
詳しい書き方は公式チュートリアル[1]https://docs.ros.org/en/foxy/Tutorials/Launch-Files/Creating-Launch-Files.htmlが参考になります。
公式チュートリアルには載っていませんが、Nodeに関して以下のパラメータが便利です。
prefix="xterm -e"
:ノードを起動するときに別のターミナルを立ち上げる(事前にxtermをインストールしておく必要)output="screen"
:launchで実行された標準出力をコンソール表示するためのオプション(デフォルトだと標準出力はコンソールではなく、ログファイルに吐き出される)required="true"
:該当ノードが終了した場合に、launchファイルにある他の全てのノードを停止させる。respawn="true"
:該当ノードが終了した場合に、再起動するようにする。
launchファイルを使う
launchファイルの呼び出し方は2通り。
1. パスで直接指定して使う方法
以下のようにパスを直接指定して実行する。
ros2 launch path/to/launch_dir/hoge_launch.py
2. ビルドして使う方法
1. パッケージ内のsetup.py
のdata_filesパラメータに、以下のようにlaunchファイルのパスを追加(これはcolcon(ビルドツール)がlaunchファイルを見つけられるようにするため)
import os
from glob import glob
# ...
setup(
# ...
data_files=[
# ...
(os.path.join('share', package_name), glob('launch/*_launch.py')),
]
)
2. ビルドとソースをして、以下のように実行
ros2 launch <package_name> <launch_file_name>
このようにパスを指定しなくて良いので扱いが楽です。
launchファイルを作成した場合はsetup.pyに反映させる、ということを覚えておくと良いと思います。
その他
- launchファイルでノードのパラメータを設定したい場合の参考:https://docs.ros.org/en/foxy/Tutorials/Using-Parameters-In-A-Class-Python.html
コメント