第190篇 状态反馈与极点配置——让系统按你想要的方式响应
上篇聊了能控性和能观性知道了怎么判断系统能不能控制。现在假设你的系统是能控的——恭喜你你可以设计控制器了。但问题来了怎么设计PID调参靠经验靠试错。有没有一种方法能直接告诉系统我要你以什么样的动态特性来响应这就是状态反馈与极点配置要做的事。说白了就是通过反馈所有状态变量把系统的极点放到你想要的位置。极点放好了系统的响应速度、超调量、稳定性就全定了。这个思路在机器人控制里用得非常多。四旋翼的姿态控制、机械臂的关节控制、倒立摆的平衡控制背后都有极点配置的思想。面试的时候这是现代控制理论必考的计算题。状态反馈的基本思路先回忆一下状态空间方程dx/dt A*x B*u y C*x D*u状态反馈的思想很简单把控制输入u设计成状态的线性组合。u -K*x rK是反馈增益矩阵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是极点和负实轴的夹角。想要zeta0.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是试出来的极点配置是算出来的。QAckermann公式的数值稳定性怎么样A高阶系统n10Ackermann公式数值不稳定因为要算能控性矩阵的逆。工程上一般用place_poles这种基于数值方法的算法或者直接用LQR下篇会讲。Q极点配置能处理约束吗A不能。极点配置不考虑输入约束和执行器饱和。如果算出来的K矩阵导致控制量超出执行器能力你就得加抗饱和或者换MPC。这也是为什么工业界越来越多用MPC替代传统极点配置。讲真极点配置这个知识点面试最爱考的是计算。给你一个二阶或三阶系统让你手算K矩阵。你一定要熟悉Ackermann公式或者系数匹配法考试的时候能快速算出来。小结今天聊了状态反馈与极点配置。核心思路就是用状态反馈u -K*x改变系统矩阵为(A-BK)通过选择K把极点放到你想要的位置从而决定系统的动态行为。极点配置的前提是系统能控局限是需要知道所有状态。下一篇我们解决这个局限——用状态观测器来估计那些测不到的状态量。如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第189篇 能控性与能观性——系统能不能控制/观测的判定下一篇预告第191篇 状态观测器——测不到的状态量怎么估计有任何问题欢迎评论区留言我会尽量回复。