Python ROS2 プログラム 高専4年生

【ROS2講座⑤】Launchファイルの作成【Python】

前回はROS2のプログラムを色々作成してみました。

今回はLaunchファイルについて学んでゆきます。

パッケージは前回のを引き継いで作業しますので、前回を学んだあとにこちらを実践してください。

Launchファイルとは

これまで、ROS2のプログラムを起動する際には次のようなコマンドを使ってきました。

ros2 run パッケージ名 実行ファイル名

例えば以下の通りです。

ros2 run turtlesim turtlesim_node
ros2 run turtle_playground rotate_abs_keycontrol_raw

この方法は、単一のノードを1つずつ実行するにはとても便利です。
しかし、実際のロボットシステムでは、「センサー」「制御」「表示」など、複数のノードを同時に起動することが一般的です。

ROS2では、1台のロボットが複数のプログラム(ノード)で構成されています。
たとえば、以下のような構成が考えられます。

ノード名役割
camera_nodeカメラ映像の取得
object_detector画像認識を行う
motor_controllerモーターの制御
web_interfaceWeb経由で操作

これらを毎回個別に起動するのは面倒で、設定ミスも起こりやすくなります。
そこで登場するのが Launchファイル です。

Launchファイルは、ROS2において「複数のノードをまとめて起動・設定するためのスクリプト」です。
Launchファイルを使うことで、次のようなことが簡単に行えます。

機能説明
複数ノードの同時起動1つのコマンドで複数ノードを起動できる
パラメータ設定起動時にノードのパラメータを変更できる
トピック名のリマップトピック名を別名に変更して通信を切り替えられる
名前空間の指定ノードをグループ化して整理できる
条件付き起動特定の条件下でのみノードを起動できる

Launchファイルの構成と実行

ROS2のLaunchファイルは Pythonで記述します。
そのため、他の設定ファイル形式(YAMLやXMLなど)よりも柔軟に記述できます。

基本構造は以下の通りです。

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='パッケージ名',
            executable='実行ファイル名',
            name='ノード名',
            output='screen'
        )
    ])

このように記述したPythonファイル(例:my_launch.launch.py)を使って起動します。

ros2 launch パッケージ名 my_launch.launch.py

それではturtlesimをLaunchファイルで起動してみましょう。

ファイル名launch/simple_turtlesim.launch.py

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='turtlesim',
            executable='turtlesim_node',
            name='my_turtle',
            output='screen'
        )
    ])

ファイルの保存場所は以下の通りです。

turtle_playground/
├── package.xml
├── setup.py
├── resource/
├── turtle_playground/
│   ├── __init__.py
│   └── ...(Pythonコード)
└── launch/
    └── simple_turtlesim.launch.py   ← この場所に置く!

Launchファイルをただ置いただけでは、ビルド後にインストールディレクトリにコピーされません。
ROS2は setup.py の設定を見てファイルをコピーする仕組みになっています。

そのため、setup.pydata_files に以下のように追記します。

from setuptools import setup

package_name = 'turtle_playground'

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']),
        # ▼ Launchファイルをコピーする設定を追加
        ('share/' + package_name + '/launch', ['launch/simple_turtlesim.launch.py']),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='Your Name',
    maintainer_email='you@example.com',
    description='Turtlesim Launch Example',
    license='Apache-2.0',
    entry_points={
        'console_scripts': [],
    },
)

ポイント

  • ('share/' + package_name + '/launch', [...]) の指定で、
    colcon build 時に install/turtle_playground/share/turtle_playground/launch にコピーされます。
  • この設定を忘れると、ros2 launch 実行時に「ファイルが見つからない」というエラーになります。

それではビルドをして、起動してみましょう。

# ワークスペースへ戻る
cd ~/ros2_ws

# パッケージをビルド
colcon build --packages-select turtle_playground

# 新しい設定を反映
source install/setup.bash

# Launchファイルの起動
ros2 launch turtle_playground simple_turtlesim.launch.py

無事、TurtleSimが立ち上がれば成功です。

複数ノードの起動

TurtleSimが1つ起動するだけでは何のご利益もありません。

