EgoScale:从第一人称视频到绳驱灵巧手的动作重定向实践

发布时间:2026/9/18 1:30:04
EgoScale:从第一人称视频到绳驱灵巧手的动作重定向实践 最近一直在折腾一个挺有意思的方向如何让灵巧手像人手一样自然地去抓取、拿捏、转动东西。单独说起来灵巧手这些年已经不算冷门真正让我重新提起兴趣的是“ego”这个前缀。把第一人称视角引入到整个控制链里之后问题会变得非常不一样。我做的这个项目叫 EgoScale核心就一句话从第一人称视频中提取人手动作再 retargeting 到绳驱灵巧手上执行。这里没有用传统的动作捕捉服、数据手套也没有上庞大的端到端模型而是走了一条看着朴素但实际调试起来坑不少的路子——先做几何重建再做尺度映射最后交给欠驱动灵巧手去执行。如果你手头也在做第一人称视觉、灵巧手操作、模仿学习相关的事情或者你只是想找一个“从零开始把人类手部动作搬到机械手上”的完整工程参考这篇文章应该能帮你省掉好几周的试错时间。我会把 EgoScale 里最关键的几个环节拆开讲清楚尤其是我自己在 scale 这一步上踩过的那些坑。1. 先看懂问题ego、retargeting、灵巧手到底怎么咬合在一起1.1 第一人称视角给整个任务带来了什么变化很多人第一次听到 ego第一反应是“以自我为中心”但在机器人视觉里它的含义要具体得多。换句话说ego 指的是 egocentric vision第一人称视觉。摄像头装在人的头上、眼镜上或者胸口看到的画面就是人自己看到的画面而不是站在旁边第三个人看到的画面。这个差别看起来只是相机位置不同实际影响非常大。第三人称视角下相机稳定、观察范围大、人手相对完整大多数做法都能跑得动。可一旦换成第一人称手部会离镜头很近运动范围大自遮挡频繁而且相机本身也在动画面里的背景每帧都在变。你再也不能指望靠一个固定外参把像素坐标简单转换成机器人坐标系里的三维位置。但第一人称也有它不可替代的价值。人在操作东西的时候真正依赖的就是自己看到的画面视角天然和手部任务绑定。漫游式远程操作、AR 辅助示教、模仿学习的数据采集这些东西用第一人称采集反而更自然。EgoScale 选了这个视角也是在试图站在“数据最原始、最不依赖外部设备”的角度去解决控制问题。1.2 retargeting 到底在重定向什么retargeting 这个词在动画领域早就存在意思是把一段动作从一个骨骼结构搬到另一个骨骼结构上。人和机器人的骨骼尺寸不一样关节自由度不一定对得上所以不能直接复制角度而要做一层映射。在 EgoScale 里retargeting 的对象是人手到灵巧手。人手本身就非常复杂20 多个自由度每个手指的骨骼长度、关节活动范围都不同。灵巧手也分好几种有的全驱动有的欠驱动有的还引入了腱绳传动。不管下游手型多复杂retargeting 要做的事情都逃不出这一步从视频流里恢复人手的三维姿态把它转换成一组合法、平滑、能执行的机器人关节指令。这里面有两层设计选择。第一层是直接映射关节角度还是先映射指尖位置再反解机器人运动学。第二层是纯几何规则映射还是让网络去学一个端到端的映射关系。我最后选了“几何先验为主、动态尺度估计为辅”原因很现实端到端训练需要大量配对数据而且一旦换了灵巧手型号模型基本要重训。几何方法至少还能在换手之后只改一层 URDF 参数就能继续调试。1.3 为什么执着于灵巧手而不是二指夹爪如果只是做抓取二指夹爪已经能覆盖不少场景很多产线上也是这么用的。但夹爪的问题在于抓取形态太受限了。对于球形物体、圆柱形物体、薄片、软性物体夹爪要么需要频繁换治具要么根本无能为力。灵巧手能做的操作类型丰富得多而且更接近人的行为范式这对未来复杂操作、人机协作来说意义更大。当然灵巧手的代价也很明显。自由度多控制复杂结构复杂价格还不便宜。为了在成本和可靠性之间找平衡我特意选了绳驱灵巧手。绳驱结构可以把电机放到手臂靠近腕部甚至前臂的位置末端手部本身很轻撞击时不会损坏电机。更重要的是腱绳具备一定的柔性天然对冲击有缓冲作用。这个特性在后面做 retargeting 的时候反而成了一个大变量绳子会拉长、会滑动、会滞后这些都必须在映射环节里提前考虑。2. 整体方案设计与核心原理拆解2.1 EgoScale 的总体流程从一帧像素到一组关节角整个系统的数据流大致可以分成五段。第一段是图像采集用头戴式相机或者胸挂式相机以 30 帧以上的频率录制第一人称 RGB 视频。第二段是手部姿态估计从图像里检测手部关键点并恢复三维关键点坐标。第三段是尺度估计也就是 EgoScale 的核心要算出当前人手相对于机器人灵巧手的尺寸映射关系。第四段是 retargeting把三维人手关键点映射为机器人关节角。第五段是底层控制把目标关节角平滑处理后发给灵巧手执行。这个流程看着直白但每一步都有隐藏问题。比如姿态估计这步虽然当前有很多现成方案但第一人称视频里手部频繁遮挡加上鱼眼、广角带来的畸变关键点置信度波动会非常大。尺度估计更麻烦因为单目相机无法直接给出真实物理尺寸你需要额外的假设或者近似手法才能把像素距离换算成毫米。为了跑通整个流程我没有直接把所有模块一次性全做掉而是先拆解成独立的小任务逐个验证最后再串联。这也是我给你的第一个建议如果总流程第一次跑不通你可以先离线处理录好的视频把姿态估计、尺度、映射、仿真这些都验证完再上真机。2.2 Scale 是真正的重头戏人手和机械手尺度不一致的数学本质为什么项目叫 EgoScale就是因为整个方案的成败都压在 scale 上。人的手和机器人灵巧手的物理尺寸差距很大有的灵巧手只有人手一半大有的是人手的一倍左右。简单粗暴地把人手关节角度直接复制过去是行不通的因为骨骼长度不同同样的关节角指尖落点会差出一大截。如果我们用几何的方式去思考这个问题可以建立一个非常直观的模型。假设人手食指的长度是 L_h灵巧手食指的长度是 L_r那么理想的尺度缩放因子就是 s L_r / L_h。对于末端位置映射我们希望达到的效果是 P_robot s * P_human其中 P 表示指尖或者某个参考关键点的三维坐标。但事情没这么简单因为关节角是旋转量不是平移量。如果直接在关节空间做缩放会出现一个物理上很诡异的现象你不改变角度只改变骨骼长度那指尖的位置变化其实是非线性的。这时候就有两条路线第一条是关节角映射把人的每个关节角乘以一个系数再截断到机械手限位。这个办法实现简单但无法保证指尖位置对应关系而且欠驱动手指一旦耦合角度甚至无法直接独立控制。第二条是末端位置映射先把人手关键点转换成一组合法的指尖位置然后利用机器人的正运动学和逆运动学求解出对应的关节角。这条路线更符合“从一个机械臂换到另一个机械臂”的直觉但在解逆解的时候需要非常注意奇异位形和关节限位。EgoScale 同时也设置了一个动态尺度估计模块。因为人手在画面里的尺度不是一成不变的手离相机近的时候像素距离会放大离远的时候又缩小。静态标定只解决“人手和机械手尺寸”的固定差异动态尺度则解决“每一帧图像里的尺度漂移”。实际操作里我会先用一次手部尺度静态标定拿到一个基准 s然后在每一帧根据手掌宽度、手指长度这些几何量做局部修正最后再用低通滤波平滑防止尺度参数在帧与帧之间跳变。2.3 绳驱灵巧手的加入把问题又抬高了一截用绳驱灵巧手意味着关节角不是由电机直接驱动的而是由腱绳拉动滑轮或者关节结构产生的。绳驱最大的特点在于电机可以放在远端手部结构紧凑。但这也带来了一个问题关节角与电机转角之间不再是固定的比例关系中间隔着一根绳子绳子的张紧程度、摩擦力、蜿蜒路径都会影响实际关节角度。在 retargeting 的语境下这相当于又多了一层运动学映射。你算出来的目标关节角首先要转换到执行器的线长变化量再转换成电机转角最后通过底层 PID 或者力矩控制去执行。这个过程里最常见的现象就是“回程差”绳子正转时和反转时不一定是同一个刚度状态反向运动响应会慢一拍。为了抵消绳驱的影响我在设计 retargeting 策略时做了两个调整。一个是把目标值从“绝对位置”改成“相对位置”每一帧只发送一个增量让底层控制器顺着绳子的自然方向运动减少频繁反向带来的空回。另一个是引入了最小张力预设确保绳子始终处于张紧状态避免松弛后出现突然的跳动。2.4 为什么没有直接上端到端网络开始做 EgoScale 之前我被问过最多的问题就是“现在都端到端了你怎么还在做几何映射”这个问题我很理解端到端在视觉、语言领域确实是主流但落到灵巧手操作上我需要谨慎。端到端路线真正卡人的不是模型本身而是数据。要训练一个“第一人称视频到机器人关节角”的模型你得同时采集大量 RGB 视频和真实的机器人执行数据。机器人执行数据的采集本身就慢灵巧手自由度又多标注成本更高。换成仿真环境来生成数据又要面对 sim-to-real 的迁移问题尤其是接触、摩擦、腱绳特性迁移过去很容易失真。几何 retargeting 至少在可控性上让人踏实。每个中间环节都有明确物理意义出了问题能定位到具体模块。EgoScale 真正把几何使用时也不需要训练一个完全从零的模型现成的姿态估计网络已经足够强大我只需要做一层轻量映射。这相当于把“智能”和“几何确定性”做了分工视觉理解交给神经网络动作映射交给几何约束。3. 实操复现从数据采集到灵巧手执行3.1 数据采集装备与标定细节想跑通 EgoScale第一步不是写代码而是把数据采集做好。我用的是一台头戴式广角相机尽量固定在前额位置稍微向下倾斜 15 到 20 度确保手部在画面中央偏下。广角很重要因为第一人称下手部离相机很近如果视角不够宽手稍微一抬就出画了后面再好的算法也白搭。帧率也需要注意。灵巧手的动作速度比人的手臂慢但手部抓取瞬间的运动其实是很快的至少 30 帧拍着才够用。如果预算允许上 60 帧更好后续做关键点追踪时会有明显优势。相机拿到手后第一件事是标定内参。我用的方法就是常规的棋盘格标定OpenCV 里 calibrateCamera 就能搞定。这一步千万别省因为手部离镜头很近径向畸变和切向畸变会直接影响三维关键点的几何重建精度。我当时偷懒跳过了一次结果 retargeting 出来的指尖轨迹明显扭曲重新标定后才恢复正常。然后就是手部尺度标定。在项目的第一版里我让用户先把手平放在一张 A4 纸上张开五指相机记录几秒钟的数据。程序会自动测量中指到掌根的长度、手掌宽度把这组数值存成一个标定文件。任何后续的 retargeting 都会直接读取这个文件作为静态尺度的基准。3.2 手部关键点估计与 retargeting 工程实现手部关键点估计我没有自己造轮子直接用了现成的 MediaPipe Hands 作为主检测器。它能检测 21 个语义关键点包括每个指节的关节和指尖输出结果也带置信度方便后续做遮挡处理。但对于第一人称强遮挡场景单靠 MediaPipe 还不够稳定。我加了一个简单策略当某一帧的置信度低于阈值时不直接采用当前检测而是用上一帧结果做外推同时把期望关节角保持在前一个安全状态。这个思路非常土但对灵巧手的安全性很关键。下面是一段简化的 retargeting 核心逻辑我做成了伪代码方便你理解整个流程import numpy as np # 静态标定数据 calib load_calibration(hand_scale.json) s_offset calib[scale_factor] # 人手到机械手的基准缩放 # 每帧处理管线 for frame in video_stream: result hand_landmarker.process(frame) if result.confidence 0.5: continue # 跳过低置信度帧保留上一状态 landmarks extract_3d_landmarks(result) # 21个手部关键点 # 1. 动态尺度估计 hand_width norm(landmarks[palm_base_l] - landmarks[palm_base_r]) s_dynamic hand_width / calib[palm_width_pixel] scale s_offset * smooth(s_dynamic) # 低通平滑 # 2. 末端位置映射 target_tip_positions {} for finger in [thumb, index, middle, ring, pinky]: tip landmarks[f{finger}_tip] base landmarks[f{finger}_mcp] target_tip_positions[finger] base scale * (tip - base) # 3. 逆运动学求解 joint_angles ik_solve(target_tip_positions, robot_hand_urdf) # 4. 安全约束 joint_angles np.clip(joint_angles, lower_limits, upper_limits) joint_angles lowpass_filter(joint_angles, alpha0.3) send_to_hand(joint_angles)这套逻辑里最容易被忽略的是第 1 步里的 smooth 函数。动态尺度在每一帧都可能变化如果不做平滑scale 一会儿是 0.8一会儿是 0.9最终端关节角就会抖动得很明显。我采用的是一个简单的一阶低通效果够用如果你想要更稳可以上卡尔曼滤波。3.3 关键参数调节缩放因子、关节限位与滤波参数调节是整个项目里最磨人的环节但也最看不到捷径。我给你列一下我最终调稳的一组参数作为起点参考。首先看缩放因子。静态缩放的初值可以从 URDF 里的骨骼长度直接算出来。比如人的食指近端指骨长度一般为 4 到 5 厘米机器人手的对应段是 2.5 厘米那么 scaling 就在 0.5 到 0.6 左右。实际用的时候我会把静态缩放放到 0.55然后在这个基础上让动态尺度参数在一个小范围内浮动比如上下浮动 20%不要太多。关节限位这块我的原则是宁紧勿松。灵巧手每个关节都有硬件限位但实际跑 retargeting 时不可能每次都精确卡在限位上因为绳驱系统存在惯性限位撞久了容易把绳子拉松。我在软件层把所有关节限位都向内缩了 5 到 8 度虽然牺牲了一点动作范围但可靠性提升非常明显。滤波参数我分成两层。第一层是对关键点坐标做轻量平滑alpha 取 0.4第二层是对关节角做平滑alpha 取 0.3。这个顺序不要反如果先对关节角平滑你会发现关键点抖动引起的突变还是会被 IK 放大只不过看起来慢了一点。延迟方面我的实测端到端延迟大约在 80 到 120 毫秒之间主要来自视觉检测和 IK 求解。对于灵巧手的示教任务这个延迟还能接受但如果要用来做实时远程操作建议把视觉检测模型换成 TensorRT 或者 ONNX Runtime 的加速版本延迟能压到 50 毫秒以内。3.4 选型对比不同灵巧手在 EgoScale 里的表现手型驱动方式自由度retargeting 复杂度稳定性适用场景全驱动手电机直驱16-20中高高精度控制腱绳手腱绳电机12-16高中低自重、近端电机欠驱动手腱绳弹性件8-12高中低抓取自适应气动手气囊/气动肌腱8-12中中柔软交互如果你刚接触这个方向我不是很建议一上来就挑战欠驱动气动手尺度标定和状态观测会让人崩溃。先拿一个自由度不多不少、带位置反馈的腱绳手跑通 EgoScale 的完整链路之后再去挑战更复杂的执行器体验会顺畅很多。4. 常见问题与排查技巧实录4.1 尺度漂移灵巧手突然像“巨人手”或者“婴儿手”这是 EgoScale 里最典型的问题。第一人称画面里手离相机远近变化很频繁如果尺度参数只依赖像素宽度就会出现这种情况手靠近镜头像素宽度大scale 变小灵巧手动作幅度变小手远离镜头scale 变大动作幅度变大。结果就是操作反馈极不稳定。解决思路是这样不能只靠单帧的像素宽度做绝对尺度要结合手部三维姿态的深度信息。如果姿态估计模型输出了手掌的深度值那么你可以先把手关键点的三维坐标转到相机坐标系下再做深度归一化。这样即使手前后移动尺度参数也会稳定很多。实在没有深度输出也可以用一段时间窗口内的中位数来代替瞬时值效果也算说得过去。另外一个很实用的技巧是在启动流程前先让人手在画面里保持一个标准姿势三秒钟程序自动计算一次基准尺度。运行过程中只在基准尺度周围小范围浮动这样即便中途手突然凑近镜头尺度也不会飞掉。4.2 手部遮挡抓东西时手被东西挡了一大半第一人称下手部遮挡是家常便饭。抓杯子的时候手指被杯壁挡了很多关键点直接消失或者置信度暴跌。一开始我以为只能靠更牛的视觉模型解决后来发现工程上也有很多空子可以钻。最简单的方法是置信度门控加动量保持。检测置信度低于阈值时当前目标关节角不更新同时开始计时。如果遮挡时间小于 0.3 秒恢复检测后直接衔接如果超过 0.5 秒就强制让手回到一个安全张开位避免在盲区里乱动。这个策略在抓取实验里救了我很多次。对于部分手指被遮挡还可以用“兄弟手指先验”。比如食指和中指在很多抓取动作里姿态接近食指被挡时可以用中指关键点做插值。这不严谨但在紧急情况下非常管用。4.3 绳驱迟滞手指动作总感觉“慢半拍”绳驱灵巧手天然存在回程差和弹性滞后。我实测下来反向运动时大约有 30 到 50 毫秒的反应延迟正转时也跟着有轻微滞后。如果 retargeting 每一帧都发绝对位置绳子会不断在松紧之间切换最终表现为关节抖动和噪声。我后期把控制器从位置模式换成了位置加张力混合模式。具体做法是每次到达目标位置后不是立即停下来而是让电机继续输出一个很小的力矩把绳子拉紧保证绳子始终在张紧状态。这个保持张力大概只占最大力矩的 5% 到 10%但去掉的抖动非常明显。如果你没有张力反馈也可以用增量式控制代替绝对位置。同样是每帧发送目标但底层把目标量解释为“相对上一次位置的增量”这样绳子的运动方向不会频繁反向回程差的影响会降到最低。4.4 关节角跳变IK 解出来一个完全不合理的姿势关节角跳变一般有两个来源。第一个是视觉关键点的突然跳动比如手指检测从左手瞬间跳到右手或者关键点索引匹配错误。第二个是 IK 的多解问题灵巧手自由度多同一个指尖位置可能对应多种关节组合解算器可能在两个解之间来回切换。针对视觉关键点跳动可以在送入 IK 前增加一个数值变化率上限任何关键点移动超过单帧距离阈值就视为异常直接用上一帧值代替。针对 IK 多解我给每个关节设置了优先级的偏好角度比如手指自然弯曲是一个默认弯曲量解算时优先逼近这个偏好避免诡异姿势。经验是限制关节角速度比限制关节角位置更有效。只限制位置上限关节很容易在限位上磨来磨去限制速度上限之后整个手运动的节奏感会好很多给视觉和底层控制器都预留了缓冲时间。4.5 常见问题速查表现象可能原因处理方法手部动作整体过大静态缩放因子偏大重新标定缩小缩放因子手部动作忽大忽小尺度参数跳变加入深度归一化和低通滤波手指卡在限位不回关节限位过紧软件限位向内缩 5-8 度反向运动抖动绳驱回程差改用增量控制预设张力抓取位置总偏相机外参未标定重新标定相机相对头部的位姿视觉延迟过高模型推理太慢替换为 TensorRT 加速关节角突然离谱IK 多解切换加关节偏好角度和速度限制结语一点个人体会做了 EgoScale 这一轮最大的感受是灵巧手的上限很多时候不是被硬件决定的而是被“映射”这层软件设计决定的。第一人称视觉天然适合操作任务retargeting 是连接视觉和执行的桥梁而 scale 问题则是这座桥梁最关键的支撑结构。如果没有人手与机械手之间的尺度理解再好的姿态估计网络也无法让灵巧手做出自然动作。如果再让我重做一遍我会在项目最开始就引入动态尺度估计而不是先用静态缩放跑通再回头补。虽然静态方案能快速打通全流程但在真实操作场景里的表现确实差得比较多。另外一定要给自己留一个仿真环境哪怕是简单的 MuJoCo 模型也能帮你快速排查 retargeting 和 IK 层面的问题而不用每次都在真机上试错。最后分享一个小技巧在调试 canon 流程时建议把每一帧的视觉关键点、尺度参数和目标关节角都同步录制下来后续出问题时能直接回放比对。数据一旦积累起来你不仅能优化 EgoScale 本身甚至能为后续尝试端到端模型打下底子。这个项目我还会继续往下走下一步准备把动态尺度估计换成一个轻量回归网络看看能不能把手部操作的连贯性再往上推一档。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询