数据采集基础:遥操作设备选型与数据流程设计

数据采集这件事,说白了就是给机器人“喂”经验。你想想看,ACT模仿学习再厉害,没有高质量的数据,它就是个空壳子。我在这个环节踩过的坑,比后面部署阶段多得多。今天咱们就把这块硬骨头啃下来。

遥操作设备选型:你的手怎么“伸”进仿真里

选设备之前,先想清楚一个问题:你要采集什么类型的动作?是抓取、装配,还是精细操作?不同的任务,适合的设备完全不同。

VR手柄:最直观,但精度有限

我个人习惯用VR手柄做初期数据采集。为什么?因为它便宜、上手快。你戴上头显,拿着手柄挥一挥,机器人就跟着动。但注意了,VR手柄的定位精度大概在毫米级,做粗活可以,精细操作就露馅了。

我的经验: 用VR手柄采集时,记得把控制频率降到30Hz以下。太高了反而容易抖动,数据噪声大。

3D鼠标:工业级的选择

如果你要做精密装配,3D鼠标(比如SpaceMouse)是更好的选择。它提供6自由度控制,手感细腻。我在做手术机器人项目时,就是用3D鼠标采集缝合动作的。精度能到0.1mm级别。

注意: 3D鼠标的学习曲线比较陡。新手第一次用,手会抖得像帕金森。建议先练半小时再正式采集。

力反馈手柄:高级玩家的玩具

力反馈手柄(比如Phantom Omni)能让你“感觉到”机器人在碰什么东西。这玩意儿贵,但值。我记得有一次做易碎品抓取,没有力反馈,数据里全是捏碎的动作。换了力反馈手柄后,数据质量直接上了一个台阶。

设备类型 精度 成本 适合场景
VR手柄 1-5mm 粗放抓取、导航
3D鼠标 0.1-0.5mm 精密装配、焊接
力反馈手柄 0.01mm 易碎品、医疗操作

数据采集流程设计:别让数据“脏”了

流程设计是数据采集的灵魂。我见过太多人,设备买回来,直接上手就采。结果数据乱七八糟,根本没法用。嗯,这里要注意几个关键点。

第一步:标定与对齐

不管你用什么设备,第一步永远是标定。把操作空间和机器人空间对齐。我曾经因为忘记标定,采集了3个小时的数据,结果发现机器人动的位置和手柄差了10厘米。那感觉,就像你对着麦克风唱歌,结果音响延迟了2秒。

第二步:采样频率匹配

设备的采样频率要和机器人的控制频率匹配。比如机器人跑100Hz,你设备只采30Hz,那中间的动作就丢了。反过来,设备采200Hz,机器人只能处理100Hz,数据就冗余了。我建议统一到100Hz,这是最稳妥的。

第三步:数据同步

多设备采集时,时间戳同步是噩梦。我踩过的坑是:用系统时间戳,结果两台电脑时间差了0.5秒。后来我改用硬件触发同步,问题才解决。如果你没有硬件条件,至少用NTP对时。

核心原则: 宁可少采,不要乱采。数据质量永远比数量重要。

数据格式与存储:HDF5 vs ROS Bag

数据存成什么格式?这问题看似简单,但选错了后面哭都来不及。我两种格式都用过,说说我的感受。

HDF5:我的首选

HDF5是层级结构,像文件夹一样组织数据。你可以把关节角度、末端位姿、图像都放在一个文件里。而且它支持压缩,一个100GB的ROS Bag,转成HDF5可能只有30GB。我个人习惯用HDF5做长期存储。

import h5py
import numpy as np

# 创建HDF5文件
with h5py.File('demo_001.h5', 'w') as f:
    # 存储关节角度
    f.create_dataset('joint_angles', data=np.array([...]))
    # 存储末端位姿
    f.create_dataset('end_effector_pose', data=np.array([...]))
    # 存储时间戳
    f.create_dataset('timestamps', data=np.array([...]))

ROS Bag:调试利器

ROS Bag的好处是能直接回放。你在仿真里采集的数据,用rosbag play就能重放一遍,方便调试。但它的缺点是文件大,而且依赖ROS环境。我一般只在调试阶段用ROS Bag,正式采集还是用HDF5。

我的建议: 采集时同时存两份。一份ROS Bag用于实时调试,一份HDF5用于训练。等调试完了,把ROS Bag删掉,只留HDF5。

数据清洗与预处理:把“垃圾”筛出去

数据采完了,别急着训练。先看看里面有没有“脏数据”。我做过统计,新手采集的数据里,大概有20%是无效的。这些数据不清理,模型学出来的全是坏习惯。

去除异常值

设备偶尔会抽风,比如突然跳出一个离谱的关节角度。这种数据必须去掉。我常用的方法是:计算每个维度的均值和标准差,超过3倍标准差的数据直接扔掉。

def remove_outliers(data, threshold=3):
    mean = np.mean(data, axis=0)
    std = np.std(data, axis=0)
    z_scores = np.abs((data - mean) / std)
    return data[~np.any(z_scores > threshold, axis=1)]

平滑处理

人手操作时会有微小的抖动,这些抖动不是机器人应该学的。我习惯用Savitzky-Golay滤波器做平滑。它比简单平均好,能保留动作的细节。

避坑指南: 我曾经把平滑窗口设得太大,结果把快速抓取动作都抹平了。模型学出来,动作慢得像树懒。窗口大小建议设5-7个点。

数据对齐与插值

不同设备的时间戳可能对不齐。比如图像是30fps,关节角度是100Hz。这时候需要做插值。我推荐用线性插值,简单够用。别用三次样条,容易过拟合。

from scipy import interpolate

# 对关节角度做插值,对齐到图像时间戳
f = interpolate.interp1d(joint_timestamps, joint_angles, axis=0)
aligned_joints = f(image_timestamps)

知识体系总览

下面这张图,是我自己总结的数据采集全流程。你照着这个走,基本不会出大问题。

数据采集全流程 设备选型 流程设计 数据存储 VR手柄 / 3D鼠标 / 力反馈 标定 → 采样 → 同步 HDF5 / ROS Bag 数据清洗与预处理 去除异常值 平滑处理 对齐与插值 高质量训练数据集

数据采集这件事,说白了就是“磨刀不误砍柴工”。你花一天时间把设备和流程搞扎实,后面训练和部署能省一周的功夫。我见过太多人,设备没调好就开干,最后数据废了,项目延期。嗯,希望你能少走这些弯路。