无人机 控制方面 模糊控制 有一维模糊和二维模糊两种,文字说明资料已遗失,数学模型可以根据仿真图推导
无人机 控制方面 模糊控制 有一维模糊和二维模糊两种,文字说明资料已遗失,数学模型可以根据仿真图推导,直接运维simulink会报错,是因为没有导入模糊规则,在运行simulink之前需要在命令窗口输入work=readfis 'work.fis' ,这样才不会报错
飞友们搞无人机悬停/定高的时候有没有踩过PID调参调到怀疑人生的坑?上周翻旧项目硬盘,刚好看到个2年前做的入门级模糊定高仿真,文字说明全丢了只剩一堆Scope图,硬啃啃出点一维和二维模糊控制的区别,还有大家容易踩的那个Simulink大坑——先分享大坑再讲干货吧,毕竟谁没经历过刚拖好模块兴冲冲点运行弹一大片红的崩溃?
先敲那个救命代码:
% 先确认work.fis文件在当前工作目录,或者加绝对路径,比如'D:/UAV_workspace/work.fis'
work = readfis('work.fis');
别省空格也别打引号错顺序!当年我第一次把引号敲成中文的,红框框里飘“语法错误”飘得我以为模块坏了,后来拍大腿才发现是输入法的锅。那为什么必须读这个fis?因为模糊控制的核心——隶属度函数形状、输入输出论域、模糊规则库——全在这个文件里,Simulink拖的Fuzzy Logic Controller模块默认是空壳子,没规则就像人没大脑,根本转不起来,肯定报错。

好坑填完,说说当年啃Scope图反推的一维二维模糊定高的区别吧,旧项目的Scope图有两个对比组:一个是误差e(期望值高度减当前高度)做一维输入的,一个是e+误差变化率ec(这一帧减上一帧的e)做二维输入的。先回忆下模糊控制的大概流程,没文字也没关系,经典嘛:输入→模糊化(转成模糊语言,比如“太大了”“小误差正在变小”)→模糊推理(按规则输出模糊量)→解模糊(转成精确的PWM油门增量/高度控制器输出量)。
无人机 控制方面 模糊控制 有一维模糊和二维模糊两种,文字说明资料已遗失,数学模型可以根据仿真图推导,直接运维simulink会报错,是因为没有导入模糊规则,在运行simulink之前需要在命令窗口输入work=readfis 'work.fis' ,这样才不会报错
一维模糊的反推过程很简单,看Scope里的输入论域是[-1,1]m(假设期望10m,当前9.5→9.8→9.9→10→10.1这种小波动,大了肯定论域调宽,当年做的是悬停微调),隶属度函数用了5个三角型+高斯型混合?中间0附近是高斯“刚好”,两边是三角“稍低”“太低”“稍高”“太高”;输出油门增量论域是[-5,5]%,隶属度函数也是5个:“大幅减油”“减点油”“不动”“加点油”“大幅加油”;规则库反推了几句(Scope里波动能看出来):如果e太低→大幅加油,e稍低→加点油,e刚好→不动,e稍高→减点油,e太高→大幅减油。

当年拖的一维模糊仿真图大概是这样的(纯脑补模块,敲点伪结构:
Simulink模型伪一维链:
期望高度10m → Sum模块1(+期望 - 当前)→ e输出→ Fuzzy Logic Controller(关联刚才读的work_1d.fis)→ 油门增量输出→ 无人机高度传递函数(Scope图反推大概是个二阶欠阻尼?当年无人机重量大概1kg,忽略风干扰纯理想模型)→ Sum模块2(当前高度历史+增量积分→ 伪高度测量)→ 当前高度连回Sum1,再拖个Scope看e和当前高度
看反推的一维模糊悬停Scope图,确实有问题:超调有点大(超过10.3m),收敛速度慢(大概8秒才稳在±0.1m内),而且如果风干扰加个小阶跃(假设当年后来偷偷加了1m/s²的上升气流1秒,不过文字没标),稳回来要更久。为什么?因为它只有“现在差多少”的信息,没有“差正在往哪里变、变快变慢”的预判,比如当前高度已经从10.2往10.1降了,但一维模糊只看到e=+0.1是“稍高”,还在减点油,结果就容易晃悠,像新手开车踩油门刹车没数。
二维模糊就好很多,当年的另一个对比组Scope图,反推ec的论域是[-0.2,0.2]m/s(因为是微调,高度变化率不会太大),隶属度函数用了3个高斯?“下降快”“稳定”“上升快”;然后输入就是e(还是刚才的5个)+ec(3个),规则库一下就多了,当年反推的经典预判句比如:
模糊规则小片段(伪中文,当年FIS里应该是英文):
1. If e is 稍低 AND ec is 下降快 → 大幅加油(差得不算特别多但还在往下掉,得赶紧补油拉回来)
2. If e is 稍低 AND ec is 上升快 → 不动/加一丢丢(差在往好的方向走,别瞎补油过了)
3. If e is 刚好 AND ec is 上升快 → 减点油(预判要超了,提前刹车)
二维模糊的仿真伪链只比一维多了个Derivative微分模块:把Sum1输出的e再连个微分器→ ec输出→ 拖个Mux模块把e和ec捆起来→ 再连Fuzzy Logic Controller(关联work_2d.fis)。当年看二维Scope图,无干扰的话超调几乎没有(最高10.08m),收敛速度3秒就稳在±0.05m内,加了刚才脑补的上升气流,稳回来也只要5秒左右,体验感直接拉满——就像老司机开车,看到前面红灯提前松油门,看到要变绿提前踩一点点,稳得一批。
最后再提醒一遍那个救命的readfis步骤,还有别把FIS文件名写错,隶属度函数和规则库自己调的时候别太极端,比如一维别只有“大幅加减”两个规则,不然晃得更厉害。对了,当年为什么文字说明全丢了?因为旧硬盘摔过一次,恢复出来只有图片和模型,mat文件和mdl的注释都没了——血泪教训,飞友们搞项目一定要云端+本地双备份,别像我一样啃Scope图啃到凌晨两点!

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)