第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仿真流程:从模型到结果
仿真流程其实就三步:搭模型、设参数、跑仿真。但每一步都有坑。
- 搭模型:从模块库拖出模块,连线。我建议先画个草图,理清信号流向再动手。
- 设参数:双击模块设参数。仿真时间、求解器类型、步长,这些都得根据你的系统来定。
- 跑仿真:点那个绿色三角。如果报错,别慌——双击错误信息,它会定位到出问题的模块。
下面这张图展示了Simulink仿真的核心流程,从模型搭建到结果分析,每一步都环环相扣:
嗯,这里要注意:仿真时间不是真实时间。比如你设仿真时间10秒,如果模型复杂,可能跑1分钟才完。反过来,如果模型简单,可能0.1秒就跑完了。别被数字骗了。
好了,第一章的内容就到这里。记住,MATLAB和Simulink是工具,不是目的。你的目标是让四旋翼飞起来、飞稳、飞好。后面的章节,我们会一步步把飞控算法从理论变成代码,从代码变成飞在天上的实物。
公众号:蓝海资料掘金营,微信deep3321