3. 数据采集与预处理:动作块、多视角图像、时间对齐与归一化

大家好,我是你们的讲师。今天咱们聊聊数据采集和预处理。说实话,这部分工作看着不起眼,但我在项目里吃过不少亏。数据搞不好,后面模型再牛也白搭。你想想看,机器人模仿学习,本质就是让机器人看人类怎么做,然后学着做。那“看”和“做”的数据怎么对齐?怎么处理?这就是今天要啃的硬骨头。

3.1 动作块(Action Chunk)概念

先说说动作块。这个概念其实很直观。传统的做法是“一个观测,对应一个动作”。比如机械臂抓杯子,我看到杯子位置,然后输出一个关节角度。但这样有个问题——动作不连贯,容易抖动。

动作块的核心思想:不是预测下一步动作,而是预测未来一段连续的动作序列。比如,我看到当前画面,直接输出未来10个时间步的关节角度序列。这10个时间步就是一个“块”。

为什么这么做?

我个人习惯用动作块,因为机器人执行动作有惯性。你想想,你伸手拿杯子,不会每0.1秒重新规划一次路径吧?你是一气呵成的。动作块就是模拟这种“一气呵成”。

我在项目中遇到过一个问题:如果只预测单步动作,模型很容易陷入局部震荡。比如夹爪快碰到杯子了,模型犹豫是张开还是闭合,结果来回切换,杯子没抓住。用了动作块之后,模型一次性输出10步的夹爪开合指令,动作就平滑多了。

动作块的大小怎么选?我一般从10到30步开始试。太小了没效果,太大了模型学不动。嗯,这里要注意:动作块越大,模型输出的维度越高,训练难度也越大。

3.2 多视角图像采集

接下来是多视角图像。说白了,就是给机器人装多个摄像头。为什么?因为单视角有盲区。你想想,一个机械臂在操作,如果只有一个正面摄像头,那机械臂自己就把杯子挡住了,后面啥也看不见。

常见的多视角配置:

  • 第三视角(固定相机):2-4个固定摄像头,从不同角度拍摄工作台。我习惯用3个,左、右、正上方。正上方视角特别重要,能看清物体的平面位置。
  • 第一视角(腕部相机):装在机械臂末端,跟着机械臂动。这个视角能看到夹爪和物体的近距离交互。
  • 全局视角:一个广角摄像头,俯瞰整个场景。用于理解整体布局。

我的经验:多视角不是越多越好。我曾经试过装6个摄像头,结果数据量爆炸,训练时间翻倍,效果提升却有限。3-4个视角通常就够了。关键是视角要有差异化,别都挤在一个方向。

采集时要注意同步。所有摄像头必须同时触发拍照。我见过有人用软件触发,结果每个摄像头延迟不一样,画面错位了。后来我改用硬件触发,所有摄像头接同一个信号源,问题就解决了。

3.3 时间对齐与插值

时间对齐是个大坑。为什么?因为不同传感器的采样频率不一样。摄像头通常是30fps或60fps,但机器人关节的编码器可能1000Hz。你想想,摄像头每33毫秒拍一张,但关节角度每1毫秒就更新一次。这两者怎么对齐?

对齐策略:

  1. 以摄像头为基准:把高频的关节数据降采样到摄像头帧率。比如摄像头30fps,那就每33毫秒取一个关节角度值。
  2. 时间戳匹配:每个数据点都打上时间戳。然后找离摄像头帧最近的那个关节数据。我一般用“最近邻插值”,简单粗暴,效果还行。
  3. 线性插值:如果两个传感器时间戳对不上,就用前后两个关节角度做线性插值。比如摄像头在t=0.033秒拍照,但关节数据只有t=0.030和t=0.035的,那就插一个t=0.033的值出来。

我曾经踩过的坑:有一次我忘了做时间对齐,直接把原始数据扔给模型训练。结果模型学出来,动作和画面总是差几帧。机器人看到杯子已经移动了,但输出的动作还是针对旧位置的。那叫一个惨不忍睹。所以,时间对齐是必须的,别偷懒。

插值方法的选择:我个人习惯用线性插值,简单高效。如果对精度要求极高,可以用样条插值,但计算量会大一些。对于大多数模仿学习任务,线性插值足够了。

3.4 数据归一化与增强策略

数据归一化,说白了就是把不同量纲的数据拉到同一个尺度。关节角度可能是0-180度,图像像素是0-255,夹爪开合是0-1。如果不归一化,模型会偏向数值大的特征。

归一化方法:

数据类型 常用归一化 我的建议
关节角度/位置 Z-score标准化(均值0,方差1) 用整个数据集的均值和方差,别用单条数据的
图像像素 归一化到[0,1]或[-1,1] 我习惯用[0,1],简单
夹爪力/力矩 Min-Max归一化到[0,1] 注意剔除异常值,别让最大值被噪声带偏
末端速度 Z-score标准化 速度数据通常分布比较集中,Z-score效果好

数据增强呢?这是提升模型泛化能力的关键。你想想,训练时只在固定光照下采集,换了个环境模型就废了。所以得人为制造一些变化。

常用的增强策略:

  • 图像增强:随机亮度、对比度、饱和度调整。我一般亮度调±20%,对比度±10%。别调太多,否则图像失真了。
  • 随机裁剪:从原图中随机裁剪一块区域,然后缩放到原尺寸。这能模拟相机位置的小偏移。
  • 颜色抖动:给RGB通道加一点随机噪声。我习惯加±5的噪声,效果不错。
  • 动作噪声:给关节角度加一点高斯噪声。这能模拟执行器的不完美。我一般加标准差0.01弧度的噪声。

一个小技巧:数据增强要在训练时在线做,别提前做好存起来。这样每次训练看到的数据都不一样,相当于数据量翻了好几倍。我一般用PyTorch的torchvision.transforms,很方便。

最后,别忘了做数据清洗。我见过有人采集了10万条数据,结果一半都是机械臂没动、画面全黑的无效数据。所以,采集完先看一眼,把明显异常的数据删掉。嗯,这一步虽然枯燥,但值得做。

数据采集与预处理核心流程 数据采集 多视角图像 + 关节数据 动作块构建 连续动作序列打包 时间对齐与插值 降采样/最近邻/线性插值 数据归一化 Z-score标准化 / Min-Max归一化 / 图像[0,1] 数据增强策略 图像增强(亮度/裁剪/抖动) + 动作噪声 注意:实际项目中可能需要多次迭代调整参数

好了,数据采集与预处理这部分就讲到这里。记住,数据质量决定了模型的天花板。后面模型调得再好,也弥补不了数据的缺陷。所以,多花点时间在数据上,值得。

专注资料整理