Launchファイル

ROSでは複数のノードを同時に立ち上げて、それぞれのノードからデータを送受信したりしています。 今まではros2 runコマンドで1つ1つノードを立ち上げていましたが、実際には複数のノードをLaunchファイルというもので起動します。 このLaunchファイルからトピック名やノード名、パラメータの値を変更出来るので非常に便利です。

注釈

ここでは トピック通信 で作ったhello_topicパッケージのiteration_nodeノードと パラメータ で作ったhello_paramパッケージのmultiply_nodeノードを使います。 まだ作ってない人は先に、そちらをご覧ください。

今回の目標

今回は以下のようなLaunchファイルをもつhello_launchパッケージを作りましょう。

  • hello.launch.py

    • 以下の2つのノードを立ち上げるLaunchファイル

      • hello_topicパッケージのiteration_node.py

      • hello_topicパッケージのdouble_node.py

  • two_double.launch.py

    • 以下の3つのノードを立ち上げるLaunchファイル

      • hello_topicパッケージのiteration_node.py

      • hello_topicパッケージのdouble_node.py

      • hello_topicパッケージのdouble_node.py

        • double_nodeノードをquad_nodeノードに変更

        • /numberトピックを/double_numberトピックにリマップ

        • /double_numberトピックを/quad_numberトピックにリマップ

  • double_and_multiply.launch.py

    • 以下の3つのノードを立ち上げるLaunchファイル

      • hello_topicパッケージのiteration_node.py

      • hello_topicパッケージのdouble_node.py

      • hello_paramパッケージのmultiply_node.py

        • /numberトピックを/double_numberトピックにリマップ

        • m_numberパラメータを4に変更

Tip

今回はPythonでLaunchファイルを書きますが、YAMLやROS 1時代のXMLでもLaunchファイルを書けます。 詳しくは公式のチュートリアル(英語)を読んでください。

パッケージの作成

ros2 pkg create --build-type ament_cmake hello_launch

Launchファイルを保存するlaunchディレクトリを作成します。

cd hello_launch
mkdir launch

CMakelists.txtの編集

以下の3行をCMakelists.txtに追加

# 追加
install(
  DIRECTORY launch
  DESTINATION share/${PROJECT_NAME}
)

最終的なCMakelists.txtは以下のようになります。

cmake_minimum_required(VERSION 3.8)
project(hello_launch)

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)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)

# 追加
install(
  DIRECTORY launch
  DESTINATION share/${PROJECT_NAME}
)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # comment the line when a copyright and license is added to all source files
  set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # comment the line when this package is in a git repo and when
  # a copyright and license is added to all source files
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

hello.launch.pyのコード

launch/hello.launch.pyを以下の内容で書き込む。

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='hello_topic',
            executable='iteration_node',
            name='iteration_node',
        ),
        Node(
            package='hello_topic',
            executable='double_node',
            name='double_node',
        ),
    ])

two_double.launch.pyのコード

launch/two_double.launch.pyを以下の内容で書き込む。

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='hello_topic',
            executable='iteration_node',
            name='iteration_node',
        ),
        Node(
            package='hello_topic',
            executable='double_node',
            name='double_node',
        ),
        Node(
            package='hello_topic',
            executable='double_node',
            name='quad_node',
            remappings=[
                ('/number', '/double_number'),
                ('/double_number', '/quad_number'),
            ],
        ),
    ])

double_and_multiply.launch.pyのコード

launch/double_and_multiply.launch.pyを以下の内容で書き込む。

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='hello_topic',
            executable='iteration_node',
            name='iteration_node',
        ),
        Node(
            package='hello_topic',
            executable='double_node',
            name='double_node',
        ),
        Node(
            package='hello_param',
            executable='multiply_node',
            name='multiply_node',
            remappings=[
                ('/number', '/double_number'),
            ],
            parameters=[
                {'m_number': 4},
            ]
        ),
    ])

ビルドと実行

cd ~/my_ws
colcon build
source install/setup.bash

ros2 launchコマンドでLaunchファイルを立ち上げましょう。 立ち上がったらrqt_graphでノード間の通信の様子やrqtを使ってトピックを見てみましょう。

Tip

rqtでトピックを見るにはPluginsタブからTopicsTopicsからTopic Monitorを選択してトピックの様子を見てみましょう。

hello.launch.py

ros2 launch hello_launch hello.launch.py

ノード間の通信の図は既に Hello world で紹介したグラフと同じなので省略します。

two_double.launch.py

ros2 launch hello_launch two_double.launch.py
rqt_graph
rqt
../_images/launch-two-double-rqt-graph.png

rqt_graph

../_images/launch-two-double-rqt.png

rqtでトピックを見た様子

/numberトピックの値を2倍したものが/double_numberへ、/double_numberトピックの値をさらに2倍したものが/quad_numberへ送られているのが分かります。

double_and_multiply.launch.py

ros2 launch hello_launch double_and_multiply.launch.py
rqt_graph
rqt
../_images/launch-double-and-multiply-rqt-graph.png

rqt_graph

../_images/launch-double-and-multiply-rqt.png

rqtでトピックを見た様子

/numberトピックの値を2倍したものが/double_numberへ、/double_numberトピックの値をさらにパラメータで指定した4倍にしたものが/multiplied_numberへ送られているのが分かります。

参照