Models/ElectricHybrid

Overview#

Since version 1.5.0 SUMO extends the original electric vehicle model with a model that simulates also internal electric parameters of an partial trolleybus, i.e. a vehicle that is being powered by overhead wires and has also a battery pack installed, that is being charged from the overhead wires. The model allows not only for vehicle simulation, but the simulation may also include detialed electrical simulation of the overhead wire circuit behaviour. It was implemented by Jakub Ševčík and Jan Přikryl from the RICE FEL UWB Pilen. The core of the model is implemented in the vehicle device device.elechybrid. Additional features are a set of overhead wires (which can be placed on any lane in the network) including wire clamps, a traction substation powering these wires, and a new output options --elechybrid-output <FILE>, --overheadwiresegments-output <FILE> and --substations-output <FILE>.

You can find a test case for these implementations at [1]

Defining Partial Trolleybuses#

To define an electric vehicle with in-motion charging system, it must be equipped with a hybrid electric device. This may be done using the option --device.elechybrid.explicit <vehID1,vehID2,...> or simply setting --device.elechybrid.probability 1 to equip all vehicles. Alternatively, the device may be specified using Generic vehicle parameters.

Additional properties of the vehicle and its electrical components must then be defined via parameters of the vehicle or its type.

These values have the following meanings:

key Value Type Default Description
maximumBatteryCapacity float 0 (Wh) Maximum battery capacity Emax
overheadWireChargingPower float 0 (W) Constant power drawn from an overhead wire if charging a battery
maximumPower float 100000 (W) Maximum power of the vehicle electric drive
vehicleMass float 1000 (kg) Vehicle mass mveh
frontSurfaceArea float 5 (m2) Front surface area Aveh
airDragCoefficient float 0.6 Air drag coefficient cw
internalMomentOfInertia float 0.01 (kg·m2) Mom. of inertia of int. rot. elements Jint
radialDragCoefficient float 0.5 Radial drag coefficient crad
rollDragCoefficient float 0.01 Rolling resistance coefficient croll
constantPowerIntake float 1000 (W) Avg. (constant) power of consumers Pconst
propulsionEfficiency float 0.9 Drive efficiency ηprop
recuperationEfficiency float 0.8 Recuperation efficiency (constant) ηrecup
recuperationEfficiencyByDecel float 0.0 Recuperation efficiency (by deceleration)

Note

In comparison with battery device, focuse attention on maximumPower variable, which defines maximum motor (drive) power of hybrid electric vehicle. The rest of parameters in the table are common for model of electric energy consumption and have the same meaning.

An example of a vehicle with hybrid electric attribute is almost identical with that of an electric vehicle:

<routes>
    <vType id="trolleybus" accel="0.8" decel="1.0" length="12" maxSpeed="18.0" sigma="0.0" minGap="2.5"
           emissionClass="Energy/unknown"  vClass="bus" guiShape="bus/trolley" color="0,1,0">
      <param key="maximumBatteryCapacity" value="50000"/>
      <param key="overheadWireChargingPower" value="10000"/>
      <param key="maximumPower" value="200000"/>
      <param key="vehicleMass" value="10000"/>
      <param key="frontSurfaceArea" value="7.5"/>
      <param key="airDragCoefficient" value="0.59"/>
      <param key="internalMomentOfInertia" value="0.01"/>
      <param key="radialDragCoefficient" value="0.5"/>
      <param key="rollDragCoefficient" value="0.061"/>
      <param key="constantPowerIntake" value="5000"/>
      <param key="propulsionEfficiency" value="0.9"/>
      <param key="recuperationEfficiency" value="0.9"/>
      <param key="recuperationEfficiencyByDecel" value="0."/>
      <param key="" value=""/>
    </vType>
</routes>

The initial energy content of the battery (in (Wh) by default 0.0 Wh) can be set in the vehicle definitions

<routes>
    <vehicle id="0" type="trolleybus" depart="0" route="route1" color="1,0,0">
        <param key="actualBatteryCapacity" value="5000"/>
    </vehicle>
</routes>

Traction Substation#

