ROS実行時のメッセージの記録と再生
Simple Wiki Based Contents Management System
関心分野 >> Ros4Winのインストール >> ROS実行時のメッセージの記録と再生

ROS実行時のメッセージの記録と再生

ROSシステムをデバッグする場合に、ノード間の通信などをログを使って可視化し、利用することを以前に述べました。しかし、それだけでは、複数のノードから構成されるシステム全体のでデバッグには難しい場合もあります。
ROSでは、ログシステムの他にROSノードの実行状態(メッセージの送受信など)を記録し、再生する機能があります。この機能は、rosbagというコマンドを使います。rosbagコマンドは、ROSシステムの実行時のデータを.bagという拡張子を持つファイルに記録したり、そのファイルを用いて記録したデータを再生することができます。
このページでは、実行されているROSシステムのトピックデータを記録し、再生する方法を説明していきます。

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

まず、データ記録を行うROSシステムを起動します。
ここでは、以前のチュートリアルで使用したturtlesimのキー操作を例にします。
下のコマンドでturtlesimのROSシステムを起動してください。
 > start roscore
 > rosrun --start turtlesim turtlesim_node
 > rosrun --start turtlesim turtle_teleop_key 

Publishされたデータをすべて記録する

まず最初に、Publishされているトピックを調べます。下のコマンドで参照することができます。
 > rostopic list -v

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

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

Subscribed topics:
 * /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber
 * /rosout [roslib/Log] 1 subscriber
次に、bagファイルを格納するディレクトリを作成して、rosbag recordコマンドを実行します。
 > roscd
 > mkdir bagfiles
 > cd bagfiles
 > rosbag record -a
すると下のような出力が得られますので、turtle_teleop_keyのターミナルを選択して、turtlesimの亀を操作してみてください。
[ INFO] [1549866870.493732572]: Subscribing to /rosout_agg
[ INFO] [1549866870.494698997]: Recording to 2019-02-11-15-34-30.bag.
[ INFO] [1549866870.497662015]: Subscribing to /rosout
[ INFO] [1549866870.501650060]: Subscribing to /turtle1/pose
[ INFO] [1549866870.504301046]: Subscribing to /turtle1/color_sensor
[ INFO] [1549866870.506757719]: Subscribing to /turtle1/cmd_vel
ある程度操作を行った後に、rosbag recordコマンドを実行したターミナルで Ctrl+Cを入力して、記録を終了させます。
これで先ほどの操作が記録されたbagファイルが生成されたと思いますので、dirコマンド等で確認してみてください。
''<日付-時刻>.bag''というファイルがあることを確認してください。

記録したデータの再生(bagファイルを調べる・再生する)

先ほどの実行で、bagファイルに記憶することができました。
次は、そのファイルの確認を行います。bagファイルの確認には、rosbag infoコマンドやrosbag playコマンドを用います。
まずは、rosbag infoコマンドでbagファイルの情報を見てみましょう。
 > rosbag info 2019-02-11-15-34-30.bag
path:        2019-02-11-15-34-30.bag
version:     2.0
duration:    31.7s
start:       Feb 11 2019 15:34:30.51 (1549866870.51)
end:         Feb 11 2019 15:35:02.19 (1549866902.19)
size:        278.5 KB
messages:    3898
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             rosgraph_msgs/Log   [acffd30cd6b6de30f120938c17c593fb]
             turtlesim/Color     [353891e354491c51aabe32df673fb446]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /rosout                    5 msgs    : rosgraph_msgs/Log   (2 connections)
             /turtle1/cmd_vel          20 msgs    : geometry_msgs/Twist
             /turtle1/color_sensor   1927 msgs    : turtlesim/Color
             /turtle1/pose           1946 msgs    : turtlesim/Pose

このように、rogbag infoコマンドはbagファイルを記録したときの時刻やメッセージ型などの情報を得ることができます。
次は、記録されたbagファイルを再生して、その動作を確認してみましょう。Publishされた出たは、turtle_teleop_keyというノードから配信されたメッセージです。そのメッセージの確認のために、turtle_teleop_key をいったん終了します。ターミナルを選択して、"ESC"キーを数回押下するか、Ctrl+Cで終了することができます。
次に、下のコマンドを入力して、turtlesim_nodeの亀が先ほど入力したキー操作と同じ動作をすることを確認してください。
 >rosbag play 2019-02-11-15-34-30.bag
[ INFO] [1549867886.512769009]: Opening 2019-02-11-15-34-30.bag

Waiting 0.2 seconds after advertising topics... done.

Hit space to toggle paused, or 's' to step.
 [RUNNING]  Bag Time: 1549866880.082345   Duration: 9.571642 / 31.683455
また、''-r <整数>''オプションを付けて起動すると、整数倍した再生をすることができます。

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

先ほどの例では、すべてのPublishデータの記録を行いました。rosbag recordコマンドは、ROSシステムの中で指定した一部のメッセージを記録することができます。
turtle_teleop_keyを再度起動して、下のコマンドを実行してみてください。
 > rosbag record -O subset /turtle1/cmd_vel /turtle1/pose
このコマンドでは、''/turtle1/cmd_vel''と''/turtle1/pose''の2つのメッセージのみを記録します。
turtle_teleop_keyで操作した後に、rosbag recordを実行したターミナルでCtrl+Cを入力して、記録を終了します。
これで、subset.bagというbagファイルが生成されていると思いますので、確認してください。また、rosbag info コマンドでファイルを調べてみると下のようになると思います。
 >rosbag info subset.bag
path:        subset.bag
version:     2.0
duration:    25.2s
start:       Feb 11 2019 16:03:27.76 (1549868607.76)
end:         Feb 11 2019 16:03:52.91 (1549868632.91)
size:        127.8 KB
messages:    1588
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /turtle1/cmd_vel     15 msgs    : geometry_msgs/Twist
             /turtle1/pose      1573 msgs    : turtlesim/Pose
このように2つのメッセージのみ記録することができました。

rosbag record/playの制限

前のセクションで、亀の移動経路は、大まかな形は似ているかもしれないが完全にはオリジナルのものとはならないかもしれません。特に、2倍速などで再生すると、異なる経路をうごいていることがわかります。
この理由は、turtlesimによってトラックされた経路は、システムの時間での些細な変化に影響を受けやすいため、rosplayを使うときにいつメッセージが作られ処理されたかが関わるようなシステム実行中の振る舞いを、robagを使って完全に複製するには限界があるこということを示しています。
コマンドのメッセージ処理中の間の少しの変化で経過が変わりうるturtlesimのようなノードには、動作の完全なコピーされることを期待すべきではないと思います。
これはほとんどの分散システムに言えることです。