ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Matlab四旋翼模糊控制仿真:从建模到调参完整指南

Matlab四旋翼模糊控制仿真:从建模到调参完整指南 简介近年来随着无人机在航拍、巡检、农业植保等场景的普及四旋翼无人机的稳定飞行与精确控制备受关注。基于Matlab的四旋翼无人机模糊控制仿真资源包面向无人机控制、智能控制领域的研究者、工程师及高校学生可直接用于四旋翼姿态与位置控制的模糊控制器设计、仿真与效果验证。压缩包共13个文件以11个.m脚本为主体覆盖仿真主程序、模糊控制器、启动运行脚本以及无人机动力学建模和位姿转换等工具函数另有1张系统示意图与1段avi仿真演示视频包体仅1.77MB模块划分明确、便于按需复用目前已有124人学习。借助它可快速掌握四旋翼动力学建模方法深入理解模糊集合、模糊规则与隶属函数在飞行控制中的实际设计流程并通过轨迹生成与结果可视化评估不同控制策略为算法改进和实机移植提供参考基础。1. 从“仿真发散”说起为什么四旋翼控制要先问模糊逻辑用Matlab做四旋翼无人机模糊控制仿真最先遇到的往往不是控制率设计而是仿真发散。四旋翼是典型的欠驱动、强耦合非线性系统传统PID在不同油门和姿态角下需要反复整定稍微改一下电机力臂或质量整套增益就可能失效。模糊控制把“误差大就猛打、误差小就回正”这类飞行员经验写成规则表不依赖精确的数学模型尤其适合用来做姿态内环。这篇博客就围绕“Matlab四旋翼模糊控制仿真”的最小闭环展开从开环动力学建模到用Fuzzy Logic Toolbox生成控制器再到Simulink闭环调参每一步给出可直接运行的代码、参数和避开仿真发散的具体做法。读者只要有Simulink基础能看懂状态方程就能顺着这条路径把模糊控制真正跑起来。2. 建模先行用Matlab把四旋翼无人机动力学写成可仿真状态方程2.1 状态量与坐标系仿真前的定义直接决定控制器复杂度四旋翼的位置状态一般定义在惯性系取东北天坐标姿态状态定义在机体系用欧拉角或四元数表示。做模糊控制仿真时我习惯把状态量拆成12维[x y z phi theta psi u v w p q r]但控制器只接姿态相关状态。原因是模糊控制器的输入维数一旦超过两个规则数量会按指数爆炸仿真模型也会因为高维规则计算变慢。所以在建模阶段就要明确模糊控制器只管姿态内环位置外环交给线性PID这样既能保留模糊控制的鲁棒性又不会让规则表变成一本猜不透明的手册。坐标系选择直接影响欧拉角更新方程。常见的Z-Y-X旋转顺序下姿态角速度与机体角速度的关系是dphi p sin(phi)*tan(theta)*q cos(phi)*tan(theta)*r dtheta cos(phi)*q - sin(phi)*r dpsi sin(phi)/cos(theta)*q cos(phi)/cos(theta)*r注意这个变换在俯仰角接近90度时会产生奇异性。如果是做常规起降、航线飞行仿真把期望姿态限制在±30度内没有太大问题若要做筋斗或大机动就必须换成四元数。模糊控制规则在四元数下不直观所以大多数人做模糊控制仿真时都选择小角度姿态域。2.2 连写状态方程Matlab m文件里的四旋翼模型四旋翼电机转速与升力、反扭矩都呈平方关系。模糊控制器的输出可以是转速增量也可以直接是升力增量但用转速增量更贴近真实飞控。下面是一个面向仿真验证的姿态动力学函数省略了位置项保留滚转、俯仰、偏航三个通道function dx quad_attitude(t, x, ue, params) % 状态 x: [phi; theta; psi; p; q; r] % 输入 ue: [u1; u2; u3; u4] 四个电机转速增量 (rad/s) phi x(1); theta x(2); p x(4); q x(5); r x(6); % 基准悬停转速 控制增量转速不能为负 Om0 params.Omega0; Om max(0, Om0 ue); % 电机布局前1 右2 后3 左4 L params.kT * params.l * (Om(2)^2 - Om(4)^2); M params.kT * params.l * (Om(3)^2 - Om(1)^2); N params.kD * (Om(1)^2 - Om(2)^2 Om(3)^2 - Om(4)^2); dx zeros(6,1); dx(1) p sin(phi)*tan(theta)*q cos(phi)*tan(theta)*r; dx(2) cos(phi)*q - sin(phi)*r; dx(3) sin(phi)/cos(theta)*q cos(phi)/cos(theta)*r; dx(4) (L (params.Iyy - params.Izz)*q*r) / params.Ixx; dx(5) (M (params.Izz - params.Ixx)*p*r) / params.Iyy; dx(6) (N (params.Ixx - params.Iyy)*p*q) / params.Izz; end这段代码把欧拉角求导和刚体转动方程分开写方便核对量纲。L是绕机体x轴的滚转力矩M是绕机体y轴的俯仰力矩N是绕机体z轴的偏航力矩。陀螺力矩项在低转速小角度下不明显但在大角速度机动时必须保留。注意tan(theta)在theta90度时会爆炸所以仿真归一化工作点不要设置在接近垂直的姿态。2.3 参数表一组能跑通但别照抄的初始值四旋翼参数没有统一标准建议用下面这组量级接近小型航拍机、又不容易数值发硬的初始值。这里的Omega0是根据质量和升力系数反算出来的悬停转速在参数脚本里自动生成不要手工乱填。符号含义数值单位g重力加速度9.81m/s²m总质量1.2kgl机臂长度0.25mIxx, Iyy滚转、俯仰惯量0.012kg·m²Izz偏航惯量0.024kg·m²kT升力系数1.5e-5N/(rad/s)²kD反扭矩系数3.0e-6N·m/(rad/s)²Omega0悬停转速sqrt(mg/(4kT))rad/s参数表最常出问题的是kD。有人把反扭矩系数写得和升力系数一样大导致偏航通道在悬停点附近就开始左右摆动。判断参数是否自洽一个简单办法是让四个电机转速都等于Omega0计算总升力是否等于m*g。如果不等于模型在仿真一开始就会往下掉模糊控制器再强也救不回来。2.4 用matlab脚本快速验证开环模型是否物理自洽写完状态方程不要急着接控制器先用开环仿真看模型本身有没有病态。给滚转角速度一个微小初值扰动观察姿态角是否随时间发散params.m 1.2; params.g 9.81; params.l 0.25; params.Ixx 0.012; params.Iyy 0.012; params.Izz 0.024; params.kT 1.5e-5; params.kD 3.0e-6; params.Omega0 sqrt(params.m * params.g / (4 * params.kT)); x0 zeros(6,1); x0(4) 0.01; % 给滚转角速度一个 0.01 rad/s 的扰动 [t, x] ode45((t,x) quad_attitude(t, x, zeros(4,1), params), [0 2], x0); plot(t, x(:,1)*180/pi);如果角度曲线围绕初始零点附近波动说明开环模型在悬停点附近是稳定的如果曲线直接翻转首先要检查欧拉角更新方程里的符号而不是怀疑模糊控制器。符号错误在Matlab里不会报错只有通过开环扰动才能发现。用plot看也比在Simulink Scope里盯半天更高效。3. 模糊控制器设计从隶属度函数到规则表的Matlab落地3.1 外环位置、内环姿态模糊控制器该放在哪一环四旋翼控制一般分两环外环生成期望姿态角和油门内环控制姿态角速度。模糊控制器放在内环理由是姿态环受到的陀螺力矩、电机延迟、空气阻尼随飞行状态变化最大单靠固定PID很难覆盖全包线。位置环时间常数大用普通PID就能获得不错效果没必要把所有环节都模糊化。以内环滚转通道为例模糊控制器的两个输入是角度误差e phi_des - phi和角速度误差de p_des - p输出是滚转通道有关的两个电机转速增量之差。偏航通道单独用一组规则俯仰通道与滚转通道结构对称只是电机索引不同。这样设计每个模糊控制器只有2输入1输出规则数量最多25条Simulink仿真负担小调参也能按通道独立进行。3.2 用Fuzzy Logic Toolbox生成姿态模糊控制器在Matlab命令窗口直接输入fuzzy可以打开图形化工具箱但用命令行生成FIS文件更适合批量调参和版本管理。下面这段脚本生成一个Mamdani型模糊控制器论域都先设成对称区间后面再接Gain模块做缩放fis newfis(att_fuzzy, FIS, mamdani, ... min, max, min, max, centroid); % 输入1角度误差论域 [-0.2 0.2] rad fis addInput(fis, [-0.2 0.2], e); fis addMF(fis, e, trimf, [-0.2 -0.2 -0.1], NB); fis addMF(fis, e, trimf, [-0.15 -0.05 0.05], NS); fis addMF(fis, e, trimf, [-0.05 0 0.05], ZE); fis addMF(fis, e, trimf, [-0.05 0.05 0.15], PS); fis addMF(fis, e, trimf, [0.1 0.2 0.2], PB); % 输入2角速度误差论域 [-0.5 0.5] rad/s fis addInput(fis, [-0.5 0.5], de); fis addMF(fis, de, trimf, [-0.5 -0.5 -0.25], NB); fis addMF(fis, de, trimf, [-0.35 -0.15 0.05], NS); fis addMF(fis, de, trimf, [-0.05 0 0.05], ZE); fis addMF(fis, de, trimf, [-0.05 0.15 0.35], PS); fis addMF(fis, de, trimf, [0.25 0.5 0.5], PB); % 输出转速增量论域 [-300 300] rad/s fis addOutput(fis, [-300 300], du); fis addMF(fis, du, trimf, [-300 -300 -150], NB); fis addMF(fis, du, trimf, [-225 -75 0], NS); fis addMF(fis, du, trimf, [-75 0 75], ZE); fis addMF(fis, du, trimf, [0 75 225], PS); fis addMF(fis, du, trimf, [150 300 300], PB); % 25条模糊规则 ruleList [ 1 1 1 1 1; 1 2 1 1 1; 1 3 1 1 1; 1 4 2 1 1; 1 5 2 1 1; 2 1 1 1 1; 2 2 2 1 1; 2 3 2 1 1; 2 4 3 1 1; 2 5 3 1 1; 3 1 2 1 1; 3 2 3 1 1; 3 3 3 1 1; 3 4 4 1 1; 3 5 4 1 1; 4 1 3 1 1; 4 2 4 1 1; 4 3 4 1 1; 4 4 5 1 1; 4 5 5 1 1; 5 1 4 1 1; 5 2 5 1 1; 5 3 5 1 1; 5 4 5 1 1; 5 5 5 1 1; ]; fis addRule(fis, ruleList); writefis(fis, att_fuzzy.fis);newfis参数里的min、max分别指定与、或运算和推理方法centroid是重心法解模糊。ruleList五列是输入1、输入2、输出、规则权重、连接词连接词1表示and。这段脚本生成的.fis文件可以直接被Simulink的Fuzzy Logic Controller块读取不需要每次重新手动绘图。3.3 规则表怎么填25条规则足够应对大多数起降工况模糊规则表的来源是控制经验。以滚转通道为例如果无人机向左偏了但角速度还在继续向左增加就需要给出很猛的右转控制量。如果把输入都按“负大、负小、零、正小、正大”五档划分规则表可以写成下面这样e \ deNBNSZEPSPBNBNBNBNBNSZENSNBNBNSZEPSZENBNSZEPSPBPSNSZEPSPBPBPBZEPSPBPBPB读这张表时注意表格里每个格子是输出du的模糊集合。第二行第三列对应eNS、deZE输出NS意思是“角度还稍微负偏角速度为零就轻轻往回打一点”。最纠结的行是eNB、dePB大负误差配大正角速度说明无人机虽然在负侧但正在快速回正输出给ZE否则会越过零点形成超调。整张表里每条规则都不是凭空设定的而是先画一条阶跃响应收敛曲线再对照曲线上每个阶段的(e,de)组合填出来的。3.4 量化因子和比例因子比规则本身更容易调坏的参数生成FIS后Simulink里的模糊控制器输入端要加两个Gain输出端再加一个Gain。这三个Gain的作用是把实际信号映射到模糊论域再映射回实际控制量。常见标定方法Ke 0.2 / e_max把最大角度误差映射到±0.2Kec 0.5 / de_max把最大角速度误差映射到±0.5Ku 300 / du_max把模糊输出映射到转速增量。如果仿真发散优先把Ku缩小一半不要急着改规则表。如果静态误差大先增大Ke。如果响应震荡增大Kec。这个顺序比从规则表逐条检查快得多。需要特别提醒的是量化因子和比例因子不要写在.fis文件内部否则模型里查不到可调参数每次改都要重新生成FIS失去模糊控制快速迭代的优势。4. 在Simulink里把模糊控制闭环起来连续与离散的坑4.1 整体仿真框图哪个环节用连续哪个环节用离散四旋翼机体是连续时间系统而模糊控制器在飞控里运行周期固定属于离散控制器。Simulink模型里必须把这个区别体现出来否则会出现采样与连续求解器打架的问题。推荐链路是期望角度来自Step或Signal Builder与反馈角度做差得到误差e误差经过Ke和Kec两个Gain变成模糊控制器的两个输入Fuzzy Logic Controller块完成推理输出经过Ku和Saturation限幅限幅后的转速增量进入Matlab Function或S-Function中的四旋翼模型模型输出的角度和角速度反馈回输入端。位置外环在这套框图里可以暂时省略先验证姿态环稳定再叠加位置环。使用固定步长求解器时步长建议取0.005模糊控制器采样时间也取0.005避免连续模块与离散块之间的插值误差造成小幅震荡。4.2 模糊控制块连法从.fis文件到Fuzzy Logic ControllerSimulink库浏览器里搜索Fuzzy Logic Controller双击模块填写变量名而不是路径。推荐在模型回调PreLoadFcn中写[fis, ~] readfis(att_fuzzy.fis); assignin(base, att_fuzzy, fis);这样每次打开模型都会自动加载FIS避免因为工作区变量丢失导致仿真报错“Unsupported FIS format”。如果模型里直接填写文件名则一旦文件被移动到其他目录整个模型就无法仿真。把att_fuzzy.fis放进模型目录再用cd(fileparts(which(模型名.slx)))切换路径是更稳妥的做法。模糊控制块输入端口默认是一个向量。如果你用两个独立信号线连接需要先用Mux合成二维向量否则会报输入维度错误。输出端同样可以是标量后续Gain模块再放大到实际控制量。注意检查模糊控制块的采样时间不要设成-1建议显式填0.005这样才能消除代数环。4.3 采样时间与代数环仿真发散的两个真凶仿真发散最常见的原因不是控制参数太大而是模型里存在代数环。模糊控制的输出依赖输入而输入又经过模型反馈依赖于输出变步长求解器在同一个仿真步内反复求解这个环可能让中间变量不断放大。配置项推荐值原因求解器类型固定步长 discrete消除连续离散混插抖动求解器步长0.005与控制器采样时间一致模糊控制器采样时间0.005让Simulink自动插入ZOH限幅模块下限-300防止转速增量过大限幅模块上限300单位是rad/s如果仍然有代数环可以在模糊控制输出后加一个Unit Delay不过这会增加一个采样周期延迟需要重新评估相位裕度。另一个真凶是求解器步长太小但没有启用solver reset导致Simulink为了维持误差精度反复缩减步长最终仿真卡死。用固定步长后这个问题会明显减少。4.4 跑仿真并记录数据的matlab脚本不要只看Scope里的曲线把数据导入工作区才能量化调参。下面脚本循环修改Ku自动跑完5秒仿真并打印超调量mdl quad_att_fuzzy; load_system(mdl); fis readfis(att_fuzzy.fis); assignin(base, att_fuzzy, fis); for ku [100 200 300 400] set_param([mdl /Ku], Gain, num2str(ku)); out sim(mdl, StopTime, 5); t out.tout; phi out.phi; % 由To Workspace模块导出 [peak, ~] max(abs(phi)); ys phi(end); fprintf(Ku%3d peak%.4f rad steady%.4f rad\n, ku, peak, ys); endset_param要求模型路径里的Gain模块名称为Ku所以在Simulink里要把输出比例因子模块重命名不能叫Gain。out.phi是从模型中的To Workspace模块保存出来的变量需要在模块参数里勾选“Log output data”。批量跑仿真时每次sim结束要调用clear out避免工作区变量覆盖干扰下一轮。5. 验证与调参阶跃响应和轨迹跟踪怎么用来判断控制质量5.1 阶跃响应先过三关超调、调节时间、稳态误差姿态通道阶跃响应建议给0.2 rad期望滚转角大约11.5度在这个幅度下欧拉角模型不会遇到奇异点。观察曲线要过三关超调量不超过5%到10%调节时间按2%误差带判断应在1秒到1.5秒之间稳态误差小于0.01 rad。如果超调大优先增大Kec如果响应慢增大Ke如果稳态误差明显检查积分环节是否缺失。模糊PD控制器本身不含积分静态误差会偏大这时可以在输出端串一个积分模块形成模糊PID但积分系数从很小值开始避免和模糊规则抢控制权。5.2 用圆形轨迹看跟踪误差而不是只看姿态姿态阶跃好不代表位置也好。模糊控制器只管姿态内环位置外环用PID时整体跟踪效果必须用轨迹验证。用SIMULINK里的轨迹发生器生成一个半径2米、角速度0.25 rad/s的圆形航迹把期望滚转角、俯仰角和偏航角解算后送入内环。记录位置误差的均方根值如果超过0.3米说明内环姿态响应太慢需要增大Ke或减小Kec。5.3 和PID争高下模糊控制在参数摄动下的margin模糊控制的优势只有在参数摄动时才能体现。把质量m从1.2改成1.44惯量Ixx从0.012改成0.0144再跑一次阶跃响应。普通PID如果仍然用原来的增益超调会明显增加甚至震荡模糊控制由于规则是基于误差趋势变化幅度应该小得多。如果模糊控制器也发散先检查限幅和量化因子其次看规则表是否存在“角度误差为负、输出也为负”的正反馈规则。这一步通过后这套Matlab仿真方案才算真正具备工程参考价值。本文还有配套的精品资源点击获取
返回列表