A traction substation represents a transformer station that is responsible for powering a certain set of overhead wire circuits. The current implementation of this element is quite simple: the substation provides information about the nominal voltage of the overhead wire and it also specifies the maximum current that can be drawn from the feeder (this imposes a maximum power limit on that substation).

key Value Type Value range Default Description
id string id Traction substation ID (Must be unique)
voltage float voltage > 0 600 (V) Voltage of at connection point for the overhead wire
currentLimit float currentLimit > 0 400 (A) Current limit of the feeder line
<additionals>
    <tractionSubstation id="Sub1" voltage="600" currentLimit="1000"/>
</additionals>

Caution

The parameter currentLimit does not cause any power limit of the feeder in SUMO v1.4.

Overhead Wires#

An overhead wire circuit is a set of overhead wires that are connected to a certain traction substation. The circuit may contain clamps that interconnect diferent parts of the circuit (typically wires for vehicles moving in opposite directions on the same street) and that improve electric parameters of the circuit when it is under higher load (TODO: feeder wires from the substation to more than a single place in the circuit).

In SUMO, the overehad wire circuit consists of segments that are defined on lanes of the SUMO network. Each segment may be shorten than the lane length, and a beginning or ending offset may be specified (this is typically used in trolleybus network to start or end the overhead wire at bus stops where the KLACKY are put on/off the overhead wire). At least one of the segments that will form a circuit has to be connected to a substation.

Note

Segments are automatically created for internal lanes of an intersection, unless the lane is explicitly porohibited using forbiddenInnerLanes in overhead circuit/section definition (see below).

key Value Type Value range Default Description
id string id Overhead wire segment ID (must be unique)
lane string valid lane id Lane over which the segment is placed
voltageSource boolean true or false false If true, the beginning point of the segment is connected to a substation
startPos float 0 <= x < lane.length 0 Starting position in the specified lane
endPos float 0 < x <= lane.length lane.length Ending position in the specified lane

Overhead wire segments are defined in an additional file using the following format:

<additionals>
    <overheadWireSegment id="ovrhdSgmnt_gneE0_0" lane="gneE0_0" voltageSource="true" />
    <overheadWireSegment id="ovrhdSgmnt_gneE1_0" lane="gneE1_0" />
    <overheadWireSegment id="ovrhdSgmnt_gneE3_0" lane="gneE3_0" />
    <overheadWireSegment id="ovrhdSgmnt_gneE4_0" lane="gneE4_0" />
    <overheadWireSegment id="ovrhdSgmnt_gneE5_0" lane="gneE5_0" voltageSource="true"/>
    <overheadWireSegment id="ovrhdSgmnt_-gneE3_0" lane="-gneE3_0" />
    <overheadWireSegment id="ovrhdSgmnt_-gneE1_0" lane="-gneE1_0" />
    <overheadWireSegment id="ovrhdSgmnt_-gneE0_0" lane="-gneE0_0"  startPos="0.0" endPos="40." />
</additionals>

We can also try to improve electric parameters of the circuit by specifying overhead wire clamps that interconnect selected overhead wire segments (these are typically overhead wire segments in the opposite directions on the same street):

key Value Type Value range Default Description
id string id Overhead wire clamp ID (must be unique)
substationId string valid substation id Substation which can employ the overhead wire clamp
idSegmentStartClamp string valid segment id id of the overhead wire segment, to the start of which the overhead wire clamp is connected
idSegmentEndClamp string valid segment id id of the overhead wire segment, to the end of which the overhead wire clamp is connected
<additionals>
    <overheadWireClamp id="clamp1" substationId="Sub1" idSegmentStartClamp="ovrhdSgmnt_-gneE0_0" idSegmentEndClamp="ovrhdSgmnt_gneE0_0" />
</additionals>

Once the overhead wire segments (and overhead wire clamps) have been specified, an electric circuit can be defined:

