一、前言
所谓框架,是组成元素和元素组装顺序,这两部分组成。
另外,框架一词还是有“共性,普适性”的意思。也就是说,只有大家都想到一块去了,基本上大家都认可,才可以称为框架。
所以读通一个框架,可以起到举一反三的效果,别的框架即使有差异也不会太大。
本文选取limsim++框架作为基干蓝图,描述最新的端到端自动驾驶仿真框架,特别是结合了chatGPT类大语言模型的仿真框架。
LimSim++ 是专为自动驾驶领域中的多模态大型语言模型((m) llms)设计的闭环仿真平台,由上海人工智能实验室和浙江大学的研究人员联合开发。其名中的 “LimSim” 源于 “长期(long-term)、交互式(interactive)、多场景(multi-scenario)交通仿真器(simulator)”,“++” 表示它是 LimSim 的扩展升级版本。

图 端到端自动驾驶仿真框架的抽象层次组成元素,图片来自《LimSim++: A Closed-Loop Platform for Deploying Multimodal LLMs in Autonomous Driving》一文
其中闭环仿真是指仿真中系统的输出会反馈到输入端,形成一个闭合回路。它模拟真实系统运行时各环节相互作用、相互影响的动态过程。比如在自动驾驶汽车的闭环仿真中,汽车行驶状态(输出)会反馈到控制系统(输入),控制系统据此调整决策,再影响汽车行驶,如此循环,以测试自动驾驶算法等在近似真实场景下的性能与可靠性。
下面,我们按照组成元素和组成元素的组装顺序来介绍一般框架。
二、框架的基本组成元素
1、环境(包含agent)
环境包括道路,花坛马路牙子等等和交通信号。agent是环境的一部分,也被称为dynamic动态,代表各类能动会动的东西,包括自车ego car,其他车,行人等等。
具体的,环境与agent的仿真,特别是自车的仿真,是通过Carla+SUMO联合仿真来实现的。
CARLA 是由西班牙巴塞罗那自治大学计算机视觉中心指导开发的开源仿真模拟器,主要用于自动驾驶系统的开发、训练与验证。基于 Unreal Engine 虚幻引擎运行仿真,能够提供高渲染的三维模型,呈现出逼真的城市环境。使用 OpenDRIVE(目前为 1.4)高精地图来定义道路和城市设置,可精确描述道路的几何形状、车道信息、交通标志和信号灯等。
简单说,如果你用编程语言加算法来控制Carla里面的车辆(自车),它就是单车驾驶仿真;如果你用鼠标键盘控制Carla里面的车辆(自车),它就是一款极品飞车3D游戏。在 Carla 中,启动模拟器后,运行相关的 Python 脚本,如manual_control.py,会打开一个窗口,通常可以使用键盘上的 W、A、S、D 键或方向键来控制车辆的前进、后退、左转和右转等操作。例如,按下 W 键或上方向键可使车辆加速前进,按下 S 键或下方向键可使车辆减速或后退,按下 A 键或左方向键可使车辆向左转向,按下 D 键或右方向键可使车辆向右转向,还可以按下空格键来启用手刹。同时,鼠标可用于变换视角,方便观察车辆周围的环境。

图 Carla驾驶界面,图片来自网络
所以在笔者带领的团队,是允许玩Carla休闲一下的。
Carla的缺点是主要是以自车ego为主,不适合仿真大量其他车辆,也就是所谓交通流。所以联合SUMO来模拟自车在交通流穿行。
SUMO并不是相扑的意思,虽然相扑的英语单词是SUMO。它是 Simulation of Urban Mobility 的缩写,意为城市交通仿真,是一款开源的交通模拟软件包,主要用于模拟和分析城市交通网络中的交通流动情况。
SUMO 能依据现实世界的道路、交叉口、车辆等元素,构建出精确的交通网络模型。它支持多种地图格式,可导入地理信息系统(GIS)数据,快速搭建交通网络。同时,SUMO 提供用户友好的图形界面,方便用户编辑和修改交通网络,如添加、删除、调整道路、交叉口及车道等元素,以契合真实道路布局。在车辆生成与行为建模方面,SUMO 可生成大量车辆,并为每辆车设定特定行为模型,支持多种车辆类型与行驶规则,像车辆的最大速度、跟车距离等,这些行为模型还能依据实际情况调整,使交通流量模拟更精准。

