name: rosbag-workflow description: rosbag(mcap)を使った記録・再生・ループ再生テストと、DDS/QoS 起因の疎通トラブル切り分けの定型手順。「rosbagをループ再生してテスト」「bagを流してもトピックが受信できない」「録画データの周波数がおかしい」「record開始直後のデータが欠けている」ときに使用する。
Rosbag Workflow(記録・再生テストと DDS/QoS 切り分け)
rosbag を使った開発テストループの定型と、頻出のハマりどころ。
再生テストループ
開発中の受信側(バックエンド・可視化 UI)をテストする定番構成:
# bag の中身を確認してから使う
ros2 bag info data/sample.mcap
# ループ再生(テスト用に流しっぱなしにする)
ros2 bag play data/sample.mcap --loop
# 受信確認(別ターミナル/コンテナ)
ros2 topic list
ros2 topic hz /camera/image_raw/compressed
- コンテナ構成では、bag 再生専用コンテナを立てて
data/を volume 共有すると再現性が高い make rosbag-loopのような Makefile ターゲットに包んでおくと毎回のタイプが減る(docker compose + bag play + msgs ビルドを薄くラップする)- カスタム msg を使う bag は、再生側・受信側の両方に msg パッケージのビルドが必要
記録(record)の注意点
- 開始直後のデータ欠け:
ros2 bag recordは開始直後、全トピックの購読が完了するまでラグがあり、序盤のメッセージが欠ける。対策:- 記録開始から数秒間のデータは使わない前提で運用する(変換時に先頭を捨てる)
--start-pausedで購読を確立してから再生/記録を始める
- 画像トピックをロボット外のネットワーク越しに記録すると帯域圧迫で周波数が落ちる。記録はロボット側ホストで行うか compressed topic を使う
DDS/QoS トラブル切り分け
「トピックは流れているはずなのに受信できない/周波数が出ない」ときの確認順:
ROS_DOMAIN_IDの一致 — 全コンテナ・ホストで同一か。既定は 0- DDS 実装の統一 — CycloneDDS と FastDDS の混在を避ける。
RMW_IMPLEMENTATION=rmw_cyclonedds_cppで統一(迷ったら CycloneDDS) - QoS の不一致 —
ros2 topic info /topic -vで配信/購読の QoS を突合。BEST_EFFORT vs RELIABLE、depth 設定を確認 - TRANSIENT_LOCAL の残留 — durability が TRANSIENT_LOCAL のトピックは、購読開始時に過去の古いメッセージが届く。タイムスタンプ(header.stamp)で閾値フィルタして古いフレームを捨てる
- コンテナ間の DDS 発見 — network_mode、
/dev/shm共有、マルチキャスト可否を確認
bag ファイル形式
- 入力は mcap に正規化すると扱いやすい。ROS 1 の
.bagや sqlite3 形式はrosbags-convertで事前変換する - Python から読む場合は
mcapパッケージの reader を使う(トピック・時刻でフィルタしながら streaming 読みできる) - プレビュー動画が欲しいときは image topic を ffmpeg で mp4 化する。一度変換した mp4 はキャッシュして再利用する(毎回の再変換は時間の無駄)
Related skills
TDD Red-Green-Refactor
Testing
Skill that guides Claude through the complete TDD cycle.
Claude CodeWindsurfintermediate
650
189
2,260
Web Accessibility Audit
Testing
Performs a comprehensive web accessibility audit following WCAG standards.
claudeCursorWindsurfintermediate
129
37
559
UAT Test Case Generator
Testing
Generates structured and comprehensive user acceptance test cases.
claudechatgptintermediate
87
24
483