key Value Type Value range Default Description
segments string list of overhead wire segment IDs Segments that form the given circuit
substationId string valid substation id Substation to which the circuit is connected
clamps string list of overhead wire clamps Overhead wire clamps which interconnect overhead wire segments
forbiddenInnerLanes string list of forbidden lanes Inner lanes, where placing of overhead wire is restricted
<additionals>
    <overheadWire segments="ovrhdSgmnt_gneE0_0 ovrhdSgmnt_gneE1_0 ovrhdSgmnt_gneE3_0 ovrhdSgmnt_gneE4_0 ovrhdSgmnt_gneE5_0 ovrhdSgmnt_-gneE3_0 ovrhdSgmnt_-gneE1_0 ovrhdSgmnt_-gneE0_0"
                  substationId="Sub1" clamps="clamp1" forbiddenInnerLanes=":gneJ4_2_0" />
</additionals>

The overhead wire powering/charging system is represented in the graphical user interface as two-wire system:

Representation of the overhead wire in GUI

If a vehicle equipped with ElectricHybrid device drives under the wire, the colour of the circuit or section (?) changes according to the power consumed (the colourmap is currently hardcoded)

Color of overehad wire in case that some power is supplied to a vehicle

Electric Substation output#

Option --substations-output "nameOfFile.xml" generates a full report of energy provided by substations:

<output>
    <substations-output value="substations.out.xml"/>
</output>

File substations.out.xml has the following structure:

<substations-export>
    <overheadWireSegment id="ovrhdSgmnt_gneE0_0" tractionSubstationId="Sub1" totalEnergyCharged="0.00" chargingSteps="0"/>
    <overheadWireSegment id="ovrhdSgmnt_gneE1_0" tractionSubstationId="" totalEnergyCharged="0.00" chargingSteps="0"/>
    ...
    <overheadWireSegment id="ovrhdSgmnt_gneE5_0" tractionSubstationId="Sub1" totalEnergyCharged="250.92" chargingSteps="11">
        <vehicle id="test1" type="trolleybus" totalEnergyChargedIntoVehicle="250.92" chargingBegin="1.00" chargingEnd="11.00" maximumBatteryCapacity="46000.00">
            <step time="1.00" chargingStatus="charging" energyCharged="16.17" partialCharge="16.17" voltage="699.98" actualBatteryCapacity="23011.11"/>
            <step time="2.00" chargingStatus="charging" energyCharged="20.66" partialCharge="36.83" voltage="699.94" actualBatteryCapacity="23022.22"/>
            ...
        </vehicle>
        ...
    </overheadWireSegment>
    ...
    <overheadWireSegment id="ovrhd_inner_:gneJ1_0_1" tractionSubstationId="Sub2" totalEnergyCharged="30.15" chargingSteps="1">
        <vehicle id="test1" type="trolleybus" totalEnergyChargedIntoVehicle="30.15" chargingBegin="12.00" chargingEnd="12.00" maximumBatteryCapacity="46000.00">
            <step time="12.00" chargingStatus="charging" energyCharged="30.15" partialCharge="30.15" voltage="698.54" actualBatteryCapacity="23133.33"/>
        </vehicle>
    </overheadWireSegment>
    ...
</substations-export>

For the entire overhead wire segment:

Name Type Description
id string ChargingStation ID
totalEnergyCharged float Total energy charged in W during the entire simulation
chargingSteps int Number of steps in which charginStation was charging energy

For a vehicle on the given segment:

Name Type Description
id string ID of vehicle that is being powered by the segment
type string type of vehicle
totalEnergyChargedIntoVehicle double Energy provided during the travel on the segment (Wh)
chargingBegin float TimeStep in which vehicle starts with the charge (in seconds)
chargingEnd float TimeStep in which vehicle ends with the charge (in seconds)
maximumBatteryCapacity float Maximum battery capacity Emax

For every time step that a vehicle is being powereb by the segment:

Name Type Description
time float Current timestep (s)
energyCharged float Energy charged in the current time step (Wh)
partialCharge float Energy charged by the segment since vehicle entered the segment (Wh)
voltage float Current voltage in the overhead wire (V)
actualBatteryCapacity float Current battery capacity of vehicle (Wh)

ElectricHybrid output#

There are three output parameters to be set in the SUMO configuration to use the battery device:

