算法:姿态解算:四元数
本文目的
介绍四元数姿态解算,四元数基本运算(写完),四元数应用(写完),角速度如何积分得到四元数(还没写),以及如何转化为欧拉角(还没写)
前置知识点
- 线性代数基本知识,比如矩阵乘法,向量叉乘等
四元数简介
参考B站《3B1B的四元数相关理论知识》
- 类比复数有一个虚部,四元数有三个虚部,本质上是四维空间的向量(不写)。
- 单位四元数在几何意义上是四维超球在三维空间中的投影(不写)。
- 单位四元数的乘法可以表征旋转。
- 单位四元数可以表征物体在空间的姿态。
四元数在姿态解算中的使用
1. 四元数定义(先背下来后面才好理解)
q
⃗
=
q
0
+
q
1
i
+
q
2
j
+
q
3
k
=
q
0
+
v
⃗
(1)
\vec{q} = q_0 + q_1i+q_2j+q_3k = q_0+\vec{v} \tag{1}
q=q0+q1i+q2j+q3k=q0+v(1)
用矩阵表示为
q
⃗
=
[
q
0
q
1
q
2
q
3
]
(2)
\vec{q}=\begin{bmatrix} q_0\\q_1\\q_2\\q_3\end{bmatrix}\tag{2}
q=
q0q1q2q3
(2)
其中有乘法关系有
i
2
=
j
2
=
k
2
=
−
1
i
j
=
−
j
i
=
k
j
k
=
−
k
j
=
i
k
i
=
−
k
i
=
j
(3)
\begin{matrix} i^2=j^2=k^2=-1\\ ij=-ji=k\\ jk=-kj=i\\ ki=-ki=j\\ \end{matrix}\tag{3}
i2=j2=k2=−1ij=−ji=kjk=−kj=iki=−ki=j(3)
四元数不满足交换律即
q
1
⃗
q
2
⃗
≠
q
2
⃗
q
1
⃗
(4)
\vec{q_1}\vec{q_2}\neq\vec{q_2}\vec{q_1}\tag{4}
q1q2=q2q1(4)
在单位四元数(模长为1的情况下)有单位四元数的共轭等于求逆:
(
q
⃗
)
∗
=
(
q
⃗
)
−
1
(5)
(\vec{q})^{*}=(\vec{q})^{-1}\tag{5}
(q)∗=(q)−1(5)
2. 四元数乘法的矩阵形式
- 四元数
q
⃗
\vec{q}
q左乘
p
⃗
\vec{p}
p
p ⃗ q ⃗ = [ p 0 − p 1 − p 2 − p 3 p 1 p 0 − p 3 p 2 p 2 p 3 p 0 − p 1 p 3 − p 2 p 1 p 0 ] [ q 0 q 1 q 2 q 3 ] (6) \vec{p}\vec{q} = \begin{bmatrix} p_0&-p_1&-p_2&-p_3\\ p_1&p_0&-p_3&p_2\\ p_2&p_3&p_0&-p_1\\ p_3&-p_2&p_1&p_0\\ \end{bmatrix}\begin{bmatrix}q_0\\q_1\\q_2\\q_3\end{bmatrix}\tag{6} pq= p0p1p2p3−p1p0p3−p2−p2−p3p0p1−p3p2−p1p0 q0q1q2q3 (6) - 四元数
q
⃗
\vec{q}
q右乘
p
⃗
\vec{p}
p
q ⃗ p ⃗ = [ p 0 − p 1 − p 2 − p 3 p 1 p 0 p 3 − p 2 p 2 − p 3 p 0 p 1 p 3 p 2 − p 1 p 0 ] [ q 0 q 1 q 2 q 3 ] (7) \vec{q}\vec{p} = \begin{bmatrix} p_0&-p_1&-p_2&-p_3\\ p_1&p_0&p_3&-p_2\\ p_2&-p_3&p_0&p_1\\ p_3&p_2&-p_1&p_0\\ \end{bmatrix}\begin{bmatrix}q_0\\q_1\\q_2\\q_3\end{bmatrix}\tag{7} qp= p0p1p2p3−p1p0−p3p2−p2p3p0−p1−p3−p2p1p0 q0q1q2q3 (7)
3. 单位四元数乘法表示三维向量的旋转
单位四元数可以写成是三维向量
v
⃗
\vec{v}
v和一个标量的和
p
⃗
=
p
0
+
p
1
i
+
p
2
j
+
p
3
k
=
cos
θ
+
v
⃗
sin
θ
(8)
\vec{p} = p_0 + p_1i+p_2j+p_3k= \cos{\theta}+\vec{v}\sin{\theta} \tag{8}
p=p0+p1i+p2j+p3k=cosθ+vsinθ(8)
对于一个三维空间的表征方向的单位向量
u
⃗
\vec{u}
u,四元数的实部为0(第四维度没有值,就好像三维空间里面
z
=
0
z=0
z=0的时候变成二维向量一样)。
q
u
⃗
=
0
+
u
1
i
+
u
2
j
+
u
3
k
=
0
+
u
⃗
(9)
\vec{q_u} = 0 + u_1i+u_2j+u_3k =0+ \vec{u}\tag{9}
qu=0+u1i+u2j+u3k=0+u(9)
向量
u
⃗
\vec{u}
u围绕
v
⃗
\vec{v}
v所指向的方向轴,以右手定则顺时针旋转
θ
\theta
θ度得到的向量
u
′
⃗
\vec{u'}
u′,可以用如下计算式进行计算
q
u
′
⃗
=
p
⃗
q
u
⃗
p
⃗
∗
=
[
1
0
0
0
0
1
−
2
p
2
2
−
2
p
3
2
2
p
1
p
2
−
2
p
0
p
3
2
p
0
p
2
+
2
p
1
p
3
0
2
p
1
p
2
+
2
p
0
p
3
1
−
2
p
1
2
−
2
p
3
2
2
p
2
p
3
−
2
p
0
p
1
0
2
q
1
q
3
−
2
q
0
q
2
2
p
0
p
1
+
2
p
2
p
3
1
−
2
p
1
2
−
2
p
2
2
]
[
0
u
1
u
2
u
3
]
(10)
\vec{q_u'}=\vec{p}\vec{q_u}\vec{p}^*= \begin{bmatrix} 1&0&0&0\\ 0&1-2p_2^2-2p_3^2&2p_1p_2-2p_0p_3&2p_0p_2+2p_1p_3\\ 0&2p_1p_2+2p_0p_3&1-2p_1^2-2p_3^2&2p_2p_3-2p_0p_1\\ 0&2q_1q_3-2q_0q_2&2p_0p_1+2p_2p_3&1-2p_1^2-2p_2^2\\ \end{bmatrix}\begin{bmatrix}0\\u_1\\u_2\\u_3\end{bmatrix}\tag{10}
qu′=pqup∗=
100001−2p22−2p322p1p2+2p0p32q1q3−2q0q202p1p2−2p0p31−2p12−2p322p0p1+2p2p302p0p2+2p1p32p2p3−2p0p11−2p12−2p22
0u1u2u3
(10)
也就是说,只需要知道如下两个值,就可以求得旋转后的向量
u
′
⃗
\vec{u'}
u′指向哪里。
- 四元数 p ⃗ \vec{p} p(表征了旋转轴向量,旋转角度)
- 初始向量 u ⃗ \vec{u} u
观察上述公式,可以化简成三维矩阵的乘法,得到四元数表征旋转的最终式子
u
′
⃗
=
[
1
−
2
p
2
2
−
2
p
3
2
2
p
1
p
2
−
2
p
0
p
3
2
p
0
p
2
+
2
p
1
p
3
2
p
1
p
2
+
2
p
0
p
3
1
−
2
p
1
2
−
2
p
3
2
2
p
2
p
3
−
2
p
0
p
1
2
q
1
q
3
−
2
q
0
q
2
2
p
0
p
1
+
2
p
2
p
3
1
−
2
p
1
2
−
2
p
2
2
]
[
u
1
u
2
u
3
]
(11)
\vec{u'}= \begin{bmatrix} 1-2p_2^2-2p_3^2&2p_1p_2-2p_0p_3&2p_0p_2+2p_1p_3\\ 2p_1p_2+2p_0p_3&1-2p_1^2-2p_3^2&2p_2p_3-2p_0p_1\\ 2q_1q_3-2q_0q_2&2p_0p_1+2p_2p_3&1-2p_1^2-2p_2^2\\ \end{bmatrix}\begin{bmatrix}u_1\\u_2\\u_3\end{bmatrix}\tag{11}
u′=
1−2p22−2p322p1p2+2p0p32q1q3−2q0q22p1p2−2p0p31−2p12−2p322p0p1+2p2p32p0p2+2p1p32p2p3−2p0p11−2p12−2p22
u1u2u3
(11)
4. 四元数姿态表示法
4.1 先验知识
- 假设现在以物体本身建立一个xyz参考系,它和在世界参考系xyz相对位置就是他的姿态。
- 不考虑伸缩变换,只考虑相对转动。
- 两个坐标系的关系可以用过渡矩阵这一概念来进行描述
- 任意两个这样不考虑伸缩变换的坐标系,机体参考系的基向量可以由世界参考系的对应基向量按照世界参考系的某个轴向量旋转某个角度得到
4.2 推论
- 上文得知,四元数科研表征某个轴向量旋转某个角度,意味着可以使用四元数来描述机体参考系和世界参考系的相对旋转情况,也就是用四元数表示姿态。
- 四元数计算得到的三维矩阵,恰好就是过渡矩阵,也可以用来表征机体参考系和世界参考系的相对旋转情况,也就是用姿态矩阵来表征姿态。
- 这是一个可逆的过程,旋转矩阵,四元数,欧拉角可以相互换算
- 这个姿态矩阵是坐标系之间的关系,和旋转矩阵用法不太一样
4.3 求机体姿态的x,y,z基向量在世界参考系下的表示
把[1,0,0]左乘旋转矩阵可以得到机体x轴朝向
把[0,1,0]左乘旋转矩阵可以得到机体y轴朝向
把[0,0,1]左乘旋转矩阵可以得到机体z轴朝向
4.4 根据x,y,z基向量在世界参考系下的表示求姿态矩阵
3*3建立方程组,三个方程三个变量,很好求
4.5 欧拉角,四元数,姿态矩阵相互转换
先不写,有需要用到自己再补充
5. 其他
这篇blog还需要加一些图,晚点再画