ROS 数据采集利器:rosbag 与 rosbag→parquet→LeRobot 实战(十)
通用基础优先 · 第十篇(数采核心章)|ROS 通识系列|Docker 实战
一图读懂本文:录制 → 回放 → 过滤查看 → bag→parquet→LeRobot 转换 → 数采闭环。本篇是数采核心章。
前面九篇都是地基,这一篇直接落到数采平台的命根子:rosbag 把 Topic 流录下来,就是我们的训练数据来源。再顺手把"bag → parquet → LeRobot 数据集"这条转换链路跑通——正是项目 adapter 层的核心。
一、rosbag 是什么
rosbag 是 ROS 的录制/回放工具:把指定话题的消息(含时间戳、类型)按序存成文件,事后可原样回放。对具身智能而言,它就是"机器人演示数据的容器"。
二、Docker 实战:录制与回放
# 录制全部话题(容器内需先 source,且话题已在发布) ros2 bag record -a -o /data/session1ros2 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 篇)。--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 pdreader = 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),采前自检、采后回放排查。