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
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 软件同步方案
如果硬件不支持外触发,那就只能用软件了。常见做法:
- 每个传感器数据都打上系统时间戳(用clock_gettime或std::chrono)
- 采集完成后,根据时间戳做插值对齐
- 比如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
3.3.4 时间戳对齐的工程实践
我建议的数据采集流程:
- 启动所有传感器,先跑几秒钟「预热」
- 每个传感器数据包都带时间戳(用同一个时钟源)
- 采集完成后,把所有数据按时间戳排序
- 以最慢的传感器(通常是RGB相机)为基准,插值其他传感器数据
- 保存为HDF5或ROS bag格式
嗯,这里要注意:插值会引入误差。如果传感器帧率差距太大(比如RGB 30fps,IMU 1000Hz),插值误差可以忽略。但如果差距不大(比如RGB 30fps,深度30fps),最好用硬件同步。
3.4 本章知识体系
下面这张图总结了数据采集的核心逻辑:
从图中可以看出,数据采集的流程是:传感器 → 硬件选型 → 同步对齐 → 输出数据集。每一步都环环相扣,缺一不可。
公众号:蓝海资料掘金营,微信deep3321