图 SUMO示意图,图片来自网络
SUMO 采用微观仿真方法,通过模拟每辆车的行为与交互,展现整个交通系统的运行状况,进而提供详细的交通流量统计数据,例如车辆速度、拥堵状况、平均行驶时间等。这些数据在交通优化和规划领域用途广泛,如信号优化、路径规划等。
它提供了完善的 Python 接口 Traffic Control Interface(TraCI)。通过与仿真进程通讯,TraCI 可以获取仿真主体的所有信息并在线调控,以控制仿真内个体的行为。
联合仿真
CARLA 与 SUMO 在仿真结构上均采用客户端 - 服务器的框架,这为两者的联合仿真创造了条件。通过构建桥接器,可将 SUMO 和 CARLA 中不同格式的信息进行匹配,包括车辆类型、车辆位置信息、基础设施信息等。
实现方式:基于桥接器,SUMO 生成的背景车流可以在 CARLA 的环境中产生实时同步的映射车辆,而 CARLA 中接入的自动驾驶等控制算法产生的反馈,也会在二维场景中进行同步。在联合仿真前,需要确定 Carla 和 SUMO 中车辆类型的映射关系,即基于 Carla 中车辆的 blueprint 来生成 SUMO 中的 vType。
联合使用 SUMO 和 Carla 可以实现更加细致和真实的交通仿真。通过将 SUMO 生成的交通流量导入到 Carla 中,可以在 Carla 的场景中模拟真实的城市交通环境,并测试自动驾驶系统在不同交通条件下的性能。
所谓桥接器,是一段沟通Carla和sumo的程序,比如以下python代码:
import carla
import traci
import time
# 连接到CARLA服务器
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
world = client.get_world()
# 启动SUMO
sumo_binary = "sumo-gui" # 如果不需要GUI,可以使用 "sumo"
sumo_config = "sumo_config.sumocfg"
traci.start([sumo_binary, "-c", sumo_config])
# 桥接循环
try:
while True:
# 同步SUMO时间步
traci.simulationStep()
# 获取SUMO中的车辆信息
sumo_vehicles = traci.vehicle.getIDList()
for vehicle_id in sumo_vehicles:
position = traci.vehicle.getPosition(vehicle_id)
angle = traci.vehicle.getAngle(vehicle_id)
# 这里可以将SUMO中的车辆信息同步到CARLA中
# 根据CARLA的API进行车辆创建和位置更新
# 同步CARLA时间步
world.tick()
time.sleep(0.1)
except KeyboardInterrupt:
print('Interrupted by user.')
finally:
# 关闭连接
traci.close()
2、多模态数据映射器
在端到端自动驾驶仿真中,输入的数据是多模态的,比如激光雷达、视频,文本(驾驶员的口头指令),还有一些系统信息等等。
需要把这些多模态数据映射到决策器接受的向量空间里面。
这个映射动作一般被称为align对齐。
完成“对齐”动作的元素叫做projector,被翻译成映射器或者投影仪。
每一种模态的数据都有一个projector。
映射器一般是一个小型的神经网络,可以训练来确定最佳的参数θ,从而确定最佳映射方式。
比如在《OpenDriveVLA:迈向基于大型视觉语言动作模型的端到端自动驾驶》一文中,把环境和agent信息映射到语言空间的projector映射器都是有两层的MLP多层感知机,激活函数是高斯误差线性单元(GeLU),都是极为小型的神经网络。
而在limsim++这篇文章中,用tool library笼统地涵盖了projector,意思是读者自己根据需要建立自己的projector,把多模态数据对齐到统一的向量空间。“The scenario description of LimSim++ is modular, providing real-time status, navigation information,and task descriptions. Users can freely combine scenario information based on the needs of the driver agent and package it into suitable prompts. Besides the information provided by LimSim++, users can define their tool library, allowing (M)LLM to obtain more custom information by invoking tools and assisting the driver agent in making decisions.”
3、决策器
决策器一般是一个大语言模型(包括VLM视觉语言模型,MLLM多模态语言模型),可以是开源模型,也可以像理想VLA一样自己从头训练,如果财力允许的话。
因为映射器已经把不同模态的数据对齐到语言空间,所以可以被大语言模型来处理。

