5.11 飞行控制——定点飞行

news2024/12/22 18:09:34

文章目录

    • 5.11 飞行控制——定点飞行
      • 5.11.1 加入三轴位置的飞行硬件系统 FLY(s)
      • 5.11.2 数学模型——三轴位置系统
        • (1)x、y轴位置系统的微分方程
        • (2)z轴位置系统的微分方程
        • (3)三轴位置系统的状态空间方程
      • 5.11.2 A1软件设计
      • 5.11.3 A1运行与调试
      • 5.11.4 三轴位置串级PID控制器
      • 5.11.5 A2软件设计
      • 5.11.6 A2运行与调试
      • 5.11.7 期望误差限伏
      • 5.11.8 A3软件设计
      • 5.11.9 A3运行与调试

总目录:http://t.csdnimg.cn/YDe8m

5.11 飞行控制——定点飞行

   实现定点飞行基本上也就对无人机所有的运动状态进行地了控制,定高飞行相当于半定点飞行。

5.11.1 加入三轴位置的飞行硬件系统 FLY(s)

   四旋翼硬件系统可以大体分为三轴角度系统、三轴位置系统、电机系统。根据状态空间方程的性质,我们自然地想到角度、位置系统可以列写为一个状态空间方程,该状态空间方程具有12个状态变量与输出,分别为三轴角速度、角度、线速度、位置;具有4个输入,分别为三轴力矩、电机合力。
   然而实际建立时会发生困难,在位置系统部分,有些项与角度、电机合力同时相关,系统将是非定常的。非线性系统可以在某点近似线性化,但限于本人水平,非定常系统的状态空间方程表示,作者一直没找到方法,闻道在先的同志如果了解的话,欢迎联系与指正。
   对于上述非定常系统表达的问题,作者想到了这样一种方法:利用之前求解得到的电机系统,将飞行硬件系统 FLY(s)划分为电机系统、角度系统、位置系统,这样三个子系统,其运行原理如图5.11.1所示:

在这里插入图片描述

图 5.11.1 FLY(s)飞行硬件系统

   1)飞行硬件系统 FLY(s),其总输入为 u 1 ∼ u 4 u_1 \sim u_4 u1u4 四个电机功率,这也是控制器的输出。

   2)电机系统的输入分为两部分,一部分是四个电机的功率 u 1 ∼ u 4 u_1 \sim u_4 u1u4,一部分则是四旋翼当前的角度状态 A x ∼ A z A_x \sim A_z AxAz
   其输出也分为两部分,其一为三轴力矩 M x ∼ M z M_x \sim M_z MxMz,其二为东北天坐标系下各轴的分力 F x ∼ F z F_x \sim F_z FxFz(可由北东地坐标系下分力进行转换),其中第二部分的求解综合使用了 u 1 ∼ u 4 u_1\sim u_4 u1u4 A x ∼ A z A_x \sim Az AxAz,涉及到之前所讲的旋转矩阵。

   3)在末端,角度系统的输入为三轴力矩 M x ∼ M y M_x \sim M_y MxMy,输出为三轴角度、角速度 A x ∼ A z A_x \sim A_z AxAz W x ∼ W z W_x\sim W_z WxWz 。其中角度 A x ∼ A z A_x \sim A_z AxAz 又被电机系统M(s) 所使用。
   4)在末端,位置系统的输入有两部分,其一为东北天坐标系下各轴的分力 F x ∼ F z F_x\sim F_z FxFz, 其二为重力加速度g,至于为什么有个g,之后会具体讲解。位置系统输出为:三轴位置、线速度,即 P x ∼ P z 、 W x ∼ W z P_x\sim P_z、W_x\sim W_z PxPzWxWz,注意,其方向都是取自东北天坐标系的。

5.11.2 数学模型——三轴位置系统

(1)x、y轴位置系统的微分方程

   对于四旋翼在东北天坐标系x轴上位置系统的微分方程,按照5.4.1 小节的步骤进行建立:

   1)确定系统输入、输出
   结合图5.11.1 与控制目的,设置x轴位置系统的输入为 F x F_x Fx,即电机合力在x轴上的分力。由于优先控制的状态为四旋翼在x轴上的位置 P x P_x Px, 设置输出为 P x P_x Px
   2)细分系统环节
   在x轴位置系统内,作用有电机合力分力 F x F_x Fx、空气阻力 F D x F_{Dx} FDx、惯性力 F m x F_{mx} Fmx,三者之合为零:
F x + F D x + F m x = 0 ( 5.11.1 ) F_x + F_{Dx}+F_{mx} = 0 \qquad (5.11.1) Fx+FDx+Fmx=0(5.11.1)
   3)各一节微分方程
   可知 F x F_x Fx 为输入, F D x 、 F m x F_{Dx}、F_{mx} FDxFmx有:
F D x = − K 4 P x ˙ ( 5.11.2. a ) F m x = − m P x ¨ ( 5.11.2. b ) \begin{aligned} &F_{Dx} = -K_4\dot{P_x} \qquad &(5.11.2.a) \\ &F_{mx} = -m\ddot{P_x} \qquad &(5.11.2.b) \end{aligned} FDx=K4Px˙Fmx=mPx¨(5.11.2.a)(5.11.2.b)
   K 4 K_4 K4——四旋翼在x方向移动时所受空气阻力的移阻系数。
   m m m——四旋翼无人机的质量。
   式中的负号表示两个力的方向与 F x F_x Fx的方向相反。对于空气阻力 F D x F_{Dx} FDx,此处已经线性化,原理与5.9 小节相同。

   4)各环节合并并整理
   式(5.11.1)与式(5.11.2)联立,即得:
