Note: This tutorial assumes that you have completed the previous tutorials: ROSのノードを理解する.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

データの記録と再生

Description: このチュートリアルは実行中のROSシステムからデータを.bagファイルに記録, および実行中のシステムと同様の挙動を示すデータの再生方法を説明しています.

Keywords: data, rosbag, record, play, info, bag

Tutorial Level: BEGINNER

データの記録 (bagファイルの作成)

チュートリアル中のこのセクションでは, 実行中のROSシステムからトピックのデータを記録する方法を説明します. トピックデータはbagファイルの中に蓄積されます.

まず,3つのターミナルを立ち上げて, 以下のコマンドを実行します:

roscore

rosrun turtlesim turtlesim_node 

rosrun turtlesim turtle_teleop_key

これは2つのノードを起動します - turtlesimのビジュアライザ(可視化器)とturtlesimをキーボードの矢印キーを使って制御するノードが立ち上がります. turtle_keyboardを立ち上げたターミナルのウインドウを選択すると, 以下のように見えるはずです:

Reading from keyboard
---------------------------
Use arrow keys to move the turtle.

矢印キーをキーボード上で押すと亀が画面上で動き廻るはずです. 亀を動かすためには, turtlesimではなく, turtle_keyboardを立ち上げたウインドウを選択していなければならないことに注意しましょう.

配信されたすべてのトピックを記録する

まず, 実行中のシステムで現在配信されているトピックすべてのリストを試してみましょう. これをするには, 新しいターミナルを開き, このようにコマンドを実行します:

rostopic list -v

結果が以下のように表示されるはずです:

Published topics:
 * /turtle1/color_sensor [turtlesim/Color] 1 publisher
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
 * /rosout [rosgraph_msgs/Log] 2 publishers
 * /rosout_agg [rosgraph_msgs/Log] 1 publisher
 * /turtle1/pose [turtlesim/Pose] 1 publisher

Subscribed topics:
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber
 * /rosout [rosgraph_msgs/Log] 1 subscriber

配信されたメッセージのみが記録されるのと同じく, 配信されたトピックのリストはデータログファイルに記録される可能性があるメッセージ型のみです. /turtle1/cmd_velのトピックは, teleop_turtleに配信され, turtlesimプロセスの入力として受け取られるコマンドメッセージです. /turtle1/color_sensorと/turtle1/poseはturtlesimによって配信される出力メッセージです.

ここで, 配信されたデータを記録してみます. 新しいターミナルウインドウを開きます. このウインドウで以下のコマンドを実行します:

mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -a

ここでは, 配信されたすべてのトピックがbagファイルに蓄積されることを意味する-aオプションを付けてrosbag recordを実行し, 一時的にデータを記録するディレクトリを作成します.

turtle_teleopのターミナルに戻り, 亀を10秒ほど動き廻らせます.

rosbag recordを実行しているウインドウをCtrl-C(Ctrlを押しながらC)で抜けましょう. そして, ~/bagfilesのディレクトリの中身を検証します. 年, 日付, 時間, そして, .bagの拡張子が付いたファイルが見つかるはずです. これが, rosbag recordの実行中のあらゆるノードから配信されたすべてのトピックを含むbagファイルとなります.

bagファイルの再生と検証

rosbag recordを使ってbagファイルを記録した今, rosbag inforosbag playを使って分析と再生を行うことができるようになりました. まず, bagファイルに何が記録されたか確認します. bagファイルの中身を再生することなく確認するinfoコマンドが実行できます. bagファイルのあるディレクトリから以下のコマンドを実行します:

rosbag info <your bagfile>

このように表示されるはずです:

path:        2014-10-06-15-54-16.bag
version:     2.0
duration:    14.0s
start:       Oct 06 2014 15:54:17.05 (1412592857.05)
end:         Oct 06 2014 15:54:31.04 (1412592871.04)
size:        130.7 KB
messages:    1743
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             rosgraph_msgs/Log   [acffd30cd6b6de30f120938c17c593fb]
             turtlesim/Color     [353891e354491c51aabe32df673fb446]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /rosout                   4 msgs    : rosgraph_msgs/Log   (2 connections)
             /turtle1/cmd_vel          9 msgs    : geometry_msgs/Twist
             /turtle1/color_sensor   869 msgs    : turtlesim/Color    
             /turtle1/pose           861 msgs    : turtlesim/Pose

bagファイルに含まれるそれぞれのメッセージトピックの個数と同時に, トピックの名前と型がわかり, rostopicの出力の中に確認できる公表されたトピックのものを見ることができます. その5つのうちの4つは実際に記録の間, 実際に配信されたものです. rosbag recordを-aのフラグ付きで実行すると, 全てのノードから配信される全てのメッセージを記録します.

このチュートリアルの次のステップでは、実行中のシステムの挙動を再現するbagファイルの再生を行います. まず, turtle_teleop_keyを立ち上げたターミナルでCtrl-Cすることによって, 前のセクションから未だ実行中となっている可能性があるteleopのプログラムを終了します. turtlesimの実行はそのままにしておきましょう. ターミナルウインドウ内でオリジナルのbagファイルを記録したディレクトリから以下のコマンドを実行します:

rosbag play <your bagfile>

このウインドウ内には即座にこのように表示されるはずです:

[ INFO] [1412593117.907453260]: Opening 2014-10-06-15-54-16.bag

Waiting 0.2 seconds after advertising topics... done.

Hit space to toggle paused, or 's' to step.

既定のモードでは, rosbag playは実際にbagファイルの中身を配信する前, それぞれのメッセージを公表した後, 一定時間(0.2秒間)待機します. 一定時間の待機を行うことにより, メッセージのあらゆる購読者がメッセージが公表され, メッセージが続く可能性があるという警告を受けます. rosbag playがメッセージをただちに公表するメッセージを配信する場合, 購読者は最初のいくつかの配信されたメッセージを受け取らない可能性があります. 待機時間は-dオプションによって, 指定することができます.

そのうち, /turtle1/cmd_velのトピックが配信され, 亀がteleopのプログラムから実行したときと同じようにturtlesimの中で動き始めるはずです. rosbag playの実行と亀の挙動の間の時間差は元々のrosbag recordの実行とこのチュートリアルのはじめの方のキーボードからのコマンドの送信との時間差とほぼ等しいはずです. rosbag playがbagファイルのはじめの方から始めたくない時は, かわりに-s引数を使って一定時間経過後から始めることもできます. もうひとつ最後に知っておくとよいオプションは-rオプションで, 指定した係数により配信の速度比を変えることができます. このように実行した場合:

rosbag play -r 2 <your bagfile>

ほんの少しだけ異なった起動を描く亀が表示されるはずです - これはキーボードの入力コマンドを二倍の速度で送った結果として表れる軌道となっています.

データのサブセットを記録する

pr2ソフトウェアスイートのような複雑なシステムを実行している時, 数百のトピックが配信され, カメラ画像のストリームのようないくつかのトピックにおいては, 巨大なデータを配信する可能性があります. そのようなシステムでは, すべてのトピックを含むlogファイルを一つのbagファイルとしてディスクに書き出すのは現実的ではありません. rosbag recordコマンドはbagファイルへの特定のトピックに絞った記録をサポートしており, ユーザーにとって関心があるトピックのみを記録させることを許容しています.

実行中のturtlesimノードを終了し, キーボード・テレオペのlaunchファイルを立ち上げなおします:

rosrun turtlesim turtlesim_node 
rosrun turtlesim turtle_teleop_key

bagファイルのディレクトリ内で, 以下のコマンドを実行します:

rosbag record -O subset /turtle1/cmd_vel /turtle1/pose

-O引数はrosbag recordにsubset.bagのファイル名で記録することを指定し, トピックの引数はこれら二つのトピックのみを購読してrosbag recordを実行させるようにします. キーボードの矢印コマンドを使って, 亀を数秒動き廻らせてから, Ctrl-Cでrosbag recordを抜けます.

そして, bagファイルの中身を確認します(rosbag info subset.bagとして). 指示したトピックのみが, このように表示されるはずです:

path:        subset.bag
version:     2.0
duration:    9.8s
start:       Oct 06 2014 16:08:39.47 (1412593719.47)
end:         Oct 06 2014 16:08:49.27 (1412593729.27)
size:        53.7 KB
messages:    625
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /turtle1/cmd_vel    12 msgs    : geometry_msgs/Twist
             /turtle1/pose      613 msgs    : turtlesim/Pose

rosbag record/play の限界

以前の項で亀の軌道は本来のキーボード入力の軌道と完全には一致しない可能性があることに気付いたかもしれません - だいたいの形状は同じはずですが, 亀は完全には同じ軌道を追跡していない可能性があります. この理由は, turtlesimによって追跡された軌道がシステムにおける計時内の小さい変化に対してとても敏感だからで, rosbagは正確に実行中のシステムの挙動を再現することは, メッセージがrosrecordによって記録/処理される局面, およびメッセージがrosplayによって生成/処理される局面の観点から限界があります. turtlesimのようなノードにおいては, コマンドのメッセージが処理される時の些細な計時の変化が微妙に挙動を変化させる可能性があり, ユーザーは完全に模倣された挙動を想定すべきではないでしょう.

Wiki: ja/rosbag/Tutorials/Recording and playing back data (last edited 2015-07-03 05:41:37 by KenjiSato)