Official implementation of the paper "Stable Multi-Drone GNSS Tracking System for Marine Robots," accepted at the 2026 IEEE International Conference on Robotics & Automation (ICRA). Paper link
Our system provides a robust framework for tracking marine robots across multiple drones by fusing vision-based detections with GNSS telemetry data. We extend the BYTETracker algorithm with a custom GPS Kalman Filter and multi-drone confidence-weighted sensor fusion to reliably estimate target coordinates in real-time.
git clone https://github.com/stevvwen/stable_multidrone.git
cd stable_multidrone
conda create -n multidrone python=3.11
conda activate multidrone
pip install -r requirements.txtThe main pipeline for running the multi-drone tracking and fusion is implemented in stable_multidrone_m4.py.
- Configure Paths: Open
stable_multidrone_m4.pyand modify the configuration lists inside themain()function to point to your local video files and telemetry CSVs:
drone_names: Names of the drones.fly_records: Paths to the telemetry CSV files for each drone.vid_paths: Paths to the corresponding drone video feeds (e.g., MP4 format).model_path: Ensure you have the trained YOLOv8 weights placed atutils/yolo_drone.pt.
-
Download the data: Please visit AMP2026 and go to
Multi-Drone Tracking of submerged Robotic Platformsfolder and download everything from the subdirectories. -
Run the Tracker:
python stable_multidrone_m4.pyThe output videos with bounding boxes and trajectory overlays, along with the fused GNSS estimates (merge4_weighted.csv) and plots, will be saved into an output/ directory automatically.
The plotting.py script evaluates the tracking system's accuracy. It utilizes Iterative Closest Point (ICP) alignment to map the estimated trajectory to the ground-truth GNSS logs, compensating for static offsets. It then computes the residual errors and generates visualization plots.
Ensure your ground-truth GNSS CSV files contain the columns lat_decimal and lon_decimal. The estimated tracking output (e.g., merge4_weighted.csv) is formatted automatically by the tracker.
Open plotting.py and navigate to the if __name__ == "__main__": block at the bottom of the file. Update the following configuration variables to match your data:
estimation_path: Path to the fused tracker output (e.g.,"output/merge4_weighted.csv").true_path_1/true_path_2: Paths to your ground-truth CSV files.result_id_1/result_id_2: The integer ID assigned to the tracked object in the tracker output (e.g.,1.0or2.0).subsample_1/subsample_2: Step size for subsampling the ground-truth data to match the estimated trajectory's frequency.trim_to_1: An optional integer to slice the array if the ground truth log runs longer than the video recording.
python plotting.py- Console Metrics: The script will print the Mean Error, Standard Deviation, and Root Mean Square Error (RMSE) in meters to your terminal.
- Visualizations: Generates and saves high-resolution plots to the specified
save_prefixpath: *_icp_shift.png: An overview map showing the true path, the original estimated path, and the ICP-shifted path with an inset zoom.*_zoomed.png: A close-up view comparing the alignment of the estimated trajectory against the ground truth.
If you find our work useful in your research, please consider citing our ICRA 2026 paper:
@article{wen2025stable,
title={Stable Multi-Drone GNSS Tracking System for Marine Robots},
author={Wen, Shuo and Meriaux, Edwin and Guzm{\'a}n, Mariana Sosa and Wang, Zhizun and Shi, Junming and Dudek, Gregory},
journal={IEEE International Conference on Robotics and Automation (ICRA) 2026},
year={2025}
}