PX4旋翼姿态控制(1)-外环角度控制
版本:V1.9.0;
源码位置:~\src\modules\ma_att_control\ma_att_control_main.cpp;
旋翼姿态控制分为两部分,第一部分是外环角度控制,通过偏差角度作为输入得到期望角速率输入到内环角速率控制,这里先来解释外环控制。
1. 控制流程
旋翼在得到期望姿态四元数的时候不是立刻转化为角速率,而是类似于固定翼的纵向和横航向分离一样,四旋翼采用倾斜和旋转分离。倾斜就是将坐标轴Z轴对齐,包含俯仰和滚转,对于四旋翼而言,只需改变升力差即可,响应速度较快;滚转需要提供反力矩,因此相应时间较长,故采取倾转分离策略。
2. 基础知识(四元数和旋转矩阵)
- 四元数
q
=
q
0
+
q
1
i
+
q
2
j
+
q
3
k
q=q_0+q_1i+q_2j+q_3k
q=q0+q1i+q2j+q3k;也可以写成向量形式
q
=
[
q
0
q
1
q
2
q
3
]
q=[q_0 q_1 q_2 q_3]
q=[q0 q1 q2 q3];对于单位四元数(
q
0
2
+
q
1
2
+
q
2
2
+
q
3
2
=
1
q_0^2+q_1^2+q_2^2+q_3^2=1
q02+q12+q22+q32=1)还可以写成
q
=
[
cos
(
θ
)
sin
(
θ
)
v
⃗
]
q=[\cos(\theta) \sin(\theta)\vec{v}]
q=[cos(θ) sin(θ)v],其中
v
⃗
\vec{v}
v是单位向量。
有关四元数的基本运算可以参考其他资料,这里单列一个后文用得到的公式:
q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 q^{-1}=\frac{q^*}{||q||^2} q−1=∣∣q∣∣2q∗
其中 q − 1 = q^{-1}= q−1=是四元数的逆, q ∗ = [ cos ( θ ) − sin ( θ ) v ⃗ ] = [ q 0 − q 1 − q 2 − q 3 ] q^*=[\cos(\theta) -\sin(\theta)\vec{v}]=[q_0 -q_1 -q_2 -q_3] q∗=[cos(θ) −sin(θ)v]=[q0 −q1 −q2 −q3]是四元数的共轭, ∣ ∣ q ∣ ∣ = q 0 2 + q 1 2 + q 2 2 + q 3 2 ||q||=\sqrt{q_0^2+q_1^2+q_2^2+q_3^2} ∣∣q∣∣=q02+q12+q22+q32是四元数的模。因此对于单位四元数 q u q_u qu有:
q u − 1 = q u ∗ q_u^{-1}=q_u^* qu−1=qu∗
2.1 向量旋转,坐标系旋转、坐标变换与四元数
这部分我之前一直有疑惑,现在整理出来。
本段的参考文献是程国彩的《四元数法及其应用》。
- 四元数表示向量的旋转
对于一个向量 R ⃗ = ( r 1 , r 2 , r 3 ) \vec{R}=(r_1,r_2,r_3) R=(r1,r2,r3),如果他绕着某个轴 V ⃗ \vec{V} V旋转 θ \theta θ角之后得到向量 R ′ ⃗ = ( r 1 ′ , r 2 ′ , r 3 ′ ) \vec{R'}=(r_1',r_2',r_3') R′=(r1′,r2′,r3′),则可以构造下面这个四元数:
q = [ cos ( θ / 2 ) sin ( θ / 2 ) ∗ V ⃗ ] q=[\cos(\theta/2) \sin(\theta/2)*\vec{V}] q=[cos(θ/2) sin(θ/2)∗V]
然后就可以得到这么一个关系式:
R ′ ⃗ = q ∗ R ⃗ ∗ q − 1 \vec{R'}=q*\vec{R}*q^{-1} R′=q∗R∗q−1
结合四元数乘法就可以得到四元数表示的向量旋转矩阵:
[ r 1 ′ r 2 ′ r 3 ′ ] = [ q 0 2 + q 1 2 − q 2 2 − q 3 2 2 ( q 1 q 2 − 2 q 0 q 3 ) 2 ( q 1 q 3 + 2 q 0 q 2 ) 2 ( q 1 q 2 + 2 q 0 q 3 ) q 0 2 + q 2 2 − q 1 2 − q 3 2 2 ( q 2 q 3 − 2 q 0 q 1 ) 2 ( q 1 q 3 − 2 q 0 q 2 ) 2 ( q 2 q 3 + 2 q 0 q 1 ) q 0 2 + q 3 3 − q 1 2 − q 2 2 ] ∗ [ r 1 r 2 r 3 ] \begin{bmatrix}r_1'\\r_2'\\r_3'\end{bmatrix}=\left[\begin{array}{lll}{q_{0}^2+q_{1}^2-q_{2}^{2}-q_{3}^{2}} & {2( q_{1} q_{2}-2 q_{0} q_{3}}) & {2( q_{1} q_{3}+2 q_{0} q_{2}}) \\ {2( q_{1} q_{2}+2 q_{0} q_{3}} )& {q_{0}^2+q_{2}^2-q_{1}^{2}-q_{3}^{2}} & {2 (q_{2} q_{3}-2 q_{0} q_{1}}) \\ {2 (q_{1} q_{3}-2 q_{0} q_{2}}) & {2 (q_{2} q_{3}+2 q_{0} q_{1}}) & {q_{0}^2+q_{3}^3- q_{1}^{2}- q_{2}^{2}}\end{array}\right]*\begin{bmatrix}r_1\\r_2\\r_3\end{bmatrix} ⎣⎡r1′r2′r3′⎦⎤=⎣⎡q02+q12−q22−q322(q1q2+2q0q3)2(q1q3−2q0q2)2(q1q2−2q0q3)q02+q22−q12−q322(q2q3+2q0q1)2(q1q3+2q0q2)2(q2q3−2q0q1)q02+q33−q12−q22⎦⎤∗⎣⎡r1r2r3⎦⎤
这里面所有的向量都表示在同一个坐标系下。 - 四元数表示坐标系旋转
对于一个坐标系 I ( 基 为 i 1 , i 2 , i 3 ) I(基为i_1,i_2,i_3) I(基为i1,i2,i3),如果他绕着某个轴 V ⃗ \vec{V} V旋转 θ \theta θ角之后得到坐标系 e ( 基 为 e 1 , e 2 , e 3 ) e(基为e_1,e_2,e_3) e(基为e1,e2,e3),则可以构造下面这个四元数:
q = [ cos ( θ / 2 ) sin ( θ / 2 ) ∗ V ⃗ ] q=[\cos(\theta/2) \sin(\theta/2)*\vec{V}] q=[cos(θ/2) sin(θ/2)∗V]
然后就可以得到这么一个关系式:
[ e 1 e 2 e 3 ] = [ q 0 2 + q 1 2 − q 2 2 − q 3 2 2 ( q 1 q 2 + 2 q 0 q 3 ) 2 ( q 1 q 3 − 2 q 0 q 2 ) 2 ( q 1 q 2 − 2 q 0 q 3 ) q 0 2 + q 2 2 − q 1 2 − q 3 2 2 ( q 2 q 3 + 2 q 0 q 1 ) 2 ( q 1 q 3 + 2 q 0 q 2 ) 2 ( q 2 q 3 − 2 q 0 q 1 ) q 0 2 + q 3 3 − q 1 2 − q 2 2 ] ∗ [ i 1 i 2 i 3 ] \begin{bmatrix}e_1\\e_2\\e_3\end{bmatrix}=\left[\begin{array}{lll}{q_{0}^2+q_{1}^2-q_{2}^{2}-q_{3}^{2}} & {2 (q_{1} q_{2}+2 q_{0} q_{3}} )& {2 (q_{1} q_{3}-2 q_{0} q_{2}} )\\ {2( q_{1} q_{2}-2 q_{0} q_{3}} )& {q_{0}^2+q_{2}^2-q_{1}^{2}-q_{3}^{2}} & {2( q_{2} q_{3}+2 q_{0} q_{1}} )\\ {2 (q_{1} q_{3}+2 q_{0} q_{2}}) & {2( q_{2} q_{3}-2 q_{0} q_{1}}) & {q_{0}^2+q_{3}^3- q_{1}^{2}- q_{2}^{2}}\end{array}\right]*\begin{bmatrix}i_1\\i_2\\i_3\end{bmatrix} ⎣⎡e1e2e3⎦⎤=⎣⎡q02+q12−q22−q322(q1q2−2q0q3)2(q1q3+2q0q2)2(q1q2+2q0q3)q02+q22−q12−q322(q2q3−2q0q1)2(q1q3−2q0q2)2(q2q3+2q0q1)q02+q33−q12−q22⎦⎤∗⎣⎡i1i2i3⎦⎤
这就是由四元数表示的坐标系旋转矩阵,可以看到这个和向量旋转矩阵正好互为专制。这里面所有的向量都是在 I I I坐标系下面。 - 坐标变换
在这里我找到了我疑惑的解答坐标变换矩阵就是坐标系旋转矩阵。即我们可以得到下面的式子
R E ⃗ = q − 1 ∗ R I ⃗ ∗ q \vec{R_E}=q^{-1}*\vec{R_I}*q RE=q−1∗RI∗q
这里的 R E ⃗ \vec{R_E} RE是联系于坐标系 E E E的四元数, R I ⃗ \vec{R_I} RI是联系于坐标系 I I I的四元数。
这里解释一下为什么,我们以二位坐标系为例
首先我们把这个等式看成是向量的旋转,因此我们有:
v 2 ⃗ = q − 1 ∗ v 1 ⃗ ∗ q \vec{v_2}=q^{-1}*\vec{v_1}*q v2=q−1∗v1∗q
由于向量旋转矩阵和坐标变换矩阵是互为转置,因此这里的 v 2 ⃗ \vec{v_2} v2是 v 1 ⃗ \vec{v_1} v1朝反方向旋转 θ / 2 \theta/2 θ/2得到的,这时得到的 v 2 ⃗ \vec{v_2} v2是在 I I I坐标系下,而他的坐标值又等于 v ⃗ 1 \vec{v}_1 v1在 E E E坐标系下的值,因此可以得到这个变换就是坐标变换,把同一个向量映射到不同的坐标系中。 - 旋转的叠加
假设 q 1 q_1 q1代表旋转为 q a b q_a^b qab(坐标系a转化到坐标系b), q 2 q_2 q2代表旋转为 q b c q_b^c qbc(坐标系b转化到坐标系c),那么可得
q 3 = q 2 ∗ q 1 = q b c ∗ q a b = q a c q_3=q_2*q_1=q_b^c*q_a^b=q_a^c q3=q2∗q1=qbc∗qab=qac
因此 q 3 q_3 q3就代表由坐标系a转化到c的旋转矩阵。
3. 符号说明
由于后文涉及到的符号较多,故在此具体说明。
符号 | 说明 |
---|---|
N | 机载NED坐标系 |
B | 机体坐标系 |
T | 目标坐标系 |
M | 中间坐标系,就是完成了Z轴对齐,还差偏航 |
符号 | 说明 | 旋转矩阵 |
---|---|---|
q | B系向N系变换 | q ⃗ = q ⃗ B N \vec{q}=\vec{q}_B^N q=qBN |
qd | T系向N系变换 | q ⃗ d = q ⃗ T N \vec{q}_d=\vec{q}_T^N qd=qTN |
qd_red | M系向N系变换 | q ⃗ d , r e d = q ⃗ M N \vec{q}_{d,red}=\vec{q}_M^N qd,red=qMN |
qd_mix | T系向M系变换 | q ⃗ d , m i x = q ⃗ T M \vec{q}_{d,mix}=\vec{q}_T^M qd,mix=qTM |
qd_tilt | M系向B系变换,转轴在N系 | q ⃗ d , t i l t = N q ⃗ M B \vec{q}_{d,tilt}=^N\vec{q}_M^B qd,tilt=NqMB |
qd_tilt’ | M系向B系变换,转轴在B系或者M系 | q ⃗ d , t i l t ′ = q ⃗ M B \vec{q}_{d,tilt}'=\vec{q}_M^B qd,tilt′=qMB |
最终使用的链式旋转公式
q
⃗
d
=
q
⃗
T
N
=
q
⃗
M
N
∗
q
⃗
T
M
=
q
⃗
d
,
r
e
d
∗
q
⃗
d
,
m
i
x
(1)
\vec{q}_d=\vec{q}_T^N=\vec{q}_M^N*\vec{q}_T^M=\vec{q}_{d,red}*\vec{q}_{d,mix}\tag{1}
qd=qTN=qMN∗qTM=qd,red∗qd,mix(1)
4. 控制过程(理论公式)
对于一个飞行器,最开始我们只知道他当前的姿态四元数
q
q
q和目标姿态四元数
q
d
q_d
qd.
假设
q
=
[
q
0
q
1
q
2
q
3
]
,
q
d
=
[
q
0
d
q
1
d
q
2
d
q
3
d
]
q=[q_0 q_1 q_2 q_3],q_d=[q_{0d} q_{1d} q_{2d} q_{3d}]
q=[q0 q1 q2 q3],qd=[q0d q1d q2d q3d]
- 获取当前姿态和目标姿态Z轴在NED坐标系下的表示(
N
e
⃗
z
B
,
N
e
⃗
z
d
B
^N\vec{e}_z^B,^N\vec{e}_{zd}^B
NezB,NezdB)
根据四元数和旋转矩阵的关系可以得到
N e ⃗ z B = [ 2 ( q 0 q 2 + q 1 q 3 ) 2 ( q 2 q 3 − q 0 q 1 ) 2 ( q 0 2 − q 1 2 − q 2 2 + q 3 2 ) ] ^{N} \vec{e}_{z}^{B}=\left[\begin{array}{c}{2\left(q_{0} q_{2}+q_{1} q_{3}\right)} \\ {2\left(q_{2} q_{3}-q_{0} q_{1}\right)} \\ {2\left(q_{0}^{2}-q_{1}^{2}-q_{2}^{2}+q_{3}^{2}\right)}\end{array}\right] NezB=⎣⎡2(q0q2+q1q3)2(q2q3−q0q1)2(q02−q12−q22+q32)⎦⎤
N e ⃗ z d B = [ 2 ( q 0 d q 2 d + q 1 d q 3 d ) 2 ( q 2 d q 3 d − q 0 d q 1 d ) 2 ( q 0 d 2 − q 1 d 2 − q 2 d 2 + q 3 d 2 ) ] ^N \vec{e}_{z d}^{B}=\left[\begin{array}{c}{2\left(q_{ 0d} q_{2d}+q_{1d} q_{3d}\right)} \\ {2\left(q_{2d} q_{3d}-q_{0d} q_{1d}\right)} \\ {2\left(q_{0d}^{2}-q_{1d}^{2}-q_{2d}^{2}+q_{3d}^{2}\right)}\end{array}\right] NezdB=⎣⎡2(q0dq2d+q1dq3d)2(q2dq3d−q0dq1d)2(q0d2−q1d2−q2d2+q3d2)⎦⎤
注意这里第二项是相减,对应书上公式(1.85),因此对应的是坐标系的旋转,所以变换完了之后相当于是在NED轴系下。 - 获取机体轴(B)到过渡轴(M)的旋转四元数(
q
⃗
M
B
\vec{q}_M^B
qMB)
知道上面两个坐标轴之后,B轴旋转到M轴相当于绕两个向量叉乘的轴线旋转两个向量两个向量的夹角,因此很容易得出四元数 q ⃗ B M \vec{q}_B^M qBM:
α = arccos ( N e ⃗ z B , N e ⃗ z d B ) \alpha=\arccos \left(^{N} \vec{e}_{z}^{B}, ^{N}{\vec{e}}_{z d}^{B}\right) α=arccos(NezB,NezdB)
q ⃗ d , tilt = ( cos ( α / 2 ) sin ( α / 2 ) N e ⃗ z B × N e ⃗ z d B ∥ N e ⃗ z B × N e ⃗ z d B ∥ ) \vec{q}_{d,\text { tilt }}=\left(\begin{array}{c}{\cos (\alpha / 2)} \\ {\sin (\alpha / 2) \frac{^{N} \vec{e}_{z}^{B} \times^{N} \vec{e}_{z d}^{B}}{\left\|^{N} \vec{e}_{z}^{B} \times^{N} \vec{e}_{z d}^{B}\right\|}}\end{array}\right) qd, tilt =(cos(α/2)sin(α/2)∥NezB×NezdB∥NezB×NezdB)
由于这个四元数表示的旋转轴是在N系下表示的,需要转化到B系,有下面公式:
q ⃗ d , tilt ′ = q ⃗ N B ⋅ q ⃗ d , t i l t ⋅ ( q ⃗ N B ) ∗ = q ⃗ − 1 ⋅ q ⃗ d , t i l t ⋅ q ⃗ \vec{q}_{d, \text { tilt }}^{\prime}=\vec{q}_{N}^{B} \cdot \vec{q}_{d,{\mathrm{tilt}}} \cdot\left(\vec{q}_{N}^{B}\right)^{*}=\vec{q}^{-1} \cdot \vec{q}_{d,{\mathrm{tilt}}} \cdot \vec{q} qd, tilt ′=qNB⋅qd,tilt⋅(qNB)∗=q−1⋅qd,tilt⋅q - 得到表示倾斜运动的四元数(
q
⃗
d
,
r
e
d
\vec{q}_{d,red}
qd,red)
q ⃗ d , r e d = q ⃗ ⋅ q ⃗ − 1 ⋅ q ⃗ d , t i l t ⋅ q ⃗ = q ⃗ d , t i l t ⋅ q ⃗ \vec{q}_{d, \mathrm{red}}=\vec{q} \cdot \vec{q}^{-1} \cdot \vec{q}_{d,{\mathrm{tilt}}} \cdot \vec{q}=\vec{q}_{d,{\mathrm{tilt}}} \cdot \vec{q} qd,red=q⋅q−1⋅qd,tilt⋅q=qd,tilt⋅q - 得到表示旋转运动的四元数(
q
⃗
d
,
m
i
x
\vec{q}_{d,mix}
qd,mix)
q ⃗ d , m i x = ( q ⃗ d , red ) − 1 ⋅ q ⃗ d \vec{q}_{d, m i x}=\left(\vec{q}_{d, \text { red }}\right)^{-1} \cdot \vec{q}_{d} qd,mix=(qd, red )−1⋅qd
根据前文的四元数几何意义,旋转运动又只是绕着Z轴旋转,因此上面的四元数可以表示成:
q ⃗ d , m i x = [ cos α mix 2 0 0 sin α mix 2 ] T \vec{q}_{d, m i x}=\left[\cos \frac{\alpha_{\operatorname{mix}}}{2} \quad 0 \quad 0 \quad \sin \frac{\alpha_{\operatorname{mix}}}{2}\right]^{\mathrm{T}} qd,mix=[cos2αmix00sin2αmix]T
加上限制就有
q ⃗ d , m i x = [ k cos α mix 2 0 0 k sin α mix 2 ] T , k ∈ [ 0 , 1 ] \vec{q}_{d, m i x}=\left[k\cos \frac{\alpha_{\operatorname{mix}}}{2} \quad 0 \quad 0 \quad k\sin \frac{\alpha_{\operatorname{mix}}}{2}\right]^{\mathrm{T}},k\in [0,1] qd,mix=[kcos2αmix00ksin2αmix]T,k∈[0,1] - 得到最终期望四元数(
q
⃗
d
′
\vec{q}_d'
qd′)
q ⃗ d ′ = q ⃗ d , r e d ∗ q ⃗ d , m i x ′ \vec{q}'_d=\vec{q}_{d,red}*\vec{q}_{d,mix}' qd′=qd,red∗qd,mix′ - 计算误差
四元数误差为:
q ⃗ e d ′ = q ⃗ − 1 ∗ q ⃗ d ′ q ⃗ T B = q ⃗ N B ∗ q ⃗ T N \vec{q}_{ed}'=\vec{q}^{-1}*\vec{q}_d'\\ \vec{q}_T^B=\vec{q}_N^B*\vec{q}_T^N qed′=q−1∗qd′qTB=qNB∗qTN
这个误差还可以表示成:
q ⃗ e d ′ = [ cos α 2 sin α 2 r ⃗ B ] \vec{q}_{ed}^{\prime}=\left[\begin{array}{c}{\cos \frac{\alpha}{2}} \\ {\sin \frac{\alpha}{2} \vec{r}^B}\end{array}\right] qed′=[cos2αsin2αrB]
根据前面介绍可以知道,这个四元数表示的是B轴系旋转到N轴系。其中向量 r ⃗ B = ( x 0 , y 0 , z 0 ) \vec{r}^B=(x_0,y_0,z_0) rB=(x0,y0,z0)是B轴系下的一个向量,将其投影到坐标轴上就可以把误差四元数表示成
q ⃗ e d ′ = [ cos ( α 2 ) sin ( α 2 ) ∗ x 0 ∗ i sin ( α 2 ) ∗ y 0 ∗ j sin ( α 2 ) ∗ z 0 ∗ k ] \vec{q}_{ed}'=\begin{bmatrix}\cos(\frac{\alpha}{2})\\\sin(\frac{\alpha}{2})*x_0*i\\\sin(\frac{\alpha}{2})*y_0*j\\\sin(\frac{\alpha}{2})*z_0*k\end{bmatrix} qed′=⎣⎢⎢⎡cos(2α)sin(2α)∗x0∗isin(2α)∗y0∗jsin(2α)∗z0∗k⎦⎥⎥⎤
这表明误差四元数的虚部就是期望的角度。
φ ⃗ d = [ q 1 q 2 q 3 ] \vec{\varphi}_d=[q_1 q_2 q_3] φd=[q1 q2 q3] - 设计控制律
得到角度差 φ ⃗ d \vec{\varphi}_{d} φd之后加一个比例环节得到角速度 ω ⃗ d \vec{\omega}_{d} ωd,再加上一个前馈,其作为内环控制率进行控制,公式如下:
e φ ⃗ = φ ⃗ d − φ ⃗ 0 \vec{e_\varphi}=\vec{\varphi}_{d}-\vec{\varphi}_{0} eφ=φd−φ0
ω ⃗ d = K φ p e ⃗ φ + K f f ω ⃗ d z \vec{\omega}_{d}=K_{\varphi p} \vec{e}_{\varphi}+K_{f f} \vec{\omega}_{dz} ωd=Kφpeφ+Kffωdz
注:
这部分主要参照的是PX4姿态控制算法详解
但是那篇文章有一些问题,这里进行了修正,主要就是对于四元数 q d , t i l t q_{d,tilt} qd,tilt应该是M系向B系变换,经过自己的思考之后才明白是为什么,具体原因正如上文2.1 向量旋转,坐标系旋转、坐标变换与四元数。
在代码中,四元数 q d , t i l t q_{d,tilt} qd,tilt表示的是向量 e ⃗ z \vec{e}_z ez到向量 e ⃗ z d \vec{e}_{zd} ezd的旋转,其中向量 e ⃗ z \vec{e}_z ez在 B B B系, e ⃗ z d \vec{e}_{zd} ezd在 M M M系,也就是这个向量表示的是向量的旋转,根据前文可以得到,由于表示向量旋转和坐标系变换的四元数互为共轭,因此这个四元数表示的是从 M M M坐标系到 B B B坐标系的变换。