车辆模型

Caution

请注意,这是一份工作文档... 并非用户文档!

实现新的跟驰模型#

在 SUMO 中,跟驰模型是抽象类 MSCFModel(microsim/cfmodels/MSCFModel.h)的一个实现。

要添加一个新模型,必须执行以下步骤:

  1. 在 utils/common/SUMOXMLDefinitions.h 和 .cpp 中定义一个新的模型名称
  2. 在 utild/xml/SUMOVehicleParserHelper::getAllowedCFModelAttrs() 中定义模型参数(如有必要,在 SUMOXMLDefinitions 中定义新属性)
  3. 在 microsim/cfmodels 中添加一个新类(例如,复制该目录下的现有类之一)
  4. 将此类添加到构建文件中(例如,在 Linux 上构建时添加到 microsim/cfmodels/Makefile.am 中)
  5. 在 microsim/MSVehicleType::build() 中添加代码,根据新名称选择新类

如果您的模型需要持久化状态,则需要从 MSCFModel::VehicleVariables 派生一个类来保存它。请参阅 microsim/cfmodels/MSCFModel_IDM 作为示例。

定义车辆类型#

在开始修改代码之前,我们应该决定如何表示车辆类型。以下是一些事实和需求(未排序):

  • ok 仿真和路由模块都必须能够解析车辆类型定义
  • 最好允许针对 XML 模式进行验证
  • 必须能够定义至少两个子类型:跟驰模型和换道模型(也许换道模型甚至可以分为导航部分和战术部分)
  • ok 参数应具有默认值
  • ok 必须存在默认车辆类型
  • 模型因参数集而异

可能的描述方式#

索引

示例

优点/缺点

A

<vtype cfModel="xxx" xxxParam1="..." xxxParam2="..." ...

  • (-) 难以验证 - 参数随 "cfModel" 的值而变化

B

<vtype-XXX xxxParam1="..." xxxParam2="..." ...

  • (-) 需要大量不同的元素

C

<cfmodel id="#id" model="xxx" param1="..." param2="..." .../>
<vtype cfModelId="#id" .../>

  • (+) 直截了当;可以进行多种组合
  • (+) 类似于每个车辆引用其 vtype 的方式
  • (-) 难以验证 - 参数随 "cfModel" 的值而变化

D

<vtype cfModel="xxx" param1="..." param2="..." ...>

  • (--) 不同模型之间的参数集不同
  • (-) 难以验证 - 参数随 "cfModel" 的值而变化

E

<vtype ...>
<cfmodel model="xxx" param1="..." param2="..." .../>

  • (+) 直截了当
  • (-) 难以验证 - 参数随 "cfModel" 的值而变化
  • 1 票 (Mayer)

F

<vtype ...>
<cfmodel-XXX model="xxx" param1="..." param2="..." .../>

  • (+) 直截了当
  • (-) 需要大量不同的元素
  • 2 票 (Behrisch, Krajzewicz)

(当前)选择的描述方式#

经过一些讨论,选择了以下车辆类型描述方式:

<vtype id="..." ...>
    <carFollowing-Krauss ... >
    <laneChanging-DK2002 ... >
</vtype>

vtype 将包含既不能归为换道模型也不能归为跟驰模型的参数,例如车辆类型的颜色、车辆的宽度等,这些(目前)仅用于可视化。此外,车辆的长度以及其他不仅由一个模型使用的参数也存储在此处。

此示例中嵌入的 carFollowing-Krauss 元素描述了跟驰模型(本例中为 Krauss),laneChanging-DK2002 描述了换道模型(Daniel Krajzewicz 2002 年的模型 :-)),每个都有自己的参数。

希望保留已知的 vtype 定义。在这种情况下,Krauss 模型默认保持选定。

Note

可能无法针对模式(schema)对此进行验证。

跟驰模型接口#

目前,假设应为每个模型重新实现以下方法;“通用”列应标识那些可能在不同模型间相同的方法:

方法 通用? 描述
ffeV
ffeS
maxNextSpeed 内部 SUMO 调整
brakeGap 可能 应取决于最大减速度(一个相当通用的值)和物理特性,仅此而已
approachingBrakeGap 可能 与 brakeGap 几乎相同,只是不包含驾驶员的反应时间
interactionGap
hasSafeGap
safeEmitGap
dawdle
decelAbility 相当不

加载和解析车辆类型#

正如已经为车辆实现的那样,添加了一个新的中间结构 <SUMO_HOME>/src/utils/common/SUMOVTypeParameter,其中包含车辆类型描述。在读取 XML 定义时,路由器和仿真都使用额外实现的辅助方法(位于 <SUMO_HOME>/src/utils/xml/SUMOVehicleParserHelper)来填充此结构。

SUMOVTypeParameter 具有成员变量,用于存储那些既不属于跟驰模型也不属于换道模型的车辆类型参数:idlengthmaxSpeeddefaultProbabilityspeedFactorspeedDevemissionClasscolorvehicleClasswidthoffsetshape。这些值初始化为默认值。读取值时,SUMOVehicleParserHelper 将有关哪些值是从 XML 描述中设置的信息存储在 SUMOVTypeParameter::setParameter 中。这允许在将定义写回文件时仅保存(传递)已设置的值 - 路由器需要此功能。

跟驰模型的参数保存到映射 SUMOVTypeParameter::cfParameter 中,模型名称保存到 SUMOVTypeParameter::cfModel 中。请注意,换道模型参数处理尚未实现。该映射仅包含读取的 XML 文件中给出的模型参数;此时不插入默认值。为了允许处理旧的 vtype 定义,直接存储在 vtype 元素内的 Krauss 跟驰模型参数也存储在此映射中。

路由器直接使用 SUMOVTypeParameter 类 - 使得 ROVehicleType 变得不必要。仿真使用新方法 MSVehicleType::build 来构建描述的 MSVehicleType/MSCFModel 组合。在此方法中设置缺失的默认值以获得完整的车辆类型/模型描述。