ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ROS 数据采集利器:rosbag 与 rosbag→parquet→LeRobot 实战(十)

ROS 数据采集利器:rosbag 与 rosbag→parquet→LeRobot 实战(十)

ROS 数据采集利器:rosbag 与 rosbag→parquet→LeRobot 实战(十)

通用基础优先 · 第十篇(数采核心章)|ROS 通识系列|Docker 实战

一图读懂本文:录制 → 回放 → 过滤查看 → bag→parquet→LeRobot 转换 → 数采闭环。本篇是数采核心章。

前面九篇都是地基,这一篇直接落到数采平台的命根子:rosbag 把 Topic 流录下来,就是我们的训练数据来源。再顺手把"bag → parquet → LeRobot 数据集"这条转换链路跑通——正是项目 adapter 层的核心。

一、rosbag 是什么

rosbag 是 ROS 的录制/回放工具:把指定话题的消息(含时间戳、类型)按序存成文件,事后可原样回放。对具身智能而言,它就是"机器人演示数据的容器"。

新手视角 · rosbag 像"行车记录仪":机器人看到的(相机)、感觉到(关节角/力)、做过的(指令),全部带时间戳录下来。事后你能在电脑上"重演"这一趟——回放时所有数据像录制时一样重新发出,训练、标注、排查全都靠它。数据集质量的上限,在按下录制键那一刻就决定了。

二、Docker 实战:录制与回放

# 录制全部话题(容器内需先 source,且话题已在发布) ros2 bag record -a -o /data/session1

ros2 bag record -o /data/session1
/joint_states /camera/color/image_raw /tf /tf_static

ros2 bag info /data/session1

ros2 bag play /data/session1 --clock

数采要点:① 务必连同/tf/tf_static一起录,否则位姿链断裂;② 用--compression压图像(zstd),bag 体积能小几倍;③ 录制频率要满足"亚毫秒级时间同步"的硬要求(见第 12 篇)。
老手温故 · 录制决策的四个权衡:①格式——ROS 2 新版默认 mcap(自描述、查询快),老环境 sqlite3,对外交付建议 mcap;②压缩——图像 zstd 压缩比约 3-5 倍,但录制端吃 CPU,机载设备要留余量,折中方案是录原始、落盘后离线压缩;③分片——--max-bag-size控制单文件大小,避免断点续传困难;④回放确定性——回放不等于实时,磁盘抖动会让节奏失真,严格复现要按时间戳驱动(--clock+use_sim_time)而不是按墙钟。

三、rosbag → parquet:把数据变成表格

bag 是 ROS 私有格式,训练框架(LeRobot、PyTorch)读不了。我们要转成通用的 parquet 列存。用rosbag2_py读、pandas写:

import rosbag2_py from rclpy.serialization import deserialize_message from sensor_msgs.msg import JointState import pandas as pd

reader = rosbag2_py.SequentialReader()
reader.open(
rosbag2_py.StorageOptions(uri=‘/data/session1’, storage_id=‘sqlite3’),
rosbag2_py.ConverterOptions(‘cdr’, ‘cdr’))

rows = []
while reader.has_next():
topic, data, ts = reader.read_next()
if topic == ‘/joint_states’:
m = deserialize_message(data, JointState)
rows.append({‘ts_ns’: ts, ‘name’: m.name,
‘pos’: m.position, ‘eff’: m.effort})

df = pd.DataFrame(rows)
df.to_parquet(‘/data/session1_joints.parquet’) # 列存,训练友好

这一段就是 adapter 层的"采集→转换"原型:ROS 私有 → 通用表格。

四、parquet → LeRobot 数据集

LeRobot 数据集规范(我们项目已对齐)把一次演示建成一个 episode,每个 episode 是一个 parquet,列大致为:

列含义
timestamp帧时间戳(与 bag 对齐)
observation.images.cam图像帧
observation.state本体状态(关节角/力矩)
action动作(关节指令)

把上一步的 parquet 按 episode 切分、对齐图像时序、补上 action 列,即得到 LeRobot 可直接LeRobotDataset加载的数据集——这也是傅利叶 GR-3、乐聚 OpenLET 都已对齐的标准。

五、接回数采平台(闭环)

整条链路:本体驱动发 Topic → rosbag 录 → adapter 转 parquet → 归位成 LeRobot episode → 训练 VLA/IL。rosbag 是入口,统一接口(第 05 篇)是跨品牌前提,TF(第 07 篇)是坐标还原保证。这一篇把前面所有地基串成了数采闭环。

六、小结与下篇

  • rosbag 录 Topic 流 = 数采数据来源,务必连 TF 一起录、按需压缩;
  • ros2 bag record / info / play是录制三件套;
  • 用rosbag2_py+pandas把 bag 转 parquet(adapter 层核心);
  • parquet 按 episode 归位成 LeRobot 数据集,对接训练;
  • 下一篇:可视化与调试工具(rviz / rqt),采前自检、采后回放排查。
参考资料:ROS 2 官方 rosbag2 文档;LeRobot Dataset 格式 github.com/huggingface/lerobot(项目已对齐,CC-BY-NC-SA 注意商用授权);rclpy.serialization API。示例基于 ros:jazzy。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进