(!) 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

Next Tutorial: Getting started with roswtf

データを記録する(バグファイルを作成する)

チュートリアルのこのセクションでは,実行されている ROS のシステムから topic のデータを記録する方法を学習します.topic のデータはバグファイルの中に蓄積されていきます.

まず3つのターミナルを立ち上げて、以下のコマンドを実行してください.

roscore

rosrun turtlesim turtlesim_node 

rosrun turtlesim turtle_teleop_key

これは turtlesim を可視化する node と,キーボードの矢印キーで亀をコントロールできるようにする node の2つを起動させます.turtle_keyboard を立ち上げたターミナルのウィンドウを選択している状態であれば次のように表示されているはずです.

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

キーボードの矢印キーを押すことで,亀を画面内で動かすことができます. 亀を動かすには turtlesim のウィンドウではなく turtlesim を立ち上げたターミナルを選択しなくてはならないことに注意してください.

publish されている topic をすべて記録する

初めに,実行されているシステム内で実際に publish されているすべての topic リストを見てみましょう.新しいターミナルを開いて次のコマンドを打ってください.

rostopic list -v

次のような出力が表示されるはずです.

Published topics:
 * /turtle1/color_sensor [turtlesim/Color] 1 publisher
 * /turtle1/command_velocity [turtlesim/Velocity] 1 publisher
 * /rosout [roslib/Log] 2 publishers
 * /rosout_agg [roslib/Log] 1 publisher
 * /turtle1/pose [turtlesim/Pose] 1 publisher

Subscribed topics:
 * /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber
 * /rosout [roslib/Log] 1 subscriber

"Published topics" リストは, publish された message のみが記録されるように,データログファイルに記録されうる message のタイプです./turtle1/cmd_vel の topic は, turtlesim のプロセスへの入力となる teleop_turtle によって publish されたコマンドの message です.

publish されているデータを記録しましょう.新しいターミナルを開いて下さい.このターミナルの中で次のコマンドを実行してください.

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

ここでは,データを記録するための一時的なディレクトリを作成し, publish されているすべての topic をバグファイルに蓄積することを明示するオプション -a とともに rosbag record を起動しているだけです.

turtle_teleop を実行しているターミナルに戻り,亀を10秒ほど動かして下さい.

次にrosbag record を実行しているウィンドウで Ctrl-C で exit してください.さて ~/bagfiles の中身を見てみましょう.おそらく年月日と時間と .bag の拡張子のついた名前のファイルがあるでしょう.これは rosbag record が実行されている間に何かしらの node によって publish されたあらゆるの topic を含んでいるバグファイルです.

バグファイルを調べる・実行する

もう rosbag record でバグファイルを記録することができたので, rosbag inforosbag play を用いて調べたり再度実行することができます.まずバグファイルの中に何が書かれているかを見てみましょう.実行することなくバグファイルの中身を確認することができる info というコマンドを使うことができます.次のコマンドをバグファイルのあるディレクトリで実行してください.

rosbag info <バグファイルの名前>

次のように表示されるでしょう.

bag: 2009-12-04-15-02-56.bag
version: 1.2
start_time: 1259967777871383000
end_time: 1259967797238692999
length: 19367309999
topics:
  - name: /rosout
    count: 2
    datatype: roslib/Log
    md5sum: acffd30cd6b6de30f120938c17c593fb
  - name: /turtle1/color_sensor
    count: 1122
    datatype: turtlesim/Color
    md5sum: 353891e354491c51aabe32df673fb446
  - name: /turtle1/command_velocity
    count: 23
    datatype: turtlesim/Velocity
    md5sum: 9d5c2dcd348ac8f76ce2a4307bd63a13
  - name: /turtle1/pose
    count: 1121
    datatype: turtlesim/Pose
    md5sum: 863b248d5016ca62ea2e895ae5265cf9

これによってバグファイルの中の topic 名・タイプ・topic ごとの message 数が分かります.rostopic の出力に表示される topic が advertise されていることが分かります.5つのうち4つは実際に記録している時間内に publish されています.rosbag record をオプション -a とともに実行したので,すべての node によるすべての message が記録されます.

このチュートリアルの次のステップは,実行されるシステムで同じ状態を再現するためにバグファイルをリプレイすることです.まず,一つ前のセクションから起動したままであろう teleop のプログラムを kill してください.turtle_teleop_key を実行したターミナルで Ctrl-C を押せばよいです.turtlesim は実行したままにしてください.ターミナルで,バグファイルを生成したディレクトリに移り,以下のコマンドを打ち込んでください.

