本文参考:https://blog.csdn.net/Tansir94/article/details/81513517
一、通过bag文件记录话题消息
当发布话题的节点运行后,可以通过rostopic list
列出当前运行的话题,然后记录:
mkdir bagfile
cd bagfile
rosbag record -a #记录所有的话题
当消息记录完成后,结束ctrl+c终止record的命令行,在新建的bagfile文件中会生成年-月-日-时-分-秒.bag
文件。
二、数据重现
我们使用rosbag命令将数据记录在bag文件之后,还可以利用里面的数据重现我们节点的运行状态。
cd bagfile
rosbag info <file_name>
会显示此bag文件的一些详细信息(如下图):
parallels@parallels-vm:~/bag$ rosbag info MERGED_cv_lanekeeping_2018-04-25-16-14-52.bag
path: MERGED_cv_lanekeeping_2018-04-25-16-14-52.bag
version: 2.0
duration: 1:59s (119s)
start: Apr 26 2018 04:14:52.51 (1524687292.51)
end: Apr 26 2018 04:16:51.76 (1524687411.76)
size: 14.4 GB
messages: 621967
compression: none [13485/13485 chunks]
types: can_msgs/Frame [64ae5cebf967dc6aae4e78f5683a5b25]
dbw_mkz_msgs/BrakeCmd [c0d20e1056976680942e85ab0959826c]
dbw_mkz_msgs/BrakeInfoReport [fc88af128b5b3213ea25ab325a9b3bbb]
dbw_mkz_msgs/BrakeReport [5716c7ce378fb5a251e0ff30ac24500e]
dbw_mkz_msgs/FuelLevelReport [f5ec1964dbda02fda82785b8035744e4]
dbw_mkz_msgs/GearReport [785b94d5bfee677e7f0da982153f2711]
dbw_mkz_msgs/Misc1Report [c5c1e0d6ba52586919873bf9b0355143]
dbw_mkz_msgs/SteeringCmd [ff1fa11624bdc2aff2aeee5aa6014057]
dbw_mkz_msgs/SteeringReport [435efc512abdd87ef2f942c0e8ed296d]
dbw_mkz_msgs/SurroundReport [17a8c9ed72da4f55d44d6d71483cf0e3]
dbw_mkz_msgs/ThrottleCmd [d75259a1444adebea30e45b37542c415]
dbw_mkz_msgs/ThrottleInfoReport [8255d20d2bbc661ad39074024259c71a]
dbw_mkz_msgs/ThrottleReport [dc371d36db36a47de2ffaa1302bf4aec]
dbw_mkz_msgs/TurnSignalCmd [f1310dcd252c98fc408c6df907b9495a]
dbw_mkz_msgs/WheelPositionReport [0e6f28c4c7a099c93cc2173da9808a16]
回放
cd bagfile
rosbag play <bagfile_name>
默认情况下,rosbag play命令会等待0.2秒之后才开始发布信息,这是为了在发布信息之前通知所有订阅信息的节点,以使它们能够及时地接收到rosbag play发布的信息。这个等待时间可以用-d选项指定。
因为rosbag record记录数据是有延迟的,所以在执行rosbag play
最初的一小段时间里消息不会发布,使用-s
选项后跟秒数可以跳过bag文件记录的前几秒。
-r
,它可以改变信息发布的速度:
rosbag play -r 2 <bagfile_name> #以两倍的速度发布记录的消息
三、选定话题记录
1、查找话题:
在数据回放的时候:新建终端,在终端输入:
rostopic list -v
就会得到如图:
parallels@parallels-vm:~$ rostopic list -v
Published topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
* /rosout [rosgraph_msgs/Log] 4 publishers
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1 publisher
Subscribed topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 2 subscribers
* /rosout [rosgraph_msgs/Log] 1 subscriber
* /statistics [rosgraph_msgs/TopicStatistics] 1 subscriber
2、提取其中的数据成立新的bag包
在一个包含数百个话题的大型系统中,经常会发布诸如图像等的大量的信息,把它们都记录到一个文件里是不现实的,好在rosbag record
命令提供了仅记录部分话题的能力。
rosbag record -O subset /turtle1/cmd_vel /turtle1/pose
-O
选项指定了我们要保存的bag文件的名字(subset.bag),后面的/turtle1/cmd_vel
和 /turtle1/pose
则指定了我们要记录信息的话题。
如果只是记录num次数据:可以在-O 后买你添加参数:-r num
注:rosbag record/play
无法完美重现系统的状态。
四、.bag文件转.txt
将file_name.bag
文件中topic_name
话题的消息转换到Txt_name.txt
文件中:
rostopic echo -b file_name.bag -p /topic_name > Txt_name.txt
五、.bag文件生成失败,只出现.bag.active文件
根据目前的经验,出现这情况是因为电脑在记录消息时卡掉了,没有完成最终的录制。可以转换成.bag文件,但是消息有丢失(电脑卡掉后的话题内容)
恢复:
- ①切换到”xxx.bag.active”文件所在的目录下;
- ②命令行输入“rosbag reindex xxx.bag.active”;
- ③输入”rosbag fix xxx.bag.active outfile_name.abg”;
注:
在第二步结束后,除了原来的以.bag.active为后缀的文件之外,还会生成一个以.bag.org.active为后缀的文件,注意该文件只是中间文件,第三部输入的时候不要对该文件进行修复。
在第三步结束之后,会生成正常的.bag文件