欧拉角表示姿态角
欧拉角和四元数是惯性导航过程的旋转表达方式,但如果你尝试过去理解四元数的话,刚开始学习的你会发现这完全不是让人去理解的东西,能不能有一套说人话的东西存在,这东西真的存在,那就是存在一定问题但让人理解的欧拉角。
下图是*中直观表示欧拉角旋转的图像
欧拉角表示的是沿着坐标轴进行旋转的方式,图示为先沿着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(γ)010−sin(γ)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)
上一篇: ELKF日志管理平台搭建教程(四)-分析与可视化平台(Kibana)
下一篇: 图的存储方式学习笔记