ROS2学习笔记10--使用ros2 bag进行录制和回放数据

Posted 鸿_H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS2学习笔记10--使用ros2 bag进行录制和回放数据相关的知识,希望对你有一定的参考价值。

概要:这篇主要介绍使用ros2 bag进行录制和回放数据

环境:ubuntu20.04,ros2-foxy,vscode

最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.

2.1.10录制和回放数据(原文:https://docs.ros.org/en/foxy/Tutorials/Ros2bag/Recording-And-Playing-Back-Data.html

>>教程>>录制和回放数据

你正阅读的是ros2较老版本(Foxy),但仍然支持的说明文档.想查看最新版本的信息,请看galactic版本链接( https://docs.ros.org/en/galactic/Tutorials.html

录制和回放数据

目标:记录话题发布的数据,你任何时候都可以回放并检查(它)

课程等级:初级

时长:10min

目录

1.背景
2.预备知识
3.步骤
3.1设置
3.2选择一个话题
3.3 ros2 bag record
3.4 ros2 bag info
3.5 ros2 bag play
4.总结
5.下一步
6.相关内容

1.背景

ros2 bag是一个命令行工具,用于录制系统话题发布的数据.它可以记录经过任意个话题的数据,并保存到一个数据库中.你可以回放这些数据进行复现测试或实验的结果.记录话题也是一个很好分享你工作内容的方式,让别人进行再创造(你的工作).

2.预备知识

你应该将ros2 bag作为ros2常规配置,之前已安装了.

如果你已经从linux发行版本进行了安装,但系统不能识别这个指令,(也可以)像这样子安装它:

sudo apt-get install ros-foxy-ros2bag \\
                     ros-foxy-rosbag2-converter-default-plugins \\
                     ros-foxy-rosbag2-storage-default-plugins

本课程谈到一些概念都在前面课程介绍了,如节点和话题.这里也使用到turtlesim包.

老规矩,别忘记在新打开终端source一下配置文件(环境变量)(个人,如果ros2的环境变量写到启动脚本.bashrc里面,没必要再source一次了).

3.步骤

3.1设置

你将要记录turtlesim系统的键盘输入,保存并且用于后面回放,所以开始之前,需要启动节点/turtlesim和节点/teleop_turtle

新开终端运行:

ros2 run turtlesim turtlesim_node

另一终端运行:

ros2 run turtlesim turtle_teleop_key

创建一个目录用来存储记录数据,很好的练习:

mkdir bag_files
cd bag_files

3.2选择一个话题

ros2 bag只能记录从话题发布出来的数据.看看你系统的话题清单,打开终端输入:

ros2 topic list

返回:

/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

在话题课程中,你知道/turtle_teleop节点发布指令到话题/turtle1/cmd_vel,使得小乌龟在仿真窗口运动.

为了查看/turtle1/cmd_vel正在发布的数据,输入指令:

ros2 topic echo /turtle1/cmd_vel

一开始什么数据都没有,因为teleop没有发布任何数据.返回运行teleop的终端,单击窗口以激活.键入指定的字母来移动小乌龟,终端使用ros2 topic echo指令的话,你会看到有数据发布了.

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

3.3 ros2 bag record

为了记录话题发布的数据,使用以下指令语法:

ros2 bag record <topic_name>

在运行该指令之前,新开一个终端,进入之前创建的目录bag_files下(再运行该指令),因为rosbag文件回报存在你运行指令的目录下.

运行指令:

ros2 bag record /turtle1/cmd_vel

你将会看见以下信息(时间和数据会不同):

[INFO] [rosbag2_storage]: Opened database 'rosbag2_2019_10_11-05_18_45'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...

现在,ros2 bag指令正在记录发布在/turtle1/cmd_vel话题的数据.返回运行teleop终端,再次驱动小乌龟.怎么运动无所谓,但尽量跑一个合理的图形方便后面回放观看.
图片.png
输入ctrl+c停止录制.

收集到的数据保存在bag文件中,其名字样式如同rosbag2_year_month_day-hour_minute_second

3.3.1录制多个话题

你也可以录制多个话题,(记得)修改ros2 bag指令运行保存得到的包名字

运行下面指令:

ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose

-o操作可以让你的包获取独一无二的名字.接下来字符串是文件名字,本案例是subset

同时录制多个话题,简单使用空格分隔每个话题.

你看见如下消息,证明所有话题(所选择的)都被录制了.

[INFO] [rosbag2_storage]: Opened database 'subset'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/pose'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...

你可以移动小乌龟,当你(录制)完成时,可键入ctrl+c.

注意:
另外一个操作也可以加入命令中,-a表示录制系统所有系统话题.

3.4 ros2 bag info

你可以查看录制内容,通过运行:

ros2 bag info <bag_file_name>

subset包运行这条指令,可以获得文件信息列表:

ros2 bag info subset
Files:             subset.db3
Bag size:          228.5 KiB
Storage id:        sqlite3
Duration:          48.47s
Start:             Oct 11 2019 06:09:09.12 (1570799349.12)
End                Oct 11 2019 06:09:57.60 (1570799397.60)
Messages:          3013
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 9 | Serialization Format: cdr
                 Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 3004 | Serialization Format: cdr

为了看更加个性化信息,你肯定要打开数据库来查看,这里是一种轻量级数据库,这(数据库查看操作)不属于ros2知识范围了.

3.5 ros2 bag play

在回放数据集之前,输入ctrl+c终止teleop窗口的运行.然后保证turtlesim仿真窗口一直可见,这样子你就可以看见录制包在行动.

输入指令:

ros2 bag play subset

终端会返回信息:

[INFO] [rosbag2_storage]: Opened database 'subset'.

你的乌龟会跟着记录你输入的路径走(尽管实际上不是百分百,由于系统的时间特性,小乌龟仿真有一些小的变化)

因为subset文件记录的是/turtle1/pose话题,只要你的turtlesim一直在跑,ros2 bag play指令都不会退出,除非你不跑了.

这是由于只要/turtlesim节点处于活动状态,它(录制包)周期性读取数据到话题/turtle1/pose上.你可能注意到上面ros2 bag info 例子的结果,话题/turtle1/cmd_vel信息条数仅为9.这表示录制时按字母的次数.

注意到/turtle1/pose的统计数值超过3000;当我们录制时,数据发送到该话题3000次.

为了了解位置信息发布的频率,你可以运行指令:

ros2 topic hz /turtle1/pose

4.总结

ros2系统中,你可以使用ros2 bag指令来录制传输到话题的数据.无论你是跟别人分享你的工作还是研究自己的实验,它都是一个很好工具.

5.下一步

你已经完成了"初级阶段:CLI 命令行界面工具"课程!下一步是"初级阶段:客户端库"课程,第一个课程是创建一个工作空间.

6.相关内容

这里(https://github.com/ros2/rosbag2)对ros2 bag做了更加彻底的解析.关于QoS兼容性和ros2 bag的更多信息,可以看课程,rosbag2:颠覆QoS策略(https://docs.ros.org/en/foxy/Guides/Overriding-QoS-Policies-For-Recording-And-Playback.html#ros2bag-qos-override)。

其他

个人认为重点:

ros2 bag record <topic_name> #录制话题的数据信息,数据包名字根据日期自动生成

ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose #同时录制多个话题,并且自定义数据包名字为subset

ros2 bag info <bag_file_name>  #查看包的规格参数

ros2 bag play <bag_file_name>  #回放包内容

碰到问题:

ros2 topic echo /turtle1/cmd_vel #动作时,还是无数据输出;小乌龟还是只能转动

这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.

#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈

以上是关于ROS2学习笔记10--使用ros2 bag进行录制和回放数据的主要内容,如果未能解决你的问题,请参考以下文章

ROS2播放ROS1的bag

ROS2学习笔记24--用colcon对包进行编译

ROS2学习笔记1--配置ros2环境

ROS2学习笔记3--认识ros2节点node

ROS2学习笔记6--认识ros2参数parameters

ROS2学习笔记5--认识ros2服务services