人体动作与机器人结构的差异
人体动作进入机器人模型时,难点往往出在结构差异:人体与机器人关节数量、旋转轴、骨段比例和活动范围并不一致。直接把动捕旋转复制到机器人上,可能出现末端位置偏移、关节越界和动作抖动。我参与实现的管线把输入骨骼处理与机器人映射分开,让两端各自保留可调整的参数。
输入侧先形成相对稳定的中间骨架,机器人侧再根据机构定义求关节值。这样更换机器人结构时,主要调整关节对应和机构参数;检查动捕异常时,也能先观察中间骨架,而不必同时排查所有机器人关节。
两段重定向管线
Kinect 数据与中间骨架
KinectRetarget 读取 Kinect 骨骼,对缺失骨骼做过滤,分别处理关节位置和欧拉角,再把姿态写入 PN3 PoseableMesh。这个中间模型承接输入姿态,为后续映射提供统一参照。
逐关节处理可以应对同一帧中某个关节数据波动、其他关节仍然可用的情况,位置变化和角度变化也分别处理。输入滤波先减少局部抖动,避免把每次采集波动直接传递成机器人关节动作。
处理跨越 180 度的角度变化
欧拉角存在表示边界。例如角度从 179 度变到 -179 度,表示的实际转动很小,直接相减却会得到接近一整圈的变化。实现对跨越 180 度的角度差做展开,再用于后续处理,减少数值表示边界引起的突然翻转。
角度展开解决了角度连续性问题。骨骼方向不匹配、人体与模型比例不同等问题,仍需在重定向阶段处理,单靠滤波无法纠正整套映射。
从骨段比例到机器人目标
机器人侧复用 URDFForge 的 RobotRetargetComponent。URDF 中的关节原点、旋转轴和限制共同定义机构,而人体骨段提供目标动作。映射按分段长度比例换算,先把人体动作放到机器人可解释的尺度下,再构造 IK 目标。
| 数据 | 在映射中的作用 |
|---|---|
| 人体骨段长度与关节位置 | 描述动作方向和相对伸展程度 |
| 机器人骨段比例 | 将人体动作换算到机构尺度 |
| URDF 关节原点与轴 | 定义关节如何连接、向哪个方向旋转 |
| 关节限制 | 约束求解和输出的可用范围 |
分段比例比直接复制世界坐标更适合不同长度的模型。例如相同的伸手动作,应该先解释成人体肢段的伸展,再按机器人结构形成目标,而不能把人体末端的绝对距离直接当成机器人行程。
IK 与直接角度映射
需要追踪目标位置的链路使用阻尼最小二乘法,也就是 DLS IK。它根据当前关节姿态与目标之间的误差迭代调整关节值,并以上一次角度作为下一次求解的初值,利用相邻帧动作的连续性。
直接轴角映射则按对应关系驱动关节,沿选定的轴传递角度;IK 将目标交给机构求解。接入时应根据关节结构和动作目的选择,不必让每个关节都采用同一种求解方式。
平滑与每帧角速度限制
得到关节目标后,输出还经过插值和平滑,并限制每帧允许的角度变化,最后使用 SetRelativeRotation 更新 UE 场景组件。目标值和显示值之间保留过渡,可以缓和输入跳变;但平滑越强,快速动作的跟随也可能越慢,因此参数需要围绕实际动作调整。
已实现范围与模型调整
这套管线覆盖 Kinect 输入、中间骨架和 UE 内机器人组件的重定向。不同模型仍需核对骨骼方向、比例和关节范围,Kinect 到 PN3 的特定姿态扭曲仍有待调整。
机器人模型在场景中转动,表示映射结果已写入 UE 组件。实体执行器通信、状态反馈和控制闭环属于独立的设备接入范围,不能从模型动作直接推定实机已经跟随。
项目展示
动捕与机器人控制