四元数#
四元数是复数的推广,表示为:
q=w+xi+yj+zk
其中:
- w 是实数部分;
- x,y,z 是虚数部分;
i,j,k 是虚数单位,满足以下关系:
i2=j2=k2=ijk=−1
反交换性质:
ij=k=−ji,jk=i=−kj,ki=j=−ik
向量形式:
q=(w,v),v=(x,y,z)
运算性质#
乘法:对于两个四元数 q1=(w1,v1) 和 q2=(w2,v2),其乘法定义为:
q1q2=(w1w2−v1⊤v2,w1v2+w2v1+v1×v2)=(w1w2−v1⋅v2,w1v2+w2v1+v1×v2)
这被称为 Graßmann 积。
注意:四元数的乘法 不可交换,即 q1q2=q2q1。
共轭:
q∗=(w,−v)
模长:
∥q∥2=w2+v⊤v=qq∗=q∗q
逆:
q−1=∥q∥2q∗
这是模长的直接推论。
几何意义与应用#
单位四元数:若四元数的模长为 1,即 ∥q∥=1,则称其为单位四元数。单位四元数可表示三维空间中的旋转。其还具有性质 q−1=q∗。
纯四元数:若四元数的实部为 0,即 q=(0,v),则称其为纯四元数。纯四元数可以表示三维空间中的向量。
旋转表示:任何一个旋转,都可以表示为绕某个单位向量 ω^ 旋转 θ 角度。
那么,对应的四元数可以表示为:
q=[cos2θ,sin2θω^]
注意,旋转到四元数存在“双重覆盖”关系,我们可以很容易地发现:
q−q=[cos2θ,sin2θω^]=[−cos2θ,−sin2θω^]=[cos(π−2θ),sin(π−2θ)(−ω^)]
是等价的(−q 意味着同一旋转轴但是翻转正方向,然后旋转 2π−θ)。

