As I mentioned in an earlier post, I’ve recently acquired access to some low cost dual frequency receivers, specifically a Tersus Precis BX306 and a pair of Swift Piksi Multis. I have been playing with them over the past few weeks and plan to share my experiences with them over a series of posts.
Both receivers provide internal RTK solutions as well as raw measurements that can be processed with RTKLIB. I’m interested in how the RTKLIB solutions compare to the internal solutions as well as how both of these compare to solutions derived from single frequency data collected simultaneously with the dual frequency data.
The first issue I ran into with this experiment, however, is that both receivers will only provide an RTK solution for real-time data, neither have the capability to post-process previously collected data. This meant that I needed a way to provide a real-time stream of dual frequency base station data to the receivers. I wanted to be able to do this while driving a car around the local area so I needed more range than a low cost set of radios would give.
Fortunately, I have fairly good cell phone coverage in this area so I was able to rely on my cell phone for the data link. In this post I will explain how I did that, both for an external CORS reference station and for my own base station. In both cases I used NTRIP server/caster/clients to do this. NTRIP is a protocol for streaming of DGPS or RTK correction data via the internet using TCP/IP. The NTRIP server sends out the data to an NTRIP caster and the NTRIP client receives it. For more details, there is a good description here.
Using this setup I was able to run real-time solutions with RTKLIB as well as with the intenal RTK engines in the Swift and Tersus receivers. Here’s a diagram from the RTKLIB manual showing the setup I used for running a real-time RTKLIB solution using RTKNAVI. When I ran a Swift or Tersus solution, the configuration was similar, but the NTRIP caster streamed the base station data to STRSVR instead of RTKNAVI, and STRSVR then streamed it to the receiver where it was combined with the raw receiver observations to create an internal RTK solution. Also missing in this diagram is the cell phone which should be in between the internet and the rover PC.
The amount of free base station reference data that is available online on a real-time basis is a fair bit more limited that what is available after the fact for post-processing. Fortunately I was able to find a CORS reference station about 17 km away that is available real-time through the UNAVCO NTRIP caster. The service is free if the data is used for educational purposes and appropriately attributed. Most of their stations are on the west coast of the U.S. but they do have some scattered across the rest of the country as you can see in this map from their site. There are other networks available in other parts of the world that can be found by searching online.
To access the UNAVCO data I had to request access through email but the process was very simple and within a couple hours of my request I was all setup with an account and password.
Once I had my account set up, I used RTKLIB on my laptop computer to collect the data from the internet and stream it to the rover receiver over a serial port. If I were doing this experiment within range of a wireless router then I could leave the computer connected to the wireless. In this case though, I wanted to roam outside the range of my home wireless. To do this, I enabled a hot spot on my cell phone and logged into that with my computer.
I was able to access the raw observation data stream from the UNAVCO NTRIP caster directly using the NTRIP client option in RTKLIB. If I had wanted to generate a real-time RTKLIB solution, I would have configured the input streams of RTKNAVI but in this case I want to stream the raw data directly to the receiver so it can use the observation data for it’s internal solution. I did this using the STRSVR app in RTKLIB. I specifed the “NTRIP Client” option as input type and then entered the information from my UNAVCO account into the “Ntrip Client Options” as shown below.
In this case I wanted the data from station P041 in RTCM3 format so I had to specify the Mountpoint as “P041_RTCM3”. For other networks, the mountpoint details may be a little different. Most NTRIP casters use Port 2101, and that was the case for this one. For the STRSVR output type, I specified “Serial” and then configured the serial port options for whichever rover receiver I was using. Before doing the configuration, I had connected the receiver to the laptop using a USB cable.
I then had to configure the receiver to tell it to get its base station data from the COM port and specify that it is in RTCM3 format. The details for doing this on the two receivers are a little different but fairly straightforward in both cases. You may also need to specify the exact base station location manually or the receiver may be able to get it from the data stream depending on the receiver and NTRIP stream details.
And that’s it. With this configuration, either receiver was able to fairly quickly lock to a fixed RTK solution and continue to receive base data as long as I stayed in range of cell reception. Any lag in the base station observations appeared to be less than a second.
That worked great for using an existing external reference as base station. However, I also wanted to run another real-time experiment where I used one Swift receiver as base and the other as rover. To do this, I needed to set up an NTRIP server to stream the data to a caster on the internet as well as an NTRIP client to receive it.
I started by connecting the second Swift receiver to an old laptop with a USB cable and then downloading RTKLIB, the Swift console app, and the right USB drivers. The base station antenna is on top of my roof and the laptop is in the house so I was able to connect the laptop to the internet using my home wireless.
For the NTRIP caster, I found it convenient to use RTK2GO which is a community caster available for anyone to use at no cost. To send the data to the caster, I used the “NTRIP Server” as the STRSVR output type and configured it as shown below.
Again, the port is 2101. You can choose any name for the mountpoint. If that name is already in use, then rtk2go will assign a suffix to it, so it is best to choose a name that is unlikely to already be in use. The password at the current time is BETATEST but that may change from time to time so it’s worth verifying it is still correct.
For the STRSVR input, I selected “Serial” and specified the correct COM port for the base station receiver. In this case the raw observations are in Swift binary format which RTKLIB does not support so it sends them unaltered. If they were in a format that RTKLIB did support, then they could be converted to RTCM3 to reduce bandwidth and make them more easily usable by someone else not using a Swift receiver as rover. You can specify the conversion to RTCM3 using the “Conv” menu on the STRSVR output.
Start STRSVR and your base station observations are now accessible to anyone in the world through RTK2GO.com!
On the rover side, the NTRIP client is set up as I previously described using STRSVR except you want to use the same caster/mountpint/password as you just did on the base station. In this case the user-id is left blank. Again, set the STRSVR output to “Serial” to send it to the receiver. Then set up the receiver to get it’s base station data from the serial port and, in this case, specify that it is in the Swift Binary Protocol (sbp). Start the receiver and it should fairly quickly get a fix. If you are seeing baseline data but not a solution, then most likely you have not specified the base station location to the rover.
I was now able to drive around almost anywhere and get continuous real-time RTK solutions using either my own base station or the CORS reference station as base. In the next post I will discuss some of the data I collected and analyzed.