Quaternions and Rotation 四元数和旋转
上一章我们介绍了 四元数,可以认为它是一种 高维复数,让我们先把视角放回 二维复数,看看它与旋转有何关联
复数是形如
a+bi
的数,其中
- i2=−1 是虚数单位
a 是 实部,b 为 虚部,可以记作 (a,b) 这样的实数对,也可以看作 二维笛卡尔坐标系 中的一个 向量 (y 轴为虚部轴)
可以直观的推导 复数乘法
(x1+y1i)(x2+y2i)=x1x2+x1y2i+x2y1i+y1y2i2=x1x2−y1y2+(x1y2+x2y1)i
即
(x1,y1)(x2,y2)=(x1x2−y1y2, x1y2+x2y1)
若将 虚轴 作为 y 轴,则复数 v=(a,b) 也可以作为向量表示在如下的二维笛卡尔坐标系中

复数 z = a + bi 同时可以看成复平面上的点和从原点出发的向量;a、b 分别对应实轴和虚轴分量。
其中 v 可以分解为在基 x 和 y 上的分量
{vx=(a,0)vy=(0,b)⟹v=vx+vy
随后,考虑将 v 旋转 θ∘ 得到 v′,其相应分量 vx 和 vy 也随之旋转 θ∘ 得到 vx′ 和 vy′

乘以 i 得到 90 度旋转;乘以 eiθ 则在保持长度的同时增加 θ 角。
∵v=vx+vy且旋转是一个线性变换∴v′=vx′+vy′
根据三角函数,易得
v′=vx′+vy′=(a,0)′+(0,b)′=(acosθ, asinθ)+(−bsinθ, bcosθ)=(acosθ−bsinθ, asinθ+bcosθ)
我们前面推导出
(x1,y1)(x2,y2)=(x1x2−y1y2, x1y2+x2y1)
可以设
{x1=ay1=b,{x2=cosθy2=sinθ
那么我们有
v′=(x1cosθ−y1sinθ, x1sinθ+y1cosθ)=(x1,y1)(cosθ,sinθ)=(x1+y1i)(cosθ+sinθi)
根据 欧拉公式
eiθ=cosθ+sinθi
所以我们有
v′=(x1+y1i)(cosθ+sinθi)=eiθ(x1+y1i)
即,对于 v=x1+y1i,其 逆时针 旋转 θ∘ 的结果为
v′=eiθv=(cosθ+sinθi)(x1+y1i)
也就是说:复数的相乘实际上蕴涵了二维旋转,可以认为 纯旋转 (无缩放) 一个 复数 θ∘ 就是乘以 实部 为 cosθ 而 虚部 为 sinθ 的 复数
cosθ+sinθi
并且该 复数 是 单位复数,也就是说它的长度为 1
∥cosθ+sinθi∥=cos2θ+sin2θ=1
复数的矩阵形式
就像 四元数 可以表示为矩阵形式一样,复数 也可以表示为 2×2 矩阵形式
x+yi=[xy−yx]
矩阵形式的 复数乘法
(x1+y1i)(x2+y2i)=[x1y1−y1x1][x2y2]=[x1x2−y1y2x2y1+x1y2]
注意,在上面这个相乘计算中,我们省略了 x2+y2i 的完整矩阵形式,而只取它的第一列来计算,这是因为如果我们只想得到复数的 实部坐标 x,复数坐标 y,那么只需要计算矩阵的第一列就可以拿到 [xy],但是通常我们不会把列向量当作「复数」本身,因为 [xy] 只有 坐标信息,却没有编码 乘法规则
- 可以认为把第二个 复数 写成 列向量 是在 “取坐标”
因为 复数乘法 是满足 交换律 的,但是矩阵乘法本身不满足 交换律,所以我们只有将复数表示为完整的 2×2 矩阵,才能编码可交换的代数结构
即这一簇矩阵组成的子代数是 交换的(矩阵一般不交换),这正好对应复数乘法可交换的性质
例如,若有
z1=x1+y1i=[x1y1−y1x1],z2=x2+y2i=[x2y2−y2x2]
那么
z1z2z2z1=[x1y1−y1x1][x2y2−y2x2]=[x2x1−y2y1x2y1+x2x1]=[x2y2−y2x2][x1y1−y1x1]=[x1x2−y1y2x1y2+x1x2]
所以
z1z2=z2z1
确实满足 交换律
注意,复数虽然满足 交换律,但是 四元数 是丢失了 交换律 才得以定义的,所以 四元数乘法不满足交换律 (根据 哈密顿规则)
验证自洽性
接下来考察一些情况,看看矩阵形式的复数能否自洽
-
纯实数 1 : x=1,y=0⟹1+0i
代入 x=1,y=0 到矩阵 [xy−yx],可得 [1001]=1,得到 单位矩阵,其乘以其他任何矩阵得其本身,确实是 单位 1
-
纯虚数 i:x=0,y=1⟹0+i
代入 x=0,y=1 到矩阵 [xy−yx],可得 [01−10],虚数的定义是 i2=−1
[01−10][01−10]=[0−1−10]=−[0110]=−1
依然成立
性质
复数的矩阵形式有如下性质
-
性质1:复数的共轭等于其对应矩阵形式的转置
zzˉ=x+yi=[xy−yx]=x−yi=[x−yyx]=[xy−yx]T
-
性质2:复数的模长(其对应二维向量的长度)的平方等于其对应矩阵的行列式
z=x+yi=[xy−yx]∥z∥2=x2+y2det[xy−yx]=x2−−y2=x2+y2=∥z∥2
复数和二维旋转矩阵
我们知道将一个复数旋转 θ∘ 需要乘以下面这个复数
cosθ+sinθi
我们也可以将它写成矩阵形式
cosθ+sinθi=[cosθsinθ−sinθcosθ]
这就是 二维旋转矩阵,用其乘以任意二维向量,得到旋转变换 θ∘ 之后的结果,即将向量代数和复数联系起来
3D 旋转 和 罗德里格斯旋转公式
我们先来考虑 3D 旋转的一种特殊情况:3D 向量绕与其垂直的转轴向量旋转
可以认为,与被旋转向量 v 垂直的转轴 n^ 定义了一个平面 (n^ 是平面的 法向量,它是 单位向量),那么 v 与其旋转 θ∘ 之后的结果 v′ 均位于该平面内

向量绕单位法线旋转时,垂直于法线的分量沿旋转平面转动,旋转角为 θ。
计算 法向量 n^ 和 v 的 叉乘 可以得到垂直于它们的向量 n^×v

叉乘给出同时垂直于两个输入向量的方向,也就是后续旋转平面的法线方向。
n^ 和 v 是一组在平面内 正交,长度为 1 的 基向量,在它们 张成 的二维平面里,任何旋转都是普通的 2D 旋转,可以由我们之前推导的 二维旋转矩阵 来描述
[cosθsinθ−sinθcosθ]
我们在矩阵分解中谈论过的使用 Givens 旋转 在 2维度子空间中旋转消零来进行 QR-分解,有兴趣可以阅读相关笔记
但是实际上,被旋转向量 v 当然不会完全 正交 于 转轴 n^

任意向量都可以按旋转轴拆成平行分量和垂直分量;只有垂直分量参与平面内旋转。
但是我们任然可以将其拆分为 正交于转轴 和 平行于转轴 的两部分
v=v∥+v⊥=v∥(n^⋅v)v+v⊥(v−(n^⋅v)n^)
-
平行分量 v∥ 与轴 n^ 共线,旋转后 保持不变
-
垂直分量 v⊥ 位于垂直于轴 n^ 的平面里,需要在该平面内旋转 θ

旋转后的向量由保持不变的平行分量和旋转后的垂直分量重新相加得到。
也就是说,旋转后的向量 v′ 是旋转后 平行分量 v∥′ 和 旋转后的 正交分量 之和,但是由于 平行分量 旋转后保持不变,所以有
v∥′=v∥
也就是
v′=v∥′+v⊥′=v∥+v⊥′
而为了得到旋转后的 正交分量 v⊥′,我们首先在 旋转平面 里建立 正交基 来表示 v⊥,我们构造的基是:
e1=∥v⊥∥v⊥,e2=n^×e1
由于 e1 是借助 v⊥ 构造的与之同向的 单位向量,所以 v⊥ 表示在该坐标系中,将只在 e1 方向上有分量,而我们知道这个分量大小当然是 ∥v⊥∥
v⊥=xe1+ye2=∥v⊥∥e1+0e2=∥v⊥∥e1=[∥v⊥∥0](e1,e2)
我们知道 v⊥′ 是 v⊥ 在平面内旋转 θ 得到的,而我们已经在平面内选取了基 e1,e2,并得到了 v⊥ 在这组基下的坐标
v⊥=[∥v⊥∥0](e1,e2)
我们此时可以应用之前分析得到的 2-D 旋转矩阵 来将其旋转 θ 得到 v⊥′
v⊥′=[cosθsinθ−sinθcosθ][∥v⊥∥0](e1,e2)=[∥v⊥∥cosθ∥v⊥∥sinθ](e1,e2)=∥v⊥∥cosθ e1+∥v⊥∥sinθ e2
我们可以将构造 e1,e2 时的定义
e1=∥v⊥∥v⊥,e2=n^×e1
代入,得到
v⊥′=∥v⊥∥cosθ e1+∥v⊥∥sinθ e2=∥v⊥∥cosθ e1∥v⊥∥v⊥+∥v⊥∥sinθ e2n^×e1=cosθ v⊥+sinθ ∥v⊥∥(n^×∥v⊥∥v⊥)=cosθ v⊥+sinθ (n^×v⊥)
由于 v∥ 与 n^ 共线,n^×v∥=0 所以
n^×v⊥=n^×(v−v∥)=n^×v−n^×v∥=n^×v
再次将这个结果代入,得到
v⊥′=cosθ v⊥+sinθ (n^×v)
将它与 平行分量 合并,得到
v′=v∥+v⊥′=v∥+cosθ v⊥+sinθ (n^×v)
而 v∥ 是 v 向 转轴 n^ 上投影得到的,它等于
v∥=(n^⋅v)n^
将它带入,我们最终得到 罗德里格斯三项式
v′=v∥+v⊥′=(n^⋅v)n^+cosθ v⊥+sinθ (n^×v)=vcosθ+(n^×v)sinθ+n^(n^⋅v)(1−cosθ)
这就是著名的 罗德里格斯旋转公式
3D旋转 和 四元数
前面的分析是完全基于 线性代数 的,我们也可以使用 四元数 来表示旋转,事实上 四元数 可能是更好的方案
我们首先从 正交分量 v⊥′ 开始,根据前面的推导,我们知道
v⊥′=cosθ v⊥+sinθ (n^×v⊥)
我们设定所有需要用到的对象为等价的 四元数
v⊥=(0,v⊥)v⊥′=(0,v⊥′)n=(0,n^)
因为原对象全都是向量,所以直接将他们塞入 四元数 的 向量部分 即可构造对应四元数,所以上面的式子变为
v⊥′=cosθ v⊥+sinθ (n v⊥)
这里可能需要讨论的是,四元数 n 和 v⊥ 的相乘是否与原来的向量叉乘 n^×v⊥ 等价,根据我们前面推导出的四元数乘法法则,有
nv⊥=(−n^⋅v, n^×v)
我们知道 v⊥ 正交 于 n^,所以
n^⋅v=0
也就是说
nv⊥=(−n^⋅v, n^×v)=(0, n^×v)=n^×v
所以确实是等价的
那么我们使用四元数替换的式子就是
v⊥′=cosθ v⊥+sinθ (n v⊥)=(cosθ+sinθn)v⊥
注意四元数乘法不满足交换律,所以提取顺序不可改变
然后我们来分析一下 n,我们会发现它实际上是 虚数单位,因为
n2=(0,n^)(0,n^)=(−n^⋅n^, n^×n^)=(−∥n^∥2, 0)=(−1, 0)=−1=i
我们知道 欧拉公式
eiθ=(cosθ+sinθi)
所以原式变为
v⊥′=(cosθ+sinθn)v⊥=enθv⊥
- n 是 转轴单位向量 构造的四元数,θ 是转动角度
导出完整的四元数旋转公式
我们已经推导得到
v⊥′=enθv⊥
但是如若想完整的用 四元数 来表达旋转,我们还需要一些步骤,首先是补齐前面没有定义的四元数
v=(0,v)v⊥=(0,v⊥)v∥=(0,v∥)v⊥′=(0,v⊥′)n=(0,n^)
- 注意,不带箭头的表示 四元数,原对象全都是 向量,所以直接将他们塞入 四元数 的 向量部分 即可构造对应 四元数
证明 enθv⊥=v⊥e−nθ
首先来看 enθv⊥,我们知道 enθ 是从 欧拉公式 来的
enθ=(cosθ+sinθn)
而这里 n 是 纯向量四元数,只含有向量部分,并且 n2=−1,所以可以将它写为如下形式
n=0+n^xi+n^yj+n^kk
- n^x,n^y,n^z 是 n 在各虚轴上的分量
将其代回,得到
enθ=(cosθ+sinθn)=cosθ+sinθ(n^xi+n^yj+n^kk)=cosθ+sinθn^xi+sinθn^yj+sinθn^kk=(cosθ, sinθ n^)
所以我们得到 四元数 enθ 的 向量-标量表示法 是
(cosθ, sinθ n^)
可以认为 enθ=cosθ+sinθn^xi+sinθn^yj+sinθn^kk 是 四元数形式的欧拉公式
如此一来,我们有
enθv⊥=(cosθ, sinθ n^)v⊥=(cosθ, sinθ n^)(0,v⊥)
前面的章节我们推导出,四元数的乘法规则 (用向量,标量表示) 是
q1q2=(w1w2−a⋅b,w2a+w1b+a×b)a
所以,得到
enθv⊥=(cosθ, sinθ n^)(0,v⊥)=(cosθ⋅0−sinθn^⋅v⊥, 0⋅sinθn^+cosθv⊥+sinθn^×v⊥)=(−sinθn^⋅v⊥, cosθv⊥+sinθn^×v⊥)
因为 n^⊥v⊥ 所以 n^⋅v⊥=0,即
enθv⊥=(−sinθn^⋅v⊥, cosθv⊥+sinθn^×v⊥)=(0, cosθv⊥+sinθn^×v⊥)
然后再来看 v⊥e−nθ,经过同样的分析,我们可以得到 e−nθ 的 向量-标量表示法
e−nθ=(cosθ, −sinθ n^)
同样使用 乘法法则
v⊥e−nθ=(0,v⊥)(cosθ, sinθ n^)=(0, cosθv⊥−v⊥×sinθ n^)
所以,现在我们有
- enθv⊥=(0, cosθv⊥+sinθn^×v⊥)
- v⊥e−nθ=(0, cosθv⊥−v⊥×sinθ n^)
我们知道交换叉乘顺序会改变符合,也就是
sinθn^×v⊥=−v⊥×sinθ n^
所以 enθv⊥ 和 v⊥e−nθ 的 向量部分 完全相等,且它们的 标量部分 全都为零,所以
enθv⊥=v⊥e−nθ
证明 enθv∥=v∥enθ
我们已知
enθv∥=(cosθ, sinθ n^)=(0,v∥)
同样直接代入 四元数乘法公式,可得
enθv∥=(cosθ, sinθ n^)(0,v∥)=(−sinθ n^⋅v∥, cosθv∥+sinθ n^×v∥)
因为 n^ 和 v∥ 共向,所以他们的叉乘为零
sinθ n^×v∥=0
所以
enθv∥=(−sinθ n^⋅v∥, cosθv∥+sinθ n^×v∥)=(−sinθ n^⋅v∥, cosθv∥)
同理可以分析
v∥enθ=(0,v∥)(cosθ, sinθ n^)=(−v∥⋅sinθ n^, cosθv∥+v∥×sinθ n^)=(−v∥⋅sinθ n^, cosθv∥)
所以最终得到
- enθv∥=(−sinθ n^⋅v∥, cosθv∥)
- v∥enθ=(−v∥⋅sinθ n^, cosθv∥)
它们的向量部分完全相同,而标量部分的点乘天然具有可交换顺序的性质,所以
enθv∥=v∥enθ
最终写出四元数乘法公式
我们到目前为止已经知道
v=(0,v)v⊥=(0,v⊥)v∥=(0,v∥)v⊥′=(0,v⊥′)n=(0,n^)aenθv⊥=v⊥e−nθenθv∥=v∥enθ
且
v′=v∥′+v⊥′=v∥+enθv⊥
-
v∥′=v∥ 平行分量旋转不变,是我们之前得到的结论
-
v⊥′=enθv⊥ 也是我们先前分析得到的结果
我们可以添加几个指数形式的四元数,同时保持等式不变
v′=v∥+enθv⊥=en2θe−n2θv∥+en2θen2θv⊥
注意,这不改变原等式,然后我们可以借助之前证明的两个等式,来交换 v∥ 和 v⊥ 与它们各自前面的 指数四元数 的顺序
enθv⊥=v⊥e−nθenθv∥=v∥enθ
得到
v′=en2θe−n2θv∥+en2θen2θv⊥=en2θv∥e−n2θ+en2θv⊥e−n2θ
- 注意,根据先前证明的等式,v∥ 和它前面的 指数四元数 交换顺序,指数四元数 无需改变指数上的符号
- 但是 v⊥ 的交换则需要改变 指数四元数 的符号
然后我们可以提取公因子
v′=en2θv∥e−n2θ+en2θv⊥e−n2θ=en2θ(v∥+v⊥)e−n2θ
注意四元数乘法不遵从交换律,所以提取顺序要注意
因为 v=v∥+v⊥,所以
v′=en2θ(v∥+v⊥)e−n2θ=en2θ v e−n2θ
所以最终得到,将 四元数 旋转 θ 度的公式
v′=en2θ v e−n2θ
注意 en2θ 和 e−n2θ 是两个互为 共轭 的 四元数,若设 q=en2θ,则共轭是 q∗=e−n2θ,所以也可以写成
v′=qvq∗
也就是说,如果我们表示一个 θ∘ 的旋转,我们需要构造一个 四元数
q=en2θ=cos2θ+sin2θn^xi+sin2θn^yj+sin2θn^zk
然后将待旋转的向量也构建一个 纯向量四元数 v,乘以 q 之后再乘以它的共轭
q∗=e−n2θ=cos2θ−sin2θn^xi−sin2θn^yj−sin2θn^zk
- sin 是 奇函数,sin−2θ=−sin2θ
- cos 是 偶函数,cos−2θ=cos2θ
即可得到最终旋转后的结果 v′
v′=qvq∗