首页 > 代码库 > 四元数

四元数

旋转的表示方式

旋转矩阵

RAB表示从A坐标系到B坐标系的旋转矩阵,那么rB=RABrA

要注意的是坐标系的旋转和矢量的旋转的区别。矢量的旋转是在同一坐标系内,r=Rvr

RAB是正交矩阵,RBARAB的转置。det(RAB)=1

RAB的行向量是A坐标系的基矢在B坐标系中的表示,列向量是B坐标系的基矢在A坐标系中的表示。

quaternion

根据欧拉转动定理,任意多次的旋转可等效为一次旋转。用四元数来表示,标量部分表示转过的角度,矢量部分表示转轴的方向。

q=(abcd)=(cos?(0.5θ)vxsin?(0.5θ)vysin?(0.5θ)vzsin?(0.5θ))

θ为转过的角度,(vxvyvz)T定义了转轴,为单位矢量。
四元数的模为1。

四元数的动态方程:

如果q的第一项是标量项
技术分享

如果q的最后一项是标量项
q˙=Ωq

技术分享 (abcd)=(q0q1q2q3)

用加速度计和磁力计来计算欧拉角

由加速度计可以计算roll,pitch
技术分享

技术分享

也就是根据Cbn的第三行,第三行是重力加速度在b坐标系中的表示。
由磁力计可以计算yaw。设由n坐标系转过yaw后的坐标系为n‘。我们需要知道地磁场在n‘坐标系中的表示。而n‘到b坐标系是通过pitch,roll转动达到的,所以Cbn只要把Cbn中的ψ设为0就行了。
技术分享

Hx等是地磁场在n‘坐标系中的表示,hx等是在b坐标系中的表示。然后由Hx, Hy求反正切,再加上磁偏角修正,就得到了yaw。

axis-angle

根据欧拉转动定理,刚体在三维空间的任意次序转动可等效于一次定轴转动。于是有了axis-angle表示。转动定轴又称Euler axis.
技术分享

四元数下的矢量坐标变换(与秦永元的书也一致)

(1)rb=q?rnq

其中r是标量部分为0的四元数,q是将n系转至b系的四元数。1

四元数->方向余弦矩阵(dcm)

四元数乘法:

(r1,v1)?(r2,v2)=(r1r2?v1?v2r1v2+r2v1+v1×v2)

四元数q=[q0q1q2q3](q0是标量部分)对应的dcm
Rnb=(2q02?1)I+2QQT?2q0[Q×]
2
其中Q是四元数的矢量部分,[Q×]是矢量的反对称矩阵,
[Q×]=[0?Q3Q2Q30?Q1?Q2Q10]

展开后为:
(2)Rnb=[2(q02+q12)?12(q1q2+q0q3)2(q1q3?q0q2)2(q1q2?q0q3)2(q02+q22)?12(q0q1+q2q3)2(q0q2+q1q3)2(q2q3?q0q1)2(q02+q32)?1]

dcm->四元数

(2)" role="presentation" style="position: relative;">(2)可得:

4q02?1=tr(R)4q0q1=R23?R324q0q2=R31?R134q0q3=R12?R21

于是:
q0=R11+R22+R33+12q1=R23?R324q0q2=R31?R134q0q3=R12?R214q0

四元数->欧拉角

绕X轴旋转

Rx=[1000cθsθ0?sθcθ]

绕Y轴旋转
Ry=[cθ0?sθ010sθ0cθ]

绕Z轴旋转
Rz=[cθsθ0?sθcθ0001]

sθ放置位置记忆方法:看如下序列

XYZXY

绕X轴旋转90度,将Y轴转到了Z轴。那么sθ对应了Y轴(矩阵第二行),-sθ对应Z轴(第三行)。
同理,绕Y轴旋转90度,将Z轴转到了X轴。那么sθ对应了Z轴(第三行),-sθ对应X轴(第一行)。
最后,绕Z轴旋转90度,将X轴转到了Y轴。那么sθ对应了X轴(第一行),-sθ对应Y轴(第二行)。

R=RxRyRz=[cyczcysz?sysxsycz?cxszsxsysz+cxczsxcycxsycz+sxszcxsysz?sxczcxcy]

tan(θz)=R12R11sin(θy)=?R13tan(θx)=R23R33

若是小角转动,
(3)R=[1θz?θy?θz1θxθy?θx1]=I?Θ

其中Θ为反对称矩阵。可见小角度转动与转动顺序无关(即只与绕xyz各轴转过的角度有关,如果不是所有3轴都出现呢?)。
RyRxRz=[cycz?sxsyszcysz+sxsycz?cxsy?cxszcxczsxsycz+sxcyszsysz?sxcyczcxcy]

运动学

角速度也是矢量,因此也适用于在坐标系间的变换。

ωnbb=Rnbωnbn
3
对于角速度的反对称矩阵表示,则是
Ωnbb=RnbΩnbnRbn

dcm微分方程推导:

Rnb˙=limδt0Rnb(t+δt)?Rnb(t)δt

Rnb(t+δt)是从Rnb(t)经过小转动(3)" role="presentation" style="position: relative;">(3)而来,即
Rnb˙=(I?Ωnbbδt)Rnb(t)?Rnb(t)δt=?ΩnbbRnb

其中Ωnbb是角速度ωnbb的反对称矩阵。

四元数微分方程的推导

有如下等式:

cos(θ)+sin(θ)n=eθn

其中n是单位矢量的四元数。证明在这
q˙(t)=limdt0q(t+dt)?q(t)dt


q(t+dt)=q(t)eωdt/2

其中ω是角速度的四元数表示。

q˙=12qω=12[0?ωx?ωy?ωzωx0ωz?ωyωy?ωz0ωxωzωy?ωx0]q
4

欧拉角微分方程推导:

(4)ωnbb=ωn1b+ω12b+ω2bb


ωn11=[001]θz˙

ω122=[010]θy˙

ω2bb=[100]θx˙

ωn1b=R1bωn11ω12b=R2bω122

都带入式(4)" role="presentation" style="position: relative;">(4),可得
ωnbb=[10?sy0cxsxcy0?sxcxcy][θx˙θy˙θz˙]

可得欧拉角微分方程:
[θx˙θy˙θz˙]=[1sxtycxty0cx?sx0sxcycxcy]ωnbb
5

考虑陀螺仪角速度误差的四元数更新方程:

qk+1=Φkqk+wk

其中
wk=?Δt2Ξk?k

?k是角速度误差
Ξk=[?QT[Q×]+q0I3×3]


  1. 如果是同一坐标系下的矢量旋转,则是
    r=qrq?
    ?
  2. 将式(1)" role="presentation" style="position: relative;">(1)展开来证明。 ?
  3. ωnb表示b系相对于n的转动角速度。 ?
  4. 对于表示坐标系旋转的四元数,如果先后进行了p,q旋转,则联合旋转是p*q,即后转的乘在右边。 ?
  5. ty表示tan?(θy) ?


来自为知笔记(Wiz)


四元数