2. 控制对象建模实战
控制算法设计的第一步不是写控制器,而是把被控对象“翻译”成数学上可运算的模型。本节以直流电机和倒立摆两个典型对象为例,说明如何从物理机理出发,在 MATLAB 脚本与 Simulink 中建立状态空间模型和传递函数模型,并验证两者的一致性。
一、建模的基本路线
物理机理建模遵循一条固定路线:先明确输入、输出和状态变量,再依据牛顿定律、基尔霍夫定律或拉格朗日方程写出微分方程,然后整理成状态空间形式,最后通过拉普拉斯变换或 MATLAB 的 ss2tf 得到传递函数。状态空间适合多变量、非线性、初值问题;传递函数适合单输入单输出、零初始条件下的频域分析。两者描述同一对象,只是视角不同。
建模前必须先约定参照系与正方向。本节统一约定:直流电机电枢电压 u 为正时产生正转矩,电机轴逆时针旋转为正;倒立摆小车向右运动为正,摆杆偏离竖直向上方向、向右倾斜为正角。全文及图示均按此约定,后续不再重复说明。
二、直流电机:从电路与力矩方程到状态空间
直流电机包含电气和机械两个子系统。设电枢电阻 R、电感 L、反电动势常数 Ke、转矩常数 Kt、转动惯量 J、粘性阻尼 b。电枢回路电压方程和机械转动方程分别为:
L·di/dt = u - R·i - Ke·ω
J·dω/dt = Kt·i - b·ω
取状态 x = [i; ω],输入 u,输出转速 y = ω,可写成 ẋ = Ax + Bu、y = Cx + Du。以一组教学示例参数为例:R=2 Ω、L=0.5 H、Ke=0.1 V·s/rad、Kt=0.1 N·m/A、J=0.02 kg·m²、b=0.002 N·m·s/rad。在 MATLAB 中可直接构造矩阵:
R=2; L=0.5; Ke=0.1; Kt=0.1; J=0.02; b=0.002;
A=[-R/L, -Ke/L; Kt/J, -b/J];
B=[1/L; 0]; C=[0 1]; D=0;
motor_ss=ss(A,B,C,D);
motor_tf=tf(motor_ss);
运行后 motor_tf 给出转速对电压的传递函数,其直流增益约为 Kt/(R·b+Kt·Ke),代入示例参数约为 2.44 rad/(s·V)。这一数值可用于快速判断模型是否合理:若增益数量级明显偏离,通常说明参数单位或正负号写错。
三、倒立摆:非线性方程与线性化
倒立摆比直流电机复杂,因为摆杆角度与小车位置通过三角函数耦合。设小车质量 M、摆杆质量 m、摆杆半长 l、小车摩擦系数 bc、摆杆转动阻尼 bp、重力加速度 g,控制输入为作用在小车上的水平力 F。忽略摆杆转动惯量的简化模型为:
(M+m)·ẍ + m·l·θ̈·cosθ - m·l·θ̇²·sinθ + bc·ẋ = F
m·l·ẍ·cosθ + m·l²·θ̈ + m·g·l·sinθ + bp·θ̇ = 0
该方程是非线性的,不能直接写成线性状态空间。控制设计中通常在工作点 θ=0、θ̇=0、ẋ=0 附近线性化,令 sinθ≈θ、cosθ≈1、θ̇²≈0。取状态 x=[x; ẋ; θ; θ̇],输出 y=[x; θ],可整理为四阶线性状态空间。以教学示例参数 M=0.5 kg、m=0.2 kg、l=0.3 m、bc=0.1、bp=0.005、g=9.8 m/s² 为例,在 MATLAB 中可用符号运算或直接代入线性化矩阵:
M=0.5; m=0.2; l=0.3; bc=0.1; bp=0.005; g=9.8;
den=M+m;
A=[0 1 0 0;
0 -bc/den -m*g/M 0;
0 0 0 1;
0 bc/(M*l) (M+m)*g/(M*l) -bp/(M*l)];
B=[0; 1/den; 0; -1/(M*l)];
C=[1 0 0 0; 0 0 1 0]; D=[0;0];
pend_ss=ss(A,B,C,D);
注意线性化矩阵中 θ 相关项的正负号与“向右倾斜为正”的约定一致。若符号写反,闭环极点会出现在右半平面,仿真中摆杆会立即发散,这是最常见的建模错误之一。
四、Simulink 中的模型搭建与一致性验证
在 Simulink 中,直流电机可直接用 State-Space 模块实现,把 A、B、C、D 填入模块参数,输入接阶跃信号,输出接示波器。倒立摆则建议先用 MATLAB Function 模块写非线性方程,再用 State-Space 模块并联线性化模型,通过同一输入对比两者在小角度范围内的响应。若两者在 θ<5° 时曲线基本重合,说明线性化有效;若偏差迅速增大,说明工作点或参数需要复核。
一致性验证还有一个更直接的方法:在脚本中比较 ss2tf 得到的传递函数与手工推导结果,或比较状态空间模型与传递函数模型在同一阶跃输入下的响应。MATLAB 中可用 step(motor_ss, motor_tf) 将两条曲线画在同一张图上,若完全重合,说明两种模型描述的是同一对象。
五、从模型到控制器设计的衔接
得到状态空间模型后,可直接用 rank(ctrb(A,B)) 判断能控性,用 rank(obsv(A,C)) 判断能观性。直流电机示例中能控性矩阵满秩,说明可以通过电压控制转速;倒立摆线性化模型同样满秩,说明可以通过小车力同时控制位置和摆角。若秩不足,则需要检查状态变量选取是否遗漏了关键储能元件,或输出是否包含了足够的信息。
传递函数模型则更适合用 margin、bode 观察幅值裕度和相位裕度,为 PID 或超前滞后校正提供依据。两种模型在 MATLAB 中可以互相转换:ss2tf 从状态空间得到传递函数,tf2ss 从传递函数得到状态空间。实际工程中通常先用状态空间完成多变量设计,再用传递函数做频域校核,两者互为验证。
本节的核心不是记住某组矩阵,而是掌握“物理方程 → 状态变量 → 状态空间 → 传递函数 → 仿真验证”的完整链路。直流电机和倒立摆只是载体,换一个对象,这条链路依然适用。