2024-08-23 14:45
ソフトウェアチームの高橋です。
ROS 2は、ロボットシステムの開発において非常に強力なツールであり、その中でロボットシステムの起動を担うのがLaunchファイルです。
Launchファイルは、ROS 2ノードやトピック、パラメータなどの設定を記述し、複数のノードを起動し管理するための仕組みです。launchファイルからノードが起動するイメージを示します。
ROS 2では、LaunchファイルをPython、XML、YAMLの3つの形式で記述することができます。
まず、例を用いて各形式のファイルを示します。
その後にそれぞれの形式の特徴やメリット、デメリットを挙げていきます。
準備
今回はシミュレータ(Gazebo)のlaunchファイルである「turtlebot3_world.launch.py」を例題とします。
そこで前提として、以前の記事「 ROS2でSLAM入門1:ROS2インストールからマップ作成編 」の「シミュレータ(gazebo)起動」まで進めているPC環境を持っていることとします。
そこで次のコマンドを実行し、シミュレータの画面が見えるようになっていればOKです。
$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
ちなみにPC環境は以下の通りになっているかと思います。
- OS:Ubuntu 22
- ROS2 version:humble
各形式のlaunchファイル例
各形式の例を上げる前に例題の「turtlebot3_world.launch.py」上で、おおまかになにが行われているかを列挙します。
- ①パラメータ設定
- ②シミュレーションサーバの起動
- ③シミュレーションクライアント(画面、GUI)の起動
- ④ロボットのtf(各リンクの姿勢情報)を出力するノードの起動
- ⑤シミュレータ上にturtlebot3をスポーンさせるノードの起動
これらに着目して見てみてください。
Python形式
まず、Python形式です。
以下に示すのは、先程実行した「turtlebot3_world.launch.py」を整理してコメントを追加したものになります(元のファイルは こちら )。
#!/usr/bin/env python3 # # Copyright 2024 TechnoRoad Corp. # # Licensed under the Apache License, Version 2.0 (the “License”); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an “AS IS” BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # # See the License for the specific language governing permissions and # limitations under the License. import os from ament_index_python.packages import get_package_share_directory from launch import LaunchDescription from launch.actions import IncludeLaunchDescription from launch.launch_description_sources import PythonLaunchDescriptionSource from launch.substitutions import LaunchConfiguration def generate_launch_description(): tb3_launch_dir = os.path.join(get_package_share_directory('turtlebot3_gazebo'), 'launch') gz_ros_launch_dir = os.path.join(get_package_share_directory('gazebo_ros'), 'launch') world_file_dir = os.path.join(get_package_share_directory('turtlebot3_gazebo'), 'worlds') # ①パラメータ設定 use_sim_time = LaunchConfiguration('use_sim_time', default='true') x_pose = LaunchConfiguration('x_pose', default='-2.0') y_pose = LaunchConfiguration('y_pose', default='-0.5') ld = LaunchDescription() # ②シミュレーションサーバの起動 server_launch_path = os.path.join(gz_ros_launch_dir, 'gzserver.launch.py') world_file = os.path.join(world_file_dir, "turtlebot3_world.world") ld.add_action(IncludeLaunchDescription( PythonLaunchDescriptionSource(server_launch_path), launch_arguments={'world': world_file}.items() )) # ③シミュレーションクライアント(画面、GUI)の起動 client_launch_path = os.path.join(gz_ros_launch_dir, 'gzclient.launch.py') ld.add_action(IncludeLaunchDescription( PythonLaunchDescriptionSource(client_launch_path) )) # ④ロボットのtf(各リンクの姿勢情報)を出力するノードの起動 rb_state_pub_launch_path = os.path.join(tb3_launch_dir, 'robot_state_publisher.launch.py') ld.add_action(IncludeLaunchDescription( PythonLaunchDescriptionSource(rb_state_pub_launch_path), launch_arguments={'use_sim_time': use_sim_time}.items() )) # ⑤シミュレータ上にturtlebot3をスポーンさせるノードの起動 spawn_tb3_launch_path = os.path.join(tb3_launch_dir, 'spawn_turtlebot3.launch.py') ld.add_action(IncludeLaunchDescription( PythonLaunchDescriptionSource(spawn_tb3_launch_path), launch_arguments={'x_pose': x_pose, 'y_pose': y_pose}.items() )) return ld
XML形式
次はXML形式。
<?xml version='1.0' ?> <!-- Copyright 2024 TechnoRoad Corp. Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <launch> <arg name="launch_file_dir" default="$(find-pkg-share turtlebot3_gazebo)/launch"/> <arg name="gz_ros_launch_dir" default="$(find-pkg-share gazebo_ros)/launch"/> <arg name="world_file_dir" default="$(find-pkg-share turtlebot3_gazebo)/worlds"/> <!-- ①パラメータ設定 --> <arg name="use_sim_time" default="true"/> <arg name="x_pose" default="-2.0"/> <arg name="y_pose" default="-0.5"/> <!-- ②シミュレーションサーバの起動 --> <include file="$(var gz_ros_launch_dir)/gzserver.launch.py"> <arg name="world" value="$(var world_file_dir)/turtlebot3_world.world"/> </include> <!-- ③シミュレーションクライアント(画面、GUI)の起動 --> <include file="$(var gz_ros_launch_dir)/gzclient.launch.py"/> <!-- ④ロボットのtf(各リンクの姿勢情報)を出力するノードの起動 --> <include file="$(var launch_file_dir)/robot_state_publisher.launch.py"> <arg name="use_sim_time" value="$(var use_sim_time)"/> </include> <!-- ⑤シミュレータ上にturtlebot3をスポーンさせるノードの起動 --> <include file="$(var launch_file_dir)/spawn_turtlebot3.launch.py"> <arg name="x_pose" value="$(var x_pose)"/> <arg name="y_pose" value="$(var y_pose)"/> </include> </launch>
YAML形式
最後にYAML形式。
# Copyright 2024 TechnoRoad Corp. # # Licensed under the Apache License, Version 2.0 (the “License”); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an “AS IS” BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # # See the License for the specific language governing permissions and # limitations under the License. launch: - arg: name: "launch_file_dir" default: "$(find-pkg-share turtlebot3_gazebo)/launch" - arg: name: "gz_ros_launch_dir" default: "$(find-pkg-share gazebo_ros)/launch" - arg: name: "world_file_dir" default: "$(find-pkg-share turtlebot3_gazebo)/worlds" # ①パラメータ設定 - arg: name: "use_sim_time" default: "true" - arg: name: "x_pose" default: "-2.0" - arg: name: "y_pose" default: "-0.5" # ②シミュレーションサーバの起動 - include: file: "$(var gz_ros_launch_dir)/gzserver.launch.py" arg: - name: "world" value: "$(var world_file_dir)/turtlebot3_world.world" # ③シミュレーションクライアント(画面、GUI)の起動 - include: file: "$(var gz_ros_launch_dir)/gzclient.launch.py" # ④ロボットのtf(各リンクの姿勢情報)を出力するノードの起動 - include: file: "$(var launch_file_dir)/robot_state_publisher.launch.py" arg: - name: "use_sim_time" value: "$(var use_sim_time)" # ⑤シミュレータ上にturtlebot3をスポーンさせるノードの起動 - include: file: "$(var launch_file_dir)/spawn_turtlebot3.launch.py" arg: - name: "x_pose" value: "$(var x_pose)" - name: "y_pose" value: "$(var y_pose)"
各形式の実行方法
次の手順で実行して、シミュレーションの画面が出ることを確認して見て下さい。
-
上で示した各形式をファイルとして保存する
-
Python形式の場合は
sample.launch.py
という名前とする -
XML形式の場合は
sample.launch.xml
という名前とする -
YAML形式の場合は
sample.launch.yaml
という名前とする
-
Python形式の場合は
-
1のファイルを
~/turtlebot3_ws/src/turtlebot3_simulations/turtlebot3_gazebo/launch/
へコピーする - ビルドを行う
$ cd ~/turtlebot3_ws $ colcon build
-
各ファイルを起動する
- Python形式の場合
$ ros2 launch turtlebot3_gazebo sample.launch.py
- XML形式の場合
$ ros2 launch turtlebot3_gazebo sample.launch.xml
- YAML形式の場合
$ ros2 launch turtlebot3_gazebo sample.launch.yaml
比較
それぞれの形式の特徴やメリット、デメリット
Python形式
Python形式のLaunchファイルは、Pythonスクリプトとして記述されます。そのため、Pythonの柔軟性と表現力を活用してLaunchファイルを記述することができます。
メリット
- Pythonの文法や標準ライブラリを利用できるため、複雑な条件分岐やループを記述することが容易
- プログラマブルな特性を活かして、動的なLaunchファイルを生成することができまる
- ROS 2の多くのパッケージで使用されており、今後も主流と考えられる
デメリット
- Pythonのスクリプトであるため、記述が複雑になりがち
- 使いたい機能ごとにimport文を書く必要がある
XML形式
XML形式のLaunchファイルは、XML文書として記述されます。
メリット
- XMLの構造がシンプルで、ツリー構造を持つため、階層的な構成を持つlaunchファイルを表現するのに適してる
- XML形式はROS1のlaunchと同じ形式の為、ROS1→ROS2の移行がしやすい
デメリット
- 複雑な条件分岐や動的な構成を記述することが難しい
YAML形式
YAML形式のLaunchファイルは、YAML文書として記述されます。
メリット
- YAMLは人間にとって読みやすく、理解しやすい構造を持つ
- Pythonのディクショナリと似た構造を持ち、ROS 2のパラメータサーバとの親和性が高いと思われる
デメリット
- 複雑な条件分岐やループを記述することが難しい
まとめ
いかがだったでしょうか。
今回は各形式のlaunchファイルを示し、簡単にメリット、デメリットを挙げました。
Python形式は柔軟性が高く、XML形式はROS1からの移行性があり、YAML形式は読みやすさに優れていそうですね。
最終的には、プロジェクトの要件や開発者の好みに応じて、適切な形式を選択することになりそうです。
また、より詳しくROS 2のlaunchファイルの事知りたい方は
launchの公式チュートリアル
を参照してください。