ReviewOS

stacks/drone

Aerial mapping: fly a camera-triggered survey with georeferenced imagery

#18
Open chris opened this 9 days ago ·
9 days ago

What to build

Plan and simulate a survey polygon with altitude, GSD and image-overlap constraints and produce an auditable georeferenced photo dataset.

Acceptance criteria

  • Implement boundary clipping, crosshatch/terrain options, camera footprints, trigger timing and flight/endurance estimates. The owned simulator now supports clipped concave polygons/holes, crosshatch and a declared terrain plane; real DEM/collision and measured airframe planning remain open.
  • Associate exposure timestamps, pose, camera calibration and RTK/PPK/GCP metadata with every image. Synthetic exposure/ACK/pose/calibration records are implemented; correction and control-point status is explicitly unavailable until qualified inputs exist.
  • Export interoperable photogrammetry inputs and quality reports; distinguish collection from reconstruction. PNG/ODM-style geolocation and collection quality export are implemented; an external reconstruction interoperability campaign and measured survey reference remain open.

Implemented owned simulator slice

Commit 2aad9f3 adds:

  • Strict versioned survey configuration, concave polygon/hole clipping, crosshatch, calibrated Brown5/crop/nadir footprints, planar terrain following, GSD/overlap/trigger constraints and declared endurance estimates.
  • Shared calibrated camera geometry with the existing vision localizer, plus exact WGS84 fixed-NED inverse conversion.
  • Compilation into the owned quad mission with replayable speed, speed-derived task deadlines, raw IMU/GNSS/estimator/control/authority physics, bounded shutter requests and exact scoped ACK/capture-pose records.
  • Distinct deterministic scene pixels with independently tested landmarks. Plant truth is used for rendering; optical-center geotags use qualified estimator capture poses with explicit initial north assumptions and retained uncertainty.
  • Camera timeout/scope, raw IMU/position loss, RC takeover, cancellation and incomplete-duration cases. Modeled outputs are neutralized; an airborne release is not an emergency landing.
  • Private bounded PNG datasets, four-column ODM-style geo.txt, full calibration/pose/correction availability manifest, image hashes and sampled collection reports. Files/directories receive fsync barriers before an exclusive completion manifest. Hashes are unsigned and storage power-loss behavior remains unmeasured.
  • Native Stacks mapping:plan and mapping:simulate commands, standalone CLI support, and stx /mapping playback that withholds future exposures and final outcomes.

The default nominal survey completes with 32 photos across five lanes; crosshatch collects 63 and declared sloped terrain collects 35. A completed mission can still have a partial image quality report. Reports keep measured GSD, reconstruction error and physical survey accuracy unavailable.

Read mapping contract, ADR 18, and example configuration.

Validation evidence

  • Local integrated suite before review fixes: 408 Bun tests, 25,604 assertions, zero failures. Final affected suite: 74 tests, 1,851 assertions, zero failures. Thirteen Python bridge tests passed.
  • Lint and application/runtime/view typechecks passed. Roadmap and parity-integrity checks passed without claiming full upstream parity.
  • Compiled CLI ran from outside the checkout, including nominal dataset, crosshatch, terrain, camera loss, IMU loss and incomplete-duration exit. Independent Python checks verified PNG CRCs, decompressed scanline sizes and manifest SHA-256 image hashes for all 32 nominal images.
  • Real browser QA covered nominal/crosshatch/terrain completion, camera-loss partial collection, beginning/end/scrubbing, clear/scenario reset, empty error console and zero horizontal overflow at 320/375 px. Desktop and mobile layouts visually inspected.
  • Independent Standards and Spec reviews passed after fixing mixed evidence, clock-profile mismatch and speed-derived launch/landing timeouts. Capture clock error propagates through attitude and lever-arm position uncertainty; translation at an upper GSD bound is not claimed as a sharpness certificate.
  • Exact-head CI passed: 414 Bun tests, 25,631 assertions, 13 Python tests, lint and application/runtime/view types, roadmap/parity integrity, all Linux standalone scenarios including mapping exports/crosshatch/camera loss, and both neutral-only Pico 2 cross-builds.

Remaining work

Keep this issue open for full acceptance:

  • Measured Pi lens/mount/ROI/timing and physical shutter/ACK integration, including durable request/ACK reconciliation of uncertain captures across restart.
  • Qualified RTK/PPK/GCP input/provenance and per-image observation import, surveyed absolute heading, common vertical datum and any requested geoid transformation.
  • Real terrain/DEM and obstacle/collision-aware survey execution, richer rally/transit and measured battery/wind planning beyond the bounded flat-contact quad fixture.
  • External photogrammetry import/reconstruction campaign, held-out surveyed reference/uncertainty validation, HIL/vehicle survey and hardware storage power-loss evidence.
  • Rolling shutter/integrated blur and measured image-scale/overlap assessment. Four-corner/grid coverage remains an estimate on a declared plane.

Surface/stockpile processing from known georeferenced inputs is the next software frontier in #19. Collection, reconstruction and volume computation remain separately identified.

Blocked by

  • #10 Mission engine: run and resume an owned waypoint mission
  • #8 Hardware adapters: command and verify the first camera or payload
  • #9 Operations: record, replay and diagnose native missions

Scope and evidence

The implemented evidence is owned simulation and local file/CLI/browser behavior. Physical outputs remain inhibited. It is not firmware SITL, HIL, measured photogrammetric reconstruction or physical survey acceptance. Preserve explicit operator authority and replaceability behind shared runtime/driver contracts.

Sign in to comment on this issue.