m P x ¨ + K 4 P x ˙ = F x ( 5.11.3. a ) m\ddot{P_x} + K_4 \dot{P_x} = F_x \qquad (5.11.3.a) mPx¨+K4Px˙=Fx(5.11.3.a)
   y轴位置系统的微分方程与x轴类似,即:
m P y ¨ + K 5 P y ˙ = F y ( 5.11.3. b ) m\ddot{P_y} + K_5 \dot{P_y} = F_y \qquad (5.11.3.b) mPy¨+K5Py˙=Fy(5.11.3.b)

(2)z轴位置系统的微分方程

   与x、y轴不同的是,z轴方向上还作用有四旋翼的重力 F g F_g Fg = m g =mg =mg),方向与电机分力 F z F_z Fz的方向相反,则其微分方程可写为:
m P z ¨ + K 6 P z ˙ = F z − m g ( 5.11.3. c ) m \ddot{P_z} + K_6 \dot{P_z} = F_z - mg \qquad (5.11.3.c) mPz¨+K6Pz˙=Fzmg(5.11.3.c)

(3)三轴位置系统的状态空间方程

   1)设计输入量、状态变量、输出量
   式(5.11.3)三式的左侧都为输入项,很明显的,输入有 F x ∼ F z F_x\sim F_z FxFz三个分力,可作为 u 1 ∼ u 3 u_1 \sim u_3 u1u3。但式(5.11.3.c)有些特殊,其输入有两项,除分力 F z F_z Fz外,还 m g mg mg项。为了满足状态空间方程的标准形式,这里设计输入 u 4 = g u_4 = g u4=g

   设计输入:
u 1 ( t ) = F x ( 5.11.4. a ) u 2 ( t ) = F y ( 5.11.4. b ) u 3 ( t ) = F z ( 5.11.4. c ) u 4 ( t ) = g ( 5.11.4. d ) \begin{aligned} &u_1(t) = F_x \qquad & (5.11.4.a) \\ &u_2(t) = F_y \qquad & (5.11.4.b) \\ &u_3(t) = F_z \qquad & (5.11.4.c) \\ &u_4(t) = g \qquad & (5.11.4.d) \end{aligned} u1(t)=Fxu2(t)=Fyu3(t)=Fzu4(t)=g(5.11.4.a)(5.11.4.b)(5.11.4.c)(5.11.4.d)

   设计状态变量:
x 1 ( t ) = P x ( 5.11.5. a ) x 2 ( t ) = V x ( 5.11.5. b ) x 3 ( t ) = P y ( 5.11.5. c ) x 4 ( t ) = V y ( 5.11.5. d ) x 5 ( t ) = P z ( 5.11.5. e ) x 6 ( t ) = V z ( 5.11.5. f ) \begin{aligned} &x_1(t) = P_x \qquad &(5.11.5.a) \\ &x_2(t) = V_x \qquad &(5.11.5.b) \\ &x_3(t) = P_y \qquad &(5.11.5.c) \\ &x_4(t) = V_y \qquad &(5.11.5.d) \\ &x_5(t) = P_z \qquad &(5.11.5.e) \\ &x_6(t) = V_z \qquad &(5.11.5.f) \\ \end{aligned} x1(t)=Pxx2(t)=Vxx3(t)=Pyx4(t)=Vyx5(t)=Pzx6(t)=Vz(5.11.5.a)(5.11.5.b)(5.11.5.c)(5.11.5.d)(5.11.5.e)(5.11.5.f)

   设计输出:
y 1 ( t ) = x 1 ( t ) ( 5.11.6. a ) y 2 ( t ) = x 2 ( t ) ( 5.11.6. b ) y 3 ( t ) = x 3 ( t ) ( 5.11.6. c ) y 4 ( t ) = x 4 ( t ) ( 5.11.6. d ) y 5 ( t ) = x 5 ( t ) ( 5.11.6. e ) y 6 ( t ) = x 6 ( t ) ( 5.11.6. f ) \begin{aligned} &y_1(t) = x_1(t) \qquad &(5.11.6.a) \\ &y_2(t) = x_2(t) \qquad &(5.11.6.b) \\ &y_3(t) = x_3(t) \qquad &(5.11.6.c) \\ &y_4(t) = x_4(t) \qquad &(5.11.6.d) \\ &y_5(t) = x_5(t) \qquad &(5.11.6.e) \\ &y_6(t) = x_6(t) \qquad &(5.11.6.f) \\ \end{aligned} y1(t)=x1(t)y2(t)=x2(t)y3(t)=x3(t)y4(t)=x4(t)y5(t)=x5(t)y6(t)=x6(t)(5.11.6.a)(5.11.6.b)(5.11.6.c)(5.11.6.d)(5.11.6.e)(5.11.6.f)

   2)列写一队微分方程
   式(5.11.3)可拆解成一系列一阶微分方程,即:
