Skip to content

データの記録と再生

目標: トピックでパブリッシュされたデータを記録して、いつでも再生して検査できるようにする。

チュートリアルレベル: 初心者

所要時間: 10分

背景

ros2 bagは、システム内のトピックでパブリッシュされたデータを記録するためのコマンドラインツールです。 任意の数のトピックで渡されたデータを蓄積し、データベースに保存します。 その後、データを再生してテストや実験の結果を再現することができます。 トピックの記録は、作業を共有し、他の人が再現できるようにする素晴らしい方法でもあります。

前提条件

通常のROS 2セットアップの一部としてros2 bagがインストールされている必要があります。

ROS 2をインストールする必要がある場合は、インストール手順を参照してください。

このチュートリアルでは、ノードトピックなど、以前のチュートリアルで扱った概念について話します。 また、turtlesimパッケージも使用します。

いつものように、新しいターミナルを開くたびにROS 2をソースすることを忘れないでください。

タスク

1 セットアップ

turtlesimシステムでキーボード入力を記録して後で保存・再生するので、まず/turtlesim/teleop_turtleノードを起動します。

新しいターミナルを開いて実行します:

bash
ros2 run turtlesim turtlesim_node

別のターミナルを開いて実行します:

bash
ros2 run turtlesim turtle_teleop_key

良い習慣として、保存した記録を格納する新しいディレクトリも作成しましょう:

bash
mkdir bag_files
cd bag_files

2 トピックの選択

ros2 bagは、トピック内のパブリッシュされたメッセージからのデータのみを記録できます。 システムのトピックのリストを確認するには、新しいターミナルを開いてコマンドを実行します:

bash
ros2 topic list

出力:

/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

トピックチュートリアルで学んだように、/turtle_teleopノードは/turtle1/cmd_velトピックでコマンドをパブリッシュして、turtlesimでタートルを動かします。

/turtle1/cmd_velがパブリッシュしているデータを確認するには、コマンドを実行します:

bash
ros2 topic echo /turtle1/cmd_vel

teleopによってデータがパブリッシュされていないため、最初は何も表示されません。 teleopを実行したターミナルに戻り、アクティブになるように選択します。 矢印キーを使ってタートルを動かすと、ros2 topic echoを実行しているターミナルでデータがパブリッシュされているのが見えます。

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

3 ros2 bag record

3.1 単一トピックの記録

トピックにパブリッシュされたデータを記録するには、コマンド構文を使用します:

bash
ros2 bag record <topic_name>

選択したトピックでこのコマンドを実行する前に、新しいターミナルを開いて先ほど作成したbag_filesディレクトリに移動してください。rosbagファイルは実行したディレクトリに保存されるためです。

コマンドを実行します:

bash
ros2 bag record /turtle1/cmd_vel

出力:

[INFO] [rosbag2_storage]: Opened database 'rosbag2_2019_10_11-05_18_45'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...

これでros2 bag/turtle1/cmd_velトピックでパブリッシュされたデータを記録しています。 teleopターミナルに戻って、再びタートルを動かしてください。 動きは重要ではありませんが、後でデータを再生するときに確認できるように認識可能なパターンを作ってみてください。

記録中のタートルの動き

Ctrl+Cを押して記録を停止します。

データはrosbag2_年_月_日-時_分_秒のパターンの名前を持つ新しいbagディレクトリに蓄積されます。 このディレクトリには、記録された形式のbagファイルとmetadata.yamlが含まれます。

3.2 複数トピックの記録

複数のトピックを記録することもでき、ros2 bagが保存するファイルの名前を変更することもできます。

以下のコマンドを実行します:

bash
ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose

出力:

[INFO] [rosbag2_storage]: Opened database 'subset'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/pose'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...

-oオプションを使用すると、bagファイルに一意の名前を選択できます。 この場合の文字列subsetがファイル名です。

一度に複数のトピックを記録するには、各トピックをスペースで区切ってリストするだけです。 この場合、上記のコマンド出力は両方のトピックが記録されていることを確認しています。

タートルを動かして、完了したらCtrl+Cを押してください。

注記

コマンドに追加できる別のオプション-aがあり、これはシステム上のすべてのトピックを記録します。

4 ros2 bag info

記録の詳細を確認するには、以下を実行します:

bash
ros2 bag info <bag_file_name>

subsetbagファイルでこのコマンドを実行すると、ファイルに関する情報のリストが返されます:

bash
ros2 bag info subset

出力:

Files:             subset.db3
Bag size:          228.5 KiB
Storage id:        sqlite3
Duration:          48.47s
Start:             Oct 11 2019 06:09:09.12 (1570799349.12)
End                Oct 11 2019 06:09:57.60 (1570799397.60)
Messages:          3013
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 9 | Serialization Format: cdr
                   Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 3004 | Serialization Format: cdr

5 ros2 bag play

bagファイルを再生する前に、teleopが実行されているターミナルでCtrl+Cを入力します。 次に、bagファイルの動作を確認できるように、turtlesimウィンドウが見えることを確認してください。

コマンドを入力します:

bash
ros2 bag play subset

出力:

[INFO] [rosbag2_storage]: Opened database 'subset'.

タートルは記録中に入力したのと同じパスをたどります(ただし100%正確ではありません;turtlesimはシステムのタイミングの小さな変化に敏感です)。

再生中のタートルの動き

subsetファイルは/turtle1/poseトピックを記録したため、動いていなくてもturtlesimを実行していた時間と同じ長さでros2 bag playコマンドは終了しません。

これは、/turtlesimノードがアクティブである限り、定期的に/turtle1/poseトピックでデータをパブリッシュするためです。 上記のros2 bag infoの例の結果で、/turtle1/cmd_velトピックのCount情報がわずか9であることに気づいたかもしれません;これは記録中に矢印キーを押した回数です。

/turtle1/poseCount値が3000を超えていることに注意してください;記録中、そのトピックでデータが3000回パブリッシュされました。

位置データがどのくらいの頻度でパブリッシュされるかのアイデアを得るには、コマンドを実行できます:

bash
ros2 topic hz /turtle1/pose

まとめ

ros2 bagコマンドを使用して、ROS 2システムのトピックで渡されたデータを記録できます。 作業を他の人と共有する場合でも、自分の実験を内部検査する場合でも、知っておくべき素晴らしいツールです。

次のステップ

「初心者:CLIツール」チュートリアルを完了しました! 次のステップは、ワークスペースの作成から始まる「初心者:クライアントライブラリ」チュートリアルに取り組むことです。

関連コンテンツ

ros2 bagのより詳細な説明は、こちらのREADMEで確認できます。 QoS互換性とros2 bagの詳細については、rosbag2: QoSポリシーのオーバーライドを参照してください。

Released under the MIT License.