Features
Four workspaces, one transformer chain, scriptable from Lua. Pick a workspace from the tabs in the editor, or jump straight to the spec of each below.
Simulation
Build a scene, pick a sensor profile, watch a stream that matches the real datasheet.
- Walls, targets, moving obstacles with per-surface reflectivity.
- Per-profile beam divergence, multiecho, intensity, crosstalk, multipath.
- Noise driven directly from datasheet accuracy and repeatability.
- Streams over the local SCIP TCP endpoint so any SCIP client connects unchanged.
Replay
Open a UBH capture, scrub, export. No hardware required.
- Frame-accurate scrubbing, loop ranges, jump-by-event.
- Apply the live transformer chain to recorded data.
- Export CSV, point cloud, or another UBH after filtering.
- Device profile read from the capture itself; no manual config.
Gateway
Connect to a real sensor over SCIP. Stream, configure, change the IP, drive the IO.
- SCIP 2.0 + 2.2 with auto-detected dialect.
- Set the sensor IP from inside the app, with a confirm modal and a power-cycle reminder.
- Live IO state hub: GF / GG / MF / MG mapped to scene-aware detection bits.
- Connection health rule keeps streaming honest under packet loss.
Proxy
Sit byte-for-byte between client and sensor. Inspect, log, tamper, replay later.
- Transparent byte-accurate bridge between any SCIP client and any Hokuyo sensor.
- Per-direction frame log, with replay-style scrubbing.
- Optional packet tampering for fault-injection tests.
- Same scene model as the other workspaces; switch with one click.
Transformer chain
Every scan, from any source, flows through a chain of small, ordered transformers. Filters compose linearly; what you see in the canvas is what downstream consumers see over SCIP.
- Built-in filters: range clamp, median smoothing, glitch reject, intensity gate, ROI mask, and more.
- Each built-in filter ships a matching Lua twin, with an equivalence test in CI.
- Drag to reorder. Toggle per stage. Inspect the per-stage scan diff in the inspector pane.
- Saved with the scene so a Replay session is byte-identical to the original capture.
Lua scripting
Author your own transformer in Lua against the same scan API the C++ filters use. Quick snippets, intellisense, and a confirm prompt before the editor rewrites a stage in place.
function transform(scan)
for i = 1, #scan.points do
if scan.points[i].range_mm > 4000 then
scan.points[i].drop = true
end
end
return scan
end