3、Simulink入门:界面、模块库、信号线与总线、子系统封装
好,咱们正式开始动手了。
前面两章我们聊了飞控的数学基础,也搭好了MATLAB环境。说实话,光看代码和公式,总觉得差点意思。模型在脑子里转,但看不见摸不着。Simulink就是来解决这个问题的——它把抽象的数学运算,变成了看得见的方块和连线。
我个人习惯,做飞控算法之前,一定先在Simulink里把框架搭出来。为什么?因为你能直观地看到信号怎么流,数据怎么变。这比盯着代码猜要靠谱得多。
3.1 Simulink界面:别被它吓到
第一次打开Simulink,你可能会觉得眼花。工具栏、库浏览器、模型画布……东西不少。但别慌,核心就三个区域:
- 库浏览器(Library Browser):左边或者单独窗口,里面装着所有你能用的模块。就像工具箱,要啥拿啥。
- 模型画布(Model Canvas):中间大片空白区域。你就在这里拖模块、连信号线,搭出你的飞控模型。
- 仿真工具栏(Simulation Toolbar):顶部,运行、停止、设置仿真时间,都在这里。
嗯,这里要注意:很多人一上来就点“新建模型”,然后对着空白画布发呆。我建议你先打开几个官方示例看看。在MATLAB命令窗口输入 simulink,然后选“飞控相关”的示例,比如 asbQuadcopter。看一遍别人怎么搭的,比自己瞎摸索快得多。
3.2 常用模块库:飞控建模的“乐高积木”
Simulink的模块库分类很细,但做飞控建模,你真正常用的其实就那几个。我按使用频率给你排个序:
| 模块库 | 常用模块 | 飞控中的用途 |
|---|---|---|
| Sources(信号源) | Constant, Step, Sine Wave, Clock | 模拟传感器输入、给定参考信号、时间信号 |
| Sinks(信号接收) | Scope, Display, To Workspace, Out1 | 看波形、看数值、把数据存到MATLAB工作区 |
| Math Operations(数学运算) | Add, Subtract, Product, Gain, Sum of Elements | 做加减乘除、比例放大、信号求和 |
| Continuous(连续系统) | Integrator, Derivative, Transfer Fcn | 积分(角度→角速度)、微分、传递函数 |
| Discrete(离散系统) | Unit Delay, Discrete-Time Integrator | 数字控制器里的延时、离散积分 |
| Signal Routing(信号路由) | Mux, Demux, Bus Creator, Bus Selector | 把多个信号合并成一条线,或者从总线里取信号 |
说白了,飞控算法就是这些模块的组合。PID控制器?就是Gain、Add、Integrator、Derivative拼起来的。姿态解算?就是Math Operations和Trigonometric Functions(三角函数)的搭配。
3.3 信号线与总线:别让连线乱成一锅粥
模型搭大了,信号线会变得密密麻麻。这时候,你需要学会用“总线”。
信号线就是普通的线,一根线传一个信号。简单直接,但多了就乱。
总线(Bus)就像一根网线,里面可以打包很多信号。比如,你可以把“滚转角”、“俯仰角”、“偏航角”三个信号打包成一个“姿态总线”。这样模型看起来清爽多了。
怎么用?两个关键模块:
- Bus Creator:把多个输入信号合并成一个总线输出。
- Bus Selector:从总线里挑出你需要的信号。
举个例子:
// 假设你有三个信号:roll, pitch, yaw
// 用Bus Creator把它们打包成 "attitude_bus"
// 然后在子系统里用Bus Selector取出 roll 信号
我个人习惯,在顶层模型里尽量用总线。这样整个飞控系统的架构一目了然:传感器数据总线、控制指令总线、状态估计总线……每个子系统只管处理自己那部分。
3.4 子系统封装:把你的算法“打包”
模型越来越大,总不能把所有模块都摊在画布上吧?这时候就需要“子系统”(Subsystem)。
子系统就是把一组模块打包成一个方块。双击这个方块,里面就是具体的实现细节。这样做的好处:
- 层次清晰:顶层看架构,底层看细节。
- 复用方便:写好的PID控制器,封装成子系统,下次直接拖出来用。
- 团队协作:你负责姿态控制,我负责导航,各做各的子系统,最后拼起来。
创建子系统很简单:选中你要打包的模块,右键 -> Create Subsystem。或者直接拖一个Subsystem模块进来,然后双击进去搭模型。
更高级的是“封装”(Mask)。封装后的子系统,可以有自己的参数对话框、图标、文档。比如你做一个PID控制器子系统,封装后可以设置Kp、Ki、Kd参数,就像用Simulink自带的模块一样。
封装步骤:
- 右键子系统 -> Mask -> Create Mask。
- 在“Parameters”选项卡里添加参数,比如Kp, Ki, Kd。
- 在“Icon”选项卡里画个图标,或者写个文字标签。
- 在“Documentation”选项卡里写帮助文档。
嗯,这里要提醒一下:封装虽然好用,但别过度。我见过有人把整个飞控算法封装成一个黑盒子,结果调试时根本不知道里面发生了什么。我的原则是:一个子系统只做一件事,封装后保留必要的调试接口(比如把中间信号引出来)。
3.5 本章知识体系
下面这张图,帮你把本章的核心逻辑串起来:
这张图把本章的四个核心内容串在了一起。你从界面入手,认识模块库,学会用信号线和总线组织模型,最后用子系统把算法封装起来。每一步都是下一步的基础。
好了,Simulink入门就聊这么多。别光看,打开MATLAB,拖几个模块试试。相信我,亲手连一根线,比看十页教程都管用。