欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

欧拉角表示姿态角

程序员文章站 2022-04-18 23:17:10
...
欧拉角和四元数是惯性导航过程的旋转表达方式,但如果你尝试过去理解四元数的话,刚开始学习的你会发现这完全不是让人去理解的东西,能不能有一套说人话的东西存在,这东西真的存在,那就是存在一定问题但让人理解的欧拉角。

下图是*中直观表示欧拉角旋转的图像
欧拉角表示姿态角
欧拉角表示的是沿着坐标轴进行旋转的方式,图示为先沿着z轴旋转,再沿着旋转后得到新的坐标系1的x轴旋转,再沿着旋转后得到的坐标系2的y轴旋转。

在实际的口语表达中,xyz三个轴可以用第一个轴、第二个轴、第三个轴进行代替,所以上述旋转过程可以理解为沿第个轴旋转,再沿第个轴转,再沿第个轴转,这就是我们日常或者教科书中312旋转方法的来历。

需要注意的是旋转是沿着上一个轴旋转后生成的新轴进行旋转的,这是欧拉角的核心,如果弄混记成都沿着n系下的轴进行旋转,那样你会得到一个完全不一样的旋转结果,并且很难进行旋转矩阵的求解,也就是很难去表示。

下面先介绍按照旋转后的坐标对应关系,首先说沿z轴旋转后的1系与原来坐标系n系之间的对应关系。

无论怎么旋转,三维空间中的坐标系均可以用一个过渡矩阵进行变换,所以 x n = C 1 n x 1 x^n=C_1^nx^1 xn=C1nx1 C 1 n C_1^n C1n也可以利用一个3x3的矩阵进行表示。
欧拉角表示姿态角

易知 C n 1 = { c o s ( ψ ) s i n ( ψ ) 0 − s i n ( ψ ) c o s ( ψ ) 0 0 0 1 } C_n^1=\left\{ \begin{matrix} cos(\psi) & sin(\psi) & 0 \\ -sin(\psi) & cos(\psi) & 0 \\ 0 & 0 & 1 \end{matrix} \right\} Cn1=cos(ψ)sin(ψ)0sin(ψ)cos(ψ)0001,此时需要知道 ψ \psi ψ是偏航角,且以北偏西为正。
同理得到 C 1 2 = { 1 0 0 0 c o s ( θ ) s i n ( θ ) 0 − s i n ( θ ) c o s ( θ ) } C_1^2=\left\{ \begin{matrix} 1 & 0 & 0 \\ 0 & cos(\theta) & sin(\theta) \\ 0 & -sin(\theta) & cos(\theta) \\ \end{matrix} \right\} C12=1000cos(θ)sin(θ)0sin(θ)cos(θ) C 2 n = { c o s ( γ ) 0 − s i n ( γ ) 0 1 0 s i n ( γ ) 0 c o s ( γ ) } C_2^n=\left\{ \begin{matrix} cos(\gamma) & 0 & -sin(\gamma) \\ 0 & 1 & 0 \\ sin(\gamma) & 0& cos(\gamma) \\ \end{matrix} \right\} C2n=cos(γ)0sin(γ)010sin(γ)0cos(γ)

这三个矩阵在对角线的正负上可能与书上有所不一样,这是因为书上对 ψ \psi ψ的定义是北偏东为正,本文中的欧拉角转动均严格符合右手定则。

所以 C n b = C 2 b C 1 2 C n 1 = { c o s ( γ ) c o s ( ψ ) − s i n ( γ ) s i n ( ψ ) s i n ( θ ) c o s ( γ ) s i n ( ψ ) + s i n ( γ ) c o s ( ψ ) s i n ( θ ) − s i n ( γ ) c o s ( θ ) − s i n ( ψ ) c o s ( θ ) c o s ( ψ ) c o s ( θ ) s i n ( θ ) s i n ( γ ) c o s ( ψ ) + c o s ( γ ) s i n ( ψ ) s i n ( θ ) s i n ( γ ) s i n ( ψ ) − c o s ( γ ) c o s ( ψ ) s i n ( θ ) c o s ( γ ) c o s ( θ ) } C_n^b=C_2^bC_1^2C_n^1= \left\{ \begin{matrix} cos(\gamma)cos(\psi)-sin(\gamma)sin(\psi )sin(\theta) & cos(\gamma)sin(\psi)+sin(\gamma)cos(\psi)sin(\theta) & -sin(\gamma)cos(\theta) \\ -sin(\psi)cos(\theta) & cos(\psi)cos(\theta) & sin(\theta) \\ sin(\gamma)cos(\psi)+cos(\gamma)sin(\psi)sin(\theta) & sin(\gamma)sin(\psi)-cos(\gamma)cos(\psi)sin(\theta)& cos(\gamma)cos(\theta) \\ \end{matrix} \right\} Cnb=C2bC12Cn1=cos(γ)cos(ψ)sin(γ)sin(ψ)sin(θ)sin(ψ)cos(θ)sin(γ)cos(ψ)+cos(γ)sin(ψ)sin(θ)cos(γ)sin(ψ)+sin(γ)cos(ψ)sin(θ)cos(ψ)cos(θ)sin(γ)sin(ψ)cos(γ)cos(ψ)sin(θ)sin(γ)cos(θ)sin(θ)cos(γ)cos(θ)
这就是从欧拉角到旋转矩阵的变换公式,但是大多数情况下我们都是有旋转矩阵然后反向求欧拉角,从上边式子中观察,找到求欧拉角的方法。

将矩阵 C n b C_n^b Cnb C C C表示,则由 C 23 = s i n ( θ ) C_{23}=sin(\theta) C23=sin(θ)可知, θ = a r c s i n ( C 23 ) \theta=arcsin(C_{23}) θ=arcsin(C23)
同样在上述矩阵表达式上倒推,易知 γ = − a t a n 2 ( C 13 , C 33 ) \gamma=-atan2(C_{13},C_{33}) γ=atan2(C13,C33) ψ = − a t a n 2 ( C 21 , C 22 ) \psi=-atan2(C_{21},C_{22}) ψ=atan2(C21,C22)

但上边这个式子一般是在 ∣ C 23 ∣ < 0.9999999 |C_{23}|<0.9999999 C23<0.9999999时成立,因为若 ∣ C 23 ∣ = 1 |C_{23}|=1 C23=1,则 θ = π / 2 \theta=\pi/2 θ=π/2,此时出现了欧拉角的万向锁情况,此类情况下 ψ , γ \psi,\gamma ψ,γ不唯一,只能在确定一个值得情况下确定另外一个,所以我们可以任意指定一个值,从而确定另外一个,一般情况下指定 ψ = 0 \psi=0 ψ=0,此时 γ = a t a n 2 ( C 31 , C 11 ) \gamma=atan2(C_{31},C_{11}) γ=atan2(C31,C11)

相关标签: 惯性导航