文章目的:使用ROS录制数据并解析(txt, img)
文章核心部分转载自:ROS学习篇(七)rostopic消息记录、回放、转.txt
一、通过Bag文件记录话题消息
当发布话题的节点运行后,通过rostopic list
列出当前运行的话题,然后记录:
mkdir bagfile
cd bagfile
rosbag record -a #记录所有的话题
当消息记录完成后,结束ctrl+c终止record的命令行,在新建的bagfile文件夹(可以在任意位置,方便找到就行)中会生成年-月-日-时-分-秒.bag
文件。
以Intel realsense zr300举例(可以不用看这个例子),由于realsense zr300传感器比较多,其驱动maplab_realsense发布的话题比较多,有imu,fisheye,color,depth,IR等等
我通过rosbag record -a
记录所有的数据,得到:
二、数据重现
我们使用rosbag命令将数据记录在bag文件之后,还可以利用里面的数据重现我们节点的运行状态。
cd bagfile
rosbag info <file_name>
会显示此bag文件的一些详细信息(如下图),之前录制了所有的topic的信息,因此,当使用rosbag info的时候,会显示所有topic的信息。
回放
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> #以两倍的速度发布记录的消息
回放指定话题
rosbag play <your bagfile name> --topics /topic_name
三、录制选定的话题进行录制数据
在一个包含数百个话题的大型系统中(比如我刚提到的realsense zr300),经常会发布诸如图像等的大量的信息,把它们都记录到一个文件里是不现实的,好在rosbag record
命令提供了仅记录部分话题的能力。
rosbag record -O subset /zr300_node/device_time /zr300_node/imu /zr300_node/fisheye/image_raw
-O
选项指定了我们要保存的bag文件的名字(subset.bag),后面的 /zr300_node/device_time /zr300_node/imu /zr300_node/fisheye/image_raw
则指定了三个我们要记录信息的话题。
注:rosbag record/play
无法完美重现系统的状态。解释:
rosbag受制于其本身的性能无法完全复制录制时的系统运行行为,rosplay也一样。对于像turtlesim这样的节点,当处理消息的过程中系统定时发生极小变化时也会使其行为发生微妙变化,用户不应该期望能够完美的模仿系统行为。
四、.bag文件转.txt
将file_name.bag
文件中topic_name
话题的消息转换到Txt_name.txt
文件中:
rostopic echo -b file_name.bag -p /topic_name > Txt_name.txt
比如我,将上述录制的bag数据中imu的部分提取到txt文件中来:
rostopic echo -b subset.bag -p /zr300_node/imu > imu.txt
五、.bag 文件失败,只出现.bag.active文件
经验之谈:在没有ctrl+c打断的情况下,数据一般会是.bag.active的状态,如果进行了Ctrl+c终止,还是.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文件
六、使用rxplot画时间趋势曲线
在ROS系统中,标量数据可以根据消息中提供的时间戳作为时间序列绘制图形。
运行可以发布话题的节点后,可以通过rostopic list
查看当前的发布的话题,现在,我们不再去使用rostopic echo <topic>
,而是通过rxplot
命令就能够看到随时间变化的值的曲线。
rqt_plot /topic/data //单个话题,单个数据
rqt_plot /topic/x:y:z //单个话题,向量数据
rqt_plot /topic/x /topic/y /topic/z
或者先打开GUI界面:
rosrun rqt_plot rqt_plot
然后在topic宏输入项观测的话题就可以了。
但是当某个话题数据较多时,需要plot单个数据才会有曲线,或是根本不行。待进一步研究…
在此采用第一种方法,绘制imu的加速度随时间变化曲线:
输入:
rqt_plot /zr30_node/imu/x:y:z
得到: