第1章:MATLAB基础与Simulink入门

各位同学好,我是你们这门课的老朋友。今天咱们从最基础的东西聊起——MATLAB和Simulink。说实话,我见过太多人一上来就急着搭模型、调参数,结果连矩阵运算都写不利索,最后debug到怀疑人生。所以,咱们先把地基打牢。

1.1 MATLAB工作环境:你的主战场

打开MATLAB,你首先看到的是这个界面。我个人习惯把布局调成「经典」模式——命令窗口放中间,工作区在右边,当前文件夹在左边。为什么?因为调试的时候,你总得盯着变量变化吧?

几个关键区域你得记住:

  • 命令窗口:直接输入命令,回车执行。我经常用它快速验证一个小想法。
  • 工作区:显示当前所有变量。双击变量可以直接看数据,这个在分析传感器数据时特别有用。
  • 当前文件夹:你的脚本、函数、模型都放这儿。路径搞错了,代码跑不起来,别问我怎么知道的。
  • 编辑器:写脚本和函数的地方。快捷键Ctrl+S要刻在肌肉记忆里。
小技巧:在命令窗口输入 clc 清屏,clear all 清空变量。但注意,clear all 会把断点也清掉,调试时慎用。

1.2 矩阵运算:MATLAB的灵魂

MATLAB全称是Matrix Laboratory,说白了就是为矩阵而生的。你想想看,飞控里的姿态矩阵、旋转矩阵、协方差矩阵,哪个不是矩阵?

先看几个基本操作:

% 创建矩阵
A = [1, 2, 3; 4, 5, 6; 7, 8, 9];
B = [9, 8, 7; 6, 5, 4; 3, 2, 1];

% 矩阵乘法
C = A * B;

% 点乘(对应元素相乘)
D = A .* B;

% 转置
E = A';

% 求逆
F = inv(A);  % 注意:A必须是方阵且非奇异

我在项目中遇到过一个问题:用 inv() 求逆,结果矩阵接近奇异,算出来的结果完全不对。后来我改用 A\b 解线性方程组,稳定多了。记住,能用反斜杠运算符就别用 inv()

避坑指南:我曾经在卡尔曼滤波里直接用 inv() 求协方差矩阵的逆,结果数值发散。后来改成 chol() 分解,问题就解决了。矩阵运算的数值稳定性,是飞控算法里的大坑。

1.3 脚本与函数:组织你的代码

脚本和函数,就像工具箱里的螺丝刀和扳手——各有各的用处。

脚本:把一堆命令按顺序写在一起,保存成 .m 文件。适合做一次性数据处理或快速验证。

% 脚本示例:计算欧拉角到旋转矩阵
phi = 0.1; theta = 0.2; psi = 0.3;
R = [cos(theta)*cos(psi), sin(phi)*sin(theta)*cos(psi)-cos(phi)*sin(psi), cos(phi)*sin(theta)*cos(psi)+sin(phi)*sin(psi);
     cos(theta)*sin(psi), sin(phi)*sin(theta)*sin(psi)+cos(phi)*cos(psi), cos(phi)*sin(theta)*sin(psi)-sin(phi)*cos(psi);
     -sin(theta),         sin(phi)*cos(theta),                            cos(phi)*cos(theta)];

函数:有输入输出,有自己的工作空间。我建议把飞控里的核心算法都写成函数,比如姿态解算、控制律计算。

function R = euler2rot(phi, theta, psi)
% 欧拉角转旋转矩阵
% 输入:phi(滚转), theta(俯仰), psi(偏航)
% 输出:3x3旋转矩阵
R = [cos(theta)*cos(psi), sin(phi)*sin(theta)*cos(psi)-cos(phi)*sin(psi), cos(phi)*sin(theta)*cos(psi)+sin(phi)*sin(psi);
     cos(theta)*sin(psi), sin(phi)*sin(theta)*sin(psi)+cos(phi)*cos(psi), cos(phi)*sin(theta)*sin(psi)-sin(phi)*cos(psi);
     -sin(theta),         sin(phi)*cos(theta),                            cos(phi)*cos(theta)];
end
重要原则:函数内部不要用 clear all,会清掉调用者的变量。我见过有人把 clear all 写在函数里,结果主程序的变量全没了,那叫一个酸爽。

1.4 Simulink模块库介绍:搭积木的艺术

Simulink说白了就是图形化的MATLAB。你不需要写代码,只需要拖拽模块、连线、设参数。但别小看它——我见过有人用Simulink搭出完整的四旋翼飞控,代码生成直接烧到STM32上跑。

常用的模块库:

模块库 常用模块 用途
Sources Constant, Step, Sine Wave 输入信号源
Sinks Scope, Display, To Workspace 查看和保存结果
Math Operations Add, Product, Gain 数学运算
Continuous Integrator, Transfer Fcn 连续系统建模
Discrete Unit Delay, Discrete Transfer Fcn 离散系统建模
User-Defined Functions MATLAB Function, S-Function 自定义算法

我个人最常用的是 MATLAB Function 模块。你可以把写好的MATLAB函数直接拖进Simulink,省去重新搭模块的麻烦。但要注意,这个模块里不能调用 plot()disp() 这些图形函数,代码生成时会报错。

1.5 Simulink仿真流程:从模型到结果

仿真流程其实就三步:搭模型、设参数、跑仿真。但每一步都有坑。

  1. 搭模型:从模块库拖出模块,连线。我建议先画个草图,理清信号流向再动手。
  2. 设参数:双击模块设参数。仿真时间、求解器类型、步长,这些都得根据你的系统来定。
  3. 跑仿真:点那个绿色三角。如果报错,别慌——双击错误信息,它会定位到出问题的模块。
调试技巧:在信号线上右键 -> 「Display」 -> 「Log Selected Signals」,仿真结束后就能在Data Inspector里看波形。比Scope好用多了。

下面这张图展示了Simulink仿真的核心流程,从模型搭建到结果分析,每一步都环环相扣:

Simulink仿真核心流程 1. 搭建模型 拖拽模块 + 连线 2. 设置参数 求解器 + 仿真时间 3. 运行仿真 点击绿色三角 4. 分析 看波形 迭代优化 仿真时间 = 结束时间 - 开始时间 求解器类型:定步长(代码生成) vs 变步长(快速仿真) 步长:影响仿真精度和速度

嗯,这里要注意:仿真时间不是真实时间。比如你设仿真时间10秒,如果模型复杂,可能跑1分钟才完。反过来,如果模型简单,可能0.1秒就跑完了。别被数字骗了。

避坑指南:我曾经在仿真一个快速飞行动力学模型时,用了变步长求解器,结果步长自动调得特别小,仿真跑了半小时还没完。后来改成定步长,0.001秒一步,10秒仿真时间,30秒就跑完了。所以,定步长适合代码生成,变步长适合快速验证

好了,第一章的内容就到这里。记住,MATLAB和Simulink是工具,不是目的。你的目标是让四旋翼飞起来、飞稳、飞好。后面的章节,我们会一步步把飞控算法从理论变成代码,从代码变成飞在天上的实物。


公众号:蓝海资料掘金营,微信deep3321