四元数旋转公式推导

任务

之前在了解关于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+bi+cj+dk
与复数相类,可以表示为:
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}) q=[a,u](u=xyz,a,x,y,zR)
u \boldsymbol{u} u 视为三维空间,而 a a a 处于和 u \boldsymbol{u} 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}\\ ii=jj=kk=1ij=ji=kjk=kj=iki=ik=j

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

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

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

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

在这里插入图片描述

在这里插入图片描述

从三维旋转说起

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

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

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

v ⊥ = v − ( u ⋅ v ) u ( 5 ) \boldsymbol{v_{\perp}} = \boldsymbol{v} - ( \boldsymbol{u} \cdot \boldsymbol{v})\boldsymbol{u}\qquad(5) v=v(uv)u(5)
联立式 ( 1 ) ( 2 ) ( 3 ) ( 4 ) ( 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) v=vcosθ+(1cosθ)(vu)u+v×usinθ(5)
这个式子直观的将变量和旋转结果展示出来,符合我们的思维,这个式子是我们稍后四元数旋转的基础。

四元数旋转!

一个奇妙的运算

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

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) q1q2=[aevu,ev+au+v×u](v=bcd,u=fgh)(6)

三维 → \rightarrow 四维

从三维推广到四维,首先简化问题,把需要旋转的四元数 v v v v = [ 0 , v ] v=[0,\boldsymbol{v}] v=[0,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]u=[0,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'}] v=[0,v]v=[0,v]v=[0,v]

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

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

u v ⊥ = [ − u ⋅ v ⊥ , u × v ⊥ ] uv_{\perp}=[-\boldsymbol{u}\cdot\boldsymbol{v_{\perp}},\boldsymbol{u}\times\boldsymbol{v_{\perp}}] uv=[uv,u×v]
v \boldsymbol{v} v u \boldsymbol{u} u 在同一平面,故 v ⊥ \boldsymbol{v_{\perp}} v 垂直于此平面,即 v ⊥ ⋅ u = 0 \boldsymbol{v_{\perp}}\cdot\boldsymbol{u}=0 vu=0
原式化为:
u v ⊥ = [ 0 , u × v ⊥ ] = [ 0 , w ] uv_{\perp}=[0,\boldsymbol{u}\times\boldsymbol{v_{\perp}}]=[0,\boldsymbol{w} ] uv=[0,u×v]=[0,w]
即:
u v ⊥ = w ( 8 ) uv_{\perp}=w \qquad(8) uv=w(8)
联立式 ( 7 ) ( 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=vcosθ+uvsinθ

由分配律,化为:
v ⊥ ′ = ( c o s θ + u s i n θ ) v ⊥ ( 9 ) {v_{\perp}'}=(cos\theta+{u}sin\theta) v_{\perp}\qquad(9) v=(cosθ+usinθ)v(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] q=cosθ+usinθ=[cosθ,usinθ]

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

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

二倍角度来源

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

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

v ′ = p p v ⊥ + p p − 1 v ∥ ( 11 ) {v'}=pp v_{\perp}+pp^-{1}{v_{\parallel}}\qquad(11) v=ppv+pp1v(11)

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

( 11 ) (11) (11)化为:

v ′ = p p v ⊥ + p p ∗ v ∥ ( 13 ) {v'}=pp v_{\perp}+pp^{*}{v_{\parallel}}\qquad(13) v=ppv+ppv(13)

通过式 ( 6 ) (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) q1q2=[aevu,ev+au+v×u](6)

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

联立式 ( 13 ) ( 14 ) ( 15 ) (13)(14)(15) (13)(14)(15)得:
v ′ = p v ⊥ p ∗ + p v ∥ p ∗ {v'}=p v_{\perp}p*+p{v_{\parallel}}p^{*} v=pvp+pvp
由式 ( 12 ) (12) (12)
v ′ = p v ⊥ p − 1 + p v ∥ p − 1 {v'}=p v_{\perp}p^{-1}+p{v_{\parallel}}p^{-1} v=pvp1+pvp1

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

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

  • 8
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
在空间中,我们通常使用欧拉角(Euler angles)或旋转矩阵(rotation matrix)来表示物体的姿态。但是,使用欧拉角或旋转矩阵进行姿态更新时,会出现万向锁(gimbal lock)等问题,因此,这里介绍使用四元数(quaternions)进行姿态更新的方法。 四元数是一种扩展了复数的数学结构,它可以用来表示三维空间中的旋转。一个四元数q可以表示为: q = w + xi + yj + zk 其中,w为实部,x、y和z为虚部。i、j和k是基本的四元数单位向量,它们可以表示为: i = (1,0,0) j = (0,1,0) k = (0,0,1) 四元数可以用来表示旋转轴和旋转角度。设一个向量v在旋转前为v1,在旋转后为v2,则有: v2 = qv1q* 其中,q*表示q的共轭(conjugate),即: q* = w - xi - yj - zk 现在,我们来推导四元数进行姿态更新的公式。 设一个物体在初始时刻的姿态为q1,经过一段时间后的姿态为q2,则有: q2 = q1 * dq 其中dq为四元数表示的姿态变化量。我们需要求出dq的值,以便实现姿态更新。 假设物体绕一个轴n旋转了一个角度θ,则dq的表达式为: dq = cos(θ/2) + nsin(θ/2) 其中,cos和sin分别表示余弦和正弦函数。由于n是一个单位向量,我们可以将其表示为一个四元数: n = cos(θ/2) + sin(θ/2)(xi + yj + zk) 将n代入dq的公式中,得到: dq = cos(θ/2) + sin(θ/2)(xi + yj + zk) 此时,我们就可以使用dq来更新物体的姿态了。具体地,假设物体在初始时刻的姿态为q1,经过一段时间后的姿态为q2,则有: q2 = q1 * dq 其中,*表示四元数的乘法运算。这个公式可以通过四元数的运算规则来推导出来。 综上所述,利用四元数进行姿态更新的公式为: q2 = q1 * (cos(θ/2) + sin(θ/2)(xi + yj + zk)) 其中,θ为旋转角度,n为旋转轴的单位向量,q1为初始时刻的姿态,q2为经过一段时间后的姿态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值