3.7 逆运动学算法
把误差当作「要消除的速度」输入,逆微分运动学就变成反馈控制器: 是控制量、 是偏差,目标让 。本节把三套算法一次讲完——逆雅可比、雅可比转置、二阶算法。快讲:老师说考试不考,但实际开发必用。录播 2:24:15–2:27:34。
「目的就是建立 与误差 之间的关系——从控制的角度也就是设计一个控制器」(2:24:22)。数值逆解的细节「考试后面也不会考」(0:10:02),但实际开发要用——本节正是控制视角的桥,为后续动力学 / 控制章节铺路。节奏上快讲:课件后几页(算法比较、方向误差)「大家下面自己看一下」(2:25:53)。
3.7.1 逆雅可比方案
逆雅可比方案的做法最直接:正运动学的微分关系是 ,既然能由 算出 ,把 求逆就能反过来由期望的末端速度推出关节速度。
设任务误差 (期望位姿 当前位姿),希望 指数收敛,于是让末端速度取「期望速度 加一个正比于误差的修正项 」,再映射回关节空间,即
验证一下:把 代入误差的导数 ( 两边求导即得):
可见误差动态被化成了一阶线性系统:只要 正定, 就指数收敛,收敛快慢由 的取值决定。
3.7.2 雅可比转置方案
转置方案干脆绕开求逆:不解方程,直接用 把误差映回关节空间——
为什么用转置(2:24:56,老师特意点出动机):「因为求逆很花计算量——知道 要求 很花时间;用 直接调换一下元素位置就可以了。」省下求逆是有代价的——把两种方案摆在一起,得失才看得清:
- 逆方案能完全线性化:误差动态严格是一阶线性();
- 转置方案不能完全线性化:误差动态是非线性的, 不再是干净的 ,而是多出含 随位形变化的项——稳定性分析只能借助 Lyapunov 函数(学控制的同学有了解)。
是「沿误差在关节空间的负梯度方向走」——这里的「负梯度」是对关节变量 而言, 的负梯度正是 。 把操作空间的误差映射回关节空间(与静力学 是同一个 机制——3.8),步长由 控制。转置省去了求逆,但步长随位形变化,因此收敛只是局部的。
两种方案看着不同,放进同一张闭环框图(下图)却是同一个结构: 是控制量、 是偏差,「机器人 」是被控对象,反馈把当前位姿送回输入端——这正是把逆微分运动学当成控制器设计的视角。
3.7.3 方向误差与二阶算法
以上两种方案都假定误差 已经算好。剩下两件事要交代:姿态那部分误差用什么表示,以及要不要把加速度也纳入算法。
方向(姿态)误差的表示(2:25:45):「误差表示方式不同,求逆方法也不同。」同一个姿态误差有好几种写法,常用的有三种:
- 欧拉角: 直接相减,写法最省事,却受 定理 2.4.B 的奇点与多值困扰;
- 轴 / 角(angle-axis):用转轴加转角的写法,比欧拉角更通用,姿态控制 / 求逆算法常用(2.5);
- 四元数(上一章 2.6):「姿态误差也可以用四元数」——无奇点,适合插值与误差度量。
(课件上的误差公式基于姿态列向量叉积,该处 OCR 受遮挡、不能逐字保证,本编按标准形式给出 ;读者以课件 / 教材为准。)
二阶算法(2:26:28):上面两种一阶算法都只用速度;二阶算法把加速度也纳入进来,同时考虑速度与加速度:
误差满足的是一个二阶线性微分方程——(阻尼)与 (刚度)的取值共同影响收敛的快慢与平稳程度。「后面讲控制(动力学)时可能会涉及。」
逆方案误差动态完全线性化,但每次都要算 (计算贵),无奇点处收敛快;转置方案省去了求逆,代价是只保证局部收敛、稳定性要 Lyapunov 分析;二阶算法把加速度也带进来,运动更平滑,但结构复杂(含 )。冗余情形三者统一换成伪逆。
不看正文与速查卡,先写出下面几条,再展开核对。写不出来就说明这一节还没「拿走」。
- 写出逆方案与转置方案各自的 表达式,并各说一句特点。
- 为什么转置方案不能按「完全线性化」设计增益?
- 二阶算法比一阶多考虑了什么?
核对
逆方案:——完全线性化,误差方程严格线性;转置方案:——省去求逆,但误差方程非线性。
因为它的误差方程没有化成 那样的线性形式: 取大不一定更好,稳定性要用 Lyapunov 方法分析。
多考虑了 项——「考虑加速度」意味着误差方程里出现 的时间导数,二阶算法让误差满足 。
3.7 小结与常见错误
- 一条主线:误差当输入 → 逆方案(完全线性化,代价是贵)/ 转置方案(省计算,只局部收敛)/ 二阶算法(含加速度)→ 方向误差的三种表示 → 冗余换伪逆。
- 考试口径:本节不考细节;但「 为什么省计算」「为何要 Lyapunov」这两问,正是理解 双重身份(控制 + 静力学)的好线索。
- 用转置方案却按「完全线性化」设计增益——它的误差方程是非线性的, 取大不一定更好;
- 方向误差用欧拉角直接相减却不处理奇点 / 多值——大姿态偏差时应改用轴角 / 四元数;
- 二阶算法忽略 项——「考虑加速度」意味着误差方程里出现 的时间导数,实现时要补上这一块。