P x ˙ = V x ( 5.11.7. a ) V x ˙ = − K 4 m V x + 1 m F x ( 5.11.7. b ) P y ˙ = V y ( 5.11.7. c ) V y ˙ = − K 5 m V y + 1 m F y ( 5.11.7. d ) P z ˙ = V z ( 5.11.7. e ) V z ˙ = − K 6 m V z + 1 m F z − g ( 5.11.7. f ) \begin{aligned} &\dot{P_x} = V_x \qquad &(5.11.7.a) \\ &\dot{V_x} = -\frac{K_4}{m}V_x + \frac{\mathrm{1}}{m} F_x \qquad &(5.11.7.b) \\ &\dot{P_y} = V_y \qquad &(5.11.7.c) \\ &\dot{V_y} = -\frac{K_5}{m}V_y + \frac{\mathrm{1}}{m} F_y \qquad &(5.11.7.d) \\ &\dot{P_z} = V_z \qquad &(5.11.7.e) \\ &\dot{V_z} = -\frac{K_6}{m}V_z + \frac{\mathrm{1}}{m} F_z - g \qquad &(5.11.7.f) \\ \end{aligned} Px˙=VxVx˙=mK4Vx+m1FxPy˙=VyVy˙=mK5Vy+m1FyPz˙=VzVz˙=mK6Vz+m1Fzg(5.11.7.a)(5.11.7.b)(5.11.7.c)(5.11.7.d)(5.11.7.e)(5.11.7.f)

   3)整理并转化为矩阵形式
d d t [ x 1 ( t ) x 2 ( t ) x 3 ( t ) x 4 ( t ) x 5 ( t ) x 6 ( t ) ] = [ 0 1 0 − K 4 m 0 1 0 − K 5 m 0 1 0 − K 6 m ] [ x 1 ( t ) x 2 ( t ) x 3 ( t ) x 4 ( t ) x 5 ( t ) x 6 ( t ) ] + [ 0 1 m 0 1 m 0 0 1 m − 1 ] [ u 1 ( t ) u 2 ( t ) u 3 ( t ) u 4 ( t ) ] ( 5.11.8. a ) [ y 1 ( t ) y 2 ( t ) y 3 ( t ) y 4 ( t ) y 5 ( t ) y 6 ( t ) ] = I 6 × 6 [ x 1 ( t ) x 2 ( t ) x 3 ( t ) x 4 ( t ) x 5 ( t ) x 6 ( t ) ] + O 6 × 4 [ u 1 ( t ) u 2 ( t ) u 3 ( t ) u 4 ( t ) ] ( 5.11.8. b ) \begin{aligned} &\frac{\mathrm{d}}{\mathrm{d}t} \begin{bmatrix} x_1(t) \\ x_2(t) \\ x_3(t) \\ x_4(t) \\ x_5(t) \\ x_6(t) \end{bmatrix} = \begin{bmatrix} 0 &1 \\ 0 &-\frac{K_4}{m} \\ & &0 &1 && \\ & &0 &-\frac{K_5}{m} \\ &&& &0 &1 \\ &&& &0 &-\frac{K_6}{m} \end{bmatrix} \begin{bmatrix} x_1(t)\\ x_2(t)\\ x_3(t)\\ x_4(t)\\ x_5(t)\\ x_6(t) \end{bmatrix} + \begin{bmatrix} 0 & & \\ \frac{\mathrm{1}}{m} & & \\ &0 & \\ &\frac{\mathrm{1}}{m} & \\ & &0 &0\\ & &\frac{\mathrm{1}}{m} &-\mathrm{1}\\ \end{bmatrix} \begin{bmatrix} u_1(t) \\ u_2(t) \\ u_3(t) \\ u_4(t) \end{bmatrix}&(5.11.8.a) \\ &\begin{bmatrix} y_1(t) \\ y_2(t) \\ y_3(t) \\ y_4(t) \\ y_5(t) \\ y_6(t) \end{bmatrix} = \boldsymbol{I}_{6\times 6} \begin{bmatrix} x_1(t)\\ x_2(t)\\ x_3(t)\\ x_4(t)\\ x_5(t)\\ x_6(t) \end{bmatrix} + \boldsymbol{O}_{6\times 4} \begin{bmatrix} u_1(t) \\ u_2(t) \\ u_3(t) \\ u_4(t) \end{bmatrix} &(5.11.8.b) \end{aligned} dtd x1(t)x2(t)x3(t)x4(t)x5(t)x6(t) = 001mK4001mK5001mK6 x1(t)x2(t)x3(t)x4(t)x5(t)x6(t) + 0m10m10m101 u1(t)u2(t)u3(t)u4(t) y1(t)y2(t)y3(t)y4(t)y5(t)y6(t) =I6×6 x1(t)x2(t)x3(t)x4(t)x5(t)x6(t) +O6×4 u1(t)u2(t)u3(t)u4(t) (5.11.8.a)(5.11.8.b)

   式中,矩阵中空缺的部分为0; I 6 × 6 \boldsymbol{I}_{6\times 6} I6×6 6 × 6 6\times6 6×6单位矩阵; O 6 × 4 \boldsymbol{O}_{6\times 4} O6×4 6 × 4 6\times 4 6×4零矩阵。

   5)提取矩阵

