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(三角函数)的搭配。

避坑指南: 我曾经在项目里用错了一个Gain模块的符号,结果仿真出来的四旋翼直接翻了个跟头。检查了半天才发现是增益设成了负数。所以,每加一个模块,先双击看看参数对不对。

3.3 信号线与总线:别让连线乱成一锅粥

模型搭大了,信号线会变得密密麻麻。这时候,你需要学会用“总线”。

信号线就是普通的线,一根线传一个信号。简单直接,但多了就乱。

总线(Bus)就像一根网线,里面可以打包很多信号。比如,你可以把“滚转角”、“俯仰角”、“偏航角”三个信号打包成一个“姿态总线”。这样模型看起来清爽多了。

怎么用?两个关键模块:

  • Bus Creator:把多个输入信号合并成一个总线输出。
  • Bus Selector:从总线里挑出你需要的信号。

举个例子:

// 假设你有三个信号:roll, pitch, yaw
// 用Bus Creator把它们打包成 "attitude_bus"
// 然后在子系统里用Bus Selector取出 roll 信号

我个人习惯,在顶层模型里尽量用总线。这样整个飞控系统的架构一目了然:传感器数据总线、控制指令总线、状态估计总线……每个子系统只管处理自己那部分。

注意: 总线里的信号名必须唯一。我曾经因为两个信号都叫“angle”,结果Bus Selector死活选不对。后来统一命名规范,比如“roll_angle”、“pitch_angle”,再没出过问题。

3.4 子系统封装:把你的算法“打包”

模型越来越大,总不能把所有模块都摊在画布上吧?这时候就需要“子系统”(Subsystem)。

子系统就是把一组模块打包成一个方块。双击这个方块,里面就是具体的实现细节。这样做的好处:

  • 层次清晰:顶层看架构,底层看细节。
  • 复用方便:写好的PID控制器,封装成子系统,下次直接拖出来用。
  • 团队协作:你负责姿态控制,我负责导航,各做各的子系统,最后拼起来。

创建子系统很简单:选中你要打包的模块,右键 -> Create Subsystem。或者直接拖一个Subsystem模块进来,然后双击进去搭模型。

更高级的是“封装”(Mask)。封装后的子系统,可以有自己的参数对话框、图标、文档。比如你做一个PID控制器子系统,封装后可以设置Kp、Ki、Kd参数,就像用Simulink自带的模块一样。

封装步骤:

  1. 右键子系统 -> Mask -> Create Mask。
  2. 在“Parameters”选项卡里添加参数,比如Kp, Ki, Kd。
  3. 在“Icon”选项卡里画个图标,或者写个文字标签。
  4. 在“Documentation”选项卡里写帮助文档。

嗯,这里要提醒一下:封装虽然好用,但别过度。我见过有人把整个飞控算法封装成一个黑盒子,结果调试时根本不知道里面发生了什么。我的原则是:一个子系统只做一件事,封装后保留必要的调试接口(比如把中间信号引出来)。

经验之谈: 封装时,我习惯在子系统的输出端口加一个“Out1”模块,这样信号名会自动传递到上层。配合Bus Selector,调试起来特别方便。

3.5 本章知识体系

下面这张图,帮你把本章的核心逻辑串起来:

Simulink入门知识体系 Simulink界面 常用模块库 信号线与总线 子系统封装 核心区域 • 库浏览器:找模块 • 模型画布:搭模型 • 仿真工具栏:运行 建议:先看官方示例 飞控常用模块 • Sources:信号源 • Sinks:信号接收 • Math:数学运算 • Continuous/Discrete • Signal Routing 信号管理 • 信号线:单信号 • 总线:多信号打包 • Bus Creator:合并 • Bus Selector:提取 注意:信号名唯一 子系统封装 • 层次化设计 • 模块复用 • Mask封装:参数化 • 保留调试接口 原则:一个子系统只做一件事 目标:从零开始,搭出第一个飞控仿真模型

这张图把本章的四个核心内容串在了一起。你从界面入手,认识模块库,学会用信号线和总线组织模型,最后用子系统把算法封装起来。每一步都是下一步的基础。

好了,Simulink入门就聊这么多。别光看,打开MATLAB,拖几个模块试试。相信我,亲手连一根线,比看十页教程都管用。


专注资料整理