First Post: Setting Up the Log
I’m starting this blog to document my ongoing GNSS experiments for achieving RTK-level GNSS accuracy (sub-10 cm) without paying for commercial correction services. I do some surveying work on the side, and I'm curious to see if I can achieve accuracy on par with commercial RTK services using tools I already have—or can acquire for the cost of a few months' subscription.
Where I’m Coming From
My background is in structural engineering.I have intermediate Python skills and beginner-level GNSS know-how. My current resources are as follows:
✓ A Toknav T20 Pro GNSS receiver with FieldGenius as a logger
✓ A bit of experience with post-processing and open-source tools
✓ Access to known trig points as benchmarks
✓ A temporary RTK subscription that’s still active—but won’t be for long
So this is part necessity, part curiosity, and part mental challenge. If I can replace a six-month subscription of €500+ with a €300–500 one-time setup, that’s a win. Even better if I learn a bunch along the way.
The Three Scenarios I’ll Be Testing
1. u-blox ZED-F9P Based DIY RTK with Solar Power
Putting together a low-cost RTK base station using a u-blox ZED-F9P module, a good GNSS antenna, and a Raspberry Pi — all powered by a small solar setup. The idea is to broadcast RTK corrections over the cellular network via NTRIP to achieve centimeter-level accuracy in the field without relying on paid services
2. Post-Processing Workflow with Logged Control Points
I will use my existing RTK subscription to establish/confirm various solid benchmarks. Then, I’ll log raw measurements on these points for 1, 2, 4, 6, 8, and 10 hours. Once I’ve got the data, I’ll run the measurements through a free PPP service to get precise corrections. The goal is to use these benchmark measurements as base station data to correct other survey points with RTKLIB in post-processing. I’m aiming for centimeter-level accuracy with a single GNSS receiver acting as both the base and rover — and I’m curious to see how different log lengths and PPP data (Ultra-Rapid, Rapid, and Final) affect the results. I will provide a step-by-step breakdown of the workflow, data analysis, and hopefully some interesting insights on using RTKLIB to improve the accuracy of raw measurements with a single GNSS.
3. The “Far Out” Experiment: Error Modeling Distant CORS Corrections
I will be connecting to a distant CORS (100-300 km away) that doesn’t require a subscription — like RTK2GO or EUREF network — and investigating the errors that distance introduces to GNSS corrections. The plan is to compare the corrections with known benchmarks, model the error based on distance, and apply it to new measurements in hopes of achieving sub-decimeter accuracy. I will be running multiple iterations of the experiment under different conditions to see how this approach holds up over time. The ultimate goal is to figure out if the stream of a distant CORS can be fine-tuned to provide useful corrections.
A Note on Side Quests
Every now and then, I’ll probably drift into tangents like QGIS stuff, random data experiments, networking, retro tech, text-based gaming, and AI to name a few. These detours provide fresh stimulation that my mind needs. Please bear with me and–who knows–you might enjoy the side paths as much as the main road.
What to Expect from This Blog
✓ Practical GNSS experiments, both successful and failed
✓ Python scripts to automate workflows and processes
✓ Custom hardware setups
✓ Data explorations and visualizations
✓ Networking stuff, sometimes
✓ Other tech stuff, as the mood strikes
If all this sounds interesting, please follow along. I’ll post real data, results, and lessons learned. Let’s see if we can make centimeter-grade accuracy affordable and independent.
# “Hello, World” from the Edge of the World – Easter Island Edition from pyproj import Transformer lat, lon, h = -27.1127, -109.3497, 40 # Transform to UTM Zone 13S (EPSG:32713) transformer = Transformer.from_crs("EPSG:4326", "EPSG:32713", always_xy=True) easting, northing, height = transformer.transform(lon, lat, h) print(f"👋 Hello, World from Easter Island (lat={lat}, lon={lon})") print(f"📍 UTM 13S: E={easting:.2f}, N={northing:.2f}, H={height} m")
Future posts will (mostly) delve into the specifics of main project and subprojects related to achieving GNSS accuracy that is on par with commercial-grade RTK.
--- Log Entry Complete ---