这里我们举一个CBF作者给出的经典示例
我们定义控制输入 u u u 为蓝色车的推力。 p p p 为蓝色车的位置, v v v 为蓝色车的速度, z z z 为蓝色车与黄色车之间的距离, v 0 v_0 v0 为黄色车的速度。我们定义系统的状态为
x = [ p v z ] ∈ R 3 x = \begin{bmatrix} p \\ v \\ z \end{bmatrix} \in \mathbb{R}^3 x= pvz ∈R3
对其求导为
x ˙ = [ v − 1 m F r ( v ) v 0 − v ] + [ 0 1 m 0 ] u \dot x = \begin{bmatrix} v \\ -\frac{1}{m} F_r(v) \\ v_0 - v \end{bmatrix} + \begin{bmatrix} 0 \\ \frac{1}{m} \\ 0 \end{bmatrix} u x˙= v−m1Fr(v)v0−v + 0m10 u
其中 F r ( v ) = f 0 + f 1 v + f 2 v 2 F_r(v) = f_0 + f_1 v + f_2 v^2 Fr(v)=f0+f1v+f2v2 为滚动阻力
为了保证系统安全,对这个系统做出一些约束
输入约束
− m c d g ≤ u ≤ m c a g -m c_d g \le u \le m c_a g −mcdg≤u≤mcag
稳定性目标,其中 v d v_d vd 为期望速度
v → v d v \to v_d v→vd
安全目标,其中 T h T_h Th 为时间前瞻量
z ≥ T h v z \ge T_h v z≥Thv
系统的稳定目标为 v → v d v \to v_d v→vd ,因此系统的原点 x e = [ ⋅ , v d , ⋅ ] T x_e = [\cdot,v_d,\cdot]^T xe=[⋅,vd,⋅]T 。设计李雅普诺夫函数为
V ( x ) = ( v − v d ) 2 V(x) = (v - v_d)^2 V(x)=(v−vd)2
对其求梯度
∇ V ( x ) = [ 0 2 ( v − v d ) 0 ] \nabla V(x) = \begin{bmatrix} 0 \\ 2(v-v_d) \\ 0 \end{bmatrix} ∇V(x)= 02(v−vd)0
那么
L f V ( x ) = − 2 m F r ( v ) ( v − v d ) L g V ( x ) = − 2 m ( v − v d ) \begin{aligned} L_f V(x) &= -\frac{2}{m} F_r(v) (v-v_d) \\ L_g V(x) &= -\frac{2}{m} (v-v_d) \\ \end{aligned} LfV(x)LgV(x)=−m2Fr(v)(v−vd)=−m2(v−vd)
所以CLF约束可以表示为
V ˙ ( x , u ) + λ V ( x ) = L f V ( x ) + L g V ( x ) u + λ V ( x ) = ( v − v d ) { 2 m ( u − F r ) + λ ( v − v d ) } ≤ 0 \dot V(x,u) + \lambda V(x) = L_f V(x) + L_g V(x) u + \lambda V(x) = (v - v_d) \left\{ \frac{2}{m}(u - F_r) + \lambda(v-v_d) \right\} \le 0 V˙(x,u)+λV(x)=LfV(x)+LgV(x)u+λV(x)=(v−vd){m2(u−Fr)+λ(v−vd)}≤0
安全目标为 z ≥ T h v z \ge T_h v z≥Thv ,即两车间距大于一定值
先以直观的方式定义CBF函数 B ( x ) = z − T h v B(x) = z - T_h v B(x)=z−Thv
对其求梯度 ∇ B ( x ) = [ 0 − T h 1 ] \nabla B(x) = \begin{bmatrix} 0 & -T_h & 1 \end{bmatrix} ∇B(x)=[0−Th1]
那么
L f V ( x ) = T h m F r ( v ) + ( v 0 − v ) L g V ( x ) = − T h m \begin{aligned} L_f V(x) &= \frac{T_h}{m} F_r(v) + (v_0 - v) \\ L_g V(x) &= -\frac{T_h}{m} \\ \end{aligned} LfV(x)LgV(x)=mThFr(v)+(v0−v)=−mTh
所以有CBF函数的导数
B ˙ ( x , u ) + γ B ( x ) = T h m ( F r ( v ) − u ) + ( v 0 − v ) − T h m + γ ( z − T h v ) ≥ 0 \dot B(x,u) + \gamma B(x) = \frac{T_h}{m} (F_r(v)-u) + (v_0 - v) - \frac{T_h}{m} + \gamma(z - T_h v) \ge 0 B˙(x,u)+γB(x)=mTh(Fr(v)−u)+(v0−v)−mTh+γ(z−Thv)≥0
如果忽视滚动阻力的影响,并采用最大的控制量 u = − c d m g u = -c_d mg u=−cdmg
B ˙ ( x , u ) + γ B ( x ) = T h c d g + v 0 + γ z − ( 1 + T h γ ) v \dot B(x,u) + \gamma B(x) =T_h c_d g + v_0 + \gamma z - (1+T_h \gamma) v B˙(x,u)+γB(x)=Thcdg+v0+γz−(1+Thγ)v
当 v v v 相对于 T h c d g + v 0 T_h c_d g + v_0 Thcdg+v0 比较大时,那么约束可能不会被满足,即 B ˙ ( x , u ) ≤ 0 \dot B(x,u) \le 0 B˙(x,u)≤0 当 v v v 比较大时。
为了解决这个问题,我们多加一项,多加的这一项其实我们看等式的话,相当于将安全区域范围缩小了,但是能消除一部分 B ( x ) B(x) B(x) 中的多项式
B ( x ) = z − T h v − 1 2 ( v − v 0 ) 2 c d g B(x) = z - T_h v - \frac{1}{2} \frac{(v - v_0)^2}{c_d g} B(x)=z−Thv−21cdg(v−v0)2
对其求导
B ˙ ( x , u ) = 1 m ( T h + v − v 0 c d g ) ( F r ( v ) − u ) + ( v 0 − v ) \dot B(x,u) = \frac{1}{m} (T_h + \frac{v - v_0}{c_d g}) (F_r(v) - u) + (v_0 - v) B˙(x,u)=m1(Th+cdgv−v0)(Fr(v)−u)+(v0−v)
当 $u = -c_d m g $ 时
B ˙ ( x , u ) = 1 m T h F r ( v ) + T h c d g > 0 \dot B(x,u) = \frac{1}{m} T_h F_r(v) + T_h c_d g > 0 B˙(x,u)=m1ThFr(v)+Thcdg>0
所以CBF可以表示为
B ˙ ( x , u ) + γ B ( x ) = 1 m ( T h + v − v 0 c d g ) ( F r ( v ) − u ) + ( v 0 − v ) + γ ( z − T h v ) ≥ 0 \dot B(x,u) + \gamma B(x) = \frac{1}{m} (T_h + \frac{v - v_0}{c_d g}) (F_r(v) - u) + (v_0 - v) + \gamma (z - T_h v) \ge 0 B˙(x,u)+γB(x)=m1(Th+cdgv−v0)(Fr(v)−u)+(v0−v)+γ(z−Thv)≥0
最终,我们得到的是这样一个规划问题
argmin u T H u subject to ( v − v d ) { 2 m ( u − F r ) + λ ( v − v d ) } ≤ 0 1 m ( T h + v − v 0 c d g ) ( F r ( v ) − u ) + ( v 0 − v ) + γ ( z − T h v ) ≥ 0 − m c d g ≤ u ≤ m c a g \begin{aligned} \text{argmin} \ \ &u^T H u \\ \text{subject to} \ \ & (v - v_d) \left\{ \frac{2}{m}(u - F_r) + \lambda(v-v_d) \right\} \le 0 \\ & \frac{1}{m} (T_h + \frac{v - v_0}{c_d g}) (F_r(v) - u) + (v_0 - v) + \gamma (z - T_h v) \ge 0 \\ & -m c_d g \le u \le m c_a g \\ \end{aligned} argmin subject to uTHu(v−vd){m2(u−Fr)+λ(v−vd)}≤0m1(Th+cdgv−v0)(Fr(v)−u)+(v0−v)+γ(z−Thv)≥0−mcdg≤u≤mcag
从上到下分别为CLF约束,CBF约束,控制输入约束。
下一部分我们讲解这里推导的公式怎么用代码实现