Using SUMO With marvis

For simulating the movement of wireless network participants, marvis provides a connection to the SUMO simulator.

There are two ways to use SUMO with marvis. In either way, marvis uses the TraCI Python library to connect to the SUMO instance, running as server.

Variant 1: Install SUMO On Simulation Host

You can install SUMO directly onto the simulation host. On Debian-based machines, this can be achievd by executing:

sudo apt-get install sumo sumo-tools sumo-docs

Important: marvis relies on the TraCI Python library. If you use marvis without Docker, you need to ensure that marvis can find the library. Set the SUMO_HOME environment variable accordingly:

$ export SUMO_HOME="/usr/share/sumo"

Run SUMO In Remote Mode

After that you can start the simulation and load your configuration files. You have to provide a port for TraCI:

$ sumo-gui --remote-port 8813 -c /path/to/configuration

Run SUMO In Local Mode

Prerequesite: This assumes that you are not using marvis in Docker! From within the marvis-container, you cannot start SUMO automatically on the host. To install marvis locally, please see Local Installation Without Docker.

Marvis can start the SUMO simulation for you. You can just pass a config_path to the initializer of the SUMOMobilityInput. The testbed will use a version of SUMO without GUI because there is no way to start the SUMO simulation automatically from marvis with the GUI-version.

Variant 2: Using Docker

SUMO can also be used with Docker. We provide Docker images at the osmhpi/sumo repository that can be used. After pulling the image, the simulation can be started with a new container. Make sure to properly setup your volume mounts.

$ docker run -it --rm \
    --net host \
    --pid host \
    --userns host \
    --privileged \
    --cap-add=ALL \
    --env="DISPLAY" \
    -v "/etc/group:/etc/group:ro" \
    -v "/etc/passwd:/etc/passwd:ro" \
    -v "/etc/shadow:/etc/shadow:ro" \
    -v "/etc/sudoers.d:/etc/sudoers.d:ro" \
    -v "/tmp/.X11-unix:/tmp/.X11-unix:rw" \
    --user=$(id -u) \
    -w /workspace \
    -v /path/to/configuration-folder:/workspace \
    osmhpi/sumo:latest \
    bash

Now you can proceed like in the local installation by entering the command to start SUMO in the container:

sumo-gui --remote-port 8813 -c /workspace/path/to/scenario.sumocfg

Writing a SUMO Scenario With marvis

After installing and starting SUMO, the simulation be configured to use SUMO with the SUMOMobilityInput class. Please configure the port and host accordingly. Furthermore, nodes have to be mapped to SUMO IDs in order to be moved by the co-simulation.

Connect To A SUMO Remote Mode Instance

This example explains how to use marvis with a SUMO server.

Note: If you are using marvis with Docker, you can access a SUMO Remote Mode Instance running on the Docker host with localhost. The container must be in the same network namespace, though. Please have a look at Installation With Docker.

from marvis.mobility_input import SUMOMobilityInput
#...
# Scenario creation
#...
port = 8813 # TraCI is listening on 8813.
sumo = SUMOMobilityInput(name='Some title', sumo_host='hostname-or-ip', sumo_port=port)
sumo.add_node_to_mapping(car, 'car0', obj_type='vehicle')
scenario.add_mobility_input(sumo)
#...
# Simulation run
#...

Connect To A SUMO Local Mode Instance

This example shows how to start SUMO with marvis locally.

from marvis.mobility_input import SUMOMobilityInput
#...
# Scenario creation
#...
config = '/absolute/path/to/sumocfg.cfg'
sumo = SUMOMobilityInput(name='Some title', config_path=config)
sumo.add_node_to_mapping(car, 'car0', obj_type='vehicle')
scenario.add_mobility_input(sumo)
#...
# Simulation run
#...