1. 先把"信号域"列清楚,再谈买什么设备
我见过太多团队在具身智能数据采集这件事上一上来就问"买哪款相机""用哪家动捕",结果设备清单拉了一长串,采回来的数据却跑不出一个能收敛的策略。问题往往不在设备本身,而在于没先想清楚一件事:这个人机交互实验里,到底有哪几路信号是必须被同步记录下来的。
我自己的习惯是先画一张"信号域清单",把整个实验拆成四块:机器人自己的状态、机器人与物体的接触、机器人视野里的场景、以及人的行为。这四块对应完全不同的传感器体系、采样率和接口标准,选型时如果混在一起谈,一定会出现"高精度通道被低精度通道拖死"的情况。比如你花大价钱上了 200 Hz 的光学动捕,结果视觉通道是 30 fps 的普通 RGB,两者做时空对齐的时候,动捕的高时间分辨率其实被浪费掉了一大半。
反过来也成立。有些做 HRI 行为分析的实验,核心变量是人的注视时长、手部停留位置、协作时的让行时机,这类研究对绝对空间精度的要求可能只有厘米级,但对"人在什么时刻做了什么"的时间分辨率要求很高,那选型重心就应该压在事件标记和时钟一致性上,而不是去堆亚毫米级的空间精度。所以第一步不是比参数,是给每一路信号写清楚三件事:采样率底线、可接受的误差上限、以及它和哪几路信号存在因果关联。
1.1 视觉通道:相机数量不等于信息量
视觉是具身智能数据集里占比最大的一路,也是最容易堆料堆错的一路。常见的组合是头部或肩部一个广角主视角、腕部一到两个近距离视角、再加一个俯视全局视角。数量看着不少,但真正决定数据质量的是几个很容易被忽略的参数。
第一是全局快门还是卷帘快门。机械臂做快速抓取的时候,卷帘快门会产生明显的果冻效应,一根直的桌沿在图像里是斜的,这种畸变在后期做位姿估计时会直接变成系统性误差,而且它不是噪声,没法靠滤波去掉。采集动态操作数据,全局快门基本是硬要求。
第二是曝光与帧率的取舍。室内实验室里光照一般可控,很多人为了画面好看把曝光调长,帧率压到 15 fps。但人手在协作场景里移动的峰值速度可以到 1 m/s 以上,15 fps 下相邻两帧之间手已经移动了 6 到 7 厘米,做动作分段标注时会出现严重的边界模糊。我的经验是操作类实验视觉通道尽量保 60 fps 起步,光照不足就补光,不要靠加曝光时间来找亮度。
第三是深度通道的来源。结构光在近距离桌面场景精度好,但抗环境光差、多机互相干扰严重;ToF 在中远距离更稳,近场精度一般;双目立体匹配则吃纹理,白墙和纯色桌面容易大面积空洞。如果实验里既有桌面精细操作又有大范围移动,用单一深度方案很难全覆盖,这时候更实际的做法是主视角用双目、腕部用结构光,明确各自负责的空间范围,别指望一台设备通吃。
1.2 运动与本体感知:动捕、IMU 和关节编码器各管一段
这一路的数据容易被当成"附属品",实际上它才是策略学习的骨架。机器人侧的关节角度、末端位姿、夹爪开合度,这些来自编码器的数据几乎是免费的,采样率高、无遮挡、绝对可靠,是所有其他通道对齐的基准。我一般会把它当作整个采集系统的主时钟源,让其他所有传感器围绕它做对齐。
人的运动捕捉要复杂得多。光学动捕精度高,但需要固定的相机阵列和足够的场地,标记点被遮挡就丢;惯性动捕便宜、便携、不怕遮挡,但长时间使用会累积漂移,通常十几分钟就要做一次重定位;无标记视觉方案部署最快,但精度和稳定性受光照和服装影响很大。
选型的关键不是"哪个好",而是"你要拿它做什么"。如果实验是分析人的操作技能如何迁移到机器人上,那人的末端轨迹精度直接影响后续的动作映射,建议用光学动捕;如果只是标注"人什么时候伸手、什么时候松手"这类事件,无标记方案完全够用,省下来的预算拿去做更多被试量反而更有价值。
1.3 接触与力:被严重低估的一路数据
纯视觉的示教数据在接触密集型任务上的表现一直不理想,插拔、拧螺丝、擦拭、装配这类任务,视觉上看起来几乎一样的两个动作,成败差别全在几牛的力变化上。所以只要实验涉及接触,六维力传感器或者关节力矩估计、指尖触觉阵列至少要上一路。
这里有个很实际的取舍:六维力传感器装在腕部,能给出最干净的接触力,但会改变末端惯量,遥操作时手感和真机不一致;关节力矩是靠电流估算的,不增加硬件但精度差、受摩擦和温度影响明显。我的做法是采集阶段上腕部力传感器,训练阶段把它当作可选观测,部署时不强制要求,这样数据集既保留了信息,又不会绑死硬件。
触觉阵列的门槛主要在成本和通道数。便宜的方案分辨率很低,只能判断"有没有接触";高分辨率阵列价格和数据处理量都上去了。建议先明确任务需要区分的是接触与否、接触位置还是接触力分布,再决定投入。
1.4 人与环境:HRI 实验里人的状态也是数据
这是人机交互场景区别于纯机器人采集的地方。人的视线落点、头部朝向、身体姿态、语音指令、甚至皮肤电和心率这类生理信号,都可能就是实验的自变量。这类通道的特点是采样率需求差异极大,视线可以到 100 Hz 以上,生理信号通常几十到几百赫兹,语音则是连续流。
麻烦在于它们的时间基准各不相同。眼动仪、生理采集设备往往自带独立的采集软件和时钟,如果不接入统一的事件总线,最后做多模态关联时会发现"人看向机器人"和"机器人开始移动"差了一两百毫秒,这个量级足以让交互时序分析得出完全相反的结论。
| 信号域 | 典型采样率 | 常见接口 | 选型关注点 |
|---|---|---|---|
| RGB 视觉 | 30 至 120 fps | USB3 / GigE / MIPI | 全局快门、曝光控制、多机同步 |
| 深度 | 15 至 90 fps | USB3 / GigE | 量程、近场盲区、多机干扰 |
| 关节编码器 | 100 至 1000 Hz | EtherCAT / CAN | 作为主时钟基准 |
| 光学动捕 | 100 至 240 Hz | 以太网 / PoE | 遮挡冗余、标记点布局 |
| 惯性动捕 | 100 至 1000 Hz | 蓝牙 / 私有无线 | 漂移、重定位频率 |
| 六维力 | 100 至 1000 Hz | EtherCAT / 模拟 | 零漂、温漂、线缆应力 |
| 触觉阵列 | 100 至 1000 Hz | 高速串行 | 通道数、扫描率、标定 |
| 眼动 / 生理 | 30 至 1000 Hz | 串口 / 网络 | 独立时钟、事件对齐 |
2. 时间同步没做好,后面所有算法都在给噪声打工
回到开头那个例子。三个相机加一台机械臂,采了两周,策略成功率不到两成的那个团队,最后复盘出来的根因是视觉和机器人状态之间差了大概 80 毫秒。80 毫秒意味着机器人以为自己还在往前推的时候,图像里它已经停了,反过来也一样。这种错位在单帧上肉眼看不出任何问题,但把几千条轨迹喂进网络,模型学到的就是一个"滞后半步"的世界模型。
2.1 三个同步层级:软件时间戳、硬件触发、全局时钟
最粗的一级是软件时间戳,每个设备采集完一帧,程序在回调里打一个系统时间。成本几乎为零,但误差来源极多:USB 传输抖动、驱动缓冲、操作系统调度、不同进程之间的排队,实测在同一台机器上不同通道之间差 10 到 50 毫秒很常见,负载高的时候能到百毫秒级。
中间一级是硬件触发同步,用一个主控板产生周期性的触发信号,所有相机和采集卡在同一时刻起曝。这一级能把通道间偏差压到微秒到百微秒量级,代价是必须控制好线缆长度和触发延迟补偿,而且设备本身要支持外部触发接口,便宜的消费级相机通常没有。
最高一级是全局时钟同步,典型做法是基于网络时钟的精密时间协议,让所有采集节点共享同一个时间轴。它的好处是不要求所有设备物理上连在同一个触发源上,适合分布式、大空间的采集布局。代价是网络设备要支持相应功能,交换机配置有一定门槛。
选哪一级不是看"哪个最先进",而是做一道简单的算术:你的任务里,最快的运动在 1 毫秒内会移动多少距离。以 0.5 m/s 的手部速度算,1 毫秒是 0.5 毫米,10 毫秒是 5 毫米,50 毫秒是 25 毫米。如果任务要求的是"接触发生的瞬间",25 毫米的错位已经足以让一次成功的插入被标成失败。
2.2 漂移到底有多大:一次可以自己算的估算
时钟漂移是个被严重低估的问题。两套设备的晶振就算标称精度都是 20 ppm,长时间运行的相对偏差也会累积:20 ppm 意味着每秒钟差 20 微秒,一小时后就是 72 毫秒。这个数字和时间戳抖动是两回事,抖动是随机误差,可以靠平均压低;漂移是系统性误差,只会越积越多。
估算方法很简单,实验开始和结束时各录一次共同事件,比如对着所有相机同时闪一下灯、在最末端敲一下桌面让力传感器和视觉同时捕捉到。把这两个时刻在各自通道里的时间戳读出来,就能算出这一段时间内的累积偏移量。如果两次实验间隔一小时,偏移量是几十毫秒,那说明你需要周期性重同步;如果是几百微秒,那基本可以忽略。
我通常会在采集流程里强制插入这套"打点标定",每条长轨迹的开头和结尾各做一次同步事件,后期处理时按线性插值补偿。这一步花不了两分钟,但能让整批数据的可用性完全不一样。
2.3 按实验精度要求反选同步方案
把同步需求分成三档会更清楚。
事件级:需要知道"人伸手了""机器人开始动了""接触发生了"这些时刻,容忍误差几十毫秒。软件时间戳加一次性的同步打点就够了,省下的精力和预算投到被试量和场景设计上。
轨迹级:要把人的轨迹和机器人的轨迹逐帧对齐,做模仿学习或者动作映射,容忍误差在几毫秒以内。这一档至少要上硬件触发或者同步打点加插值补偿,而且在实验设计上要尽量让运动慢下来,减少对时间分辨率的依赖。
接触级:要分析接触瞬间的力变化、滑动起始点、抓取稳定性,容忍误差在亚毫秒级。这一档基本只能靠全局时钟加高频力通道,并且要在信号链上尽量减少中间环节,别把力信号绕一圈经过某个低速采集盒。
注意:很多人把同步问题当成后期能修的事情,实际上时间错位一旦超过一个采样周期,信息就已经丢了。后期插值只能在两个真实采样点之间猜,猜不出没有的东西。
3. 场景决定形态:三条典型 HRI 采集路线的取舍
设备选型表上的参数再漂亮,落不到具体场景里都是空谈。按照我做过和见过的项目,人机交互实验大致可以归成三条路线,每条路线的选型逻辑完全不同,甚至互相冲突。
3.1 桌面精细操作台:固定式、高精度、小工作空间
这条路线覆盖的是装配、插拔、精细抓取这一类任务。工作空间通常不超过一立方米,人和机器人可能共享同一张桌面。它的核心诉求是空间精度和稳定性。
设备形态上,变化最少、固定最稳的方案通常表现最好:结构光相机固定在支架上,动捕相机环绕布置,力传感器装在腕部,所有线缆走固定槽。因为工作空间小,光学动捕的相机数量可以少但基线要够,标记点布局要针对桌面操作的高遮挡特点做冗余,比如手腕、手背、几个指节都布点,避免被前臂自身挡住。
这条路线最大的坑是光照和反光。桌面材质如果反光,结构光深度会大面积失效;金属零件在补光灯下会产生高光斑,视觉特征点匹配直接崩掉。我一般会在实验前用一块哑光贴纸把桌面工作区贴掉,成本几十块,省下来的数据处理时间是以天计的。偏光片也是个办法,但要注意它会衰减光强,需要相应调整曝光。
另一个容易被忽略的是人手和机械臂的空间冲突。桌面协作场景里,人的手经常进入机器人的运动包络,如果只用固定视角相机,手会频繁遮挡机械臂末端。腕部相机的价值在这个场景里最大,因为它永远离操作区域最近,遮挡概率最低。
3.2 大空间移动协作:覆盖面积与精度不可兼得
当实验从桌面扩展到整间实验室,甚至是多房间的移动操作,选型逻辑会发生根本变化。光学动捕的相机数量随体积平方增长,一个 8 米乘 8 米的空间要保证无死角高精度覆盖,相机数量和布置难度会让预算迅速失控。
实际做法通常是分层:大范围用惯性动捕或者基于视觉的位姿估计做粗定位,关键交互区域再用少量光学相机做高精度局部覆盖。数据传输上也从有线为主转向无线为主,但要接受无线链路的丢包和延迟抖动,采集软件必须做丢包检测和补发。
这条路线我最想提醒的是标记点可见性设计。移动场景中人的转身、弯腰、蹲下会让标记点频繁被自身遮挡,惯性方案又会漂移,所以最好让视觉和惯性两套数据同时记录,后期做融合。只录一套,到了分析阶段发现某些片段不可用,那一段被试的时间就白费了。
3.3 遥操作与人类示教:重点在人机映射而不是传感器数量
这条路线采集的是"人怎么操作",机器人可能是主从结构,也可能只是被动跟随记录。核心问题不是传感器够不够,而是人的动作到机器人的映射是否一致、是否可逆。
如果用的是主从遥操作,主手和从手的运动学结构差异会引入映射误差,采集时必须同时记录主手位姿、从手位姿和映射关系参数,否则这批数据只能用于训练和当前硬件完全一样的系统,迁移价值几乎为零。如果用的是手持夹爪式的示教工具,好处是直接记录任务空间轨迹,代价是丢掉了关节层面的信息,做全身控制策略时会缺一路监督信号。
我的建议是只要有余力,本体状态一定要全录。存储成本在今天的硬件价格下几乎可以忽略,但一次实验的人力成本和时间窗口是买不回来的。
| 路线 | 典型设备组合 | 空间精度 | 适配边界 |
|---|---|---|---|
| 桌面精细操作 | 结构光 + 环绕动捕 + 腕部相机 + 六维力 | 亚毫米 | 单人单工位、光照可控 |
| 大空间移动协作 | 惯性动捕 + 局部光学 + 无线传输 | 厘米级 | 多人多区域、需处理丢包 |
| 遥操作示教 | 主手 + 从手同步记录 + 全本体状态 | 取决于主手 | 需记录映射参数 |
4. 标定:多传感器系统里最容易被跳过、又最贵的一步
如果只能给一条建议,我会说:把标定当成实验的一部分来排期,而不是当成"有空再弄"的杂事。我见过太多项目在数据采完后才发现相机外参有偏差,或者动捕坐标系和机器人基座之间差了一个旋转,结果整批数据全部作废。
4.1 相机内外参:别指望出厂参数
出厂标定值通常是在理想条件下测的,装到你的支架上、经过运输震动、环境温度变化之后,多少会有偏移。标准做法是用棋盘格或者圆点板做一次内参标定,再用同一块板在多视角下做外参标定。听起来很基础,但真正认真做的人不多。
实操上的几个细节:标定板的平整度要够,打印在纸上再贴到亚克力板上的做法比直接打印在纸上靠谱得多;标定时要覆盖整个视野,特别是边缘区域,只在画面中央标定出的畸变系数在边缘会失效;标定完成后记录当时的温度,如果实验室空调温度波动大,可以在实验前后各标一次,比较差异。
对于多相机系统,外参标定最稳的方法是让同一块标定板同时出现在多个相机的视野里,一次性解出它们之间的相对位姿。如果视野没有重叠,那就得靠公共参照物或者动捕系统做中介,误差会大一些,需要额外验证。
4.2 动捕到机器人基座:一次刚体变换算错,整批数据作废
动捕坐标系的单位和原点都是它自己的,机器人基座坐标系又是另一套。两者之间的刚体变换通常靠"让机器人末端上的标记点走几个已知位姿点"来解。至少要采三个不共线的点,实际做的时候建议采十个以上,用最小二乘拟合,同时看残差。
残差是个很好的质量指标。如果拟合残差在零点几毫米,说明标记点绑定牢固、位姿读取准确;如果残差到了几毫米,通常意味着标记点绑在柔性结构上,或者动捕本身的标定有问题。这时候不要凑合,先解决残差来源。
还有一个隐蔽的坑是标记点相对于末端法兰的偏移。很多团队直接把标记点贴在夹爪或者工具上,但计算变换时用的却是法兰位姿,两者之间的偏移没有补偿,最后所有轨迹都会整体平移一个固定的量。这个偏移可能只有几厘米,在桌面任务里足以让抓取成功率掉一半。
4.3 时空联合标定:一次挥臂同时压两个误差
空间和时间标定可以合并做,这是我比较推荐的做法。让动捕标记点绑在机器人末端,机器人做一个已知的高速往返运动,比如来回移动或者绕圈。这时你同时有动捕通道和编码器通道的两条轨迹,空间上做拟合得到刚体变换,时间上做互相关找最佳延迟量。
具体操作是把其中一条轨迹按不同时间偏移量平移,计算两条轨迹的重合度,重合度最高时的偏移量就是时间延迟。因为运动速度已知,几十毫秒的时间错位会对应到明显的空间错位,相关峰很尖锐,容易识别。
这个方法的另一个好处是它可以重复做。实验前后各做一次,如果两次解出的时间延迟差不多,说明系统稳定;如果差很多,说明有设备在漂移,得先排查。
提示:把这个联合标定流程固化成一个脚本,每次实验开始时自动跑一遍,比靠人记忆可靠得多。现场手忙脚乱的时候,没人会记得去做标定。
5. 采集软件栈与数据落盘格式
硬件选完了,真正决定采集效率的是软件栈。我见过硬件配置几乎一样的两个团队,一个能一天采两百条轨迹,另一个一天采三十条还得加班,差别全在采集软件上。
5.1 录制框架怎么选
通用机器人中间件的好处是生态成熟、驱动齐全、时间同步机制现成,多传感器接入方便,适合快速起步。缺点是元数据组织方式对数据集制作不算友好,动辄几十 GB 的包文件在后期切分时很痛苦,而且如果实验里有一半通道跟机器人无关(比如生理信号、眼动),硬塞进机器人框架里反而别扭。
厂商 SDK 直采的好处是延迟最低、参数控制最细,适合对同步要求极高的接触级实验。缺点是每换一个设备就要重写一遍采集逻辑,扩展性差。
我目前的倾向是混合方案:对时间敏感的通道用厂商 SDK 或者底层接口直接读,写进一个自己的环形缓冲区;其他通道走通用框架。所有数据在内存里按统一时间轴对齐后再落盘,落盘格式由训练管线决定,而不是由采集工具决定。这样采集端只管"快和准",格式转换放到实验间隙批处理。
5.2 落盘格式:从训练管线倒推
常见的几种选择各有各的适用面。分层的二进制容器格式适合存高维数组,机器人数据里用得很广,结构化好、读写快,缺点是跨团队共享时依赖特定库;面向大规模数据集的标准格式适合做分布式训练,切分和打乱方便,但对小规模实验来说有点重;列式存储加独立视频文件的方式最灵活,视频用硬件编码压缩,数值数据用列存,加载快、体积小,适合通道数多、帧率高的场景。
关键不在于选哪个,而在于提前和下游做训练的人对好。我踩过的坑是采集端用了一种格式存了三个月数据,训练端的人发现他们的加载器只支持另一种,最后花了两周写转换脚本,还得重新验证一遍转换过程没有引入时间错位。这种事完全可以在实验设计阶段花半小时沟通掉。
5.3 元数据与标注:决定数据集能不能复用的关键
数据本身的价值是有限的,能复用的数据集的价值才高。能不能复用,取决于元数据记得够不够细。
最低限度要记的东西包括:实验编号、被试编号、日期时间、硬件配置版本、标定参数文件路径、同步打点记录、任务指令文本、成功与否的标签、异常情况说明。这里面最容易被忽略的是"硬件配置版本"和"异常说明"。
硬件配置版本指的是这次采集用的相机型号、镜头焦距、安装位置、工具末端类型。同一个实验做三个月,中途换过一个镜头或者调整过支架高度,如果不记录,后期根本分不清哪些数据是可比的。异常说明则是现场记录的那些"这次操作中途手抖了一下""被试中途看了手机""夹爪有一次没夹住",这些东西在事后回看视频时很难发现,但恰恰是导致策略学到错误行为的原因。
标注方面,语言指令和子任务切分是模仿学习里最需要的人工投入。语言指令建议在采集现场就录,不要事后补,因为现场的记忆最准确,而且可以用语音直接说出指令,后期转录。子任务切分可以先用规则自动粗切,比如按夹爪开合状态变化点分段,再人工修正,效率比纯手工高一个数量级。
| 格式方案 | 优势 | 局限 | 适用场景 |
|---|---|---|---|
| 分层二进制容器 | 读写快、结构清晰 | 依赖特定库、共享麻烦 | 单团队快速迭代 |
| 大规模数据集标准格式 | 支持分布式加载 | 小规模实验偏重 | 多团队协作、大规模训练 |
| 列存加独立视频 | 体积小、加载灵活 | 需要自建加载逻辑 | 通道多、帧率高 |
6. 预算、被试量、场地:选型会上最容易被挤掉的三个约束
技术讨论会很容易变成参数对比会,最后定下来的方案在纸面上很漂亮,落地时却被预算、被试量和场地卡住。这三个约束最好在选型的第一轮就摆到桌面上。
6.1 精度堆料与预算的边际收益
精度提升的边际收益是递减的,而且降得非常快。从厘米级提到毫米级,设备成本可能翻两三倍;从毫米级提到亚毫米级,可能再翻好几倍,但你的任务真的需要亚毫米吗?
判断方法很直接:算一下这个精度在你的任务里对应什么。抓取一个 5 厘米宽的物体,末端定位误差 2 毫米和 5 毫米对成功率的影响可能微乎其微;但如果是把一个 2 毫米的插针插进孔里,误差就从"能不能用"变成"能不能做"。把预算按这个逻辑分配,通常会发现省下来的钱可以用在增加被试量或者延长采集周期上,而这两件事对数据质量的提升往往比精度更明显。
另一个思路是分级采集:主体数据用中等精度设备大批量采,关键片段用高精度设备补采。比如一个长流程任务,只在接触发生的几秒钟里上高精度力通道,其他时段用常规配置。这样既保证了关键信息,又控制了整体成本。
6.2 被试量表与隐私处理
人机交互实验的被试量往往比纯机器人实验更难凑。设备精度的选择会影响被试的舒适度和实验时长,进而影响被试量和数据质量。比如惯性动捕服穿脱就要十几分钟,如果每次实验只采二十条轨迹,摊销到每条数据的时间成本高得离谱,最后要么减少被试量,要么被试疲劳导致数据质量下降。
一个实际的做法是把设备穿戴时间设计进实验流程,每次被试到场尽量采足量的数据,一次实验覆盖多个任务变体。同时做好被试之间的间隔安排,避免排队等待。
隐私处理是硬要求。涉及人脸、声音、个人特征的数据,采集前必须有明确的知情同意流程,采集后要做匿名化处理:人脸区域在落盘前就打码或用躯干特征替代,语音做变声或者只保留指令文本,所有数据文件的命名用编号而不是姓名。这些处理最好在采集环节就完成,不要等到数据积累了几百 GB 再回头清理,那时候工作量和出错概率都会大很多。
6.3 场地:遮挡、光照与走线
场地条件经常是选型的隐形约束。光学动捕需要相机之间的通视,中间放一堵隔断或者几个人站着就会形成遮挡;结构光在阳光直射下基本失效,靠窗的工位在下午会有一段时间完全没法采;无线设备在金属密集的环境里衰减严重。
走线也是。桌面操作台线缆少,问题不明显;大空间移动采集时,电源线、网线、触发线的布置会直接限制被试的活动范围,线缆被拉扯还会导致接触不良和数据丢包。建议在实验设计阶段就把场地画成平面图,标出设备位置、走线路径、被试活动区域和人员通道,这一步花半天,能避免现场反复搬设备。
注意:场地问题往往在实验当天才暴露,而当天重排设备意味着所有标定都要重做。宁可前面多花时间做场地勘察,也不要在采集日临时改布局。
7. 现场高频故障与排查链路
前面都是选型和设计,这一节讲现场会出什么问题,以及怎么一步步查。我把自己遇到过的几类高频故障整理成排查链路,按这个顺序走,大多数问题能在半小时内定位。
7.1 丢帧与时间戳跳变
现象是数据长度对不上,或者某一段通道的时间戳出现明显跳变。排查顺序是:先看总线带宽。多台高分辨率相机同时走一条 USB 总线时,带宽很容易打满,表现为随机丢帧而不是稳定丢帧,这种"偶发"最容易骗人,让人误以为是软件问题而反复优化代码。
带宽没问题就查缓冲区。默认的驱动缓冲区通常很小,短时间抖动就会溢出。把缓冲区调大能吸收大部分抖动,代价是引入额外的固定延迟,需要用同步打点把延迟测出来补偿掉。
再往下查操作系统调度。采集进程如果和图形界面、编译任务、数据压缩抢 CPU,就会在关键时刻被挂起。把采集进程绑到独立的核心、进程优先级调高、关掉不相关的后台服务,这三条做下来通常能解决大部分时间戳抖动。
7.2 遮挡引起的轨迹断裂
动捕轨迹断裂是最浪费数据的问题,因为断裂往往是在事后处理时才发现,现场很难察觉。排查方向有三个。
一是标记点布局。同一个刚体上至少要有能被同时看见的冗余点,不能只靠三个点。手腕、手背、前臂各布一组,任何一组可见就能重建。
二是相机布局。相机不能全放在同一高度同一圈,要高低错落,让俯视和侧视形成互补,这样弯腰或者蹲下时不会所有相机同时被挡。
三是实时监控。采集软件应该实时显示每个刚体的可见标记点数和重建残差,低于阈值就报警。这个功能开发起来不难,但能不能加上去,决定了你是采完才知道数据废了,还是当场就能调整姿势重采。
7.3 力与触觉通道的零漂与温漂
力传感器的零点是会跑的。刚上电时的零点和运行半小时后的零点可能差几牛,如果不在采集前后各做一次空载归零,后期分析接触力时会出现"接触力恒为 3 牛"这种荒谬的结果。
排查和处理流程很固定:每次实验开始前,确保末端完全空载、线缆没有拉扯,采一段静置数据做零点估计;实验中每隔一段固定时间插入一次空载归零动作;实验结束后再归零一次,比较前后差异。如果差异明显,说明室温或者线缆应力在变化,后期处理时按时间做线性补偿。
触觉阵列还要额外注意安装预紧力。贴得太松会有相对滑动,贴得太紧会引入恒定偏置,而且不同通道的偏置量不一样。建议装好后静置几分钟,采一段无接触数据作为基线,所有后续数据减去基线。
7.4 一份可以贴在机柜上的排查顺序
把上面这些整合成一个固定顺序,现场按顺序走就行:
- 检查所有设备的时间戳是否在正常范围内跳到,先排除系统级的时间问题
- 检查总线带宽和丢帧计数,带宽打满优先解决
- 检查标定文件的修改时间,确认用的是本次实验的标定结果
- 检查动捕可见标记点数是否满足阈值,调整相机位置或被试姿势
- 检查力与触觉零点,做一次空载归零
- 录一段十秒钟的测试数据,走完整个落盘和加载流程,确认真实可用再开始正式采集
这个"十秒测试"是我吃过几次亏之后固定下来的步骤。它看起来多余,但能拦住绝大多数低级错误——格式不对、路径没权限、时间戳没对齐、某一路通道根本没写进文件。正式采集前花一分钟验证,比采完两小时发现数据有问题划算太多。
最后分享一个我在实际项目里的做法:把所有采集相关的配置——设备序列号、安装位置、标定参数、软件版本、同步方案——写成一个机读的配置文件,和数据一起落盘,同时打印一份贴在现场。这样哪怕半年后有人问"这批数据当时是怎么采的",翻文件就能答,不用去问当时在场的人。人机交互实验的复现性难题,一大半都出在这种看似琐碎的记录缺失上。