Drones and field work

Flight safety, firmware and geology, tested in simulators and on emulators.

Six repos for aircraft, firmware and the ground: a ROS 2 guard that forwards only setpoints it can prove safe, terrain clearance proofs for drone missions, CI checks for autopilot parameters, A/B firmware updates that survive power cuts, and a ground model and field notebook for borehole logs.

Repos
6
Passing tests
518, one dot each, run in October 2026 the way each repo's CI runs them
Languages
C++, Python, Rust, Kotlin

    The six repos

    Open a repo for its project page: what it does stage by stage, with real runs.

    • geofence-guard

      96 passing tests

      Forwards only setpoints proven inside the envelope

      A ROS 2 node between a setpoint source and the autopilot that forwards a move only when it can show the whole path stays inside the flight envelope.

      Language
      C++
      Stack
      C++17, ROS 2 Jazzy, GoogleTest, PX4 SITL
      Scope
      The core and CLI build anywhere with CMake. The ROS 2 node and the PX4 SITL flights run in CI.
      Counted with
      make test (87 GoogleTest cases plus 9 CLI tests; the 10 ROS 2 node tests run in CI and are not counted here)

      GitHub: geofence-guard

    • terrain-follow

      237 passing tests

      Proves a mission clears the terrain

      Proves that a drone mission clears the terrain, counting elevation, altitude and cross-track error, refuses any leg it can't prove, and raises the mission until every leg is proven.

      Language
      Python
      Stack
      Python standard library only, Hypothesis, PX4 SITL in Docker
      Counted with
      pytest -q (38 test functions, 203 of the items parametrised)

      GitHub: terrain-follow

    • paramguard

      67 passing tests

      CI check for PX4 and ArduPilot parameters

      A CI check for PX4 and ArduPilot parameter files that compares what the vehicle will actually run, checks it against the firmware's own metadata and rules, and blocks the pull request until a named person accepts the change.

      Language
      Python
      Stack
      Python standard library only, composite GitHub Action, PX4 SITL in Docker
      Counted with
      pytest -q (1 of them needs ArduCopter 4.6.3's parameter metadata from make ap-meta, as in CI)

      GitHub: paramguard

    • ota-safe

      33 passing tests

      A/B firmware updates that survive power cuts

      A/B firmware updates for microcontrollers with a trial boot and automatic rollback, checked by cutting power at every flash operation of a device's life and run on a Cortex-M3 in QEMU.

      Language
      Rust
      Stack
      no_std Rust with sha2 and ed25519-dalek, QEMU Cortex-M3
      Counted with
      cargo test --locked (the depth-2 search, run by make deep, is ignored by default)

      GitHub: ota-safe

    • strata

      46 passing tests

      Borehole logs to a ground model with intervals

      A Rust command-line tool that turns borehole logs into a layered ground model, puts a checked 95% interval on every contact, and refuses where that interval would be useless.

      Language
      Rust
      Stack
      No dependencies, ordinary kriging, leave-one-out calibration
      Counted with
      cargo test --locked

      GitHub: strata

    • fieldlog

      39 passing tests

      Offline Android notebook for boreholes

      An offline-first Android notebook for logging boreholes, where phones merge their edits through CRDTs with no server deciding, and the merged logs reach strata only once they pass strata's own checks.

      Language
      Kotlin
      Stack
      Kotlin 2.0, Jetpack Compose, CRDTs with no merge library, Android emulator in CI
      Counted with
      ./gradlew test and connectedDebugAndroidTest (33 JVM tests, 3 app unit tests and 3 Compose UI tests on an emulator)

      GitHub: fieldlog