ROS基础(五)

十六、录制与回放数据

录制数据(通过创建一个bag文件)

本小节将教你如何记录ROS系统运行时的话题数据,记录的话题数据将会累积保存到bag文件中。
首先,执行以下命令:

$ roscore
$ rosrun turtlesim turtlesim_node 
$ rosrun turtlesim turtle_teleop_key

录制所有发布的话题

首先让我们来检查看当前系统中发布的所有话题。要完成此操作请打开一个新终端并执行:

$ 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

上面所发布话题部分列出的话题消息是唯一可以被录制保存到文件中的的话题消息,因为只有消息已经发布了才可以被录制。

现在我们开始录制。打开一个新的终端窗口,在终端中执行以下命令:

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

在这里我们先建立一个用于录制的临时目录,然后在该目录下运行rosbag record命令,并附加-a选项,该选项表示将当前发布的所有话题数据都录制保存到一个bag文件中。
然后回到turtle_teleop节点所在的终端窗口并控制turtle随处移动10秒钟左右。
在运行rosbag record命令的窗口中按Ctrl-C退出该命令。现在检查看~/bagfiles目录中的内容,你应该会看到一个以年份、日期和时间命名并以.bag作为后缀的文件。这个就是bag文件,它包含rosbag record运行期间所有节点发布的话题。

检查并回放bag文件

使用info命令,该命令可以检查看bag文件中的内容而无需回放出来。在bag文件所在的目录下执行以下命令:

$ rosbag info <your bagfile>

你应该会看到如下类似信息:

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

这些信息告诉你bag文件中所包含话题的名称、类型和消息数量。

下一步是回放bag文件以再现系统运行过程。

$ rosbag play <your bagfile>

默认模式下,rosbag play命令在公告每条消息后会等待一小段时间(0.2秒)后才真正开始发布bag文件中的内容。等待一段时间的过程可以通知消息订阅器消息已经公告了消息数据可能会马上到来。如果rosbag play在公告消息后立即发布,订阅器可能会接收不到几条最先发布的消息。等待时间可以通过-d选项来指定。
你可以通过-s参数选项让rosbag play命令等待一段时间跳过bag文件初始部分后再真正开始回放。最后一个可能比较有趣的参数选项是-r选项,它允许你通过设定一个参数来改变消息发布速率。如果你执行:

$ rosbag play -r 2 <your bagfile>

你应该会看到turtle的运动轨迹有点不同了,这时的轨迹应该是相当于当你以两倍的速度通过按键发布控制命令时产生的轨迹。

录制数据子集

当运行一个复杂的系统时,比如PR2软件系统,会有几百个话题被发布,有些话题会发布大量数据(比如包含摄像头图像流的话题)。在这种系统中,要想把所有话题都录制保存到硬盘上的单个bag文件中是不切实际的。rosbag record命令支持只录制某些特别指定的话题到单个bag文件中,这样就允许用户只录制他们感兴趣的话题。
在bag文件所在目录下执行以下命令:

$ 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)。你应该会看到如下类似信息,里面只包含录制时指定的话题:

bag: subset.bag
version: 1.2
start_time: 3196900000000
end_time: 3215400000000
length: 18500000000
topics:
  - name: /turtle1/command_velocity
    count: 8
    datatype: turtlesim/Velocity
    md5sum: 9d5c2dcd348ac8f76ce2a4307bd63a13
  - name: /turtle1/pose
    count: 1068
    datatype: turtlesim/Pose
    md5sum: 863b248d5016ca62ea2e895ae5265cf9

rosbag record/play 命令的局限性

在前述部分中你可能已经注意到了turtle的路径可能并没有完全地映射到原先通过键盘控制时产生的路径上——整体形状应该是差不多的,但没有完全一样。造成该问题的原因是turtlesim的移动路径对系统定时精度的变化非常敏感。rosbag受制于其本身的性能无法完全复制录制时的系统运行行为,rosplay也一样。对于像turtlesim这样的节点,当处理消息的过程中系统定时发生极小变化时也会使其行为发生微妙变化,用户不应该期望能够完美的模仿系统行为。

十七、roswtf入门

在你开始本教程之前请确保roscore没在运行。
安装检查
roswtf 可以检查你的ROS系统并尝试发现问题,我们来试看:

$ roscd
$ roswtf

你应该会看到(各种详细的输出信息):

Stack: ros
================================================================================
Static checks summary:

No errors or warnings
================================================================================

Cannot communicate with master, ignoring graph checks

如果你的ROS安装没问题,你应该会看到类似上面的输出信息。

运行时检查(在有ROS节点运行时)
在这一步中,我们需要让Master运行起来,所以得先启动roscore。
现在按照相同的顺序再次运行以下命令:

$ roscd
$ roswtf

你应该会看到:

Stack: ros
================================================================================
Static checks summary:

No errors or warnings
================================================================================
Beginning tests of your ROS graph. These may take awhile...
analyzing graph...
... done analyzing graph
running graph rules...
... done running graph rules

Online checks summary:

Found 1 warning(s).
Warnings are things that may be just fine, but are sometimes at fault

WARNING The following node subscriptions are unconnected:
 * /rosout:
   * /rosout

既然roscore已经运行了所以roswtf做了一些运行时检查。检查过程的长短取决于正在运行的ROS节点数量,可能会花费很长时间才能完成。正如你看到的,这一次出现了警告:

WARNING The following node subscriptions are unconnected:
 * /rosout:
   * /rosout

roswtf发出警告说rosout节点订阅了一个没有节点向其发布的话题。在本例中,这正是所期望看到的,因为除了roscore没有任何其它节点在运行,所以我们可以忽略这些警告。

错误报告

roswtf会对一些系统中看起来异常但可能是正常的运行情况发出警告。也会对确实有问题的情况报告错误。

猜你喜欢

转载自blog.csdn.net/pomo16/article/details/82819680