Next-Generation Positioning System (NGPS) for high-altitude drone navigation without GPS.
This codebase implements a visual geo-localization system for drones that matches down-facing camera images against satellite reference images using deep learning-based feature matching. The system provides absolute position estimates to correct drift in Visual-Inertial Odometry (VIO) systems.
-
ap_ngps_ros2: ROS2 node that performs visual geo-localization by matching camera images to satellite reference images using LightGlue/SuperPoint deep learning features. Runs at 1-2 Hz.
-
ap_ukf: Unscented Kalman Filter that fuses multiple sensor inputs:
- NGPS absolute position (1-2 Hz)
- VIO relative pose (10-20 Hz)
- IMU data (high frequency)
Outputs fused odometry at 10-20 Hz for flight control.
-
ap_vips: Visual-Inertial Odometry system that provides high-frequency relative pose estimates optimized for high-altitude flight.
- NGPS module matches real-time camera frames to a georeferenced satellite reference image
- Provides absolute position estimates at low frequency (1-2 Hz)
- UKF fuses NGPS absolute positions with high-frequency VIO estimates
- Fused output sent to ArduPilot's EKF for final state estimation
- GSoC 2024: High Altitude Non-GPS Navigation - Initial GSoC project summary
- Transformer & Optimization Based High Altitude GPS-Denied Fusion - Updated implementation and architecture details
- ap_nongps - Earlier prototype implementation with SIFT-based feature matching and optical flow methods
- Add a fallback VO pipeline
- Add global optimisation for fusion
- Update AP to accept position and odometry as separate sources to be fused internally
- Add support for multiple reference images
- Optimize feature matching for faster performance
- Add calibration tools and documentation
- Improve error handling and recovery
- Add more unit tests
- Document configuration parameters
- Add example launch files for different scenarios
- Performance profiling and optimization
- Support for different camera models
Step 1: Install Docker Engine
- Follow the official installation guide: Install Docker Engine.
- Apply the Linux post-installation configuration as non-root user: Linux post-installation steps for Docker Engine.
Step 2: NVIDIA Container Toolkit (optional)
If NVIDIA GPU is present.
- Install the toolkit: NVIDIA Container Toolkit.
- Configure Docker to use the NVIDIA runtime and restart the daemon:
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart dockerStep 3: Clone the repository and build the development image
mkdir -p ~/ngps_ws/src
cd ~/ngps_ws/src
git clone git@github.com:snktshrma/ngps_flight.git
cd ~/ngps_ws/src/ngps_flight
docker build -f Dockerfile.dev -t vps-dev:latest .For Docker only: Skip Step 4 and Step 5.
With NVIDIA GPU (requires Step 2):
docker run -it \ --name vps-dev \ --network host \ --privileged \ --ipc host \ --gpus all \ -v ~/ngps_ws:/home/dev/ngps_ws \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ vps-dev:latestWithout NVIDIA GPU:
docker run -it \ --name vps-dev \ --network host \ --privileged \ --ipc host \ -v ~/ngps_ws:/home/dev/ngps_ws \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ vps-dev:latestTo start again:
docker start vps-dev docker exec -it vps-dev /bin/bash
Step 4: Install Distrobox
For Ubuntu:
sudo apt install distrobox
export DBX_CONTAINER_MANAGER=docker
echo "export DBX_CONTAINER_MANAGER=docker" >> ~/.bashrcStep 5: Create the Distrobox
- With NVIDIA GPU (requires Step 2):
distrobox create \
--name vps-dev \
--image vps-dev:latest \
--additional-flags "--privileged --ipc=host --gpus all"- Without GPU (no NVIDIA GPU or no toolkit):
distrobox create \
--name vps-dev \
--image vps-dev:latest \
--additional-flags "--privileged --ipc=host"Step 6: Enter and initialize the workspace
distrobox enter vps-devInside the container:
bash ~/ngps_ws/src/ngps_flight/setup.sh
# When done,
source ~/.bashrcDistrobox: The host user home directory is mounted; workspace paths such as
~/ngps_wsmatch the host, while binaries and libraries resolve from the container image.
Step 7: Verify the simulation stack
ros2 launch ardupilot_gz_bringup iris_runway.launch.py- Expected result: ArduPilot DDS and Gazebo Harmonic start with the runway simulation.
Distrobox::
distrobox stop vps-dev
distrobox rm vps-devDocker:
docker stop vps-dev
docker rm vps-devSee individual package READMEs:
- Changelog - Project history and version timeline
- Camera-IMU Calibration - Google Docs
- Non-GPS Navigation Setup - Google Docs
Ofcourse, ChatGPT :)
IMPORTANT DISCLAIMER: This software is provided for research and educational applications only. The developers and contributors of this project doesn't promote and are not responsible for any misuse.
See LICENSE file.