常见的姿态的表示有欧拉角,四元数,旋转矩阵三种方式。其中欧拉角的表示是最直观的,
说白的就是给人看的。但是欧拉角这个东西有很多问题。
1. 万向锁死结
2. 定义是有先后旋转顺序的
3. 空间的姿态是用旋转表示的,应该用乘法。
由此,在工程中,很多时候都是采用四元数的方式进行运算,原因在于:
- 四元数不存在奇异问题,也就是没有万向锁死结的问题
- 四元数采用四个数来表示旋转,相比旋转矩阵,结构更紧凑
- 从IMU中读取到的数据,通常采用秦永元老师的方法求解出姿态数据,而此时的姿态数据是采用四元数进行表示的
但是,四元数具有二义性的问题。这里要展开说明一下:
首先,定义四元数
q
=
[
q
0
(
t
)
q
v
T
(
t
)
]
T
∈
R
×
R
3
×
1
q = \begin{bmatrix} q_0(t) & q^T_v(t) \end{bmatrix}^T \in \mathbb{R \times R}^{3\times 1}
q=[q0(t)qvT(t)]T∈R×R3×1, 其中
q
0
(
t
)
q_0(t)
q0(t) 表示四元数的实数部分,
q
v
(
t
)
q_v(t)
qv(t)表示虚数部分。另一方面,四元数还可以采用旋转轴和旋转角的方式来表示,即
q
0
(
t
)
=
c
o
s
(
θ
2
)
q
v
(
t
)
=
[
n
x
s
i
n
(
θ
2
)
n
y
s
i
n
(
θ
2
)
n
z
s
i
n
(
θ
2
)
]
q_0(t) = cos(\frac{\theta}{2}) \\ q_v(t) = \begin{bmatrix} n_x sin(\frac{\theta}{2}) \\ n_y sin(\frac{\theta}{2}) \\ n_z sin(\frac{\theta}{2}) \\ \end{bmatrix}
q0(t)=cos(2θ)qv(t)=⎣⎡nxsin(2θ)nysin(2θ)nzsin(2θ)⎦⎤
其中,
n
=
[
n
x
n
y
n
z
]
n = \begin{bmatrix} n_x& n_y& n_z \end{bmatrix}
n=[nxnynz] 表示旋转轴,
θ
\theta
θ表示旋转角。
另外,四元数的共轭,也就是实部相等,虚部相反的四元数。
四元数的逆,由于四元数的模值为1,所以等于四元数的共轭。
我们来看一下,四元数的逆
虚部相反之后,我们可以理解为旋转轴反向了。同时,又由于
s
i
n
(
2
π
−
θ
2
)
=
s
i
n
(
θ
2
)
sin(\frac{2\pi - \theta}{2}) = sin(\frac{\theta}{2})
sin(22π−θ)=sin(2θ),所以我们可以理解为绕着相反的旋转轴直接旋转
2
π
−
θ
2\pi-\theta
2π−θ的角度,而这种情况下正好和之前的旋转方向相反,旋转角度总和和
2
π
2\pi
2π。而四元数的逆本身表示反向旋转。那么就会出现一个有趣的现象:
即同一个四元数表示绕着旋转轴旋转了
θ
\theta
θ 以及
2
π
−
θ
2\pi -\theta
2π−θ。
而旋转矩阵的控制方式的没有上述问题,但是旋转矩阵的计算方法采用的是一个
3
×
3
3\times 3
3×3的矩阵进行运算,针对三个姿态角,九个数据来进行表示,是一种冗余表示,且旋转矩阵
R
R
R是一个具有自约束的矩阵,在控制设计中多才采用的是矩阵运行,证明较为复杂。