李群与李代数:旋转为什么不能当向量加
WARNING
🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。
三维旋转矩阵
满足 且 ,全体记作 。两个旋转的「平均」或「一点点增量」都不能把九个数字当 加减——会走出合法姿态。正确的小量住在单位元处的切空间 (反对称矩阵),再用 指数映射 送回 。本章把「为什么欧拉角会万向节死锁、hat 从哪来、Rodrigues 每项在干什么」写清楚。平面刚体的「转 + 移」见 旋量。DH 链上的 块正是这里的点,见 建模。
一、通俗理解:姿态不是平面上的一个角
平面里一个
- 乘法不交换:
和 不是同一个姿态。先低头再转身,和先转身再低头,鼻子朝向不同。 - 欧拉角有万向节死锁(gimbal lock):中间角到
时,另外两轴重合,丢了一个自由度。飞机、相机云台、欧拉积分的仿真都会踩。 - 九个矩阵元只有三个自由:必须
、 。把 和 逐元平均,结果一般不再正交。
所以姿态的合法集合是弯曲的三维流形(可以想成一个三维的「球面」),不是

图解说明:左:球面示意旋转流形,切平面是
,曲线箭头是 。右: 变成 ,Rodrigues 给出绕轴转角。群上的点是姿态,代数上的向量是「转多少」。
动画说明:左先
再 ,右先 再 。红 / 绿 / 蓝 。终点姿态不同,所以欧拉角不能当 加减。
量子信息里的幺正群

图解说明:先
再 与先 再 终点姿态不同。右下:中间角到 时两轴重合,万向节死锁。
保姆级:欧拉角为什么看起来像向量却不是。 滚转、俯仰、偏航各是一个角,三个数排成向量很诱人。可是「加
二、无穷小旋转为什么一定是反对称矩阵
取
所以 hat):
直接验证 hat_02 钉死矩阵
逐步推导:正交性 怎样逼出反对称(点击展开)
设
令
即 hat 矩阵。
反过来:任意反对称
三、Rodrigues:有限转角的闭式
令
保姆级读三项:
:不转。 项:在垂直于轴的平面里把向量拧一截(像二维旋转的 )。 项:把向量往轴上「拉近」再送回去(二维旋转的 )。
教材若写单位轴
逐步推导:Rodrigues 公式从指数级数来(点击展开)
矩阵指数
(三次叉乘绕回来,像复数
代回
对数映射反向:从
log 返回
四元数(不展开实现):单位四元数也表示
四、数字例与 C++
同一组
- Python
so3_exp/so3_log验证、 、 ,并把立方体顶点转过去; so3.hpp里hat/so3_exp是同样的 Rodrigues;demo.cpp只印。
cd docs/robotics/lie-groups/code
python demo.py
g++ -std=c++17 demo.cpp -o so3_demo头文件 header-only。数值应
五、常见疑问
Q:那我积分姿态能不能
平面可以。三维应对反对称矩阵做
Q:两个旋转怎么平均?
不能
Q:
旋转向量
Q:和 DH 什么关系?
每一帧
六、代码在做什么
demo.py 打印往返误差与正交性,三维散点图 so3_exp.png:灰点原立方体,橙点

七、小结
| 概念 | 一句话 |
|---|---|
| 合法三维旋转;弯曲的,不能逐元加 | |
| 欧拉角 | 看起来像 |
| 反对称; | |
hat | |
| 切空间 | |
| 下游 | 位姿滤波、IMU、旋量 |
📥 Code
| File | View | Download |
|---|---|---|
| demo.py | Open | Download |
| so3.hpp | — | Download |
| demo.cpp | — | Download |
| exercise.py | Open | Download |
参考
- Murray, Li, Sastry, A Mathematical Introduction to Robotic Manipulation
- Solà, “Quaternion kinematics for the error-state Kalman filter”
- 3Blue1Brown 之外,可视化
可看 Modern Robotics 第 3 讲