跳转至

Real-time Simulation

跟随 Ego 的实时仿真是 LimSim 的基础功能,运行下面的指令,体验一下:

cd LimSim
python ModelExample.py

界面布局

若上述指令运行正常,会显示如下画面:

img

整个图形界面分为五个区域。A 区显示路网的全局视角,黄色圆圈是跟随 Ego 移动的感兴趣区域 (Area of Interest, AoI),即显示 Ego 在整个路网中的实时位置;B 区显示 Ego 的跟随视角,黄色半透明圆圈同样是 AoI,与 A 区中的圆圈是一致的,车辆前方紫色曲线为轨迹规划算法提供的轨迹;C 区为 Ego 的状态显示区,会显示 Ego 的实时速度和加速度。注意 X 轴的坐标,0 点在 x 轴的正中间,表示当前时刻,0 点左半边表示历史的速度和加速度,0 点的右半边表示未来的速度和加速度(即规划算法提供的速度和加速度),此外速度轴的取值范围取决于道路的限速;D 区为仿真信息展示区域,显示仿真的模式,仿真时刻,Ego 所在车道,以及 Ego 在车道上的位置;E 区为场景评价区域,实时显示对场景的评价,每个指标的具体含义请参考 📖场景评价

AoI (Area of Interest)

AoI 可以视为 Ego 的感知区域,是 LimSim 为了进行长时仿真做出的折中方案。长时仿真意味着大范围路网和大量交通流,无法对所有车辆进行轨迹规划。因此,AoI 内部的车辆,其行为由决策-规划模型控制,在 Ego 的周围营造多样且真实的驾驶环境;AoI 外部的车辆,由 SUMO 控制,符合基本的交通规律。

示例分析

该仿真示例具有如下的结构:

from simModel.egoTracking.model import Model
from trafficManager.traffic_manager import TrafficManager

netFile = 'data/networkFiles/CarlaTown05/Town05.net.xml'
rouFile = 'data/networkFiles/CarlaTown05/carlavtypes.rou.xml,data/networkFiles/CarlaTown05/Town05.rou.xml'

if __name__ == '__main__': # (1)
    model = Model(
        egoID = '61', 
        netFile = netFile, 
        rouFile = rouFile, 
        dataBase = 'egoTrackingTest.db'
        )
    model.start()
    planner = TrafficManager(model)

    while not model.tpEnd:
        model.moveStep()
        if model.timeStep % 5 == 0:
            roadgraph, vehicles = model.exportSce()
            if model.tpStart and roadgraph:
                trajectories = planner.plan(
                    model.timeStep * 0.1, roadgraph, vehicles)
                model.setTrajectories(trajectories)
            else:
                model.ego.exitControlMode() # (2)
        model.updateVeh()

    model.destroy()
  1. ⚠ 在 Windows 系统下,请务必保证 model 的相关代码都在 if __name__ == '__main__': 范围内,否则程序会崩溃。主要原因在于 SUMO 使用了 Python 的 multiprocessing 模块,而该模块产生进程的方法,在 Windows 下 和 Linux 下存在不同,详情请参考:contexts-and-start-methods
  2. 如果不再控制 Ego,记得将控制权交还给 SUMO。

程序的第 8 行是模型的初始化,主要的参数有 egoID ,用来指定的 Ego car 的 ID。这里我们使用 SUMO 进行环境交通流的管理,路网中所有车辆的路径信息实际上是被定义在 Town05.rou.xml 中的。因此你可以查看这个文件,选择喜欢的一辆车作为 Ego car,或者你可以参考 🔗自定义车辆和路径来生成特定路径的车辆来进行模型的仿真和算法的测试。然后是仿真使用的路网路网文件 netFile 和路径文件 rouFile ,这些文件的生成和定义请参考 🔗SUMO 的文档dataBase 为记录仿真数据的数据库,字符串类型。

第 15 行是轨迹规划算法的初始化,包括轨迹预测、决策、规划等多个模块。这里使用了 LimSim 实现的基础版本(默认参数),用以控制 AoI 中的车辆,你也可以替换其中任何一个环节为你自己的算法。

17 行开始是程序运行的主要环节,model.tpEnd 是布尔变量,用来表征 Ego 是否到达终点,即程序是否结束。model.moveStep()model.updateVeh() 是仿真更新的流程,前者用于获取所有交通参与者的信息,后者用于更新(控制)所有交通参与者的信息。因此在两者之间,可以用轨迹规划算法控制 AoI 中的车辆。

由于轨迹规划算法通常比较耗时,而且一次规划可以给出未来多帧的轨迹,所以我们可以每 5 帧进行一次轨迹规划,即 if model.timeStep % 5 == 0:。然后,由 roadgraph, vehicles = model.exportSce() 获得当前时刻 Ego 附近的场景。其中,roadgraph 为 Ego 周围的路网信息,vehicles 为 Ego 周围车辆的信息。轨迹规划算法返回的轨迹则通过 model.setTrajectories() 传回仿真中。

上述仿真运行完成后,会将仿真过程中所有的数据存放在 egoTrackingTest.db 中,供回放和分析所用,关于数据库的介绍,可以参考📖数据库