ROS1(三):ROS1相关工具
source link: https://wangxin1248.github.io/linux/2022/08/ros-03.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
ROS1(三):ROS1相关工具
22 August, 2022. It was a Monday.
ROS1相关工具
rosbag
在 ROS 系统中,可以使用 bag 文件来保存和恢复系统的运行状态,比如录制雷达和相机话题的 bag 包,然后回放用来进行联合外参标定。
rosbag 基本作用
rosbag
工具可以录制一个包、从一个或多个包中重新发布消息、查看一个包的基本信息、检查一个包的消息定义,基于 Python 表达式过滤一个包的消息,压缩和解压缩一个包以及重建一个包的索引。
rosbag
目前常用的命令如下:
record
:用指定的话题录制一个 bag 包。info
:显示一个 bag 包的基本信息,比如包含哪些话题。play
:回放一个或者多个 bag 包。check
:检查一个 bag 包在当前的系统中是否可以回放和迁移。compress
:压缩一个或多个 bag 包。decompress
:解压缩一个或多个 bag 包。reindex
:重新索引一个或多个损坏 bag 包。
在目前项目的使用中,用的最多的就是 record、info 以及 play
功能,先录制想要的话题包,录制完毕检查下包的信息,最后再回放作为算法的输入。
官方文档:http://wiki.ros.org/rosbag/Commandline
rosbag record
官方文档:http://wiki.ros.org/Bags/Format/2.0
rosbag 文件结构:
#ROSBAG V2.0
<record 1><record 2>....<record N>
Version 2.0的ROS bag文件格式增加了一些新特点:
- 1) 压缩: 消息(message)存储在块(chunk)中,可以单独压缩,同时仍然允许随机访问;
- 2) 高级索引: 第二级索引允许工具快速收集包文件的统计信息;
- 3) 面向连接: 消息通过连接(connection)存储,使得重新发布记录的消息更加可信;
- 4) 精简: 格式已被精简,例如,消息时间戳(message timestamp)的存储大小几乎是以前的一半;消息记录不包含重复的主题(topic)和连接(connection)信息。
其中 record 的结构如下:
<header_len><header><data_len><data>
其中 header 的结构如下:
<field1_len><field1_name>=<field1_value><field2_len><field2_name>=<field2_value>...<fieldN_len><fieldN_name>=<fieldN_value>
例如一个简单的 record 数据:
<header_len><field1_len>op=0x02<field2_len>conn=0<field3_len>time=<message_time><data_len><serialized_message_data>
每个记录头 (header) 由 N 个 field
组成(name = value
字段序列),其中 op
属性的 field
是每个 record
必须的,其它一些 field
是可选的。
fieldX_name = fieldX_value
的总长度包括’=’字符,是 fieldX_len
字段。这个头序列的总长度(包括名称、’=’字符、值长度和值)是 header_len
字段。
header
中的各个字段 field
可以以任何顺序出现。字段名(fieldX_name
)可以包含任何可打印的ASCII字符(0x20 - 0x7e), ‘=’ (0x3d)除外。
字段值(fieldX_value
)可以包含任何数据(包括嵌入空值、换行符等的二进制数据)。
通过 op field
可以指定 record
的类型,一共有6种不同的 op field
属性,对应6种不同的 record
。注意每种 record
除了op field
之外,还包括自己特定的 field
。op字段用于区分不同类型的记录,下面的op值是有效的(按它们第一次出现在bag中的顺序列出):
Bag header
:存储关于整个bag的信息,比如到第一个索引数据记录的偏移量(offset),以及块(chunk)和连接(connection)的数量。Chunk
. 存储(可能是压缩的)连接和消息记录。Connection
:存储ROS连接的头信息,包括主题名称(topic name)和消息定义(message definition)的全文。Message data
:使用连接的 ID 存储序列化的消息数据,可以是零长度。(Stores the serialized message data with the ID of the connection)Index data
:在前一个块的单个连接中存储消息索引。(Stores an index of messages in a single connection of the preceding chunk)Chunk info
:将有关消息的信息存储在一个块中。
接下来详细介绍:
Bag header
bag header
作为第一条 record
记录在文件中出现一次。
以下字段必须出现在bag header记录中(op=0x03):
index_pos
:块部分后第一条记录的偏移量。conn_count
:文件中唯一连接的数量。chunk_count
:文件中的块记录数。
包头记录(Bag header record
)先用ASCII空格字符(0x20)填充,包头总长度为 4096 Bytes(header_len+data_len)。之所以先填充的原因为在写入后面的数据后,可以方便的修改包头记录。
Chunk
以下字段必须出现在 chunk 记录中(op=0x05):
compression
:数据的压缩类型。size
:未压缩块的字节大小。
支持的压缩类型为“none”和“bz2”。 块的压缩大小可以在 record 的 data_len
字段中找到。
chunk 记录的 data 部分由消息数据(message
)和连接记录(connection
)组成,使用chunk 的 header
中指定方法压缩。
Connection
以下字段必须出现在 connection 记录的 header 部分(op=0x07):
conn
:唯一连接 ID。topic
:存储消息的主题。
数据由一个字符串组成,该字符串包含与包记录头(bag record header)格式相同的连接头(the connection header)。
以下字段必须出现在连接头中:topic、type、md5sum、message_definition
。 可选字段包括:callerid、latching
。
存在两个 topic 字段(分别在 data 和 header 中),这是因为消息可以写入与最初发布的 topic 不同的 bag 文件。
Message data
以下字段必须出现在消息数据的header部分(op=0x02):
conn
:消息到达的连接ID。time
:收到消息的时间。
这些记录中的数据是ROS序列化消息数据。
Index data
以下字段必须出现在索引数据的header部分(op=0x04):
ver
:索引数据记录版本。conn
:连接ID。count
:前一个块中 conn 上的消息数。
这些记录中的 data 取决于文件头中的版本,如果版本号为1,还包括以下字段。
time
:收到消息的时间。offset
:未压缩块数据中消息数据记录的偏移量。
Chunk info
以下字段必须出现在块信息的 header 部分(op=0x06):
ver
:块信息记录版本。chunk_pos
:块记录的偏移量。start_time
:块中最早消息的时间戳。end_time
:块中最新消息的时间戳。count
:块中的连接数。
这些记录中的data取决于文件头中的版本,如果版本号为1,还包括以下字段。
conn
:连接ID。count
:块中到达此连接的消息数。
rosbag 常用命令
rosbag record
使用 record
订阅指定主题并生成一个 bag 文件,其中包含有关这些主题的所有消息,常见用法如下。
用指定的话题 topic_names 来录制 bag 包:
rosbag record <topic_names>
比如录制 rosout、tf、cmd_vel
3 个话题,录制的 bag 包以时间命名:
rosbag record rosout tf cmd_vel
录制完保存 bag 包名称为 session1 + 时间戳.bag
格式:
rosbag record -o session1 /chatter
录制完保存为指定文件名 session2_090210.bag
:
rosbag record -O session2_090210.bag /chatter
录制系统中所有的话题:
rosbag record -a
使用 -h 查看 record 使用方法,很多命令都可以用这个:
rosbag record -h
rosbag info
rosbag info
显示包文件内容的可读摘要,包括开始和结束时间,主题及其类型,消息计数、频率以及压缩统计信息,常见用法如下:
显示一个 bag 包的信息:
rosbag info name.bag
$ rosbag info foo.bag
path: foo.bag
version: 2.0
duration: 1.2s
start: Jun 17 2010 14:24:58.83 (1276809898.83)
end: Jun 17 2010 14:25:00.01 (1276809900.01)
size: 14.2 KB
messages: 119
compression: none [1/1 chunks]
types: geometry_msgs/Point [4a842b65f413084dc2b10fb484ea7f17]
topics: /points 119 msgs @ 100.0 Hz : geometry_msgs/Point
查看常用命令:
rosbag info -h
输出 YAML 格式的信息:
rosbag info -y name.bag
输出 bag 中指定域的信息,比如只显示持续时间:
rosbag info -y -k duration name.bag
rosbag play
rosbag play
读取一个或多个 bag 文件的内容,并以时间同步的方式回放,时间同步基于接收消息的全局时间。回放开始后,会根据相对偏移时间发布消息。
如果同时回放两个单独的 bag 文件,则根据时间戳的间隔来播放。比如我先录制一个 bag1 包,等待一个小时,然后录制另一个 bag2 包,那我在一起回放 bag1 和 bag2 时,在回放的中间会有 1 个小时的停滞期,也就是先回放 bag1,然后需要等待 1 个小时才能回放 bag2。
在回放过程中按空格暂停,常见用法如下
回放单个 bag:
rosbag play record.bag
回放多个 bag,基于全局时间间隔播放:
rosbag play record1.bag record2.bag
开始播放立刻暂停,按空格继续:
rosbag play --pause record.bag
以录制的一半频率回放:
rosbag play -r 0.5 --pause record.bag
指定回放频率,默认 100HZ:
rosbag play --clock --hz=200 record.bag
循环播放:
rosbag play -l record.bag
rosbag check
检查一个 bag 在当前系统中是否可以回放:
rosbag check xxx.bag
rosbag compress
如果录制的 bag 很大,我们可以压缩它,默认的压缩格式是 bz2:
rosbag compress xxx.bag
你也可以添加 -j 手动指定压缩格式为 bz2:
rosbag compress -j xxx.bag
也可以使用 LZ4 来压缩数据:
rosbag compress --lz4 xxx.bag
rosbag decompress
压缩完后,使用需要解压缩:
rosbag decompress xxx.bag
rosbag reindex
如果回放遇到问题,提示 reindex 的话,直接执行即可,这个会自动生成一个原 bag 的备份:
rosbag reindex xxx.bag
常用的是以暂停的方式启动,防止跑掉数据:
rosbag play --pause record.bag
也可以直接回放:
rosbag play record.bag
设置以 0.5 倍速回放,也就是以录制频率的一半回放:
rosbag play -r 0.5 record.bag
回放完后,会用 rostopic list
查看下发布的主题,确保是需要的:
rostopic list
rosbag reinde
在回放包的时候报错,提示需要 reindex,执行一下即可,不过数据好像会少一些:
rosbag reindex xxx.bag
下面是完整的 rosbag 用法,需要的可以查找下。
rosrun
rosrun
允许使用包名直接运行包内的节点(无需知道包路径)
使用格式:
rosrun [package_name] [node_name]
可以首先使用 rosnode
命令来查询对应的node信息:
rosnode list
rqt_graph
rqt_graph 可以以界面的形式展示当前 node 之间的相互关系。
rosnode
rosnode 提供和 node 相关的命令,可以使用 -h 来查看具体的使用:
rosnode list
:列出所有的节点rosnode info node_name
:查看 node_name 的详细信息
rostopic
rostopic 提供和 topic 相关的命令,可以使用 -h 来查看具体的使用:
rostopic list
:列出所有的topicrostopic pub topic_name 消息结构 消息内容
:向指定的topic来发布数据
rosmsg
rosmsg 提供和 mag 相关的命令,可以使用 -h 来查看具体的使用:
rosmsg show msg_name
:展示消息定义的格式
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK