任务
之前在了解关于slam的知识时,见到过四元数,但没有理解。近日在学习偏微分方程时,发现一个系列视频3Blue1Brown:深入浅出、直观明了地分享数学之美。
获益良多,又继续观看了感兴趣的视频,其中有四元数。随着资料的逐渐增多,我也对四元数慢慢形成认知,在此做整理。
主要资料出自https://krasjet.github.io/quaternion/quaternion.pdf
核心
四元数(quaternion)的表示:
q=a+bi+cj+dk
与复数相类,可以表示为:
q=[a,u](u=⎣⎡xyz⎦⎤,a,x,y,z∈R)
将
u 视为三维空间,而
a 处于和
u 垂直的第四维度。则对于三维的我们,看到的四元数的可视化表达只能是切片的结果。
疑问
四元数的应用有刚体的旋转,而演示最直观的也是对其做体现,便从中入手。
在观看视频时,已经理解了四元数乘法的运算规则:
ii=jj=kk=−1ij=−ji=kjk=−kj=iki=−ik=j
自身相乘和虚数的运算一致,不同元素的相乘与向量的叉乘(product)一致,符合右手定则(同样不符合交换律)
举个简单的例子,对于某点
p0=1+j,也就是
p0=[1,u](u=⎣⎡010⎦⎤,
若 左乘
q0=i,同理,它的四元数表达可以为
q0=[0,u](u=⎣⎡100⎦⎤),
结果
p0′=q0p0=i+k
从这个例子我们很难看出旋转的规律,这也正是我们面对的问题,如何表示某个确定的旋转?
在网页链接的交互平台https://eater.net亲自感受时,观察到坐标实际旋转恰为给定旋转角的二倍,十分想理解其中缘由。
从三维旋转说起
将三维空间中的旋转表示的方法采用轴角式(Axis-Angle),即某个向量
v 围绕轴
u 旋转角度大小为
θ后到达
v′,如图所示(原图来源:https://krasjet.github.io/quaternion/quaternion.pdf)
将向量
v 分解为垂直于
u 的
v⊥ 和平行于
u 的
v∥
由图易知:
v∥′=v∥
故只需计算
v⊥′即可得
v′=v⊥′+v∥(1)
将上图垂直轴
u 的平面投影如下图:
可知表达式:
v⊥′=v⊥cosθ+wsinθ(2)
这里
∣∣w∣∣=∣∣v⊥∣∣ 且 与
v⊥ 及
u 垂直,则可通过
v⊥ 及
u 叉乘获得:
w=v⊥×∣∣u∣∣u
由旋转轴大小不重要,则令其模长为1:
∣∣u∣∣=1 则有:
w=v⊥×u(3)
此时,也可得出
v⊥ 和
v∥ 的表达式:
v∥=v⋅u(4)
v⊥=v−v⋅u(5)
联立式
(1)(2)(3)(4)(5)可得:
v′=vcosθ+(1−cosθ)(v⋅u)⋅u+v×usinθ(5)
这个式子直观的将变量和旋转结果展示出来,符合我们的思维,这个式子是我们稍后四元数旋转的基础。
四元数旋转!
一个奇妙的运算
两个一般的四元数
q1=a+bi+cj+dk 与
q2=e+fi+gj+hk相乘,运用之前提到的乘法运算规则,整理结果如下:
换一种表示方法,更清楚规律为何:
q1=[a,v](v=⎣⎡bcd⎦⎤)
q2=[e,u](u=⎣⎡fgh⎦⎤)
本质源于四元数乘法运算的性质,我们得到如下表达式:
q1q2=[ae−vu,ev+au+v×u](v=⎣⎡bcd⎦⎤,u=⎣⎡fgh⎦⎤)(6)
三维
→四维
从三维推广到四维,首先简化问题,把需要旋转的四元数
v 取
v=[0,v] ,则对应有:
v⊥=[0,v⊥]v∥=[0,v∥]u=[0,u]
v⊥′=[0,v⊥′]v∥′=[0,v∥′]v′=[0,v′]
将其代入式
(2)可得:
v⊥′=v⊥cosθ+wsinθ(7)
w=[0,w](w=u×v⊥)
而根据式
(6)计算四元数
u与
v⊥相乘恰有:
uv⊥=[−u⋅v⊥,u×v⊥]
由
v 与
u 在同一平面,故
v⊥ 垂直于此平面,即
v⊥⋅u=0
原式化为:
uv⊥=[0,u×v⊥]=[0,w]
即:
uv⊥=w(8)
联立式
(7)(8)得:
v⊥′=v⊥cosθ+uv⊥sinθ
由分配律,化为:
v⊥′=(cosθ+usinθ)v⊥(9)
取
q=cosθ+usinθ=[cosθ,usinθ]
式
(9)表示为:
v⊥′=qv⊥(9)
由式
(1)推知:
v′=v⊥′+v∥(10)
联立
(9)(10)得:
v′=qv⊥+v∥(10)
二倍角度来源
根据四元数乘法性质,推得:
若
q=[cosθ,usinθ],则有
q2=qq=[cos2θ,usin2θ]
取
q=p2
将式
(10)化为:
v′=ppv⊥+pp−1v∥(11)
与线性代数中的性质相似,这里
∣∣p∣∣=1,有:
p−1=p∗(12)
式
(11)化为:
v′=ppv⊥+pp∗v∥(13)
通过式
(6),我们可得两个结论:
q1q2=[ae−vu,ev+au+v×u](6)
- 对于
v∥=[0,v∥],
q=[α,βu],其中
v∥∥q,则有:
qv∥=v∥q(14)
- 对于
v⊥=[0,v∥],
q=[α,βu],其中
v⊥⊥q,则有:
qv⊥=v⊥q∗(15)
联立式
(13)(14)(15)得:
v′=pv⊥p∗+pv∥p∗
由式
(12):
v′=pv⊥p−1+pv∥p−1
整理得:
v′=p(v⊥+v∥)p−1
最终即为:
v′=pvp−1
正是交互网页所显示的表达式!