37、RTAEval:评估运行时保证逻辑的框架

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 详细操作步骤

  1. 定义场景
    • 确定智能体、不安全集、安全和不可信控制器、初始条件以及时间范围 ( T > 0 )。
    • 例如在自适应巡航控制(ACC)场景中,明确智能体状态、动力学方程、控制器形式以及不安全集的定义。
  2. 设置 RTA 逻辑
    • 继承 RTA 基类,实现 RTALogic 函数。
    • 如示例中的基于仿真的切换逻辑,通过预测轨迹判断是否进入不安全集来决定使用安全控制器还是不可信控制器。
  3. 创建 RTA 对象并设置评估
    • 创建 RTA 对象时,调用 self.setupEval() 方法开启评估功能。
    • 确保观察到的状态信息以正确格式提供给 RTA 逻辑。
  4. 执行场景并进行数据收集
    • 场景执行过程中,通过 collect_trace 收集仿真轨迹, collect_computation_times 收集 RTA 模块计算切换所需的时间。
    • 数据存储为特定格式的字典,方便后续评估。
  5. 评估 RTA 性能
    • 运行 eval.summary() 方法,获取 RTA 在场景中的性能摘要。
    • 关注计算时间、距不安全集的距离、碰撞时间(TTC)、控制器使用百分比和切换次数等指标。
  6. 可视化结果
    • 根据性能摘要生成可视化图表,如控制器使用情况、距其他智能体和不安全集的距离等。
    • 摘要信息的保存方式允许用户随时提取场景的快照,便于分析问题。

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 将在运行时保证逻辑的评估和开发中发挥更大的作用。

在数字化进程中,人工智能技术日益成为科技革新的关键驱动力,其中强化学习作为机器学习的重要分支,在解决复杂控制任务方面展现出显著潜力。本文聚焦于深度确定性策略梯度(DDPG)方法在移动机器人自主导航领域的应用研究。该算法通过构建双神经网络架构,有效克服了传统Q-learning在连续动作空间中的局限性,为高维环境下的决策问题提供了创新解决方案。 DDPG算法的核心架构包含策略网络与价值评估网络两大组件。策略网络负责根据环境状态生成连续动作指令,通过梯度上升方法不断优化策略以获取最大长期回报;价值评估网络则采用深度神经网络对状态-动作对的期望累积奖励进行量化估计,为策略优化提供方向性指导。这种双网络协作机制确保了算法在复杂环境中的决策精度。 为提升算法稳定性,DDPG引入了多项关键技术:经验回放机制通过建立数据缓冲区存储历史交互记录,采用随机采样方式打破样本间的序关联性;目标网络系统通过参数软更新策略,以θ_target = τ·θ_current + (1-τ)·θ_target的更新方式确保训练过程的平稳性;探索噪声注入技术则通过在动作输出中添加随机扰动,维持了策略探索与利用的平衡。 在具体实施过程中,研究需依次完成以下关键步骤:首先建立符合马尔科夫决策过程的环境模型,精确描述机器人的运动学特性与环境动力学;随后设计深度神经网络结构,确定各层神经元数量、激活函数类型及参数优化算法;接着进行超参数配置,包括学习速率、批量采样规模、目标网络更新系数等关键数值的设定;最后构建完整的训练验证流程,通过周期性测试评估导航成功率、路径规划效率、障碍规避能力等核心指标。 该研究方法不仅为移动机器人自主导航提供了可靠的技术方案,其算法框架还可扩展应用于工业自动化、智能交通等需要精密控制的领域,具有重要的工程实践价值与理论借鉴意义。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值