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。

相关推荐
李日华大战鸡红14 小时前
FOC状态空间方程模型推导(学习记录)
python·学习·线性代数
weixin_4481199415 小时前
Datawhale Easy Data × AI:笔记1 已重做,看新的笔记
笔记
要开心吖ZSH16 小时前
MySQL 慢 SQL 排查操作手册-个人笔记版
java·笔记·sql·mysql·慢查询
kkkkkkkkkk_Z16 小时前
新手自学嵌入式 | 学习日记:异常与中断基础、i.MX6ULL裸机开发环境搭建、GPIO模块与点灯原理
学习
咖啡忍者17 小时前
【SAP】程制造生产计划PP-PI(Production Planning for Process Industries)
笔记
m4Rk_17 小时前
【论文阅读】Agent 记忆机制(94):MemGen——在推理过程中动态生成并织入潜在记忆
论文阅读·人工智能·学习·开源·github
晓德17 小时前
0、LLM大模型安全学习系列(启)
学习·安全
Titan202418 小时前
MySQL索引学习笔记
笔记·学习·mysql
zhangrelay18 小时前
Arduino-MEGA-ESP单片机理论课笔记02-硬件-2026
笔记·单片机·嵌入式硬件
JWASX18 小时前
Java 转 go 学习 - kitex(5)
学习·golang