A seafloor you can author, seed, and regenerate.

A synthetic dataset is only as good as the variety underneath it. If every scene shares one seafloor, a model learns that seafloor. So the bottom here is not an asset that gets reused; it is a recipe that gets re-seeded, built from published seabed morphology and evaluated at simulation resolution.

The scene file

One YAML file describes the whole experiment.

A scene names the seafloor, the objects on it, the vehicle's motion, the sonar, and the products to write. Scenes inherit from each other, so a variation is a short file rather than a copy. A profile bundle can carry two imaging configurations at once, which is how the same seabed gets rendered as both a synthetic-aperture collection and a real-aperture side-scan line without a second scene.

Six bottom types ship built in (sand, rippled sand, mud, rock, gravel, silt), each calibrated to a measured backscattering strength, and a scene can define its own. Objects come from a catalogue of 69 placeable models, plus procedural rock and biota generators.

Realism

Nothing in a scene has a rectangular footprint.

The tell of a synthetic seabed is straight lines where nature has none: a ripple field that stops dead on a grid boundary, a sediment patch with corners, a roughness change along a raster edge. A model trained on that learns the artifact.

Seafloor zones are painted as a raster and then blended with a warped, feathered boundary, so a bottom-type change follows an irregular line and the roughness crossfades across it. The feather runs inward from the boundary rather than outward, which is what keeps a ripple patch from bleeding into its neighbour. Seam quality is scored in the test suite across all fifteen pairs of bottom types.

The features themselves follow published morphology rather than taste: ripple geometry after Tang et al. 2009, pockmarks after Hovland and Judd, seabed roughness after Goff and Jordan, and burial and scour from Shields-criterion sediment mechanics, so a partially buried object sits at a depth the sediment and current would actually produce.

27 mm → 2 mm
the ripple-boundary step that triggered the fix, against a 2 to 3 mm sand-to-sand baseline; seams are now scored across all fifteen bottom-type pairs
simulator/tests/test_zone_seams.py

The texture graph

Domain randomization as a node graph, not a folder of assets.

Seafloor texture is authored the way a Blender artist builds a material: as a graph of nodes. Seventeen node types (fractal noise, multifractal, Voronoi in several modes, the Tang ripple model, power-law roughness, pockmark and rock scatter, plus the usual maths and mixing operators) drive four channels at once: the bathymetry, the bottom-type map, a per-cell backscatter gain, and rock placement.

The noise is pure integer hash, so a graph evaluates identically at any resolution, on CPU or GPU, from the same seed. That is the property that matters for training data: a recipe is a reproducible distribution, not a one-off asset. One graph reseeds into thousands of statistically distinct seafloors, and a scene that produced a surprising result can be regenerated exactly.

A node-graph editor with noise, Voronoi and ripple nodes wired into a seafloor material output, and a live grayscale heightfield preview
The texture editor. Nodes on the left, the evaluated heightfield on the right, previewed at the resolution the simulator will trace.

Ground truth in, sonar out

The geometry is known, because it was authored.

Each pair below is one seafloor twice: the heightfield the scene defines, and the sonar image the physics produces from it, at matched framing. The left is not a derived product of the right; it is the input. That relationship is what makes every downstream label exact rather than estimated.

Grayscale heightfield of a fine ripple field The same fine ripple field imaged as synthetic aperture sonar
Fine ripple: authored relief, then its sonar image.
Grayscale heightfield of a rocky bottom The same rocky bottom imaged as synthetic aperture sonar
Rocky bottom: the same relationship, a different bottom type.

Approve the 30-second heightfield before spending the GPU on the image; the geometry you approved is the geometry the physics traces.

Next: the labels this geometry produces, or what the results look like.