A = [ 0 1 0 − K 4 m 0 1 0 − K 5 m 0 1 0 − K 6 m ] ( 5.11.9. a ) B = [ 0 1 m 0 1 m 0 0 1 m − 1 ] ( 5.11.9. b ) C = I 6 × 6 ( 5.11.9. c ) D = O 6 × 4 ( 5.11.9. d ) u ( t ) = [ u 1 ( t ) u 2 ( t ) u 3 ( t ) u 4 ( t ) ] T ( 5.11.9. e ) x ( t ) = [ x 1 ( t ) x 2 ( t ) ⋯ x 6 ( t ) ] T ( 5.11.9. f ) d x ( t ) d t = A x ( t ) + B u ( t ) ( 5.11.9. g ) y ( t ) = C x ( t ) + D u ( t ) ( 5.11.9. h ) \begin{aligned} &\boldsymbol{A} = \begin{bmatrix} 0 &1 \\ 0 &-\frac{K_4}{m} \\ & &0 &1 && \\ & &0 &-\frac{K_5}{m} \\ &&& &0 &1 \\ &&& &0 &-\frac{K_6}{m} \end{bmatrix} &(5.11.9.a) \\ & \boldsymbol{B} = \begin{bmatrix} 0 & & \\ \frac{\mathrm{1}}{m} & & \\ &0 & \\ &\frac{\mathrm{1}}{m} & \\ & &0 &0\\ & &\frac{\mathrm{1}}{m} &-\mathrm{1}\\ \end{bmatrix} &(5.11.9.b) \\ & \boldsymbol{C} = \boldsymbol{I}_{6\times 6} & (5.11.9.c) \\ & \boldsymbol{D} = \boldsymbol{O}_{6\times 4} & (5.11.9.d) \\ &\boldsymbol{u}(t) = \begin{bmatrix} u_1(t) &u_2(t) &u_3(t) & u_4(t) \end{bmatrix}^{\mathrm{T}} & (5.11.9.e) \\ &\boldsymbol{x}(t) = \begin{bmatrix} x_1(t) & x_2(t) &\cdots &x_6(t) \end{bmatrix}^{\mathrm{T}} & (5.11.9.f) \\ &\frac{\mathrm{d}\boldsymbol{x}(t)}{\mathrm{d}t} = \boldsymbol{A}\boldsymbol{x}(t) + \boldsymbol{B}\boldsymbol{u}(t) & (5.11.9.g) \\ & \boldsymbol{y}(t) = \boldsymbol{C}\boldsymbol{x}(t) + \boldsymbol{D}\boldsymbol{u}(t) &(5.11.9.h) \end{aligned} A= 001mK4001mK5001mK6 B= 0m10m10m101 C=I6×6D=O6×4u(t)=[u1(t)u2(t)u3(t)u4(t)]Tx(t)=[x1(t)x2(t)x6(t)]Tdtdx(t)=Ax(t)+Bu(t)y(t)=Cx(t)+Du(t)(5.11.9.a)(5.11.9.b)(5.11.9.c)(5.11.9.d)(5.11.9.e)(5.11.9.f)(5.11.9.g)(5.11.9.h)

5.11.2 A1软件设计

   本小节例程位于“2、飞控例程\Matlab\(4)飞行控制——定点飞行\A1_四旋翼位置系统”中。
   例程功能为建立四旋翼三轴位置系统状态空间方程形式的数学模型,并仿真其对初始状态的响应。
   例程中的文件如图5.11.2所示,主要增加了“M_Position.m”文件,修改了“A1_main.mlx”、“P_plot_all.m”、“输入_系统参数.xlsx”等文件。

在这里插入图片描述

图5.11.2

M_Position.m文件

   该文件分为初始化(行8~56)、具体运行(行59~65)两个部分。

%%   四旋翼位置系统 动态模型

%    注意,位置系统及相关PID使用的坐标为东北天坐标系,
%,x、y坐标在零初始时与机体坐标反向,机头与x轴重合

%%
if init == 0    %未初始化
    % 矩阵中元素的默认顺序: Px、Vx、Py、Vy、Pz、Vz
    
    %四旋翼位置系统 系统参数 
    s_P.m = data_i(27, 4);      % 重量
    s_P.g = 9.8;  % 重力加速度
    s_P.K = data_i(28, 4:6);    % 位阻系数
    
    %过程噪声方差、数学期望期望
    s_P.Q_d = [0 0 0 0 0 0];                             %数学期望期望为0
    s_P.Q_c = data_i(29, 4:9);
    
    % 定义矩阵
    s_P.S_n = 6;      %状态变量数
    s_P.S_m = 6;      %输出变量数
    s_P.S_p = 4;      %输入变量数
    
    s_P.u = zeros(s_P.S_p, 1);           %位置系统输入 
    s_P.y = zeros(s_P.S_m, 1);           %位置系数输出
    
    s_P.x_last = zeros(s_P.S_n, 1);     %上次状态变量
    s_P.x = zeros(s_P.S_n, 1);          %当前状态变量
    s_P.x_last(:, 1) =  data_i(30:35, 4);       %初始状态  位置、速度
                    

    s_P.A = zeros(s_P.S_n, s_P.S_n);
    s_P.B = zeros(s_P.S_n, s_P.S_p);
    s_P.C = eye(s_P.S_n);               %生成一个 Sp_n 阶的单位矩阵
    s_P.D = zeros(s_P.S_m, s_P.S_p);
    
    s_P.A(1:2, 1:2) = [0, 1; 0, -s_P.K(1)/s_P.m];
    s_P.A(3:4, 3:4) = [0, 1; 0, -s_P.K(2)/s_P.m];
    s_P.A(5:6, 5:6) = [0, 1; 0, -s_P.K(3)/s_P.m];
    
    s_P.B(2, 1) = 1/s_P.m;
    s_P.B(4, 2) = 1/s_P.m;
    s_P.B(6, 3) = 1/s_P.m;
    s_P.B(6, 4) = -1;
    
    % 获取离散化状态空间方程
    sys_d = c2d(ss(s_P.A, s_P.B, s_P.C, s_P.D),Ts);
    
    % 提取离散系统A矩阵
    s_P.A = sys_d.a;
    % 提取离散系统B矩阵
    s_P.B = sys_d.b;
    % 提取离散系统C矩阵
    s_P.C = sys_d.c;
    % 提取离散系统D矩阵
    s_P.D = sys_d.d;
    
else            %计算系统响应 
    % 动态系统响应
    w_noise = normrnd(s_P.Q_d, s_P.Q_c)';     %过程噪声
    s_P.x  = s_P.A*s_P.x_last + s_P.B*s_P.u;           %求当前状态
    s_P.x  = s_P.x + w_noise;                 %添加过程噪声,式(6.3.1.a)
    s_P.y  = s_P.C*s_P.x + s_P.D*s_P.u;                 %求输出,y有不同,式(2.2.6)
    
    s_P.x_last = s_P.x;
end



  • 行10~35
    建立“s_P”位置系统参数结构体变量,并将Excel数据赋值给位置系统相关参数。
  • 行37~44
    构建状态空间方程的特征矩阵 A 、 B \boldsymbol{A}、\boldsymbol{B} AB,对应式(5.11.9.a)、(5.11.9.b)
  • 行47~56
    建立状态空间方程及对其离散化,最终获得四个离散状态空间方程的特征矩阵。
  • 行60~65
    三轴位置系统的具体运行部分,与三轴角度系统相似。

A1_main.mlx 文件

  主要添加了三轴位置系统的运行部分,及对其输出数据的保存。

......

init = 1;   %已初始化完毕
for i = 1:(Num)
    % 串级PID控制
    C_Cascade_PID;
    
    % 动态系统响应
    M_Motor;    %电机
    
    s_A.u = s_mot.M_xyz;          %赋值角度系统输入
    M_Angle;                  %四旋翼角度系统
    
    s_P.u(1:3, 1) = s_mot.F_xyz;  %赋值位置系统输入
    s_P.u(4, 1) = s_P.g;
    M_Position;               %四旋翼位置系统
    
    %保存电机模型输入输出数据
    s_History.u_all(i, :) = s_mot.u_all';
    s_History.F_xyz(i, :) = s_mot.F_xyz';
    s_History.M_xyz(i, :) = s_mot.M_xyz';
    
    %保存角度系统输出数据
    s_History.ya(i, :) = s_A.y.*180/pi;  %角度,单位(deg) 
    
    %保存位置系统输出数据
    s_History.yp(i, :) = s_P.y;  %位置,单位(m) 


......
  • 行14~16
    赋值位置系统的输入并运行三轴位置系统。
  • 行27
    保存位置系统的输出到s_History 结构体的yp 元素。

P_plot_all.m 文件

  主要添加了位置系统相关曲线图,包括三轴分力曲线图、三轴位置曲线图、三轴线速度曲线图。

%% 绘图文件


......


%% 位置系统

% 输入三轴力
figure(3);
subplot(3, 1, 1);

plot(t, s_History.F_xyz(:, 1), 'r');
hold on;
plot(t, s_History.F_xyz(:, 2), 'g');
hold on;
plot(t, s_History.F_xyz(:, 3), 'b');
hold on;
legend('F_x', 'F_y', 'F_z');

xlabel('时间(s)', 'Color', 'k', "FontSize", 15);
ylabel('力(N)', 'Color', 'k', "FontSize", 15);
title('四旋翼 位置系统')
grid on;
hold off;


% 三轴位置(东北天坐标系,机头x轴, x、y坐标在零初始时与机体坐标反向)
subplot(3, 1, 2);

plot(t, s_History.yp(:, 1), 'r');
hold on;
plot(t, s_History.yp(:, 3), 'g');
hold on;
plot(t, s_History.yp(:, 5), 'b');
hold on;
legend('P_x', 'P_y', 'P_z');

xlabel('时间(s)', 'Color', 'k', "FontSize", 15);
ylabel('位置(m)', 'Color', 'k', "FontSize", 15);
grid on;
hold off;

% 三轴速度
subplot(3, 1, 3);

plot(t, s_History.yp(:, 2), 'r');
hold on;
plot(t, s_History.yp(:, 4), 'g');
hold on;
plot(t, s_History.yp(:, 6), 'b');
hold on;
legend('V_x', 'V_y', 'V_z');

