四元数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四元数相关的知识,希望对你有一定的参考价值。
旋转的表示方式
旋转矩阵
RBA表示从A坐标系到B坐标系的旋转矩阵,那么rB=RBArA。
要注意的是坐标系的旋转和矢量的旋转的区别。矢量的旋转是在同一坐标系内,r′=Rvr。
RBA是正交矩阵,RAB为RBA的转置。det(RBA)=1
RBA的行向量是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
也就是根据Cnb的第三行,第三行是重力加速度在b坐标系中的表示。
由磁力计可以计算yaw。设由n坐标系转过yaw后的坐标系为n‘。我们需要知道地磁场在n‘坐标系中的表示。而n‘到b坐标系是通过pitch,roll转动达到的,所以Cn′b只要把Cnb中的ψ设为0就行了。
Hx等是地磁场在n‘坐标系中的表示,hx等是在b坐标系中的表示。然后由Hx, Hy求反正切,再加上磁偏角修正,就得到了yaw。
axis-angle
根据欧拉转动定理,刚体在三维空间的任意次序转动可等效于一次定轴转动。于是有了axis-angle表示。转动定轴又称Euler axis.
四元数下的矢量坐标变换(与秦永元的书也一致)
rb=q?rnq(1)
其中r是标量部分为0的四元数,q是将n系转至b系的四元数。
四元数->方向余弦矩阵(dcm)
四元数乘法:
(r1,v1→)?(r2,v2→)=(r1r2?v1→?v2→r1v2→+r2v1→+v1→×v2→)
四元数q=[q0q1q2q3](q0是标量部分)对应的dcm
Rbn=(2q20?1)I+2QQT?2q0[Q×]
其中Q是四元数的矢量部分,[Q×]是矢量的反对称矩阵,
[Q×]=???0Q3?Q2?Q30Q1Q2?Q10???
展开后为:
Rbn=????2(q20+q21)?12(q1q2?q0q3)2(q0q2+q1q3)2(q1q2+q0q3)2(q20+q22)?12(q2q3?q0q1)2(q1q3?q0q2)2(q0q1+q2q3)2(q20+q23)?1????(2)
dcm->四元数
由(2)可得:
4q20?1=tr(R)4q0q1=R23?R324q0q2=R31?R134q0q3=R12?R21
于是:
q0=R11+R22+R33+1????????????????√2q1=R23?R324q0q2=R31?R134q0q3=R12?R214q0
四元数->欧拉角
绕X轴旋转
Rx=???1000cθ?sθ0sθcθ???
绕Y轴旋转
Ry=???cθ0sθ010?sθ0cθ???
绕Z轴旋转
Rz=???cθ?sθ0sθ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=???cyczsxsycz?cxszcxsycz+sxszcyszsxsysz+cxczcxsysz?sxcz?sysxcycxcy???
tan(θz)=R12R11sin(θy)=?R13tan(θx)=R23R33
若是小角转动,
R=???1?θzθyθz1?θx?θyθx1???=I?Θ(3)
其中Θ为反对称矩阵。可见小角度转动与转动顺序无关(即只与绕xyz各轴转过的角度有关,如果不是所有3轴都出现呢?)。
RyRxRz=???cycz?sxsysz?cxszsycz+sxcyszcysz+sxsyczcxczsysz?sxcycz?cxsysxcxcy???
运动学
角速度也是矢量,因此也适用于在坐标系间的变换。
ωbnb=Rbnωnnb
对于角速度的反对称矩阵表示,则是
Ωbnb=RbnΩnnbRnb
dcm微分方程推导:
Rbn˙=limδt→0Rbn(t+δt)?Rbn(t)δt
而Rbn(t+δt)是从Rbn(t)经过小转动(3)而来,即
Rbn˙=(I?Ωbnbδt)Rbn(t)?Rbn(t)δt=?ΩbnbRbn
其中Ωbnb是角速度ωbnb的反对称矩阵。
四元数微分方程的推导
有如下等式:
cos(θ)+sin(θ)n=eθn
其中n是单位矢量的四元数。证明在这
q˙(t)=limdt→0q(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
欧拉角微分方程推导:
ωbnb=ωbn1+ωb12+ωb2b(4)
而
ω1n1=???001???θz˙
ω212=???010???θy˙
ωb2b=???100???θx˙
ωbn1=Rb1ω1n1ωb12=Rb2ω212
都带入式(4),可得
ωbnb=???1000cx?sx?sysxcycxcy???????θx˙θy˙θz˙????
可得欧拉角微分方程:
????θx˙θy˙θz˙????=????100sxtycxsxcycxty?sxcxcy????ωbnb
考虑陀螺仪角速度误差的四元数更新方程:
qk+1=Φkqk+wk
其中
wk=?Δt2Ξk?k
?k是角速度误差
Ξk=[?QT[Q×]+q0I3×3]
以上是关于四元数的主要内容,如果未能解决你的问题,请参考以下文章
Unity复杂的旋转-欧拉角和四元数
基于四元数的 3D 相机应该累积四元数还是欧拉角?
四元数和归一化
欧拉角到四元数然后四元数到欧拉角
怎么把向量转化为四元数或欧拉角
四元数法