Adding a radio link

In the last post I described setting up RTKNAVI in a simple configuration with both receivers connected directly to a laptop. While this is a good way to become familiar with RTKNAVI, it is not a useful configuration for actual measurement since the rover can’t rove for more than a few feet before running out of cable.

In this post I will describe adding a pair of HobbyKing SiK V2 Telemetry radios to separate the base from the laptop and rover. These radios are based on the same open-source design as the 3DR radios previously made by 3DRobotics and sell for $33 dollars for the pair. They are supposed to be good to up to about 300 m with the supplied antennas. There is a 915 Mhz version and a 433 Mhz version available, you will need to choose the one that is legal in your location. Both transceivers have both a USB connector and a UART connector. We will use the USB connector to connect one radio to the laptop and the UART connector on the other radio to connect to the GPS receiver. Here’s what they look like coming out of the box.

The first thing I did after opening up the package was to screw the antennas onto the transceivers since it is possible to damage the radios if they are accidentally powered up without the antennas attached.

To create the base station, I connected one of my Ublox M8N receivers to the radio and to a USB battery pack by cutting and reconnecting the cables that came with the devices.  I connected VCC for all 3 cables together, and the same for all 3 GND wires. I then connected RX to TX and TX to RX between the GPS receiver and the radio. This is what it looked like when I was done.


If you haven’t already set the baud rate on the GPS receiver it is possible to set it through the radios but it is probably easier to do it beforehand with the receiver connected directly to the laptop. In my case, I had previously set it to 115K from the RTKNAVI demo in the previous post and continued to use that baud rate for this exercise.

I then plugged the second radio into the laptop using a USB cable. I also plugged the second GPS receiver, which will be the rover, into a second USB port on the laptop, using an FTDI board to convert from UART to USB as I’ve described before.


Next I downloaded MissionPlanner, an open-source software package developed for drone users. I used this to configure the radios. It’s fairly straightforward and there’s some good documentation here to help you through it so I won’t go through all the details. This is the configuration that I ended up using after a little experimentation:


It is important to match the baud rates for the different pieces of the link. Set the kilo-baud rate (and the port number) for the laptop com port up in the top right corner. This needs to match the “Baud” setting for the local radio on the left. The “Air Speed” setting is the kilo-baud rate the radios operate at, and the two radios (local and remote) need to have the same value. The “Baud” setting on the remote radio must match the kilo-baud rate of the base GPS receiver.

Often when I changed these settings, it was difficult for me to get the complete link working again and I had to fiddle with it. Sometimes this meant clicking on “Save Settings” more than once, sometimes I would restart the Mission Planner app, sometimes the RTKNAVI app, and at least once I had to reboot the laptop. This was all rather frustrating and I don’t really know which steps helped and which didn’t, but once I stopped changing the settings, things seemed to be more stable.

You will need to be careful not to overwhelm the data link with too much data. In the previous demo I had reduced the base station sample rate to 1 Hz which is where I left it for this exercise.  In many cases, people convert the raw measurement data to RTCM format to reduce its size before sending it over the radio but this is not an option in this case because the receiver won’t output the raw measurements in RTCM format and we do not have a CPU in the base station to do the conversion.  As long as we are careful not to exceed the bandwidth of the radio link this should be OK although our rover distances may be limited since higher data rates are supposed to decrease the range of the radio.

At this point you should be able to communicate with the GPS receiver in the base station through the radio link. I started up the Ublox u-center eval software at this point just to verify that I could communicate in both directions. Make sure you disconnect or close it when you are done, or it will prevent RTKNAVI from accessing the com port.

Once you have established the radio link is working, you should be able to startup RTKNAVI and follow the instructions from the previous post to configure and run it. The only difference will be that you will probably find the radio is using a different com port than the GPS receiver so you will need to change that in the Input data stream menu.

I placed my base station on a tripod for convenience and to get the radio antenna further off the ground. I used a 8” pizza pan (88 cents at Walmart) for a ground plane. Here’s a photo of the assembled base station.


I placed the radio underneath the ground plane and the antenna pointed down in case that helped reduce possible interference between the radio and the GPS receiver but I did not do any testing to evaluate how effective this was. I probably should have also mounted the USB battery pack underneath as well just to keep things cleaner but didn’t get around to it.

I then mounted the other radio and GPS receiver antennas on top of my car to use as the rover. As I do for all my data sets, I started the data collection and then remained stationary until I got a fix. Typically this takes about 3 or 4 minutes and that is what happened in all of my runs. After starting RTKNAVI, I opened two plot windows. In the first I selected “Gnd Trk” and in the second I selected the “Nsat” plot option because this option includes a plot of age of differential, the delay in time between the rover measurement and the base station measurement. When close to the base station the age of differential remained between 0.2 and 1.2 seconds which makes sense since the base station is sampling every second and there will be a short delay for the radio link. As I got further from the rover I started to see this number increase as the radio link started to breakdown and I started to lose base observations. Here is the plot with the age of differential shown in the middle window.