xlabel('时间(s)', 'Color', 'k', "FontSize", 15);
ylabel('速度(m/s)', 'Color', 'k', "FontSize", 15);
grid on;
hold off;


5.11.3 A1运行与调试

   双击进入“A1_main.mlx”文件,点击上方“实时编辑器”中的“运行”按钮即可运行例程。运行结果如图5.11.3所示,其中(c)图为位置系统相关曲线图,由于未使用控制器进行控制,位置等参数呈发散状态。
在这里插入图片描述

(a)
在这里插入图片描述

(b)
在这里插入图片描述

(c)

图 5.11.3

5.11.4 三轴位置串级PID控制器

  与角度系统的串级PID控制器类似,此处不再赘述。

5.11.5 A2软件设计

   本小节例程位于“2、飞控例程\Matlab\(4)飞行控制——定点飞行\A2_位置系统串级PID”中。
   例程功能为:使用4组(共12环)的串级PID对四旋翼三轴的位置、速度、角度、角速度进行控制。
   例程主要修改了“C_Cascade_PID.m”、“输入_系统参数.xlsx”等文件。

C_Cascade_PID.m 文件

%% 四旋翼 串级PID 控制器
% 输入:
%   s_A.y   角度系统的输出
%
% 输出
%   s_mot.u_all   四个电机的功率

%% 

if init == 0    %未初始化
    % 角度系统PID相关,变量默认顺序,Ax、Wx、Ay、Wy、Az、Wz
    s_pid.d = data_i(20, 4:9);       %串级PID期望,三轴角度、角速度,单位:deg、deg/s
    s_pid.A_max = data_i(43, 4);     %x、y角度环的期望最大值
    
    s_pid.d = s_pid.d *pi/180;       %转化单位为弧度
    s_pid.A_max = s_pid.A_max *pi/180; 
    
    s_pid.K_pid = data_i(14:19, 4:6);    % 角度系统相关PID参数(*6) 
    
    s_pid.e =  zeros(6, 1);
    s_pid.e_last = zeros(6, 1);
    s_pid.Ei = zeros(6, 1);
    s_pid.y = zeros(6, 1);

    
    % 位置系统PID相关,变量默认顺序,Px、Vx、Py、Vy、Pz、Vz
    s_pid.p_d = data_i(42, 4:9);      % 位置、速度PID 期望
    s_pid.Kp_pid = data_i(36:41, 4:6);    % 位置系统相关PID参数(*6)                         
 
    s_pid.p_e =  zeros(6, 1);
    s_pid.p_e_last = zeros(6, 1);
    s_pid.p_Ei = zeros(6, 1);
    s_pid.p_y = zeros(6, 1);
    
    %PID临时期望存储
    s_pid.short_d = 0;      
    
    % PID输出转电机功率 矩阵
    s_pid.Out_M = [ -1  -1  1  1;
                    -1   1 -1  1;
                     1  -1 -1  1;
                     1   1  1  1;];      % PID输出转电机功率 矩阵     
         
else            %进行控制    
     k = 1;
     kp = 1;
     
     %%%%%%%%%%%%%%%%%%%%%% 位置系统PID
     for PID_index = 1:3
         % 位置环
        s_pid.short_d = s_pid.p_d(kp);
        
        s_pid.p_e(kp) = s_pid.short_d - s_P.y(kp, 1);     %角速度 期望与测量误差  
        [s_pid.p_y(kp), s_pid.p_Ei(kp)] = C_PID(Ts, s_pid.Kp_pid(kp, :), s_pid.p_e(kp), s_pid.p_e_last(kp), s_pid.p_Ei(kp));
        s_pid.p_e_last(kp) = s_pid.p_e(kp);     %保存本次误差

        kp = kp+1;
        
        %速度环
        s_pid.short_d = s_pid.p_d(kp) + s_pid.p_y(kp-1);
        
        s_pid.p_e(kp) = s_pid.short_d - s_P.y(kp, 1);     %角速度 期望与测量误差  
        [s_pid.p_y(kp), s_pid.p_Ei(kp)] = C_PID(Ts, s_pid.Kp_pid(kp, :), s_pid.p_e(kp), s_pid.p_e_last(kp), s_pid.p_Ei(kp));
        s_pid.p_e_last(kp) = s_pid.p_e(kp);     %保存本次误差

        kp = kp+1;
     end
     
     %%%%%%%%%%%%%%%%%%%%%% 角度系统PID
     for PID_index = 1:3
        % 角速度环
        if PID_index ~= 3       %不为z轴时,进行角度期望限制
            if (PID_index == 1)       % 为x轴角度控制
               s_pid.short_d = s_pid.d(k) - s_pid.p_y(4);       % x轴角度PID 期望(叠加y轴速度环输出) 
            elseif (PID_index == 2)   % 为y轴角度控制
               s_pid.short_d = s_pid.d(k) - s_pid.p_y(2);       % y轴角度PID 期望(叠加x轴速度环输出)  
            end
            
            s_pid.short_d = min(s_pid.short_d, s_pid.A_max);
            s_pid.short_d = max(s_pid.short_d, -s_pid.A_max);
        else
            s_pid.short_d = s_pid.d(k);     % z轴角度环PID 期望
        end
        
        s_pid.e(k) = s_pid.short_d - s_A.y(k, 1);     %角度 期望与测量误差  
        [s_pid.y(k), s_pid.Ei(k)] = C_PID(Ts, s_pid.K_pid(k, :), s_pid.e(k), s_pid.e_last(k), s_pid.Ei(k));
        s_pid.e_last(k) = s_pid.e(k);     %保存本次误差

        k = k+1;
        
        % 角速度环
        s_pid.short_d = s_pid.d(k) + s_pid.y(k-1);
        
        s_pid.e(k) = s_pid.short_d - s_A.y(k, 1);     %角速度 期望与测量误差  
        [s_pid.y(k), s_pid.Ei(k)] = C_PID(Ts, s_pid.K_pid(k, :), s_pid.e(k), s_pid.e_last(k), s_pid.Ei(k));
        s_pid.e_last(k) = s_pid.e(k);     %保存本次误差

        k = k+1;
    end
    
    % PID输出转化为各电机功率
    s_pid.PID_out(1:3, 1) = [s_pid.y(2) s_pid.y(4) s_pid.y(6)]';                    % x、y、z三轴角速度环输出
    s_pid.PID_out(4, 1) = s_P.m*s_P.g*s_mot.u_max/(4*s_mot.F_max) + s_pid.p_y(6);   % z轴速度环输出
    s_mot.u_all = s_pid.Out_M*s_pid.PID_out;      %PID输出 转 电机控制功率
    
    % 电机功率限幅
    s_mot.u_all = min(s_mot.u_all, s_mot.u_max);
    s_mot.u_all = max(s_mot.u_all, 0);