rosbag play <your bagfile>

このウィンドウの中で、すぐに以下のようなものが表示されるでしょう。

Hit space to pause.
[ INFO] 1260210510.566003000: Sleeping 0.200 seconds after advertising /rosout...
[ INFO] 1260210510.766582000: Done sleeping.

[ INFO] 1260210510.872197000: Sleeping 0.200 seconds after advertising /turtle1/pose...
[ INFO] 1260210511.072384000: Done sleeping.

[ INFO] 1260210511.277391000: Sleeping 0.200 seconds after advertising /turtle1/color_sensor...
[ INFO] 1260210511.477525000: Done sleeping.

デフォルトのモードでは,rosbag play は message を advertise したあとコンマ2秒ほど待つでしょう.その後,バグファイルを実際に publish し始めます.いくらの時間待っている間に,message を subscribe する node は message が advertise されることを知り得ます。もし rosbag play が advertise のあと直ちに message を publish してしまったら,subscribe する node は初めのメッセージをいくつか受け取れなくなってしまいます.オプション -d でその待ち時間を指定することも可能です.

その後、/turtle1/cmd_velのtopicは配信されteleopのプログラムに似ているパターンで亀が動き始めると思います。rosbag playを実行している時間と亀の動きは大体オリジナルのrosbag recordを実行した時間とチュートリアルの最初で押したキーのコマンドの実行と似ているはずです。rosbag playは初めから実行せずに代わりに-sを使うことでいくらかの時間を飛ばして実行することができます。最後に興味があると思われる指定の要素で配信するレートを変更することができる-rオプションを紹介します。実行をすると

rosbag play -r 2 <バグファイル名>

少し違う軌道を描く亀を見ることになるでしょう。これは、あなたのキー入力を2倍速にしたものの結果です。

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

pr2のソフトウェアのような複雑なシステムを実行するときは、たくさんのデータを送り出すカメライメージのストリームなどとともに何百もの配信されるtopicがあることでしょう。そのようなシステムでは、それらのデータを一つのバグファイルに書き込むのはほとんどの場合実践的ではありません。

rosbag recordのコマンドは、ユーザに興味のあるほんの特定のtopicのみをバグファイルに記録するようにすることができます。

もしturtlesimに関係するnodeが実行されているなら、それらを止めて、keyboard teleopのlaunchファイルを再度立ち上げてください。

rosrun turtlesim turtlesim_node 
rosrun turtlesim turtle_teleop_key

バグファイルのあるディレクトリで、以下を実行してください。

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

The -O はrosbag recordにsubset.bagというファイルにログを残すように言い、topicの部分はrosbag recordにこれら2つのtopicのみを購読するようにさせます。亀を数秒の間キーボードの矢印キーで動かして、Ctrl-Cでrosbag recordをとめてください。

さてrosbag info subset.bagと打って、バグファイルの中身を見てみましょう。以下のようなものが、指定されたtopicのもので見ることができるでしょう。

path:        subset.bag
version:     2.0
duration:    17.6s
start:       Oct 09 2016 00:56:46.33 (1475942206.33)
end:         Oct 09 2016 00:57:03.90 (1475942223.90)
size:        91.0 KB
messages:    1107
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /turtle1/cmd_vel      8 msgs    : geometry_msgs/Twist
             /turtle1/pose      1099 msgs    : turtlesim/Pose

rosbag record/play の制限

一つ前のセクションで、亀の移動経路は、大まかな形は似ているかもしれないが完全にはオリジナルのものとはならないと説明しました。この理由は、turtlesimによってトラックされた経路は、システムの時間での些細な変化に影響を受けやすいため、rosplayを使うときにいつメッセージが作られ処理されたかが関わるようなシステム実行中の振る舞いを、robagを使って完全に複製するには限界があることによるものです。

コマンドのメッセージ処理中の間の少しの変化で経過が変わりうるturtlesimのようなnodeには、動作の完全なコピーされることを期待すべきではありません。

ここでは、データを記録して再現する方法を学びました。次にどのようにして roswtfを使うかを学びましょう。

Wiki: ja/ROS/Tutorials/Recording and playing back data (last edited 2016-10-08 16:08:59 by molyb)