【飞机】自主无人机飞行稳定和轨迹跟踪Matlab实现
✅作者简介热爱科研的Matlab仿真开发者擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。完整代码获取 定制创新 论文复现点击Matlab科研工作室 关注我领取海量matlab电子书和数学建模资料个人信条做科研博学之、审问之、慎思之、明辨之、笃行之是为博学慎思明辨笃行。 内容介绍1. 四旋翼无人机飞行动力学基础牛顿运动定律用于描述无人机的线性运动。根据牛顿第二定律 Fma在三维空间中无人机在 x、y、z 方向上的合力分别产生相应方向的加速度。在代码中通过计算控制加速度考虑位置误差、速度误差以及风干扰来更新无人机的速度和位置体现了该定律的应用。例如axKpx∗exKdx∗evx0.5∗windX(i) 计算出 x 方向的加速度随后用于更新 x 方向的速度 vx(i1)vx(i)ax∗dt 和位置 x(i1)x(i)vx(i)∗dt。刚体动力学四旋翼无人机可看作刚体其姿态运动遵循刚体动力学原理。姿态角滚转 roll、俯仰 pitch、偏航 yaw的变化由作用在机体上的力矩决定。在代码里通过计算期望姿态角、角度误差并结合角速度的更新和积分来模拟姿态的变化。如根据 x、y 方向的加速度计算期望滚转和俯仰角rollref−0.04∗aypitchref0.04∗ax再通过角度误差更新角速度进而积分得到姿态角的变化。2. 轨迹跟踪控制策略比例 - 微分PD控制这是一种常用的反馈控制策略在代码中用于位置控制。比例P环节根据当前位置与参考位置的误差来产生控制量误差越大控制量越大它能快速对误差做出响应但可能存在稳态误差。微分D环节则基于误差的变化率来调整控制量能预测误差的变化趋势提前做出反应有助于减少超调并提高系统的稳定性。例如在 x 方向控制加速度的计算axKpx∗exKdx∗evx0.5∗windX(i)其中 Kpx 是比例增益Kdx 是微分增益ex 是位置误差evx 是速度误差通过这两个环节共同作用使无人机跟踪参考轨迹。前馈控制思想的体现虽然代码中未明确标记为前馈控制但在考虑风干扰时体现了类似思想。通过将风干扰纳入控制加速度的计算如 ax 和 ay 的计算中包含风干扰项提前对可能影响无人机运动的因素做出补偿有助于提高轨迹跟踪的精度。3. 姿态控制原理姿态与力 / 力矩的关系无人机的姿态变化会影响其产生的升力方向从而实现不同方向的运动控制。例如滚转和俯仰姿态的改变会使升力在水平方向产生分量用于控制 x 和 y 方向的运动。在代码中根据期望的水平加速度计算期望的滚转和俯仰角以此来调整姿态以实现相应方向的运动控制。角度与角速度的积分关系姿态角的变化是通过对角速度进行积分得到的。在代码里先根据角度误差更新角速度如 p(i1)p(i)4∗eroll∗dt 对于滚转角速度的更新然后通过积分如 roll(i1)roll(i)p(i1)∗dt得到姿态角的变化从而模拟无人机姿态的动态变化过程。4. 干扰处理与稳定性维持风干扰模拟实际飞行中风会对无人机产生干扰影响其飞行轨迹和稳定性。代码通过定义 x 和 y 方向的风干扰函数windX0.2∗sin(0.5∗t) 和 windY0.2∗cos(0.3∗t)并将其纳入控制加速度的计算使无人机在模拟过程中能够应对风的影响体现了对实际干扰因素的考虑。限制加速度为确保无人机运动在合理范围内防止因控制量过大导致不稳定对计算得到的控制加速度进行限制如 axmax(min(ax,3),−3)。这有助于维持无人机的飞行稳定性避免出现异常的加速或减速情况。防止地面碰撞通过检测高度z 坐标当 z(i1)0 时将高度和垂直速度强制设为零z(i1)0vz(i1)0防止无人机与地面碰撞这是保障无人机安全飞行的重要措施。⛳️ 运行结果 部分代码%% ADVANCED REPOSITORY 01% Autonomous Drone Flight Control System% Stable 2D Drone Simulationclc;clear;close all;%% TIME SETTINGSdt 0.02;tEnd 20;t 0:dt:tEnd;N length(t);%% DRONE PARAMETERSm 1.0;g 9.81;%% STATESx zeros(1,N);z zeros(1,N);vx zeros(1,N);vz zeros(1,N);%% INITIAL CONDITIONSx(1) 0;z(1) 1;%% REFERENCE TRAJECTORYx_ref linspace(0,20,N);z_ref 5 0.5*sin(0.4*t);%% CONTROLLER GAINSKp_x 1.2;Kd_x 1.8;Kp_z 4.5;Kd_z 3.0;%% WIND DISTURBANCEwind 0.3*sin(0.5*t);%% CONTROL INPUTSax_cmd zeros(1,N);az_cmd zeros(1,N);%% MAIN SIMULATION LOOPfor i 1:N-1%% POSITION ERRORSex x_ref(i) - x(i);ez z_ref(i) - z(i);%% VELOCITY ERRORSevx -vx(i);evz -vz(i);%% CONTROLLERax_cmd(i) ...Kp_x*ex Kd_x*evx;az_cmd(i) ...Kp_z*ez Kd_z*evz;%% LIMIT ACCELERATIONax_cmd(i) ...max(min(ax_cmd(i),3),-3);az_cmd(i) ...max(min(az_cmd(i),5),-5);%% SYSTEM DYNAMICSax ax_cmd(i) wind(i);az az_cmd(i);%% INTEGRATEvx(i1) vx(i) ax*dt;vz(i1) vz(i) az*dt;x(i1) x(i) vx(i)*dt;z(i1) z(i) vz(i)*dt;%% PREVENT GROUND COLLISIONif z(i1) 0z(i1) 0;vz(i1) 0;endend%% TRAJECTORY FIGUREfigure(1);plot(x_ref,z_ref,--,LineWidth,2);hold on;plot(x,z,LineWidth,2);grid on;xlabel(Horizontal Position (m));ylabel(Vertical Position (m));title(Drone Trajectory Tracking);legend({Reference,Drone Path});%% SAVE FIGURE 1saveas(gcf,drone_trajectory.png);%% STATES FIGUREfigure(2);subplot(2,1,1);plot(t,x,LineWidth,1.5);hold on;plot(t,x_ref,--);grid on;ylabel(X Position);legend({Actual,Reference});subplot(2,1,2);plot(t,z,LineWidth,1.5);hold on;plot(t,z_ref,--);grid on;ylabel(Z Position);xlabel(Time (s));legend({Actual,Reference});%% SAVE FIGURE 2saveas(gcf,drone_states.png);%% ANIMATIONfigure(3);filename drone_animation.gif;for i 1:10:Nclf;plot(x_ref,z_ref,--);hold on;plot(x(1:i),z(1:i),b,LineWidth,2);% DRONE BODYdroneWidth 0.6;droneX [x(i)-droneWidth ...x(i)droneWidth];droneZ [z(i) z(i)];plot(droneX,droneZ,r,LineWidth,5);% DRONE CENTERplot(x(i),z(i),ko,...MarkerSize,8,...MarkerFaceColor,k);xlim([0 22]);ylim([0 8]);xlabel(Horizontal Position (m));ylabel(Vertical Position (m));title(Autonomous Drone Animation);grid on;drawnow;frame getframe(gcf);im frame2im(frame);[A,map] rgb2ind(im,256);if i 1imwrite(A,map,filename,...gif,...LoopCount,Inf,...DelayTime,0.05);elseimwrite(A,map,filename,...gif,...WriteMode,append,...DelayTime,0.05);endend%% PERFORMANCE METRICStrajectoryError mean( ...sqrt((x_ref - x).^2 ...(z_ref - z).^2));%% RESULTSfprintf(\nAUTONOMOUS DRONE RESULTS:\n);fprintf(Final X Position %.4f m\n,x(end));fprintf(Final Z Position %.4f m\n,z(end));fprintf(Mean Trajectory Error %.4f m\n,trajectoryError);fprintf(\nFiles saved successfully:\n);fprintf(1. drone_trajectory.png\n);fprintf(2. drone_states.png\n);fprintf(3. drone_animation.gif\n);%% END 参考文献更多免费数学建模和仿真教程关注领取