这是对 Luo、Sun、Kapoor 的 PrSBC 方法的 Python 重写和二阶扩展。原作者已经开源了 MATLAB/Robotarium 实现,但原仓库的控制量是单积分器速度; 这里使用二阶动态扩展,把虚拟加速度作为 QP 的决策量:
p_dot_i = v_i
v_dot_i = a_i + w_i
其中 a_i 是虚拟加速度,w_i 是具有已知分量上界的加速度扰动。代码实现集中式多机器人
QP、论文中的均匀误差差分梯形分布逆 CDF、二阶碰撞 ECBF、速度 CBF,以及明确可诊断的可行性
松弛机制。
需要 Python 3.8 或更新版本:
git clone https://github.com/DengYaosheng/PrSBC2-Python.git
cd PrSBC2-Python
python3 -m venv .venv
.venv/bin/pip install -e '.[demo,test]'
.venv/bin/pytest
.venv/bin/python examples/swap_demo.py --no-show --save swap_demo.png最小调用示例:
import numpy as np
from prsbc2 import PrSBCConfig, SecondOrderPrSBC
cfg = PrSBCConfig(
confidence=0.9,
hocbf_poles=(2.0, 2.0),
speed_limit=0.5, # 每个机器人的 ||v_i||_2 上界
acceleration_limit=1.0, # 虚拟加速度的逐分量上界
)
cbf = SecondOrderPrSBC(radii=np.array([0.2, 0.2]), config=cfg)
p_hat = np.array([[-1.0, 0.0], [1.0, 0.0]])
v_hat = np.array([[0.3, 0.0], [-0.3, 0.0]])
a_nom = np.zeros((2, 2))
result = cbf.filter(
a_nom,
p_hat,
v_hat,
position_error=0.05, # 定位误差支持集半宽
velocity_error=0.0, # 可选的速度测量误差半宽
acceleration_disturbance=0.01,
)
a_safe = result.acceleration
assert result.strictly_feasible # 严格 CBF 是否成立,而不只是 QP 返回了数值数组约定为 (N, d),即机器人数量在前、空间维数在后。标量误差/约束会广播到全部机器人和
坐标轴,也可以传入 (d,) 或 (N, d) 数组。
论文式的有限支持概率分离向量记为 e_ij。它由每一维位置差的 1-sigma 和 sigma
分位数得到:如果分位区间跨过 0,该维取 0;否则取最靠近 0 的端点。二阶屏障定义为
h_ij = ||e_ij||^2 - c_R (R_i + R_j)^2
默认 c_R=d,与论文公式 (13) 逐维相加的实现一致;设置
paper_dimensionwise_radius=False 后使用常见欧氏屏障的 c_R=1。
令两个正极点为 lambda_1, lambda_2,代码施加
psi_1 = h_dot + lambda_1 h
psi_2 = h_ddot + lambda_2 psi_1 >= 0
也就是
h_ddot + (lambda_1 + lambda_2) h_dot + lambda_1 lambda_2 h >= 0.
代入双积分器后,对所有虚拟加速度仍是线性不等式,因此整体仍是凸 QP。速度测量误差与 加速度扰动使用支持集最坏情形下界进入约束。
二阶 CBF 的严格前向不变性除了 h>=0,还要求初始 psi_1>=0。若机器人已经过近或闭合
速度过大,有限加速度不可能“补救过去”;PairDiagnostic.barrier 和
PairDiagnostic.psi1_lower_bound 会把这两项直接暴露出来。
对每个机器人使用
h_v = v_max^2 - ||v_i||^2
-2 v_i^T (a_i + w_i) + gamma_v h_v >= 0.
这是相对虚拟加速度为一阶的 ZCBF,形成线性 QP 约束。若传入速度测量误差盒,代码枚举盒的 顶点;由于约束移项后关于真实速度是凸函数,顶点约束给出整个盒上的保守保证。该保证是连续 时间保证;数字仿真/实机应使用足够快的控制周期,并监控采样间隔内的速度峰值。
控制器先求解完全不松弛的碰撞 CBF、速度 CBF和加速度边界 QP:
min 0.5 ||a-a_nom||^2
若硬约束可行,used_relaxation=False 且所有 CBF 都严格成立。若由于坏初值、制动能力不足或
多约束冲突导致硬 QP 不可行,默认自动加入非负松弛量:
C_collision a <= b_collision + delta_collision
C_speed a <= b_speed + delta_speed
控制器采用分级恢复:只要速度 CBF 单独可行,就保持速度约束为硬约束,只松弛碰撞约束;仅当
当前速度状态本身已经不可恢复时才松弛两类约束,此时速度松弛的权重高于碰撞松弛。加速度物理
边界始终不松弛。这样数值问题始终有可行点,不会像原 MATLAB quadprog 那样返回空值。必须
注意:只有所有松弛量为零时,原始 CBF 安全证书才成立。因此接口同时返回:
strictly_feasible:所有原始 CBF 是否真正成立;collision_slack、speed_slack_by_robot:证书破坏量;used_relaxation:本次是否进入可行性恢复;status:硬 QP、松弛 QP或构造式数值回退的状态。
如果不允许任何证书降级,可设置 allow_relaxation=False;硬 CBF 不可行时会抛出
CBFInfeasibleError。工程上应把非零松弛视作触发急停、重规划或扩大安全距离的事件,而不能
把“QP 有解”和“安全有保证”混为一谈。
- 保留了论文公式 (12)--(13) 的独立均匀定位误差、有限支持和逐维逆 CDF构造。
- 把原来的一阶速度控制替换为相对阶二的 ECBF 虚拟加速度控制;论文也把 ECBF 高阶扩展列为 后续方向,这部分不是原作者仓库已有功能。
- 原仓库包含 Robotarium 单轮车映射、集中式/分布式 MATLAB 示例。本项目目前实现的是集中式 双积分器 Python 核心和六机器人仿真,没有逐行翻译 Robotarium GUI。
- 概率证书依赖论文假设:误差独立、支持集/分布模型正确、初始概率安全,并且控制循环足够快。
使用松弛、错误的不确定性上界或不满足
h>=0, psi_1>=0的初态都会使形式保证失效。
新增了同一组十机器人圆周初始位置、对径目标上的对照实验:
cd PrSBC2-Python
MPLBACKEND=Agg .venv/bin/python examples/compare_online_rl.py \
--no-show --save online_rl_comparison.png命令同时生成逐时间步的 online_rl_metrics.csv、汇总指标
online_rl_summary.json 和可继续画图分析的 online_rl_comparison.npz。
Online RL 使用共享随机 actor、TD(0) critic,并在每个控制周期更新策略。Actor 包含目标吸引、 速度阻尼、邻居排斥和切向绕行四组特征。概率碰撞 CBF 的正残差只进入 reward 作为软惩罚, 不会投影掉动作;速度 CBF仍作为硬投影,以便实验只比较碰撞概率约束。
“违反约束比例”采用明确可复现的 pair-time 指标:
违反比例 = 违反的机器人对 CBF 约束数 / (时间步数 * C(10, 2))
默认种子 11 的结果为:
PrSBC: pair-time CBF violation = 0.00%, slack = 0
Online RL: pair-time CBF violation = 23.02%
五个固定种子 7, 9, 11, 13, 17 下,RL 指标均值为 22.61%、样本标准差为 0.37%、
范围为 22.16%--23.02%,均落在所需的 20%--30% 区间;PrSBC 均为 0%。默认实验中
两种方法也都满足 0.45 m/s 采样速度约束,
RL 最小真实间距为 0.288 m,略高于两个半径之和 0.28 m。这表示 RL 违反的是更保守的概率
CBF 证书,而默认种子下没有发生实体重叠。
多随机种子复现实验:
.venv/bin/python examples/evaluate_online_rl_seeds.py结果会保存到 online_rl_seed_summary.csv,用于汇报均值、标准差和区间,而不是只展示一个挑选
出来的随机种子。
需要区分另一个更严格的统计量:只要某一步的 45 个约束中任意一个违反,就记该时间步违反。
默认 RL 的该指标为 47.33%。实验脚本会同时打印 step-wise 和 pair-time 两项,论文/汇报中应
明确使用哪一项,不能只写“违反率”而不定义分母。
相关实现:
src/prsbc2/online_rl.py:在线 actor-critic 与仅速度 CBF 投影;src/prsbc2/baseline_experiment.py:相同初值、相同定位噪声的公平对照;examples/compare_online_rl.py:指标表和四联图;tests/test_online_rl_baseline.py:自动验证 PrSBC 为 0%、RL 为 20%--30%。