end

  • 行26~33
    将Excel中位置系统相关参数赋值给相关变量。
  • 行49~26
    添加三轴位置环、线速度环PID

5.11.6 A2运行与调试

   双击进入“A1_main.mlx”文件,点击上方“实时编辑器”中的“运行”按钮即可运行例程。运行结果如图5.11.4所示,其中(c)图为位置系统相关曲线图,经过一定时间,各轴线速度与位置都达到期望。
在这里插入图片描述

(a)
在这里插入图片描述

(b)
在这里插入图片描述
(c)

图 5.11.4

5.11.7 期望误差限伏

   对于四旋翼控制器来说,有些期望值的大小是不合理的,如x轴的角度期望,用于定点飞行时,其期望应在 − 3 0 ∘ ∼ 3 0 ∘ -30^{\circ} \sim 30^{\circ} 3030间浮动,若期望为270 ∘ ^{\circ} 等,是不合理的。由于外环PID的输出将成为内环PID期望的一部分,期望幅度过大的情况在串级PID中是常见的,故对期望要采取限幅。

   而误差是PID的直接输入,PID控制器的参数常只对一定范围内的输入控制效果较好。例如,若PID能很好对初始误差 e 0 = 1000 e_0 = 1000 e0=1000的系统进行控制,那么其对 e 0 = 1 e_0=1 e0=1系统控制就会是迟顿的。故也要对串级PID各环的误差进行限幅。

5.11.8 A3软件设计

   本小节例程位于“2、飞控例程\Matlab\(4)飞行控制——定点飞行\A3_期望_误差限幅”中。
   例程功能为:加入期望与误差限幅,并进行串PID控制。
   例程中的文件如图5.11.5所示,主要增加了“F_Limiter.m”文件,修改了“输入_系统参数.xlsx”、“C_Cascade_PID.m”等文件。

在这里插入图片描述

图5.11.5

F_Limiter.m

5.11.9 A3运行与调试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2092261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MybatisPlus的基本使用

文章目录 介绍特性工作流程图添加依赖Spring Boot2Spring Boot3 配置定义Mapper接口并继承BaseMapperServer 接口自定义 Service 接口继承 IServie 接口自定义 Service 实现类,实现自定义接口并继承 ServiceImpl 添加Config类常用注解:TableNameTableIdTableFieldTa…

css中 display block属性的用法

前言 display:block是一个css属性,用于控制元素的显示方式。当元素的display属性设置为block时,元素会以块级元素的方式进行显示。 块级元素(block-level element)是指在HTML中以块的形式展示并独占一行的元素。与块级元素相对的…

MyBatis-Plus 入门与进阶教程

本教程将带领你快速上手 MyBatis-Plus&#xff0c;涵盖其基本功能、常用注解以及插件的使用。我们将通过代码实例一步步展示如何在实际项目中应用 MyBatis-Plus。 1. 快速开始 1.1 添加依赖 在 pom.xml 中添加以下依赖&#xff1a; <dependency><groupId>com.b…

【Hexo系列】【7】Butterfly主题使用及美化

本期将为大家讲解Hexo Butterfly主题的使用。 1. 主题介绍 hexo-theme-butterfly是基于 Molunerfinn 的 hexo-theme-melody 的基础上进行开发的&#xff0c;当前版本是v4.13.0。 主题官网&#xff1a;https://github.com/jerryc127/hexo-theme-butterfly 官网效果图&#x…

Unity(2022.3.41LTS) - 3D关节

目录 零. 简介 一、关节的类型及特点 二、关节的使用方法 三、关节的应用场景 四. 实例效果 零. 简介 在 Unity 中&#xff0c;关节&#xff08;Joints&#xff09;是实现物理模拟和复杂交互效果的重要组件。以下是对 Unity 关节更详细的介绍&#xff1a; 一、关节的类型…

