前回は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_interface | Web経由で操作 |
これらを毎回個別に起動するのは面倒で、設定ミスも起こりやすくなります。
そこで登場するのが 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.py
の data_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.py
の data_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ファイルを作成してください。

【条件】
- ファイル名:
launch/rotate_with_param.launch.py
- 背景色:
- 赤(R)= 180
- 緑(G)= 230
- 青(B)= 255
- turtle_vel_publisherには以下のパラメータを渡す:
radius = 2.0
(デフォルトの回転より広い軌道で回る)
- 2つのノードを同時に起動する。
- 実行コマンド:
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