开发目的
现有的仿真环境能够实现场景渲染与交通管理,主要关注单车智能。对于自动车辆合作驾驶(CDA)的仿真比较难实现。现有的以全栈自动驾驶软件开发为特征的仿真平台对CDA能力的支持有限。
OpenCDA概述
OpenCDA由三个主要组件组成:(1)仿真工具;(2)基于Python构建的协同自动驾驶系统和(3)场景管理器。
仿真工具
- CALA被选为OpenCDA中的自动驾驶仿真工具之一
Carla利用UE4引擎生成高质量的场景渲染、逼真的物理效果和基本的传感器建模。CALA的特点:
- 定义了一个通用的仿真API,开发人员可以控制仿真的所有元素,从传感器放置到原型制作,以及测试感知、规划和控制算法;
- 可伸缩的体系结构,遵循服务器-多客户端方法。服务器端不断更新环境的物理信息,客户端将由用户通过Carla API进行控制。
但是carla缺乏对大量交通流量的管理性,不能代表真实的交通流量行为,因此引入SUMO。
- SUMO 交通仿真器
SUMO可以使用不同的被广泛接受的驾驶员模型(例如,智能驾驶员模型Intelligent Driver Model)来生成交通流。并且,使用SUMO来获取自然轨迹数据(例如,NGSIM[27]),可以方便的将其作为CDA测试的周围环境。
协同驾驶系统
OpenCDA通过简单的API封装了CALA和SUMO的协同驾驶系统,操作协同驾驶任务。安装在CALA的CAV上的传感器将从模拟环境中收集原始传感信息,并进入系统的感知层。然后,感知模块对接收到的信息进行处理,以感知操作环境,利用规划层传递一系列动作,最后通过执行层产生控制命令。控制指令将被发送回Carla agent,以在每个模拟时间步长执行运动。
注意:这种架构也适用于不需要合作的单车智能开发。这意味着OpenCDA可以模拟由human-driven,connectivity以及automation组成的混合交通流。
自动化车辆之间的协作在应用层被激活。在这一层中,每个CAV将通过V2X堆栈交换状态信息(例如,车辆位置、信号相位和定时)、意图信息(例如,感知到的上下文信息、规划好的车辆轨迹),并寻求就计划达成一致(例如,形成一个platoon)。根据不同的agreements,将会有相应的协议,这些协议可能会修改各层的默认设置。例如,当协作感知应用程序启动时,每个CAV不仅利用自己的原始感知信息来定位动态对象,而且还检索和融合他人的感知信息,以实现多模态、协作的目标检测。
OpenCDA框架的一个关键特性是模块化。
场景管理器
OpenCDA中的场景管理器包含四个部分:场景配置文件、场景初始化器、特殊事件触发器和评估函数。
场景是对世界环境如何随时间变化的描述。在协同驾驶的背景下,它包含世界的静态元素信息(例如,道路拓扑、周围建筑物、路面上的静态对象),以及诸如交通流量、交通信号状态和天气的动态元素的信息。在OpenCDA中,
- 场景的静态元素由Carla地图库中的默认地图或由xdor]和fbx文件构建的自定义地图定义。
- 动态元素由YAML文件控制。在YAML文件中,用户可以定义SUMO产生的每个车道的交通流量,包括交通量和期望速度。如果还引入了Carla产生的后台交通,则还需要记录这些车辆的数量和派生位置以及Carla交通管理员的设置。
OpenCDA框架附带了一个现有的场景数据库,该数据库存储了预定义的场景测试,但欢迎用户将他们的自定义测试贡献到该数据库中。
软件类设计和逻辑流程
OpenCDA三个主要组件之间交互的演示:使用**示例应用程序-车辆队列化控制-**来描述主要的软件类组件以及这些组件之间的仿真信息传输过程。
如上图所示,最基础的类是VehicleManager,它包含适用于单个CAV的全栈CDA和自动驾驶系统(ADS)benchmark软件。类成员PerceptionManager和LocalizationManager负责感知周围环境并定位自车。BehaviorAgent为单个CAV规划驾驶行为(例如,跟车,超车,变道等)。BehaviorAgent中的属性LocalPlanner将使用三次样条线插值和基本车辆运动学生成轨迹:
规划好的轨迹传递给ControlManager以生成油门开度、刹车和转向控制命令。V2X管理器将上述组件生成的数据包(当前被视为无损传输)发送和接收到其他CAV,以用于协作驾驶应用。
上图显示了运行时模拟的逻辑流程。为了运行场景测试,用户需要基于OpenCDA提供的模板来创建YAML文件,以配置CALA服务器的设置(例如,同步模式与异步模式)、交通流的规格(例如,人类驾驶车辆的数量、生成位置)以及每个连接的自动车辆的参数(例如,传感器参数、检测模型选择、目标速度)。然后,场景管理器将加载配置文件,检索必要的参数,并将它们传送到CALA服务器,以确定模拟环境,生成交通流,并为每个CAV创建VehicleManager。