本博客将总结如何通过rosbag将ROS系统运行过程中的数据录制到一个.bag文件中,然后通过回放数据来重现相似的运行过程。
1. 录制数据
本节将记录ROS系统运行时的话题数据,记录的话题数据将会累积保存到bag文件中。
首先,在三个不同的窗口中分别执行一下命令产生数据:
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
以上操作将会启动两个节点——一个turtlesim可视化节点和一个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节点的输入。而/turtle1/color_sensor和/turtle1/pose是turtlesim节点发布出来的话题消息。
另打开一个新窗口,执行以下命令开始录制:
$ mkdir ~/bagfiles
$ cd ~/bagfiles
$ rosbag record -a
在这里先建立一个用于录制的临时目录,然后在该目录下运行rosbag record命令,并附加-a选项,该选项表示将当前发布的所有话题数据都录制保存到一个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命令在公告每条消息后会等待一小段时间(0.2秒)后才真正开始发布bag文件中的内容。等待一段时间的过程可以通知消息订阅器消息已经公告了消息数据可能会马上到来。如果rosbag play在公告消息后立即发布,订阅器可能会接收不到几条最先发布的消息。等待时间可以通过-d选项来指定。
最终/turtle1/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的运动轨迹有点不同了,这时的轨迹应该是相当于当以三倍的速度通过按键发布控制命令时产生的轨迹。
2. 录制数据子集
当运行一个复杂的系统时,会有几百个话题被发布,有些话题会发布大量数据(比如包含摄像头图像流的话题)。在这种系统中,要想把所有话题都录制保存到硬盘上的单个bag文件中是不切实际的。rosbag record命令支持只录制某些特别指定的话题到单个bag文件中,这样就允许用户只录制感兴趣的话题。
如果还有turtlesim节点在运行,先退出,然后重新启动(relaunch)键盘控制节点相关的启动文件(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只能录制这两个指定的话题。然后通过键盘控制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来检查系统故障。