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

【ROS2講座⑥】rosbag2とrqtツールで記録と可視化【Python】

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

これまでに作成したノードでは、カメの動きをリアルタイムで観察してきました。
しかし、実験結果を記録して後から再生したい場合もあります。

ROS2にはそのための便利な機能 rosbag2(ロスバッグツー) があります。
この章では、カメの動きを記録し、後からそのデータを再生する方法を学びます。

rosbag2とは?

rosbag2は、ROS2で通信されるトピックデータをそのまま保存・再生できるツールです。

機能説明
record(記録)トピック通信をファイルに保存する
play(再生)保存したトピック通信を再送信する
info(情報表示)保存データの中身を確認する

たとえば、/turtle1/cmd_vel(速度指令)と/turtle1/pose(位置情報)を記録しておけば、
後からまったく同じ動きを再現できます。

トピックの記録

まずは事前準備として前回作成したlaunchファイルを動かしましょう。

source install/setup.bash
ros2 launch turtle_playground rotate_demo.launch.py

カメが回り続けています。

では送られているトピックを記録してみます。

すべてのトピックを記録する場合は以下のコマンドを別のターミナルで実行してください。

ros2 bag record -a

-a は「all」の意味で、現在通信しているすべてのトピックを記録します。
数秒間カメを動かしたら Ctrl + C で停止してください。

完了すると、次のようなフォルダが作られます。

rosbag2_2025_10_14-12_30_05/
├── metadata.yaml
└── data_0.db3

.db3 はSQLite形式のデータベースファイルで、内部にトピックデータが保存されています。

特定のトピックのみ記録する場合は以下のコマンドを実行します。

ros2 bag record /turtle1/cmd_vel /turtle1/pose

→ カメの速度と位置情報だけを記録します。

内容の確認は以下のコマンドで確認できます。末尾のファイル名は手元のものに変更してください。

ros2 bag info rosbag2_2025_10_14-12_30_05

以下のように出力されます。

→ どのトピックを、どの型で、何件記録したかがわかります。

トピックの再生

turtlesimだけを起動しておきます。

ros2 run turtlesim turtlesim_node

次に、記録したデータを再生します。末尾のファイル名は記録したものに変えてください。

ros2 bag play rosbag2_2025_10_14-12_30_05

記録した時と同じようにカメが動き出します。

これは、bagファイルに記録された /cmd_vel データが再送信されているためです。

Launchファイルでの記録

このrosbag2はLaunchファイルでも記録することができます。

launchファイルを作成します。

launch/turtle_record.launch.py

from launch import LaunchDescription
from launch.actions import ExecuteProcess
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        # turtlesim ノード
        Node(
            package='turtlesim',
            executable='turtlesim_node',
            name='sim'
        ),

        # カメを動かす publisher ノード
        Node(
            package='turtle_playground',
            executable='turtle_vel_publisher',
            name='publisher'
        ),

        # rosbag2 の記録を同時に開始
        ExecuteProcess(
            cmd=[
                'ros2', 'bag', 'record',
                '/turtle1/cmd_vel',
                '/turtle1/pose',
                '-o', 'turtle_record_bag'  # 出力フォルダ名を指定
            ],
            output='screen'
        ),
    ])

ビルドして実行してみましょう。

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

しばらくしたらCtrl+Cで終了します。

Launch終了後に、次のフォルダが生成されています。

turtle_record_bag/
├── metadata.yaml
└── data_0.db3

再生して確認してみましょう。

ros2 run turtlesim turtlesim_node
ros2 bag play turtle_record_bag

Launch中に記録されたカメの動きが、再び再生されます。
これで、完全自動記録 → 再生の流れが完成です。

課題8

turtle_playground パッケージに新しい Launch ファイルを作成し、
turtlesimの起動とカメの動作、rosbag2による記録を同時に実行できるようにしなさい。

  • 記録するトピックは /turtle1/pose/turtle1/cmd_vel のみ。
  • 出力フォルダ名は my_turtle_bag とする。
  • 実行コマンドは以下で起動できること。