<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>

This will activate an aggregated ElectricHybrid output:

<elecHybrid-export-aggregated>
    <timestep time="0.00">
        <vehicle id="test1" maximumBatteryCapacity="46000.0000" actualBatteryCapacity="23000.0000" energyConsumed="0.0000" energyCharged="0.0000" power="-nan(ind)" overheadWireId="" tractionSubstationId="" current="-nan(ind)" circuitVoltage="-nan(ind)" alphaCircuitSolver="-nan(ind)" speed="0.0000" acceleration="0.0000" distance="0.0000" x="-1.4500" y="46.3800" z="0.0000" slope="0.0000" lane="gneE0_0" posOnLane="0.0000"/>
        <vehicle id="test2" maximumBatteryCapacity="46000.0000" actualBatteryCapacity="23000.0000" energyConsumed="0.0000" energyCharged="0.0000" power="-nan(ind)" overheadWireId="" tractionSubstationId="" current="-nan(ind)" circuitVoltage="-nan(ind)" alphaCircuitSolver="-nan(ind)" speed="0.0000" acceleration="0.0000" distance="0.0000" x="36.1600" y="33.7600" z="0.0000" slope="0.0000" lane="-gneE10_0" posOnLane="0.0000"/>
    </timestep>
    <timestep time="1.00">
        <vehicle id="test1" maximumBatteryCapacity="46000.0000" actualBatteryCapacity="23011.1111" energyConsumed="5.0570" energyCharged="11.1111" power="58205.3716" overheadWireId="ovrhdSgmnt_gneE0_0_0" tractionSubstationId="trSubstation1" current="83.1523" circuitVoltage="699.9850" alphaCircuitSolver="1.0000" speed="0.8000" acceleration="0.8000" distance="0.8000" x="-0.6502" y="46.3729" z="0.0000" slope="0.0000" lane="gneE0_0" posOnLane="0.8000"/>
        <vehicle id="test2" maximumBatteryCapacity="46000.0000" actualBatteryCapacity="23011.1111" energyConsumed="5.0570" energyCharged="11.1111" power="58205.3716" overheadWireId="ovrhdSgmnt_-gneE10_0_6" tractionSubstationId="trSubstation2" current="97.0738" circuitVoltage="599.5992" alphaCircuitSolver="1.0000" speed="0.8000" acceleration="0.8000" distance="0.8000" x="36.1308" y="32.9604" z="0.0000" slope="0.0000" lane="-gneE10_0" posOnLane="0.8000"/>
    </timestep>
    ...
</elecHybrid-export-aggregated>    

Time step parameters:

Name Type Description
time int Current timestep

Vehicle parameters:

Name Type Description
id string ID of vehicle that is being powered by the segment
maximumBatteryCapacity float Maximum battery capacity Emax
actualBatteryCapacity float Energy content of the battery in this timestep in Wh
energyConsumed float Energy consumption in this timestep in Wh
energyCharged float Charge received in the current time step from a charging station (Only != 0 if vehicle is exactly at a charging station)
power float Power demand requested from the overhead wire in W
overheadWireId string The id of an overhead wire that is currently powering the vehicle, empty if not under a wire
tractionSubstationId string The substation that is feeding the current overhead wirde, emptyu if not under a wire
current float Current drawn from the overhead wire in A
circuitVoltage float The actual voltage at the connection point of the pantograph / trolley poles in V
alphaCircuitSolver float Circuit solver stabilisation parameter, 0 <= alpha <= 1, 1 in case that the substation is not overloaded and all power demands were satistifed, NaN if not applicable.
speed float Speed of vehicle in this timestep
acceleration float Acceleration of vehicle in this timestep
x float absolute position x of vehicle in the map
y float absolute position y of vehicle in the map
z float absolute position z of vehicle in the map
slope float slope of the edge in degrees
lane string id of the lane that the vehicle is currently on
posOnLane float Position of vehicle on its current lane

If a detailed output of the vehicles has been requiested using <elecHybrid-output.aggregated value="false"/>, the ElectricHybrid output generates a file with the following structure:

<elecHybrid-export maximumBatteryCapacity="46000.00" vehicle="test1">
    <timestep time="0.00" actualBatteryCapacity="23000.0000" energyConsumed="0.0000" energyCharged="0.0000" power="-nan(ind)" overheadWireId="" tractionSubstationId="" current="-nan(ind)" circuitVoltage="-nan(ind)" alphaCircuitSolver="-nan(ind)" speed="0.0000" acceleration="0.0000" distance="0.0000" x="-1.4500" y="46.3800" z="0.0000" slope="0.0000" lane="gneE0_0" posOnLane="0.0000"/>
    <timestep time="1.00" actualBatteryCapacity="23011.1111" energyConsumed="5.0570" energyCharged="11.1111" power="58205.3716" overheadWireId="ovrhdSgmnt_gneE0_0_0" tractionSubstationId="trSubstation1" current="83.1523" circuitVoltage="699.9850" alphaCircuitSolver="1.0000" speed="0.8000" acceleration="0.8000" distance="0.8000" x="-0.6502" y="46.3729" z="0.0000" slope="0.0000" lane="gneE0_0" posOnLane="0.8000"/>
    <timestep time="2.00" actualBatteryCapacity="23022.2222" energyConsumed="9.5487" energyCharged="11.1111" power="74375.3992" overheadWireId="ovrhdSgmnt_gneE0_0_0" tractionSubstationId="trSubstation1" current="106.2593" circuitVoltage="699.9424" alphaCircuitSolver="1.0000" speed="1.6000" acceleration="0.8000" distance="2.4000" x="0.9494" y="46.3586" z="0.0000" slope="0.0000" lane="gneE0_0" posOnLane="2.4000"/>
    ...
</elecHybrid-export>

Vehicle parameters:

Name Type Description
vehicle string ID of vehicle
maximumBatteryCapacity float Maximum battery capacity Emax (Wh)

Timestep parameters:

Name Type Description
time int Current timestep
actualBatteryCapacity float Energy content of the battery in this timestep in Wh
energyConsumed float Energy consumption in this timestep in Wh
energyCharged float Charge received in the current time step from a charging station (Only != 0 if vehicle is exactly at a charging station)
power float Power demand requested from the overhead wire in W
overheadWireId string The id of an overhead wire that is currently powering the vehicle, empty if not under a wire
tractionSubstationId string The substation that is feeding the current overhead wirde, emptyu if not under a wire
current float Current drawn from the overhead wire in A
circuitVoltage float The actual voltage at the connection point of the pantograph / trolley poles in V
alphaCircuitSolver float Circuit solver stabilisation parameter, 0 <= alpha <= 1, 1 in case that the substation is not overloaded and all power demands were satistifed, NaN if not applicable.
speed float Speed of vehicle in this timestep
acceleration float Acceleration of vehicle in this timestep
x float absolute position x of vehicle in the map
y float absolute position y of vehicle in the map
z float absolute position z of vehicle in the map
slope float slope of the edge in degrees
lane string id of the lane that the vehicle is currently on
posOnLane float Position of vehicle on its current lane

Emission Output#

As with electric vehicles, the Emission model-outputs of SUMO can be used together with the ElectricHybrid device when setting the <vType>-parameter emissionClass="Energy/unknown".

Model Details#

All information about the implemented device can be found in our SUMO 2019 paper.

Known Limitations#

Charging Stations#

As the ElectricHybrid device is based on Battery, standard chargers may be in theory used for opportunity charging the vehicle internal energy storage. This funcitonality is howerver not yet supported.

Saving and Loading Simulation State#

The ElectricHybrid device does not currently support saving and loading its internal state.

TraCI#

TraCI connection has not been tested yet and it is probably not functional.

Other Limitations#

As of SUMO 1.4.0 we are aware of the following:

  • current limits are ignore by the traction substaions
  • colormap for coloring the overhead wire voltage is hardcoded
  • mesoscopic mode has not been thoroughly tested
  • placing more than one overhead wire segment on the specific lane has not been thoroughly tested and is not supported yet

Publications#