四元数与旋转

二元数

表达

z=x+iy=(x,y)=r(cosθ+isinθ)=reiθr=x2+y2,θ=arccos(xr)

二元数即普通的复数
对于eiθ=cosθ+isinθ的来源,可用泰勒展开(在复数上的推广)

ex=k=0xkk!eiθ=k=0(iθ)kk!cosθ=k=0i2kθ2k(2k)!,sinθ=k=0i2kθ2k+1(2k+1)!eiθ=cosθ+isinθ

四元数

表达

q=s+xi+yj+zk=(s,x,y,z)=s+vq^=[s,v]=r(cosθ+vq^|v|sinθ)=revq^|v|θr=s2+|v|2,θ=arccos(xr)v=(x,y,z)q^=(i,j,k)

以下涉及四元数的计算,可以看懂后面的内容再回来
对于eq^v=cos|v|+q^v|v|sin|v|来源,同样可用泰勒展开(在复数上的推广)

eq^v=k=0(q^v)kk!cos|v|=k=0(q^v)2k(2k)!,sin|v|=k=0|v|(q^v)2k(2k+1)!eq^v=cos|v|+q^v|v|sin|v|

矩阵形式表示虚部:

q=s+xi+yj+zk=s[1001]+x[0110]+y[0ii0]+z[i00i]=[s+zixyixyiszi]

其它相关的四元数概念:

  • 实四元数:q=[s,0]
  • 纯四元数:q=[0,v]
  • 共轭四元数:q=[s,v]
  • 单位四元数:|q|=qq=s2+|v|2=1
    单位四元数的乘法满足群,证明过程可用四元数的二元形式乘法
  • 四元数规范化:q|q|
  • 四元数求逆:q1=q|q|2
  • 四元数的对数:log(q)=log(revq^|v|θ)=log(r)+vq^|v|θ
  • 四元数的幂次:qt=(revq^|v|θ)t=rtevq^|v|θt

简化表示:
也有直接用v^代表vq^的,此时v^q^不同,不是基的意思,可以看作是纯四元数
但是v1^×v2^时应该看作v1×v2
即涉及到点乘和叉乘时都要把纯四元数当做向量

运算

基的运算

基础运算:i2=j2=z2=ijk=1
可以推导出的运算(记忆方式联想叉乘,这些运算用矩阵形式同样也适用):
ij=ji=k
ik=ki=j
jk=kj=i

向量与基的元素乘:

v=(x,y,z),q^=(i,j,k)vq^=xi+yj+zk

两个基相乘:

v=(1,1,1),q^q^=(vq^)(vq^)=|v|2=3

向量的运算

从线性代数角度,对于n维列向量a,b,有

  • 内积:aTb
  • 叉积:a×b
  • 外积:abT

对于内积:满足交换律和分配律,不满足结合律

  • 交换律:ab=ba
  • 分配律:a(b+c)=ab+ac

对于叉积:满足反交换律和分配律,不满足结合律

  • 反交换律:a×b=b×a
  • 分配律:a×(b+c)=a×b+a×c
  • 三重矢积公式:
    (a×b)×c=acbbca
    a×(b×c)=acbabc

对于混合积运算:

  • 标量三重积:(a×b)c=a(b×c)
    特别有:a(a×c)=0

四元数加法、乘法与点积

加法: 把两个四元数的实部和虚部对应相加
q1+q2=(s1+ix1+jy1+kx1)+(s2+ix2+jy2+kz2)=(s1+s2)+i(x1+x2)+j(y1+y2)+k(z1+z2)

乘法:

  • 四元数普通形式乘法运算:

q1q2=(s1+ix1+jy1+kz1)(s2+ix2+jy2+kz2)=(s1s2x1x2y1y2z1z2)+i(s1x2+s2x1+y1z2y2z1)+j(s1y2+s2y1+x2z1x1z2)+k(s1z2+s2z1+x1y2x2y1)

  • 四元数二元形式乘法运算:

