本文档简要介绍了如何向 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.xsd 中 laneChangeModel 属性的允许值列表中定义。
注册模型名称作为可能的值#
我们现在添加允许定义和解析模型参数的 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
