
前面聊了PID、LQR、LQG、MPC这些控制器有个共同特点参数是固定的。PID的Kp、Ki、Kd调好就不动了。LQR的增益矩阵K算完就固定了。MPC每步虽然重新算但用的模型是固定的。问题来了如果系统本身在变呢你做一个机械臂抓取空载时负载是0抓起一个2kg的物体后负载变了。你的控制器参数还是按空载调的抓起来之后机械臂就开始抖。再比如无人机电池从满电到没电重量减轻了几十克重心也在漂移。固定参数的PID在起飞时调好的到降落时可能就不合适了。这种情况叫参数不确定性或参数时变。自适应控制就是来解决这个问题的——让控制器自己能适应系统参数的变化。一、自适应控制的基本思路自适应控制的核心逻辑是在线估计参数 实时调整控制器。说白了就两步一边运行一边估计系统的未知参数参数辨识根据估计出的参数实时计算控制律控制律更新这两步同时进行形成一个双环结构内环是控制环算控制量外环是参数辨识环更新参数估计。自适应控制和增益调度的区别在于增益调度是提前知道不同工况下的参数预先存好自适应控制是不知道参数会变多少在线自己估。前者像开卷考试答案在书里后者像闭卷考试答案要自己算。二、模型参考自适应控制MRACMRAC是最经典的自适应控制方案之一。思路很直觉你有一个参考模型描述了你希望系统达到的理想行为。实际控制中你让真实系统的输出去跟踪参考模型的输出。跟踪误差驱动参数估计的更新参数估计又反过来调整控制律。数学上假设被控对象是y_dot a * y b * u其中a和b是未知常数但b的符号已知。参考模型y_m_dot -a_m * y_m b_m * r其中a_m和b_m是你设计的参考模型参数r是参考输入。定义跟踪误差 e y - y_m。MRAC的目标是让e趋近于零。控制律设计u theta_hat * x其中theta_hat是参数估计值x是包含y和r的回归向量。参数更新律MIT规则theta_hat_dot -gamma * e * xgamma是学习率adaptation gain控制参数更新的速度。关键问题怎么证明这个自适应系统是稳定的e能收敛到零吗theta_hat不会发散吗这就需要用Lyapunov稳定性分析来证明。选一个Lyapunov函数V(e, theta_tilde)证明V_dot 0就能保证e和参数估计误差都收敛。具体推导后面聊非线性控制时会详细展开。三、自校正调节器STR另一种经典方案是自校正调节器Self-Tuning Regulator。STR的思路和MRAC不同它不定义参考模型而是直接在线辨识系统模型参数然后用辨识出的参数重新计算控制器。STR的流程用递推最小二乘法RLS在线估计A和B然后重新算LQR增益K用新K做控制循环往复。STR比MRAC更灵活因为可以直接用任何基于模型的控制方法。但计算量更大——每步都要解Riccati方程。讲真STR在工业过程控制中用得比较多。化工反应釜的参数随反应进程变化STR能自动跟踪。机器人领域用得相对少因为机器人模型通常比较确定主要是负载变化。四、Python代码MRAC仿真来看一个MRAC的例子。被控对象参数未知用MRAC让系统跟踪参考模型。import numpy as np import matplotlib.pyplot as plt # 被控对象参数未知控制器不知道这个值 a_true -2.0 b_true 3.0 # 参考模型参数设计者选择 a_m 4.0 b_m 4.0 # 自适应参数 gamma 5.0 # 学习率 # 仿真参数 dt 0.001 T np.arange(0, 5, dt) N len(T) # 参考输入方波 r np.where(np.sin(T * 2) 0, 1.0, -1.0) # 初始化 y 0.0 # 被控对象输出 y_m 0.0 # 参考模型输出 theta_hat 0.0 # 参数估计初始值 # 记录 y_log np.zeros(N) y_m_log np.zeros(N) theta_log np.zeros(N) for i in range(N): # 回归向量 x_vec np.array([y, r[i]]) # 控制律 u theta_hat x_vec # 被控对象演化 y (a_true * y b_true * u) * dt # 参考模型演化 y_m (-a_m * y_m b_m * r[i]) * dt # 跟踪误差 e y - y_m # 参数更新MRAC自适应律 theta_hat -gamma * e * x_vec * dt # 记录 y_log[i] y y_m_log[i] y_m theta_log[i] theta_hat[0] # 画图 fig, axes plt.subplots(2, 1, figsize(10, 6)) axes[0].plot(T, y_log, labelPlant output y) axes[0].plot(T, y_m_log, --, labelReference model y_m) axes[0].set_ylabel(Output) axes[0].legend() axes[0].set_title(MRAC: Plant tracks Reference Model) axes[1].plot(T, theta_log) axes[1].set_ylabel(theta_hat) axes[1].set_xlabel(Time (s)) axes[1].set_title(Parameter Adaptation) plt.tight_layout() plt.savefig(mrac_simulation.png, dpi150) plt.show()这段代码展示了MRAC的核心逻辑控制律用参数估计值计算参数估计用跟踪误差驱动更新。初始时参数估计不对系统输出和参考模型差距很大。随着自适应律不断修正参数估计逐渐收敛跟踪误差趋近于零。五、自适应控制的局限自适应控制听起来很美好但实际落地有几个坑收敛速度问题参数估计需要充分激励persistency of excitation才能收敛。如果参考输入不够丰富比如一直是恒定值参数估计可能不收敛或者收敛很慢。在机器人应用中如果机械臂长时间保持一个姿势参数估计就卡住了。稳定性证明复杂自适应系统是非线性的参数估计和控制律耦合稳定性证明比线性系统复杂得多。必须用Lyapunov方法严格证明不能靠直觉。对未建模动态敏感自适应控制假设系统结构已知比如一阶或二阶只是参数未知。如果系统有未建模的动态比如高频谐振自适应律可能和这些动态耦合导致不稳定。这个现象叫自适应控制的鲁棒性问题在1980年代曾经引发过一场学术大讨论。面试的时候如果问到自适应控制先讲清楚MRAC和STR的基本原理然后重点聊局限性——收敛条件、稳定性、鲁棒性。面试官想看到的是你对这个方法有全面认识而不是只会背公式。六、面试实战Q自适应控制和鲁棒控制有什么区别A自适应控制是在线调整参数去适应变化本质是学习。鲁棒控制是设计一个固定参数的控制器保证在参数变化范围内都能工作本质是容忍。前者更灵活但更复杂后者更简单但保守。Q什么场景用自适应控制A系统参数变化范围大、变化慢、且可以在线辨识的场景。比如大型船舶的姿态控制装载不同货物时惯性矩变化很大、化工过程控制反应参数随时间漂移、无人机长航时飞行电池消耗导致重量变化。Q自适应控制学习率gamma怎么选Agamma大参数收敛快但对噪声敏感可能振荡。gamma小参数收敛慢但平滑稳定。工程上通常先用小gamma跑确认稳定后再逐步增大。小结自适应控制解决的是系统参数变了控制器怎么跟着变的问题。两大经典方案MRAC用参考模型驱动参数更新STR用在线辨识控制器重设计。核心难点在于稳定性证明和收敛条件。不是所有场景都适合自适应——参数变化快、未建模动态多、激励不充分的场景自适应可能反而不如固定参数的鲁棒控制器。下篇聊鲁棒控制——和自适应控制互补的另一条路。不在线调整参数而是设计一个足够强壮的控制器在参数变化范围内都能保持稳定和性能。如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第196篇 MPC实时求解——计算效率和嵌入式部署的挑战下一篇预告第198篇 鲁棒控制——在不确定性中保持稳定有任何问题欢迎评论区留言我会尽量回复。