3D Path & Pose Viewer
The 2-D scene-video overlay
shows what the camera sees. This is the 3-D companion: the drone’s path and
pose in the world, driven by the same run.jsonl stream that vio_pipeline
emits. Drag to orbit, scroll to zoom, and
use the scrubber (or ▶) to step through the run.
What you are looking at
Section titled “What you are looking at”- Green line / triad — the ground-truth trajectory and the true pose at the current frame.
- Orange line / triad — the estimated trajectory and the filter’s current pose estimate.
- Yellow ellipsoid — the filter’s position-covariance at 3σ (≈ 97% per axis). This is the whole reason for the 3-D view: it makes the filter’s belief about its own uncertainty visible.
- Grey points — the static landmark cloud the camera observes (the synthetic scene’s true 3-D points).
- Cyan pyramid — the camera frustum at the estimated pose, reconstructed from the pose and the camera extrinsics/intrinsics. Watch it sweep across the cloud — the landmarks it covers are what make the motion observable.
Why the ellipsoid matters (the #212 story)
Section titled “Why the ellipsoid matters (the #212 story)”A trustworthy filter keeps the green ground-truth marker inside its covariance ellipsoid — the true pose lies within the uncertainty it reports. When the ellipsoid is too small and the green marker drifts outside it, the filter is over-confident: certain about a wrong position. The HUD flags this the moment the true error exceeds the 3σ ellipsoid.
This is exactly the over-confidence tracked in issue #212: on this sample run the reported position σ shrinks to ~13 cm while the true error grows past 2 m — the ellipsoid collapses to a fraction of the actual error. A controller trusting that covariance would act decisively on a wrong position. See the pipeline how-to and the canonical contract doc for the stage-by-stage decomposition.
Generate your own
Section titled “Generate your own”cmake -B build -DBUILD_TARGET_KPU=OFF && cmake --build build -j$(nproc)./build/tools/vio_pipeline --robot drone --out /tmp/run# → /tmp/run/run.jsonl (drop it in docs-site/public/data/ to view here)Render it to an mp4 (offline)
Section titled “Render it to an mp4 (offline)”The same viewer renders headlessly to a video — useful for talks and slides:
# one-shot: experiment → 3D videoscripts/vio_scene_video.sh --3d --robot drone -o /tmp/run # → /tmp/run/scene3d.mp4
# or straight from an existing run.jsonlnode docs-site/scripts/gen-scene3d-video.mjs --data /tmp/run/run.jsonl --out /tmp/run/scene3d.mp4Needs playwright (cd docs-site && npm i -D playwright && npx playwright install chromium) and ffmpeg. It drives this exact viewer frame-by-frame in a headless
browser, so the video matches what you see above.
Each estimate record now carries the 3×3 position covariance block (pcov) that
drives the ellipsoid:
{"type":"est","t":13.95,"q":[...],"p":[1.23,3.36,0.38],"pos_err":2.59, "pcov":[0.0165,-0.0016,0.00016, -0.0016,0.0206,0.0001, 0.00016,0.0001,0.0108]}