SUMO 中车辆动力学模型包括两方面
longitudinal model: 纵向动力学模型,描述车辆加速和减速
lateral model:横向动力学模型,描述车辆换道
在 longitudinal model 方面,由于 SUMO 主要用于研究车辆的外部行为、多车交互和交通流,对于单个车辆建模精度要求不高,可以近似看作质点,采用比较简单的 car-following model (跟车模型) 来描述车辆速度和位置变化规律。car-following model 中包含两种情况:无前车和有前车。
-
对于无前车的情形,车辆保持为最大速度,这里最大速度要至少考虑三方面的因素:
- 该类型车辆本身能够达到的最大物理速度
- 前一时刻速度经过最大加速之后在当前时刻所能达到的最大速度
- 当前行驶道路规定的最大速度
最终的行驶速度为上述三个最大速度中的最小值。
对于有前车的情形,则要计算安全的行驶速度,保证任何情况下(尤其是前车急刹车时)车辆不会相撞。不同的 car-following model 的主要区别就在于如何计算安全行驶速度。目前 SUMO 中采用的 car-following model 为改进的 Krauss model.
在 lateral model 方面,SUMO 采用 lane changing model (参考文献)。简单地说就是以决策树的方式设定诸多换道条件,只要满足某些条件,就进行相应的换道操作。
默认的 lane changing model 是瞬间换道,即在一个 simulation step 中完成换道,直观地看就是车辆在两个车道之间瞬移。
更加精细的模型包括:
- SublaneModel
- Simple Continous lane-change model
具体设置可以参考 https://sumo.dlr.de/wiki/Simulation/SublaneModel#Sublane-Model
本文主要介绍 car-following model.
original Krauss model
要了解 SUMO 中默认使用的改进 Krauss model,需要先了解一下原始的 Krauss model 的建模思想。
Krauss model 来自文献:
Stefan Krauß. Microscopic Modeling of Traffic Flow: Investigation of Collision Free Vehicle Dynamics. PhD thesis. 1998
假设 为 leader 与 follower 车间距,其中 为车身长度。
如果要求车辆不相撞,需要满足
其中
为 follower 的速度,也就是我们需要计算的量
为 leader 的速度
为 follower 的刹车距离
为 leader 的刹车距离
为驾驶员从观察到动作的反应时间
为前边定义的车间距。
为了计算 , 需要给出速度与刹车距离的函数表达式 和 。下边用 函数在 处的 Taylor 展开近似替代 函数,忽略高阶项得到
下边的问题就是如何计算导数 .
假设刹车时加速度为 ,则有
其中的积分项对应了刹车加速度为 情况下的刹车距离。
一般我们在计算距离时习惯将积分区间设定为时间,而被积函数为速度。这里是将积分区间设定为速度的变化区间,对时间进行积分。这样积分之后得到关于速度的函数,以便后续的操作。
将 式带入 式中得
上述表达式右边 含有 ,所以需要再整理一下,得到 的显式表达为
其中原本的 也替换为了最大刹车加速度 .
上述式子就是 SUMO 中 original Krauss model 的安全跟车速度表达式,部分程序源码如下:
double MSCFModel_KraussOrig1::vsafe(double gap, double predSpeed, double /* predMaxDecel */) const {
...
double vsafe = (double)(-1. * myTauDecel + sqrt( myTauDecel * myTauDecel + (predSpeed * predSpeed) + (2. * myDecel * gap) ));
assert(vsafe >= 0);
return vsafe;
}
这里 式右边就是安全跟车速度,记做 。但是,这一速度还不是最终车辆采用的跟车速度。与无前车情况类似,我们也要保证跟车速度不能超过允许的最大速度,因此要取安全速度和允许最大速度中的较小值,即
其中 为最大加速度, 为仿真更新步长。
另外,可以引入随机因子,表示车辆并不一定按照上述安全跟车速度行驶,可以取更小的值,即
其中 为外部设定的 imperfection parameter,表征了偏离 的程度。
总结算法步骤:
由 式计算
由 式和 式计算最终的跟车速度
由跟车速度更新车辆位置:
改进的 Krauss model
尽管 SUMO 中包含了上述原始 Krauss model,但是没有作为默认 car-following model,而是做了较大改动。改进模型与原始的 Krauss 模型的出发点是相同的:在保证不碰撞的前提下,车速尽量的快。但在计算安全速度方面,与原始 Krauss 完全不同。
改进的 Krauss model 依然基于上述公式 ,但并没有采用泰勒展开方式近似表达刹车距离函数 ,而是直接数值计算。步骤与源码实现如下:
- 计算前车的刹车距离
上式中 为前车速度减到 0 需要的时间。
在 SUMO 源码中通过 brakeGapEuler 函数 实现上述计算过程。
这里需要注意的是,SUMO 默认采用 Euler 数值积分方式,在计算位置时公式如下:
即 时刻的位置等于 时刻的位置加上 时刻的速度造成的位置变化。
明白了这种积分方式才能更好的理解源码中的计算公式。
- 基于公式 计算 . 基本思想是找到一个安全跟车速度使得后车在此速度下刹车距离 (包括反应距离) 正好等于前车的刹车距离加上原本两车间距。具体在 maximumSafeStopSpeedEuler 函数中实现。
得到安全跟车速度之后,其余部分与原始的 Krauss model 类似的,要与允许的最大速度比较,并且考虑随机因素。具体在 followSpeed 函数 和 dawdle2 函数 中实现。