控制障碍函数
控制障碍函数(control barrier function,CBF)把保持安全集合的要求,写成每个状态下控制输入应满足的微分不等式。它不是静态地惩罚“靠近危险”的分数,而是约束系统接下来可以朝哪些方向运动,使安全集合前向不变。
半直线上的安全边界
考虑 ,安全集合 ,取定义函数 。如果沿整个连续时间轨迹都满足 则 ,积分得到 。只要初态在 内,之后就始终非负。这是本例的安全证明,不能用离散动画中几次没越界代替。
与强行要求 相比,该条件允许在内部朝边界靠近,只限制靠近速度;在边界 处,才要求导数不为负。[1]
最少改动名义输入
设名义控制想让系统以 向左移动,取 。每个时刻求 若 ,原输入已经可行,最优仍为负一;若 ,离负一最近的可行值是 。因此安全过滤后的输入为 。
从 出发,前一秒满足 ;到 后切换成 ,因此 它逐渐靠近安全边界,从不穿过。若初值为二分之一,则从一开始就按 演化。
一般控制仿射形式与可行性
对 ,设 局部Lipschitz,令 , 连续可微。常用零化CBF约束为 其中 是在相关区间上局部Lipschitz的扩展类K函数,即严格递增且 ;本篇证明使用 。配合边界处梯度非零、局部Lipschitz反馈及闭环向量场局部Lipschitz等条件,解局部存在且唯一,比较原理在最大解区间内给出前向不变性;若要覆盖所有未来时刻,还需前向完备性。固定状态时,控制仿射结构使该约束对 线性,可与最小改动的二次目标组合。
存在输入限制时,还须能找到允许的 满足约束。变式。 若实际动力学改成 、,在边界零处最大导数也只有负一,安全约束不可行;优化器无法制造不存在的控制能力。相对阶高于一时,输入不出现在 中,还需要更高阶构造,不能直接照搬本篇一阶公式。
标量过滤器代码
代码只实现半直线积分器的闭式投影,输入当前安全状态、名义输入与正系数,不修改输入;时间和空间均为常数。它不是一般带扰动、采样或执行器限幅系统的安全证书。
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)])
结果为 。保持安全不等于到达某个目标;例如名义输入为零时,最优输入可一直为零,状态停在安全区域内部。控制李雅普诺夫函数提供目标下降要求,二者能否兼容仍要检查。
参考资料
- ↑ 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。