JDBC中的execute, executeQuery, 和 executeUpdate方法区别

JDBC中的execute, executeQuery, 和 executeUpdate方法区别 1、execute(String sql)2、executeQuery(String sql)3、executeUpdate(String sql) &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、execute(String sql) 功能&#xff1a;执…

Day89 代码随想录打卡|贪心算法篇---划分字母区间

题目&#xff08;leecode T763&#xff09;&#xff1a; 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s …

国产数据库打败Oracle?不存在的!

XC背景下国产数据库替代工程进行的如火如荼&#xff0c;数据库圈特别是Oracle的从业人员&#xff0c;既感受到深深的危机感&#xff0c;又带着些许的不甘&#xff0c;这种不甘主要来自于技术层面。 技术人员也有武士道精神&#xff0c;谁能打败我我服谁&#xff0c;谁的技术比…

如何判断儿童是否患有自闭症

自闭症&#xff0c;也被称为孤独症&#xff0c;是一种复杂的神经发育障碍&#xff0c;其症状通常在儿童早期就开始显现。面对孩子的成长过程&#xff0c;家长和教育者如何准确判断孩子是否患有自闭症&#xff0c;是一个至关重要的问题。 我们需要关注孩子的社交行为。自闭症儿童…

java之浅拷贝、深拷贝

1、java数据类型 java数据类型分为基本数据类型和引用数据类型 基本数据类型&#xff1a;byte、short、int、long、float、double、boolean、char。 引用类型&#xff1a;常见的有类、接口、数组、枚举等。 2、浅拷贝、深拷贝 以下探讨的浅拷贝、深拷贝是通过Object类中的cl…

Python matplotlib绘图 plt.barh 水平条形图调整顺序逆序排列

使用matplotlib 中的 plt.barh 绘制水平条形图时&#xff0c;数据的排列顺序默认由小到大排列&#xff0c;即数据条由短到长排列展示&#xff0c;如果想让数据条由长到短排列展示&#xff0c;可尝试以下代码。 import matplotlib.pyplot as plt import pandas as pd import nu…

MySQL——基础操作

一、数据库的创建 1.1 库的创建 在使用数据库时&#xff0c;最先操作的是创建一个数据库。使用语法如下&#xff1a; CREATE DATABASE [IF NOT EXISTS] database_name [[DEFAULT] CHARSETcharset_name] [[DEFAULT] COLLATEcollation_name]; 对上述语句进行简单说明&#xf…

【秋招笔试题】讨厌冒泡排序

题解&#xff1a;免费的操作是分别在奇偶下标进行排序&#xff0c;收费的操作会改变他们下标的奇偶性&#xff0c;那么直接统计在排序后有多少元素的下标发生变化了即可。 #include <iostream> #include <vector> #include <algorithm> #include "map&…

猫头虎 分享:Python库 XGBoost 的简介、安装、用法详解入门教程

猫头虎 分享&#xff1a;Python库 XGBoost 的简介、安装、用法详解入门教程 &#x1f3af; ✨ 引言 今天猫头虎收到一位粉丝的提问&#xff1a;“猫哥&#xff0c;我在项目中需要用到 XGBoost&#xff0c;可是对它的了解不够深入&#xff0c;不知道从哪开始&#xff0c;能否详…

线性查找表的应用:用户登录注册程序

线性查找表是很简单的数据结构和算法。网站的用户登录注册时是基本的功能。本文首先给出线性查找表的基本实现&#xff0c;然后给出在用户登录注册的程序流程图&#xff0c;并将线性查找表应用到用户查询这一具体任务&#xff0c;并基于 Python 语言在控制台实现用户注册、登录…

ComfyUI使用Flux模型

ComfyUI是一个强大的用户界面&#xff0c;支持多种图像处理和生成模型&#xff0c;而Flux是一系列由Black Forest Labs开发的扩散模型。 准备工作 1. 下载所需文件 下载地址&#xff1a; comfyanonymous/flux_text_encoders at main (hf-mirror.com)https://hf-mirror.com/…

django企业开发实战-学习小结

写在前面 初次阅读此书是三年前&#xff0c;当时没经历过完整的项目 觉得这书就是扯淡 后来经历过项目加班与毒打 今天再翻开此书 觉得实乃不可多得之物 花些时间啃下来吧 需求 需求文档 写文档&#xff0c;列举需要实现的功能&#xff0c;详细列举&#xff0c;不考虑技术实…

Leetcode Hot 100刷题记录 -Day6(滑动窗口)

无重复字符的最长子串 问题描述&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s …

10:Logic软件原理图中添加电源与GND

Logic软件原理图中添加电源与GND

“品牌VS套路:华为、格行、中兴随身WiFi谁才是真良心?“

咱们打工人月末有三光&#xff0c;工资花光&#xff0c;流量用光&#xff0c;话费剩光光。 不过除了工资没办法解决&#xff0c;剩下两个还能抢救一下 提起这个事情的起因是我发现现在的互联网平台到处都是推销随身WiFi的&#xff0c;什么零月租、几百G流量不限速不限量啥的&…