本文的主要内容是将ROS系统运行过程中的数据录制到一个.bag文件中,然后通过回放数据来重现相似的运行过程。
bag包的录制(创建一个bag文件)
首先我们要明白bag包中记录了ROS系统运行时的***话题***数据
首先,执行以下命令:
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
其中 turtlesim为可视化节点
turtlesim为键盘控制节点
这时按下键盘上的方向键应该会让turtle运动起来
现在让我们录制所有发布的话题
首先让我们看看目前有哪些话题:
$ 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
/turtle1/command_velocity话题是 teleop_turtle 节点所发布的命令消息并作为 turtlesim 节点的输入。
/turtle1/color_sensor和/turtle1/pose是 turtlesim 节点发布出来的话题消息
开始录制:
打开新的终端,输入
$ mkdir ~/savebag //创建新的文件夹
$ cd ~/savebag //到这个文件夹下
$ rosbag record -a //录制 -a表示录制了所有节点发布的话题
录制完成后 Ctrl-C 退出该命令,检查看 ~/savebag 目录,会有一个以年份、日期和时间命名并以 .bag 作为后缀的文件。、
此处有一个需要注意的点,小海龟是一个很经典的小程序,他运行的节点数量是比较少的。当我们运行一些比较复杂的系统时我们可以选择只录取一部分话题,即不使用-a。
$ rosbag record -O setbagname /turtle1/cmd_vel /turtle1/pose
上述命令中的-O参数告诉rosbag record将数据记录保存到名为setbagname.bag的文件中,同时后面的话题参数告诉rosbag record只能录制这两个指定的话题cmd_vel和pose
回放bag包内容
回放就很简单了,直接输入
$ rosbag play xxxxx.bag //你想回放的bag包的名字
如果你是接续上面的小海龟程序,这里你需要先在 turtle_teleop_key 节点运行时所在的终端窗口中按 Ctrl+C 退出该节点。让 turtlesim 节点继续运行。再在终端中 bag 文件所在目录下运行命令
此处如果你只是想查看bag包里的内容,并不需要回放可以这样做(bag 文件中所包含话题的名称、类型和消息数量)
在 bag 文件所在的目录下执行以下命令:
rosbag info xxxxxx.bag //你想查看的bag包的名字