はじめに
ROS2の開発では、ターミナルを頻繁に使用し、複数のウィンドウを同時に開いて作業することが多得にあります。ここでは、智能的なターミナル端末であるTerminatorを紹介します。
Terminatorのインストール:
sudo apt install terminator
launchファイルによる複数ノードの起動
ロボットシステムを起動する際には、多くの場合、複数のノードを同時に起動する必要があります。各ノードはアプリケーションシナリオやロボットの種類によって異なる設定が必要です。launchファイルを使用すると、複数のROS2ノードを同時に起動し、設定を一元管理できます。
ROS2では、Python、XML、YAMLの3種類の形式でlaunchファイルを記述できます。公式にはPython形式が推奨されており、柔軟性と使いやすさの観点から、この形式で解説します。
シンプルなlaunchファイルの作成
まず、ワークスペースとパッケージを作成します:
mkdir -p robotics_ws/src
cd robotics_ws/src
ros2 pkg create --build-type ament_cmake robot_launch_demo
cd robot_launch_demo
mkdir launch
cd launch
touch system_start.launch.py
launchファイルはPythonスクリプトとして記述します。以下のコードは、turtlesimパッケージのシミュレーションを2つのインスタンスとして起動する例です:
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='turtlesim',
executable='turtlesim_node',
namespace='left_sim',
name='turtle_controller'
),
Node(
package='turtlesim',
executable='turtlesim_node',
namespace='right_sim',
name='turtle_controller'
)
])
Nodeの設定には、主に3つの必須属性があります。packageはパッケージ名、executableは実行可能ファイル名、nameは実行時のノード名です。
重要なNode属性
Nodeの設定には、さらに以下の属性を活用できます:
| 属性 | 説明 |
|---|---|
| namespace | ノード名の前に名前空間を付与し、同名のノードを区別 |
| respawn | true設定でノード異常終了時に自動再起動 |
| output | 'screen'設定で出力をターミナルに表示 |
| arguments | ノード起動時の引数指定 |
| remappings | トピック名やサービス名のマッピング変更 |
launchファイルのビルドと実行
launchファイルを使用するには、まずpackage.xmlに必要な依存関係を追加します:
<exec_depend>ros2launch</exec_depend>
次に、CMakeLists.txtにlaunchファイルのインストール設定を追加します:
install(DIRECTORY
launch
DESTINATION share/${PROJECT_NAME}/
)
ビルドと実行の手順:
cd robotics_ws
colcon build
source install/setup.bash
ros2 launch robot_launch_demo system_start.launch.py
名前空間による分離
複数のシミュレーターを起動する場合、名前空間を使用することでトピックを分離できます:
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='turtlesim',
namespace='simulation_a',
executable='turtlesim_node',
name='primary_node'
),
Node(
package='turtlesim',
namespace='simulation_b',
executable='turtlesim_node',
name='primary_node'
)
])
トピックのマッピング
名前空間を使用すると、キーボード操作用ノードturtle_teleop_keyとの互換性问题が発生します。デフォルトのトピック/turtle1/cmd_velが異なる名前空間下に存在するためです。この問題を解決するには、トピックのマッピングを行います:
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='turtlesim',
namespace='simulation_a',
executable='turtlesim_node',
name='primary_node',
remappings=[
('/simulation_a/turtle1/cmd_vel', '/turtle1/cmd_vel'),
]
),
Node(
package='turtlesim',
namespace='simulation_b',
executable='turtlesim_node',
name='primary_node'
)
])
シェルコマンドの実行
launchファイル内からシェルコマンドを実行できます。これはパラメータの動的設定などに便利です:
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import ExecuteProcess
def generate_launch_description():
return LaunchDescription([
Node(
package='turtlesim',
namespace='simulation_a',
executable='turtlesim_node',
name='primary_node',
remappings=[
('/simulation_a/turtle1/cmd_vel', '/turtle1/cmd_vel'),
]
),
Node(
package='turtlesim',
namespace='simulation_b',
executable='turtlesim_node',
name='primary_node'
),
ExecuteProcess(
cmd=[[
'ros2 param set ',
'/simulation_a/primary_node ',
'background_r ',
'150'
]],
shell=True
)
])
.launch引数による柔軟な設定
launchファイルをより柔軟にするため、起動時にパラメータを渡す機能を追加できます:
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.substitutions import LaunchConfiguration
from launch.actions import ExecuteProcess, DeclareLaunchArgument
def generate_launch_description():
bg_blue_config = LaunchConfiguration('bg_blue_config')
bg_blue_argument = DeclareLaunchArgument(
'bg_blue_config',
default_value='200',
description=' turtlesimの背景色青色値を設定'
)
return LaunchDescription([
bg_blue_argument,
Node(
package='turtlesim',
namespace='simulation_a',
executable='turtlesim_node',
name='primary_node',
remappings=[
('/simulation_a/turtle1/cmd_vel', '/turtle1/cmd_vel'),
]
),
Node(
package='turtlesim',
namespace='simulation_b',
executable='turtlesim_node',
name='primary_node'
),
ExecuteProcess(
cmd=[[
'ros2 param set ',
'/simulation_a/primary_node ',
'background_b ',
bg_blue_config
]],
shell=True
)
])
launchファイルがサポートする引数を確認:
ros2 launch robot_launch_demo system_start.launch.py --show-args
パラメータを指定してlaunchファイルを起動:
ros2 launch robot_launch_demo system_start.launch.py bg_blue_config:=180
launchファイルの再利用
大きなプロジェクトでは、launchファイルをネストして再利用することで、コードの重複を避け、保守性を高めることができます:
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import ExecuteProcess, IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
def generate_launch_description():
dual_sim = IncludeLaunchDescription(
PythonLaunchDescriptionSource([
os.path.join(
get_package_share_directory('robot_launch_demo'),
'launch',
'/system_start.launch.py'
)
]),
launch_arguments={'bg_blue_config': '180'}.items()
)
velocity_publisher = ExecuteProcess(
cmd=[[
'ros2 topic pub -r 1 /turtle1/cmd_vel geometry_msgs/msg/Twist '
'"{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -1.8}}"'
]],
shell=True
)
return LaunchDescription([
dual_sim,
velocity_publisher
])
ros2 bagによるデータ記録
ros2 bagは、トピックのデータを記録・再生するための重要なツールです。実車デバッグ時に问题的発生状況を記録し、原因特定に役立てることができます。
基本的な使用方法
ros2 bag record /sensor_data # 特定のトピックを記録
ros2 bag record /odom /imu_data # 複数のトピックを記録
ros2 bag record -a # すべてのトピックを記録
ros2 bag record -o experiment_01 /localization_data # ファイル名を指定
ros2 bag play experiment_01.db3 # 記録したデータを再生
ros2 bag play experiment_01.db3 -r 5 # 5倍速で再生
ros2 bag play experiment_01.db3 -l # ループ再生
ros2 bag play experiment_01.db3 --topics /camera_image # 特定のトピックのみ再生
RQTツール
RQTは、QtフレームワークベースのGUIツール群で、ROS2開発の様々な場面で活躍します。
インストールと起動
sudo apt install ros-humble-rqt
rqt
rqt_tf_tree(座標変換ツリー)
座標変換関係を確認するためのツールです:
sudo apt install ros-humble-rqt-tf-tree
起動時にエラーが発生した場合、以下のコマンドで設定を再初期化します:
rm ~/.config/ros.org/rqt_gui.ini
rqtを起動後、Plugins → Visualization → TF TreeからTFツリーを確認できます。
rqt_graph(ノードグラフ)
ノード間の接続関係を視覚的に確認できます:
rqt_graph
または、rqtを起動してPlugins → Introspection → Node Graphを選択します。
rqt_plot(データプロット)
トピックのデータをリアルタイムでグラフ表示できます。-aオプションで全トピックを記録した後、rqt_plotを起動し、监测したいトピック名を入力します。入力は/区切りで、エンターキーで確定するとXYZなどの全メンバーが自動追加されます。
PlotJugglerと比較すると、rqt_plotは設定ファイルの保存ができず機能が限定的であるため、より高度な可视化にはPlotJugglerの使用を推奨します。
PlotJuggler
PlotJugglerは、ROS2データ可視化の標準ツールとして広く使用されています。rqt_plotよりも柔軟な操作性と豊富な機能を提供します。
sudo apt-get install ros-humble-plotjuggler
sudo apt-get install ros-humble-plotjuggler-msgs ros-humble-plotjuggler-ros
主な機能として、複数プロットの並列表示、ズーム機能による詳細確認、レイアウトの保存と読み込み、UNDO/REDO機能、CSVやrosbagファイルの読み込みサポート、リアルタイムトピック订阅によるデータ表示、RosPublisherによるメッセージの再发布などが含まれます。
RVIZ2によるデータ可視化
RVIZ2は、ROS2開発における標準的な三维データ可視化ツールです。画像データ、点群データ、地图データ、TF座標変換データ、机器人モデルデータなど、多様なデータを視覚的に確認できます。
起動:
rviz2
RVIZ2はGazeboとは異なり、既存のデータを表示することに特化しています。Gazeboが模拟环境からデータを生成するのに対し、RVIZ2は実際のロボットやシミュレーターから发布されたデータを可视化するという点で、両者は補完的な関係にあります。
左下のAddボタンから、各种可视化パネルを追加できます。
Gazeboによるシミュレーション
Gazeboは、机器人モデルの物理シミュレーション环境を提供する独立したアプリケーションです。ROS2と連携することで、仮想环境内でロボット传感器データを生成し、アルゴリズムの開発と验证に活用できます。
ROS2とGazeboの連携は、gazebo_ros_pkgsパッケージを通じて実現されます:
sudo apt install gazebo
sudo apt install ros-humble-gazebo-*
Gazeboでは、指定した机器人モデルと传感器設定に基づき、仮想的な电机動作や传感器データ生成を行い、ROS2トピックとして发布します。これにより、実機なしでアルゴリズムの開発とテストが可能です。