系统状态与状态变量:状态的定义、状态变量的选取原则、状态向量的物理意义
好,咱们今天聊聊状态空间模型里最基础、也最容易让人迷糊的概念——状态和状态变量。
说实话,我刚开始学控制理论那会儿,看到“状态”这个词,总觉得它特别玄乎。老师讲了一堆数学定义,什么“系统在t0时刻的状态是...”,听得我云里雾里。后来做了几个实际项目,才慢慢摸到门道。说白了,状态就是描述系统“此时此刻”到底是个什么情况的一组信息。
一、状态的定义:系统记忆的“快照”
咱们先给个严谨的定义:状态是系统在某一时刻的完整信息集合。有了这个集合,再加上从该时刻开始的输入,就能唯一确定系统未来的行为。
你想想看,这像不像拍了一张照片?这张照片记录了系统此刻的所有“记忆”。比如一个电机,它的状态就是当前位置和当前转速。有了这两个数,再加上你接下来要给它加多少电压,我就能算出它下一秒会转到哪儿、转多快。
核心要点:状态是系统过去所有输入信息的“压缩包”。它把历史影响浓缩成一组数值,用来预测未来。
我在做伺服驱动器项目时,遇到过一个问题:电机在低速运行时抖动得厉害。排查了半天,发现是状态估计不准。当时用的状态变量只有位置和速度,忽略了电流环的动态。说白了,就是“快照”拍得不够全,漏掉了关键信息。后来把电流也加进状态里,问题就解决了。
二、状态变量的选取原则:不是随便挑的
状态变量怎么选?这可不是拍脑袋决定的。我总结了几条原则,都是实战中踩过坑换来的。
原则1:最小性——够用就行
状态变量的个数,应该等于系统的阶数。多了是冗余,少了是缺失。
举个例子,一个弹簧-质量-阻尼系统,它的运动方程是二阶微分方程。那状态变量选几个?两个就够了:位移和速度。你非要再加个加速度进去,那就是画蛇添足。因为加速度可以由位移和速度推导出来,不是独立信息。
我的经验:选状态变量时,先写出系统的微分方程,看看最高阶导数是几阶。阶数就是状态变量的个数。这个办法我用了十几年,从来没出过问题。
原则2:独立性——不能互相“算出来”
选出来的状态变量之间,不能有线性关系。说白了,你不能用一个状态变量去线性表示另一个。
比如,你选了位置x和速度v,这两个是独立的。但如果你选了位置x和2x,那就有问题了——2x完全由x决定,没有提供任何新信息。
我记得有一次带新人做项目,他选了三个状态变量:电机角度、角速度、角加速度。我一看就笑了:“角加速度不就是角速度的导数吗?这俩是线性相关的啊。”结果仿真时矩阵奇异,算都算不下去。
原则3:可测性——最好能直接测到
虽然状态观测器可以估计不可测的状态,但能直接测量总是最好的。测量越直接,控制精度越高,系统鲁棒性也越好。
我个人的习惯是:优先选传感器能直接测到的物理量作为状态变量。比如电机控制,位置用编码器测,速度用测速发电机或者由位置差分得到。实在测不到的,再用观测器去估。
| 系统类型 | 推荐状态变量 | 可测性 |
|---|---|---|
| 直流电机 | 位置、速度、电流 | 位置/速度:编码器;电流:霍尔传感器 |
| 倒立摆 | 小车位置、小车速度、摆杆角度、摆杆角速度 | 位置/角度:编码器;速度/角速度:差分或陀螺仪 |
| 温度系统 | 各测温点温度 | 热电偶或热敏电阻直接测量 |
三、状态向量的物理意义:把状态装进一个“盒子”里
把选好的状态变量排成一列,就得到了状态向量。用数学符号表示就是:
x(t) = [x₁(t), x₂(t), ..., xₙ(t)]ᵀ
这个向量有什么物理意义?说白了,它就是系统在t时刻的“身份ID”。每个分量代表系统的一个独立自由度。
咱们拿一个实际的例子来说。我在做四轴飞行器飞控时,状态向量长这样:
x = [x, y, z, φ, θ, ψ, u, v, w, p, q, r]ᵀ
你看,前三个是位置(x,y,z),中间三个是姿态角(横滚、俯仰、偏航),后面六个是线速度和角速度。一共12个状态变量,完整描述了飞行器在空中的运动状态。
为什么要这么多?因为飞行器是六自由度的系统,每个自由度需要两个状态变量(位置和速度)来描述。12个,一个不多,一个不少。
注意:状态向量的维数决定了状态空间模型的复杂度。维数越高,计算量越大,控制器设计也越困难。所以,在满足控制要求的前提下,尽量选最少的状态变量。我曾经见过一个项目,状态向量选了20多个变量,结果控制器跑都跑不动,最后砍掉一半才解决问题。
四、实战中的避坑指南
说了这么多,最后分享几个我踩过的坑,希望能帮你少走弯路。
坑一:状态变量选得太多。 我曾经做一个机械臂控制,一开始选了关节角度、角速度、角加速度、电机电流、电机温度...一共十几个变量。结果模型复杂得要命,调参调到崩溃。后来冷静下来一想,温度变化很慢,完全可以当成时变参数处理,不用放进状态里。去掉之后,模型清爽多了。
坑二:忽略了状态变量的量纲。 状态向量里,位置是米,速度是米/秒,角度是弧度。这些量纲差异很大,如果不做归一化处理,数值计算时容易出现病态矩阵。我的习惯是:把所有状态变量都归一化到[-1, 1]或者[0, 1]区间,这样数值稳定性好很多。
坑三:状态变量之间耦合太强。 有些系统,比如多关节机器人,关节之间的运动耦合很强。这时候如果直接选关节角度作为状态变量,模型会非常复杂。我建议先做解耦处理,或者选一些解耦后的虚拟变量作为状态。
一个小技巧:如果你不确定状态变量选得对不对,可以做个简单的验证。给系统一个脉冲输入,看看状态变量的响应是否独立。如果两个状态变量的响应曲线形状完全一样,那它们很可能不是独立的。
好了,关于状态和状态变量,今天就聊到这儿。记住一句话:状态是系统的“记忆”,状态变量是“记忆”的载体,状态向量是“记忆”的完整快照。选对了,后面的建模和控制就顺风顺水;选错了,后面全是坑。
下一节咱们聊聊状态空间方程的建立,到时候我会拿一个实际电机系统做例子,手把手带你走一遍流程。