相应地,从四元数恢复轴角表示:
θ=2arccos(w),ω^={sin(θ/2)v,0,θ=0θ=0
其中,ω 是单位四元数的实部,四元数的一种常见表示就是 (w,x,y,z)。
四元数运算#
向量旋转:任意向量 v 沿着以单位向量定义的旋转轴 u 旋转 θ 度得到 v′,那么:
令向量 v 的四元数形式 v=[0,v],旋转四元数 q=[cos(2θ),sin(2θ)u]
则旋转后的向量 v′ 可表示为:
v′=qvq∗=qvq−1
如果是给定四元数 q 旋转向量 v ,那么设 q=[w,r] 是单位四元数(即 w2+∥r∥2=1),向量 v 的四元数形式为 v=[0,v]。
则:
qvq∗=[w,r][0,v][w,−r]=[−r⋅v,wv+r×v][w,−r]=[0,(1−2∥r∥2)v+2(r⋅v)r+2w(r×v)]
最后一个等式的展开计算如下
实部:
=(−r⋅v)w−(wv+r×v)⋅(−r)=−w(r⋅v)+w(v⋅r)+(r×v)⋅r=0
虚部:
=(−r⋅v)(−r)+w(wv+r×v)+(wv+r×v)×(−r)=(r⋅v)r+w2v+w(r×v)−w(v×r)−(r×v)×r=(r⋅v)r+w2v+2w(r×v)−[(r⋅r)v−(v⋅r)r]=(1−2∥r∥2)v+2(r⋅v)r+2w(r×v)
其中利用了叉乘展开式:
a×b×c=(a⋅c)b−(a⋅b)c
以及单位四元数约束条件 w2+∥r∥2=1,将 w2=1−∥r∥2 代入后合并同类项。
旋转组合:两个旋转 q1 和 q2 的组合等价于四元数的乘法:
q2(q1xq1∗)q2∗=(q2q1)x(q1∗q2∗)
虽然四元数不满足交换律,但其满足结合律(可以证明四元数存在对应的四维矩阵,所以矩阵的性质也是四元数的性质)。
注意:
- 四元数的旋转表示具有 3 个自由度(四个参数加一个单位模长约束)。
- 几何上,单位四元数可以看作 4 维球面 S3 的壳。
四元数的距离#
这部分证明参见 Krasjet / Quaternion ↗ 第 4 节・四元数插值(第 37 页)。
在单位三维球面 S3 上,或两个四元数 (q1,q2) 之间的角度:
⟨p,q⟩=arccos(p⋅q)
对应旋转之间的距离:
dist(p,q)=2arccos(∣p⋅q∣)
或等价地:
dist(p,q)=2min{⟨p,q⟩,⟨p,−q⟩}
这里需要在两个值之间取最小值的原因也可以参见 Krasjet / Quaternion ↗ 第 5.4 节・双倍覆盖带来的问题(第 46 页)。
可以证明,两个旋转 (R1,R2) 的距离与其对应四元数 q(R1) 和 q(R2) 在球面上的距离成线性关系(前者是后者的两倍)。

四元数插值#
这部分证明参见 Krasjet / Quaternion ↗ 第 5 节・四元数插值(第 41 页)。
线性插值(Linear Interpolation, Lerp)#
q(t)=(1−t)q1+tq2

归一化线性插值(Normalized Linear Interpolation, Nlerp)#
q(t)=∥(1−t)q1+tq2∥(1−t)q1+tq2

省流:就是除个模长,让他恢复为单位四元数。
球面线性插值(Spherical Linear Interpolation, Slerp)#
以上两种插值都有问题,他们实际上是线性切分了弦长,而不是弧长,这会导致在转动的时候的角速度不均匀:

所以,我们要引入新的插值方式,这就是球面线性插值(Spherical Linear Interpolation, Slerp):
q(t)=sin(θ)sin((1−t)θ)q1+sin(θ)sin(tθ)q2
其中 θ 是 q1 和 q2 之间的夹角,θ=arccos(q1⋅q2)。

证明的一个方法在 Krasjet / Quaternion ↗ 第 5.3 节・球面线性插值(第 43 页)。
不过老师的 Slide 上有另一种更简单的利用三角函数性质的证明方法:

α+βv(t)w1sinαw0w1ψ=ψ=w0v0+w1v1=w0sinβ=1sin(π−ψ)=sinψ=sinψsinβ=sinψsinα=cos−1(v0⋅v1)
第三个式子利用了三角形的性质:
sinαA=sinβB=sinγC
球面均匀采样#
考虑我们如何随机采样一个旋转。
引理:在 SO(3) 中均匀采样旋转矩阵等价于从单位四元数的集合 S(3) 中均匀采样。
原因:两个旋转之间的距离与对应的四元数在单位球面上的距离成线性关系。
那么,如何均匀采样 S(3) 呢?
方法:从四维标准正态分布 N(0,I4×4) 中随机采样一个变量,并将其归一化,从而得到(直接解释为)单位四元数。
原因:由于标准正态分布是各向同性的(即在所有方向上均匀分布),所以采样得到的单位四元数在 S(3) 中也是均匀分布的。
随后,采样得到的单位四元数也就可以转换为对应的旋转矩阵(如果需要)。
有趣的事实#
对于神经网络来讲,最好的旋转表示方法是 9 个数的旋转矩阵。因为其他的表示方法均可能出现对于输入的微小扰动,即一个小的旋转,出现一个跳变,而只有最初最冗余的 R3×3 旋转矩阵保证其必然是连续的( 即连续性 ),而这对于神经网络是很好的性质。
运动规划#
形式化表述#
配置空间 (Configuration Space)#
定义:配置空间(Configuration spcae,C-space)是 Rn 的一个子集,包含系统的所有可能状态(即状态空间)。
- C:配置空间,表示所有可能状态的集合。
- Cfree⊆C:自由空间,包含所有有效状态(无碰撞)。
- Cobs⊆C:障碍空间,表示有障碍的无效状态。
- Cfree∪Cobs=C
- Cfree∩Cobs=∅
问题定义#

给定:
- 自由空间 Cfree。
- 起始状态 qstart∈Cfree。
- 目标状态 qgoal∈Cfree。
目标:计算一系列动作,使机器人从 qstart 移动到 qgoal。
注意,这里的符号 q 不是四元数(quaternion)的意思,其是配置空间中的一个点,即状态。
例如,对于一个机械臂,其配置空间可能是 Rn,那么 q 就是关节的角度组合之一 (θ1,θ2,…,θn)。
- 避免障碍物:确保路径始终在 Cfree 内。
- 长规划时间:路径可能较长,需要优化。
- 高维空间:配置空间维度可能很高(例如多关节机器人)。
Preview: