トピックの記録と再生

目的

ROSには配信されているトピックを記録し,その記録したデータを時系列に従って再配信(再生)する機能があります.これにより,ロボットの動きを記録・再生することができる他,記録したデータを利用することでセンサシミュレーションができるようになります.ここでは,トピックの記録と再生の方法を学びます.

準備

今回はstageを題材として説明します.下記のコマンドによりシミュレータを起動しましょう.

rosrun stage_ros stageros $(rospack find stage_ros)/world/willow-four-erratics-multisensor.world

次に,キーボードを操作してロボットを動かす準備をします.以前に利用したteleop_twist_keyboardパッケージを使用しましょう.こちらのノードが配信するトピックは/cmd_velですので,シミュレータが購読するトピック名に合わせる必要があります.下記のコマンドのように,ノードを起動する際にトピック名を変更しましょう.

$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py cmd_vel:=/robot_0/cmd_vel
トピックの記録と再生

rosbagコマンドを使用してトピックの記録と再生を行います.まず,下記のコマンドを使用して実行できるコマンドを調べてみましょう.

$ rosbag
Usage: rosbag <subcommand> [options] [args]

A bag is a file format in ROS for storing ROS message data. The rosbag command can record, replay and manipulate bags.

Available subcommands:
   check  	Determine whether a bag is playable in the current system, or if it can be migrated.
   compress  	Compress one or more bag files.
   decompress  	Decompress one or more bag files.
   filter  	Filter the contents of the bag.
   fix  	Repair the messages in a bag file so that it can be played in the current system.
   help  
   info  	Summarize the contents of one or more bag files.
   play  	Play back the contents of one or more bag files in a time-synchronized fashion.
   record  	Record a bag file with the contents of specified topics.
   reindex  	Reindexes one or more bag files.

For additional information, see http://wiki.ros.org/rosbag

rosbagでは多くのサブコマンドが用意されていますが,ここではその中でも重要なコマンドを確認していきます.コマンドを実行する前に,ファイルを保存するためのディレクトリを作成しましょう.

$ mkdir rosbag
$ cd rosbag

まずはトピックを記録します.記録するには下記のようにrosbag recordコマンドで記録したいトピック名を指定します.

$ rosbag record /robot_0/cmd_vel

lsコマンドでファイルを確認すると,ファイル名に日時を含むbagファイルが作成されています.こちらがトピックを記録したファイルとなります.ここでは,2018-06-17-14-52-02.bagという名前でファイルが作成されたとして説明しますが,各自で適切なファイルを指定してください.なお,今回は1つのトピックのみを指定しましたが,複数のトピックを指定することも可能です.

次に記録したbagファイルの情報を確認します.bagファイルの情報を確認するためには,下記のコマンドを実行します.

$ rosbag info 2018-06-17-14-52-02.bag 
path:        2018-06-17-14-52-02.bag
version:     2.0
duration:    4.6s
start:       Jan 01 1970 09:12:04.20 (724.20)
end:         Jan 01 1970 09:12:08.80 (728.80)
size:        37.3 KB
messages:    304
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
topics:      /robot_0/cmd_vel   304 msgs    : geometry_msgs/Twist

トピックを記録した時間情報や,記録したトピック名,メッセージ名を調べることができます.それでは,最後に作成したbagファイルを使用してトピックを再生してみましょう.再生には下記のコマンドを使用します.

$ rosbag play 2018-06-17-14-52-02.bag

上記を実行すると,シミュレータ上のロボットが動きます.これは,上記のコマンドにより/robot_0/cmd_velが改めて配信されたためです.

bagファイルのサイズについて

幾つかのセンサを搭載しているロボットを扱う場合には,数多くのトピックを配信・購読することになり,ノード間で多くのデータをやり取りすることになります.これらのトピックを全て記録しようとすると,膨大なデータ量となります.例えば,上記のシミュレータを起動し,全てのトピックを下記のコマンドで記録します.

$ rosbag record -a

10秒ほど記録するだけで,作成されるbagファイルのサイズは約70MBとなります.扱うロボット,もしくは記録する時間によってはメモリ量やストレージの関係でエラーが発生するので,必要なトピックのみを記録しましょう.

参考文献
  1. rosbag commandline