# aerial-autonomy-stack
**Repository Path**: yizzhu/aerial-autonomy-stack
## Basic Information
- **Project Name**: aerial-autonomy-stack
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-04-23
- **Last Updated**: 2026-04-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# aerial-autonomy-stack
*Aerial autonomy stack* (AAS) is an all-in-one software stack to:
1. **Develop** multi-drone autonomy—with ROS2, PX4, and ArduPilot
2. **Simulate** faster-than-real-time perception and control—with YOLO and 3D LiDAR
3. **Deploy** in real drones—with JetPack and NVIDIA Orin
For an example bill of materials, read [`BOM.md`](/supplementary/BOM.md); for motivation, read [`RATIONALE.md`](/supplementary/RATIONALE.md); if you wish, cite this work as:
```bibtex
@misc{panerati2026aas,
title={{\ttfamily aerial-autonomy-stack}---a faster-than-real-time, autopilot-agnostic, {ROS2} framework to simulate and deploy perception-based drones},
author={Jacopo Panerati and Sina Sajjadi and Sina Soleymanpour and Varunkumar Mehta and Iraj Mantegh},
year={2026},
eprint={2602.07264},
archivePrefix={arXiv},
primaryClass={cs.RO},
url={https://arxiv.org/abs/2602.07264}}
```
Feature list (click to expand)
- **PX4 and ArduPilot multi-vehicle** simulation (**quadrotors and VTOLs**)
- ROS2 action-based autopilot interface (*via* XRCE-DDS or MAVROS)
- **YOLO** (with ONNX GPU Runtimes) and **LiDAR** Odometry (with [KISS-ICP](https://github.com/PRBonn/kiss-icp))
- 3D worlds for perception-based simulation
- **Steppable** [Gymnasium environment](https://gymnasium.farama.org/index.html) and **faster-than-real-time**, **multi-instance** simulation
- Gazebo's wind effects plugin
- **Dockerized simulation** based on [Ubuntu with CUDA and cuDNN](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda/tags)
- **Dockerized deployment** based on [NVIDIA JetPack](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-jetpack/tags) with [DeepStream](https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_Installation.html#platform-and-os-compatibility)
- **Windows 11** compatibility *via* WSL
- Multi-**Jetson-in-the-loop (HITL) simulation** to test NVIDIA- and ARM-based on-board compute
- Dual network to separate simulated sensors (`SIM_SUBNET`) and inter-vehicle comms (`AIR_SUBNET`)
- [Zenoh](https://github.com/eclipse-zenoh/zenoh-plugin-ros2dds) inter-vehicle ROS2 bridge
- [PX4 Offboard](https://docs.px4.io/main/en/flight_modes/offboard.html) interface (e.g. CTBR/`VehicleRatesSetpoint` for agile, GNSS-denied flight)
- [ArduPilot Guided](https://ardupilot.org/copter/docs/ac2_guidedmode.html) interface (i.e. `setpoint_velocity`, `setpoint_accel` references)
- Logs analysis with [`flight_review`](https://github.com/PX4/flight_review) (`.ulg`), MAVExplorer (`.bin`), and [PlotJuggler](https://github.com/facontidavide/PlotJuggler) (`rosbag`)
ArduPilot SITL"):::resource
gz(Gazebo Sim):::resource
subgraph models [Models]
drones(aircraft_models/):::resource
worlds(simulation_worlds/):::resource
end
drones --> gz
worlds --> gz
sitl <--> |"gz_bridge || ardupilot_gazebo"| gz
end
subgraph gnd ["#nbsp;ground#nbsp;container#nbsp;(amd64)"]
mlrouter{{mavlink-router}}:::bridge
ground_system[/ground_system\]:::algo
qgc(QGroundControl):::resource
zenoh_gnd{{zenoh-bridge}}:::bridge
ground_system --> |"/tracks"| zenoh_gnd
mlrouter <--> qgc
mlrouter --> ground_system
end
subgraph air ["[N#nbsp;x]#nbsp;aircraft#nbsp;container(s)#nbsp;(amd64,#nbsp;arm64)"]
subgraph perception [Perception]
yolo_py[/yolo_py/]:::algo
kiss_icp[/kiss_icp/]:::algo
end
subgraph control [Control]
offboard_control(offboard_control):::algo
autopilot_interface(autopilot_interface):::algo
mission(mission):::algo
end
ap_link{{"uxrce_dds
|| MAVROS"}}:::bridge
subgraph swarm [Swarm]
state_sharing[/state_sharing\]:::algo
end
zenoh_air{{zenoh-bridge}}:::bridge
kiss_icp -.-> |"/TBD"| ap_link
ap_link <--> autopilot_interface
ap_link --> state_sharing
yolo_py --> |"/detections"| offboard_control
offboard_control --> |"/reference"| autopilot_interface
mission --> |"ros2 action/srv"| autopilot_interface
zenoh_air <--> |"/state_drone_n"| state_sharing
end
repo(((aerial#nbsp;autonomy#nbsp;stack)))
end
repo ~~~ gz
gz --> |"gz_gst_bridge
[SIM_SUBNET]"| yolo_py
gz --> |"/lidar_points
[SIM_SUBNET]"| kiss_icp
sitl <--> |"UDP
[SIM_SUBNET]"| ap_link
sitl <--> |"MAVLink
[SIM_SUBNET]"| mlrouter
zenoh_gnd <-.-> |"TCP
[AIR_SUBNET]"| zenoh_air
classDef bridge fill:#ffebd6,stroke:#f5a623,stroke-width:2px;
classDef algo fill:#e1f5fe,stroke:#0277bd,stroke-width:2px;
classDef resource fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px;
classDef blueStyle fill:#e1f0ff,stroke:#666,stroke-width:2px;
classDef whiteStyle fill:#f9f9f9,stroke:#666,stroke-width:1px,stroke-dasharray: 5 5;
classDef greyStyle fill:#eeeeee,stroke:#666,stroke-width:1px,stroke-dasharray: 5 5;
class aas,repo blueStyle;
class air,gnd,sim whiteStyle;
class perception,control,models,swarm greyStyle;
linkStyle 14,15,16,17 stroke:teal,stroke-width:3px;
linkStyle 18 stroke:blue,stroke-width:4px;
```
Repository structure (click to expand)
```sh
aerial-autonomy-stack
│
├── aas-gym
│ └── src
│ └── aas_gym
│ └── aas_env.py # aerial-autonomy-stack as a Gymnasium environment
│
├── aircraft
│ ├── aircraft_ws
│ │ └── src
│ │ ├── autopilot_interface # Ardupilot/PX4 high-level actions (Takeoff, Orbit, Offboard, Land)
│ │ ├── mission # Orchestrator of the actions in `autopilot_interface`
│ │ ├── offboard_control # Low-level references for the Offboard action in `autopilot_interface`
│ │ ├── state_sharing # Publisher of the `/state_sharing_drone_N` topic broadcasted by Zenoh
│ │ └── yolo_py # GStreamer video acquisition and publisher of YOLO bounding boxes
│ │
│ └── aircraft.yml.erb # Aircraft docker tmux entrypoint
│
├── ground
│ ├── ground_ws
│ │ └── src
│ │ └── ground_system # Publisher of topic `/tracks` broadcasted by Zenoh
│ │
│ └── ground.yml.erb # Ground docker tmux entrypoint
│
├── scripts
│ ├── docker
│ │ ├── Dockerfile.aircraft # Docker image for aircraft simulation and deployment
│ │ ├── Dockerfile.ground # Docker image for ground system simulation and deployment
│ │ └── Dockerfile.simulation # Docker image for SITL and HITL simulation
│ │
│ ├── deploy_build.sh # Build `Dockerfile.aircraft` for arm64/Orin
│ ├── deploy_run.sh # Start the aircraft docker on arm64/Orin or the ground docker on amd64 (deploy or HITL)
│ │
│ ├── gym_run.py # Examples for the Gymnasium aas-gym package
│ │
│ ├── sim_build.sh # Build all dockerfiles for amd64/simulation
│ └── sim_run.sh # Start the simulation (SITL or HITL)
│
└── simulation
├── simulation_resources
│ ├── aircraft_models
│ │ ├── alti_transition_quad # ArduPilot VTOL model
│ │ ├── iris_with_ardupilot # ArduPilot quad model
│ │ ├── sensor_camera # Camera model
│ │ ├── sensor_lidar # LiDAR model
│ │ ├── standard_vtol # PX4 VTOL model
│ │ └── x500 # PX4 quad model
│ └── simulation_worlds
│ ├── apple_orchard.sdf
│ ├── impalpable_greyness.sdf
│ ├── shibuya_crossing.sdf
│ └── swiss_town.sdf
│
└── simulation.yml.erb # Simulation docker tmux entrypoint
```
Dependency management (click to expand)
- [x] Host OS: [Ubuntu 24.04/22.04 (LTS, ESM 4/2034)](https://ubuntu.com/about/release-cycle)
- [ ] Jetpack: [6.2.1 (rev. 1) [L4T 36.4.4, Ubuntu 22-based]](https://developer.nvidia.com/embedded/jetpack-archive)
- **TODO: test on JP 6.2.2 [L4T 36.5.0, Ubuntu 22-based]**
- [x] [`nvidia-driver-580`](https://developer.nvidia.com/datacenter-driver-archive)
- **NOTE: `nvidia-driver-590` does not support the [presets in Ubuntu 22's GStreamer 1.20](https://docs.nvidia.com/video-technologies/video-codec-sdk/13.0/deprecation-notices/index.html) and it requires updating the `amd64` base images to Ubuntu 24 or compiling [GStreamer 1.24](https://discourse.gstreamer.org/t/nvcodec-nvenc-nvidia-deprecates-support-for-old-videocodec-sdk-h-264-hevc-encoder-presets-with-driver-r550-in-q124/182) from source**
- **AAS sticks with `nvidia-driver-580` and Ubuntu 22 `amd64` base images for parity with the L4T 36.x, Ubuntu 22-based `arm64` base image**
- [x] [Docker Engine v29](https://docs.docker.com/engine/release-notes/)
- [x] [NVIDIA Container Toolkit 1.19](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/index.html)
- [x] `amd64` base image: [`cuda:12.9.1-cudnn-runtime-ubuntu22.04`](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda/tags)
- **NOTE: `onnxruntime-gpu` 1.23 does not support CUDA 13**
- [x] `arm64`/Jetson base image: [`l4t-jetpack:r36.4.0`](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-jetpack/tags)
- [x] [DeepStream 7.1](https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_Installation.html#platform-and-os-compatibility)
- **NOTE: latest DeepStream supported on Orin Series**
- [x] [ROS2 Humble (LTS, EOL 5/2027)](https://docs.ros.org/en/rolling/Releases.html)
- [x] [Gazebo Sim Harmonic (LTS, EOL 9/2028)](https://gazebosim.org/docs/latest/releases/)
- [x] [PX4 1.16.1](https://github.com/PX4/PX4-Autopilot/releases)
- [x] [ArduPilot 4.6.3](https://github.com/ArduPilot/ardupilot/releases)
- [x] [YOLO26](https://github.com/ultralytics/ultralytics/releases)
- [x] [ONNX Runtime 1.23.2](https://github.com/microsoft/onnxruntime/releases)
- **NOTE: updating to 1.24 from wheel requires switching to Python >3.11/Ubuntu 24**