q1q2=[s1,v1][s2,v2]=(s1+v1q^)(s2+v2q^)=s1s2v1v2+(s1v2+s2v1+v1×v2)q^=[s1s2v1v2,s1v2+s2v1+v1×v2]

  • 四元数虚部的乘法:(v1q^)(v2q^)=[v1v2,v1×v2]
    v1v2平行,则结果的虚部为0
    v1v2垂直,则结果的实部为0,将满足虚部运算的封闭性
  • 四元数与三维向量相乘:实际上就是把三维向量转化纯为四元数再相乘

q=[s,v]pqp=[s,v]p=[s,v][0,p]pq=p[s,v]=[0,p][s,v]

  • 模乘性质:|q1q2|=|q1||q2|

q1=[s1,v1],q2=[s2,v2],θv1v2,|q1q2|2=(s1s2v1v2)2+(s1v2+s2v1+v1×v2)2=(s12s222s1s2v1v2+v1v2v1v2)+(s12v22+2s1s2v1v2+s22v12+(v1×v2)2)=s12(s22+v22)+s22v12+(|v1||v2|cosθ)2+(|v1||v2|sinθ)2=s12(s22+v22)+v12(s22+v22)+=(s12+v12)(s22+v22)=(|q1||q2|)2

点积: q1q2=s1s2+v1v2

欧拉角旋转

欧拉角与内旋外旋

欧拉角有多种定义方式,其关键在于:旋转轴顺序、旋转角度、内旋和外旋的选择

  • 旋转轴顺序: 三次连续旋转一共有12种
    两条轴:Z-X-Z, X-Y-X, Y-Z-Y, Z-Y-Z, X-Z-X, Y-X-Y
    三条轴:X-Y-Z, Y-Z-X, Z-X-Y, X-Z-Y, Z-Y-X, Y-X-Z
  • 旋转角度: 有正负之分,正则按右手定则旋转,负则按左手定则旋转
  • 内旋和外旋:
    内旋:按自身坐标系(会变)的坐标轴依次旋转
    外旋:按全局坐标系(不变)的坐标轴依次旋转

旋转矩阵

绕轴旋转的正向和反向按右手定则来,默认旋转的度数是指正向旋转,坐标采用列向量形式

设绕Z,Y,X轴旋转的旋转矩阵分别为Z,Y,X,则

Z(α)=[cosαsinα0sinαcosα0001],Y(β)=[cosβ0sinβ010sinβ0cosβ],X(γ)=[1000cosγsinγ0sinγcosγ]

假设自身坐标系和全局坐标系在初始时重合,自身坐标系经过Z-Y-X外旋后任取一点,它在最终自身坐标系内的坐标为P1,在全局坐标系内的坐标为p1,则有

P1=Rp1p1=R1P1R=X(γ)Y(β)Z(α)

其中逆矩阵其实就是反方向旋转,又因为Z,Y,X均为单位正交阵,所以它们的逆矩阵为它们的转置矩阵
P1=Rp1是从全局坐标转为自身坐标,可以看成外旋Z-Y-X的结果,也可以看成是内旋X-Y-Z的结果
p1=R1P1则是从自身坐标转为全局坐标,与全局坐标转为自身坐标互逆

注意:
这里旋转矩阵R有两种解释,即外旋Z-Y-X的结果或内旋X-Y-Z的结果
对于外旋,R是左乘形成的,即依次左乘Z(α),Y(β),X(γ)得到的R=X(γ)Y(β)Z(α),矩阵左乘可以看做是坐标在变换(线性代数的向量空间章节中的过渡矩阵内容)
对于内旋,R是右乘形成的,即依次右乘X(γ),Y(β),Z(α)得到的R=X(γ)Y(β)Z(α),矩阵右乘可以看做是基底在变换
所以这里的左乘和右乘,都是指R的形成过程,而不是对坐标去左乘或右乘(毕竟坐标都是列向量了),而无论是左乘还是右乘,它们的结果即R,都是一样的
此外,旋转矩阵与坐标相乘本质上是外旋操作,比如X(γ)Y(β)Z(α)p1可以依次分解成三个外旋操作,即先绕Z轴内旋α度,再按Y轴内旋β度,最后按X轴内旋γ度,而对于内旋来说却做不到这样的按结合律的分解

