跳到正文
格致开物MATHWIKI

控制障碍函数

控制障碍函数(control barrier function,CBF)把保持安全集合的要求,写成每个状态下控制输入应满足的微分不等式。它不是静态地惩罚“靠近危险”的分数,而是约束系统接下来可以朝哪些方向运动,使安全集合前向不变。

半直线上的安全边界

考虑 x˙=u,安全集合 C={x≥0},取定义函数 h(x)=x。如果沿整个连续时间轨迹都满足 h˙=u≥−κh,κ>0, 则 ddt(eκth(x(t)))≥0,积分得到 h(x(t))≥e−κth(x(0))。只要初态在 C 内,之后就始终非负。这是本例的安全证明,不能用离散动画中几次没越界代替。

与强行要求 h˙≥0 相比,该条件允许在内部朝边界靠近,只限制靠近速度;在边界 h=0 处,才要求导数不为负。[1]

最少改动名义输入

设名义控制想让系统以 unom=−1 向左移动,取 κ=1。每个时刻求 minu 12(u+1)2满足 u≥−x. 若 x≥1,原输入已经可行,最优仍为负一;若 0≤x<1,离负一最近的可行值是 −x。因此安全过滤后的输入为 u(x)=max⁡(−1,−x)。

安全过滤输入max(-1,-x)在状态小于1时沿u=-x提高,状态大于1时保持名义输入-1
虚线是名义输入;实线是满足障碍约束、同时改动最小的输入。越靠近零,允许向左的速度越小。

从 x0=2 出发,前一秒满足 x(t)=2−t;到 x=1 后切换成 x˙=−x,因此 x(t)={2−t,0≤t≤1,e−(t−1),t≥1. 它逐渐靠近安全边界,从不穿过。若初值为二分之一,则从一开始就按 x(t)=e−t/2 演化。

安全控制下初值2先线性到1再指数趋零,初值1/2则全程指数趋零
两条轨迹都留在非负半直线。此处轨迹使用连续反馈的解析解;只在采样时刻检查约束并不自动得到同样保证。

一般控制仿射形式与可行性

对 x˙=f(x)+g(x)u,设 f,g 局部Lipschitz,令 C={h(x)≥0},h 连续可微。常用零化CBF约束为 Lfh(x)+Lgh(x)u≥−α(h(x)), 其中 α 是在相关区间上局部Lipschitz的扩展类K函数,即严格递增且 α(0)=0;本篇证明使用 α(r)=κr。配合边界处梯度非零、局部Lipschitz反馈及闭环向量场局部Lipschitz等条件,解局部存在且唯一,比较原理在最大解区间内给出前向不变性;若要覆盖所有未来时刻,还需前向完备性。固定状态时,控制仿射结构使该约束对 u 线性,可与最小改动的二次目标组合。

存在输入限制时,还须能找到允许的 u 满足约束。变式。 若实际动力学改成 x˙=−2+u、|u|≤1,在边界零处最大导数也只有负一,安全约束不可行;优化器无法制造不存在的控制能力。相对阶高于一时,输入不出现在 h˙ 中,还需要更高阶构造,不能直接照搬本篇一阶公式。

标量过滤器代码

代码只实现半直线积分器的闭式投影,输入当前安全状态、名义输入与正系数,不修改输入;时间和空间均为常数。它不是一般带扰动、采样或执行器限幅系统的安全证书。

Python 3
import math

def cbf_halfline_control(state, nominal=-1.0, kappa=1.0):
    if not all(math.isfinite(v) for v in (state, nominal, kappa)):
        raise ValueError("finite inputs required")
    if state < 0 or kappa <= 0:
        raise ValueError("initial state must be safe and kappa positive")
    return max(nominal, -kappa * state)

print([cbf_halfline_control(x) for x in (2, 1, 0.5, 0)])

结果为 (−1,−1,−1/2,0)。保持安全不等于到达某个目标;例如名义输入为零时,最优输入可一直为零,状态停在安全区域内部。控制李雅普诺夫函数提供目标下降要求,二者能否兼容仍要检查。

参考资料

  1. ↑ Aaron D. Ames、Xiangru Xu、Jessy W. Grizzle、Paulo Tabuada,Control Barrier Function Based Quadratic Programs for Safety Critical Systems (2017),§II-B Zeroing Barrier Functions;§III Control Barrier Functions,IEEE TAC62(8):3861–3876。