Particle Filtering with BEV-Aerial Feature Matching for Off-Road Geo-Localization
BEV-Patch-PF is a GPS-free geo-localization system for long-horizon offroad localization. It combines learned bird's-eye-view (BEV) features, aerial map features, and particle filtering to estimate robot pose over time.
conda create -y -n bev-patch-pf python=3.12
conda activate bev-patch-pf
conda install -y -c conda-forge manifpy
pip install -e .Install development dependencies with:
pip install -e .[dev]For multi-GPU training with accelerate:
pip install accelerateThe demo downloads a pinned checkpoint and a pinned sparse demo dataset from Hugging Face, then launches Rerun with the demo blueprint.
python src/run_demo.pyThe demo configuration is defined in config/demo.yaml.
Run offline particle filtering with a local checkpoint:
python src/run_pf.py sequence=tartandrive ckpt_path=/path/to/model.pthrun_pf.py uses Hydra overrides from config/run_pf.yaml together with sequence configs under config/sequence.
Single-GPU training:
python src/train.pyMulti-GPU training:
accelerate launch --multi_gpu --num_processes=<num_gpus> --mixed_precision=fp16 src/train_ddp.pyThe default training setup is defined in config/train.yaml. Training outputs are written under output/train/....
export_onnx.py exports the model components, runs onnx.checker.check_model, and performs parity checks against PyTorch.
After exporting ONNX, build TensorRT engines and run the ROS 2 deployment stack from the companion repository: ut-amrl/bev-patch-pf_ROS2
Export the model for deployment:
python scripts/export_onnx.py --ckpt_path=/path/to/model.pth --out_dir=/path/to/export_dirA typical pipeline is:
- Extract sensor streams such as RGB, depth, and IMU using
rosbagkit. - Generate a trajectory estimate with a SLAM or odometry pipeline (e.g., FAST-LIO, Adaptive-LIO).
- Export a GeoTIFF map in the correct UTM zone (e.g., QGIS).
- Align the trajectory into the GeoTIFF frame:
python preprocessing/align_trajectory_geotiff.py --geotiff=/path/to/map.tiff --traj=/path/to/trajectory.csv- Run dataset-specific preprocessing as needed, for example:
python preprocessing/preprocess_arl_jackal.py- Download the raw bagfiles from https://github.com/castacks/tartan_drive_2.0.
- Extract images and odometry with
rosbagkit. - Run preprocessing:
python preprocessing/preprocess_tartandrive.py@misc{lee2025bevpatchpf,
title = {BEV-Patch-PF: Particle Filtering with BEV-Aerial Feature Matching for Off-Road Geo-Localization},
author = {Lee, Dongmyeong and Quattrociocchi, Jesse and Ellis, Christian and Rana, Rwik and Adkins, Amanda and Uccello, Adam and Warnell, Garrett and Biswas, Joydeep},
year = {2025},
eprint = {2512.15111},
archivePrefix = {arXiv},
primaryClass = {cs.RO}
}