这个教程要学习的是怎么从一个运行的ROS系统中记录一些数据存放在.bag文件中,之后再回放这些数据制造一个相似的行为
1 记录数据(创建一个bag文件)
这一节会讲怎么从一个运行的ROS系统中记录topic的数据。topic的数据会被累计存储在一个bag文件中。
首先,执行以下三条命令:
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
这就是之前的小海龟和键盘控制的两个node。
1.1 记录所有发布的topic
首先让我们列举出所有正在被发布消息的topic,打开一个新窗口,输入:
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
列表中,只有publish topic才能被记录下来,换句话说,只有推送的message才能被记录。topic /turtle1/cmd_vel 是teleop_turtle 推送的命令消息,作为turtlesim 进程的输入,messages /turtle1/color_sensor 和 /turtle1/pose 是输出。
现在我们就要记录推送数据了,打开一个新窗口运行以下指令:
mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -a
这里我们建立了一个临时文件夹去记录数据,然后运行rosbag record ,并加上a选项,指定将所有发布的topic数据都累加记录下来。
回到 turtle_teleop 窗口并运行小海龟10秒左右。
然后在运行rosbag的窗口Ctrl+C退出,接下来就要测试纪录的数据了。
2 检查并播放bag文件
我们可以通过rosbag info指令查看bag文件的内容,在bag文件所在的目录运行以下指令:
rosbag info <your bagfile>
bag文件的名称是由时间、后缀等内容组成的,如:
2017-03-12-10-28-01.bag
所以我应该执行:
rosbag info 2017-03-12-10-28-01.bag
然后会看到这个:
path: 2017-03-12-10-28-01.bag
version: 2.0
duration: 12:30s (750s)
start: Mar 12 2017 10:28:01.76 (1489285681.76)
end: Mar 12 2017 10:40:32.22 (1489286432.22)
size: 6.2 MB
messages: 93626
compression: none [7/7 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 122 msgs : geometry_msgs/Twist
/turtle1/color_sensor 46750 msgs : turtlesim/Color
/turtle1/pose 46750 msgs : turtlesim/Pose
这个会告诉我们topic的名字,类型,以及存储在这里的每个message topic的数目。
接下来我们就要回放记录了。首先关掉之前读取键盘的那个窗口,保留小海龟。
在新窗口中运行:
rosbag play <your bagfile>
后面这个还是要填你的文件名,比如我的是这样的:
qkingros@ubuntu:~/bagfiles$ rosbag play 2017-03-12-10-28-01.bag
[ INFO] [1489299953.329543310]: Opening 2017-03-12-10-28-01.bag
Waiting 0.2 seconds after advertising topics... done.
Hit space to toggle paused, or 's' to step.
[PAUSED] Bag Time: 1489285990.443460 Duration: 308.684625 / 750.462410
^C
中间按了空格键,它显示了暂停,s表示一步一步运行。需要注意的是,可能你无法观察到小海龟的运动,因为在看前面的教程时,你输入了记录的命令之后,它就开始记录了,直到你按了键盘小乌龟才开始运动,前面这段时间小海龟是不动的,建议再重新做一次观察。
其实如果一开始纪录的内容就包含了让小海龟运行的指令,而小海龟还没打开,那很可能就会错过一些。这个时候可以使用-d选项让重放延时一定时间。
如果你不想再来一遍,可以使用-s让它从某个时间点开始。如果你不知道大概要多久,你可以试一下-r,就是rate,可以加快速度播放:
rosbag play -r 2 <your bagfile>
这样的话速度会变快两倍,速度太快可能会出现轨迹都发生了变化。
3 记录一个数据的子集
当我们运行一个很复杂的系统时,把所有topic的数据存下来是不切实际的,比如摄像头,可能会产生大量的数据。我们可以有选择的存储我们感兴趣的topic数据。
首先如果小海龟和键盘检测都关掉了,重新打开他们:
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
在你的bag文件所在目录,运行下面的指令:
rosbag record -O subset /turtle1/cmd_vel /turtle1/pose
这个-O高速rosbag record记录到subset.bag里面,后面的参数是让其值记录这些主题的数据。现在使用键盘让小海龟运动几秒钟,然后Ctrl+C停止记录。
现在看一下刚刚记录的bag的内容:
rosbag info subset.bag
你会看到如下内容,只记录了两个topic的内容。
path: subset.bag
version: 2.0
duration: 22.8s
start: Mar 12 2017 15:48:31.14 (1489304911.14)
end: Mar 12 2017 15:48:53.97 (1489304933.97)
size: 119.6 KB
messages: 1470
compression: none [1/1 chunks]
types: geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9]
topics: /turtle1/cmd_vel 42 msgs : geometry_msgs/Twist
/turtle1/pose 1428 msgs : turtlesim/Pose
可以再播放一下:
rosbag play subset.bag
4 rosbag record/play的局限性
在前面我们也看到了,如果加速播放,小海龟的路径都会出现问题。因为这个只是简单的对数据的记录和回放,如果节奏发生改变,很可能会引起接收端的一些错误,它并没有与接收方进行任何的交互。就像是你说话的录音,这个录音虽然可以向别人传递消息,但是至于那个人听到了什么它是不管的。所以有可能复现不出原来的行为。