ROS環境では、トピックデータを後で分析するために保存する必要がよくあります。そのために提供されているのがrosbagツールです。このツールはC++やPythonのAPIだけでなく、コマンドラインからも利用可能です。
主要なコマンド一覧
rosbag check バッグファイルが現在のシステムで再生可能か確認
rosbag compress 1つ以上のバッグファイルを圧縮
rosbag decompress 圧縮されたバッグファイルを展開
rosbag filter 条件に基づいてメッセージをフィルタリング
rosbag fix 古いメッセージ定義に対応するための修正
rosbag info バッグファイルのメタ情報を表示
rosbag play 時系列に沿ってバッグファイルを再生
rosbag record 指定トピックのデータを記録
rosbag reindex 破損したインデックスを再構築
rosbag check:互換性チェック
メッセージ定義が更新された場合、古いバッグファイルは新しいシステムと非互換になることがあります。rosbag checkは、そのような移行が必要かどうかを診断します。
rosbag compress / decompress:圧縮と展開
サポートされる圧縮形式はbz2とlz4で、デフォルトはbz2です。オプション--lz4で高速なLZ4圧縮を選択できます。
# bz2で圧縮(デフォルト)
rosbag compress *.bag
# 出力ディレクトリ指定
rosbag compress --output-dir=./compressed *.bag
# 強制上書き
rosbag compress -f *.bag
# 静かなモード
rosbag compress -q *.bag
# LZ4形式で圧縮
rosbag compress --lz4 *.bag
rosbag filter:条件付きフィルタリング
Python式を使って特定のメッセージのみを抽出できます。変数mはメッセージ、topicはトピック名、tはタイムスタンプを表します。
rosbag filter input.bag output.bag "m.data == 'target'"
rosbag filter --print="'%s: %s' % (topic, m.header.stamp)" in.bag out.bag "topic == '/sensor_data'"
rosbag fix:メッセージ定義の移行
非互換なバッグファイルを修復するには、移行ルールファイル(.bmr)とともに使用します。
rosbag fix legacy.bag fixed.bag migration_rules.bmr
rosbag info:メタ情報の表示
YAML形式で出力したり、特定のキーだけを抽出することも可能です。
rosbag info -y data.bag
rosbag info -y -k topics data.bag
rosbag play:再生機能
再生中はスペースキーで一時停止、sキーでステップ実行が可能です。
# 一時停止状態で開始
rosbag play --pause log.bag
# 指定トピックのみ再生
rosbag play log.bag --topics /imu/data /gps/fix
# 再生速度を5倍に
rosbag play -r 5 log.bag
# 10秒から再生、60秒間だけ
rosbag play -s 10 -u 60 log.bag
# ループ再生
rosbag play -l log.bag
rosbag record:データ記録
高帯域トピック(例:カメラ映像)は、可能な限りローカルストレージに直接記録してください。
# 全トピックを記録(初期メッセージを見逃す可能性あり)
rosbag record -a
# 正規表現でトピック選択
rosbag record -e "/camera/.*/image_raw"
# 除外パターン(Melodic以降)
rosbag record -e "/robot/.*" -x "/robot/debug/.*"
# 30分ごとに分割、最大5ファイルまで保持
rosbag record --split --duration 30m --max-splits 5 /sensor_data
# LZ4圧縮で記録
rosbag record --lz4 /lidar/points
rosbag reindex:インデックス修復
異常終了などで破損したバッグファイルのインデックスを再構築します。
rosbag reindex corrupted.bag
rosbag reindex --output-dir=./repaired *.bag
rosbag reindex -f broken.bag # バックアップを強制上書き