Here is the ground plot and position plot from the same run.


In general, I seemed to start losing the radio link at about 100 meters. This is less than the 300 meters I was expecting, but maybe optimization of the radio settings and antenna locations would help. I did spend a little time adjusting these without seeing much difference in the results, but it was far from an exhaustive effort.

Here’s another short run where I drove out 350 meters and back showing age of differential and position. In this case I again lost the radio connection at about 100 meters and the age of differential increased all the way to the “Max Age of Diff” option (75 sec) without losing fix. It then regained a fix immediately after the age of differential dropped back below 75 seconds.


In another run, I reduced the base station sampling rate from 1 Hz to 0.2 Hz and also reduced the air speed setting of the radio from 64 to 16 to see if this would affect either the range of the radios or the reliability of the solution. I did not find it made much difference to either one. I did lose the fix after exceeding the max age of differential in this run but that may just be because I exceeded it for a longer time than in the previous example. Here is the age of differential and position plots for this run:


Overall, the radios were a little frustrating to configure, and their range was a little disappointing, but otherwise the experiment was a success.


16 thoughts on “Adding a radio link”

  1. Hi rtklibexplorer, i’m new to this field and your blog really helped me getting along with this thematics so far . I am using two C099 F9P boards from uBlox and would like to set up one of them as a base station on my roof. To configure the base board and record data for post processing I want to use a 3DR SiK radio 433Mhz 100mw radio set. I have connected the remote radio to the UART1 port (RX_ZED and TX_ZED) and set the baudrate of the radio and the board UART to 115k. I did select UBX as protocol in and RTCM3, NMEA and UBX as protocol out. Now when I connect to the local radio via my PC I can see the received data shown up in U-center but I can’t make any adjustments to my configuration, so I can’t send any data to my base board or make a SurveyIn. Long story short i think my radios are not communicating properly in both directions. I would be very happy if you could help me here.


    1. Hi mWo84. I do not have much experience with radio links. For my experiments I have been able to use cell phone data links which I find to be much simpler and reliable than radios provided you are working in areas with good cell coverage.


      1. Thank you very much for your reply. Unfortunately i still could not achieve data transmission in both directions. However, since I have preconfigured my receiver accordingly, this is also no longer mandatory. In the meantime I have upgraded my radios to 500mW and 9db antennas. I now have a good signal even to a receiving antenna not directly in sight. The radio modems have a stable connection and it shows that data is being transmitted. Unfortunately every time after converting the data with RTKCONV, I get the error no observation file in RTKLPOT. Could this be due to the overload of the bandwidth of the radios or have I made a mistake in the configuration of my receiver? UBX-RAWX is enabled on UART1, which is connected with the radio.


        1. Hi M. If you overload the bandwidth of your radio I would expect missing observations rather than no observations. If you overload the bandwidth of the u-blox receiver UART outut baud rate however I have seen this cause no valid observations to be transmitted. A mismatch baud rate between the receiver, the radio, or the RTKLIB input is also a likely cause of invalid data. I would start by disabling all messages except for a single NMEA message and making sure this is making it through your pipeline. Once you have this working, you can try enabling the raw messages and disabling all other unnecessary messages. Be sure you have the receiver UART baud rate set high enough to support the raw messages. For limited bandwidth applications like radios, I would suggest configuring the receiver to output the more highly compressed RTCM3 messages if your receiver supports them.


  2. Hello,
    I have similar problem as Cesar wrote in the first comment.
    I use two M8T receiver with radio link. I convert the base station raw data to RTCM3 messages with strsvr and after that send it with radio link.
    If I use multiple constellation (GPS, GLONASS) and for example the GPS RTCM3 message not arrived, but the GLONNASS arrived at the same time the RTKNavi not using the previous GPS data (using only the new GLONASS data), and lost the fix solution (go to single). If I use only one constellation (for example GPS) and the data not arrived, then the RTKNavi is using the previous data.
    I tried it with many version of rtklib and demo 5.
    Is it possible to configure somehow to use the previous data if one of the constellation data is missing for a while (of course whitin the “max age” settings)?

    Thank You!


  3. Thanks for that reply 🙂 helped me a lot. I will test the impact of age of differentials to the positioning solution within the next days.


    1. Hi u-Bloxer. I realize that I am not aware of any way to directly adjust the base station delay in post-processing runs but you can adjust the interval between observations when using RTKCONV to convert the raw data. This should give you a similar effect. You can collect one set of data, then run RTKCONV once for the rover data without the interval box checked and multiple times for the base station data with the interval box checked and the interval set to increasing lengths of time. Then run RTKPOST with the different sets of base observation against the one set of rover observations. This will allow you to see the effect of increasing ages of differential while avoiding variation from multiple data sets.


      1. Hey rtklibexplorer,

        thanks for that additional information. I also was not able to find a way of directely adjusting the delay of the base stations corrections stream. However what I did is similar to your suggestion. I just deleted RAWX messages in the base.ubx File. First I deleted 10, then 20, then 30,…. but I guess your suggestion (adjust the interval between observations when using RTKCONV to convert the raw data) is a much easier way. However if I would like to simulate a communication breakdown – there is only the way of deleting RAW messages in the .ubx file.



  4. Hey,

    I also use the same antennas as you do. They are used by UBLOX c94-M8P modules. If you lower the serial data rate as well and thereby also the air speed data rate (should be double the size of the serial data rate) then you would achieve a wider range. I reached up to 500meters (for serial data rate set to 9600) However setting the data rate lower you have to take care that no data loss occurs – thats the reason to use RTCM3 data- however I guess your receiver modules are not able to output RTCM3 messages [(NEO-M8P2) can output RTCM3 data]

    See also (information about the radios):

    “way to the “Max Age of Diff” option (75 sec) without losing fix. It then regained a fix immediately after the age of differential dropped back below 75 seconds.”

    I actually thought the Age of differential has a higher influence. However I am experiencing the same… I do not loose the fix up to a quite high age of differential…..
    That brings me to the question why not setting Max Age of Diff to 1000? – I mean if you do not loose the fix the solution should be accurate or not?


    1. Hi u-Bloxer. When I dropped the air speed from 64 to 16 I saw no increase in range even though I have also read from several sources that, as you say, lower air speed should help. The link you gave looks like it has some good info on making some more specific measurements of link quality so I hope to try that. I do suspect I need better antennas as a start, since I have also seen many comments suggesting that.

      As to increasing the time between the measurements (age of differential), I imagine it is very similar to increasing the distance between the measurements (baseline). As the baseline or age of differential increases, differencing the GPS measurements to cancel errors becomes less effective. It would be fairly easy to post-process some static data with increasing ages of differentials, then plot the relationship between age and error. Of course the relationship won’t always be constant, variation in the ionosphere for example will be different at different times, but it should give you some idea of how far you can push it. The error from increasing baseline will add to the error from increasing age of differential, so shorter baselines should tolerate longer age of differentials, and vice-versa.


  5. Hi !
    I’ve ordered a 3DR kit a few weeks ago, and still waiting for it, and I’ve ordered some antennas too as the included ones are usually bad.
    Look for “immersionRC sander whip antenna”

    BTW : Did you do something with my Navspark NS-HP data ?


    1. Hi Stfmani. It looks like the ImmersionRC antennas are only available for 433 Mhz, not 915 Mhz. Do you know of the best antenna to use for 915 Mhz. I’m also curious, are the radios still legal if you change the antenna?

      Sorry, I’m not sure what happened to your data. I thought I downloaded it but I can’t find it now and the link you sent me is not working. Do you mind sending me another link?


      1. Hi Rtklibexplorer!
        I’m not a specialist at all on 3DR Radio, I just learned a few things when I started to look for a wireless link between my base station and my raspberry. After a few searches, it seems that the Nagoya brand are good antenna, like the NA-915. On hobbyking, there is a customer of the same 3dr module you bought that recommend the micro whip:

        BTW: I’ve read many times that you could have some interference between the gnss receiver and the radio link transmitter.

        The link I sent to you is now active, you can re-download the NS-HP data.


  6. Hello, good test. We have used a RFDesign modules ( around 200$, short range 1.5 km) and Adeunis modules (around 400$, 500mW medium range, 6km) and they work. We transmit rtcm3. The main issue are the trees, building,hills … I have seen something that may be a bug. When there is an obstacle, in rtknavi, gps observables dissapear-appear ( you can see how sn bars blink), glonass are ok. You can see how position drops to single and again to fix several times. Its quite annoying.


    1. Hi Cesar. Thanks for the radio recommendations. In the spirit of ultra-low cost, I’m hoping to find something less expensive, but I guess sometimes you get what you pay for.

      I did not see the bug you describe in my runs even though I intentionally moved in and out of radio range multiple times. Is it possible you have “maxage” set to a very small number? That would cause the behavior you are seeing in the GPS sats, although it should show up in the GLONASS sats too. If you send me the raw data logs, I can take a look.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: