LEOGPS - Satellite Navigation with GPS on Python!

Overview

https://raw.githubusercontent.com/sammmlow/LEOGPS/master/docs/_static/leogps_logo.png

Project: LEOGPS
Github: https://github.com/sammmlow/LEOGPS
Documents: https://leogps.readthedocs.io/en/latest/
Version: 1.3 (Latest)

docs license

Author: Samuel Y. W. Low

linkedin orcid

LEOGPS

LEOGPS is an open-source Python software which performs relative satellite navigation between two formation flying satellites, with the objective of high accuracy relative positioning. Specifically, LEOGPS solves for the double-differenced baseline (using float ambiguity resolution) between satellites flying in formation in Low Earth Orbit (LEO). As such, the relative positioning accuracy diminishes with increasing formation baseline lengths.

LEOGPS currently supports only observations from the GPS constellation (L1/L2 frequency), with observation files in RINEX v2.XX format. LEOGPS also uses the precise ephemeris (.EPH) and clock bias and drift files (.CLK) provided by the University of Bern, Center for Orbit Determination in Europe (​CODE). As such, the coordinate frame used in the relative positioning is the International Terrestrial Reference Frame (ITRS) which is an Earth-Centered Earth-Fixed (ECEF) frame. Since the ephemeris files and RINEX v2 observations default to GPS Time, it is very important to also note that the time scale used in LEOGPS output files is GPS Time (as opposed to UTC).

This project also gives sincere appreciation and credit to the University of Bern, for their provision of the CODE FTP.

Installation and First Steps

First, clone this repository by running in your terminal (or Git Bash):

git clone https://github.com/sammmlow/LEOGPS.git

Second, you should do a pip install in your terminal of Martin Valgur's Pythonic translation of Yuri Hatanaka's compression library for RINEX files

pip install hatanaka

The Hatanaka library in Python was kindly contributed by Martin Valgur in v1.1, and replaces the older "RNX2CRX" (and GZIP, thanks to the unlzw3 library) which are Windows-only executables, making the (de)compression possible across all platforms.

The user can then run the application by running 'leogps.py', in the main directory, and you should see the LEOGPS GUI launch:

https://raw.githubusercontent.com/sammmlow/LEOGPS/master/docs/_static/gui-v1-3.jpg

Next, you can paste the two RINEX observation files of your LEO satellite pairs in the inputs folder, key in your configuration parameters, and hit the 'Run LEOGPS' button. That's it! LEOGPS will automatically source for the precise daily ephemeris and clock solutions, and process the raw GPS measurements to produce a report file in "LEOGPS_Results.txt" comprising:

  • The single point positions and velocities of both LEOs.
  • Precise baseline vectors between the two LEOs.
  • Dilution of precision values.

LEOGPS will also output plots and reports on the interpolated GPS satellite ephemeris and clock biases.

For full documentation, please refer to the LEOGPS Read-The-Docs.

Other Package Dependencies

Recommended Python Version > 3.6

Core libraries necessary: NumPy (v1.14 and above), matplotlib, hatanaka

Standard Python libaries: os, copy, math, datetime, decimal, shutil, subprocess, warnings, urllib.request

Libraries for GUI: PIL, tkinter

Tested on Python version 3.6.5 (Anaconda with default packages).

Contact

If you have any queries feel free to reach out to me at:

[email protected]

linkedin orcid

Last Modified on 20-Sep-2021

