ROS2開発必备ツール完全ガイド - launchファイルからデータ可視化まで

はじめに

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トピックとして发布します。これにより、実機なしでアルゴリズムの開発とテストが可能です。

タグ: ros2 launch ros2launch ros2bag rviz2

7月15日 23:22 投稿