四元数旋转

绕轴旋转的正向和反向按右手定则来,默认旋转的度数是指正向旋转,坐标采用列向量形式

共轭变换

p=qpq=qpq1pqp

若要让向量p绕轴向量v正向旋转θ度,则q=cosθ2+sinθ2vq^,其中|v|=1

共轭变换的提出与四元数乘法性质、同构映射的思想有关

共轭变换的解读

抽象理解

四元数旋转实际上就是对一个三维向量进行四元数的共轭变换
左乘q是对向量p进行第一次旋转,把三维向量旋转到四维里去(本质是把三维向量放在四维空间进行旋转)
右乘q1是对向量p进行第二次旋转,把四维的向量再次旋转到三维里去(本质是把两次旋转后的向量映射回三维)

推导分析

q=[s,v]pqpq1=[s,v][0,p][s,v]=[vp,sp+v×p][s,v]=[0,2vpv+(s2v2)p+2sv×p]p=p+ppvpvqpq1=[0,2v(p+p)v+(s2v2)(p+p)+2sv×(p+p)]=[0,2vpv+(s2v2)p+(s2v2)p+2sv×p]pvvpv=vvp=v2pqpq1=[0,2v2p+(s2v2)p+(s2v2)p+2sv×p]=[0,(s2+v2)p+(s2v2)p+2sv×p]=[0,p+(s2v2)p+2sv×p]|q|=1s=cosθ2v=sinθ2u|u|=1qpq1=[0,p+cosθp+sinθu×p]w=u×pupwqpq1=[0,p+cosθp+sinθw]

结合上式的推导进行分析可知

  • q包含了旋转轴向量v以及旋转角度θ的信息
  • 倒数第二条式子解释了为什么q中的θ要以θ2的形式出现
  • 最后一条式子解释了为什么共轭变换能实现绕轴旋转:
    1. 先把p分解成pp,然后在基底upw下进行旋转,其中u是轴向量
    2. 分量p正向旋转θ度后不变:p=p
    3. 分量p正向旋转θ度后变为:p=cosθp+sinθw
    4. 最后再把旋转后的两个分量相加,得到向量p旋转后的结果:p=p+p=p+cosθp+sinθw
  • 当轴向量v与待旋转向量p平行时:有qp=pq,即轴向量按轴自身旋转时保持不变
  • 当轴向量v与待旋转向量p垂直时:有qp=pq1
    qp=pq1=[0,sp+v×p]=[0,cosθ2p+sinθ2u×p]=[0,cosθ2p+sinθ2w]
    说明此时已经将向量p在三维空间上绕轴旋转了θ度,即vp垂直时四元数乘法不会把p旋转到四维里去(本质是此时在四维空间中的旋转仍能映射到三维空间上),此时左乘即qp是绕轴正向旋转,右乘即pq是绕轴反向旋转(或左手定则的正向旋转)

四元数与旋转矩阵

qpq1=[12y22z22xy2wz2xz+2wy2xy+2wz12x22z22yz2wx2xz2wy2yz+2wx12x22y2]pq=(w,x,y,z),|q|=1

这里的旋转矩阵与外旋Z-X-Y得到的旋转矩阵是一样的

参考链接

https://www.cnblogs.com/dechinphy/p/quaternion-calc.html
https://blog.csdn.net/xinxiangwangzhi_/article/details/124650910
https://zhuanlan.zhihu.com/p/144032401
https://blog.csdn.net/Boooooots/article/details/87995418
https://blog.csdn.net/weixin_45590473/article/details/122884112


  1. https://www.zhihu.com/tardis/zm/art/78987582 ↩︎

  2. https://zhuanlan.zhihu.com/p/378125863 ↩︎

posted @   kksk43  阅读(189)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
特效
黑夜
侧边栏隐藏
点击右上角即可分享
微信分享提示