PX4旋翼姿态控制(1)-角度控制


版本:V1.9.0;
源码位置:~\src\modules\ma_att_control\ma_att_control_main.cpp;
旋翼姿态控制分为两部分,第一部分是外环角度控制,通过偏差角度作为输入得到期望角速率输入到内环角速率控制,这里先来解释外环控制。


1. 控制流程

旋翼在得到期望姿态四元数的时候不是立刻转化为角速率,而是类似于固定翼的纵向和横航向分离一样,四旋翼采用倾斜和旋转分离。倾斜就是将坐标轴Z轴对齐,包含俯仰和滚转,对于四旋翼而言,只需改变升力差即可,响应速度较快;滚转需要提供反力矩,因此相应时间较长,故采取倾转分离策略。

2. 基础知识(四元数和旋转矩阵)

  1. 四元数 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} q1=q2q
    其中 q − 1 = q^{-1}= q1=是四元数的逆, 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^* qu1=qu

2.1 向量旋转,坐标系旋转、坐标变换与四元数

这部分我之前一直有疑惑,现在整理出来。
本段的参考文献是程国彩的《四元数法及其应用》。

  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 =qR q1
    结合四元数乘法就可以得到四元数表示的向量旋转矩阵:
    [ 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} r1r2r3=q02q12q22q322(q1q2+2q0q3)2(q1q32q0q2)2(q1q22q0q3)q02+q22q12q322(q2q3+2q0q1)2(q1q3+2q0q2)2(q2q32q0q1)q02+q33q12q22r1r2r3
    这里面所有的向量都表示在同一个坐标系下。
  2. 四元数表示坐标系旋转
    对于一个坐标系 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=q02q12q22q322(q1q22q0q3)2(q1q3+2q0q2)2(q1q2+2q0q3)q02+q22q12q322(q2q32q0q1)2(q1q32q0q2)2(q2q3+2q0q1)q02+q33q12q22i1i2i3
    这就是由四元数表示的坐标系旋转矩阵,可以看到这个和向量旋转矩阵正好互为专制。这里面所有的向量都是在 I I I坐标系下面。
  3. 坐标变换
    在这里我找到了我疑惑的解答坐标变换矩阵就是坐标系旋转矩阵。即我们可以得到下面的式子
    R E ⃗ = q − 1 ∗ R I ⃗ ∗ q \vec{R_E}=q^{-1}*\vec{R_I}*q RE =q1RI 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 =q1v1 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 v 1 E E E坐标系下的值,因此可以得到这个变换就是坐标变换,把同一个向量映射到不同的坐标系中。
  4. 旋转的叠加
    假设 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=q2q1=qbcqab=qac
    因此 q 3 q_3 q3就代表由坐标系a转化到c的旋转矩阵。

3. 符号说明

由于后文涉及到的符号较多,故在此具体说明。

表2.1. 坐标系
符号说明
N机载NED坐标系
B机体坐标系
目标坐标系
M中间坐标系,就是完成了Z轴对齐,还差偏航
表2.2. 四元数及其对应的旋转矩阵
符号说明旋转矩阵
qB系向N系变换 q ⃗ = q ⃗ B N \vec{q}=\vec{q}_B^N q =q BN
qdT系向N系变换 q ⃗ d = q ⃗ T N \vec{q}_d=\vec{q}_T^N q d=q TN
qd_redM系向N系变换 q ⃗ d , r e d = q ⃗ M N \vec{q}_{d,red}=\vec{q}_M^N q d,red=q MN
qd_mixT系向M系变换 q ⃗ d , m i x = q ⃗ T M \vec{q}_{d,mix}=\vec{q}_T^M q d,mix=q TM
qd_tiltM系向B系变换,转轴在N系 q ⃗ d , t i l t = N q ⃗ M B \vec{q}_{d,tilt}=^N\vec{q}_M^B q d,tilt=Nq MB
qd_tilt’M系向B系变换,转轴在B系或者M系 q ⃗ d , t i l t ′ = q ⃗ M B \vec{q}_{d,tilt}'=\vec{q}_M^B q d,tilt=q MB

最终使用的链式旋转公式
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} q d=q TN=q MNq TM=q d,redq d,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]

  1. 获取当前姿态和目标姿态Z轴在NED坐标系下的表示( N e ⃗ z B , N e ⃗ z d B ^N\vec{e}_z^B,^N\vec{e}_{zd}^B Ne zB,Ne zdB)
    根据四元数和旋转矩阵的关系可以得到
    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] Ne zB=2(q0q2+q1q3)2(q2q3q0q1)2(q02q12q22+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] Ne zdB=2(q0dq2d+q1dq3d)2(q2dq3dq0dq1d)2(q0d2q1d2q2d2+q3d2)
    注意这里第二项是相减,对应书上公式(1.85),因此对应的是坐标系的旋转,所以变换完了之后相当于是在NED轴系下。
  2. 获取机体轴(B)到过渡轴(M)的旋转四元数( q ⃗ M B \vec{q}_M^B q MB)
    知道上面两个坐标轴之后,B轴旋转到M轴相当于绕两个向量叉乘的轴线旋转两个向量两个向量的夹角,因此很容易得出四元数 q ⃗ B M \vec{q}_B^M q BM
    α = 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(Ne zB,Ne zdB)
    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) q d, tilt =(cos(α/2)sin(α/2)Ne zB×Ne zdBNe zB×Ne zdB)
    由于这个四元数表示的旋转轴是在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} q d, tilt =q NBq d,tilt(q NB)=q 1q d,tiltq
  3. 得到表示倾斜运动的四元数( q ⃗ d , r e d \vec{q}_{d,red} q d,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} q d,red=q q 1q d,tiltq =q d,tiltq
  4. 得到表示旋转运动的四元数( q ⃗ d , m i x \vec{q}_{d,mix} q d,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} q d,mix=(q d, red )1q d
    根据前文的四元数几何意义,旋转运动又只是绕着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}} q d,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] q d,mix=[kcos2αmix00ksin2αmix]T,k[0,1]
  5. 得到最终期望四元数( q ⃗ d ′ \vec{q}_d' q d)
    q ⃗ d ′ = q ⃗ d , r e d ∗ q ⃗ d , m i x ′ \vec{q}'_d=\vec{q}_{d,red}*\vec{q}_{d,mix}' q d=q d,redq d,mix
  6. 计算误差
    四元数误差为:
    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 q ed=q 1q dq TB=q NBq TN
    这个误差还可以表示成:
    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] q ed=[cos2αsin2αr B]
    根据前面介绍可以知道,这个四元数表示的是B轴系旋转到N轴系。其中向量 r ⃗ B = ( x 0 , y 0 , z 0 ) \vec{r}^B=(x_0,y_0,z_0) r B=(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} q ed=cos(2α)sin(2α)x0isin(2α)y0jsin(2α)z0k
    这表明误差四元数的虚部就是期望的角度。
    φ ⃗ d = [ q 1   q 2   q 3 ] \vec{\varphi}_d=[q_1 q_2 q_3] φ d=[q1 q2 q3]
  7. 设计控制律
    得到角度差 φ ⃗ 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 e z到向量 e ⃗ z d \vec{e}_{zd} e zd的旋转,其中向量 e ⃗ z \vec{e}_z e z B B B系, e ⃗ z d \vec{e}_{zd} e zd M M M系,也就是这个向量表示的是向量的旋转,根据前文可以得到,由于表示向量旋转和坐标系变换的四元数互为共轭,因此这个四元数表示的是从 M M M坐标系到 B B B坐标系的变换。

5. 源码解读

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhao23333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值