前面聊了PID、LQR、LQG、MPC、自适应控制、鲁棒控制。这些方法有一个共同点:大部分基于线性系统理论。PID是线性的,LQR/LQG是线性的,MPC的标称版本也是线性的。

但实际机器人系统本质上是非线性的。机械臂的科氏力和离心力项是状态的二次函数。四旋翼的旋转运动用四元数描述,本身就是非线性的。双足机器人的接触碰撞模型是分段非线性的。

线性控制方法在非线性系统上能用吗?能用,但只在平衡点附近的小范围内有效。一旦偏离平衡点太远,线性近似就不准了,控制性能急剧下降甚至失稳。

怎么办?需要非线性控制的工具。最核心的工具就是Lyapunov稳定性分析。

一、什么是Lyapunov稳定性

Lyapunov稳定性的直觉理解很简单:一个球放在碗里,你轻轻推一下,球晃一晃又回到碗底——这就是稳定。球放在山顶上,你轻轻推一下,球滚下去了——这就是不稳定。

数学上,Lyapunov稳定性有三种级别:

稳定(Stable):从平衡点附近出发的轨迹,永远停留在平衡点附近。不要求回到平衡点,但至少不会跑远。

渐近稳定(Asymptotically Stable):不仅稳定,而且轨迹最终会收敛到平衡点。碗底的球最终会停下来。

指数稳定(Exponentially Stable):渐近稳定的加强版——收敛速度有指数衰减的下界保证。收敛得"足够快"。

控制工程中最关心的是渐近稳定。你设计了一个控制器,不仅希望系统不跑飞(稳定),还希望系统最终能到达目标(渐近稳定),而且收敛速度要够快(指数稳定)。

二、Lyapunov直接法:不用解方程就能判断稳定性

Lyapunov最大的贡献是"直接法"(也叫第二方法):你不需要求解微分方程,就能判断系统的稳定性。

怎么做?找一个"Lyapunov函数"V(x)。

V(x)需要满足三个条件:

  1. V(x) > 0,对所有x不等于0(正定性)
  2. V(0) = 0
  3. V_dot(x) <= 0,沿系统轨迹的导数非正(能量在减少或不增)

如果找到这样的V(x),系统就是稳定的。如果V_dot(x) < 0(严格负),系统就是渐近稳定的。

V(x)的物理意义是什么?你可以把它理解为系统的"广义能量"。碗底的球,势能最小。球偏离碗底,势能增大。如果系统运动过程中"能量"一直在减少(V_dot < 0),那球最终一定会停在碗底。

这就是Lyapunov直接法的精髓:你不需要知道球具体怎么运动(不用解微分方程),只需要证明"能量一直在减少",就能断言球最终会停在碗底。

三、怎么找Lyapunov函数

找Lyapunov函数是这门手艺中最难的部分。没有通用方法,需要经验和技巧。

几个常见套路:

二次型:V(x) = x^T * P * x,P是正定矩阵。这是最常用的选择,对线性系统x_dot = Ax,V_dot = x^T(A^TP + PA)x,要求A^TP + PA < 0(负定)。这就是Lyapunov方程,和LQR的Riccati方程有直接关系。

能量函数:对机械系统,动能+势能天然就是一个Lyapunov函数候选。比如单摆,V = 0.5ml^2theta_dot^2 + mgl(1-cos(theta)),动能加势能,正定且沿轨迹递减(有阻尼时)。

** backstepping构造**:对特殊结构的非线性系统(严格反馈形式),可以递推地构造Lyapunov函数。从最简单的子系统开始,一步步"后退"构造完整的Lyapunov函数。这个方法在非线性控制教材里是重点。

讲真,找Lyapunov函数在研究中经常靠"试"。先猜一个形式(通常是二次型或能量函数),算V_dot看是不是负定。如果不是,调整V的形式再试。做多了就有直觉了。

补充一个实用技巧:对线性系统,你可以直接用LQR的P矩阵当Lyapunov函数。因为LQR的Riccati方程A^TP + PA - PBR^{-1}B^TP + Q = 0本身就保证了A^TP + PA < 0(在闭环系统下)。所以如果你已经设计了LQR控制器,Lyapunov函数是"免费"附赠的。

