GNSS simulator

An attempt to make a GNSS SDR simulator and use it for testing balloon tracker payloads. This is based on an archived LimeGPS simulator since I have a LimeSDR.

Build and run container

I built a podman container based on ubuntu 22.04 and installed the dependencies into it. Obtain the container by building:

podman-compose -f compose.yml build limegps

or pull the container

podman pull ghcr.io/anielsen001/gnss-sim:latest

and run it

podman-compose -f compose.yml run limegps

you can likely substitute docker for podman.

USB device access

With podman you need to set udev access to the usb devices for your user. On my host system I have ubuntu 24.04 which does not currently (30 Nov 2025) have a limesuite-udev pacakge on the myriadrf ppa. However myriadrf/LimeSuite github has a set of udev rules that you can use to create the udev rules for the LimeSDR.

Copy this set of rules into /dev/udev/rules.d/64-limesuite.rules.

SUBSYSTEM=="usb", ATTR{idVendor}=="04b4", ATTR{idProduct}=="8613", SYMLINK+="stream-%k", MODE="666"
SUBSYSTEM=="usb", ATTR{idVendor}=="04b4", ATTR{idProduct}=="00f1", SYMLINK+="stream-%k", MODE="666"
SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="601f", SYMLINK+="stream-%k", MODE="666"
SUBSYSTEM=="usb", ATTR{idVendor}=="1d50", ATTR{idProduct}=="6108", SYMLINK+="stream-%k", MODE="666"
SUBSYSTEM=="xillybus", MODE="666"

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666"

Reload the udev rules with

sudo udevadm control --reload-rules
sudo udevadm trigger

GPS Ephemeris files from NASA

You will need space geodesy data from NASA. These are the ephemeris files that specify the satellite orbit. Foun at https://cddis.nasa.gov/archive/gnss/data/daily/. This does require registration for a free account. You can find details about the files at https://www.earthdata.nasa.gov/data/space-geodesy-techniques/gnss/broadcast-ephemeris-data-product. These files are updated hourly and ideally you want the most recent.

For example there’s an hourly file at https://cddis.nasa.gov/archive/gnss/data/hourly/2025/337/hour3370.25n.gz that can be used.

Running simulation

start the container

podman-compose -f compose.yml run limegps

you will drop to a shell prompt in the container. Run the simulator

/opt/LimeGPS -e brdc0350.18n -l 35.274,137.014,100

LimeSDR Mini output maximum power is 10 mW. The LimeGPS executable allows you to specify the output gain using the -a flag.

Testing

Testing with U4b balloon tracker.

Connected the LimeSDR directly to the U4b using 60 dB of attenuation and a DC block and successfully simulated a GPS position.

Run the container

podman-compose run limegps

In the container run the simulator

/opt/LimeGPS/LimeGPS -a 0.7 -e /opt/project/hour3370.25n 35.274,137.014,6400.00
Warning

It appears that the specified altitude is ignored and the simulated alitude is 10m, see this GitHub issue.

LimeSDR Mini cabled to U4b balloon tracker

Putty connection to U4b in hardware test mode with simulator running

Reference projects

Back to top