Quickstart#

This page loads a geographic scene, places a transmitter at a latitude and longitude, and solves a terrain-following radio map with the upstream Sionna RT API.

1. Load a scene from coordinates#

Only the import changes compared with a Sionna file scene. The loader compiles the area around the requested centre, caches it, and returns a native sionna.rt.Scene:

from openworld_radio_twin import rt as owrt

scene = owrt.load_scene(
    latitude=52.3762,
    longitude=4.8993,
    radius_m=250,
    buildings="auto",          # "auto" | "none"
    building_source="auto",    # regional source picked from the scene centre
    terrain="elevation",       # "elevation" | "flat" | "none"
    material_profile="itu",    # "itu" | "uniform"
    terrain_resolution_m=5.0,
    device="auto",             # "auto" | "cuda" | "cpu"
)

The first call downloads buildings, terrain and surface features for the square ENU domain of side 2 * radius_m; later calls with the same geometry options reuse the cached scene directory. owrt.cache_path(...) reports that directory without compiling.

2. Configure arrays and place a transmitter#

Arrays and radio devices are plain Sionna objects. The only OWRT helper is owrt.position(...), which converts a WGS84 position and a height above ground into the absolute ENU coordinates that Sionna expects:

from sionna.rt import PlanarArray, Transmitter

scene.tx_array = PlanarArray(num_rows=1, num_cols=1, pattern="iso", polarization="V")
scene.rx_array = PlanarArray(num_rows=1, num_cols=1, pattern="iso", polarization="V")

scene.add(Transmitter(
    name="tx",
    position=owrt.position(scene, latitude=52.3770, longitude=4.9003, height_agl=25.0),
))

3. Solve a terrain-following radio map#

owrt.measurement_surface(...) returns a Mitsuba mesh that follows the compiled terrain at a constant height above ground. Pass it to Sionna’s RadioMapSolver as the measurement surface:

from sionna.rt import RadioMapSolver

radio_map = RadioMapSolver()(
    scene,
    measurement_surface=owrt.measurement_surface(scene, cell_size=(5.0, 5.0), height=1.5),
    max_depth=3,
    samples_per_tx=1_000_000,
)

From here on, everything is Sionna: radio_map.rss, radio_map.path_gain, scene.render(...), scene.preview(), PathSolver, and so on.

4. Georeference results#

Convert between the scene’s local frame and WGS84 with the restored transform:

frame = owrt.scene_frame(scene)
longitude, latitude, altitude = frame.to_geographic(east_m=120.0, north_m=-40.0)
ground = owrt.terrain_elevation(scene, east_m=120.0, north_m=-40.0)

5. Reuse the scene offline#

The command line writes the same canonical scene layout that batch generation uses:

owrt scene compile --lat 52.3762 --lon 4.8993 --radius 250 --output scenes/amsterdam

The printed scene.xml path loads with owrt.load_scene("scenes/amsterdam/scene.xml") or, without OWRT helpers, with Sionna’s own load_scene.

Where to go next#

  • Scenes explains each scene option and what it records.

  • Sionna RT covers propagation controls and the measurement surface.

  • Datasets expands one scene into seeded dataset cases.

  • Tutorials walks through the same workflow in a notebook with figures.