3. 数据采集基础:传感器数据与硬件选型

做机器人模仿学习,第一步就是搞定数据。说白了,没有高质量的数据,后面模型训练得再好也是白搭。我个人习惯把数据采集比作「做饭前的买菜」——菜不新鲜,厨艺再好也白费。

这一章,咱们聊聊传感器数据、硬件选型,还有那个让人头疼的时间戳对齐问题。

3.1 传感器数据:三种核心传感器

ACT模型需要感知环境,主要靠三种传感器:RGB相机、深度相机、IMU。它们各司其职,缺一不可。

3.1.1 RGB相机

RGB相机就是普通彩色摄像头。它提供的是最直观的视觉信息——颜色、纹理、形状。嗯,说白了就是「人眼看到的东西」。

在ACT模型里,RGB图像通常作为策略网络的输入。我建议分辨率至少640×480,帧率30fps以上。太低的话,模型学不到细节。

我的经验: 别用手机摄像头凑合。手机摄像头有自动白平衡、自动曝光,这些「智能」功能反而会引入不一致性。用工业相机,参数固定,数据才稳定。

3.1.2 深度相机

深度相机提供的是距离信息。每个像素告诉你「这个点离相机有多远」。有了深度,模型才能理解三维空间。

常见的深度相机技术有三种:

  • 结构光(如Kinect v1):投射红外点阵,通过变形计算深度。室内效果好,室外见光死。
  • 飞行时间(ToF)(如Kinect v2、Azure Kinect):发射红外光,测量反射时间。速度快,精度一般。
  • 双目立体视觉(如Intel RealSense):两个相机视差计算深度。室外可用,但计算量大。

我个人更推荐ToF方案。为什么?因为它在室内场景下稳定,而且数据噪声相对可控。我在项目中遇到过结构光相机在阳光下直接「罢工」的情况,从那以后我就对ToF情有独钟了。

3.1.3 IMU(惯性测量单元)

IMU包含加速度计和陀螺仪。它测量的是加速度和角速度。别看它数据简单,在机器人领域,IMU是「救命稻草」——当视觉被遮挡时,IMU还能撑一会儿。

在ACT模型里,IMU数据通常用来做状态估计或动作平滑。我建议选IMU时注意两点:

  • 输出频率至少200Hz(越高越好)
  • 加速度计量程±16g,陀螺仪±2000°/s
避坑指南: 我曾经用过一个廉价IMU,静止时数据漂移严重。后来发现是温漂问题。记住:IMU的零偏稳定性很重要,别只看参数表上的「高精度」三个字。

3.2 数据采集硬件选型

硬件选型是个系统工程。我把它拆成三个部分:传感器、计算平台、连接方式。

3.2.1 传感器选型对比

传感器 推荐型号 优点 缺点 适用场景
RGB相机 Intel RealSense D435 自带深度,RGB对齐好 分辨率一般 桌面操作
RGB相机 FLIR Blackfly S 高分辨率,全局快门 贵,需额外配镜头 高精度场景
深度相机 Microsoft Azure Kinect ToF,宽视场角 停产了,但二手可用 全身动作捕捉
深度相机 Intel RealSense L515 固态激光雷达,精度高 视场角小 精细操作
IMU Bosch BMI160 便宜,功耗低 精度一般 入门级
IMU Analog Devices ADIS16470 工业级,低漂移 贵,接口复杂 高精度导航

我个人习惯:入门用RealSense D435 + BMI160,成本低,上手快。等做产品了再换高端方案。

3.2.2 计算平台

数据采集需要一台「大脑」。常见选择:

  • 笔记本电脑:方便,但USB带宽有限。我建议用带雷电3/4接口的笔记本。
  • Jetson Orin:嵌入式,适合移动采集。但散热是个问题。
  • 树莓派:便宜,但性能弱。只适合低分辨率、低帧率场景。

你想想看,如果同时采集RGB、深度、IMU,数据量可能达到几百MB/s。普通USB 2.0根本扛不住。我建议至少用USB 3.0,最好用独立采集卡。

3.3 数据同步与时间戳对齐

这是数据采集里最坑的地方。三种传感器各自有各自的时钟,采集时间点不一样。如果不对齐,模型学到的就是「错位」的信息——比如手已经抓到了杯子,但图像还显示手在杯子上面。

3.3.1 为什么需要同步?

举个例子:RGB相机在t=0时刻拍了张图,深度相机在t=0.1秒拍了张图,IMU在t=0.05秒更新了数据。如果直接把这些数据拼在一起,模型会学到「手在杯子上面」和「手在杯子里面」的混合信息。你说这能学好吗?

3.3.2 硬件同步方案

最可靠的方法是用硬件触发信号。比如:

  • 用一个单片机产生PWM信号
  • 同时触发RGB相机和深度相机的「外触发」引脚
  • IMU通过SPI/I2C读取,也由同一个单片机控制

这样所有传感器都在同一个时间点采集数据。误差可以控制在微秒级。

核心思路: 硬件同步 > 软件同步。能用硬件解决的,别用软件凑合。

3.3.3 软件同步方案

如果硬件不支持外触发,那就只能用软件了。常见做法:

  1. 每个传感器数据都打上系统时间戳(用clock_gettime或std::chrono)
  2. 采集完成后,根据时间戳做插值对齐
  3. 比如RGB是30fps(33ms一帧),IMU是200Hz(5ms一帧),那就把IMU数据插值到RGB的时间点上

代码示例(伪代码):

// 假设RGB时间戳为 t_rgb
// IMU数据列表为 [(t1, a1), (t2, a2), ...]
// 找到 t_rgb 前后两个IMU数据点
imu_before = 找到最大 t_i <= t_rgb 的IMU数据
imu_after  = 找到最小 t_i >= t_rgb 的IMU数据

// 线性插值
alpha = (t_rgb - imu_before.t) / (imu_after.t - imu_before.t)
interpolated_accel = imu_before.accel * (1 - alpha) + imu_after.accel * alpha
避坑指南: 我曾经用Python的time.time()打时间戳,结果发现不同线程的time.time()返回的时间不一致。后来改用time.monotonic()才解决。记住:time.time()可能回退,time.monotonic()不会。

3.3.4 时间戳对齐的工程实践

我建议的数据采集流程:

  1. 启动所有传感器,先跑几秒钟「预热」
  2. 每个传感器数据包都带时间戳(用同一个时钟源)
  3. 采集完成后,把所有数据按时间戳排序
  4. 以最慢的传感器(通常是RGB相机)为基准,插值其他传感器数据
  5. 保存为HDF5或ROS bag格式

嗯,这里要注意:插值会引入误差。如果传感器帧率差距太大(比如RGB 30fps,IMU 1000Hz),插值误差可以忽略。但如果差距不大(比如RGB 30fps,深度30fps),最好用硬件同步。

3.4 本章知识体系

下面这张图总结了数据采集的核心逻辑:

数据采集基础:知识体系 RGB相机 彩色图像,30fps 深度相机 距离信息,ToF/结构光 IMU 加速度+角速度,200Hz+ 硬件选型 传感器 + 计算平台 + 连接方式 数据同步与时间戳对齐 硬件同步 / 软件插值 / 统一时钟源 高质量数据集(HDF5/ROS bag)

从图中可以看出,数据采集的流程是:传感器 → 硬件选型 → 同步对齐 → 输出数据集。每一步都环环相扣,缺一不可。

我的建议: 刚开始做数据采集时,别追求完美。先用一个RGB相机+一个IMU跑通流程,再逐步加传感器。一口吃不成胖子,数据采集也是。

公众号:蓝海资料掘金营,微信deep3321