DIY 7" photogrammetry drone built with PX4, ROS2, and OpenDroneMap.
Status: Active development — not flight-ready. End-to-end simulation works (PX4 SITL + auto-survey + bundle export); the airframe build is in progress and no real flights have happened yet.
Bennu produces versioned, signed, schema-validated mission bundles from autonomous survey flights. The bundles feed an independent geospatial analysis platform via a contract-first data interface.
| Component | Part |
|---|---|
| Frame | TBS Source One V5 7" Deadcat + custom 3D-printed adapters |
| Flight Controller | Holybro Pixhawk 6C (PX4 v1.16) |
| Companion Computer | Raspberry Pi 4 (4GB), Ubuntu 24.04, ROS2 Jazzy |
| Camera | Raspberry Pi HQ Camera (IMX477) + 6mm CS-mount lens |
| GPS | Holybro M9N (u-blox M9N) |
| ESC | Holybro Tekko32 F4 4-in-1 50A |
| Motors | T-Motor Velox V2207.5 1950KV x4 |
| Battery | 4S 2200-3000mAh LiPo |
| Target AUW | <830g |
Ground Station Drone (onboard Pi 4)
+--------------+ +------------------+
| QGroundControl|<--- MAVLink --->| Pixhawk 6C (PX4) |
+--------------+ +--------+---------+
|
| WebODM |<--- bundle ---> +--------+---------+
+--------------+ transfer | ROS2 Jazzy |
| bennu_camera |
| bennu_mission |
| bennu_survey |
| bennu_dataset |
+------------------+
The drone captures geotagged images during autonomous survey flights, scores image quality onboard, packages everything into a signed mission bundle, and exports it for processing in WebODM or a geospatial platform.
# Clone
git clone https://github.com/fadi-labib/bennu.git
cd bennu
# Install dev dependencies (Python 3.12)
pip install -r requirements-dev.txt
pip install -e drone/ros2_ws/src/bennu_camera \
-e drone/ros2_ws/src/bennu_core \
-e drone/ros2_ws/src/bennu_dataset \
-e drone/ros2_ws/src/bennu_mission \
-e drone/ros2_ws/src/bennu_survey
# Run tests
python -m pytest drone/ros2_ws/src/*/test/ tests/ -v
# Lint
ruff check .
# Start simulation (requires Docker) — one command brings up PX4 SITL,
# QGroundControl, and auto-flies a survey mission
make sim| Package | Description |
|---|---|
bennu_camera |
Camera capture, image quality scoring, geotagging (18-column metadata), sensor config |
bennu_core |
Drone identity and hardware manifest |
bennu_dataset |
Mission bundle packaging, Ed25519 signing, checksums |
bennu_mission |
Mission manifest generation (contract v1 compliant) |
bennu_survey |
Survey grid planner (lawnmower pattern, UTM projection) |
bennu_bringup |
Launch files and sensor configuration profiles |
The drone produces a versioned mission bundle — the only coupling point with downstream platforms:
{mission_id}/
├── contract_version # "v1"
├── manifest.json # Mission metadata (signed)
├── images/ # Geotagged survey images
├── metadata/images.csv # 18-column per-image metadata
├── quality/report.json # Image quality scores
└── checksums.sha256 # SHA-256 integrity chain
The manifest is canonicalized, signed with Ed25519, and validated against a JSON schema in CI.
Bennu uses a Docker-based PX4 SITL + Gazebo Harmonic simulation stack:
# All commands run from the repo root
make sim # One-command: containers + QGC + auto-fly nominal survey + shell
make dev # Headless: containers only (CI / SSH / no GUI)
make dev-debug # Headless + Gazebo GUI (requires GPU + X11)
make qgc # Launch QGroundControl on its own
make test # Run unit tests in container
make test-smoke # Run SIL mission smoke test
make clean # Stop and remove containers
make help # Show all commandsFull documentation is at fadi-labib.github.io/bennu, including:
- Build Guide & Parts Checklist
- Bill of Materials
- Wiring Diagram
- Power Architecture
- Frame Specifications
- Architecture Decision Records
Apache-2.0 — see LICENSE.