ROSまとめ:データの録画と再生

11569 ワード

ROSデータの録画と再生
このブログでは、rosbagを介してROSシステムの実行中のデータを1つに記録する方法についてまとめます.bagファイルでは、データを再生することで、同様の実行手順を再現します.1.録画データ本節ではROSシステム実行時の話題データを記録し、記録した話題データをbagファイルに蓄積保存します.まず、3つの異なるウィンドウでコマンドを実行してデータを生成します.
$  roscore
$  rosrun turtlesim turtlesim_node 
$  rosrun turtlesim turtle_teleop_key

以上の操作で、2つのノード、1つのturtlesimビジュアル化ノードと1つのturtlesimキーボード制御ノードが起動します.turtlesimキーボード制御ノードを実行するターミナルウィンドウで、キーボードの方向を押すとturtlを動かすことができます.1.1パブリケーションのトピックを録画するには、まず、現在のシステムでパブリケーションされているすべてのトピックを確認します.
$  rostopic list -v

Published topics:
 * /turtle1/color_sensor [turtlesim/Color] 1 publisher
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
 * /rosout [rosgraph_msgs/Log] 3 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ノードの入力として使用されます.そして/turtle 1/color_sensorおよび/turtle 1/poseはturtlesimノードが発表した話題メッセージである.新しいウィンドウを開き、次のコマンドを実行して録画を開始します.
$  mkdir ~/bagfiles
$  cd ~/bagfiles
$  rosbag record -a

ここでは、録画用の一時ディレクトリを作成し、そのディレクトリの下でrosbag recordコマンドを実行し、-aオプションを追加します.このオプションは、現在公開されているすべてのトピックデータを1つのbagファイルに録画保存することを示します.そしてturtle_に戻りますteleopノードが存在する端末ウィンドウを制御しturtleを10秒程度移動させる.rosbag recordコマンドを実行するウィンドウでCtrl-Cを押してコマンドを終了します.~/bagfilesディレクトリの内容を表示すると、年、日付、時間で命名する名前が表示されます.bagは接尾辞としてのファイルです.これがbagファイルです.rosbag recordの実行中にすべてのノードがパブリッシュされる話題が含まれています.
$  cd ~/bagfiles
$  ls
2017-05-18-09-11-04.bag

1.2再生bagファイルがrosbag recordコマンドを使用してbagファイルを録画したことを確認し、次にrosbag infoを使用してコンテンツを確認し、rosbag playコマンドを使用して再生することができます.
$  rosbag info     2017-05-18-09-11-04.bag,  :

$  rosbag info 2017-05-18-09-11-04.bag
path:        2017-05-18-09-11-04.bag
version:     2.0
duration:    38.9s
start:       May 18 2017 09:11:05.04 (1495069865.04)
end:         May 18 2017 09:11:43.92 (1495069903.92)
size:        362.6 KB
messages:    5037
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         210 msgs    : geometry_msgs/Twist
             /turtle1/color_sensor   2412 msgs    : turtlesim/Color    
             /turtle1/pose           2411 msgs    : turtlesim/Pose

これらの情報はbagファイルに含まれるトピックの名前、タイプ、メッセージの数を示します.1.3 bagファイルを再生bagファイルを再生すると、システムの実行プロセスを再生することができる.まずはturtle_teleop_keyノードの実行時にあるターミナルウィンドウでCtrl+Cを押してノードを終了します.turtlesimノードを実行し続けます.端末のbagファイルがあるディレクトリで、次のコマンドを実行します.
$  rosbag play <your bagfile>   <your bagfile> 2017-05-18-09-11-04.bag,  :
$  rosbag play 2017-05-18-09-11-04.bag

[ INFO] [1495071397.806231953]: Opening 2017-05-18-09-11-04.bag

Waiting 0.2 seconds after advertising topics... done.

Hit space to toggle paused, or 's' to step.
 [RUNNING]  Bag Time: 1495069903.888952   Duration: 38.851875 / 38.883754     
Done.

