一、控制发散现象:发散的定义、发散的原因
各位同学,咱们今天聊一个很实在的话题——控制发散。
说实话,做控制这么多年,我最怕的就是半夜接到电话,说系统发散炸了。嗯,那种感觉,就像你精心调教的车子突然在高速上失控。今天我就把这块掰开揉碎了讲清楚。
1.1 发散的定义——到底什么叫发散?
先给个最直白的定义:控制发散,就是系统的状态量或者控制量,在运行过程中不断增大,最终超出物理极限或者数值范围。
你想想看,正常情况下的控制,误差应该越来越小,最后收敛到目标值附近。但发散正好相反——误差越来越大,系统越来越不稳定。
我个人的习惯是,把发散分成两类来看:
- 数值发散:计算出来的数值越来越大,比如位置从1变成10,再变成1000,最后变成NaN(不是数字)。
- 物理发散:实际物理量超出限制,比如电机转速超过额定值,或者机械臂撞到限位。
核心判断标准:如果系统状态量的绝对值随时间单调递增,或者出现振荡且振幅越来越大,基本可以判定为发散。
我在项目中遇到过一种情况:一个PID控制器,参数看起来没问题,仿真也跑得好好的。结果一上实际硬件,电机直接飞车。后来一查,是积分项在累积误差,数值越滚越大——这就是典型的数值发散。
1.2 发散的原因之一:数值积分误差
说白了,计算机是离散的,但物理世界是连续的。我们用离散的算法去模拟连续的系统,误差就来了。
最常见的场景是积分环节。比如PID控制器里的积分项:
// 离散化积分
integral += error * dt; // 欧拉法积分
这段代码看起来没问题吧?但实际跑起来,如果dt(采样周期)设置得不对,或者误差一直存在,积分项就会不断累加。我见过一个案例,积分项从0.1累加到1000,控制器输出直接饱和,系统彻底失控。
为什么会这样?因为欧拉法积分本身就有截断误差。误差会随着时间累积,尤其是当系统存在稳态误差时,积分项就像滚雪球一样越来越大。
我的建议:实际工程中,一定要加积分限幅。我习惯的做法是,把积分项限制在输出范围的±20%以内。另外,能用梯形法积分就别用欧拉法,精度差不少。
1.3 发散的原因之二:模型失配
模型失配,说白了就是你的控制器以为系统长这样,但实际系统长那样。两者不一样,控制效果自然就差了。
举个例子,你设计控制器时假设电机的时间常数是0.1秒,但实际电机因为老化或者负载变化,时间常数变成了0.3秒。这时候你算出来的控制量,对实际系统来说就太大了,容易过冲甚至发散。
我记得有一次做无人机姿态控制,仿真里飞得稳稳的,一上天就翻跟头。查了两天才发现,是桨叶的转动惯量参数给错了,差了将近一倍。这就是典型的模型失配导致发散。
常见的模型失配类型:
| 失配类型 | 典型表现 | 后果 |
|---|---|---|
| 参数偏差 | 质量、惯量、阻尼等参数不准 | 控制增益过大或过小 |
| 结构失配 | 忽略了高阶动态或非线性 | 高频振荡或极限环 |
| 时变特性 | 系统参数随时间变化 | 控制器逐渐失效 |
注意:模型失配是控制发散中最难排查的原因之一。我曾经花了一周时间,最后发现是一个摩擦模型的库仑摩擦系数写反了。所以,做控制一定要有模型验证的环节,别光靠仿真。
1.4 发散的原因之三:采样率不足
采样率不足,说白了就是你的控制器反应太慢,跟不上系统的变化速度。
根据香农采样定理,采样频率至少要大于系统最高频率的两倍。但在实际工程中,我建议至少留出3-5倍的余量。为什么?因为真实系统有噪声、有延迟,两倍只是理论下限。
我遇到过最典型的案例:一个快速响应的伺服系统,采样率设成了100Hz,但系统的机械谐振频率是80Hz。结果就是,控制器每次采样到的数据都是滞后的,控制量总是慢半拍,系统开始剧烈振荡。
采样率不足的典型症状:
- 控制量出现高频抖动
- 系统响应滞后明显
- 误差信号看起来像锯齿波
- 降低增益后反而稳定了(但性能也下降了)
避坑指南:我曾经在做一个视觉伺服项目时,相机帧率只有30fps,但机械臂的响应频率需要100Hz以上。结果就是,视觉反馈永远跟不上机械臂的运动,系统一直在振荡。后来我加了一个状态观测器做预测补偿,才勉强稳住。所以,采样率不够的时候,别硬扛,要么换硬件,要么加算法补偿。
1.5 本章知识体系
下面这张图,是我自己总结的控制发散知识框架,方便大家理解这三类原因之间的关系:
这张图想表达的核心意思是:数值积分误差、模型失配、采样率不足,这三者不是孤立的。很多时候,一个系统发散是多个原因叠加的结果。比如采样率不足会放大积分误差,模型失配会让积分项更难收敛。
一句话总结:控制发散的本质,是离散化、模型化、采样化这三个环节的误差累积,最终突破了系统的稳定边界。
好了,这一章的内容就到这里。下一章我们会深入讲如何诊断发散问题,以及具体的调试工具和方法。到时候我会分享一些我实际用过的调试技巧,保证实用。