3、数据采集基础:数据采集硬件选型(相机、机械臂、夹爪)、ROS与数据录制、数据格式(HDF5/JSON)

好,咱们进入第三章。数据采集,说白了就是给机器人“喂”经验。你想想看,一个具身智能体,如果没有高质量的数据,再牛的算法也是白搭。我见过太多团队,算法模型调得飞起,结果一上真实数据就崩,十有八九是数据采集这步埋了雷。

这一章,我就带你把这套“雷区”趟一遍。从硬件怎么挑,到ROS怎么录,再到数据存成啥格式,咱们一步到位。

3.1 硬件选型:别让传感器拖了后腿

硬件选型,我个人的习惯是“够用就好,留有余量”。别一上来就追求最贵的,关键看你的任务场景。

3.1.1 相机:眼睛要亮,也要快

相机是机器人的眼睛。选型主要看三个指标:分辨率、帧率、视场角。

  • 分辨率:抓取任务,640x480 其实就够。但如果你想做精细操作,比如穿针引线,那至少得上 1280x720。我在项目中遇到过,用低分辨率相机去识别小零件,结果边缘模糊,抓取成功率直接掉到 30%。后来换了高清的,立马回到 95%。
  • 帧率:机械臂动作快,帧率就得高。一般 30fps 是底线。如果做高速抓取,建议 60fps 以上。帧率低了,动作会“卡顿”,数据就不连贯。
  • 视场角:决定了你能看到多大范围。桌面操作,60°-90° 比较合适。太窄了,机械臂一动就出画;太宽了,畸变严重,标定麻烦。
我的小建议: 如果预算有限,优先保证帧率。分辨率低一点,后期可以靠算法补;帧率低了,动作细节就丢了,神仙难救。

3.1.2 机械臂:精度和自由度是核心

机械臂的选择,说白了就是看你的“手”够不够灵巧。

  • 自由度:6轴是主流,能覆盖大部分桌面任务。7轴冗余自由度,适合避障和复杂姿态。我建议新手从6轴开始,别贪多。
  • 重复定位精度:这是硬指标。抓取任务,±0.1mm 是及格线。低于这个,夹爪可能抓空。我记得有一次,用了一个精度 ±0.5mm 的旧机械臂,结果每次抓同一个杯子,位置都偏一点,数据一致性极差。
  • 负载:别只看机械臂能扛多重,还要算上夹爪和工件的重量。留出 20% 的余量比较稳妥。

3.1.3 夹爪:最后一厘米的成败

夹爪是直接接触物体的部件,选型不当,前功尽弃。

  • 平行夹爪:最常用,适合抓取规则物体。行程要能覆盖你目标物体的尺寸范围。
  • 三指/五指灵巧手:适合抓取异形件或易碎品。但控制复杂,数据采集难度也大。
  • 吸盘:适合抓取平面、光滑物体。速度快,但对材质有要求。
避坑指南: 我曾经选了一款夹爪,力气很大,但夹持力不可调。结果抓鸡蛋,一夹就碎;抓金属块,又打滑。后来换了带力控的夹爪,才解决问题。所以,力控或至少力传感器,是数据采集的“必需品”。

3.2 ROS与数据录制:把“经验”存下来

硬件选好了,接下来就是怎么把机械臂的动作、相机的画面同步录下来。ROS(机器人操作系统)是这里的主角。

3.2.1 ROS Bag:最省心的录制工具

ROS 提供了 rosbag 工具,可以一键录制所有话题(Topic)的数据。你想想看,机械臂的关节角度、末端位姿、相机图像、夹爪状态……这些数据流,rosbag 都能按时间戳对齐存下来。

# 录制所有话题
rosbag record -a -o my_data.bag

# 录制指定话题
rosbag record /camera/rgb/image_raw /joint_states /gripper_state -o my_data.bag

我个人习惯,录制时一定加上 -o 参数,指定输出文件名。不然默认生成的时间戳文件名,后期找起来很痛苦。

3.2.2 同步问题:时间戳是命根子

数据采集最怕什么?最怕时间不同步。相机图像是第 1.0 秒的,机械臂状态是第 1.1 秒的,那这组数据就是废的。

ROS 里,每个消息都自带时间戳。但不同硬件的时间基准可能不一样。我建议:

  • 所有传感器和控制器,都通过 NTP(网络时间协议)同步到同一台主机。
  • 录制时,使用 --clock 参数,让 ROS 使用模拟时钟,保证所有话题的时间戳一致。
# 使用模拟时钟录制
rosbag record --clock -a -o synced_data.bag
核心要点: 数据采集,时间同步是“1”,其他都是“0”。没有这个“1”,后面所有工作都是白费。

3.3 数据格式:HDF5 vs JSON

数据录下来了,存成什么格式?这直接影响到后续的训练效率。

3.3.1 JSON:人类可读,但效率低

JSON 是文本格式,结构清晰,用文本编辑器就能打开看。适合小规模数据、调试阶段。

{
  "timestamp": 1234567890.123,
  "joint_positions": [0.1, -0.2, 0.3, -0.4, 0.5, -0.6],
  "gripper_state": 0.8,
  "image_path": "frame_0001.png"
}

但 JSON 的缺点也很明显:

  • 文件体积大,同样的数据,比二进制格式大 3-5 倍。
  • 解析慢,尤其是大量图像数据,JSON 根本扛不住。

3.3.2 HDF5:工业级数据容器

HDF5 是二进制格式,专门为大规模科学数据设计。它支持:

  • 分层结构:像文件夹一样组织数据。
  • 高效压缩:无损压缩,体积小。
  • 快速读写:支持并行 I/O,适合 GPU 训练。

我强烈建议,正式的数据集,都用 HDF5。下面是一个简单的 Python 示例:

import h5py
import numpy as np

# 创建 HDF5 文件
with h5py.File('demo_data.h5', 'w') as f:
    # 创建数据集
    f.create_dataset('joint_positions', data=np.array([0.1, -0.2, 0.3]))
    f.create_dataset('gripper_state', data=0.8)
    
    # 创建组,组织数据
    grp = f.create_group('camera')
    grp.create_dataset('rgb_image', data=np.random.rand(480, 640, 3))
    grp.create_dataset('depth_image', data=np.random.rand(480, 640))
我的经验: 如果你做模仿学习,数据量动辄几百 GB,HDF5 是唯一的选择。JSON 只适合做配置文件或小样本调试。

3.4 知识体系总览

下面这张图,帮你把本章的核心逻辑串起来。从硬件选型,到数据录制,再到格式选择,每一步都环环相扣。

数据采集基础:核心流程 硬件选型 相机 机械臂 夹爪 ROS 数据录制 rosbag 录制 时间同步 数据格式 JSON HDF5 关键原则 1. 硬件选型:够用就好,留有余量 2. 数据录制:时间同步是命根子 3. 数据格式:大规模数据用 HDF5,调试用 JSON

嗯,到这里,数据采集的基础框架就搭好了。硬件选型别纠结,ROS 录制别偷懒,数据格式选 HDF5。这三步走扎实了,后面的模型训练才能顺风顺水。