对非线性系统,一个常用策略是先在平衡点线性化,用线性系统的Lyapunov函数作为候选,然后在非线性系统上验证。如果V_dot在某个邻域内负定,那这个邻域就是吸引域(domain of attraction)。

四、用Lyapunov设计控制器

Lyapunov方法不仅能分析稳定性,还能直接用来设计控制器。

思路是:先选一个Lyapunov函数候选V(x),然后设计控制律u(x)使得V_dot < 0。

举个例子。系统:x_dot = f(x) + g(x)u。选V(x) = 0.5x^T*x。

V_dot = x^T * (f(x) + g(x)*u)

要让V_dot < 0,可以选:

u = -g(x)^{-1} * (f(x) + K*x),其中K是正定矩阵。

代入后V_dot = -x^TKx < 0,系统渐近稳定。

这个方法叫"Lyapunov-based control design"。在机器人领域用得非常多——机械臂的 computed torque control本质上就是Lyapunov设计。

import numpy as np

# 例:用Lyapunov方法设计非线性控制器
# 系统: x_dot = -x^3 + u (一维非线性系统)
# 目标: 让x收敛到0

# 选Lyapunov函数 V = 0.5 * x^2
# V_dot = x * x_dot = x * (-x^3 + u)
# 要让V_dot < 0, 选 u = -k*x + x^3 (k > 0)
# 代入: V_dot = x * (-x^3 - k*x + x^3) = -k * x^2 < 0

k = 2.0  # 控制增益

def controller(x):
    """基于Lyapunov的控制律"""
    return -k * x + x**3

# 仿真验证
dt = 0.01
x = 2.0  # 初始偏离
traj = [x]

for i in range(500):
    u = controller(x)
    x += (-x**3 + u) * dt
    traj.append(x)

print(f"初始: x={traj[0]:.2f}, 最终: x={traj[-1]:.4f}")
# 输出: 初始: x=2.00, 最终: x≈0.0000
# 验证: 系统确实收敛到0

这个例子虽然简单,但展示了Lyapunov设计的完整流程:选V(x)、算V_dot、设计u使得V_dot < 0、验证收敛。

五、面试实战

Q:Lyapunov稳定性分析和线性系统的极点分析有什么关系? A:对线性系统x_dot = Ax,Lyapunov方程A^TP + PA = -Q等价于要求A的所有特征值在左半平面。Lyapunov方法是极点分析的推广——它能处理非线性系统。

Q:找不到Lyapunov函数怎么办? A:找不到不代表系统不稳定,只代表你选的方法不对。可以试不同形式的V(x):二次型、能量函数、积分型。也可以反过来——用sum-of-squares(SOS)优化方法自动搜索Lyapunov函数,但计算量大。

Q:Lyapunov方法在机器人领域怎么应用? A:太多了。机械臂的computed torque control、移动机器人的轨迹跟踪、四旋翼的姿态控制、双足机器人的步态稳定,都用Lyapunov方法证明稳定性。面试时你能举出一个具体应用的Lyapunov函数构造过程,基本就过关了。

小结

Lyapunov稳定性分析是非线性控制的基石。核心思想:找一个"广义能量函数"V(x),证明它沿系统轨迹递减,就能断言系统稳定。

Lyapunov方法不仅能分析稳定性,还能直接设计控制器——选V(x),然后反推让V_dot < 0的控制律。

找Lyapunov函数没有通用方法,需要经验和技巧。二次型和能量函数是最常见的候选。做多了就有直觉了。

下篇聊滑模控制——一种基于Lyapunov方法的强鲁棒非线性控制方案。对扰动和参数变化"免疫",代价是控制信号会高频切换。


如果这篇文章对你有帮助,欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。

「机器人软件开发面试·从入门到精通」连载系列 

上一篇:第198篇 鲁棒控制——在不确定性中保持稳定

下一篇预告:第200篇 滑模控制——对扰动"免疫"的强鲁棒方案

有任何问题欢迎评论区留言,我会尽量回复。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