データの記録と再生
目標: トピックでパブリッシュされたデータを記録して、いつでも再生して検査できるようにする。
チュートリアルレベル: 初心者
所要時間: 10分
背景
ros2 bagは、システム内のトピックでパブリッシュされたデータを記録するためのコマンドラインツールです。 任意の数のトピックで渡されたデータを蓄積し、データベースに保存します。 その後、データを再生してテストや実験の結果を再現することができます。 トピックの記録は、作業を共有し、他の人が再現できるようにする素晴らしい方法でもあります。
前提条件
通常のROS 2セットアップの一部としてros2 bagがインストールされている必要があります。
ROS 2をインストールする必要がある場合は、インストール手順を参照してください。
このチュートリアルでは、ノードやトピックなど、以前のチュートリアルで扱った概念について話します。 また、turtlesimパッケージも使用します。
いつものように、新しいターミナルを開くたびにROS 2をソースすることを忘れないでください。
タスク
1 セットアップ
turtlesimシステムでキーボード入力を記録して後で保存・再生するので、まず/turtlesimと/teleop_turtleノードを起動します。
新しいターミナルを開いて実行します:
ros2 run turtlesim turtlesim_node別のターミナルを開いて実行します:
ros2 run turtlesim turtle_teleop_key良い習慣として、保存した記録を格納する新しいディレクトリも作成しましょう:
mkdir bag_files
cd bag_files2
2 トピックの選択
ros2 bagは、トピック内のパブリッシュされたメッセージからのデータのみを記録できます。 システムのトピックのリストを確認するには、新しいターミナルを開いてコマンドを実行します:
ros2 topic list出力:
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose2
3
4
5
トピックチュートリアルで学んだように、/turtle_teleopノードは/turtle1/cmd_velトピックでコマンドをパブリッシュして、turtlesimでタートルを動かします。
/turtle1/cmd_velがパブリッシュしているデータを確認するには、コマンドを実行します:
ros2 topic echo /turtle1/cmd_velteleopによってデータがパブリッシュされていないため、最初は何も表示されません。 teleopを実行したターミナルに戻り、アクティブになるように選択します。 矢印キーを使ってタートルを動かすと、ros2 topic echoを実行しているターミナルでデータがパブリッシュされているのが見えます。
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---2
3
4
5
6
7
8
9
3 ros2 bag record
3.1 単一トピックの記録
トピックにパブリッシュされたデータを記録するには、コマンド構文を使用します:
ros2 bag record <topic_name>選択したトピックでこのコマンドを実行する前に、新しいターミナルを開いて先ほど作成したbag_filesディレクトリに移動してください。rosbagファイルは実行したディレクトリに保存されるためです。
コマンドを実行します:
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...2
3
4
これでros2 bagは/turtle1/cmd_velトピックでパブリッシュされたデータを記録しています。 teleopターミナルに戻って、再びタートルを動かしてください。 動きは重要ではありませんが、後でデータを再生するときに確認できるように認識可能なパターンを作ってみてください。

Ctrl+Cを押して記録を停止します。
データはrosbag2_年_月_日-時_分_秒のパターンの名前を持つ新しいbagディレクトリに蓄積されます。 このディレクトリには、記録された形式のbagファイルとmetadata.yamlが含まれます。
3.2 複数トピックの記録
複数のトピックを記録することもでき、ros2 bagが保存するファイルの名前を変更することもできます。
以下のコマンドを実行します:
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...2
3
4
5
-oオプションを使用すると、bagファイルに一意の名前を選択できます。 この場合の文字列subsetがファイル名です。
一度に複数のトピックを記録するには、各トピックをスペースで区切ってリストするだけです。 この場合、上記のコマンド出力は両方のトピックが記録されていることを確認しています。
タートルを動かして、完了したらCtrl+Cを押してください。
注記
コマンドに追加できる別のオプション
-aがあり、これはシステム上のすべてのトピックを記録します。
4 ros2 bag info
記録の詳細を確認するには、以下を実行します:
ros2 bag info <bag_file_name>subsetbagファイルでこのコマンドを実行すると、ファイルに関する情報のリストが返されます:
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: cdr2
3
4
5
6
7
8
9
5 ros2 bag play
bagファイルを再生する前に、teleopが実行されているターミナルでCtrl+Cを入力します。 次に、bagファイルの動作を確認できるように、turtlesimウィンドウが見えることを確認してください。
コマンドを入力します:
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/poseのCount値が3000を超えていることに注意してください;記録中、そのトピックでデータが3000回パブリッシュされました。
位置データがどのくらいの頻度でパブリッシュされるかのアイデアを得るには、コマンドを実行できます:
ros2 topic hz /turtle1/poseまとめ
ros2 bagコマンドを使用して、ROS 2システムのトピックで渡されたデータを記録できます。 作業を他の人と共有する場合でも、自分の実験を内部検査する場合でも、知っておくべき素晴らしいツールです。
次のステップ
「初心者:CLIツール」チュートリアルを完了しました! 次のステップは、ワークスペースの作成から始まる「初心者:クライアントライブラリ」チュートリアルに取り組むことです。
関連コンテンツ
ros2 bagのより詳細な説明は、こちらのREADMEで確認できます。 QoS互換性とros2 bagの詳細については、rosbag2: QoSポリシーのオーバーライドを参照してください。