環境
この記事は以下の環境で動いています。
項目 | 値 |
---|---|
CPU | Core i5-8250U |
Ubuntu | 20.04 |
ROS | Noetic |
インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。
概要
流れているROSトピックを保存する機能がrosbagです。ROSの動作はROSトピックを見れば大体はわかるので、例えばロボット実機を動かしながらrosbag記録をすることで、実機を何度も動かさなくても様々なアルゴリズムのテストをすることができます。
今回はvis_lectureで扱った簡易移動シミュレーションを例にしてrosbagの使い方を説明します。
rosbagの取得
ROSを実行している時にrosbag record
を実行するだけです。どのROSトピックを取得するかの指定の仕方が3通りがあります。
-
rosbag record -a
すべてのtopicを取得します。後々に欲しいROSトピックが記録漏れをしていると悲しいので、基本的にこれを使えば良いと思います。ただ画像のROSトピックは情報量が膨大になてしまいます。 -
rosbag record /topic1 /topic2
名前を指定して特定のROSトピックを取得できます。 -
rosbag record -e "/tf.*|/cmd_vel"
正規表現でマッチングしたものを記録します。例えば-
"/tf.*"
は/tfと/tf_staticを記録 -
"/group/.*"
は/group/topic1と/group/topic2のように、そのネームスペース以下のものをすべて記録 -
"/topic1|/topic2"
なら/topic1と/topic2を記録する
-
またrosbag record -O file.bag
で保存するファイル名を指定できます。
サンプルプログラム
vis_lecture/launch/move_robot1.launch
にいくつかの要素を追加しています。
<launch>
<arg name="model" default="$(find adv_lecture)/urdf/move_robot1.urdf" />
<arg name="gui" default="false" />
<arg name="rvizconfig" default="$(find adv_lecture)/rviz/move_robot1.rviz" />
<arg name="joy" default="false" />
<arg name="play" default="false" />
<param name="robot_description" command="$(find xacro)/xacro $(arg model) --inorder" />
<param name="use_gui" value="$(arg gui)"/>
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />
<group if="$(arg joy)">
<node name="joy_node" pkg="joy" type="joy_node" />
<node name="twist_publisher" pkg="basic_lecture" type="basic_twist_publisher"/>
</group>
<group unless="$(arg play)">
<node name="vis_robot_sim" pkg="vis_lecture" type="vis_robot_sim"/>
</group>
</launch>
- rosbag再生時に使うためにargによって立ち上げるROSノードを変更できるようにしています。
実行
各ターミナルごとに実行前にsource ~/catkin_ws/devel/setup.bash
を実行する必要があります。
joyをPCに刺して以下を実行します。
roslaunch adv_lecture move_robot1.launch joy:=true
別のターミナルでbagファイルを保存したいディレクトリに移り(どこでも構いません)、以下を実行します。その状態でしばらくjoyを動かしたらCtrl+Cで停止します。
cd ~/rosbag
rosbag record -a -O robot_bag
うまくいけば以下のように取得したtopicの一覧が出ます。
ros_lecture@ubuntu:~/rosbag$ rosbag record -a -O robot_bag
[ INFO] [1532227745.550370392]: Recording to robot_bag.bag.
[ INFO] [1532227745.551309978]: Subscribing to /move_base_simple/goal
[ INFO] [1532227745.560624621]: Subscribing to /rosout
[ INFO] [1532227745.566797358]: Subscribing to /tf
[ INFO] [1532227745.572589894]: Subscribing to /clicked_point
[ INFO] [1532227745.580305867]: Subscribing to /tf_static
[ INFO] [1532227745.585419865]: Subscribing to /pose
[ INFO] [1532227745.593693657]: Subscribing to /initialpose
[ INFO] [1532227745.601116549]: Subscribing to /joy
[ INFO] [1532227745.607101078]: Subscribing to /rosout_agg
[ INFO] [1532227745.614395333]: Subscribing to /diagnostics
[ INFO] [1532227745.624554069]: Subscribing to /cmd_vel
rosbagの確認
rosbag info
を実行します。
rosbag info robot_bag.bag
ros_lecture@ubuntu:~/rosbag$ rosbag info robot_bag.bag
path: robot_bag.bag
version: 2.0
duration: 22.4s
start: Jul 22 2018 11:49:05.63 (1532227745.63)
end: Jul 22 2018 11:49:28.08 (1532227768.08)
size: 542.8 KB
messages: 2404
compression: none [1/1 chunks]
types: diagnostic_msgs/DiagnosticArray [60810da900de1dd6ddd437c3503511da]
geometry_msgs/Pose [e45d45a5a1ce597b249e23fb30fc871f]
geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
rosgraph_msgs/Log [acffd30cd6b6de30f120938c17c593fb]
sensor_msgs/Joy [5a9ea5f83505693b71e785041e67a8bb]
tf2_msgs/TFMessage [94810edda583a504dfda3829e70d7eec]
topics: /cmd_vel 222 msgs : geometry_msgs/Twist
/diagnostics 22 msgs : diagnostic_msgs/DiagnosticArray
/joy 1479 msgs : sensor_msgs/Joy
/pose 222 msgs : geometry_msgs/Pose
/rosout 13 msgs : rosgraph_msgs/Log (4 connections)
/tf 445 msgs : tf2_msgs/TFMessage
/tf_static 1 msg : tf2_msgs/TFMessage
rosbagの再生
rosbag play
を実行するだけです。しかしROSの実行環境に注意が必要です。
実行
まずrosbag再生用のlaunchを実行します。余計なノードを減らしています。
roslaunch adv_lecture move_robot1.launch play:=true
この状態でrosbagを再生します。そうするとrecordした時と同じようにロボットが動きます。
rosbag play robot_bag.bag
rosbagをplayすることで、recordした時と同じ動作を再現できます(以下の動画では1回目は手動でjoyコントローラーを操作していますが、2回目は操作をしていません)。
rosbagの再生のオプション
-r
オプションで再生速度の変更ができます。早くすることも遅くすることも可能です。
--clock
オプションでROS時間を通知する/clockのROSトピックを送信します。
rosbag play robot_bag.bag -r 2.0 --clock
-l
オプションでループ再生ができます。
rosbag play robot_bag.bag -l
rosbag用のlaunch設定について
rosbag playするときにはraunchの設定を一部変えました。この理由をざっくり説明します。
- 図の1番上
通常実行時はこの図の様にjoyの入力であって最終的にはロボットの位置のtfを出力しています。 - 図の2番目
これが、再生時にはrvizのみが起動していてtfを表示しています。 - 図の3番目
もし再生時adv_robot_simが起動していたとすると、adv_robot_simの出力する/tfとrosbagの出力する/tfが混ざってしまいます。 - 図の4番目
もし動作確認などでどうしてもadv_robot_simを再生時に起動したい場合はrecordするときに/tfを除いて(rosbag record -a -O robot_bag -x /tf
)、それを再生します。
rqt_bag
以下のコマンドを実行すると以下のようなウィンドウが出てきます。縦にrosbagに入っているROSトピックがならなんでいて、青い縦線はその時間にpublishされたことを示します。
rqt_bag robot_bag.bag
各トピックを右クリックしてview->plotを選択するとグラフの表示ができます。これで各データを見比べたりできます。
csvへ出力
rostopic echo -b robot_bag.bag -p /tf > file.csv
備考
- 画像はデータサイズが多いのでrosbagも重くなります。あまりお勧めしません。
- ROSはそもそもリアルタイム性が低いシステムです。再生するときにタイミングが少しずれることがあります。
- rqt_bagは処理があまりよくないのか、容量の大きいファイルと読み込むと動作が極端に遅くなります。rosbagファイルはこまめに区切ることが重要です(1時間つけっぱなしとかしない)。
- recordしたファイルを後から見ても、なにを記録したものなのか分からなくなることはよくあります。bagファイルにはタイトルや説明をしっかりとつけましょう。
- rqt_plotよりも高機能なグラフ描画ツールとして「plotjugger」もあります。