Title: Stunning QZSS figure-eight pattern from a budget GPS module

I wanted to share this beautiful “figure-eight” track of QZSS satellites I captured from my study window in Hirosaki.

It is truly impressive what a simple, inexpensive USB GPS module (costing less than 1,000 JPY) can achieve when set up properly. As shown in the attached image, I just placed it by my window, and it successfully tracked the precise orbits.

It’s always a joy to see such clean data from such modest equipment!

3 Likes

can you explain what is you post, as i’m noob?

2 Likes

btw the track remind me the gps / high orbit sat motion on sky over optical observations

1 Like

Thanks for the comment, bali!

QZSS (Quasi-Zenith Satellite System), or “Michibiki,” is a Japanese satellite constellation designed to enhance GPS in the Asia-Oceania region.

The reason for this “figure-eight” pattern is that these satellites are in a specialized “high-inclination” orbit. They are designed to spend most of their time near the zenith (directly overhead) in Japan, which is why their ground track forms that distinct shape over time. It’s effectively a stationary-like performance despite the movement!

2 Likes

Also, I have attached a screenshot of the GPS module data currently running on the same Linux machine (LMDE 7) just for reference. It is working very smoothly.

1 Like

In addition to the QZSS ‘figure-eight’ pattern, I’m getting great results with other constellations as well. Here is a screen recording of my Linux system tracking them all in real-time.

1 Like

Following up on the QZSS/GPS tracking discussion, I wanted to share the simple Python script I’m using to capture the raw NMEA data.

It’s a straightforward approach: it reads the stream from my u-blox 7 module, filters for the NMEA data, and logs it to a text file for further analysis.

Python

import serial

# Configure your port and baudrate accordingly
PORT = '/dev/ttyACM0'
BAUDRATE = 9600
OUTPUT_FILE = 'my_gps_log.txt'

try:
    with serial.Serial(PORT, BAUDRATE, timeout=1) as ser:
        print("--- Start Logging ---")
        with open(OUTPUT_FILE, 'a') as f:
            while True:
                # Read a line from the GPS module
                raw_line = ser.readline()
                # Decode to ASCII, ignoring errors
                line = raw_line.decode('ascii', errors='ignore')
                # Filter and save/print data starting with '$'
                if line.startswith('$'):
                    print(line.strip())
                    f.write(line)
except Exception as e:
    print(f"Error: {e}")

It requires the pyserial library (pip install pyserial).

This script has been the foundation for the tracking visualizations I shared earlier. If you’re looking to start your own DIY satellite tracking project on Linux, this is a great place to begin!

Has anyone else built similar loggers using different approaches or languages?

1 Like