对偶四元数:从刚体位姿到螺旋插值
目录
上一篇谈拉格朗日法时,我们用动能与势能组织了机器人的动力学;再往前一篇,旋量与 PoE 则从螺旋轴出发,解释了刚体运动怎样组合。
现在只剩下一个很自然的问题:
当这些空间运动真正进入代码,我们能不能用一种紧凑的代数,同时保存旋转和平移,并且仍然看得见背后的螺旋几何?
对偶四元数(Dual Quaternion,DQ),正是这样的工具。
它由两个普通四元数组成:
其中 是实部四元数,主要承载旋转; 是对偶部四元数,把平移与旋转耦合在一起。一个单位对偶四元数使用 8 个标量表示 6 自由度刚体位姿,并像单位四元数表示旋转那样,以乘法完成位姿复合。
但“8 个数”不是这套方法最迷人的地方。真正重要的是:
- 它与刚体变换群 对应;
- 它的指数与对数仍然连接着旋量和螺旋运动;
- 它能把旋转和平移放进同一套插值、平均与优化框架;
- 它在骨骼蒙皮、位姿融合、标定和机器人轨迹中都能发挥作用。
这篇文章不打算把对偶四元数包装成“取代矩阵的终极格式”。齐次矩阵直观、通用,现有工具链也极其成熟;对偶四元数的价值,是在刚体位姿需要频繁复合、插值或融合时,提供另一种更紧凑、更贴近螺旋几何的表达。
1. 先公平地看三种位姿语言
描述三维刚体位姿,最常见的工具是齐次变换矩阵:
描述旋转, 描述平移。它最大的优点是直观:一个矩阵就能作用在齐次坐标上,复合也只是矩阵乘法。
普通单位四元数则用:
表示绕单位轴 旋转 。它只有 4 个分量,适合旋转复合,也能用球面线性插值(Spherical Linear Interpolation,SLERP)在两个姿态之间插值,但它本身不包含平移。
对偶四元数把这两类需求放到了一起。
| 表示 | 存储形式 | 直接表示平移 | 位姿复合 | 插值特点 |
|---|---|---|---|---|
| 齐次矩阵 | 常写为 | 是 | 矩阵乘法 | 可通过 的指数、对数等方法插值 |
| 旋转四元数 + 平移向量 | 个标量 | 是 | 需要同时处理两部分 | 可使用 SLERP + 平移插值 |
| 单位对偶四元数 | 个标量 | 是 | 一次对偶四元数乘法 | 可使用螺旋线性插值 ScLERP |
这里需要拆掉三个常见误解。
第一,齐次矩阵虽然写成 16 个数,但最后一行固定,工程实现也常只存 的 12 个数;它的 16 个元素同样不是 16 个自由度。
第二,对偶四元数的 8 个分量也不是 8 个独立自由度。单位条件提供两个标量约束,而且 与 表示同一个位姿,最终仍然只有 6 个自由度。
第三,矩阵并非“无法平滑插值”。李群 的指数与对数同样可以生成螺旋运动。对偶四元数的优势是把这套结构放进了类四元数代数,而不是发明了矩阵绝对做不到的运动。
2. ε² = 0 从哪里来
第一次看到
很容易觉得数学家只是在制定一条古怪的游戏规则:一个数明明不是零,为什么乘一次自己就消失了?
理解它的关键,是先别把 当成普通实数。它是人为加入的一个新代数单位,作用不是表示某个具体数值,而是给一个量附上一层“只保留到一阶”的信息。
2.1 从四元数到“带影子的四元数”
1843 年,William Rowan Hamilton 提出四元数,为三维旋转提供了一套封闭的乘法。几十年后,William Kingdon Clifford 在研究双四元数时,将幂零单位与四元数结合:一个四元数之外,还可以跟着另一个由 标记的四元数。
到了 1903 年,Eduard Study 在《Geometrie der Dynamen》中系统发展了它与欧氏空间直线、螺旋和刚体位移之间的联系。于是,一条逐渐清晰的道路出现了:
- 普通四元数擅长表达绕轴旋转;
- 幂零单位可以附加一层一次信息;
- 两者结合,恰好能够同时携带旋转以及与旋转耦合的平移。
这不是某一天突然发明出的机器人公式,而是 19 世纪几何与代数经过数十年交汇后的结果。
2.2 为什么偏偏令 ε² = 0
先看一个最简单的构造。给实数 附上一段由 描述的一次变化:
将它平方:
因为 ,二阶项精确消失:
实部仍是原来的 ; 后面的部分,则恰好记录了 沿方向 的一阶变化。更一般地,对足够光滑的函数作 Taylor 展开:
所有包含 的高阶项都会消失。因此, 可以被理解为一个精确的一阶信息标签。
这里没有“把一个很小的数近似成零”。 不是趋近于零的实数,它的平方也不是“约等于”零;在这套代数中, 是精确成立的定义。今天自动微分中的对偶数也利用了同一个机制,只不过在刚体几何里,我们要让这层一次信息承担另一项任务。
一个对偶数写成:
两个对偶数相乘时:
实部照常相乘,对偶部接收两份一次耦合,却不会再产生一层“对偶的对偶”。这正是后面统一复合旋转和平移所需要的结构。
2.3 第一次进入空间:用一对向量表示一条直线
一条有方向的空间直线,不仅要说明它朝哪里,还要说明它从哪里经过。
设 是单位方向, 是直线上的任意一点。定义轴矩:
如果沿直线换一个点 ,那么:
因为 ,轴矩不会改变。于是 与 共同刻画了整条直线,而不是直线上的某个特定点。
现在用 把它们写成一个对偶向量:
实部告诉我们轴的方向,对偶部告诉我们轴相对原点的位置。约束
保证它是一条合法的有向单位直线。这一步已经显露了“对偶”的几何意义:它不是把两个无关向量并排摆放,而是把一个几何对象的方向与位置矩组织成一体。
2.4 再向前一步:让角度也带上轴向位移
Chasles 定理告诉我们,一次一般刚体位移都可以表示为绕某条轴旋转,同时沿这条轴平移。设旋转角为 ,轴向位移为 ,将它们组成对偶角:
把它代入三角函数,利用 ,可得:
旋转角留在实部,沿轴平移则作为它的一阶伴随量进入对偶部。再把对偶直线 与对偶角 放进类似旋转四元数的形式,在相应约定下可以写成:
这就是“螺旋运动的代数化身”这句话真正的来历:轴的方向与位置、绕轴转过的角度、沿轴走过的距离,都进入了同一个表达式。
纯平移是最容易看懂的特例。把平移向量写成纯四元数 ,对应的单位对偶四元数为:
连续做两次平移:
本来会出现的平移二次交叉项因为 精确消失,剩下的正是平移向量相加。
所以, 不是由刚体运动“推导”出的物理规律;它是一种精心选择的代数结构。之所以选择它,是因为这套结构既能保留独立的一阶伴随信息,又能让这份信息在乘法中按照刚体几何需要的方式传播。接下来再把普通四元数放进来,旋转和平移就能够真正合流。
3. 先复习普通四元数
四元数写成一个标量与一个三维向量:
两个四元数 与 的 Hamilton 乘积为:
共轭为:
当 时,它表示一个旋转。把空间点 写成纯四元数 ,旋转后的点为:
这里采用全文统一的约定:
- 四元数按“标量在前”写成 ;
- 表示 Hamilton 乘积;
- 位姿是主动变换 ;
- 多个变换作用时,后执行的变换写在乘积左边。
这些约定并非唯一。不同库可能使用标量在后、被动旋转或相反的乘法顺序。对偶四元数最常见的工程错误,往往不是公式不会推,而是两套约定在接口边界悄悄混到了一起。
4. 把旋转和平移装进一个对偶四元数
设刚体位姿由单位旋转四元数 和平移向量 构成。先把平移写成纯四元数:
然后定义:
这就是在本文约定下,从 到对偶四元数的完整编码。
请注意, 并不等于“把平移向量塞进四元数”。它先让平移 与旋转 相乘,因此对偶部保存的是平移相对于当前旋转的耦合编码。
已知 后,可以恢复平移:
旋转则直接由 恢复。
4.1 为什么编码平移时需要除以二
四元数用半角 表示旋转。把刚体运动提升到对偶四元数后,旋转角与沿螺旋轴的位移会组成对偶角,指数形式里同样出现一半。因此 不是为了调节单位而随手加入的常数,而是这套双覆盖表示与指数结构的一部分。
从更直接的计算角度看,它也恰好保证反解公式 成立。
4.2 “单位”对偶四元数有两个约束
仅让 的模长等于 1 还不够。合法刚体位姿需要满足:
以及:
用四维向量内积表示,第二个条件等价于:
所以,不能把任意 8 个数简单除以同一个欧氏模长,就宣称它已经变成合法位姿。若数值误差很小,可以先归一化 ,再把 在 方向上的分量投影掉;更完整的实现则应使用对偶范数或经过验证的库函数。
5. 一个可以手算的位姿
考虑下面的刚体变换:
- 绕 轴旋转 ;
- 再平移 。
旋转四元数为:
平移纯四元数为:
代入 :
于是这个位姿的对偶四元数为:
将 代入 ,可以重新得到 。这个反算很适合作为代码里的第一个单元测试:只要乘法顺序、共轭或坐标约定写反,恢复出的平移就会立刻暴露问题。
6. 位姿复合:对偶数规则开始发挥作用
设有两个位姿:
先执行 ,再执行 ,复合位姿为:
展开:
本来还会出现 ,但它恰好等于零。
实部只负责组合旋转;对偶部接收两项一次耦合。把结果解码回 ,正好得到熟悉的刚体变换复合:
因此,对偶四元数不是把旋转和平移并排存放以后换了个名字。它定义了一套乘法,让两个部分按照刚体运动的正确规则一起复合。
6.1 与矩阵相比,究竟快多少
对偶四元数通常比完整 矩阵更紧凑,也可能减少内存带宽和某些复合运算。但“乘法固定快 30%”不是可移植的结论:
- 矩阵可能只存 ;
- SIMD、GPU 指令和批处理布局会改变代价;
- 对偶四元数最终作用于大量点时,常常仍会先转换成矩阵;
- 归一化、符号对齐和分支处理也有成本。
更可靠的工程判断是:先根据数据流选择表示,再对目标硬件上的真实工作负载做基准测试。紧凑是一项结构优势,具体快多少则是实现问题。
7. 从旋量到对偶四元数:几何变成了代数
旋量理论告诉我们,一次一般刚体位移可以看成:
- 绕某条空间轴旋转 ;
- 同时沿这条轴平移 。
单位对偶四元数则把这次螺旋位移写成一个代数元素。若用 表示对应的单位螺旋生成元,可以概念性地写成:
对于含螺距的运动,也可以把旋转角与轴向位移组合成对偶角。完整展开会涉及轴方向和轴矩,但此处更值得记住的是映射关系:
这与 PoE 中的 矩阵指数描述的是同一个刚体运动。旋量给出螺旋轴的几何,矩阵指数给出李群上的变换,对偶四元数则给出一套紧凑的代数坐标。
8. ScLERP:沿相对螺旋运动插值
设起点和终点位姿为单位对偶四元数 、。先求相对位姿:
对偶四元数的螺旋线性插值(Screw Linear Interpolation,ScLERP)定义为:
其中:
因此,当 从 0 走到 1,刚体沿起点到终点的相对螺旋轴前进:螺旋参数随 线性变化,得到一个单参数恒定 twist 的刚体运动。
8.1 为什么它不同于“平移 LERP + 旋转 SLERP”
分别对位置做线性插值(LERP),对姿态做 SLERP,是完全合理且常用的工程方案。但两部分彼此独立,刚体原点通常走直线,姿态同时旋转,不一定对应一条固定螺旋轴。
ScLERP 则先把两端之间的相对位姿解释成一次螺旋运动,再沿这次运动前进。
下面选择一个特别容易看懂的例子:终点姿态由起点绕空间中的固定点旋转 得到。
- 分离插值让坐标原点沿两点之间的直线弦移动;
- ScLERP 恢复真实的固定轴旋转,原点沿四分之一圆弧移动。
哪一条轨迹更好,取决于任务。若工具必须绕门铰链、阀门轴或工件上的固定螺旋轴运动,ScLERP 的几何非常自然;若末端位置明确要求走直线,那么分离插值或笛卡尔直线规划反而更符合约束。
ScLERP 不是“永远更平滑”的同义词。 它只是在两个位姿之间选择了螺旋测地形式。若要限制速度、加速度和加加速度,还需要用时间标定函数替换线性的 ,或者在多个关键帧之间构造更高阶连续曲线。
8.2 双覆盖与符号对齐
与普通四元数相同:
表示同一个刚体位姿。
插值或加权前,必须选择一致符号。常见做法是以一个参考实部四元数为准,若:
就同时翻转 和 。只翻实部、不翻对偶部,会破坏同一个位姿的成对表示。
在旋转接近 或 时, 的分支、轴方向和小角度数值稳定性也需要专门处理。生产代码更适合使用经过测试的库,而不是只照着通式写一个没有退化分支的版本。
9. DLB 与骨骼蒙皮:不要和 ScLERP 混为一谈
双四元数线性混合(Dual Quaternion Linear Blending,DLB)通常写成:
其中 是权重, 用于符号对齐。
DLB 是一种快速近似混合,不等于两点之间的精确 ScLERP。它在实时骨骼蒙皮中很有吸引力,因为每根骨骼的刚体变换能以对偶四元数参与加权,再把归一化结果作为顶点处的刚体变换。
传统线性混合蒙皮(Linear Blend Skinning,LBS)直接加权多个变换矩阵。在关节发生大角度扭转时,加权后的 部分可能不再是旋转矩阵,于是网格会收缩,这就是常说的“糖果纸效应”。
对偶四元数蒙皮能显著缓解这种塌陷,但需要把结论说准确:
- 糖果纸效应主要来自线性混合蒙皮对矩阵的线性加权,不是“平移和旋转分别插值”的必然结果;
- 归一化后的混合结果对单个顶点施加刚体变换,但不同顶点使用不同权重,整个网格当然仍会发生形变;
- 双四元数蒙皮可能出现关节鼓包、符号翻转以及不支持非刚性缩放和剪切等问题。
所以,它不是“绝对保持整个模型体积”的魔法,而是一种在扭转部位通常比 LBS 更自然的变形方法。
10. 手眼标定:把 AX = XB 写进同一种代数
考虑眼在手上的相机。机器人末端从姿态 1 运动到姿态 2,得到手的相对运动 ;相机观察标定板,也得到相机的相对运动 。未知的相机到末端变换记为 。
同一次物理运动沿两条坐标链表达,必须满足:
若使用齐次矩阵,一类经典方法先求旋转,再在已知旋转下求平移;也有同时估计两者的方法。
1999 年,Konstantinos Daniilidis 将 、 和 都写成单位对偶四元数:
四元数乘法对分量是双线性的。将未知 的实部与对偶部收集起来后,可以构造齐次线性方程组,再结合单位对偶四元数约束,通过奇异值分解求取同时包含旋转和平移的解。
这套方法的优雅之处,是旋转和平移在同一种代数表示中同时进入方程,而不是先后分成两个完全独立的步骤。
但“同时求解”不等于在所有数据上都必然更准。手眼标定的误差还取决于:
- 机器人位姿与相机外参的测量噪声;
- 运动轴是否提供了充分激励;
- 是否存在几乎同轴、微小旋转等退化运动;
- 旋转误差与平移误差的尺度和权重;
- 数据离群点以及后续是否进行非线性优化。
OpenCV 的 calibrateHandEye 确实提供 CALIB_HAND_EYE_DANIILIDIS,但它只是多个可选算法之一,默认方法仍是 Tsai。实际标定时,更合理的做法是使用同一组数据比较多种方法的闭环残差与重投影表现,而不是仅凭表示形式预设胜负。
11. 工程实现最容易踩的坑
11.1 把约定写进类型与接口
至少要明确:
- 分量顺序是 还是 ;
- 变换是主动还是被动;
- 平移编码是 还是另一套右乘约定;
- 位姿乘法的先后顺序;
- 平移使用米、毫米还是其他单位。
如果一个接口只接收 float[8],这些信息全部只能靠记忆维持。更可靠的做法,是封装构造函数 fromRotationTranslation、访问器 translation() 和显式的 frame 类型,而不是允许调用者任意填八个数。
11.2 归一化必须同时维护两个约束
对接近合法位姿的 ,一种简单投影步骤是:
然后消去对偶部沿实部的分量:
这样才同时恢复 与 。若输入远离单位流形,简单投影未必是最合适的误差模型,应回到 或使用专门优化方法。
11.3 加法不是位姿复合
两个对偶四元数相乘得到位姿复合;直接相加通常只在加权、线性化或构造方程时有意义。即使是 DLB,相加之后也必须处理符号并重新归一化。
11.4 别忘了尺度
的分量无量纲, 中却包含平移长度。若位置用毫米,数值尺度会比使用米大一千倍。它会影响插值、优化、残差加权和浮点精度。对偶四元数统一了代数形式,并没有自动统一旋转与平移的物理量纲。
11.5 为退化情况准备测试
最少应覆盖:
- 纯旋转、纯平移与单位位姿;
- 旋转接近 和 ;
- 与 的等价性;
- 编码后再解码的往返误差;
- 对偶四元数复合与齐次矩阵复合的一致性;
- ScLERP 的两个端点、符号翻转和小角度分支;
- 长时间连乘后的单位约束误差。
12. 对偶四元数该用在哪里
| 场景 | 对偶四元数的优势 | 需要留意 |
|---|---|---|
| 刚体位姿缓存与传输 | 8 个标量,复合结构紧凑 | 坐标约定与双覆盖 |
| 机器人位姿插值 | ScLERP 保留相对螺旋运动 | 不自动满足速度、加速度或避障约束 |
| 多位姿融合 | 可在统一代数中做近似混合或优化 | 权重、符号和旋平尺度 |
| 骨骼蒙皮 | 缓解 LBS 扭转塌陷,适合 GPU | 鼓包、翻转、缩放与剪切 |
| 手眼标定 | 可同时组织旋转和平移未知量 | 运动激励、噪声模型与退化 |
| 通用图形和几何接口 | 可与矩阵互相转换 | 矩阵生态通常仍更广泛 |
如果任务只是把一个点变换一次,齐次矩阵往往最简单;如果数据已经以旋转四元数和平移向量存在,也不必为了“数学更高级”强行转换。
当任务反复涉及刚体位姿的复合、插值、加权和约束时,对偶四元数才真正开始发光。
13. 三种语言终于连在了一起
现在可以把这个系列的三条主线放在一起:
- 拉格朗日法从能量出发,把复杂动力学组织成 ;
- 旋量与 PoE从螺旋轴出发,把关节运动组织成指数积;
- 对偶四元数把旋转与平移放进同一种代数,让刚体位姿能够紧凑地复合、插值与融合。
它们不是互相争夺“最好表示”的三个阵营,而是在回答三个不同的问题:
- 系统为什么这样动?——看能量;
- 空间运动沿什么几何发生?——看旋量;
- 这些运动怎样进入计算并保持整体结构?——看对偶四元数。
对偶四元数的美,不在于把 16 个数变成 8 个数,也不在于某个未经基准测试的性能百分比。它真正漂亮的地方,是让一个刚体位姿不再被迫拆成“旋转在这里、平移在那里”,而是作为一个完整的空间运动进入代数。
参考与延伸阅读
- William Kingdon Clifford, Preliminary Sketch of Biquaternions
- Eduard Study, Geometrie der Dynamen, 1903
- Konstantinos Daniilidis, Hand-Eye Calibration Using Dual Quaternions, 1999
- Ladislav Kavan et al., Geometric Skinning with Approximate Dual Quaternion Blending, 2008
- OpenCV,
calibrateHandEye与CALIB_HAND_EYE_DANIILIDIS - Benjamin Kenwright, Dual-Quaternion Interpolation
- Hugo T. M. Kussaba et al., A Survey on Dual-Quaternions