概述#
自 0.24.0 版本起,SUMO 包含了电动汽车模型。该模型由 TU-Braunschweig 的 Tamás Kurczveil 和 Pablo Álvarez López 实现。模型的核心实现在车辆设备 device.battery 中。其他功能包括充电站(可放置在网络中的任何车道上)和新的输出选项 --battery-output <FILE>。
您可以在 [1]](https://github.com/eclipse-sumo/sumo/tree/main/tests/sumo/devices/battery/braunschweig) 找到这些实现的测试案例。
定义电动汽车#
电动汽车的不同方面是分开建模的。本页重点介绍电池的建模及其充放电过程。实际的能耗值本身属于排放模型的一部分,因为 SUMO 可以对此使用不同的模型。
为了跟踪车辆的充电状态,必须为其配备电池设备。这可以通过选项 --device.battery.explicit <vehID1,vehID2,...> 来完成,或者简单地设置 --device.battery.probability 1 为所有车辆配备。或者,可以使用通用车辆参数指定设备。
车辆及其电气组件的其他属性必须通过车辆或其类型的参数来定义。某些属性只能在车辆类型中定义。
这些值的含义如下(默认值来自下文的起亚车型):
| key | Value Type | Default | Description |
|---|---|---|---|
| device.battery.capacity | float | 35000 (Wh) | 最大电池容量 Emax |
| maximumPower | float | 150000 (W) | 车辆可达到的最大功率(未使用) |
| vehicleMass | float | 1830 (kg) | 车辆质量 mveh(已弃用) |
| loading | float | 0 (kg) | 附加质量 (应在车辆类型中定义) |
| frontSurfaceArea | float | 2.6 (m2) | 正面面积 Aveh |
| airDragCoefficient | float | 0.35 | 空气阻力系数 cw |
| rotatingMass | float | 40 (kg) | 内部旋转元件的(等效)质量 |
| radialDragCoefficient | float | 0.1 | 径向阻力系数 crad |
| rollDragCoefficient | float | 0.01 | 滚动阻力系数 croll |
| constantPowerIntake | float | 100 (W) | 用电器的平均(恒定)功率 Pconst |
| propulsionEfficiency | float | 0.98 | 驱动效率 ηprop |
| recuperationEfficiency | float | 0.96 | 回收效率 ηrecup |
| stoppingThreshold | float | 0.1 (m/s) | 开始充电的最大速度 |
| device.battery.maximumChargeRate | float | 150000 (W) | 电池的最大充电速率 |
| device.battery.chargeLevelTable | float list | 荷电状态值(从 0 到 1)的有序列表,在 device.battery.chargeCurveTable 中定义了对应的最大充电速率 |
|
| device.battery.chargeCurveTable | float list | 与 device.battery.chargeLevelTable 中每个荷电状态值对应的最大充电速率 |
Note
在 SUMO 1.20.0 之前,rotatingMass 被称为 internalMomentOfInertia,但为了明确它是一个质量而不是转动惯量,已将其重命名。旧参数被视为已弃用。
同样,vehicleMass 也已弃用,取而代之的是车辆/车辆类型的新 mass 属性。
一个具有电气属性的车辆示例(这些是原始出版物中某城市公交车的值):
<routes>
<vType id="ElectricBus" accel="1.0" decel="1.0" length="12" maxSpeed="100.0" sigma="0.0" minGap="2.5" mass="10000" color="1,1,1">
<param key="has.battery.device" value="true"/>
<param key="device.battery.capacity" value="2000"/>
<param key="maximumPower" value="1000"/>
<param key="frontSurfaceArea" value="5"/>
<param key="airDragCoefficient" value="0.6"/>
<param key="rotatingMass" value="100"/>
<param key="radialDragCoefficient" value="0.5"/>
<param key="rollDragCoefficient" value="0.01"/>
<param key="constantPowerIntake" value="100"/>
<param key="propulsionEfficiency" value="0.9"/>
<param key="recuperationEfficiency" value="0.9"/>
<param key="stoppingThreshold" value="0.1"/>
<param key="device.battery.maximumChargeRate" value="150000"/>
</vType>
</routes>
如果车辆具有电池设备(并且不是跟踪燃料),且未定义显式的 emissionClass,则将为其分配排放类别 Energy/unknown。它将不会使用从车辆类别派生的默认排放类别。这是为了向后兼容性,并且会发出警告,因为通常最好显式设置排放类别。上述大多数参数实际上适用于此排放类别,而不是电池设备本身。
电池的初始能量含量(默认为 0.5*device.battery.capacity)可以在车辆定义中设置:
<routes>
<vehicle id="0" type="type1" depart="0" color="1,0,0">
<param key="device.battery.chargeLevel" value="500"/>
</vehicle>
</routes>
电池在充电站的充电速率受到限制,以模拟电池管理控制器的效果(例如,对几乎充满的电池的充电少于对几乎耗尽的电池的充电)。有两种方法可以定义最大充电速率:对于恒定速率,设置属性 device.battery.maximumChargeRate。如果需要根据荷电状态变化的最大充电速率,则可以通过数据点来定义,速率将在这些数据点之间进行插值。荷电状态必须在 device.battery.chargeLevelTable 中给出,相应的充电速率在 device.battery.chargeCurveTable 中给出。如果已定义,最大充电曲线优先于恒定的最大充电速率 device.battery.maximumChargeRate。一个在荷电状态超过 50% 时充电速率下降的定义示例如下:
<routes>
<vehicle id="0" type="type1" depart="0" color="1,0,0">
<param key="device.battery.chargeLevelTable" value="0 0.5 1"/>
<param key="device.battery.chargeCurveTable" value="45000 45000 20000"/>
</vehicle>
</routes>
车辆行为#
默认情况下,车辆行为不受电池电量的影响。即使电池容量为 0,汽车也会继续行驶。为避免这种情况,必须使用 TraCI 根据当前电池电量改变速度或路线,或者配置stationfinder 设备来监控电池容量。
充电站#
充电站是车道上定义的一个表面,配备电池的车辆在此处充电。充电站的实现使用了公交站点的基本结构和参数。通过将 chargeType 属性设置为 fuel,可以将充电站转换为加油站。这样电动汽车就无法在那里充电了。
| key | Value Type | Value range | Default | Description |
|---|---|---|---|---|
| id | string | id | 充电站 ID(必须唯一) | |
| name | string | simple String | 充电站名称。仅用于可视化目的。 | |
| lane | string | valid lane id | 充电站位置所在的车道 | |
| startPos | float | lane.length < x < lane.length (negative values count backwards from the end of the lane) | 0 | 指定车道中的起始位置 |
| endPos | float | lane.length < x < lane.length (negative values count backwards from the end of the lane) | 指定车道中的结束位置 | |
| friendlyPos | bool | true or false | false | 是否自动更正无效的充电站位置 |
| power | float (W) or (mg/s) | power > 0 | 22000 | 充电功率 Pchrg (如果正在充电的电池设备配置为跟踪燃料,充电功率将被解释为 mg/s) |
| totalPower | float (W) or (mg/s) | power >= 0 | 0 | 该充电站所有充电车辆的最大充电功率 Pchrg 总和(按请求功率的比例共享)。仅在值 > 0 时激活。 |
| efficiency | float | 0 <= efficiency <= 1 | 0.95 | 充电效率 ηchrg |
| chargeInTransit | bool | true or false | false | 启用或禁用行驶中充电,即车辆被强制/不强制停止充电 |
| chargeDelay | float | chargeDelay > 0 | 0 | 车辆到达/停在充电站后,在能量传输(充电)开始之前的时间延迟 |
| chargeType | string | {normal, battery-exchange, fuel} | normal | 充电类型 |
| parkingArea | string | valid parkingArea id | 充电站应定位在其上的停车场的 id(可选) - 车辆仅在到达停车场后充电 |
充电站使用以下格式在 additional 文件中定义:
<additional>
<chargingStation chargeDelay="2" chargeInTransit="0" power="200000" efficiency="0.95" endPos="25" id="cS_2to19_0a" lane="2to19_0" startPos="10"/>
</additional>
在模拟中表示如下:
GUI 中的 chargingStation 表示
充电期间 chargingStation 的颜色
Note
如果充电站要定位在停车场上(使用属性 parkingArea),则引用的 parkingArea 必须在充电站之前定义/加载。
在充电站停车#
由于交通状况、在定义的位置停车或在显式定义的 chargingStation 停车,可能会发生充电站停车:
<routes>
<vehicle id="v0" route="route0" depart="0">
<stop chargingStation="myChargingStationID" until="50"/>
</vehicle>
</routes>
充电站输出#
充电站输出有两种变体。一种列出所有时间步长的值,而另一种将数据聚合到充电事件中(因此与车辆连接到充电站的整个时间相关)。
完整报告#
选项 --chargingstations-output chargingstations.xml 生成充电站充电能量的完整报告:
<output>
<battery-output value="battery.xml"/>
<chargingstations-output value="chargingstations.xml"/>
</output>
文件 chargingstations.xml 具有以下结构:
<chargingstations-export>
<chargingStation id="CS1" totalEnergyCharged="71.25" chargingSteps="27">
<vehicle id="veh0" type="ElectricVehicle1" totalEnergyChargedIntoVehicle="15.83" chargingBegin="12.00" chargingEnd="17.00">
<step time="12.00" chargingStatus="chargingStopped" energyCharged="2.64" partialCharge="2.64" power="10000.00" efficiency="0.95" actualBatteryCapacity="12962.97" maximumBatteryCapacity="35000.00"/>
<step time="13.00" chargingStatus="chargingStopped" energyCharged="2.64" partialCharge="5.28" power="10000.00" efficiency="0.95" actualBatteryCapacity="12965.59" maximumBatteryCapacity="35000.00"/>
<step time="14.00" chargingStatus="chargingStopped" energyCharged="2.64" partialCharge="7.92" power="10000.00" efficiency="0.95" actualBatteryCapacity="12968.22" maximumBatteryCapacity="35000.00"/>
</vehicle>
<vehicle id="veh1" type="ElectricVehicle2" totalEnergyChargedIntoVehicle="5.28" chargingBegin="17.00" chargingEnd="18.00">
<step time="17.00" chargingStatus="chargingStopped" energyCharged="2.64" partialCharge="18.47" power="10000.00" efficiency="0.95" actualBatteryCapacity="11967.35" maximumBatteryCapacity="35000.00"/>
<step time="18.00" chargingStatus="chargingStopped" energyCharged="2.64" partialCharge="21.11" power="10000.00" efficiency="0.95" actualBatteryCapacity="12978.72" maximumBatteryCapacity="35000.00"/>
</vehicle>
...
</chargingStation>
...
...
</chargingstations-export>
对于整个 ChargingStation:
| Name | Type | Description |
|---|---|---|
| id | string | ChargingStation ID |
| totalEnergyCharged | float | 整个模拟期间充电的总能量(Wh) |
| chargingSteps | int | chargingStation 充电能量的步数 |
对于当前充电车辆
| Name | Type | Description |
|---|---|---|
| id | string | 在此充电站停靠期间正在充电的车辆 ID |
| type | string | 车辆类型 |
| totalEnergyChargedIntoVehicle | double | 在此充电站停靠期间充电的能量(Wh) |
| chargingBegin | float | 车辆开始充电的时间步长(秒) |
| chargingEnd | float | 车辆结束充电的时间步长(秒) |
对于每个充电时间步长:
| Name | Type | Description |
|---|---|---|
| time | float | 当前时间步长 (s) |
| chargingStatus | string | 当前充电状态(正在充电、等待充电或未充电) |
| energyCharged | float | 当前时间步长充电的能量 |
| partialCharge | float | 从模拟开始到此时间步长,ChargingStation 充电的能量 |
| power | float | ChargingStation 的当前功率 |
| efficiency | float | ChargingStation 的当前效率 |
| actualBatteryCapacity | string | 车辆的当前电池容量 |
| maximumBatteryCapacity | string | 车辆的当前最大电池容量 |
充电事件#
选项 --chargingstations-output chargingevents.xml --chargingstations-output.aggregated true 生成网络中任何充电站的充电事件报告。生成的输出文件 chargingevents.xml 具有以下结构:
<chargingstations-export>
<chargingEvent chargingStation="CS1" vehicle="veh0" type="ElectricVehicle1" totalEnergyChargedIntoVehicle="15.83" chargingBegin="12.00" chargingEnd="17.00" actualBatteryCapacity="12968.22" maximumBatteryCapacity="35000.00" minPower="10000.00" maxPower="10000.00" minCharge="2.64" maxCharge="2.64" minEfficiency="0.95" maxEfficiency="0.95" />
<chargingEvent chargingStation="CS1" vehicle="veh1" type="ElectricVehicle1" totalEnergyChargedIntoVehicle="5.28" chargingBegin="17.00" chargingEnd="18.00" actualBatteryCapacity="12978.72" maximumBatteryCapacity="35000.00" minPower="10000.00" maxPower="10000.00" minCharge="2.64" maxCharge="2.64" minEfficiency="0.95" maxEfficiency="0.95" />
...
</chargingstations-export>
如果同时设置了选项 --chargingstations-output.aggregated.write-unfinished true,则模拟结束时仍在充电的车辆也会被包含在内(但不包含 chargingEnd 属性)。具有相同名称的属性可以在上面的表格中查找。其余属性为:
| Name | Type | Description |
|---|---|---|
| minPower | float | 充电事件期间的最小充电功率 |
| maxPower | float | 充电事件期间的最大充电功率 |
| minCharge | float | 充电事件期间一个时间步长的最小充电能量 |
| maxCharge | float | 充电事件期间一个时间步长的最大充电能量 |
| minEfficiency | float | 充电事件期间的最小充电效率 |
| maxEfficiency | float | 充电事件期间的最大充电效率 |
battery-output#
要在 SUMO 配置中使用电池设备,需要设置三个输出参数:
<configuration>
<input>
<net-file value="netFile.xml"/>
<route-files value="routeFile.xml"/>
<additional-files value="additionalFile.xml"/>
</input>
<output>
<battery-output value="Battery.out.xml"/>
<battery-output.precision value="4"/>
<device.battery.probability value="1"/>
<summary-output value="summary_100.xml"/>
</output>
</configuration>
battery-output 生成一个具有以下结构的文件:
<battery-export>
<timestep time="0.00">
<vehicle id="vehicle01" energyConsumed="0.00" totalEnergyConsumed="0.00" totalEnergyRegenerated="0.00"
actualBatteryCapacity="17500.00" maximumBatteryCapacity="35000.00"
chargingStationId="NULL" energyCharged="0.00" energyChargedInTransit="0.00" energyChargedStopped="0.00"
speed="12.92" acceleration="0.00" x="1428.27" y="25.57" lane="01to02_0"
posOnLane="0.00" timeStopped="0"/>
<vehicle id=..... */
</timestep>
<timestep time="1.00">
<vehicle id=.....
</timestep>
<timestep time=...
...
</timestep>
</battery-export>
| Name | Type | Description |
|---|---|---|
| time | int | 当前时间步长 |
| id | string | 车辆 id |
| energyConsumed | double | 此时间步长的能耗(Wh) |
| totalEnergyConsumed | double | 截至此时间步长的累积能耗总和(Wh) |
| totalEnergyRegenerated | double | 截至此时间步长的累积再生能量总和(Wh) |
| actualBatteryCapacity | double | 此时间步长的电池能量含量 |
| maximumBatteryCapacity | double | 电池的最大能量容量 |
| chargingStationId | string | 如果车辆正好在充电站,则此值为充电站的 id,否则为 NULL |
| energyCharged | double | 当前时间步长从充电站接收的充电量(仅当车辆正好在充电站时 != 0) |
| energyChargedInTransit | double | 行驶中的车辆在当前时间步长从充电站接收的充电量 |
| energyChargedStopped | double | 停止的车辆在当前时间步长从充电站接收的充电量 |
| speed | double | 此时间步长的车辆速度 |
| acceleration | double | 此时间步长的车辆加速度 |
| x | double | 车辆在地图上的绝对位置 x |
| y | double | 车辆在地图上的绝对位置 y |
| lane | string | 车辆当前所在车道的 id |
| posOnLane | double | 车辆在其当前车道上的位置 |
| timeStopped | int | 车辆保持静止状态的时间步长计数器 |
排放输出#
当设置 <vType> 参数 emissionClass="Energy/unknown" 时,SUMO 的排放模型输出可以与电池设备一起使用。
跟踪非电气车辆的燃料消耗#
通过设置选项 --device.battery.track-fuel,配备传统传动系统(emissionClass 不是 Energy)的车辆将根据其各自排放类别的燃料消耗来监控其燃料水平。然后,所有容量值都被解释为 mg 而不是 Wh。此外,充电站功率在充电燃料时被重新解释为 mg/s。
TraCI#
可以使用 traci.vehicle.getParameter 和 traci.vehicle.setParameter 直接访问电池设备的内部状态。可以使用 traci.chargingstation 中的相应 getter 和 setter 函数来检查和更新充电站。
此外,如果声明了 emissionClass="Energy/unknown",可以使用函数 traci.vehicle.getElectricityConsumption() 来访问车辆的消耗量。
查询当前荷电状态#
电池的当前荷电状态可以计算为实际电池电量与最大电池容量的商:
capacity = float(traci.vehicle.getParameter(vehID, "device.battery.capacity"))
currentCharge = float(traci.vehicle.getParameter(vehID, "device.battery.chargeLevel"))
stateOfCharge = currentCharge / capacity
计算剩余续航里程#
车辆行驶一段时间后,可以根据之前的消耗和距离计算剩余续航里程:
mWh = traci.vehicle.getDistance(vehID) / float(traci.vehicle.getParameter(vehID, "device.battery.totalEnergyConsumed"))
remainingRange = float(traci.vehicle.getParameter(vehID, "device.battery.chargeLevel")) * mWh
要计算出发时的剩余续航里程,mWh 值(米/瓦时)应从先前的模拟中校准。
降低充电站的功率#
如果太多消费者连接到电网,电网可能无法提供充电站的标称功率。可以使用以下示例代码模拟 20% 的临时功率下降:
prevPower = traci.chargingstation.getPower(chargingStationID) # 记住以便以后恢复满功率
traci.chargingstation.setPower(chargingStationID, prevPower * 0.8)
模型详情#
有关已实现设备的所有信息(包括车辆能耗和充电模型的详细信息)都可以在以下出版物中找到。
出版物#
示例配置#
Kia Soul EV 2020#
这些值由 Jim Div 根据他自己的校准提供。
<!-- vehicle mass = 1682kg curb wt + average 2 passengers / bags -->
<vType id="soulEV65" minGap="2.50" maxSpeed="29.06" color="white" accel="1.0" decel="1.0" sigma="0.0" emissionClass="Energy/unknown" mass="1830">
<param key="has.battery.device" value="true"/>
<param key="airDragCoefficient" value="0.35"/> <!-- https://www.evspecifications.com/en/model/e94fa0 -->
<param key="constantPowerIntake" value="100"/> <!-- observed summer levels -->
<param key="frontSurfaceArea" value="2.6"/> <!-- computed (ht-clearance) * width -->
<param key="rotatingMass" value="40"/> <!-- guesstimate, inspired by PHEMlight5 PC_BEV -->
<param key="device.battery.capacity" value="64000"/>
<param key="maximumPower" value="150000"/> <!-- website as above -->
<param key="propulsionEfficiency" value=".98"/> <!-- guesstimate value providing closest match to observed -->
<param key="radialDragCoefficient" value="0.1"/> <!-- as above -->
<param key="recuperationEfficiency" value=".96"/> <!-- as above -->
<param key="rollDragCoefficient" value="0.01"/> <!-- as above -->
<param key="stoppingThreshold" value="0.1"/> <!-- as above -->
</vType>
观察结果: - 模拟效率为每消耗 1 千瓦时可行驶 6.3 - 6.7 公里,与在具有现实交通的短途和中途模拟中测量的 6.4 - 6.8(标准差 0.4 - 0.8)效率一致 - 没有交叉路口和其他汽车的抽象场景会高估效率很大倍数(约两倍的公里/千瓦时)