Comments
  • Large Oscillatory Position Errors After Receiver Clock Sync

    Large Oscillatory Position Errors After Receiver Clock Sync

    Current solutions tested on GRACE A/B formation flying satellites, exhibit positioning errors from pseudo-range solutions on the order of ~100m, and relative navigation inaccuracies in double digit centimeters. This is two orders of magnitude worse off than expected from typical precise orbit determination results used as a comparison. Ephemeris errors accruing from the orbit interpolation of the GPS satellites seem to be responsible. Current orbit interpolation uses an 11th Order Lagrange Polynomial Interpolation. A review of current range measurement modelling, and the setup of the non-linear least squares, should be conducted.

    bug 
    opened by sammmlow 3
  • Add for cross-compatibility on Linux (tested on Ubuntu 18.04).

    Add for cross-compatibility on Linux (tested on Ubuntu 18.04).

    Previous usage of '\' character conflicts with UNIX file format. Used os.sep to delineate file path for both Linux and windows ( likely MacOS as well) .

    opened by ANDREWNGT 1
  • Functionality to adjust GUI

    Functionality to adjust GUI

    Is there a way to adjust the GUI or to enable scrolling? Currently the GUI is cutoff at 40% height ("Set window length for cycle slip detection filter") on my machine. Resizing the GUI also does not resolve the issue. LEOGPS GUI

    opened by ANDREWNGT 1
  • 🌏 ❀️  LEOGPS v1.2 Pre-release Goals (Spoiler Alert)

    🌏 ❀️ LEOGPS v1.2 Pre-release Goals (Spoiler Alert)

    Goal 🎯 : Build a feature that enables relative orbit plotting.

    Feature πŸ‘οΈ : Allow the plot to be displayed directly on the LEOGPS GUI, in Hill Frame coordinates after RSN.

    Requires 🧠 : More formation flying RINEX v2 files for validation of RSN and plotting accuracy.

    documentation enhancement help wanted 
    opened by sammmlow 1
  • Use external Hatanaka library for RINEX decompression

    Use external Hatanaka library for RINEX decompression

    Hi! I recently created a carefully packaged and wrapped version of the RNXCMP tools in Python as the Hatanaka library. It simplifies the installation and usage of the tools and also makes sure any errors are raised as proper exceptions and warnings as Python warnings. In addition to the Hatanaka decompression it can also take care of the .gz/.Z compression usually applied on top of Hatanaka compression.

    I thought you might find the library useful as well. It should make sharing using of this library quite a bit simpler, I hope, as it gets rid of the need to bundle the crx2rnx and gzip executable. One caveat, though, is that it sets the minimum Python version to 3.6+, but I doubt it's an issue since Python 2 has been EOL-ed for a while now.

    opened by valgur 1
  • Use ncompress for LZW decompression

    Use ncompress for LZW decompression

    Hello again, This PR is a small follow-up to #2, which replaces the unlzw3 LZW (.Z file) decompression with the new ncompress library. It's about 40x faster than unlzw3, which is quite noticeable when some of the 10 MB RINEX files take multiple seconds to decompress with unlzw3, and it's already installed transitively with hatanaka anyway.

    opened by valgur 0
  • Added functionality to save to a relative file path.

    Added functionality to save to a relative file path.

    Issue: Saving to 1 input and 1 output clutters the folder environment

    Proposed solution: With 1 campaign name, save input and outputs like so input output | | | | campaign name campaign name

    Note: I'm not sure if this is most efficient. Maybe making the "campaign name" the parent folder instead of child folder would be easier. Following the Bernese campaign file hierarchy? In that case changes are only repositioning the directory names in gpsxtr.py, leorun.py, leogui.py, pubplt.py and rnpath.py

    opened by ANDREWNGT 0
  • To-Do: Ground Track and Orbit Visualization 🌍 🌎 🌏

    To-Do: Ground Track and Orbit Visualization 🌍 🌎 🌏

    🧠 🧠 🧠 Future Work: With the implementation of the coordinate frame transformation, tools are now available to perform both an orbit (ICRF) visualisation as well as a ground track (ITRF) visualisation.

    • Optional add-ons: zoom-able maps will be nice.
    enhancement 
    opened by sammmlow 0
  • To-Do: Processing Statistics πŸ“Š

    To-Do: Processing Statistics πŸ“Š

    🧠 🧠 🧠 Future Work: Inclusion of the processing statistics, such as pseudo range residuals, carrier to noise ratios, number of satellites in view, time series plot of which frequency signals were received.

    enhancement 
    opened by sammmlow 0
  • To-Do: Single Satellite Precise Orbit Determination πŸ›°οΈ 🌠

    To-Do: Single Satellite Precise Orbit Determination πŸ›°οΈ 🌠

    🧠 🧠 🧠 Future work: to include single-satellite cases πŸ›°οΈ . The GUI should offer to the user the option of choosing single satellite processing (precise orbit determination) or dual satellite processing (relative navigation via double differencing).

    To-Do:

    • Statistical orbit determination module
    • Options for inclusion of pseudorange or carrier phase or both
    enhancement 
    opened by sammmlow 3
  • To-Fix: GPS Antenna Offsets πŸ“‘πŸ“‘ πŸ“‘

    To-Fix: GPS Antenna Offsets πŸ“‘πŸ“‘ πŸ“‘

    ⚠️⚠️⚠️ Caution: Do not apply GPS antenna offsets as of v1.3 (pre-release). ⚠️⚠️⚠️

    GPS antenna offsets should be done in the spacecraft body frame. However, currently as LEOGPS has no feature to read in spacecraft attitude coordinates, it will not be able to tell the orientation of the spacecraft and thus applying GPS antenna offsets using XYZ coordinates in the orbit frame is erroneous. For now, this has been (conveniently) cast to future work, and users are advised not to set any non-zero offsets. The input box in the GUI has also been closed. Thus, all coordinates computed in LEOGPS of the spacecraft(s) are not of the spacecraft center of mass, but of the GPS antenna phase center.

    invalid 
    opened by sammmlow 3
