-
topicを保存する機能がrosbag
-
実機を何度も起動せずに開発したいときや同じデータを繰り返し使いたい時に活用します
- topic通信でのメッセージをbagファイルとして保存するコマンド
$ cd ~/rosbag
$ rosbag record -a -O robot_bag
- 保存方法は,以下の3通り
- すべてのtopicを取得
- 記録漏れ防止になる
- しかし,画像や点群などの情報量は膨大
- そのため,保存できるtopicのレートも落ちる可能性がありますので注意が必要
- topic名を指定して特定のtopicを取得できます.
- 正規表現でマッチングしたものを記録します.
例 | 意味 |
---|---|
/tf.* |
/tf と/tf_static を記録 |
/group/.* |
/group/topic1 と/group/topic2 のように、そのネームスペース以下のものをすべて記録 |
/topic1|/topic2 |
/topic1と と/topic2 を記録 |
その他のオプション
例 | 意味 |
---|---|
-h , --help |
ヘルプを表示 |
-a , --all |
全てのtopicを流れる情報を記録 |
-e 正規表現topic名 , --regex=正規表現topic名 |
正規表現で名前が一致したtopicに流れる情報を記録 |
-x 正規表現topic名 , --exclude=正規表現topic名 |
正規表現で名前が一致したtopicを除いたtopicに流れる情報を記録 |
-q , --quiet |
コンソール出力させない |
-o hoge , --output-prefix=hoge |
hoge_YYY_MM_DD_HH_mm_ss.bagで保存 |
-O hoge , --output-name=hoge |
hoge.bagで保存 |
--split=SPLIT_SIZE |
指定された容量、周期を超えた場合、バッグを分割 |
--max-splits=MAX_SPLITS |
最大N個のバッグファイルを保持し、最大になった時点で最も古いものを消去し、ファイル数を一定に保つ |
--size=SIZE |
最大サイズSIZE MBのバッグを記録(デフォルト: 無限) |
--duration=DURATION |
m またはh が付加されていない限り、最大継続時間DURATIONのバッグを秒単位で記録 |
-b SIZE , --buffize=SIZE |
SIZE MBの内部バッファを使用 (デフォルト: 256, 0 = 無限) |
--chunksize=SIZE |
上級者向け.SIZE KBのチャンクに記録 (デフォルト: 768) |
-l NUM , --limit=NUM |
各topicのメッセージをNUM個だけ記録 |
--node=NODE |
特定のノードが購読している全てのtopicを記録する |
-j , --bz2 |
BZ2圧縮を使用 |
--lz4 |
LZ4圧縮を使用 |
--tcpnodelay |
topicを購読する際にTCP_NODELAYトランスポートヒントを使用 |
--udp |
topicを購読するときに UDP トランスポートヒントを使用 |
--repeat-latched |
新しいバッグファイルの開始時にラッチされたメッセージを繰り返す |
- 端末上でコマンドを
rosbag record
と打ち込んで実行するものいいですが,シェルスクリプトを作っておくと便利です. - 例えば,
/odom
と/cmd_vel_mux/input/teleop
を記録する場合,以下のようにシェルスクリプトを作成します.
rosbag_record.sh
#!/bin/bash
rosbag_file="my_bag"
if [ $# = 0 ]; then
echo "rosbag file name = " $rosbag_file
else
echo "rosbag file name = " $1
rosbag_file=$1
fi
cd ~/catkin_ws/src
rosbag record /odom \
/cmd_vel_mux/input/teleop \
-o $rosbag_file
$ rosbag info bag_file_name.bag
その他のオプション
例 | 意味 |
---|---|
-h , --help |
ヘルプを表示 |
-y , --yaml |
YAMLフォーマットで情報を表示 |
-k KEY , --key=KEY |
与えられたキーに関する情報を表示 |
--freq |
topicメッセージの頻度統計を表示 |
$ cd ~/rosbag
$ rosbag play bag_file_name.bag --rate=2.0 --clock --loop
例 | 意味 |
---|---|
-h , --help |
ヘルプを表示 |
-p PREFIX , --prefix=PREFIX |
すべての出力topicに接頭辞を付ける |
-q , --quiet |
コンソール出力させない |
-i , --immediate |
全てのメッセージを待たずに再生 |
--pause |
一時停止モードで起動 |
--queue=SIZE |
SIZE の送信キューを使用(デフォルトは100) |
--clock |
時計の時刻を公開 (TF使用時は必須) |
--hz=HZ |
時計の時間を公開するときにHZ の周波数(デフォルトは100) |
-d SEC , --delay=SEC |
topicのコールバック後にSEC 秒スリープする(サブスクライバが接続できるようにするため) |
-r FACTOR , --rate=FACTOR |
発行レートにFACTOR を掛ける |
-s SEC , --start=SEC |
rosbagの再生をSEC 秒後開始します |
-u SEC , --duration=SEC |
rosbagの再生をSEC 秒間行います |
--skip-empty=SEC |
SEC 秒以上メッセージのない領域をスキップ |
-l , --loop |
ループ再生 |
-k , --keep-alive |
rosbagの終わりまで生き続ける(ラッチされたtopicを公開するのに有効) |
--try-future-version |
プレーヤーがバージョン番号を知らない場合でも、Bagファイルを開こうとする |
--topics=/topic1 |
再生するtopic |
--pause-topics |
再生中に一時停止するtopic |
--bags=BAGS |
再生するBagファイル |
--wait-for-subscribers |
各topicに最低1人の購読者がいることを確認してから公開する |
--rate-control-topic=RATE_CONTROL_TOPIC |
与えられたtopicを監視し、もし最後の公開がRATE_CONTROL_TOPIC 以上前に公開された場合は、そのtopicが再び公開されるまで待ちます.topicが再び公開されるまで待ち、再生を継続します. |
--rate-control-max-delay=RATE_CONTROL_MAX_DELAY |
RATE_CONTROL_MAX_DELAY からの最大時間差 から一時停止するまでの最大時間差 |
- bagファイルの中身を時系列的に見ることができます
$ cd ~/rosbag
$ rqt_bag bag_file_name.bag
- rosbagで記録したtopicをcsvファイルに保存することが出来ます
$ rostopic echo -b bagファイル.bag -p /topic名 > csvファイル.csv
- シェルスクリプトを作っておくと便利です.
- 例えば,
/cmd_vel_mux/input/teleop
と/odom/twist/twist
をcsvファイルに記録する場合,以下のようにシェルスクリプトを作成します.
bag2csv.sh
#!/bin/bash
cd ~/catkin_ws/src
# csvを作るrosbagファイル
rosbag_files=(
"my_bag_1" \
"my_bag_2" \
"my_bag_3"
)
for ((i = 0; i < ${#rosbag_files[@]}; i++)) {
echo "${rosbag_files[i]}"
rostopic echo -b ${rosbag_files[i]}.bag -p /cmd_vel_mux/input/teleop > teleop_${rosbag_files[i]}.csv
rostopic echo -b ${rosbag_files[i]}.bag -p /odom/twist/twist> odom_velocity_${rosbag_files[i]}.csv
}