简介这份资源面向无人机控制方向的学生、科研人员与工程实践者提供一套基于MATLAB/Simulink搭建的四旋翼飞行控制与轨迹跟踪仿真系统可用于课程设计、毕业设计或控制算法验证。压缩包共2个文件包含1个m脚本与1个md说明文档整体约5KB脚本负责仿真主流程与参数配置说明文档则交代运行方式与模型结构便于快速上手。资源围绕PID控制思路展开覆盖姿态稳定与轨迹跟踪两类典型任务读者可据此理解四旋翼动力学建模、控制器参数整定与仿真结果分析的基本流程。目前已有87人学习下载适合希望以较小体量快速搭建仿真框架、对照修改控制参数并观察跟踪效果的学习者参考。1. 四旋翼仿真不是搭积木先搞清楚这套 Simulink 模型到底能跑出什么很多人第一次接触四旋翼控制第一反应是去网上找一个“能飞”的模型拖进 Simulink 点运行看到三维动画里飞机歪歪扭扭升起来就以为搞定了。结果一改参数就发散一加轨迹跟踪就画龙最后连自己错在哪都不知道。这套 MATLAB/Simulink 四旋翼无人机飞行控制与轨迹跟踪仿真系统解决的就是这个断层它把动力学建模、PID 姿态控制、位置环与轨迹跟踪、三维可视化串成一条完整链路让你能看到每个环节的输入输出而不是只盯着一个会动的方块。适合正在做毕设、课程设计或者刚转进无人机控制方向、需要一套能改能调的基准模型的工程师。它不追求花哨追求的是你打开每一个子系统都知道里面在算什么。2. 从动力学方程到 Simulink 模块这套模型的控制链路怎么搭2.1 四旋翼的刚体动力学与电机模型四旋翼的本质是一个欠驱动系统四个电机产生升力和反扭矩通过差动改变姿态再通过姿态倾斜产生水平分力实现平移。常见做法是在 Simulink 里用两个层级来搭外层是六自由度刚体运动方程内层是电机-旋翼的推力/扭矩映射。刚体方程一般写成牛顿-欧拉形式位置环和姿态环分开算。位置环输出期望的滚转角和俯仰角姿态环再跟踪这两个角度。我一般会把参数集中在一个params.m脚本里避免在模块里到处填数字。下面这段是典型的参数初始化单位统一用国际单位制避免后面量纲翻车。% params.m 四旋翼参数初始化 m 1.2; % 机体质量 kg g 9.81; % 重力加速度 m/s^2 L 0.25; % 机臂长度 m b 3.13e-5; % 推力系数 N/(rad/s)^2 d 7.5e-7; % 反扭矩系数 N·m/(rad/s)^2 Ixx 0.012; % 绕x轴转动惯量 kg·m^2 Iyy 0.012; % 绕y轴转动惯量 Izz 0.022; % 绕z轴转动惯量 Ts 0.001; % 仿真步长 s这段脚本的作用是把物理参数和仿真步长解耦出来。b和d决定了电机转速到力和力矩的换算如果你换了一架不同桨叶的机架改这两个值比改模块里的增益靠谱得多。Ts设成 1 ms 是常见选择再大容易在姿态环里丢高频动态再小对普通笔记本来说仿真时间会明显拉长。2.2 姿态环 PID为什么先调内环再调外环姿态环是四旋翼控制的命门。滚转、俯仰、偏航三个通道各自一个 PID输入是期望角度与实际角度的误差输出是期望力矩。很多人一上来就把三个通道一起调结果滚转稳了俯仰又抖最后陷入玄学调参。正确顺序是先锁死位置环只给姿态环一个阶跃期望单独调滚转通道再加俯仰最后加偏航。下面是一个典型的姿态 PID 实现写成 MATLAB Function 模块嵌进 Simulink比拖一堆 Gain 和 Integrator 更直观。function torque attitudePID(phi_ref, theta_ref, psi_ref, phi, theta, psi, p, q, r, dt) % 姿态环PID输入期望角/实际角/角速度输出三轴力矩 persistent int_phi int_theta int_psi if isempty(int_phi) int_phi 0; int_theta 0; int_psi 0; end % PID增益先调滚转再调其他 Kp_phi 0.8; Ki_phi 0.05; Kd_phi 0.12; Kp_theta 0.8; Ki_theta 0.05; Kd_theta 0.12; Kp_psi 0.5; Ki_psi 0.02; Kd_psi 0.08; e_phi phi_ref - phi; e_theta theta_ref - theta; e_psi psi_ref - psi; int_phi int_phi e_phi * dt; int_theta int_theta e_theta * dt; int_psi int_psi e_psi * dt; % 积分限幅防止windup int_phi max(min(int_phi, 0.5), -0.5); int_theta max(min(int_theta, 0.5), -0.5); int_psi max(min(int_psi, 0.5), -0.5); torque(1) Kp_phi*e_phi Ki_phi*int_phi - Kd_phi*p; torque(2) Kp_theta*e_theta Ki_theta*int_theta - Kd_theta*q; torque(3) Kp_psi*e_psi Ki_psi*int_psi - Kd_psi*r; end逻辑上比例项负责响应速度积分项消除稳态误差微分项用角速度反馈代替角度差分避免噪声放大。参数上Kp从 0.5 开始往上加直到出现小幅振荡再回退 30%Kd用来压振荡但太大会让电机输出抖。积分限幅是血泪经验不加的话一旦期望角突变积分项会累积到发散。2.3 位置环与轨迹跟踪把 XYZ 期望转成姿态期望位置环的输出不是直接给电机而是给姿态环当期望角。常见做法是高度通道单独一个 PID 控制总推力水平 XY 通道各一个 PID 输出期望滚转和俯仰角。轨迹跟踪则是在位置环前面加一个轨迹生成器比如圆形、八字形或螺旋线把时间序列的期望位置喂进去。% trajectory.m 生成圆形轨迹期望 t 0:Ts:20; % 仿真时间20秒 R 2; % 圆半径 m omega 0.5; % 角速度 rad/s x_ref R * cos(omega * t); y_ref R * sin(omega * t); z_ref 1.5 * ones(size(t)); % 定高1.5m这段生成的是水平圆轨迹加定高。R和omega决定轨迹的尺度和快慢如果飞机跟不上先降omega再调位置环增益。位置环 PID 的Kp一般比姿态环小一个量级因为位置误差到角度期望的映射本身有放大。3. 在 Simulink 里把模型跑起来求解器、步长与三维可视化的实操配置3.1 求解器选型与步长设置Simulink 里四旋翼模型是连续刚体加离散控制器的混合系统求解器选错直接导致仿真结果不可信。常见做法是用ode4四阶龙格-库塔固定步长步长跟控制器采样周期一致比如 1 ms。变步长ode45虽然省时间但在电机饱和或轨迹拐点处容易跳步导致姿态曲线出现假振荡。配置路径在Model Settings SolverType 选Fixed-stepSolver 选ode4Fixed-step size 填Ts。如果模型里有代数环Simulink 会报错这时候在反馈路径上加一个Unit Delay或者用Algebraic Constraint模块但更推荐前者因为延迟一个步长对 1 ms 系统影响可忽略。3.2 三维可视化用 MATLAB Function 驱动动画Simulink 自带的Aerospace Blockset有现成动画但如果你没装那个工具箱可以用 MATLAB Function 模块写一个简单的三维方块动画。核心是把位置和姿态四元数或欧拉角传进去用plot3画机体坐标轴。function drawDrone(x, y, z, phi, theta, psi) % 简化三维可视化画机体三轴 persistent h if isempty(h) figure; grid on; axis equal; xlabel(X); ylabel(Y); zlabel(Z); xlim([-5 5]); ylim([-5 5]); zlim([0 4]); h animatedline(Color,b,LineWidth,2); end addpoints(h, x, y, z); drawnow limitrate; end这个函数每步调用一次animatedline画轨迹drawnow limitrate控制刷新率避免仿真被绘图拖慢。注意persistent变量在 Simulink 里每个仿真周期保持但如果你反复运行模型记得在InitFcn里清一下否则会叠加上一次的轨迹。3.3 数据记录与后处理仿真跑完你需要看姿态误差、位置误差、电机转速。常见做法是在信号线上加To Workspace模块保存成out结构体或数组。我一般把关键信号存成logsout然后用下面这段脚本画图。% plot_results.m figure; subplot(3,1,1); plot(out.tout, out.phi_ref, r--, out.tout, out.phi, b); ylabel(滚转角 rad); legend(期望,实际); subplot(3,1,2); plot(out.tout, out.x_ref, r--, out.tout, out.x, b); ylabel(X位置 m); subplot(3,1,3); plot(out.tout, out.u1, k); ylabel(电机1转速 rad/s);out.tout是仿真时间out.phi_ref和out.phi分别是期望和实际滚转角。如果实际曲线滞后期望超过 0.2 s说明姿态环带宽不够先加Kp再看。4. 避坑与排查四旋翼仿真里最容易翻车的五个地方4.1 现象飞机一离地就翻姿态角瞬间发散原因姿态环 PID 的微分项用了角度差分而不是角速度或者角速度符号搞反。四旋翼的滚转力矩和滚转角速度方向必须一致如果p的符号在反馈里反了相当于正反馈。解决检查角速度来源确保p是绕机体 X 轴、右手定则正方向。用Kd项时直接乘p不要对角度做差分。4.2 现象轨迹跟踪时飞机在圆轨迹上画龙位置误差周期性振荡原因位置环Kp太大或者轨迹生成器的omega超过了位置环带宽。位置环输出期望角期望角变化太快姿态环跟不上形成相位滞后。解决先把omega降到 0.3 rad/s位置环Kp从 0.5 开始试观察 X 位置误差是否收敛。如果还振荡加一点位置环Kd但不要超过Kp的 1/5。4.3 现象仿真跑几秒后电机转速饱和飞机高度掉下来原因高度环积分项 windup。期望高度突变时积分项累积到很大实际高度超调后积分项退不回来总推力被限幅。解决在高度 PID 里加积分限幅限幅值根据悬停推力估算。悬停时总推力等于m*g单个电机推力约m*g/4对应转速约sqrt(m*g/(4*b))积分限幅设成这个值的 20% 左右。4.4 现象Simulink 报代数环错误模型无法编译原因姿态环输出力矩直接进动力学动力学输出角速度又直接回姿态环没有延迟。解决在姿态环反馈路径加Unit Delay步长 1 ms 对控制性能影响很小。或者把姿态环改成离散 PID采样周期TsSimulink 会自动处理。4.5 现象三维动画卡顿仿真时间远大于实际时间原因drawnow每步都刷新绘图占用了大部分计算资源。解决用drawnow limitrate或者每 10 步画一次。也可以在Model Settings Simulink Simulation Target里把动画模块单独设成不参与代码生成减少开销。5. 进阶玩法把 PID 换成 LQR 和轨迹前馈以及怎么验证模型可信5.1 从 PID 到 LQR线性化与权重调参PID 调参靠试LQR 靠模型。四旋翼在悬停点附近可以线性化成 12 状态方程位置、速度、姿态角、角速度然后用lqr函数算增益。常见做法是在 MATLAB 里先做数值线性化再回填 Simulink。% linearize_and_lqr.m % 假设已定义非线性模型函数 droneDynamics [A, B] linmod(quadrotor_model); % Simulink线性化 Q diag([10 10 10 1 1 1 5 5 5 0.5 0.5 0.5]); % 状态权重 R diag([1 1 1 1]); % 输入权重 K lqr(A, B, Q, R);Q对角线对应 12 个状态的惩罚位置和姿态权重给大角速度给小。R是四个电机输入的惩罚越大控制越保守。LQR 的好处是姿态和位置一起算不用分层调但前提是线性化点选在悬停附近大机动下会退化。5.2 轨迹前馈让跟踪误差再降一个量级纯反馈跟踪总有滞后加前馈能补上。对圆形轨迹期望加速度可以直接解析求导然后通过逆动力学算出前馈力矩和推力。% feedforward.m x_ref R*cos(omega*t); y_ref R*sin(omega*t); ax_ref -R*omega^2*cos(omega*t); ay_ref -R*omega^2*sin(omega*t); % 前馈姿态角 phi_ff (ax_ref*sin(psi) - ay_ref*cos(psi)) / g; theta_ff (ax_ref*cos(psi) ay_ref*sin(psi)) / g;把phi_ff和theta_ff直接加到姿态环期望上反馈只负责修残差。实测下来同样Kp下跟踪误差能降 60% 以上。注意前馈依赖轨迹二阶导如果轨迹是阶跃前馈会冲激这时候要加低通滤波。5.3 验证模型可信度的三个硬指标第一悬停时总推力是否等于重力。跑一个定高仿真稳定后看四个电机推力之和和m*g差超过 5% 说明参数或映射有问题。第二姿态阶跃响应超调量是否在 10%20%。太小说明响应慢太大说明阻尼不够。第三圆轨迹跟踪的稳态误差是否随omega增大而单调增大。如果出现非单调大概率是某个通道饱和了。我一般会在改完参数后强制跑一遍这三个指标不通过就不往下做。从那以后每次换机架参数或者改控制结构都先把这三项过一遍省了很多返工。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?