指数映射与对数映射
旋转和位姿不能相加,速度却可以。指数映射把"一个恒定的速度保持 1 秒"变成一次旋转或一次刚体运动;对数映射再把运动还原成速度。理解了这一对映射,陀螺仪积分、位姿插值、流形上的优化就都有了统一的写法。
1为什么机器人需要它
机器人状态里的量,有的能相加,有的不能。位置可以相加:先往前走 1 米,再走 2 米,一共 3 米。姿态和位姿就不行:两个旋转矩阵相加,结果根本不是旋转矩阵。5.4 节已经看到,硬加的结果会把坐标系压扁、拉歪。\(\SO\) 和 \(\SE\) 是弯曲的流形,不是向量空间。
速度却可以相加。陀螺仪报告的角速度 \(\boldsymbol\omega\)、机械臂末端的速度旋量 (twist),都是普通的向量,可以相加、乘以时间、求平均。指数映射 exp 连接这两个世界,它回答一个问题:把一个恒定速度保持 1 秒,你会到哪里?对数映射 log 正好反过来:给定终点,问用什么恒定速度、1 秒恰好到达。
机器人软件里有很多操作都要用到这一对映射:把陀螺仪读数积分成姿态;在两个位姿之间平滑插值;优化器在 \(\SO\)、\(\SE\) 上迈出一小步(5.7、6.10 节);机械臂的每个关节本身就是一个指数映射(5.10 节)。
2直觉:把切线缠到圆上
先看最简单的李群:平面旋转 SO(2)。每个平面旋转对应单位圆上的一个点 \((\cos\theta, \sin\theta)\)。圆本身就是这个群,点 \((1, 0)\) 是"什么也不转"的单位元。
在单位元处画一条切线。切线上的点代表角速度:它们可以相加、数乘,组成一个普通的一维向量空间,也就是 SO(2) 的李代数(5.5 节)。
指数映射做的事很朴素:把切线像绳子一样缠到圆上,就像把线绕上轮子,不拉长,也不压缩。在切线上走了长度 \(\theta\),在圆上就走过弧长 \(\theta\)。换句话说,以角速度 \(\theta\) 匀速转 1 秒,停下的位置就是 \(\exp(\theta)\)。
- 把 \(\theta\) 调到恰好缠满一整圈。绳子的终点回到了哪里?这说明 \(\exp\) 有什么性质?
用矩阵写,切线上的 \(\theta\) 对应李代数元素 \(A = \begin{bmatrix}0 & -\theta\\ \theta & 0\end{bmatrix}\)(5.5 节的 hat)。矩阵指数的定义和 \(e^x\) 完全一样,是一个无穷级数:
对这个 \(A\),有 \(A^2 = -\theta^2 I\):每乘一次 \(A\),就是转 90° 再乘 \(\theta\)。把偶数项和奇数项分开收集,正好是 \(\cos\theta\) 和 \(\sin\theta\) 的泰勒级数:
从圆到球:旋转向量
三维旋转多了两个自由度:除了转多少,还要说绕哪根轴转。\(\SO\) 的李代数是三维的,其中的元素可以写成一个旋转向量 \(\boldsymbol\omega = \theta\,\hat{\mathbf u}\):方向 \(\hat{\mathbf u}\) 是转轴,长度 \(\theta\) 是转角。\(\Exp(\boldsymbol\omega)\) 的意思是以角速度 \(\boldsymbol\omega\) 匀速转 1 秒,也就是绕 \(\hat{\mathbf u}\) 转 \(\theta\)。
刚体上的每个点都沿着一个绕转轴的圆周运动。这和 FIG 1 的圆是同一回事,只是现在每个点都有自己的一个圆。拖动下面的时间滑块 \(t\),看坐标系的三个轴尖各自画出一段圆弧。
- 只用滑块(不用预设),在 \(t = 1\) 时得到绕 z 轴转 180° 的旋转。你能找到两种不同的 \(\boldsymbol\omega\) 吗?
指数映射把"平"的速度空间(李代数)卷到"弯"的群上。\(\exp(t\boldsymbol\omega)\) 随 \(t\) 走出的是一条匀速路径:转轴始终不变,每段相等的时间转过相等的角度。所以 \(\exp(s\boldsymbol\omega)\exp(t\boldsymbol\omega) = \exp((s+t)\boldsymbol\omega)\):先转 \(s\) 秒再转 \(t\) 秒,等于一口气转 \(s+t\) 秒。不过这只对同一个 \(\boldsymbol\omega\) 成立(见误区 3)。
3动手玩:速度旋量与螺旋运动
位姿 \(\SE\) 的速度有 6 个数:角速度 \(\cw{\boldsymbol\omega}\)(3 个)和线速度 \(\cv{\mathbf v}\)(3 个),合起来叫速度旋量 (twist) \(\boldsymbol\xi = (\cw{\boldsymbol\omega}, \cv{\mathbf v}) \in \R^6\)。
本课的 twist 一律把旋转放在前面:\(\boldsymbol\xi = (\boldsymbol\omega, \mathbf v)\),与 Lynch & Park 的 Modern Robotics 以及课程代码 R101.M.expSE3 / logSE3 一致。也有不少教材和库把平移放在前面,例如 Barfoot 的书、Solà 等人的论文和 Sophus 库,写作 \((\boldsymbol\rho, \boldsymbol\phi)\) 或 \((\mathbf v, \boldsymbol\omega)\)。照抄公式之前一定先确认顺序,否则 6×6 矩阵的各个分块会全部错位。
让一个恒定的 twist 作用 1 秒,物体会怎样运动?答案出奇地简单,这就是 Chasles 定理:任何刚体运动都是螺旋运动。物体绕某根固定的轴转动,同时沿这根轴滑动,就像拧螺丝。这根轴叫螺旋轴;每转 1 弧度沿轴前进的距离叫螺距 \(h\)。有两个特例:\(h = 0\) 是纯转动,而且转轴不一定过原点,比如门绕铰链转;\(\boldsymbol\omega = 0\) 是纯平移,可以看成螺旋轴在无穷远处。
下面的实验室里,拖动 6 个滑块改变 twist,或者点一个预设。紫色虚线是螺旋轴,黄色曲线是物体原点走过的路径。
- 用滑块做出一个纯平移。这时螺旋轴去哪了?
- 让 \(\boldsymbol\omega \ne 0\),同时螺距恰好为 0,并且转轴不过原点(\(\|\mathbf q\| > 0.3\))。提示:\(\mathbf v\) 和 \(\boldsymbol\omega\) 应该是什么关系?
- 让盒子在 \(s = 1\) 时回到起点,但中途确实在动(\(\boldsymbol\xi \ne 0\))。于是 \(\exp(\boldsymbol\xi) = I\) 却 \(\boldsymbol\xi \ne 0\),这对 log 意味着什么?
4反过来:对数映射与插值
对数映射回答反问题:给定一个目标位姿 \(T\),用哪个恒定的 twist 恰好 1 秒到达?答案是 \(\boldsymbol\xi = \Log(T)\)。由 Chasles 定理,这样的螺旋运动一定存在。
有了它,插值就很自然:\(T(s) = \Exp(s\,\Log T)\),\(s\) 从 0 走到 1。这是"以恒定速度从起点走到终点",路上的每一刻都是合法位姿。拿它和 5.4 节的天真做法比一比:把矩阵元素直接线性插值,\((1-s)I + sT\)。中间那些"位姿"会缩小、剪切,旋转部分已经不是旋转矩阵了。
- 找一个目标姿态,让右边的逐元素插值在中途塌成一个平面(\(\det \approx 0\))。这需要转多少度?
在两个任意位姿 \(T_a, T_b\) 之间插值也是同一个思路:先算出从 \(T_a\) 看过去的相对运动,再沿它匀速走,即 \(T(s) = T_a\,\Exp\big(s\,\Log(T_a^{-1}T_b)\big)\)。5.9 节会用它来平滑轨迹、对位姿求平均。
5再看数学
提示:把鼠标悬停在公式中带底色的符号上,FIG 2 或 FIG 3 中对应的元素会被高亮。
矩阵指数 = 恒定速度
对任意方阵 \(A\),级数 \(\exp(A) = \sum_n A^n/n!\) 总是收敛的。逐项求导,可以得到它最重要的性质:
也就是说,\(X(t) = \exp(tA)\) 是微分方程 \(\dot X = XA\) 从 \(I\) 出发的解,而 \(X^{-1}\dot X = A\) 恒定不变:这正是"以恒定速度 \(A\) 运动"。集合 \(\{\exp(tA)\}_{t\in\R}\) 叫一参数子群,可以看成群里的"直线"。
大写 Exp 与小写 exp
小写 \(\exp\) 作用在李代数的矩阵上;大写 \(\Exp\) 直接吃一个向量,先用 hat 变成矩阵(5.5 节),再取 \(\exp\)。\(\Log\) 则是先取 \(\log\),再用 vee 读出向量:
SO(3):Rodrigues 公式
设 \(\boldsymbol\omega = \theta\hat{\mathbf u}\),记 \(K = \skew{\hat{\mathbf u}}\)。由叉积的性质(1.8 节)可以验证 \(K^3 = -K\),于是 \(K\) 的高次幂只剩 \(K\) 和 \(K^2\) 两种,无穷级数也就合并成了两项:
反过来,由 \(\operatorname{tr} R = 1 + 2\cos\theta\) 和 \(R - R\T = 2\sin\theta\,\skew{\hat{\mathbf u}}\) 可以读出转角和转轴(取主值 \(\theta \in [0, \pi]\)):
SE(3):带平移的指数映射
twist \(\boldsymbol\xi = (\boldsymbol\omega, \mathbf v)\) 的 hat 是一个 4×4 矩阵。它的指数里,旋转部分就是 Rodrigues;平移部分是 \(\mathbf v\) 乘上一个矩阵 \(V\),\(V\) 把"边转边走"累积下来的位移算了进去:
求 \(\Log(T)\) 时,先 \(\boldsymbol\omega = \Log(R)\),再解 \(\mathbf v = V^{-1}\mathbf t\)。\(V^{-1}\) 也有闭式解,课程代码 R101.M.logSE3 里就是这么写的。
螺旋参数(Chasles 定理)
当 \(\boldsymbol\omega \ne 0\) 时,把 \(\mathbf v\) 拆成垂直于 \(\boldsymbol\omega\) 和平行于 \(\boldsymbol\omega\) 的两部分:
读法:绕过点 \(\mathbf q\)、方向为 \(\hat{\boldsymbol\omega}\) 的轴转 \(\theta = \|\boldsymbol\omega\|\),同时沿轴前进 \(h\theta\)。\(\mathbf v \perp \boldsymbol\omega\) 时 \(h = 0\),是纯转动;\(\boldsymbol\omega = 0\) 时是纯平移。任何 \(T \in \SE\) 都有一个 \(\Log\),所以任何刚体运动都是某个螺旋运动。这就是 Chasles 定理。
6机器人中的它:陀螺仪积分
IMU 的陀螺仪每隔 \(dt\) 报告一次机体系角速度 \(\boldsymbol\omega\)。在这一小段时间里把 \(\boldsymbol\omega\) 看作常数,姿态更新就是"以 \(\boldsymbol\omega\) 匀速转 \(dt\) 秒",再右乘到当前姿态上(右乘表示在机体系里运动)。另一种写法是对微分方程 \(\dot R = R\skew{\boldsymbol\omega}\) 直接用欧拉法:
欧拉法只取了 \(\Exp\) 级数的前两项,也就是 FIG 1 里切线上的那个点。每一步都把 \(R\) 往 \(\SO\) 外面推一点,误差还会逐步累积。下面两种方法用的是同样的 \(dt\) 和同样的陀螺读数。
IMU 预积分(视觉惯性里程计的标准做法)把两帧图像之间几百个陀螺读数连乘成 \(\Delta R = \prod_k \Exp(\boldsymbol\omega_k\,dt)\)。流形上的优化器(Ceres 的 Manifold、GTSAM 的 retract)在切空间里求出一个小增量 \(\boldsymbol\delta\),再用 \(T \leftarrow T\,\Exp(\boldsymbol\delta)\) 更新,这样每一步都留在群上(5.7、6.10 节)。机械臂的转动关节是螺距为 0 的 twist,移动关节是纯平移 twist,正运动学就是把各关节的 \(\Exp(\boldsymbol\xi_i\theta_i)\) 连乘起来(指数积公式,5.10 节)。
7常见误区
exp 会"绕圈":\(\theta\) 和 \(\theta + 2\pi\) 给出同一个旋转(FIG 1 的任务),\(\theta = 2\pi\) 的螺旋运动甚至可以回到原点(FIG 3 的任务)。\(\Log\) 只返回主值 \(\theta \in [0, \pi]\),转 270° 会被报告成反方向转 90°。在 \(\theta = \pi\) 处,\(\hat{\mathbf u}\) 和 \(-\hat{\mathbf u}\) 都对。对角度序列做插值或求平均时,要先"解缠绕 (unwrap)"。
\(\sin\theta/\theta\)、\((1-\cos\theta)/\theta^2\) 在 \(\theta \to 0\) 时是 0/0,要改用泰勒展开(例如 \(1 - \theta^2/6\))。\(\Log\) 里的 \(1/(2\sin\theta)\) 在 \(\theta \to \pi\) 时会爆掉,这时要改从 \((R + I)/2 \approx \hat{\mathbf u}\hat{\mathbf u}\T\) 的最大对角元读出转轴,再用 \(R - R\T\) 确定正负号。\(\arccos\) 的参数也要先截断到 \([-1, 1]\)。
只有 \(\mathbf a\) 与 \(\mathbf b\) 平行(同一根轴)时才成立。三维旋转不交换,先绕 x 转再绕 y 转,和反过来不一样。一般情况要用 BCH 公式:\(\Log(\Exp(\mathbf a)\Exp(\mathbf b)) = \mathbf a + \mathbf b + \tfrac12\,\mathbf a \times \mathbf b + \cdots\),5.7 节会用到它的一阶近似。
\(T\,\Exp(\boldsymbol\xi)\) 表示在机体系里按 \(\boldsymbol\xi\) 运动,\(\Exp(\boldsymbol\xi)\,T\) 表示在世界系里按 \(\boldsymbol\xi\) 运动,两者一般不相等。陀螺仪测的是机体系角速度,所以要右乘。如果写成左乘,转轴就错了,而且这种 bug 只在机器人倾斜时才会暴露出来。
本课和 Modern Robotics 用 \((\boldsymbol\omega, \mathbf v)\),Barfoot、Solà 和 Sophus 用 \((\mathbf v, \boldsymbol\omega)\)。把一个库的 6 维向量或 6×6 协方差、雅可比矩阵 (Jacobian) 交给另一个库之前,必须先重排。
8小练习
9延伸阅读
- K. Lynch & F. Park, Modern Robotics, Ch. 3 — 指数坐标、twist、螺旋运动;本课的 (ω, v) 顺序与它一致
- J. Solà, J. Deray, D. Atchuthan, "A micro Lie theory for state estimation in robotics", arXiv:1812.01537 — Exp/Log、⊕/⊖ 和雅可比矩阵的简明手册(平移在前)
- T. Barfoot, State Estimation for Robotics, Ch. 7 (Matrix Lie Groups) — SO(3)/SE(3) 的指数映射、雅可比与不确定性
- E. Eade, Lie Groups for 2D and 3D Transformations — 简短的技术笔记,含所有闭式公式及其数值稳定写法