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
Contents
データを記録する(バグファイルを作成する)
チュートリアルのこのセクションでは,実行されている 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 info や rosbag 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を使うかを学びましょう。