Releases(1.3)
  • 1.3(Sep 22, 2021)

    🌏 πŸ“‘ 🌏 πŸ“‘ LEOGPS v1.3 Release!!! ❀️ ❀️ ❀️ ❀️

    ...

    gui-v1-3

    ...

    • Major fix in GUI re-scaling issues due to TKinter's variability in screen resolution.
    • Documented LEOGPS functions with in-depth docstrings according to PEP 257 conventions.
    • Temporarily disabled GPS Antenna Offsets (since no body-to-orbit-frame conversion feature exists yet.
    • Removed extraneous GUI parameters.
    • Cleaned up documentation and comments in the code.
    Source code(tar.gz)
    Source code(zip)
  • 1.2(Aug 9, 2021)

    🎯 LEOGPS v1.2 now supports coordinate reference frame transformation (ITRF, ICRF, and Euler-Hill for formation flying visualisation). An embedded Matplotlib graph is now included in the GUI for ease of visualisation (recommended to be set to the Hill frame).

    gui-v12

    Source code(tar.gz)
    Source code(zip)
  • 1.1(Apr 15, 2021)

    Latest release for LEOGPS v1.1

    Replaced Hatanaka executable with Martin Valgur's Pythonic translation:

    • The Hatanaka library in Python was kindly contributed by Martin Valgur in v1.1, and replaces the older "RNX2CRX" (and GZIP, thanks to the unlzw3 library) which are Windows-only executables, making the (de)compression possible across all platforms.
    Source code(tar.gz)
    Source code(zip)
  • 1.0(Mar 29, 2021)

    Official stable release for LEOGPS v1.0!

    Major bug fixes:

    • Fixed ~50m positioning errors in single point positioning (posvel.py) as GPS satellite motion across signal time of flight was not accounted for previously.

    • Fixed velocity estimation accuracy in the absence of Doppler data, by improving the polynomial interpolation of carrier phase; velocity estimates of LEO satellites, even without Doppler readings, can now be estimated with errors ~1m/s.

    • Full documentation for the LEOGPS software is now provided on a read-the-docs template.

    • Included receiver clock bias estimation errors in the final output report.

    Source code(tar.gz)
    Source code(zip)
  • 0.3(Jan 12, 2021)

    LEOGPS is an open-source Python package for absolute and relative satellite navigation, with specific intent for relative navigation between formation flying satellites. It currently supports only observations from the GPS constellation, up to L1/L2 frequency, with input files as RINEX v2.XX. It uses ephemeris and clock files from the University of Bern, CODE, in v0.3.

    Source code(tar.gz)
    Source code(zip)
Owner
Samuel Low
β™₯️ Space 🌌 Orbits πŸš€ Tech πŸ“‘ Earth 🌏 Nature 🌳 Life 🐒
Samuel Low
3D extension built off of shapely to make working with geospatial/trajectory data easier in python.

PyGeoShape 3D extension to shapely and pyproj to make working with geospatial/trajectory data easier in python. Getting Started Installation pip The e

Marc Brittain 5 Dec 27, 2022
Satellite imagery for dummies.

felicette Satellite imagery for dummies. What can you do with this tool? TL;DR: Generate JPEG earth imagery from coordinates/location name with public

Shivashis Padhi 1.8k Jan 03, 2023
Google Maps keeps old satellite imagery around for a while – this tool collects what's available for a user-specified region in the form of a GIF.

google-maps-at-88-mph The folks maintaining Google Maps regularly update the satellite imagery it serves its users, but outdated versions of the image

Noah Doersing 111 Sep 27, 2022
Simple, concise geographical visualization in Python

Geographic visualizations for HoloViews. Build Status Coverage Latest dev release Latest release Docs What is it? GeoViews is a Python library that ma

HoloViz 445 Jan 02, 2023
Blender addons to make the bridge between Blender and geographic data

Blender GIS Blender minimal version : 2.8 Mac users warning : currently the addon does not work on Mac with Blender 2.80 to 2.82. Please do not report

5.9k Jan 02, 2023
Python bindings and utilities for GeoJSON

geojson This Python library contains: Functions for encoding and decoding GeoJSON formatted data Classes for all GeoJSON Objects An implementation of

Jazzband 765 Jan 06, 2023
Pandas Network Analysis: fast accessibility metrics and shortest paths, using contraction hierarchies :world_map:

Pandana Pandana is a Python library for network analysis that uses contraction hierarchies to calculate super-fast travel accessibility metrics and sh

Urban Data Science Toolkit 321 Jan 05, 2023
Python interface to PROJ (cartographic projections and coordinate transformations library)

pyproj Python interface to PROJ (cartographic projections and coordinate transformations library). Documentation Stable: http://pyproj4.github.io/pypr

832 Dec 31, 2022
Deal with Bing Maps Tiles and Pixels / WGS 84 coordinates conversions, and generate grid Shapefiles

PyBingTiles This is a small toolkit in order to deal with Bing Tiles, used i.e. by Facebook for their Data for Good datasets. Install Clone this repos

Shoichi 1 Dec 08, 2021
peartree: A library for converting transit data into a directed graph for sketch network analysis.

peartree 🍐 🌳 peartree is a library for converting GTFS feed schedules into a representative directed network graph. The tool uses Partridge to conve

Kuan Butts 183 Dec 29, 2022
Python bindings to libpostal for fast international address parsing/normalization

pypostal These are the official Python bindings to https://github.com/openvenues/libpostal, a fast statistical parser/normalizer for street addresses

openvenues 651 Dec 16, 2022
Read and write rasters in parallel using Rasterio and Dask

dask-rasterio dask-rasterio provides some methods for reading and writing rasters in parallel using Rasterio and Dask arrays. Usage Read a multiband r

Dymaxion Labs 85 Aug 30, 2022
Python library to visualize circular plasmid maps

Plasmidviewer Plasmidviewer is a Python library to visualize plasmid maps from GenBank. This library provides only the function to visualize circular

Mori Hideto 9 Dec 04, 2022
glTF to 3d Tiles Converter. Convert glTF model to Glb, b3dm or 3d tiles format.

gltf-to-3d-tiles glTF to 3d Tiles Converter. Convert glTF model to Glb, b3dm or 3d tiles format. Usage Ξ» python main.py --help Usage: main.py [OPTION

58 Dec 27, 2022
A package built to support working with spatial data using open source python

EarthPy EarthPy makes it easier to plot and manipulate spatial data in Python. Why EarthPy? Python is a generic programming language designed to suppo

Earth Lab 414 Dec 23, 2022
Get-countries-info - A python code that fetches data of any country

Country-info A python code getting countries information including country's map

CODE 2 Feb 21, 2022
Open Data Cube analyses continental scale Earth Observation data through time

Open Data Cube Core Overview The Open Data Cube Core provides an integrated gridded data analysis environment for decades of analysis ready earth obse

Open Data Cube 410 Dec 13, 2022
Django model field that can hold a geoposition, and corresponding widget

django-geoposition A model field that can hold a geoposition (latitude/longitude), and corresponding admin/form widget. Prerequisites Starting with ve

Philipp Bosch 324 Oct 17, 2022
Geospatial web application developed uisng earthengine, geemap, and streamlit.

geospatial-streamlit Geospatial web applications developed uisng earthengine, geemap, and streamlit. App 1 - Land Surface Temperature A simple, code-f

13 Nov 27, 2022
A Jupyter - Leaflet.js bridge

ipyleaflet A Jupyter / Leaflet bridge enabling interactive maps in the Jupyter notebook. Usage Selecting a basemap for a leaflet map: Loading a geojso

Jupyter Widgets 1.3k Dec 27, 2022