デフォルトモードでは、rosbag playコマンドは、各メッセージを公告した後、bagファイルのコンテンツの公開を開始するまでしばらく(0.2秒)待たなければなりません.しばらく待つと、メッセージサブスクライバメッセージがメッセージデータを通知したことを通知できます.rosbag playがメッセージを公告した直後にパブリッシュされると、サブスクライバは最初にパブリッシュされたメッセージをいくつか受信できない可能性があります.待ち時間は-dオプションで指定できます.最終/turtle 1/command_velocityの話題が公開され、turtuelsimの仮想画面ではturtleが以前のようにturtleを通過するはずです.teleop_keyノードは、同じように移動を開始するように制御します.rosbag playの実行からturtleの移動開始までの経過時間は、このチュートリアルの開始部分でrosbag recordを実行してからキーボードを押して制御コマンドを発行し始めたまでの経過時間とほぼ同じです.-sパラメータオプションを使用すると、rosbag playコマンドがbagファイルの初期部分をスキップしてから本当に再生を開始するまで待つことができます.最後に興味深いパラメータオプションは-rオプションであり、パラメータを設定することでメッセージのパブリケーションレートを変更できます.実行する場合:
$  rosbag play -r 3 <your bagfile>  <your bagfile> 2017-05-18-09-11-04.bag,  :
[ INFO] [1495071648.180428463]: Opening 2017-05-18-09-11-04.bag

Waiting 0.2 seconds after advertising topics... done.

Hit space to toggle paused, or 's' to step.
 [RUNNING]  Bag Time: 1495069903.889155   Duration: 38.852078 / 38.883754     
Done.

turtleの動き軌跡は少し異なりますが、この場合の軌跡は、キーを介して制御コマンドを3倍の速度で発行したときに発生する軌跡に相当するはずです.
2.録画データのサブセット複雑なシステムを実行すると、数百のトピックがパブリッシュされ、カメラの画像ストリームを含むトピックなど、大量のデータがパブリッシュされるトピックもあります.このシステムでは、すべての話題をハードディスク(HDD)に保存した単一bagファイルに録画するのは現実的ではありません.rosbag recordコマンドは、特定のトピックのみを単一bagファイルに録画することをサポートし、ユーザーが興味のあるトピックのみを録画できるようにします.turtlesimノードがまだ実行されている場合は、先に終了し、キーボード制御ノードに関連する起動ファイル(launch file)を再起動します.
$  rosrun turtlesim turtlesim_node 
$  rosrun turtlesim turtle_teleop_key

bagファイルがあるディレクトリで、次のコマンドを実行します.
$  cd bagfiles/
$  rosbag record -O subset /turtle1/command_velocity /turtle1/pose

上記コマンドの-Oパラメータはrosbag recordにsubsetという名前のデータレコードを保存するように伝える.bagのファイルでは、rosbag recordが指定した2つのトピックしか録画できないことを後述するトピックパラメータで示します.その後、キーボード制御turtleで数秒移動し、最後にCtrl+Cを押してrosbag recordコマンドを終了します.bagファイルの内容を確認します.
$  rosbag info subset.bag
path:        subset.bag
version:     2.0
duration:    35.2s
start:       May 18 2017 09:47:21.16 (1495072041.16)
end:         May 18 2017 09:47:56.31 (1495072076.31)
size:        172.2 KB
messages:    2198
compression: none [1/1 chunks]
types:       turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9]
topics:      /turtle1/pose   2198 msgs    : turtlesim/Pose

3.rosbag record/playコマンドの限界は、前の実験過程でturtleのパスがキーボード制御によって生成されたパスに完全にマッピングされていない可能性があることが分かった(全体の形状はそれほど悪くないが、完全に同じではない).この問題の原因はturtlesimの移動経路がシステムのタイミング精度の変化に非常に敏感であることである.rosbagは、それ自体の性能が録画時のシステム動作を完全にコピーできない場合に制約され、rosplayも同様である.turtlesimのようなノードでは、メッセージの処理中にシステムのタイミングが極めて小さく変化すると、その動作が微妙に変化し、ユーザはシステムの動作を完璧に模倣することを期待すべきではない.ここまでROSの入門は基本的に終わりましたが、次にroswtfを使ってシステムの故障をチェックする方法をまとめて勉強します.