Skip to content

Repository files navigation

PrSBC2:二阶多机器人概率安全屏障证书

这是对 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) 数组。

二阶碰撞 CBF

论文式的有限支持概率分离向量记为 e_ij。它由每一维位置差的 1-sigmasigma 分位数得到:如果分位区间跨过 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.barrierPairDiagnostic.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 约束。若传入速度测量误差盒,代码枚举盒的 顶点;由于约束移项后关于真实速度是凸函数,顶点约束给出整个盒上的保守保证。该保证是连续 时间保证;数字仿真/实机应使用足够快的控制周期,并监控采样间隔内的速度峰值。

为什么 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_slackspeed_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 的初态都会使形式保证失效。

十机器人 Online RL baseline

新增了同一组十机器人圆周初始位置、对径目标上的对照实验:

cd PrSBC2-Python
MPLBACKEND=Agg .venv/bin/python examples/compare_online_rl.py \
  --no-show --save online_rl_comparison.png

PrSBC 与 Online RL 十机器人对比

命令同时生成逐时间步的 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%。

About

Second-order probabilistic safety barrier certificates with a ten-robot online RL baseline

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages