Skip to content

fadi-labib/bennu

Bennu

CI SIL Smoke Docker codecov Docs License Last Commit Repo Size Lines of Code Python ROS2 PX4

Open in GitHub Codespaces

DIY 7" photogrammetry drone built with PX4, ROS2, and OpenDroneMap.

Status: Active development, not flight-ready yet. The whole pipeline runs in simulation (PX4 SITL, auto-survey, bundle export). The airframe is still being built and it hasn't flown for real.

It flies an autonomous survey and packs the photos into a signed mission bundle. A separate mapping platform reads that bundle and does the heavy 3D/orthophoto work, so the drone and the analysis side stay decoupled and can change on their own. The bundle format is the only thing they share.

Hardware

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

Architecture

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.

Quick Start

# 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

ROS2 Packages

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

Mission Bundle Contract

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.

Simulation

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 commands

Documentation

Full documentation is at fadi-labib.github.io/bennu, including:

License

Apache-2.0, see LICENSE.

About

A 7-inch photogrammetry drone I'm building with PX4, ROS2, and OpenDroneMap. Auto-flies survey grids in sim and exports signed image bundles for mapping; real airframe still in progress.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors