四元数旋转公式推导

任务

之前在了解关于slam的知识时,见到过四元数,但没有理解。近日在学习偏微分方程时,发现一个系列视频3Blue1Brown:深入浅出、直观明了地分享数学之美。
获益良多,又继续观看了感兴趣的视频,其中有四元数。随着资料的逐渐增多,我也对四元数慢慢形成认知,在此做整理。
主要资料出自https://krasjet.github.io/quaternion/quaternion.pdf

核心

四元数(quaternion)的表示:
q = a + b i + c j + d k q=a+b\boldsymbol{i}+c\boldsymbol{j}+d\boldsymbol{k}
与复数相类,可以表示为:
q = [ a , u ] ( u = [ x y z ] , a , x , y , z R ) q=[ a,\boldsymbol{u}] (\boldsymbol{u}= \begin{bmatrix} x\\ y\\ z\\ \end{bmatrix}, a,x,y,z\in \mathbb{R})
u \boldsymbol{u} 视为三维空间,而 a a 处于和 u \boldsymbol{u} 垂直的第四维度。则对于三维的我们,看到的四元数的可视化表达只能是切片的结果。

疑问

四元数的应用有刚体的旋转,而演示最直观的也是对其做体现,便从中入手。
在观看视频时,已经理解了四元数乘法的运算规则:
i i = j j = k k = 1 i j = j i = k j k = k j = i k i = i k = j \boldsymbol{ii=jj=kk=-1}\\ \boldsymbol{ij=-ji=k}\\ \boldsymbol{jk=-kj=i}\\ \boldsymbol{ki=-ik=j}\\

自身相乘和虚数的运算一致,不同元素的相乘与向量的叉乘(product)一致,符合右手定则(同样不符合交换律)

