第一章(ROS)1.7 rosbag

使用rosbag采集数据
rosbag在采集数据时自身相当于一个subscriber程序
首先启动roscore,rosbag才能记录数据。
然后建立一个叫dataset的文件夹专门来储存这些数据,cd到那个文件夹去
然后在terminal中,写入下面内容

rosbag record /chatter -O record_poseStamped 

这行命令第一个是表示我们要使用rosbag相关命令了,第二个record表示我们想要采集(记录)数据。
第三个,由于我们之前说了,rosbag在采集数据时自身相当于一个subscirber程序,既然要subscribe,那么我们肯定需要指定subscriber哪个topic了,观察我们在pub_poseStamped.cpp中,定义topic那一行我们定义的topic的名字是chatter,于是我们就在第三个参数写入/chatter表示记录这个topic发布出来的信息。rosbag可以同时记录多个topic的信息,你只需要在record后接/topicA /topicB /topicC…即可。
命令行中-O及其后面的参数,是用来给bag文件命名的。我们在记录结束之后,rosbag的名字就会是record_poseStamped.bag,(如果参数是-o,那么记录名字会自动加上年月日时间,比如上面的例子如果用rosbag record /chatter -o record_poseStamped,输出会是record_poseStamped-2019-09-08-15-24-05.bag)。按下确认键后,你会看到下面的消息

[ INFO] [1551144307.272157111]: Subscribing to /chatter
[ INFO] [1551144307.274766644]: Recording to record_poseStamped.bag.

表示已经在开始记录chatter发布的消息了,消息会存储到record_poseStamped.bag里。如果topic没有消息发布,那么自然不会有任何东西会储存到这个rosbag文件里,这个文件会一直处于检测是否有消息发布的状态。你如果去看dataset文件夹里的图标,会发现一个叫record_poseStamped.bag.active的文件,表示这个bag文件目前正在处于记录的状态。
之后我们打开另一个terminal,输入下面的命令

cd ~/catkin_ws
source devel/setup.bash
rosrun pub_sub_test pub_poseStamped

把pub_poseStamped跑起来。你应该看到print出很多信息,这时候你观察跑rosbag那个terminal,什么也没有输出。 你可能会担心,到底是不是在记录发布出来的消息。rosbag里的topic名字和你publisher的名字是在对应上的,就一定在记录。极少数情况rosbag会拒绝记录新的消息,比如你的磁盘空间小于一个G了,rosbag会自动停止记录,如果你的磁盘空间小于5个G了,会出现warning但是不影响记录。
有些时候写程序的人并不会把publisher发布的消息print出来,你如果有成千上万条消息发布都print出来确实很烦。这时候你publisher的terminal中没什么信息print出来,rosbag的terminal中没什么信息print出来,你可能慌得一匹,不知道消息有没有被发布出来。你可以用下面的方式检查一下你的topic有没有发布消息。
打开另一个terminal,输入

rostopic echo /chatter

这行命令会把你chatter这个topic发布的命令print到terminal中。按下确认之后你会安心地看到下面的内容。
在这里插入图片描述
上面那行命令其实也相当于你跑了一个subscriber并且把收到的消息print出来。并且格式固定。可以看到每一则消息由—分开。然后显示出你消息的header(我们第三讲讲过header这个包含的成员由seq,stamp,frame_id,他们分别对应uint32,time,string类型的变量,没有印象了可以再回去回顾)。同时print出来了pose的内容,即position和orientation。
当你觉得记录到足够的数据之后,点击rosbag在运行的那个terminal并按下ctrl+c,rosbag就会停止记录并被保存下来了。每次记录完数据,我们都要马上检查一下是否记录成功。这时候我们在terminal中使用下面的命令可以看到rosbag的信息

rosbag info record_poseStamped.bag

在这里插入图片描述
重新使用储存在rosbag内的数据

当你采集完成数据之后,要拿回去分析,这时你就需要重新把储存在bag里的消息发布出来。
首先确保roscore已经运行,cd到你rosbag所在的文件夹,然后执行下面的命令

rosbag play record_poseStamped.bag

在这里插入图片描述
当你重新使用rosbag的数据(即使用rosbag play bag_name.bag)的时候,你的rosbag自身相当于一个publisher程序。
你的消息会在rosbag记录的topic的名字下重新发布出来。如果你打开一个terminal,重新运行我们之前的sub_poseStamped.cpp对用的那个node,即在新的terminal中source之后运行

rosrun pub_sub_test sub_poseStamped

你应该会看到和第三讲里面同事运行pub和sub程序时一样的内容。只不过这时候我们的rosbag取代了那个pub程序而已。
这儿稍微值得注意的一点是,我们上面print出来的Bag Time是这个rosbag收到每一则消息时的时间,并不是我们poseStamped里那个stamp储存的时间。
总结

这么快就总结了,我是不是越来越懒了,飘了…不是滴,主要是关于rosbag最主要的作用就是两个:作为subscriber接收信息并储存,作为publisher重新发布信息,没有太多需要解释的。虽然其实rosbag …后面还可以跟许多命令。详情可以见
http://wiki.ros.org/rosbag/Commandline
比如网页中在rosbag record部分,你可以在rosbag record后接–duration命令指定最长记录多少时间;
rosbag play部分,你可以在rosbag play 后接–pause命令,这样你开始运行bag时不发布数据,直到你按下空格键它才开始发布,同样你再按空格键rosbag又会暂停发布。
rosbag filter部分,你可以使用rosbag filter 命令拆分一个rosbag。正如filter部分中的例子所说

rosbag filter input.bag output.bag "t.to_sec() <= 1284703931.86"

上面的命令需要你有inputbag,然后它会把Bag Time<=1284703931.86的部分提取出来,重新放到一个新的ouput.bag里。这个命令在你bag文件很大你只需要其中一部分时还是很管用的。记录图片的rosbag动不动就几十个G.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值