图 匝道和十字路路口驾驶举例,图片来自《LimSim++: A Closed-Loop Platform for Deploying Multimodal LLMs in Autonomous Driving》一文
从图中可以看到,对环境的语言描述,司机指令,以及BEV环境,不同模态的数据,都对齐到语言空间,决策器(比如LimSim++用的chatGPT4)对用户给出加速或者减速(行为基元)的回应。
4、语言指令转换成控车指令
需要把语言指令变成控车指令。
比如,LimSim++ 将语言输出变成控车指令主要通过以下方式:
行为基元转换:如果驾驶员智体输出的是行为基元,如加速、减速、左转、右转等,LimSim++ 为这些基元提供控制接口,将其转换为车辆轨迹,从而实现对车辆的控制。
直接轨迹控制:LimSim++ 支持直接利用驾驶员智体输出的轨迹来控制车辆运动。这种方式对(M)LLM 的性能要求较高,需要(M)LLM 能够准确输出车辆的行驶轨迹信息,平台接收到轨迹信息后,会将其转化为具体的控车指令,控制车辆按照预定轨迹行驶。
《LimSim++: A Closed-Loop Platform for Deploying Multimodal LLMs in Autonomous Driving》一文相关的原始描述如下:
LimSim++ can handle various control signals derived from decision-making outcomes. If the driver agent provides only behavioral primitives, such as acceleration, deceleration, left turn, right turn, etc., LimSim++ offers control interfaces for these primitives, facilitating the conversion of the driver agent’s decisions into vehicle trajectories. Furthermore, LimSim++ supports direct utilization of trajectories output by the driver agent to control vehicle motion, albeit with increased performance requirements on (M)LLMs.
这个转换可以自定义,也可以依靠仿真工具:
比如CARLA 能接受轨迹后自己生成控车指令,主要通过其内部的一些模块和机制来实现,具体如下:
交通管理器(Traffic Manager):CARLA 中的交通管理器负责控制模拟中的车辆。它基于客户端架构,取代了服务器端的自动驾驶功能。其执行流程分为多个阶段,每个阶段在不同的线程上运行,通过同步消息进行通信。定位阶段:交通管理器将地图简化为路点网格,为每辆车创建一条由路点组成的近期行驶路径,并存储在路径缓冲区和车辆跟踪组件(PBVT)中,以便后续阶段访问和修改。
运动规划阶段:一旦路径确定,该阶段会使用 PID 控制器计算车辆的运动,以确定如何达到目标值,并将运动转换为实际的 CARLA 控车指令,例如油门、刹车、转向等指令,从而控制车辆沿着给定的轨迹行驶。
自定义控制逻辑:用户也可以通过 CARLA 提供的 API 自定义控制逻辑来实现接受轨迹后生成控车指令。例如,结合车辆当前的位置、速度和轨迹信息,利用运动规划算法和控制理论,计算出合适的控制信号来驱动车辆。常见的方法包括使用 PID 控制器、模型预测控制(MPC)等。以 PID 控制器为例,它可以根据车辆当前状态与轨迹上目标点的差异,计算出需要调整的油门、刹车和转向量,使车辆逐渐接近并跟踪给定的轨迹。
此外,CARLA 还可以与其他外部系统或算法集成,进一步扩展其功能,以更好地处理轨迹输入并生成精确的控车指令,满足不同的自动驾驶场景和需求。例如,与 ROS(机器人操作系统)集成后,可以利用 ROS 丰富的生态系统和各种算法来进行轨迹规划和车辆控制。
5、评价
输出转化为一系列控车指令(最终表示为一条带有速度和加速度信息的轨迹)后,该如何评价这一系列操控好不好呢?也就是需要量化 driving performance。
所以还需要一个基本元素,评价器。
其实评价器的定义的自由度相当高,关键看用户需求。比如某一仿真视为了最优化油耗,这在商用车重卡货运的仿真中很常见,那么轨迹油耗就是一个重要指标。
不失一般性的,本文还是用limsim+的driving performance来做说明,读者可以根据自身需要增减评价指标。
the driving performance comprehensively considers route completion R and driving score S. limsim++的驾驶性能就两个,路径完成度和驾驶得分,其中驾驶得分是多项指标的加权和。
The route completion R indicates the ratio of completed route length to total length.
完成度自然是实际跑完的轨迹长度占规划的总长度的比例。
而驾驶得分表达如下:

用α、β和γ这三个惩罚乘数项分别表示碰撞、信号违规和超速违规。λ1、λ2和λ3表示整个轨迹中三种受罚行为的发生次数。k1、k2和k3是每次决策中轨迹质量评估的加权系数,涵盖乘坐舒适性(表示为rc)、驾驶效率(表示为re)和驾驶安全性(表示为rs)。
可以说驾驶得分的设计,精髓就在于如何把尽可能多的因素融合进一个单一函数。
5、持续学习闭环:记忆与反思
基本上任何端到端自动驾驶仿真平台都会实现持续学习的闭环。
评估模块会基于对车辆轨迹的分析来量化和评估驾驶员智体做出的车辆行为决策。对于得分高的决策,会直接集成到记忆模块中;对于得分较低的决策,通常在人类专家帮助下,提示(M)LLM 进行自我反思或纠错,细化的推理结果再集成到记忆模块中。当驾驶员智体遇到类似场景时,记忆模块中的信息可作为少样本实例帮助(M)LLM 决策,从而不断优化决策能力,形成一个从评估、反思、记忆到改进决策的持续学习闭环。
这里所谓的记忆,一般是一个向量数据库,因为在机器学习中,几乎所有的信息都是向量表示。向量数据库作为记忆,来存储过往场景和对应的优质操作(控车指令,轨迹等等)。

图 向量数据库的工作过程,图片来自网络
至于所谓反思reflection,其实是重生成。如果某个场景下的驾驶决策和规划不够好,也就是评价器给出的得分低于阈值,那就为这个场景重新生成新的决策规划。
而这个重新生成过程,是允许人类专家参与的。最简单的参与方式,就是为这个场景微调提示词,用新的提示词帮助作为决策器的LLM给出更优的回答。
三、基本元素组合成框架

图 limsim++的框架图,图片来自《LimSim++: A Closed-Loop Platform for Deploying M
ultimodal LLMs in Autonomous Driving》一文
本文使用limsim++的框架示意图,是因为其具有代表性。即使读者自己从头设计一套端到端自动驾驶仿真架构,其实结果也不会有太大的差异。
把第三部分介绍的基本元素串起来,整体框架如下:
1、Carla仿真单车,SUMO仿真交通流,通过桥接器同步二者的数据
2、用projector映射器,把视觉信息,场景信息(比如会车,比如变道等等),和任务描述(司机指令),映射到(对齐)语言模型的向量空间。
3、场景和指令输入后,首先是从记忆中寻找相似场景,取出对应的输出(相当于抄答案);如果没有,才调用决策器MLLM多模态大语言模型重新生成答案(可以是行为基元,比如加速减速左转右转等等,也可以是一系列航点)。
4、把行为基元或者航点表示的轨迹,一方面反馈给Carla+SUMO联合仿真系统,读取下一步的视觉信息和场景变化;另一方面保存到算例记录系统case log system。
请注意到,算例记录系统记录的是,scenario information场景信息和trajectory轨迹的问题-答案对(pair)。每一对这样的pair,就是一个算例。
5、算例库的算例会发给评估器评估,比较好的的放进memory记忆当中,不好的则进行重生成,也就是reflection反思,相当于改错题错题本,再放入记忆中。
需要说明的是,可能是为了避免绘图太过复杂,Limsim++一文直接把反思后的算例,以知识knowledge的名义放进了memory记忆中。
这当然是不妥当的,因为没有人能保证反思出来的新行动基元和轨迹就一定是好的,就像改错题没人敢保证一次改对一样。
正确做法应该是在仿真系统重放(replay)这个算例的场景,并在1中的联合仿真中看效果,把效果交给5的评估器再次评估。重复上述过程,直到“反思”出好的解决方案为止,才放入记忆中作为知识。
四、总结
本文借用了一篇论文Limsim++,介绍了自动驾驶(现在按照新的要求叫辅助驾驶)端到端仿真平台的基本构成要素和基本要素组合成的框架。
这种框架实际上是通用的,任何专业人士来设计这个框架,大概率会得到大同小异的结果。这种框架的贡献并不在于标新立异,而在于总结业界思维中公认的最方便的方案,便于大家通用,而不用重复造轮子。
此外,这种具有代表性的框架其实也可以用于经典的“三段式”自动驾驶的仿真,只要把本文中的决策器(单一的多模态大语言模型),替换成感知-决策-控制 三段式的自动驾驶算法和软件实现即可。
文章转载自公众号:焉知汽车
作者:咖啡鱼
原文链接:https://mp.weixin.qq.com/s/7oXTW8rDIwZKzlN3o0rKMg