举个简单的例子,对于某点 p 0 = 1 + j p_{0}=1+\boldsymbol{j} ,也就是 p 0 = [ 1 , u ] ( u = [ 0 1 0 ] p_{0}=[ 1,\boldsymbol{u}] (\boldsymbol{u}= \begin{bmatrix} 0\\ 1\\ 0\\ \end{bmatrix} ,
左乘 q 0 = i q_{0}=\boldsymbol{i} 同理,它的四元数表达可以为 q 0 = [ 0 , u ] ( u = [ 1 0 0 ] ) q_{0}=[ 0,\boldsymbol{u}] (\boldsymbol{u}= \begin{bmatrix} 1\\ 0\\ 0\\ \end{bmatrix}) ,
结果 p 0 = q 0 p 0 = i + k p_{0}'=q_{0}p_{0}=\boldsymbol{i}+\boldsymbol{k}

在这里插入图片描述
从这个例子我们很难看出旋转的规律,这也正是我们面对的问题,如何表示某个确定的旋转

在网页链接的交互平台https://eater.net亲自感受时,观察到坐标实际旋转恰为给定旋转角的二倍,十分想理解其中缘由。

在这里插入图片描述

在这里插入图片描述

从三维旋转说起

将三维空间中的旋转表示的方法采用轴角式(Axis-Angle),即某个向量 v \boldsymbol{v} 围绕轴 u \boldsymbol{u} 旋转角度大小为 θ \theta 后到达 v \boldsymbol{v'} ,如图所示(原图来源:https://krasjet.github.io/quaternion/quaternion.pdf)
在这里插入图片描述
将向量 v \boldsymbol{v} 分解为垂直于 u \boldsymbol{u} v \boldsymbol{v_{\perp}} 和平行于 u \boldsymbol{u} v \boldsymbol{v_{\parallel}}
由图易知: v = v \boldsymbol{v_{\parallel}'}=\boldsymbol{v_{\parallel}}
故只需计算 v \boldsymbol{v_{\perp}'} 即可得 v = v + v ( 1 ) \boldsymbol{v'}=\boldsymbol{v_{\perp}'}+\boldsymbol{v_{\parallel}}\qquad(1)
将上图垂直轴 u \boldsymbol{u} 的平面投影如下图:
在这里插入图片描述
可知表达式:
v = v c o s θ + w s i n θ ( 2 ) \boldsymbol{v_{\perp}'}=\boldsymbol{v_{\perp}}cos\theta+\boldsymbol{w}sin\theta \qquad(2)

这里 w = v ||\boldsymbol{w}||= ||\boldsymbol{v_{\perp}}|| 且 与 v \boldsymbol{v_{\perp}} u \boldsymbol{u} 垂直,则可通过 v \boldsymbol{v_{\perp}} u \boldsymbol{u} 叉乘获得:
w = v × u u \boldsymbol{w}= \boldsymbol{v_{\perp}} \times \frac{ \boldsymbol{u}}{ ||\boldsymbol{u}||}
由旋转轴大小不重要,则令其模长为1: u = 1 ||\boldsymbol{u}||=1 则有:
w = v × u ( 3 ) \boldsymbol{w}= \boldsymbol{v_{\perp}} \times \boldsymbol{u}\qquad(3)
此时,也可得出 v \boldsymbol{v_{\perp}} v \boldsymbol{v_{\parallel}} 的表达式:

v = v u ( 4 ) \boldsymbol{v_{\parallel}} = \boldsymbol{v} \cdot \boldsymbol{u}\qquad(4)

v = v v u ( 5 ) \boldsymbol{v_{\perp}} = \boldsymbol{v} - \boldsymbol{v} \cdot \boldsymbol{u}\qquad(5)
联立式 ( 1 ) ( 2 ) ( 3 ) ( 4 ) ( 5 ) (1)(2)(3)(4)(5) 可得:

v = v c o s θ + ( 1 c o s θ ) ( v u ) u + v × u s i n θ ( 5 ) \boldsymbol{v'} = \boldsymbol{v}cos\theta +(1-cos\theta)( \boldsymbol{v} \cdot \boldsymbol{u})\cdot \boldsymbol{u} +\boldsymbol{v} \times\boldsymbol{u}sin\theta\qquad(5)
这个式子直观的将变量和旋转结果展示出来,符合我们的思维,这个式子是我们稍后四元数旋转的基础。

四元数旋转!

一个奇妙的运算

两个一般的四元数 q 1 = a + b i + c j + d k q_{1}=a+b\boldsymbol{i}+c\boldsymbol{j}+d\boldsymbol{k} q 2 = e + f i + g j + h k q_{2}=e+f\boldsymbol{i}+g\boldsymbol{j}+h\boldsymbol{k} 相乘,运用之前提到的乘法运算规则,整理结果如下:
四元数相乘
换一种表示方法,更清楚规律为何:
q 1 = [ a , v ] ( v = [ b c d ] ) q_{1}=[ a,\boldsymbol{v}] (\boldsymbol{v}= \begin{bmatrix} b\\ c\\ d\\ \end{bmatrix})
q 2 = [ e , u ] ( u = [ f g h ] ) q_{2}=[ e,\boldsymbol{u}] (\boldsymbol{u}= \begin{bmatrix} f\\ g\\ h\\ \end{bmatrix})
转化
本质源于四元数乘法运算的性质,我们得到如下表达式:

q 1 q 2 = [ a e v u , e v + a u + v × u ] ( v = [ b c d ] , u = [ f g h ] ) ( 6 ) q_{1}q_{2}=[ ae-\boldsymbol{v}\boldsymbol{u},e\boldsymbol{v}+a\boldsymbol{u}+\boldsymbol{v}\times\boldsymbol{u}] (\boldsymbol{v}= \begin{bmatrix} b\\ c\\ d\\ \end{bmatrix}, \boldsymbol{u}= \begin{bmatrix} f\\ g\\ h\\ \end{bmatrix})\qquad(6)

三维 \rightarrow 四维

从三维推广到四维,首先简化问题,把需要旋转的四元数 v v v = [ 0 , v ] v=[0,\boldsymbol{v}] ,则对应有:
v = [ 0 , v ] v = [ 0 , v ] u = [ 0 , u ] v_{\perp}=[0,\boldsymbol{v_{\perp}}]\qquad v_{\parallel}=[0,\boldsymbol{v_{\parallel}}]\qquad u=[0,\boldsymbol{u}]
v = [ 0 , v ] v = [ 0 , v ] v = [ 0 , v ] v_{\perp}'=[0,\boldsymbol{v_{\perp}'}]\qquad v_{\parallel}'=[0,\boldsymbol{v_{\parallel}'}]\qquad v'=[0,\boldsymbol{v'}]

将其代入式 ( 2 ) (2) 可得:

v = v c o s θ + w s i n θ ( 7 ) {v_{\perp}'}={v_{\perp}}cos\theta+{w}sin\theta \qquad(7)
w = [ 0 , w ] ( w = u × v ) w=[0,\boldsymbol{w}] (\boldsymbol{w}=\boldsymbol{u}\times\boldsymbol{v_{\perp}})
而根据式 ( 6 ) (6) 计算四元数 u u v v_{\perp} 相乘恰有:

u v = [ u v , u × v ] uv_{\perp}=[-\boldsymbol{u}\cdot\boldsymbol{v_{\perp}},\boldsymbol{u}\times\boldsymbol{v_{\perp}}]
v \boldsymbol{v} u \boldsymbol{u} 在同一平面,故 v \boldsymbol{v_{\perp}} 垂直于此平面,即 v u = 0 \boldsymbol{v_{\perp}}\cdot\boldsymbol{u}=0
原式化为:
u v = [ 0 , u × v ] = [ 0 , w ] uv_{\perp}=[0,\boldsymbol{u}\times\boldsymbol{v_{\perp}}]=[0,\boldsymbol{w} ]
即:
u v = w ( 8 ) uv_{\perp}=w \qquad(8)
联立式 ( 7 ) ( 8 ) (7)(8) 得:

v = v c o s θ + u v s i n θ {v_{\perp}'}={v_{\perp}}cos\theta+{uv_{\perp}}sin\theta

由分配律,化为:
v = ( c o s θ + u s i n θ ) v ( 9 ) {v_{\perp}'}=(cos\theta+{u}sin\theta) v_{\perp}\qquad(9)

q = c o s θ + u s i n θ = [ c o s θ , u s i n θ ] q=cos\theta+{u}sin\theta=[cos\theta,\boldsymbol{u}sin\theta]

( 9 ) (9) 表示为:
v = q v ( 9 ) {v_{\perp}'}=q v_{\perp}\qquad(9)

由式 ( 1 ) (1) 推知:
v = v + v ( 10 ) {v'}={v_{\perp}'}+{v_{\parallel}}\qquad(10)
联立 ( 9 ) ( 10 ) (9)(10) 得:
v = q v + v ( 10 ) {v'}=q v_{\perp}+{v_{\parallel}}\qquad(10)

二倍角度来源

根据四元数乘法性质,推得:
q = [ c o s θ , u s i n θ ] q=[cos\theta,\boldsymbol{u}sin\theta] ,则有
q 2 = q q = [ c o s 2 θ , u s i n 2 θ ] q^2=qq=[cos2\theta,\boldsymbol{u}sin2\theta]

q = p 2 q=p^2
将式 ( 10 ) (10) 化为:

v = p p v + p p 1 v ( 11 ) {v'}=pp v_{\perp}+pp^-{1}{v_{\parallel}}\qquad(11)

与线性代数中的性质相似,这里 p = 1 ||p||=1 ,有:
p 1 = p ( 12 ) p^{-1}=p*\qquad(12)

( 11 ) (11) 化为:

v = p p v + p p v ( 13 ) {v'}=pp v_{\perp}+pp^{*}{v_{\parallel}}\qquad(13)

通过式 ( 6 ) (6) ,我们可得两个结论:
q 1 q 2 = [ a e v u , e v + a u + v × u ] ( 6 ) q_{1}q_{2}=[ ae-\boldsymbol{v}\boldsymbol{u},e\boldsymbol{v}+a\boldsymbol{u}+\boldsymbol{v}\times\boldsymbol{u}] \qquad(6)

  1. 对于 v = [ 0 , v ] v_{\parallel}=[0,\boldsymbol{v_{\parallel}}] , q = [ α , β u ] q=[\alpha,\beta \boldsymbol{u}] ,其中 v q v_{\parallel}\parallel q ,则有:
    q v = v q ( 14 ) qv_{\parallel}=v_{\parallel}q\qquad(14)
  2. 对于 v = [ 0 , v ] v_{\perp}=[0,\boldsymbol{v_{\parallel}}] , q = [ α , β u ] q=[\alpha,\beta \boldsymbol{u}] ,其中 v q v_{\perp}\perp q ,则有:
    q v = v q ( 15 ) qv_{\perp}=v_{\perp}q* \qquad(15)

联立式 ( 13 ) ( 14 ) ( 15 ) (13)(14)(15) 得:
v = p v p + p v p {v'}=p v_{\perp}p*+p{v_{\parallel}}p^{*}
由式 ( 12 ) (12)
v = p v p 1 + p v p 1 {v'}=p v_{\perp}p^{-1}+p{v_{\parallel}}p^{-1}

整理得:
v = p ( v + v ) p 1 {v'}=p( v_{\perp}+{v_{\parallel}})p^{-1}
最终即为:
v = p v p 1 {v'}=pvp^{-1}

正是交互网页所显示的表达式!
网页截图

发布了52 篇原创文章 · 获赞 8 · 访问量 9684

猜你喜欢

转载自blog.csdn.net/cascara/article/details/104545473