车道变换模型

本文档简要介绍了如何向 SUMO 中添加新的车道变换模型。

Caution

车道变换模型的复杂程度至少比跟驰模型高一个数量级(仅从代码量判断)。

建议通过出版物 SUMO's Lane-Changing Model 了解该模型的架构。

车道变换模型的类#

最好从一个已有的模型开始。模型位于 <SUMO_HOME>/src/microsim/lcmodels 目录下,新添加的模型也应该放在这里。复制 MSLCM_LC2013.h 和 MSLCM_LC2013.cpp 两个文件并重命名。名称应为 "MSLCModel_<YOUR_MODELS_NAME>"。

Convention

车道变换模型的实现位于 <SUMO_HOME>/src/microsim/lcmodels。

Convention

车道变换类的名称应以 "MSLCModel_" 开头。

现在,打开这两个文件,将所有出现的 MSLCM_LC2013 重命名为你的类名。

将文件添加到 <SUMO_HOME>/src/microsim/lcmodels/CMakeLists.txt

加载到仿真中#

更新 XSD 模式文件以允许新的模型名称#

所有允许的模型必须在 <SUMO_HOME>/data/xsd/routeTypes.xsdlaneChangeModel 属性的允许值列表中定义。

注册模型名称作为可能的值#

我们现在添加允许定义和解析模型参数的 XML 元素。扩展位于 <SUMO_HOME>/src/utils/xml/SUMOXMLDefinitions.cpp 中的已知元素列表 "SUMOXMLDefinitions::tags"。 在 SUMOXMLDefinitions::laneChangeModelValues 中添加新值,例如 { "LCXYZ", LaneChangeModel::LCXYZ }(但不要作为数组的最后一个元素),并将相应的元素添加到 enum class LaneChangeModel

扩展可加载模型列表#

车道变换模型在 MSAbstractLaneChangeModel::build 中实例化,该函数位于 <SUMO_HOME>/src/microsim/lcmodels/MSAbstractLaneChangeModel.cpp。你会在这里找到一个 switch 语句,你需要将调用模型构造函数的代码放在这里。

添加自定义模型参数#

你可能会注意到,模型的所有参数都是在构造函数中加载的,而不是作为参数传递的。

但是,你需要在 SUMOVehicleParserHelper::parseLCParams 中注册任何新的参数,该函数位于 <SUMO_HOME>/src/utils/vehicle/SUMOVehicleParserHelper.cpp

为了进一步交互,你还需要在新模型的构造函数调用基类构造函数时,将 "id" 修改为模型的 "id":

MSAbstractLaneChangeModel(v, LaneChangeModel::LCXYZ),

通过 TraCI 使用自定义参数#

车道变换模型可以重写从 MSAbstractLaneChangeModel 继承的 getParameter 和 setParameter 函数。 任何对 'traci.vehicle.setParameter' 和 'traci.vehicle.getParameter' 的调用,如果其键以 "laneChangeModel." 开头,都将被转发到这些方法(去掉前缀)。 调用 traci.vehicle.setParameter(vehID, "laneChangeModel.XYZ", "42") 将被映射到调用 MSAbstractLaneChangeModel::setParameter("XYZ" , "42"),该调用在车辆当前的 laneChangeModel 上执行。

XML 验证#

Sumo 执行 xml 验证。如果你添加了新的 XML 元素或属性,你需要调整 <SUMO_HOME>/data/xsd 中的 XML 模式文件,或者添加选项

--xml-validation never