Commit ffb0e962 authored by Moritz Klischat's avatar Moritz Klischat
Browse files

major revision; added interface to dockerized sumo installation

parent a7c6405c
pathConfig.py
scenarios/*
build/
dist/
.vscode
## Video files
*.mp4
## Core latex/pdflatex auxiliary files:
*.aux
......@@ -208,7 +214,7 @@ TSWLatexianTemp*
# build files doc
tools/Python/commonroad/doc/build/*
# auto folder when using emacs and auctex
# auto folder when using emacs and auctex
/auto/*
# python
......@@ -217,3 +223,8 @@ tools/Python/commonroad/doc/build/*
*pytest_cache/
*.egg-info
# PyCharm
*.idea/
tests/outputs/
src/
include sumocr/sumo_config/.sumo.cfg
prune tests*
# SUMO - CommonRoad Interface
This package implements the interface between the framework for motion planning of automated vehicles [CommonRoad_io](https://pypi.org/project/commonroad-io/) and the traffic simulator [SUMO](https://sumo.dlr.de). The interface is presented in detail in our [paper](https://mediatum.ub.tum.de/doc/1486856/344641.pdf) [1] and a documentation of the API can be found [here]( https://commonroad.in.tum.de/static/docs/commonroad-sumo-interface/index.html).
This package implements the interface between the framework for motion planning of automated vehicles [CommonRoad_io](https://pypi.org/project/commonroad-io/) and the traffic simulator [SUMO](https://sumo.dlr.de). The interface is presented in detail in our [paper](https://mediatum.ub.tum.de/doc/1486856/344641.pdf) [1] and a documentation of the API can be found [here](https://commonroad.in.tum.de/static/docs/commonroad-sumo-interface/index.html).
# Prerequisites
The package is written in Python 3.6 and tested on Linux.
The package is written in Python 3.7 and tested on Linux.
Install required packages:
```console
```bash
cd sumo-interface
pip install -r requirements.txt
sudo apt-get install ffmpeg
......@@ -15,80 +17,79 @@ And add the absolute path of `commonroad-sumo-interface` to your Python interpre
## Install SUMO
Clone a customized version of SUMO for smooth lane changes from https://github.com/mo-kli/sumo and check out branch `smooth-lane-change`.
For installation we recommend building with:
Clone a customized version of SUMO for smooth lane changes from https://github.com/octavdragoi/sumo and check out branch `smooth-lane-change`.
For installation we recommend building with (tested with Ubuntu 18.04):
```
```bash
sudo apt-get install cmake python g++ libxerces-c-dev libfox-1.6-dev libgdal-dev libproj-dev libgl2ps-dev swig
cd sumo
export SUMO_HOME="$PWD/sumo"
mkdir build && cd build
cd build
cmake ..
make -j8
```
More options on the installation can be found here: https://sumo.dlr.de/wiki/Installing/Linux_Build .
## Configure SUMO and local environment
copy the file `pathConfig_DEFAULT.py` and rename it to `pathConfig.py`. Add local paths, if required.
# Integrating the SUMO-interface with CommonRoad
# Integrating the SUMO-interface into CommonRoad
- All scenarios are stored in `/scenarios`. All files for each scenario must be named consistently with the same scenario name as the folder.
- the default config file with all options for the simulation can be found in `/config/default.py`.
- the default config file with all options for the simulation can be found in `/config/default.py`. All Scenario specific configs inherit from it.
## Install as Library
This package can be manually installed by running:
```bash
pip install .
```
Then imported with:
```python
import sumocr # OR
from sumocr.interface.sumo_simulation import SumoSimulation
```
## Configure SUMO and local environment
To run the library the environment variable `$SUMO_HOME` needs to be defined in the running context.
## Convert maps
Before using the interface, a map needs to be available in CommonRoad xml and SUMO's .net.xml format. Currently only the conversion from .net.xml to commonroad format is implemented. For an example see `example_scripts/create_scenario_files.py`.
## Create .rou.xml files
Before using the interface, a map needs to be available SUMO's `.net.xml` format, with a corresponding `.sumo.cfg` file.
These files can be optionally generated using the converter in
[crmapconverter](https://gitlab.lrz.de/cps/commonroad-map-tool/).
For an example see: `example_files/minimal_example.py`
<!-- This is now in crmapconverter -->
<!-- ## Create .rou.xml files
.rou.xml files specify all vehicles for the simulation. An introduction can be found here: https://sumo.dlr.de/wiki/Tutorials/quick_start#Traffic_demand.
To use the interface for planning with ego vehicles, the vehicle ID in the .rou.xml file needs to start with the prefix `egoVehicle`.
A simple script to create .rou.xml files using https://sumo.dlr.de/wiki/Tools/Trip is implemented in the function
`ScenarioWrapper.recreate_route_file()`. See `example_scripts/create_scenario_files.py` for an example.
`ScenarioWrapper.recreate_route_file()`. See `example_scripts/create_scenario_files.py` for an example. -->
## Configure SUMO and sumo-interface
To use smooth lane changes, add
~~~~
```xml
<processing>
<time-to-teleport value="-1"/>
<lanechange-output value="output_lanechange.txt"/>
<lanechange.duration value="10"/>
<lanechange.smooth-change value="1"/>
</processing>
~~~~
to the .sumo.cfg file of the scenario (activated by default for scenarios generated by the class `ScenarioWrapper`).
Further options for the interface can be found in the sumo-interface config file `sumo-interface/config/default.py`.
## Minimal example for using the interface:
The file `example_scripts/minimal_example.py` gives an example how the interface can be integrated into an existing trajectory planner.
Plug in a trajectory planner and run:
```python
from sumo2cr.interface.sumo_simulation import SumoSimulation
from sumo2cr.visualization.video import create_video
from scenarios.a9.scenario_config import Conf as conf
sumo_sim = SumoSimulation()
sumo_sim.initialize(conf)
output_folder = "/path/to/output_folder"
```
for t in range(conf.simulation_steps):
ego_vehicles = sumo_sim.ego_vehicles
commonroad_scenario = sumo_sim.commonroad_scenario_at_time_step(sumo_sim.current_time_step)
to the `.sumo.cfg` file of the scenario (activated by default for scenarios generated by the class `ScenarioWrapper`).
# plan trajectories for all ego vehicles
for id, ego_vehicle in ego_vehicles.items():
current_state = ego_vehicle.current_state
ego_trajectory = # plug in trajectory planner here
ego_vehicle.set_planned_trajectory(ego_trajectory)
Further options for the interface can be found in the sumo-interface config file `config/default.py`.
sumo_sim.simulate_step()
## Minimal example for using the interface:
sumo_sim.stop()
create_video(sumo_sim, conf.video_start, conf.video_end, output_folder)
```
The file `example_scripts/minimal_example.py` gives an example how the interface can be integrated into an existing trajectory planner.
## Troubleshooting
* `Error: No option with the name 'lanechange.smooth-change' exists.`: Make SUMO is installed correctly and the SUMO_HOME variable is set to the path where SUMO is installed. If you don't want to use the continous lane change, delete the corresponding line from the *.cfg file.
[1] Moritz Klischat, Octav Dragoi, Mostafa Eissa, and Matthias Althoff, Coupling SUMO with a Motion Planning Framework for Automated Vehicles, SUMO 2019: Simulating Connected Urban Mobility
[1] _Moritz Klischat, Octav Dragoi, Mostafa Eissa, and Matthias Althoff, Coupling SUMO with a Motion Planning Framework for Automated Vehicles, SUMO 2019: Simulating Connected Urban Mobility_
\ No newline at end of file
......@@ -2,51 +2,47 @@
Converts net.xml to Commonroad xml files and creates rou files for simulation.
"""
import os
import matplotlib.pyplot as plt
from typing import List
from commonroad.visualization.draw_dispatch_cr import draw_object
from sumo2cr.maps.sumo_scenario import ScenarioWrapper
from commonroad.common.util import Interval
from commonroad.scenario.trajectory import State
import os
from sumocr.maps.sumo_scenario import ScenarioWrapper
from scenarios.a9.scenario_config import Conf as conf
__author__ = "Moritz Klischat"
__copyright__ = "TUM Cyber-Physical Systems Group"
__credits__ = ["ZIM Projekt ZF4086007BZ8"]
__version__ = "1.0.0"
__version__ = "2021.1"
__maintainer__ = "Moritz Klischat"
__email__ = "commonroad-i06@in.tum.de"
__status__ = "Released"
scenario_folder = os.path.join(os.path.dirname(__file__),'../scenarios')
scenario_folder = os.path.join(os.path.dirname(__file__), '../scenarios')
net_file = os.path.join(scenario_folder, 'a9/a9.net.xml')
sumo_cfg_file = os.path.join(scenario_folder, 'a9/a9.sumo.cfg')
net_file = os.path.join(scenario_folder, 'a9', 'a9.net.xml')
sumo_cfg_file = os.path.join(scenario_folder, 'a9', 'a9.sumo.cfg')
# parameters
dt = 0.1
convert_map = True
n_vehicles_max:int = 30
veh_per_second = 50
n_ego_vehicles:int = 1
ego_ids:List[int] = []
initial_states:List[State] = []
ego_start_time:int=10
departure_time_ego = 3
departure_interval_vehicles = Interval(0,20)
cr_map_path = None # if no cr map file is specified, a cr map will be automatically converted by opendrive
if convert_map:
# generate commonroad map + rou file + cfg file
scenario = ScenarioWrapper.full_conversion_from_net(net_file, dt, n_vehicles_max, n_ego_vehicles, ego_ids, ego_start_time, departure_time_ego, departure_interval_vehicles,veh_per_second)
# generate commonroad map + add file + rou file + cfg file
scenario = ScenarioWrapper.init_from_net_file(net_file, cr_map_path, conf)
else:
# generate rou file
scenario = ScenarioWrapper.recreate_route_file(sumo_cfg_file, dt, n_vehicles_max, n_ego_vehicles, ego_ids, ego_start_time, departure_time_ego, departure_interval_vehicles,veh_per_second)
scenario = ScenarioWrapper.recreate_route_file(sumo_cfg_file, conf)
plt.figure(figsize=(25, 25))
draw_object(scenario.lanelet_network)
plt.autoscale()
plt.axis('equal')
plt.xlim([290,380])
plt.ylim([195,250])
plt.xlim([290, 380])
plt.ylim([195, 250])
plt.show()
\ No newline at end of file
"""
Minimal example, plugging in of trajectory planner required.
"""
from sumo2cr.interface.sumo_simulation import SumoSimulation
from sumo2cr.visualization.video import create_video
from scenarios.a9.scenario_config import Conf as conf
import copy
import os
from typing import List
from commonroad.scenario.trajectory import State
from commonroad.common.file_reader import CommonRoadFileReader
from commonroad.common.file_writer import CommonRoadFileWriter
from sumocr.interface.sumo_simulation import SumoSimulation
from sumocr.maps.sumo_scenario import ScenarioWrapper
from sumocr.visualization.video import create_video
from scenarios.garching.scenario_config import Conf
__author__ = "Moritz Klischat"
__copyright__ = "TUM Cyber-Physical Systems Group"
__credits__ = ["ZIM Projekt ZF4086007BZ8"]
__version__ = "1.0.0"
__version__ = "2021.1"
__maintainer__ = "Moritz Klischat"
__email__ = "commonroad-i06@in.tum.de"
__status__ = "Released"
sumo_sim = SumoSimulation()
sumo_sim.initialize(conf)
config = Conf()
cr_file = os.path.abspath(
os.path.join(os.path.dirname(__file__), '..', 'scenarios',
config.scenario_name, config.scenario_name + '.cr.xml'))
# Change this as you see fit
output_folder = os.path.dirname(cr_file)
print("Reading file:", cr_file, " Outputing to folder:", output_folder)
output_folder = "/path/to/output_folder"
scenario, _ = CommonRoadFileReader(cr_file).open()
wrapper = ScenarioWrapper.init_from_scenario(config, cr_map_file=cr_file)
for t in range(conf.simulation_steps):
##
## SIMULATION
##
sumo_sim = SumoSimulation()
sumo_sim.initialize(config, wrapper)
for t in range(config.simulation_steps):
ego_vehicles = sumo_sim.ego_vehicles
commonroad_scenario = sumo_sim.commonroad_scenario_at_time_step(sumo_sim.current_time_step)
commonroad_scenario = sumo_sim.commonroad_scenario_at_time_step(
sumo_sim.current_time_step)
# plan trajectories for all ego vehicles
for id, ego_vehicle in ego_vehicles.items():
current_state = ego_vehicle.current_state
ego_trajectory = # plug in a trajectory planner here
# plug in a trajectory planner here, currently staying on initial state
next_state = copy.deepcopy(current_state)
next_state.time_step = 1
ego_trajectory: List[State] = [next_state]
ego_vehicle.set_planned_trajectory(ego_trajectory)
sumo_sim.simulate_step()
sumo_sim.stop()
create_video(sumo_sim, conf.video_start, conf.video_end, output_folder)
##
## WRITE TO FILE
##
print("Done simulating")
simulated_scenario = sumo_sim.commonroad_scenarios_all_time_steps()
CommonRoadFileWriter(simulated_scenario,
None,
author=scenario.author,
affiliation=scenario.affiliation,
source=scenario.source,
tags=scenario.tags,
location=scenario.location).write_scenario_to_file(
os.path.join(
output_folder,
config.scenario_name + ".simulated.xml"),
overwrite_existing_file=True)
# create_video(sumo_sim, config.video_start, config.video_end, output_folder)
"""
Tutorial script, which
-converts a CommonRoad (cr) lanelet_network from an .xml file to a sumo net file .net.xml,
-creates rou files and an additional configuration file for sumo simulation,
-uses net file and rou file to start a sumo simulation with an ego vehicle.
"""
import argparse
import os
import sys
from commonroad.common.file_reader import CommonRoadFileReader
from sumocr.maps.sumo_scenario import ScenarioWrapper
from sumocr.interface.sumo_simulation import SumoSimulation
from sumocr.maps.util import get_scenario_name_from_crfile
from sumocr.sumo_config import DefaultConfig
from sumocr.visualization.video import create_video
__author__ = "Peter Kocsis"
__copyright__ = "TUM Cyber-Physical System Group"
__credits__ = []
__version__ = "0.1"
__maintainer__ = "Moritz Klischat"
__email__ = "moritz.klischat@tum.de"
__status__ = "Integration"
def simulate_map_argsparser() -> argparse.ArgumentParser:
"""Returns a parser for the script's arguments"""
parser = argparse.ArgumentParser()
parser.add_argument(
"-i", "--input_scenario", type=str,
default="./scenarios/DEU_A9-1_1_T-1/DEU_A9-1_1_T-1.cr.xml",
help="Path to the CommonRoad scenario"
)
parser.add_argument(
"-o", "--output", type=str, default=None, help="Output folder path",
)
parser.add_argument(
"-v", "--video", action="store_true", default=False, help="Create video",
)
return parser
def simulate_cr_map(cr_scenario_file: str, output_folder_path: str = None, creating_video: bool = False):
assert not creating_video or output_folder_path is not None, \
"The output folder path was not defined for video creation"
if output_folder_path is None:
output_folder_path = os.path.dirname(cr_scenario_file)
conf = DefaultConfig()
conf.scenario_name = get_scenario_name_from_crfile(cr_scenario_file)
conf.n_ego_vehicles = 0
conf.ego_ids = []
conf.scenarios_path = output_folder_path
# convert commonroad xml to sumo net file, then generate add file + rou file + cfg file
scenario_wrapper = ScenarioWrapper.init_from_cr_file(cr_scenario_file, conf)
# start sumo simulation with ego vehicles
sumo_sim = SumoSimulation()
sumo_sim.initialize(conf, scenario_wrapper=scenario_wrapper)
for t in range(conf.simulation_steps):
sumo_sim.simulate_step()
sumo_sim.stop()
if creating_video:
print(f"Creating video {cr_scenario_file}")
create_video(sumo_sim, conf.video_start, conf.video_end, output_folder_path)
print(f"Video {cr_scenario_file} created")
if __name__ == '__main__':
arguments = simulate_map_argsparser().parse_args(sys.argv[1:])
simulate_cr_map(cr_scenario_file=arguments.input_scenario,
output_folder_path=arguments.output,
creating_video=arguments.video)
'''
Copy this file and rename to path_config.py, afterwards set paths according to your local configuration
'''
# set installation locations
SUMO_GUI_BINARY = '/usr/bin/sumo-gui'
# path to binary of adapted sumo repository (see readme)
SUMO_BINARY = '/home/user/sumo/bin/sumo'
# by default port 8873 is used, you can modify the port number
TRACI_PORT = 8873
# default files (no adaption required)
DEFAULT_CFG_FILE = 'sumo_config/.sumo.cfg'
\ No newline at end of file
commonroad-io>=2019.2
opendrive2lanelet>=1.2.0
numpy>=1.13
lxml>=4.2.2
Pillow>=7.0.0
commonroad-io>=2021.1
# docker_sumo
shapely==1.7.0
opendrive2lanelet==1.1.0
grpcio==1.27.2
docker>=4.2.0
packaging>=20.3
ffmpeg==1.4
matplotlib>=3.3.3
ipython
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<!-- generated on Tue Apr 9 09:42:51 2019 by Eclipse SUMO netconvert Version 1.1.0
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/netconvertConfiguration.xsd">
<input>
<osm-files value="a9_half.osm"/>
</input>
<output>
<output-file value="a9.net.xml"/>
</output>
<projection>
<proj.utm value="true"/>
</projection>
</configuration>
-->
<net version="1.1" junctionCornerDetail="5" limitTurnSpeed="5.50" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/net_file.xsd">
<location netOffset="-691600.34,-5363834.90" convBoundary="0.00,0.00,225.33,2328.92" origBoundary="11.589690,48.398466,11.591668,48.419466" projParameter="+proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m +no_defs"/>
<type id="highway.bridleway" priority="1" numLanes="1" speed="2.78" allow="pedestrian" oneway="1" width="2.00"/>
<type id="highway.bus_guideway" priority="1" numLanes="1" speed="27.78" allow="bus" oneway="1"/>
<type id="highway.cycleway" priority="1" numLanes="1" speed="8.33" allow="bicycle" oneway="0" width="1.00"/>
<type id="highway.footway" priority="1" numLanes="1" speed="2.78" allow="pedestrian" oneway="1" width="2.00"/>
<type id="highway.ford" priority="1" numLanes="1" speed="2.78" allow="army" oneway="0"/>
<type id="highway.living_street" priority="3" numLanes="1" speed="2.78" disallow="tram rail_urban rail rail_electric ship" oneway="0"/>
<type id="highway.motorway" priority="13" numLanes="2" speed="44.44" allow="private emergency authority army vip passenger hov taxi bus coach delivery truck trailer motorcycle evehicle custom1 custom2" oneway="1"/>
<type id="highway.motorway_link" priority="12" numLanes="1" speed="22.22" allow="private emergency authority army vip passenger hov taxi bus coach delivery truck trailer motorcycle evehicle custom1 custom2" oneway="1"/>
<type id="highway.path" priority="1" numLanes="1" speed="2.78" allow="bicycle pedestrian" oneway="1" width="2.00"/>
<type id="highway.pedestrian" priority="1" numLanes="1" speed="2.78" allow="pedestrian" oneway="1" width="2.00"/>
<type id="highway.primary" priority="9" numLanes="2" speed="27.78" disallow="tram rail_urban rail rail_electric ship" oneway="0"/>
<type id="highway.primary_link" priority="8" numLanes="1" speed="22.22" disallow="tram rail_urban rail rail_electric ship" oneway="0"/>
<type id="highway.raceway" priority="14" numLanes="2" speed="83.33" allow="vip" oneway="0"/>
<type id="highway.residential" priority="4" numLanes="1" speed="13.89" disallow="tram rail_urban rail rail_electric ship" oneway="0"/>
<type id="highway.secondary" priority="7" numLanes="2" speed="27.78" disallow="tram rail_urban rail rail_electric ship" oneway="0"/>
<type id="highway.secondary_link" priority="6" numLanes="1" speed="22.22" disallow="tram rail_urban rail rail_electric ship" oneway="0"/>
<type id="highway.service" priority="2" numLanes="1" speed="5.56" allow="delivery bicycle pedestrian" oneway="0"/>
<type id="highway.stairs" priority="1" numLanes="1" speed="1.39" allow="pedestrian" oneway="1" width="2.00"/>
<type id="highway.step" priority="1" numLanes="1" speed="1.39" allow="pedestrian" oneway="1" width="2.00"/>
<type id="highway.steps" priority="1" numLanes="1" speed="1.39" allow="pedestrian" oneway="1" width="2.00"/>
<type id="highway.tertiary" priority="6" numLanes="1" speed="22.22" disallow="tram rail_urban rail rail_electric ship" oneway="0"/>
<type id="highway.tertiary_link" priority="5" numLanes="1" speed="22.22" disallow="tram rail_urban rail rail_electric ship" oneway="0"/>
<type id="highway.track" priority="1" numLanes="1" speed="5.56" disallow="tram rail_urban rail rail_electric ship" oneway="0"/>
<type id="highway.trunk" priority="11" numLanes="2" speed="27.78" disallow="tram rail_urban rail rail_electric bicycle pedestrian ship" oneway="0"/>
<type id="highway.trunk_link" priority="10" numLanes="1" speed="22.22" disallow="tram rail_urban rail rail_electric bicycle pedestrian ship" oneway="0"/>
<type id="highway.unclassified" priority="5" numLanes="1" speed="13.89" disallow="tram rail_urban rail rail_electric ship" oneway="0"/>
<type id="highway.unsurfaced" priority="1" numLanes="1" speed="8.33" disallow="tram rail_urban rail rail_electric ship" oneway="0"/>
<type id="railway.light_rail" priority="15" numLanes="1" speed="27.78" allow="rail_urban" oneway="1"/>
<type id="railway.preserved" priority="15" numLanes="1" speed="27.78" allow="rail" oneway="1"/>
<type id="railway.rail" priority="15" numLanes="1" speed="83.33" allow="rail rail_electric" oneway="1"/>
<type id="railway.subway" priority="15" numLanes="1" speed="27.78" allow="rail_urban" oneway="1"/>
<type id="railway.tram" priority="15" numLanes="1" speed="13.89" allow="tram" oneway="1"/>
<edge id="135586672" from="285950480" to="2469933641" priority="13" type="highway.motorway" spreadType="center" shape="225.33,0.00 197.88,71.39 183.54,107.76 168.89,146.90 141.29,240.08 127.21,292.11 115.01,347.57 103.22,402.06 93.47,455.43 76.70,572.92 70.47,636.13 68.01,693.26 40.85,1387.15 15.62,1875.01 3.14,2259.73 0.00,2328.92">
<lane id="135586672_0" index="0" allow="private emergency authority army vip passenger hov taxi bus coach delivery truck trailer motorcycle evehicle custom1 custom2" speed="83.33" length="2351.74" shape="229.81,1.72 202.35,73.14 188.02,109.48 173.44,148.42 145.91,241.38 131.87,293.25 119.70,348.59 107.93,403.00 98.21,456.20 81.46,573.49 75.26,636.47 72.80,693.46 45.65,1387.37 20.42,1875.21 7.94,2259.91 4.80,2329.14"/>
<lane id="135586672_1" index="1" allow="private emergency authority army vip passenger hov taxi bus coach delivery truck trailer motorcycle evehicle custom1 custom2" speed="83.33" length="2351.74" shape="226.83,0.57 199.37,71.98 185.03,108.34 170.41,147.41 142.83,240.51 128.77,292.49 116.57,347.91 104.79,402.37 95.05,455.69 78.28,573.11 72.06,636.24 69.61,693.32 42.45,1387.22 17.22,1875.07 4.74,2259.79 1.60,2328.99"/>
<lane id="135586672_2" index="2" allow="private emergency authority army vip passenger hov taxi bus coach delivery truck trailer motorcycle evehicle custom1 custom2" speed="83.33" length="2351.74" shape="223.84,-0.57 196.39,70.81 182.04,107.19 167.37,146.39 139.75,239.64 125.66,291.72 113.44,347.23 101.65,401.75 91.89,455.17 75.11,572.72 68.87,636.02 66.41,693.19 39.26,1387.08 14.02,1874.94 1.54,2259.66 -1.60,2328.85"/>
<lane id="135586672_3" index="3" allow="private emergency authority army vip passenger hov taxi bus coach delivery truck trailer motorcycle evehicle custom1 custom2" speed="83.33" length="2351.74" shape="220.85,-1.72 193.41,69.65 179.05,106.04 164.33,145.37 136.67,238.77 122.55,290.96 110.32,346.55 98.51,401.12 88.73,454.66 71.93,572.34 65.68,635.79 63.21,693.06 36.06,1386.93 10.83,1874.80 -1.66,2259.54 -4.80,2328.70"/>
</edge>
<junction id="2469933641" type="dead_end" x="0.00" y="2328.92" incLanes="135586672_0 135586672_1 135586672_2 135586672_3" intLanes="" shape="6.39,2329.21 -6.39,2328.63"/>
<junction id="285950480" type="dead_end" x="225.33" y="0.00" incLanes="" intLanes="" shape="219.36,-2.30 231.31,2.30"/>
</net>
<?xml version="1.0" encoding="UTF-8"?>
<!-- generated on Tue Apr 9 16:49:51 2019 by Eclipse SUMO duarouter Version 1.1.0
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/duarouterConfiguration.xsd">
<input>
<net-file value="/home/klischat/GIT_REPOS/sumo-interface/scenarios/a9/a9.net.xml"/>
<route-files value="/home/klischat/GIT_REPOS/sumo-interface/scenarios/a9/a9.trips.xml"/>
</input>
<output>
<output-file value="/home/klischat/GIT_REPOS/sumo-interface/scenarios/a9/a9.rou.xml"/>
<alternatives-output value="/home/klischat/GIT_REPOS/sumo-interface/scenarios/a9/a9.rou.alt.xml"/>
</output>
<time>
<begin value="0.0"/>
<end value="20.0"/>
</time>
<report>
<no-warnings value="true"/>
<ignore-errors value="true"/>
<no-step-log value="true"/>
</report>
</configuration>
-->
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/routes_file.xsd">
<vehicle id="0" depart="0.00" departLane="free" departPos="base" departSpeed="random">
<routeDistribution last="0">
<route cost="42.33" probability="1.00000000" edges="135586672"/>
</routeDistribution>
</vehicle>
<vehicle id="1" depart="0.59" departLane="free" departPos="base" departSpeed="random">
<routeDistribution last="0">
<route cost="42.33" probability="1.00000000" edges="135586672"/>
</routeDistribution>
</vehicle>
<vehicle id="2" depart="1.18" departLane="free" departPos="base" departSpeed="random">
<routeDistribution last="0">
<route cost="42.33" probability="1.00000000" edges="135586672"/>
</routeDistribution>
</vehicle>
<vehicle id="3" depart="1.76" departLane="free" departPos="base" departSpeed="random">
<routeDistribution last="0">
<route cost="42.33" probability="1.00000000" edges="135586672"/>
</routeDistribution>
</vehicle>
<vehicle id="4" depart="2.35" departLane="free" departPos="base" departSpeed="random">
<routeDistribution last="0">
<route cost="42.33" probability="1.00000000" edges="135586672"/>
</routeDistribution>
</vehicle>
<vehicle id="5" depart="2.94" departLane="free" departPos="base" departSpeed="random">
<routeDistribution last="0">
<route cost="42.33" probability="1.00000000" edges="135586672"/>
</routeDistribution>
</vehicle>
<vehicle id="6" depart="3.53" departLane="free" departPos="base" departSpeed="random">
<routeDistribution last="0">
<route cost="42.33" probability="1.00000000" edges="135586672"/>
</routeDistribution>
</vehicle>
<vehicle id="7" depart="4.12" departLane="free" departPos="base" departSpeed="random">
<routeDistribution last="0">
<route cost="42.33" probability="1.00000000" edges="135586672"/>
</routeDistribution>
</vehicle>
<vehicle id="8" depart="4.71" departLane="free" departPos="base" departSpeed="random">
<routeDistribution last="0">
<route cost="42.33" probability="1.00000000" edges="135586672"/>
</routeDistribution>
</vehicle>
<vehicle id="9" depart="5.29" departLane="free" departPos="base" departSpeed="random">
<routeDistribution last="0">