Meridian: Metric-Semantic Primitive Matching for Cross-View Geo-Localization Beyond Urban Environments
Meridian is an algorithm for localizing a ground robot from aerial ortho-imagery, providing meter-level pose estimates without any initial pose information or environmental fine-tuning. To do this, sparse point and line primitives are matched across aerial and ground views, and robust pose graph optimization is employed to find a set of consistent pose measurements over time.
Currently, meridian exists as a stand-alone Python package (with heavy computation implemented in C++ or using GPU via PyTorch).
A ROS2 wrapper is coming soon!
This repo contains instructions for running the Meridian pipeline on our self-collected datasets. For now, we have a small sampler for use as a demo, but our full cross-view geo-localization "Camp Dataset" will be released soon.
If you find this repo useful in your work, please cite our paper:
M. Peterson, Q. Li, Y. Jia, F. Cladera, C. Nieto-Granda, C.J. Taylor, and J.P. How, "Meridian: Metric-Semantic Primitive Matching for Cross-View Geo-Localization Beyond Urban Environments," arXiv preprint arXiv:2606.06312, 2026.
@inproceedings{peterson2025roman,
title={Meridian: Metric-Semantic Primitive Matching for Cross-View Geo-Localization Beyond Urban Environments},
author={Peterson, Mason and Qingyuan, Li and Jia, Yixuan and Cladera, Fernando and Nieto-Granda, Carlos and Taylor, Camillo Jose and How, Jonathan P},
journal={arXiv preprint arXiv:2606.06312},
year={2026}
}
We recommend using this repo with a Python virtual environment. This software has been tested with Python 3.12 on Ubuntu 24.04.
To install, clone and cd into this repo, activate your environment, and run
source ./install/install.sh
After installation, set the following environment variable in your bashrc or zshrc:
export MERIDIAN_WEIGHTS=<path to meridian repo>/weights
Once installed, the full pipeline can be run on our experimental data.
Data Set Up
To make this as easy as possible, we host an aerial image and a minimal ROS bag for use in running our pipeline.
To download the data run (will download ~8 GB):
source ./install/download_demo_data.sh <desired output directory>
Running Pipeline
Next, set an environment variable pointing to Meridian weights and demo data:
export MERIDIAN_WEIGHTS=<path to this repo>/weights
export MERIDIAN_DEMO_DATA=<path to demo data>
Then, the meridian demo can be run with (from the root of the meridian repo)
python3 -m meridian.pipeline.cross_view_incremental \
--aerial $MERIDIAN_DEMO_DATA/aerial_primitive_map \
-p ./cfg/demo.yaml \
-o ./demo_output/ \
-m --live
The -m and --live commands can be removed to run the demo without the visulization which greatly reduces the run-time.
This research is supported by ARL DCIST under Cooperative Agreement Number W911NF-17-2-0181 and DSTA.
Portions of this software were written using Claude Code.
