状态反馈与极点配置——让系统按你想要的方式响应
上篇聊了能控性和能观性,知道了怎么判断系统"能不能控制"。现在假设你的系统是能控的——恭喜你,你可以设计控制器了。
但问题来了:怎么设计?PID调参靠经验,靠试错。有没有一种方法,能直接告诉系统"我要你以什么样的动态特性来响应"?
这就是状态反馈与极点配置要做的事。说白了,就是通过反馈所有状态变量,把系统的极点放到你想要的位置。极点放好了,系统的响应速度、超调量、稳定性就全定了。
这个思路在机器人控制里用得非常多。四旋翼的姿态控制、机械臂的关节控制、倒立摆的平衡控制,背后都有极点配置的思想。面试的时候,这是现代控制理论必考的计算题。
状态反馈的基本思路
先回忆一下状态空间方程:
dx/dt = A*x + B*u y = C*x + D*u
状态反馈的思想很简单:把控制输入u设计成状态的线性组合。
u = -K*x + r
K是反馈增益矩阵,r是参考输入(你想让系统跟踪的目标值)。负号是惯例,表示负反馈。
把这个控制律代回状态方程:
dx/dt = A*x + B*(-K*x + r) = (A - B*K)*x + B*r
看到了吗?闭环系统的系统矩阵变成了(A - BK)。原来的极点(A的特征值)被你通过选择K矩阵,搬到了(A - BK)的特征值的位置。
这就是极点配置的核心:通过选择合适的K,让(A - BK)的特征值等于你期望的极点位置。
极点配置怎么算
假设系统是能控的,状态维数是n。你想把n个极点放到指定位置p1, p2, ..., pn。
方法有好几种,最经典的是Ackermann公式:
import numpy as np
from scipy.signal import place_poles
# 系统矩阵
A = np.array([[0, 1], [0, 0]])
B = np.array([[0], [1]])
# 期望极点(想要快速响应且不过冲)
desired_poles = [-5, -5] # 两个重根,临界阻尼
# 用scipy的极点配置
result = place_poles(A, B, desired_poles)
K = result.gain_matrix
print("反馈增益K:", K)
# 验证闭环极点
A_cl = A - B @ K
eigenvalues = np.linalg.eigvals(A_cl)
print("闭环极点:", eigenvalues)
算出来K = [25, 10]。也就是说控制律是u = -25x1 - 10x2 + r,位置偏差乘以25加上速度乘以10,这不就是一个PD控制器吗?
没错,对于二阶系统,状态反馈本质上就是PD控制。但状态反馈的强大之处在于它能处理高阶系统和多变量系统——这时候手动调PD参数几乎不可能,但极点配置可以直接算出来。
Ackermann公式的数学形式是:
K = [0, 0, ..., 1] * Co^(-1) * phi(A)
其中Co是能控性矩阵,phi(A)是把A代入期望特征多项式得到的矩阵。这个公式面试偶尔会考,但更重要的是理解它的物理意义:能控性矩阵满秩(系统能控)是Ackermann公式可解的前提。
极点放在哪:工程上的经验法则
算K矩阵不难,难的是决定把极点放在哪。这需要对控制理论有直觉。
几个基本原则:
实部决定衰减速率。 极点实部越负,响应越快。但太快了执行器跟不上,还可能激发高频未建模动态。经验上,极点实部不要超过执行器带宽的1/3。
虚部决定振荡频率。 如果极点在实轴上(虚部为零),响应是非振荡的。如果有虚部,响应会振荡。阻尼比zeta = cos(theta),theta是极点和负实轴的夹角。想要zeta=0.7(工程上最常用的阻尼比),theta大约是45度。
主导极点原则。 如果某些极点比其他极点离虚轴近3-5倍以上,那些远的极点影响可以忽略,系统行为由主导极点决定。这样你就可以用二阶系统的直觉来设计高阶系统。
之前做四旋翼姿态控制的团队分享过经验:内环姿态控制的极点一般放在10-30rad/s,对应响应时间0.1-0.3秒。太快了电机电流跟不上,太慢了姿态响应迟钝。外环位置控制的极点放在2-5rad/s,比内环慢5-10倍,保证内外环分离。
还有个容易忽略的点:极点配置不是越"快"越好。你把极点放到-100,理论上系统响应极快,但实际控制中这意味着巨大的控制量。执行器有饱和限制,电机有最大电流,你算出来的K矩阵会让执行器瞬间饱和,系统反而变得非线性甚至不稳定。所以极点配置一定要结合执行器的能力来考虑,不能纯数学地追求"快"。
说个我自己调机械臂关节的经历。当时用极点配置给一个二关节机械臂设计控制器,仿真里极点放在-20,响应又快又稳。结果部署到实物上,电机一启动就直接堵转了。排查了一圈发现仿真里没考虑电机的最大电流限制,算出来的增益在启动瞬间需要的电流远远超出了额定值。后来把极点挪到-8,响应虽然慢了一些但电机不会堵转,再配合一个抗饱和逻辑,系统才真正跑起来。这件事给我最大的教训就是:极点配置一定要在仿真里加上执行器约束,纯线性仿真得到的结果往往过于理想化了。
状态反馈的局限:我需要知道所有状态
状态反馈有个致命的前提:你得知道所有状态变量的值。
控制律u = -K*x,这里x是所有状态。如果你的系统有6个状态变量(比如四旋翼的位置、速度、姿态、角速度),你需要实时测量这6个量。
但实际系统中,不是所有状态都能直接测量。位置可以用GPS或视觉定位,姿态可以用IMU,但速度呢?角加速度呢?很多状态要么没有传感器,要么传感器噪声太大。
这就引出了两个解决思路:
思路一:输出反馈。 不用全部状态,只用能测到的输出y来构造控制律u = -Ky。但输出反馈的极点配置能力远不如状态反馈——你能配的极点范围小得多,有时候甚至配不出想要的极点。
思路二:状态观测器。 既然测不到所有状态,那就用能测到的输入输出数据来"估计"那些测不到的状态。估计出来的状态再拿去做反馈。这就是Luenberger观测器的思路,下一篇专门讲。
这两个思路组合起来,就是著名的"分离原理":控制器设计和观测器设计可以分开做,合在一起仍然稳定。这个原理是现代控制理论最优美的结论之一。
分离原理的数学含义是:闭环系统的极点 = 状态反馈的极点 + 观测器的极点。两部分互不影响,可以独立设计。这在实际工程中太有用了——你先不管观测器,按理想情况设计状态反馈K;再单独设计观测器增益L。最后把两者组合,系统照样稳定。
面试实战:极点配置常见问题
Q:极点配置的前提条件是什么? A:系统必须完全能控。如果能控性矩阵不满秩,你只能配置能控子系统的极点,不能控的极点动不了。
Q:极点配置和PID有什么关系? A:对于二阶系统,状态反馈等价于PD控制。对于高阶系统,状态反馈是PD的推广。PID是"试"出来的,极点配置是"算"出来的。
Q:Ackermann公式的数值稳定性怎么样? A:高阶系统(n>10)Ackermann公式数值不稳定,因为要算能控性矩阵的逆。工程上一般用place_poles这种基于数值方法的算法,或者直接用LQR(下篇会讲)。
Q:极点配置能处理约束吗? A:不能。极点配置不考虑输入约束和执行器饱和。如果算出来的K矩阵导致控制量超出执行器能力,你就得加抗饱和或者换MPC。这也是为什么工业界越来越多用MPC替代传统极点配置。
讲真,极点配置这个知识点,面试最爱考的是计算。给你一个二阶或三阶系统,让你手算K矩阵。你一定要熟悉Ackermann公式或者系数匹配法,考试的时候能快速算出来。
小结
今天聊了状态反馈与极点配置。核心思路就是:用状态反馈u = -K*x改变系统矩阵为(A-BK),通过选择K把极点放到你想要的位置,从而决定系统的动态行为。
极点配置的前提是系统能控,局限是需要知道所有状态。下一篇我们解决这个局限——用状态观测器来估计那些测不到的状态量。
如果这篇文章对你有帮助,欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。
「机器人软件开发面试·从入门到精通」连载系列 上一篇:第189篇 能控性与能观性——系统能不能控制/观测的判定 下一篇预告:第191篇 状态观测器——测不到的状态量怎么估计
有任何问题欢迎评论区留言,我会尽量回复。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)