さらに一歩進めて、turtlesimと自作のPythonノード(カメを回転させるパブリッシャー)を同時に起動します。

今回は前回作成したノードも併せて以下の2つを起動します。

ノード名役割
turtlesim_node画面上にカメを表示するシミュレーター
turtle_vel_publisher/turtle1/cmd_vel に角速度を送信し、カメを回転させるノード

通常は次のように2つのターミナルを使います:

ros2 run turtlesim turtlesim_node
ros2 run turtle_playground turtle_vel_publisher

これを 1つのLaunchファイルで同時に起動 できるようにします。

ファイル名: ~/ros2_ws/src/turtle_playground/launch/rotate_demo.launch.py

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        # ① turtlesimを起動
        Node(
            package='turtlesim',
            executable='turtlesim_node',
            name='sim',
            output='screen'
        ),

        # ② カメを回転させるパブリッシャーを起動
        Node(
            package='turtle_playground',
            executable='turtle_vel_publisher',
            name='rotator',
            output='screen'
        ),
    ])

setup.pydata_files に以下を追加します。

('share/' + package_name + '/launch', [
    'launch/simple_turtlesim.launch.py',
    'launch/rotate_demo.launch.py',   # ← これを追加
]),

ビルドと起動を行います。

cd ~/ros2_ws
colcon build --packages-select turtle_playground
source install/setup.bash
ros2 launch turtle_playground rotate_demo.launch.py

Turtlesimが起動し、自動で回転を始めれば成功です。

Launchファイルでパラメータを設定

ROS2のパラメータは、ノードの動作設定を外部から変更できる仕組みです。
ノードのプログラムを書き換えなくても、起動時に「動作モード」や「色」などを切り替えることができます。

たとえば、turtlesim_node には以下のようなパラメータがあります:

パラメータ名内容
background_r背景の赤の成分(0~255)int
background_g背景の緑の成分(0~255)int
background_b背景の青の成分(0~255)int

これらを指定すると、ウィンドウの背景色を変更できます。

Launchファイルの Node()parameters=[{}] を追加します。
中には辞書(キーと値のペア)で設定したいパラメータを書きます。

ファイル名:launch/turtle_color.launch.py

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        # 背景色を変更した turtlesim_node
        Node(
            package='turtlesim',
            executable='turtlesim_node',
            name='color_turtle',
            output='screen',
            parameters=[{
                'background_r': 0,
                'background_g': 200,
                'background_b': 255
            }]
        )
    ])

setup.py に以下を追記します。

('share/' + package_name + '/launch', [
    'launch/rotate_demo.launch.py',
    'launch/turtle_color.launch.py',   # ← 追加
]),

実行してみましょう。

cd ~/ros2_ws
colcon build --packages-select turtle_playground
source install/setup.bash
ros2 launch turtle_playground turtle_color.launch.py

水色の背景に変わった状態で起動すれば成功です。

課題7

turtlesim_node背景色を変更し、同時にturtle_vel_publisher回転半径を変えて起動するLaunchファイルを作成してください。

【条件】

  1. ファイル名
    launch/rotate_with_param.launch.py
  2. 背景色
    • 赤(R)= 180
    • 緑(G)= 230
    • 青(B)= 255
  3. turtle_vel_publisherには以下のパラメータを渡す:
    • radius = 2.0 (デフォルトの回転より広い軌道で回る)
  4. 2つのノードを同時に起動する。
  5. 実行コマンド:
ros2 launch turtle_playground rotate_with_param.launch.py
解答例はこちら
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        # ① 背景色を設定したturtlesimノード
        Node(
            package='turtlesim',
            executable='turtlesim_node',
            name='sim',
            output='screen',
            parameters=[{
                'background_r': 180,
                'background_g': 230,
                'background_b': 255
            }]
        ),

        # ② 回転半径を指定した自作パブリッシャー
        Node(
            package='turtle_playground',
            executable='turtle_vel_publisher',
            name='rotator',
            output='screen',
            parameters=[{
                'radius': 2.0
            }]
        ),
    ])

次回はこちら

Comming soon

Follow me!

-Python, ROS2, プログラム, 高専4年生
-, , , ,

PAGE TOP