RTAEval:评估运行时保证逻辑的框架
1 场景定义与执行
场景由智能体、不安全集、安全和不可信控制器、初始条件以及时间范围 ( T > 0 ) 定义。在时间 ( t \in [0, T] ) 的仿真状态包括智能体状态、不安全集定义和时间 ( t ) 的控制命令。智能体有标识符、状态和一个
step
函数,该函数接收时间 ( t ) 的控制命令并输出时间 ( t + 1 ) 的系统状态。不安全集是系统在场景执行过程中必须避免的状态集合。如果智能体处于不安全集之外,则称其是安全的。安全和不可信控制器为系统计算控制命令,这些命令随后通过 RTA 逻辑进行过滤。初始条件定义了时间 0 的仿真状态。
给定一个具有时间范围 ( T ) 的场景和一个 RTA 逻辑,场景的执行是 ( [0, T] ) 上带时间戳的仿真状态序列。虽然我们将执行定义为离散时间的仿真状态序列,但场景的实际或现实世界执行可能是连续时间的,因此我们只需以预定义的间隔对仿真状态进行采样。我们将执行中仅包含智能体状态序列的部分称为智能体状态轨迹。类似地,将仅包含控制命令序列的部分称为模式轨迹,将仅包含不安全集状态序列的部分称为不安全集状态轨迹。
为了使评估和可视化工作正常进行,执行必须作为字典提供给数据收集,其结构如下:
最高层字典:
- 'agents': 指向包含智能体状态和模式轨迹的字典
- 'unsafe': 指向包含不安全集状态轨迹的字典
第二层字典(对应不同智能体和不安全集):
- 智能体 ID: 指向包含该智能体状态和模式轨迹的字典
- 状态轨迹: 带时间戳的智能体状态列表
- 模式轨迹: 控制命令的顺序列表
- 不安全集 ID: 指向包含该不安全集类型和状态轨迹的字典
- 集类型: 字符串,告知 RTAEval 该不安全集的类型(支持 point、ball、hyperrectangle、polytope)
- 状态轨迹: 带时间戳的集合定义序列
1.1 示例:自适应巡航控制(ACC)场景
考虑一个自适应巡航控制场景,智能体状态 ( x = [p, v]^T ),其动力学方程为:
[
f(x, m) =
\begin{bmatrix}
0 & 1 \
0 & 0
\end{bmatrix}
x +
\begin{bmatrix}
0 \
1
\end{bmatrix}
a(x, m)
]
其中,当 ( m = S ) 时,( a(x, m) = g_S(x) );当 ( m = U ) 时,( a(x, m) = g_U(x) )。智能体尝试以距离 ( d > 0 ) 跟随以恒定速度 ( \bar{v} ) 行驶的领导者。领导者在时间 ( t ) 的位置为 ( p_L(t) )。不可信控制器 ( g_U ) 和安全控制器 ( g_S ) 分别为:
[
g_S(x) = k_1((p_L(t) - d) - p) + k_2(\bar{v} - v)
]
[
g_U(x) =
\begin{cases}
a_{max} & (p_L(t) - p) > d \
-a_{max} & \text{else}
\end{cases}
]
其中 ( k_1 > 0 ),( k_2 > 0 )。
step
函数是不可信控制器、安全控制器和系统动力学函数的组合。
当 ( |p_L(t) - p(t)| \leq c )(( c < d ))时,智能体与领导者发生碰撞。存在一个以领导者智能体为中心的不安全集,定义为 ( O = {[p, v, t]^T \in X \times \mathbb{R}
{\geq 0} | |p_L(t) - p| \leq c} )。
updateDef
函数接收模拟器的当前状态并创建以领导者为中心的不安全集。该场景的初始条件为初始智能体状态 ( x_0 )、初始领导者状态 ( x
{L0} ) 和时间范围 ( T > 0 )。
以下是该场景在低代码框架中的部分代码:
# 比例控制器
def P(self, time_step):
xrel = self.goal_state[0] - self.state_hist[-1][0]
vrel = self.goal_state[1] - self.state_hist[-1][1]
return self.Kp[0] * xrel + self.Kp[1] * vrel
# Bang-bang 控制器
def BangBang1D(self, time_step):
x_err_curr = self.goal_state[0] - self.state_hist[-1][0]
v_err_curr = self.goal_state[1] - self.state_hist[-1][1]
return np.sign(x_err_curr) * self.a_max
# 步骤函数
def step(self, mode, initialCondition, time_step, simulatorState):
self.goal_state = self.desired_traj(simulatorState)
if mode == 'SAFETY':
self.control = self.P
elif mode == 'UNTRUSTED':
self.control = self.BangBang1D
else:
self.control = self.no_control()
a_curr = self.control(time_step)
if abs(a_curr) > self.a_max:
a_curr = np.sign(a_curr) * self.a_max
x_next = initialCondition[0] + initialCondition[1] * time_step
v_next = initialCondition[1] + a_curr * time_step
if abs(v_next) >= self.v_max:
v_next = np.sign(v_next) * self.v_max
return [x_next, v_next]
2 RTA 逻辑
提供了一个 RTA 基类,用户必须提供要评估的 RTA 逻辑。该逻辑接收观察到的状态并输出供工厂使用的控制命令。观察到的状态信息必须以特定格式提供,以便进行数据收集、评估和可视化。
RTA 基类如下:
import abc
import time
class baseRTA(abc.ABC):
def __init__(self):
self.do_eval = False # 不自动设置 RTAEval
pass
@abc.abstractmethod
def RTALogic(self, simulationTrace: dict) -> Enum:
# 用户提供的 RTA 切换逻辑
pass
def RTASwitch(self, simulationTrace: dict) -> Enum:
start_time = time.time()
rtaMode = self.RTALogic(simulationTrace)
running_time = time.time() - start_time
if self.do_eval:
self.eval.collect_computation_time(running_time)
self.eval.collect_trace(simulationTrace)
return rtaMode
def setupEval(self):
# 继承 baseRTA 时添加此方法到 __init__ 以包含评估
self.do_eval = True
self.eval = RTAEval()
2.1 示例:简单的 RTA 切换逻辑
以下是一个基于仿真的切换逻辑示例,用于上述自适应巡航控制场景:
def RTALogic(simulationTrace):
predictedTraj = simulate_forward(simulationTrace)
egoTrace = predictedTraj['agents'][egoAgent.id]['state_trace']
for unsafeSet in self.unsafeSets:
unsafeSetTrace = predictedTraj['unsafe'][unsafeSet.id]['state_trace']
for i in range(len(unsafeSetTrace)):
egoPos = egoTrace[i][1]
unsafeSetDef = unsafeSetTrace[i][1]
pos_max = unsafeSetDef[0][0] - unsafeSetDef[1]
if egoPos > pos_max:
return egoModes.SAFETY
return egoModes.UNTRUSTED
创建
RTALogic
后,将其添加到一个新类
accSimRTA
中,并使用它为
egoAgent1
创建一个 RTA 对象
egoRTA
。然后可以将相关代码修改为
RTAs = [egoRTA, None]
,将
egoRTA
与
egoAgent1
关联,每次
egoAgent1
的状态更新时运行 RTA 切换逻辑。
3 数据收集、评估和可视化
RTAEval 提供了数据收集、评估和可视化工具,这是一个具有一些收集函数和后处理函数的类。要使用提供的数据收集和评估功能,用户在创建 RTA 对象时必须添加
self.setupEval()
行。
数据收集通过
collect_trace
和
collect_computation_times
函数进行。
collect_trace
收集仿真轨迹,
collect_computation_times
收集 RTA 模块计算切换所需的时间。收集的数据存储为特定格式的字典。
评估 RTA 在场景中的性能的主要指标如下:
| 指标 | 描述 |
| ---- | ---- |
| 计算时间 | RTASwitch 每次调用的运行时间,提供平均、最小和最大切换计算时间 |
| 距不安全集的距离 | 自我智能体与不安全集之间的距离,也允许用户查找与场景中其他智能体的距离 |
| 碰撞时间(TTC) | 如果智能体不改变当前轨迹,自我智能体与其他智能体发生碰撞的时间 |
| 控制器使用百分比 | 每个控制器在场景过程中使用的时间比例 |
| 切换次数 | 场景中发生切换的次数 |
可以通过运行
eval.summary()
快速获得 RTA 在场景中的性能摘要。
3.1 示例场景评估
评估两种不同的决策模块逻辑:SimRTA 和 ReachRTA。在 1、2 和 3 维场景中,使用不同数量的智能体进行评估,场景描述如下表:
| 场景 | 工作空间维度 | 不可信控制器 | 安全控制器 | 不安全集 | 可视化 | 场景长度 |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| ACC | 1 | 示例 1 中的 Bang-bang 控制器 | 示例 1 中的 PID 控制器 | 以领导者为中心的球 | 图 3 | 10 s |
| Dubins | 2 | Dubin’s 汽车的 PID 带加速度控制器 | PID 带减速度控制器 | 领导者(球)和建筑物(矩形) | 图 8 | 20 s |
| GCAS | 3 | Dubin’s 飞机的 PID 带加速度控制器 | PID 带减速度和上仰控制器 | 领导者(球)和地面(多面体) | 图 8 | 40 s |
运行时间如下表所示:
| 场景 | 智能体数量 | SimRTA - 执行时间 (s) | SimRTA - RTA 计算时间 (ms) | SimRTA - % RTA 计算 | SimRTA - 评估时间 (s) | ReachRTA - 执行时间 (s) | ReachRTA - RTA 计算时间 (ms) | ReachRTA - % RTA 计算 | ReachRTA - 评估时间 (s) |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| ACC | 1 | 18.49e - 3 | 0.07 | 76.63 | 7.27e - 3 | 0.35 | 1.71 | 97.89 | 8.22e - 3 |
| ACC | 2 | 50.08e - 3 | 0.10 | 84.12 | 18.16e - 3 | 1.12 | 2.76 | 98.66 | 17.96e - 3 |
| ACC | 5 | 0.18 | 0.16 | 90.47 | 87.96e - 3 | 6.01 | 5.96 | 99.10 | 0.10 |
| Dubins | 1 | 2.32 | 4.99 | 86.06 | 32.88e - 3 | 15.18 | 37.10 | 97.76 | 34.15e - 3 |
| Dubins | 3 | 15.30 | 11.84 | 92.89 | 0.18 | 71.60 | 58.83 | 98.60 | 0.11 |
| Dubins | 10 | 203.87 | 49.77 | 97.65 | 0.70 | 461.71 | 114.08 | 98.83 | 0.76 |
| GCAS | 1 | 5.85 | 6.08 | 83.12 | 30.62 | 39.28 | 47.65 | 97.02 | 31.423 |
| GCAS | 1 | 45.27 | 17.84 | 94.60 | 83.61 | 174.00 | 71.11 | 98.07 | 98.10 |
RTA 性能摘要以文本文件形式给出,可以轻松创建可视化,除了计算时间、距不安全集的距离、距其他智能体的距离和控制器使用情况外,还报告了与不安全集和其他智能体的最小碰撞时间(TTC)。摘要信息的保存方式允许用户随时提取场景的快照,有助于快速原型化 RTA 技术和逻辑。
4 总结
RTAEval 是一套基于 Python 的工具,用于评估不同的运行时保证(RTA)逻辑。不同的 RTA 切换逻辑可以在 RTAEval 中快速编码,并在各种示例中展示了其在快速原型化 RTA 逻辑方面的功能。RTAEval 可用于多智能体场景和具有感知模型的场景。未来可以考虑将 RTAEval 的功能扩展到过滤方法(如 ASIF)和涉及基于接近度通信影响的场景。
5 关键流程总结
为了更清晰地理解 RTAEval 的使用流程,下面通过 mermaid 流程图展示主要步骤:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(定义场景):::process
B --> C(设置 RTA 逻辑):::process
C --> D(创建 RTA 对象并设置评估):::process
D --> E(执行场景并进行数据收集):::process
E --> F{是否完成场景执行}:::decision
F -->|否| E
F -->|是| G(评估 RTA 性能):::process
G --> H(可视化结果):::process
H --> I([结束]):::startend
5.1 详细操作步骤
-
定义场景
- 确定智能体、不安全集、安全和不可信控制器、初始条件以及时间范围 ( T > 0 )。
- 例如在自适应巡航控制(ACC)场景中,明确智能体状态、动力学方程、控制器形式以及不安全集的定义。
-
设置 RTA 逻辑
-
继承 RTA 基类,实现
RTALogic函数。 - 如示例中的基于仿真的切换逻辑,通过预测轨迹判断是否进入不安全集来决定使用安全控制器还是不可信控制器。
-
继承 RTA 基类,实现
-
创建 RTA 对象并设置评估
-
创建 RTA 对象时,调用
self.setupEval()方法开启评估功能。 - 确保观察到的状态信息以正确格式提供给 RTA 逻辑。
-
创建 RTA 对象时,调用
-
执行场景并进行数据收集
-
场景执行过程中,通过
collect_trace收集仿真轨迹,collect_computation_times收集 RTA 模块计算切换所需的时间。 - 数据存储为特定格式的字典,方便后续评估。
-
场景执行过程中,通过
-
评估 RTA 性能
-
运行
eval.summary()方法,获取 RTA 在场景中的性能摘要。 - 关注计算时间、距不安全集的距离、碰撞时间(TTC)、控制器使用百分比和切换次数等指标。
-
运行
-
可视化结果
- 根据性能摘要生成可视化图表,如控制器使用情况、距其他智能体和不安全集的距离等。
- 摘要信息的保存方式允许用户随时提取场景的快照,便于分析问题。
6 性能分析
通过对不同场景和不同数量智能体的评估结果进行分析,可以得到以下结论:
6.1 计算时间方面
- RTA 逻辑的计算时间在场景执行时间中占比较大,尤其是在智能体数量增加或使用复杂逻辑(如 ReachRTA)时。
- 例如在 Dubins 场景中,当智能体数量从 1 增加到 10 时,SimRTA 和 ReachRTA 的执行时间和 RTA 计算时间都显著增加。
6.2 评估时间方面
- 评估时间受不安全集的集类型影响较大,如 GCAS 场景中的多面体不安全集导致评估时间明显增加。
- 同时,智能体数量的增加也会对评估时间产生一定影响。
6.3 控制器使用方面
- 不同的 RTA 逻辑会影响控制器的使用百分比,根据预测轨迹是否进入不安全集来决定使用安全控制器还是不可信控制器。
- 例如在示例的简单 RTA 切换逻辑中,如果预测轨迹进入不安全集,则使用安全控制器,否则使用不可信控制器。
7 应用建议
7.1 场景选择
- 对于简单场景和对计算时间要求较高的情况,可以优先考虑使用 SimRTA 逻辑。
- 对于需要更全面考虑可能轨迹的场景,可以选择 ReachRTA 逻辑,但要注意其计算时间可能较长。
7.2 优化策略
- 当智能体数量较多或不安全集类型复杂时,可以考虑优化 RTA 逻辑或采用并行计算等方法来减少计算时间和评估时间。
- 例如在数据收集过程中,可以采用增量式收集或抽样收集的方式,减少数据量,提高评估效率。
7.3 可视化分析
- 利用可视化结果,如控制器使用情况、距不安全集和其他智能体的距离等图表,深入分析 RTA 的性能。
- 通过观察最小碰撞时间(TTC)等指标,提前发现潜在的安全问题,优化 RTA 逻辑。
8 总结与展望
RTAEval 为评估运行时保证逻辑提供了一个强大的工具,通过快速编码不同的 RTA 切换逻辑,并在多智能体场景和具有感知模型的场景中进行评估和可视化,能够帮助开发者快速原型化 RTA 技术和逻辑。
未来,我们可以从以下几个方面进一步完善 RTAEval:
-
功能扩展
:将功能扩展到过滤方法(如 ASIF)和涉及基于接近度通信影响的场景。
-
性能优化
:研究更高效的算法和数据结构,减少计算时间和评估时间,提高工具的可扩展性。
-
用户体验
:提供更友好的用户界面和文档,方便用户使用和理解 RTAEval 的功能。
通过不断改进和扩展,RTAEval 将在运行时保证逻辑的评估和开发中发挥更大的作用。
超级会员免费看
29

被折叠的 条评论
为什么被折叠?



