Electric

概述#

自 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.getParametertraci.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)效率一致 - 没有交叉路口和其他汽车的抽象场景会高估效率很大倍数(约两倍的公里/千瓦时)