GMR IK数学原理解读 把 IK 想成机器人当前姿势不对求“每个关节下一瞬间该往哪转一点”。例如右手目标在前方 10 cm机器人当前手还没到。IK 不会直接猜肩、肘、腕各转多少而是问如果肩转 1 rad、肘转 1 rad、腕转 1 rad手在 X/Y/Z 和朝向上各会怎么动这个“各关节微小变化 → 手/脚微小运动”的关系就是雅可比矩阵 J。对一个任务 link例如左脚令q机器人当前所有关节角Δq这次准备增加的很小关节角x(q)当前左脚的位置/朝向x*人体映射来的左脚目标e x* − x(q)当前误差。在很小范围内非线性的 FK 可以近似为线性关系x(q Δq) ≈ x(q) J(q)Δq所以如果希望左脚本次移动e理想上就是J(q)Δq ≈ e这里的e是6D的 速度3,旋转3但通常有很多任务一起存在例如骨盆、左脚、右脚、左右手。把它们叠起来⎡ J_pelvis ⎤⎢ J_left-foot ⎥ Δq ≈ ⎡ e_pelvis ⎤⎢ J_right-foot ⎥ ⎢ e_left-foot ⎥⎣ J_left-hand ⎦ ⎣ e_right-foot ⎦e_left-hand改称带约束的最小二乘问题这就是mink 的 FrameTask本身不是优化器而是计算一个任务的误差雅可比。真正把多个 FrameTask 合成优化问题的是 mink.solve_ik去求解Δq* argmin[Δq]∑[i] ‖Wᵢ(JᵢΔq − eᵢ)‖² λ‖Δq‖²含义非常直接第一项每个任务的剩余误差越小越好Wᵢ任务权重。脚的位置权重大IK 会优先让脚到位手臂姿态权重小手臂让步λ‖Δq‖²不希望一帧内关节突然大幅跳动。λ越大动作越稳但跟踪越慢关节限位与速度限制作为额外约束加入。得到 Δq 后q_next q_current Δq*然后重新计算 FK、误差再做一轮。GMR 每帧最多追加 10 轮误差不再明显变小时停止见retarget。以两关节平面手臂为例手应向前移动肩和肘都能让手向前IK 会在无限多种“肩转一点、肘转一点”的组合中选一个既让手接近目标、又不需要关节猛跳、也不撞关节限位的组合。这也是为什么不要用“人体肘关节角 机器人肘关节角”。IK 的输出由全部任务共同决定当脚必须落地时骨盆、髋、膝会优先配合脚当手目标远得不可达IK 会尽力伸展手臂但保留约束。GMR 中**FrameTask(position_cost, orientation_cost)就是在给每个任务设置 Wᵢ**。例如骨盆位置权重 100、旋转 10表示“骨盆位置比骨盆朝向重要约 10 倍”。任务创建位置见motion_retarget.py。