UK roundabout scene pack
How Lancing Manor Roundabout was compiled from open data into three simulator formats, how it was checked, and what the pack is not. Back to the roundabout.
The verdict
Drives clockwise in esmini; CARLA's map reader agrees.
Compiled from OpenStreetMap, OS Open Roads and Environment Agency LiDAR by rules fixed before the compiler was written. The OpenDRIVE passes the ASAM checker with 0 errors, traffic keeps left on every road and circulates clockwise, 4 of 4 esmini cars drove in, round the ring clockwise and out, and CARLA's map reader agrees (21 lane connections). No car was driven in CARLA. Lane widths are modelled, not measured.
Since this verdict: two CARLA server runs, on 24 and 26 Oct 2026.
The verdict above was fixed before either CARLA run, which is why it says no car was driven in CARLA. Both runs since:
The first CARLA server run, on 24 Oct 2026 (CARLA 0.9.16, on one GPU), failed the bar set before it ran: CARLA's Traffic Manager drove 3 of 4 cars correctly, and the car from S took the first exit, W, instead of going on to N. That result stands.
A second pre-registered CARLA run (26 Oct 2026) separated the cause. With no route point placed at a fork, CARLA's Traffic Manager drove 4 of 4 cars clockwise round the ring and out by the right exit, and a scripted waypoint follower drove the same four routes correctly. The 24 Oct wrong exit was Traffic Manager snapping one route point to the wrong branch at a fork. The pack did not change. Run 2 first repeated the 24 Oct route input unchanged, and the car from S left at W again. One of its route points sat 0.16 m past the fork, where the first waypoints of the ring and of the exit lie within 0.1 mm of each other, so a tiny difference in geometry decides which one Traffic Manager snaps to; the evidence is consistent with that snap, which Traffic Manager does not report. The pass rule was the 24 Oct one, unchanged. Three attempts; the first two are reported, not scored.
What it is
Lancing Manor Roundabout joins the A27 (Upper Brighton Road and Old Shoreham Road), the A2025 Grinstead Lane and Manor Road in Lancing, West Sussex. It was compiled from open data only into an ASAM OpenDRIVE 1.7 road network, an OpenUSD stage and an RDS-HQ archive (the scene format named under sources below), all in one local frame: east, north and up in metres at a fixed anchor. 41 roads, 11 junctions, 75 driving lanes, 1.94 lane kilometres.
Left-hand traffic is encoded with the rule attribute of every <road> (ASAM OpenDRIVE 1.7.0, road attributes; the attribute has been in the standard since OpenDRIVE 1.5), set to LHT. One-way roads hold their driving lanes on the left of the reference line, driven along it; the three two-way roads hold outbound lanes on the left and inbound lanes on the right, driven against it. The circulating carriageway is a set of clockwise arcs on the circle fitted to the OpenStreetMap ring (radius 19.88 m), split at 8 junctions where the arms join and leave.
The tests
The v1 tests and thresholds were committed before the compiler existed (the pre-registration, SHA-256 78ecaf39a3f8). They were amended twice, each time before the code the amendment governs: once before the first compiler, when the OpenStreetMap data showed the ring needs a junction wherever an arm joins or leaves it, and once after the first compiler had run and been reviewed independently, before the second compiler, adding the two-way roads, the overlap test T8 and the rule controls. So T8 and the v2 rules came after the v1 compiler, not before it. Readings made after a run are noted in the same file, and the three that followed a failed or doubtful first reading are flagged in the table: the T3 ring centre, the T2 heading at the splits after the first v2 run failed it, and the split roads retuned after the first v2 run failed T8. The rows marked self-check compare the compile with the data it was made from; they are not a measure of accuracy against the ground.
| Test | Result and bound | Checked by | Verdict |
|---|---|---|---|
| T1 ASAM OpenDRIVE checker | 0 errors (needs 0); 0 warnings, 0 information | ASAM checker | pass |
| T2 Left-hand, clockwise lanes | ring turns −6.283 rad (needs −6.409 to −6.158); 21 lane connections in lane order | Our own reader | pass, heading read in the direction of travel after the first v2 run failed |
| T3 Ring against OS Open Roads (independent) | centres 0.6 m apart (needs 2.0 m or less), on a reading fixed after the run (the vertex mean, 2.6 m, would fail); radius ratio 0.97 (needs within 15 %) | OS Open Roads | pass, on a reading fixed after the run |
| T3 Reference lines against the OSM ways they came from | RMS under 0.1 m, max under 0.2 m (needs RMS 0.30 m and max 0.75 m or less) | Self-check | pass |
| T3 Heights against the DTM they were sampled from | RMS under 0.1 m, max under 0.2 m (needs RMS 0.10 m and max 0.30 m or less); steps under 0.01 m (needs 0.02 m or less) | Self-check | pass |
| T8 No overlapping lanes | largest overlap 0.0 m² (needs 0.5 m² or less per pair) | Our own reader | pass after the split roads were retuned |
| T4 esmini, four cars straight across | 4 of 4 drove in, round the ring clockwise and out (needs 4); 3 came in on a two-way road's inbound lanes | esmini v3.10.2 | pass |
| T5 CARLA's map reader (no car driven) | 21 lane connections (needs 21); clockwise from both ring lanes; 0 of 370 steps on the two-way roads the wrong way | CARLA 0.9.16 map | pass |
| T6 RDS-HQ archive | 12 of 12 components, 300 pose frames; camera 120 degrees wide; map vertices under 0.01 m from the OpenDRIVE (needs 0.01 m or less) | Our own validator | pass |
| T7 OpenUSD stage | 75 lane curves for 75 lanes; 0 validator issues (needs 0) | usd-core, usdchecker | pass |
The four cars in esmini
Four cars, one per entry, at 11.2 m/s, each routed straight across (seed 20261023); 3 of them start on a two-way road's inbound lanes. Each entered, went clockwise round the centre and reached its exit; the angle swept round the centre is reported, never a rule. The same scenario on the same network with the rule set to RHT, and with the rule removed, is the control: reported only, never a rule.
| From | To | Swept clockwise | Reached the exit |
|---|---|---|---|
| Upper Brighton Road | Old Shoreham Road | 125 degrees | yes, at 25.9 s |
| Manor Road | Grinstead Lane | 158 degrees | yes, at 27.4 s |
| Old Shoreham Road | Upper Brighton Road | 131 degrees | yes, at 26.4 s |
| Grinstead Lane | Manor Road | 114 degrees | yes, at 25.2 s |
Against the common tool
Eclipse SUMO netconvert, the converter CARLA's OpenStreetMap import wraps, turns the same OpenStreetMap clip into OpenDRIVE in one command with --lefthand. Exploratory, never a rule: nothing here scores either output.
| What | This pack | netconvert 1.28.0 |
|---|---|---|
| OpenDRIVE version written | 1.7 | 1.4 |
| Roads and driving lanes inside the circle | 41 roads, 75 lanes | 122 roads, 165 lanes |
| The road rule attribute | LHT on 41 roads | absent on 372 roads |
| Driving lanes left and right of the reference line | 71 left, 4 right | 0 left, 165 right |
| Two-way roads | 3 | 0 (each direction a separate road) |
| Road heights | yes, from the EA DTM | no |
| ASAM OpenDRIVE checker | 0 errors; 22 of 23 checkers ran | 0 errors; 10 of 23 checkers ran |
| esmini, four cars straight across | 4 of 4 | 3 of 4 (Grinstead Lane: route not found) |
netconvert's left-hand output carries no rule, gives each direction its own road and puts every lane on the right of its reference line, so keeping left is carried by where the roads are placed, not by the encoding; esmini drove 3 of 4 cars on it. It was not loaded in CARLA. Ours carries rule="LHT" and left lanes, and the controls above show that esmini and CARLA's map reader both honour it. What this pack has that the one-command route does not: tests fixed before the compiler, a byte-reproducible output, one frame across OpenDRIVE, OpenUSD and RDS-HQ, and heights from the Environment Agency. What it lacks against a surveyed digital twin: surveyed widths and kerbs, markings to specification and a rendered 3D world.
Eclipse SUMO (EPL-2.0), run as a tool; nothing from it is in the pack.
The netconvert command
netconvert --osm-files "site.osm" --lefthand --opendrive-output "netconvert/netconvert.xodr" --proj "+proj=tmerc +lat_0=50.836782700 +lon_0=-0.317500300 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs" --offset.disable-normalization --keep-edges.by-vclass passenger --roundabouts.guess --junctions.join --geometry.remove --output.original-names
Widths from the ground, exploratory
36 of 124 cross profiles of the EA 1 m DTM show a kerb on both sides: the ground rising at least 0.06 m over 1.0 m, within 9.0 m of the carriageway's modelled middle. Where both kerbs show, the kerb-to-kerb width reads, against the modelled width: the one-way carriageways 1.23 times (median of 9 of 64 profiles, interquartile 0.96 to 1.40); the two-way roads 1.30 times (median of 15 of 24 profiles, interquartile 1.16 to 1.37); the ring 1.25 times (median of 12 of 36 profiles, interquartile 1.22 to 1.28). Exploratory, never a rule: a 1 m grid good to about 0.15 m in height is near the limit for a kerb, and the modelled widths stay as they are.
So the modelled drivable area is probably too narrow.
The arms against OpenStreetMap
Self-check: the compile against the data it was made from, not accuracy: each arm's reference line against the OpenStreetMap way it was made from.
| Road | OSM way | RMS and max (self-check) | Verdict |
|---|---|---|---|
| Upper Brighton Road, entry | 19069526 | under 0.1 m, under 0.1 m | pass |
| Upper Brighton Road, exit | 972005982 | under 0.1 m, under 0.1 m | pass |
| Manor Road, entry | 793839414 | under 0.1 m, under 0.1 m | pass |
| Manor Road, exit | 180959399 | under 0.1 m, under 0.2 m | pass |
| Old Shoreham Road, entry | 293197149 | under 0.1 m, under 0.1 m | pass |
| Old Shoreham Road, exit | 3176149 | under 0.1 m, under 0.1 m | pass |
| Grinstead Lane, entry | 793839413 | under 0.1 m, under 0.1 m | pass |
| Grinstead Lane, exit | 155589137 | under 0.1 m, under 0.1 m | pass |
| Upper Brighton Road, two-way | 3175700 | under 0.1 m, under 0.1 m | pass |
| Manor Road, two-way | 8150645 | under 0.1 m, under 0.1 m | pass |
| Grinstead Lane, two-way | 180959393 | under 0.1 m, under 0.1 m | pass |
Sources and licences
| Source | Used for | Licence and credit |
|---|---|---|
| OpenStreetMap (Geofabrik West Sussex, 2026-10-20) | The ring, the arms, lane counts and speed limits | © OpenStreetMap contributors, ODbL 1.0 |
| OS Open Roads | The independent check of where the ring sits | Contains OS data © Crown copyright and database right 2026, Open Government Licence v3.0 |
| Environment Agency LiDAR Composite DTM 2022, 1 m (tiles E518000_N104000, E518000_N106000) | Road heights and the ground contours | Contains Environment Agency information © Environment Agency and/or database right, licensed under the Open Government Licence v3.0 |
| RDS-HQ format | The archive's layout | A scene format documented in NVIDIA/cosmos-framework (that documentation is licensed OpenMDW 1.1) |
Tools and versions
- esmini: esmini v3.10.2 (v3.10.2-0-d1d4423b)
- asam qc opendrive: asam-qc-opendrive 1.0.0, asam-qc-baselib 1.1.0
- carla: carla 0.9.16 (Python 3.11.17, client-side map, no server)
- usd core: usd-core 26.11
- usdchecker: Apple USD Tools 0.25.2
- pyproj: pyproj 3.7.2
Assumed, not measured
Lane widths 3.65 m on the arms and two-way roads and 4.5 m round the ring (defaults, not measured). Manor Road has no OpenStreetMap lanes tag, so 1 lane in and 1 out. Kerbs, markings and give way lines sit where the model puts them; the kerbs drawn here are 0.12 m upstands for the picture only, and the pack has no kerb heights, refuges, signs, side roads or crossfall.
The one-way split carriageways are compiled to where each split ends, then the two-way road each pair becomes, out to 150 m; Old Shoreham Road has no split inside the circle and is clipped at 150 m. Lanes of different roads overlap by 0.5 m² or less per pair (T8, largest 0.0 m²). Side roads inside the circle are not compiled and are drawn hatched. Not modelled: kerb heights, footways, refuges, splitter-island shapes, signs other than give way, lighting, crossfall, entry flares, side roads.
What the pack is not
It is not a survey: nothing here was measured by MapMap, and the lane widths are defaults; the EA ground reads the ring about 25% wider than modelled (exploratory, above). It says nothing about collisions or risk at this junction, and it must not be used to judge them.
The pack
lancing-manor-roundabout-v2.1.zip (1.1 MB, SHA-256 406195032eaa), under the Open Database Licence 1.0 with the OS and Environment Agency attributions.
| File | Bytes |
|---|---|
| LICENCE.md | 1,020 |
| README.md | 9,903 |
| lancing-manor.xodr | 115,162 |
| method/PREREGISTRATION.md | 816 |
| scene.usda | 2,876,426 |
| scene.usdc | 510,821 |
| sim/lancing-manor.xosc | 12,254 |
| rds-hq/ (12 tars) | 962,560 |
What runs outside MapMap
Three things run on the pack alone, with public tools: T1, the ASAM OpenDRIVE checker (asam-qc-opendrive 1.0.0 on lancing-manor.xodr); loading it in CARLA's map reader with no server (carla.Map in the 0.9.16 wheel, on Linux with Python 3.11); and an esmini drive, esmini --window 60 60 1280 720 --osc sim/lancing-manor.xosc, run from the pack's sim/ folder.
The pipeline that compiled the pack and runs T2 to T8 is MapMap's own source and is not in the pack, so the pack cannot be rebuilt or fully rechecked outside MapMap. The pack gives the SHA-256 and commit of the rules it was tested against, in method/PREREGISTRATION.md.