Skip to content

ADORe and SUMO

This document describes how to get ADORe and SUMO running together using the sumo_bridge ROS 2 node.

sumo_bridge ROS 2 node

The sumo_bridge is a ROS 2 node located in ros2_workspace/src/adore_interfaces/sumo_bridge that bridges SUMO traffic simulation to the ADORe stack via libsumo. SUMO vehicles are published as TrafficParticipantSet messages and the ego vehicle state is injected back into SUMO each simulation step.

Quick Start

Prerequisites

  • ADORe built: make build
  • Lichtblick running: cd tools/Lichtblick && make start

1. Start an interactive ADORe CLI session

make cli

2. Navigate to the simulation scenarios directory

cd adore_scenarios/simulation_scenarios

3. Launch a SUMO scenario

For the synthetic 50 m circle track:

ros2 launch sumo_test.launch.py

For the georeferenced OSM scenario with live traffic:

ros2 launch sumo_example.launch.py

4. Open Lichtblick in a Chromium-based browser Open http://localhost:8080/?ds=rosbridge-websocket&ds.url=ws://localhost:9090&layout=Default.json in a Chromium-based browser.

Configuration via Environmental Variables

All variables are set in adore.env.

Variable Default Description
SUMO_BRIDGE_ENABLE false Set to true to start the bridge
SUMO_CONFIG_DIRECTORY ros2_workspace/src/adore_interfaces/sumo_bridge/sumo_configs Path relative to SOURCE_DIRECTORY containing .sumocfg files
SUMO_BRIDGE_CONFIG_FILE demo_sumo_bridge.sumocfg Config filename. Sets SUMO_CONFIG_FILE in adore.env
SUMO_HOME /usr/share/sumo Path to SUMO installation

ROS Parameters

Parameter Type Default Description
sumo_config_file string "" Absolute path to the .sumocfg file. Required.
sumo_step_length double 0.05 SUMO simulation step length in seconds
use_gui bool false Launch sumo-gui instead of headless sumo. Starts immediately without requiring the play button.
gui_settings_file string "" Path to a SUMO GUI settings XML file
gui_zoom double 5000.0 Initial zoom level for sumo-gui (percentage; 5000 ≈ 10 m street level)
gui_follow_ego bool true Whether sumo-gui tracks and follows the ego vehicle
ego_start_position string "" Ego start position as "lat,lon,psi" (psi in radians CCW from east). Derives UTM zone/letter and SUMO coordinates automatically. Required for georeferenced scenarios; omit for local coordinate scenarios.
ego_tracking_id int 0 Tracking ID of the ego vehicle, used for GUI follow and color assignment
ego_vehicle_color string "255,255,0" Ego vehicle color as "R,G,B" or "R,G,B,A" with values 0–255
utm_zone int 32 UTM zone number. Used only when ego_start_position is not set.
utm_letter string "U" UTM zone letter. Used only when ego_start_position is not set.
use_geo_conversion bool true When false, bypasses UTM/geo conversion and treats all coordinates as SUMO-local. Set to false for synthetic scenarios.
initial_traffic_count int 0 Number of SUMO traffic vehicles to spawn ahead of the ego at startup
initial_traffic_spacing double 20.0 Distance in metres between each spawned traffic vehicle

Topics

Topic Type Direction Description
traffic_participants TrafficParticipantSet publish SUMO vehicles converted to ADORe traffic participants
vehicle_state/traffic_participant TrafficParticipant subscribe Ego vehicle state injected into SUMO each step

Scenarios

Two example scenarios are provided.

circle50m (sumo_test.launch.py)

A synthetic 50 m radius circular track with no real-world georeferencing. Uses local SUMO coordinates directly with use_geo_conversion: false.

SUMO GUI ADORe / Lichtblick
SUMO 50m circle scenario ADORe 50m circle scenario in Lichtblick
make cli
cd adore_scenarios/simulation_scenarios
ros2 launch sumo_bridge sumo_test.launch.py

OSM example scenario (sumo_example.launch.py)

A georeferenced OpenStreetMap scenario. The ego start and goal are specified as lat/lon coordinates. Initial traffic vehicles are spawned ahead of the ego and follow randomised routes through the network including roundabouts.

SUMO GUI ADORe / Lichtblick
SUMO example scenario ADORe example scenario in Lichtblick
make cli
cd adore_scenarios/simulation_scenarios
ros2 launch sumo_bridge sumo_example.launch.py

Clock Synchronisation

The bridge synchronises SUMO simulation time to the ROS wall clock. Reference times are captured after the first simulation step completes, ensuring both clocks are anchored at the same point. When use_gui is true, the --start flag is passed to sumo-gui so the simulation begins immediately without requiring the play button.

Coordinate Conventions

Convention Details
ROS yaw (yaw_angle) Radians, counter-clockwise from east
SUMO heading Degrees, clockwise from north
SUMO getPosition Returns front bumper; the bridge offsets by half vehicle length to publish and consume centre positions
Geo conversion convertGeo(lon, lat, ...) -- argument order is longitude first

Initial Traffic Spawning

When initial_traffic_count > 0 the bridge spawns SUMO-controlled vehicles ahead of the ego at startup. Spawn positions are walked along the actual lane geometry so vehicles land on the road regardless of curvature. Each vehicle receives a unique randomised route built by walking the routing graph forward from its spawn edge, weighted toward higher speed-limit roads. Routes are deterministic per vehicle ID across runs.