When the UPS guy drops off some new long-anticipated electronics component at your front door, you may be hit with two competing thoughts:
- First-date-level excitement about the capabilities of the new component and the possibilities it will open up for your projects
- Final-exam-level dread of the process of figuring out how to use the thing
#2 can be especially pronounced when you’re an early adopter and the internet hasn’t yet given birth to much documentation about your newly acquired component.
Since that fateful day in early 2018 when u-blox announced the ZED-F9P L1/L2/L5 GNSS receiver, I’ve logged an embarrassing count of visits to their website anticipating every new piece of information that they would publish about the little ZED.
Eventually u-blox announced they would call the official development board the C099-F9P. As an old-school believer in the technology maxim that you wait ’till the 3rd iteration of some new product before adopting, I had hoped that u-blox would quickly release a few updates to the dev kit so that I could feel like a wise old sage buying the more refined product.
Well, Digi-Key began selling the C099-F9P dev kit and I could only wait a month or so before caving in and buying two:
Unboxing the C099-F9P High Precision GNSS RTK Development Kit
When you unbox your C099-F9P, here’s what you’ll find:
Hooking up the components yields this:
If you go on a late-night RTK GNSS wiki binge, you’ll likely have your brain numbed as you start to uncover the considerations involved in distilling the faint chirps from several dozen non-homogeneous satellites orbiting our planet 12,000 miles away into a centimeter accurate position in your front yard 20 times per second.
Let’s be clear: this blog post will not add to that scientific body of knowledge at all — instead, I’m assuming you’re a layman from some field other than RTK GNSS and you’ve stumbled across this ground-breaking technology as it’s effectively the only game in town for repeatable absolute centimeter-level outdoor positioning.
Shortcuts to High Precision GNSS with the Revolutionary ZED-F9P (or “Early Adopter Tax Evasion”)
This blog post should serve as a crash-course in getting your ZED-F9P rolling. Success on my part will be measured in helping you avoid much of the early adopter tax that I had to dutifully pay through the usual fog of frustration and confusion that eventually gave way to the thrill of using a game changing component.
At this point I’m going to suggest something that (I think) you’ll eventually thank me for: Go ahead and buy two C099-F9P dev kits so that you can stand up your own Base Station. Trust me, at some point this will almost certainly feel like the best $250 USD investment you’ve ever made.
We’re going to set up one of the C099-F9Ps as the “Base Station” (to provide “Corrections”) and the other as the “Rover”. You have the option to use some local correction source if available, or to use a subscription correction service (i.e. the dev kit comes with a free trial subscription to a remote correction service called HxGN SmartNet — I’ve not used). Your mileage may vary, but I’ve never regretted setting up my own base station and relaying the RTCM corrections on a dedicated radio link.
Let’s start with the simplest possible use-case — hard-wiring the corrections output directly from the “Base Station” board to the “Rover” board (via a male-to-male breadboard wire). Once you have the setup running with a wired RTCM connection, you’re just a pair of 3DR radios away from a long-range wireless RTK setup.
RTK success with two C099-F9P boards wired to each-other
Here are the high level items we’ll accomplish to get our self-contained RTK system running:
- Connect to your ZED-F9P from within u-center
- Update the ZED-F9P receiver firmware on both C099-F9P boards to the latest from u-blox
- Set up one C099-F9P board as the Base Station, one C099-F9P board as Rover, and wire RTCM output from Base Station to Rover
1. Connect to your ZED-F9P from within u-center
On Windows 10 (no knowledge if this procedure works on other versions of Windows), before you plug in the C099-F9P, open up the Device Manager and expand the Ports item. Now plug in the C099-F9P and you should see 3 new ports that appear — one for the ODIN-W2 radio (COM7 in the example below), one for the ZED-F9P (COM6 below), and a USB Serial Device port that’s apparently some kind of all-in-one port where you don’t have to guess baud rates correctly. It’s much easier IMO to use this port (COM3 below).
From within u-center (I’m using u-center 19.04 which is the latest as of May 2019), click the down arrow next to the port icon in the upper left and you should see a port number corresponding to the USB Serial Device you noted above (COM3 for me). Select this port and we’re now connected to the dev board.
2. ZED-F9P firmware update
Updating to the latest firmware may not be required, but it’s quick and easy — so I’d say go for it.
Here’s a little video I made of updating the ZED-F9P firmware.
3. Set up one C099-F9P as the Base Station, the other C099-F9P as the Rover, and wire RTCM output from Base Station to Rover
You’ll need to know your Base Station antenna’s coordinates to complete this section. If you’re not familiar with how to get those coordinates, check out Addendum 1 below.
The configuration procedure we follow in the video below configures the receiver to output NMEA PVT (Position, Velocity, Time) to the
UART2 (June 2019 update: output on UART2 has been spotty — so I’m just using UART1 for PVT output) UART1 Tx port at 5Hz (i.e. a new reading every 0.2 seconds) at 115k baud. It also configures the UART2 Rx port to receive RTCM corrections at 115k baud. These settings are convenient for the mower rover we blogged about last time. Note that you can set the output rate up to 20Hz, but you may need to bump up the baud to something higher than 115k (otherwise the line may get clogged up and the readings would be delayed). On the slow rover we’re using to cut the grass, 5Hz is plenty and the Pixhawk 4 we’re using communicates nicely at 115k baud.
If you’ve followed the steps above, then you can easily send RTCM correction data from the Base Station to the Rover by connecting the the Base Station UART1 Tx to the Rover UART2 Rx with a simple breadboard wire.
Caveat: the one-wire approach will work if you’re powering both boards with an electricity source with a common ground. If not, you can just connect the two boards’ GND sockets together (you’ll find multiple GND sockets on the dev board) with another breadboard wire.
It wasn’t obvious to me from the documentation which sockets on the C099 board map to UART1 and UART2 — perhaps all other humans were born with this knowledge. Here’s a little mapping diagram that will hopefully help future travelers:
You’ll note that we’ve taped off the ODIN radio antenna jack (remember that I don’t use the on-board ODIN radio). This just gives me one less thing to remember when connecting the GNSS antenna to the dev board.
ZED-F9P real world performance demonstration
Here’s a little video showing why this small RTK receiver is so significant:
Rolling our own long-range corrections link
If you’ve been using u-blox high precision gnss components since the NEO-M8P, then you may have previously used the superbly easy-to-use and capable C94-M8P development kit for that (L1-only) module. The C94-M8P basically did everything right from an ease-of-use standpoint for a builder wishing to probe that gnss module’s functionality. For instance, the development kit was sold as a pair of modules (i.e. so that you weren’t tempted to skip setting up your own local base station), the radio was based on SiK telemetry achieving great range, and the procedure for setting up a base station / rover system was very simple and well documented.
I spent several unrecoverable hours trying to get two C099-F9Ps to communicate with each-other via the on-board ODIN-W260 radio. Efforts tried include downloading multiple versions of the s-center radio evaluation software, feverishly googling for any kind of documented success story setting up the link, setting jumpers, and flashing various firmwares and configuration settings to the dev board. I’m not sure if you’d describe my efforts as total failure or absolute failure, but I never saw any sign that I was close to actually making the communication link work.
Fortunately, long-range radios have become very cheap in recent years, so snag a pair off eBay, Amazon or SparkFun and you’ll have a long-range RTCM corrections link between the Base Station and Rover with minimal effort.
3DR radio configuration
Mission Planner has built-in functionality to configure the radios.
Here’s a close-up of the relevant screen in Mission Planner, along with the settings of the radios that I’m using for the link:
Now that the radios are communicating, it’s time to remove the RTCM wire connecting the ZED-F9Ps to each-other and instead connect them wirelessly via the radios.
That’s all there is to it! Note the solid yellow light on the Rover indicates it has an RTK fix — I love seeing that light.
- Tomoji really is the proverbial giant on whose shoulders many stand and see far. If you’re not familiar with him (i.e. you’re new to low-cost RTK GNSS), he wrote an ENTIRE OPEN-SOURCE RTK LIBRARY (humbly and simply called RTKLIB) that’s historically significant as it enabled the first forays of hobbyists with low-cost (i.e. < 100USD) u-blox GNSS receivers (such as the NEO-M8T) into the previously exclusive world of RTK. Tomoji actively keeps a predictably low-key blog of his research notes, which is approachable to non-Japanese audiences via the Google Translate extension in your fav browser.
- Clive possesses a savant-level command of several technical spheres. Fortunately for us, he decided years ago to begin ascending the RTK mountain — he has pointed many aspiring GNSS journeymen toward the correct path.
- Tim had two important realizations in early 2016: 1. the significance of RTKLIB (i.e. the world it opened up by processing raw data output from low-cost u-blox receivers) and 2. the difficulty that non-gnss-professionals were having approaching RTKLIB. His tremendous blog has revealed the ways of Tomoji to mortal man. Additionally he has become a trusted voice (through actual field use) critiquing the various RTK GNSS offerings appearing over the past few years.
- To be fair to this (first) version of the C099-F9P — the C94-M8P development kit went through a few releases before arriving at the final refined product.
- The M8P will always occupy a special place in my heart as it signaled to thousands of makers hoping for robust afforable RTK that u-blox was getting ready to play.
Addendum 1: Finding Latitude/Longitude/Elevation for your local Base Station Antenna
The absolute accuracy of your rover’s position is directly tied to the accuracy of the longitude/latitude/elevation that you provide to your base station as it’s antenna’s location. In order to find out the longitude/latitude/elevation of your base station antenna, you’ve got several options, including:
- Rough guess by using a site like this: https://www.maps.ie/coordinates.html
- Pipe in corrections from some RTCM correction source you have access to into your Rover C099-F9P (i.e. with your Rover C099-F9P hooked up to the base station antenna) and, assuming you get an RTK Fix, note the Lat / Long / Altitude in u-center.
- On the ZED-F9P that’s hooked up to the base station antenna, run the u-blox Survey In procedure (the u-blox C099-F9P GitHub folder has instructions for running Survey In, but I couldn’t ever get it to seem to work).
- Pay a professional surveyor to survey your base station antenna location.
If options 2 through 4 in the list above don’t make immediate sense, just grab the approximate longitude / latitude / elevation via the website (or any similar website) in #1, i.e.:
So, as an example, assuming that the map location above is zoomed in on your base station antenna, you would just pull the coordinates provided:
Elevation: 66m* (I’m not sure how accurate the website’s elevation is, but you will want to remember to add the height that your antenna is above ground to this number).