ros2 launch turtle_playground my_record.launch.py
解答例はこちら
from launch import LaunchDescription
from launch.actions import ExecuteProcess
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='turtlesim',
            executable='turtlesim_node',
            name='sim'
        ),
        Node(
            package='turtle_playground',
            executable='turtle_vel_publisher',
            name='publisher'
        ),
        ExecuteProcess(
            cmd=['ros2', 'bag', 'record',
                 '/turtle1/pose', '/turtle1/cmd_vel',
                 '-o', 'my_turtle_bag'],
            output='screen'
        )
    ])
  • Node() で通常のノードを起動。
  • ExecuteProcess() で外部コマンド(ros2 bag)を同時実行。
  • output='screen' により、ターミナル上で進行ログを表示。

rqtでROS2の通信を可視化

これまでの章では、Turtlesimを使ってノード・トピック・サービス・アクションの動作を
コマンドラインで確認してきました。

しかし、システムが複雑になると、
「どのノードが、どのトピックを送受信しているのか」が分かりづらくなります。

そこで登場するのが rqt(アールキュート)です。
rqtは、ROS2の情報をGUI(グラフィカル・ユーザー・インターフェース)で可視化するツールです。

rqt(ROS Qt-based framework)は、ROSノード群を視覚的に表示・管理するツール群の総称です。
複数のプラグインを組み合わせて、グラフ表示・ログ確認・データプロットなどが可能です。

代表的なプラグインには以下のものがあります。

ツール名用途
rqt_graphノードとトピックの通信関係をグラフ表示
rqt_consoleノードのログ出力(get_logger()など)を閲覧
rqt_logger_level各ノードのログレベルを変更
rqt_plotトピックデータをリアルタイムにグラフ表示
rqt_reconfigureパラメータを動的に変更(ROS1互換)

まずrqt本体を起動します。

ros2 run rqt_gui rqt_gui

Turtlesimとパブリッシャーを起動します。

source install/setup.bash
ros2 launch turtle_playground rotate_demo.launch.py

この状態でrqt_graphを使ってみましょう。

GUI上のPlubins→Introspection→Node Graphタブをクリックします。

すると、次のような関係図が表示されます:

Nodes onlyとなっているところをNodes/Topics(all)に変えます。

GUI上で右上の×を押すと各プラグインを削除できます。

  • 四角:ノード
  • 丸:トピック
  • 矢印:通信の方向(パブリッシャー→サブスクライバー)

ノードの通信構造を視覚的に確認できるため、デバッグや設計理解にとても役立ちます。

rqt_consoleでログを確認する

ROS2ノードの中では self.get_logger().info() を使ってメッセージを出力しています。
これらはターミナルにも表示されますが、rqt_consoleを使うとログを時系列で整理して閲覧できます。

Plubins→Logging→Consoleをクリックします。

以下のように表示されます。

フィルタ機能を使えば、特定ノードや特定レベル(INFO, WARN, ERROR)のログだけ表示可能です。

長時間動作させた際のログ解析にも便利です。

rqt_plotでデータをグラフ表示

トピック /turtle1/pose にはカメの位置情報が送られています。
このデータをリアルタイムにプロットしてみましょう。

一度rqtをctrl+Cで終了し、必要なライブラリ等をインストールします。

sudo apt update
sudo apt install -y ros-humble-rqt-plot python3-pyqtgraph python3-pyqt5.qtsvg
sudo apt install -y ros-humble-rqt-gui ros-humble-rqt-graph

以下のコマンドで起動します。

ros2 run rqt_plot rqt_plot

Topicに表示したいトピック名を入力し、+ボタンをクリックするとグラフが追加されます。

トピック例:

/turtle1/pose/y

課題9

turtle_playground パッケージを使い、rqtの各ツールを活用して以下を観察しなさい。

  • ros2 launch turtle_playground turtle_color.launch.py を起動
  • ros2 run rqt_graph rqt_graph でノード間通信を確認
  • ros2 run rqt_plot rqt_plot/turtle1/pose/x/turtle1/pose/y をプロット
  • ros2 run rqt_console rqt_consoleturtle_vel_publisher のログを確認

次回はこちら

Follow me!

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

PAGE TOP