简介:这套四旋翼无人机Simulink仿真方案以PID控制为核心,面向自动化、电子信息、计算机、数学等专业学生的课程设计、期末大作业与毕业设计,也适合刚接触无人机建模与控制的初学者对照实践。压缩包共包含11个文件,包括7个.slx仿真模型、2个.m脚本、1个说明txt和1个README.md,体积仅144KB,结构紧凑但覆盖了从模型搭建、参数设置到仿真运行的完整链路。模型采用参数化编程,用户可直接修改PID比例、积分、微分增益,配合附赠案例数据一键运行,直观观察四旋翼姿态角与位置响应;代码注释明细,支持MATLAB 2014a/2019a/2024a等多个版本。已有274人学习使用,读者通过调整参数即可理解PID各环节的作用,也可据此开展系统稳定性分析和控制策略优化,是一份兼顾教学演示与自主探究的实用仿真工具。 直接拿到那份“采用PID控制的四旋翼无人机Simulink.rar”的时候,我其实没抱太大期望。做飞控仿真这几年,类似的压缩包见得太多了,点开之后十有八九是缺文件、缺配置,甚至模型根本跑不起来。但这套东西解压完倒是让我愣了一下:模型结构完整,PID双环控制链路清晰,Parameters脚本也写得规规矩矩,属于那种拿过来改改就能用的类型。这篇文章就把我折腾这套Simulink模型的过程从头捋一遍,从压缩包里有什么,到PID双环怎么搭,再到怎么把悬停仿真跑起来、怎么调参数,最后聊聊仿真和真机之间那点容易踩坑的差异。想入门四旋翼控制、或者正在做毕设、项目预研的朋友,应该能从中挖到不少能直接落地的细节。
1. 先解开压缩包:这套模型文件到底是怎么组织的
拿到rar文件,第一件事不是双击解压,先看一眼压缩包体积和文件个数。这套模型解压之后大概是十几MB的量级,里面不是单个slx文件一扔了事,而是按功能拆了几个模块,外加一个主模型。这种组织方式本身就是个加分项——很多新手发的模型,所有逻辑全塞在一个文件里,信号线拉得跟蜘蛛网一样,看着就头大。
解压后典型的文件清单会有这么几类:
- 主Simulink模型文件,后缀.slx,核心仿真入口。
- 初始化脚本,通常是.m文件,用来预载无人机质量、轴距、惯性张量、PID系数、PWM饱和范围等全部参数。
- 子模块文件,比如电机模型、螺旋桨推力模型、姿态解算模块,有的会独立封装。
- 说明文档或README,但这份模型里说明不多,注释倒是写了一些。
如果你拿到手的压缩包里没有初始化脚本,那就要警惕了。Simulink模型里如果直接用变量名作为参数,工作区没加载对应数值,模型一打开参数就是空的,仿真必然报错。这个模型的初始化脚本写得很典型,基本是结构体赋值,比如:
% 四旋翼参数 param.m = 1.2; % 质量,kg param.l = 0.25; % 机臂长度,m param.Ixx = 0.012; % 绕x轴转动惯量 param.Iyy = 0.012; param.Izz = 0.023; % PID控制器系数 ctrl.Kp_phi = 6.5; ctrl.Ki_phi = 0.1; ctrl.Kd_phi = 0.4;这种写法的好处是参数集中,调试的时候不用翻几十个模块去改常量。模型和脚本分离,也是Capstone项目、课程设计中比较标准的做法。拿到任何四旋翼Simulink模型,先看有没有这样的结构,比打开模型猛点Run要靠谱得多。
2. PID控制在四旋翼里到底是怎么干活的——双环控制拆开看
四旋翼飞行器的核心控制问题,可以通俗理解成:怎么让飞机又快又稳地到达目标姿态和位置。而PID控制是这个领域最经典、最基础、也是工程上最常用的算法。你在Simulink里看到的PID控制,不是简单一个传递函数加上去就完事,而是有明确物理含义的结构。
这套模型采用的是级联PID控制,也就是业内常说的双环PID。外环控制位置、内环控制姿态,两个环串在一起,一层套一层。很多刚开始接触四旋翼的同学会困惑:为什么不用一个PID直接把油门给到电机?原因在于四旋翼是一个强耦合、非线性系统,而且底层执行的是姿态控制。你想让无人机飞到某个点,它不能直接说“我要去那儿”,它只能通过改变姿态来产生水平方向的分力,从而产生平移加速度。所以位置控制环的输出,其实是期望的横滚角、俯仰角——也就是说,外环输入给内环的不是力,而是角度指令。
具体到这个模型里,控制链路大概是这样的:
- 位置环:输入期望位置和当前位置的误差,经过PID运算后,输出期望横滚角、期望俯仰角以及期望升力(通常对应总油门)。
- 姿态环:接收外环传下来的期望角度,结合当前姿态角,用另一套PID算出三个轴的期望力矩。
- 控制分配:把期望力矩和总升力,通过混控矩阵换算成四个电机的转速指令或PWM占空比。
- 执行机构:电机与螺旋桨模型,把转速/占空比转化为推力和力矩。
- 刚体动力学:根据推力和力矩,更新无人机的线加速度、角加速度、速度、位置和姿态。
角度环之所以叫内环,是因为它靠近执行机构,响应快。位置环离执行机构远,响应慢,因此外环频率一般比内环低。Simulink里通常用不同的采样周期或者连续模型模拟这种特性。纯连续模型虽然仿真好跑,但真机上一定是离散控制的,关键区别我在第四节详细说。
这种双环结构在Simulink里看起来就是两层子系统套嵌。打开姿态环子系统,常见的有Repeating Sequence、Signal Generator之类的信号源,也有直接接外环信号的地方。模型里通常有Deg2Rad等转换模块,因为位置环算出来的角度单位是度还是弧度,直接影响PID增益的物理量纲,这一块也是最容易看晕的地方。
3. 跟着模型把悬停仿真跑起来——手把手操作链路
跑通这套模型其实不复杂,但有几个操作顺序不能乱,顺序一错,仿真结果就飘了。
第一步,打开MATLAB,先运行初始化脚本。不要急着打开Simulink模型。把当前目录切换到解压出的文件夹,然后在命令行敲脚本名,比如:
quad_init运行完可以在工作区看到param、ctrl等结构体变量,说明参数已经加载。如果你用的是MATLAB R2018a之后的版本,也可以直接打开模型,Simulink会自动提示缺失变量,这时运行脚本即可。
第二步,打开主模型。双击.slx文件,模型会加载出来。这个模型整体结构是分层的,最上层可以看到几个大色块:控制器、电机模型、刚体动力学、环境设置、传感器(在悬停仿真里可能就是直接反馈)。信号线用不同颜色区分,蓝线通常是角度/位置信号,红线是控制量,绿线是PWM或者转速信号,这是比较标准的配色习惯。
第三步,检查仿真参数。点Simulation右上角的下拉菜单,看Stop Time是多少。一般这个模型默认是10秒或20秒。悬停工况的话,20秒足够了。求解器设置这里有个重点:如果模型是连续时间结构,选ode45(变步长);如果模型里带PWM发生器、MOSFET开关等高频器件,那就要考虑定步长,步长要小到能适应最小时钟周期。四旋翼纯动力学仿真用ode45没问题,但如果你看到模型里有PWM Generator之类模块,最好改成定步长,比如1e-4秒。
第四步,设置期望值。在位置环的输入端,找到期望位置信号。如果默认是[0,0,0],那无人机就是要原地悬停。你可以换成[2,0,1],意思就是飞到x方向2米、高度1米。模型里通常会用一个Step模块或者Constant模块接在期望位置入口,改Constant值是最不破坏模型结构的操作方式。
第五步,点击Run,然后看Scope。模型里示波器可能已经内置,也可能需要自己加。如果你要仔细观察姿态响应,右键选中角度信号线,然后选择Create and Connect Viewer,就能快速拉出一条Scope来看曲线。
跑完之后,如果顺利,位置曲线会从初始值收敛到目标值,姿态角在小范围内波动,电机转速曲线稳定在悬停转速附近。这就是一套合格的悬停仿真过程。
有个容易踩的坑:有些模型里,油门被直接固定成一个常值,这时候位置环的输出要被忽略掉,飞机会稳定在某个姿态但高度无法保持。遇到这种情况不是模型错,而是运行前要把控制模式切换接到“位置控制”档位,查看软件里有没有Mode选择开关或多路开关模块,确认走的是“Full PID”而不是“Rate Only”。
4. 调参实战:比例、积分、微分到底该动谁、怎么动
跑通只是第一步,调试才见真功夫。杂牌模型的PID系数往往是拍脑袋填的,完全不适合你的参数,必须重调。我在这个模型上花的时间,大半都在调PID。调参的本质就一句话:用一组增益,让系统在响应速度和稳定性之间找到平衡。
四旋翼的PID调参,通常从内环(姿态环)开始,再调外环(位置环)。这不像做数学题,要按顺序来,不能内外环混着一起调,否则哪个环有问题你都看不出来。
先看内环,也就是姿态环。给一个期望角度阶跃,观察角度跟踪曲线。
Kp的作用是比例放大误差,Kp太小,飞机反应迟钝,角度爬升慢,阶跃响应显得“懒”;Kp太大,角度会超调,严重时来回震荡,甚至发散。实操时可以先把Ki和Kd先设成0,只留Kp慢慢加大。找到一个Kp,让阶跃响应又快又没有明显超调,这个值作为基础值。
在这个模型里,横滚角通道我最终用了Kp=6.5,Kd=0.4,Ki=0.1。这组参数下,阶跃响应大概在0.5秒内收敛到目标角,超调量小于5%。如果你的阶跃响应发散,别急着加微粉,先检查符号方向:有些模型姿态角的反馈正负接反了,Kp加得再大也只会加剧震荡。
Kd的作用是抑制超调和振荡。Kd是对误差变化率的响应,相当于“提前刹车”。但如果Kd过大,系统对噪声特别敏感,传感器信号有点抖动就会被放大成控制量抖动,反而导致高频振颤。仿真里用的是理想模型,没有传感器噪声,Kd可以稍微加猛一点。真机上Kd一般比仿真值要小,这都是正常情况。
Ki的作用是消除稳态误差。如果悬停时角度偏着回不到零,或者高度差那么一点点一直补偿不了,那就是积分在干活。但积分不能给太猛,积分饱和是仿真和真机都会遇到的常见问题。模型里的积分器要加限幅,Simulink自带PID Controller模块中可以直接设置Integrator saturation和Anti-windup method。积分饱和的现象是:误差长期存在时,积分项一直累加到很大的值,误差变成零之后,积分项还要花很长时间才能回落,导致明显超调。我的做法是给积分限幅设为控制量最大输出的10%-20%,足够消除稳态误差,也不会造成积分膨胀。
外环(位置环)的调法类似,但通道特征完全不同。位置环因为隔着姿态内环,系统的等效时间常数更大,所以位置环Kp要比内环小得多。如果内环姿态Kp是6.5,外环位置Kp往往只有0.5到1.5。先给一个位置阶跃,比如x方向期望从0变成2米,看位置曲线怎么走。如果缓慢爬升回不到目标,说明Kp不够;如果来回振荡,说明Kp偏大。
这个模型里还有个很容易忽略的点:位置环的输出要乘一个比例系数换算成期望角度。位置环Kp=0.8时,如果直接输出期望角,那2米误差输出1.6度,看起来好像不大,但经过内环后控制量还会放大。所以调外环的时候,要看中间变量。我习惯在位置环输出线上直接挂一个Display模块,实时看期望角度是不是在合理范围。姿态期望超过正负45度,基本就是参数不合适或工况太激进。
调参过程我建议做一个表格记录,这是我一直以来的习惯,别嫌麻烦,最后你会为这堆数据感激自己。
| 参数 | 初值 | 现象描述 | 调整方向 | 最终值 |
|---|---|---|---|---|
| Kp_phi | 2.0 | 跟踪慢,稳态误差0.3度 | 增加Kp | 6.5 |
| Kd_phi | 0 | 阶跃超调25% | 增加Kd | 0.4 |
| Ki_phi | 0 | 稳态误差0.5度不消除 | 增加Ki限幅0.02 | 0.1 |
| Kp_pos | 0.2 | x方向跟踪缓慢且不动 | 增加Kp | 0.9 |
| Kd_pos | 0 | 位置轻微超调 | 增加Kd | 0.6 |
| Ki_pos | 0 | 高度误差稳定在0.05m | 增加Ki限幅0.01 | 0.02 |
注意表格里的“最终值”是针对这个模型质量和轴距的参数,不同飞机差别巨大。换一架1.5kg的机架,Kp可能得翻倍。拿着别人的参数直接硬套,是调参里最容易翻车的事情。
5. 从Simulink到真机——仿真跑得好,真机也可能翻车
这是我认为整套内容中最值得琢磨的一节。很多同学做完仿真会觉得“控制器没问题了”,结果上真机炸机,回来一脸懵。仿真和真机之间的距离,不是一根USB线能解决的。
第一个差距是时间离散化问题。Simulink连续模型的控制器是连续作用,而真机飞控里的PID控制器是定时中断执行的,典型控制频率在250Hz到1kHz之间。同样是PID,离散PID和连续PID对同一组增益的反应会有细微差别。如果你要更贴近真机,建议在Simulink里把控制器部分改成离散模块,设置采样时间。
第二个差距是传感器噪声和延迟。仿真里姿态角直接从理想模型拿,数据处理零延迟、零噪声。真机上陀螺仪有噪声,加速度计在振动环境中更是惨不忍睹,姿态解算还要过互补滤波或卡尔曼滤波,滤波本身的相位延迟就会让控制环路的稳定性变差。这也是为什么仿真时Kd可以加大,真机上Kd必须降下来的根本原因——微分项对噪声太敏感。
第三个差距是执行机构模型。这套Simulink模型里电机模型多半是简化的一阶惯性环节或直接查表,而真实电调、电机、螺旋桨组合有死区、饱和、延迟和反电动势等非线性特性。特别是PWM死区,会让小控制量区域出现无响应,这也是PID里积分项存在的意义之一。真机调试时会发现,同样一组PID,在仿真上曲线平滑,在真机上悬停起来就会有微微的呼吸感,那大概率是电机转速不平衡或螺旋桨动平衡问题,不一定是PID的锅。
所以我的建议是:仿真里验证控制结构、大致调参、分析稳定性,这绝对有价值;但真机调试要把PID增益整体降到仿真值的50%-80%,再在安全环境里重新爬。别迷信仿真参数,真机才是最终裁判。
6. 把这套模型拿去做开发,后续还能怎么扩展
如果你打算在这套四旋翼Simulink模型基础上继续做项目,而不是交完作业就再也不碰它,有几个扩展方向非常值得投入。
第一,加入更真实的传感器模型。现在很多Simulink版本自带IMU模型,可以直接输出带噪声和偏置的加速度、角速度信号。接进去之后,你的姿态解算模块就有活干了,控制器也能感受到噪声的影响。
第二,换成自动代码生成。在Simulink里搭好控制器之后,可以开启Embedded Coder生成C代码,烧到STM32或Pixhawk的仿真环境里做处理器在环测试。很多热词里提到的“Simulink模型 C代码生成”,就是干这个的。这个流程能让你从算法仿真平滑过渡到嵌入式实现,等于在电脑上先把控制器到代码的最后一公里走通。
第三,融入强化学习做自适应PID。当前PID参数固定,而四旋翼在不同载重、风速下最优参数变化很大。更时髦的做法是PID+强化学习结合,比如用强化学习在线调节Kp、Ki、Kd,或者在PID基础上加一个补偿网络。不过这个方向水比较深,建议先把经典PID吃透再说。
第四,用这个模型做联合仿真或外部模式调试。Simulink的外部模式支持把模型连接到实际硬件,一边采集真机数据一边在线改参数,适合做HIL测试。方向很多,但万变不离其宗:先把这套基础模型的PID逻辑内化,后面往哪个方向发展都不慌。
最后分享一个我个人的小习惯:在Simulink里,所有PID模块的输出端,我都会手动加一个Saturation模块,限幅值等于电机的可执行范围。这不是Simulink强制要求的,但真机控制量一旦进入饱和区,积分项如果还在持续累加,积分的“风阻效应”就会把你坑得很难受。加上限幅和抗积分饱和,曲线立刻干净很多。这套代码里虽然没有显式把这两个模块全画出来,但理解到位后自己加上去,效果立竿见影。
本文还有配套的精品资源,点击获取