I recently acquired a couple of u-blox C94-M8P receivers and so I am now able to do a direct comparison between the u-blox M8T and M8P modules, something I’ve been wanting to do for a while.
I believe the hardware between the two receivers is identical, the differences are only in firmware. The most significant difference in firmware is that the M8P includes an internal RTK solution. In order to squeeze this into the firmware, however, they had to remove support for the Galileo and SBAS constellations, so this is another fairly significant difference.
Cost, of course, is also different. The M8T receivers I usually use are available from CSGShop for $75. CSG sells an M8P receiver for $240 or you can buy a kit with two C94-M8P eval boards from u-blox for $400. The C94-M8P boards also include on-board radios.
In this post, I will describe how I used RTKLIB and a cell phone hot spot to connect the M8Ps rather than using the internal radios. I will also compare the RTKLIB solutions for a pair of M8T receivers with the internal u-blox RTK solution for a pair of M8P receivers. I hope to compare the RTKLIB solution to the internal solution for a pair of M8Ps in a future post. If you are mostly interested in the M8T to M8P comparison results, you can jump directly to the end of this post.
To set up the experiment I first connected both a C94-M8P receiver and a CSG M8T receiver to the GPS survey antenna on my roof using a signal splitter. I then connected both receivers to a laptop with USB cables. I configured the M8P using u-center following instructions in the C94-M8P Setup Guide with a few modifications. First of all, I normally use an NTRIP caster over a cell phone hot spot for my real-time data link so didn’t want to bother with the on-board radios. I disabled the radios following the instructions in the setup guide. This involves removing a plastic cover, soldering a wire to a capacitor, drilling a hole in the plastic cover to run the wire, then plugging the other end into a pin on the connector. It is also possible to do this by connecting an external voltage and ground to the correct pins on the connector, but a simple jumper option would have been a lot more convenient.
The setup instructions are intended to run the setup and solution output messages over the USB port while running the RTCM raw observation messages between receivers over the UART interface. The UART interface is internally connected to the radios. Since I am not using the radios, I wanted to run all communication over the USB interface to avoid extra cables. To do this, I disabled the UART interface and configured the USB interface for UBX messages in and RTCM messages out using the UBX-CFG-PRT configure command from u-center. Following the C94-M8P setup instructions, I then specified a fixed base station location with the UBX-CFG-TMODE3 command and enabled 1005,1077,1087, and 1230 RTCM messages which include the raw observations, base station location, and GLONASS biases.
I setup the base station M8T receiver as I usually do to output the raw observations using the UBX-RXM-RAWX messages.
I then started two copies of the RTKLIB STRSVR app on the base station laptop and streamed both sets of base observations to an NTRIP server as I’ve described in an earlier post using the free RTK2GO.com community NTRIP server. With this setup, I can receive the NTRIP streams anywhere I can get cell phone coverage, using a cell phone hot spot and a laptop connected to the two rovers and I can test over much longer distances than the radios would allow.
One thing to be aware of is that there are separate versions of the receiver firmware for the M8P base and M8P rover. I didn’t realize this at first. It turned out that both of my receivers came loaded with the rover firmware so I spent an embarrassingly long time unsuccessfully trying to configure one of them as a base station. Once I realized the problem, I was able to fairly quickly download the base firmware from the u-blox website, then use u-center to download the base station firmware to the receiver.
Next, I attached the two rover receivers to a laptop using USB cables and to a single antenna using a signal splitter. To make the results more comparable to some of my other recent experiments I used the same GPS-500 L1/L2 antenna from SwiftNav that I used for those experiments. This is a more expensive antenna than generally would be used with these receivers but I wanted to avoid mixing differences between antennas with differences between receivers.
The M8P rover does not need much configuration since it will by default process any incoming RTCM messages as inputs to an RTK solution. I did configure the USB port to support NEMA, UBX, and RTCM messages in and UBX and NMEA messages out. For the static rover test, I left the position message output rate at the default 1 Hz, but increased it to 5 Hz for the dynamic rover test. I suspect this only affects the message output rate, and not the solution itself since the solution is probably run at a faster internal rate.
The only other setting I modified in the M8P rover receiver was the dynamic model of the navigation mode using the UBX-CFG-NAV5 message. I set it to “Pedestrian” for my static rover test and “Automotive” for my moving rover test.
I then started another copy of STRSVR on the rover laptop to stream the M8P base station data from the NTRIP server to the M8P rover over the USB COM port.
At this point, getting the solution output messages from the M8P rover is a little tricky. Only a single user can attach to a Windows COM port at one time and the STRSVR app is not fully bi-directional. One solution might be to use u-center to stream the NTRIP data and receive the rover messages but I did not verify if this is possible.
Instead, I used a feature of STRSVR that allows you to pipe the data coming from the other direction to a TCP/IP port which can then be processed by either another copy of STRSVR, or plotted with RTKPLOT, or used as an input to RTKNAVI, or all three at once. Below, on the left, I show how I modified the STRSVR setup that streams the base data from the NTRIP client to the rover by checking the “Output Received Stream to TCP Port” and selecting port 1000. On the right, I show the STRSVR setup necessary to stream this incoming data from the rover to a file. This is a convenient work-around for the problem of only being able to connect one user at a time to a COM port.
In my case I configured the rover receiver to send both the M8P internal solution position using NMEA messages and the raw observations using UBX messages so that I could post-process the raw observations later with RTKLIB. In general though, it is only necessary to send the NMEA messages. I configured the rover to send GGA and RMC NMEA messages, but others will work as well.
For the M8Ts, I ran a real-time RTKLIB solution using RTKNAVI and my normal kinematic solution configuration for both static and moving rover tests. As usual, I used the demo5 version of RTKLIB for this test.
So, how did they compare? First of all, a few differences to consider between the solutions. The M8P solution only uses GPS and GLONASS satellites since the SBAS and Galileo satellites have been disabled in the M8P firmware as I mentioned earlier. This should give the M8T solution an advantage. The M8P also has limited processing power relative to the laptop running the RTKLIB solution, so this may also give the M8T solution an advantage. On the other hand, I’m sure that u-blox has lots of smart people that know all the internal details of the hardware which should give the M8P solution an advantage.
For my first comparison, I did a a static rover test with the antenna located on a tripod a few meters from the house and partially obstructed by trees. To avoid different starting conditions between the two receivers, I connected both receivers to the antenna and waited till they both converged to fixed solutions before starting the test. I then disconnected the antenna for about 30 seconds, and then reconnected it. This will cause both receivers to lose lock with all satellites and the solutions will have to re-converge from scratch so this should be a fair comparison. I disconnected and reconnected the antenna several times to compare the times to re-acquire fix and the accuracies of the fixes.
The results are plotted below, the M8P internal solution on the top, and the real-time RTKLIB M8T solution on the bottom. I re-connected the antenna five times. Once, the internal M8P solution re-acquired fix slightly quicker than the RTKLIB M8T solution, once the M8T re-acquired fix slightly quicker than the M8P. The other three times, the M8T re-acquired fix significantly quicker than the M8P. The M8P times to re-acquire varied from 52 to 220 seconds. The M8T took from 50 to 76 seconds.
The M8T RTKLIB solutions had no false fixes, the M8P internal solutions had false fixes with several meter errors for over five seconds in two of the five tests. The false fixes are circled with red in the plot below.
The E-W and N-S axes matched within one centimeter between the two solutions. The U-D axis at first appears to differ by 21.5 meters between the two solutions but this is because I specified the RTKLIB vertical solution to be relative to the ellipsoid, while the M8P solution is relative to the geoid. If I subtract the geoid to ellipsoid offset (available in the GGA message from the M8P), then the two solutions match in the vertical axis as well.
Overall, I would have to say that in this particular run, the RTKLIB M8T solution out-performed the M8P internal solution by a fairly significant amount.
One other observation about the M8P solution is that the precision reported (at least in the GGA message) is only to one centimeter in the horizontal axes and 10 cm in the vertical accuracy. I didn’t see any obvious way to get outputs with better precision than this, at least with the NMEA messages. [Note 8/16/18: It turns out that the UBX-CFG-NMEA message can be used to enable high precision mode to fix this. Thanks to Charles Wang for pointing this out in a comment]
Next I mounted the same antenna on the roof of my car and drove around the neighborhood. The sky view varied from nearly unobstructed to moderate tree canopy. Here are the results of that test, the MP internal RTK solution on the left, and the M8T real-time RTKLIB solution on the right.
The fix rate for the M8P solution was 52.4%. The M8T solution was noticeably better with a 95.2% fix rate.
Here’s a plot of the difference between the two solutions (green indicates both solution are fixed, yellow indicates that at least one is float). The U-D axis differences are fairly large, mostly because of the 10 cm vertical precision of the M8P position messages. There is also a fairly large discrepancy between the two solutions around 22:55:00. This corresponds to a 15 second gap in base station data, probably due to a loss of cell phone reception. This seems to be a large error for such a short base outage but I was not able to narrow down the cause beyond this or determine which receiver contributed more to this combined error. This probably deserves more investigation in a future post.
Again, the real-time RTKLIB M8T solution appeared in this test to be better than the internal M8P solution.
The most likely reason the M8T is getting a better solution is that it is using more satellites. Here are the rover raw observations for the M8P on the left, and the M8T on the right. With the GPS and GLONASS constellations, both receivers are seeing 13 satellites. With Galileo and SBAS, the M8T is seeing an additional 7 satellites. One of these Galileo satellites is not fully operational yet and so is not used in the solution, but that still gives 6 extra satellites, nearly 50% more than the M8P solution.
If the extra satellites are what is improving the M8T solution, then running a solution with the M8T data without the SBAS and Galileo satellites should give a solution similar to the M8P solution.
This is easy to do, so let’s try it. Here’s a post-processed solution for the M8T data using only the GPS and GLONASS satellites.
Fix rate is 66.5%, reasonably close to the 52.4% fix rate from the M8P internal solution. This suggests that a large part of the improvement for the M8T solution is coming from the additional satellites and not from any differences in the solution algorithms.
As in all my comparisons, this is intended to be one user’s initial experience, and not any kind of rigorous comparison test. Please interpret these results with that in mind. If you have experiences that differ from these I would be very interested to hear about them.
13 thoughts on “Comparison of the u-blox M8T to the u-blox M8P”
does anybody know if the mentioned “workaround for the problem of only being able to connect one user at a time to a COM port” (Checkbox Output Received Stream to TCP Port) is also available under linux with str2str?
@Tim: Your site is fantastic, great work. Keep exploring!
Hi Dirk. The different apps in RTKLIB all share the same common code, only the interface is different, so generally any feature available in one app is available in all although sometimes they are not documented. To use the output streaming feature in STR2STR, append a “#xxxx” to the end of the output string where xxxx is the TCP port number to to stream to. For example the following command would stream data from an NTRIP caster to tty0 at 115k baud and anything coming back from tty0 would be streamed to TCP port 1000
str2str -in ntrip://user:password@address:port/mount -out serial://tty0:115200#1000
Great, thank you!
Thanks for these articles!
I’ve been learning a ton, and I’m really quite curious about the M8T now, as I believe the PPK capability and the sensitivity/reception would be a huge benefit to the accuracy of the UAV data I collect with my 3DR Solo, without being overly burdensome in terms of hardware/financials, as I have to spend a fair amount of time pre-processing collected data anyway.
Good post, thank you. I was a bit more positive for M8P due to additional messages it supports like RTCM 1230: My USB m8p is on the way and I hope it won’t disappoint.
I’ve noticed that there is a new, NEO-M8P-2 module being advertised a few places, such as:
This new “-2” module seems to include support for GPS L1 , GLONASS L1, BeiDou B1, GALILEO E1 using a 72-channel receiver.
Hi Wayne. I think this is an error in the Drotek listing. The NEO-M8P comes in two versions. The NEO-M8P-0 is rover only, and the NEO-M8P-2 can be used as base or rover but neither supports Galileo. Still, at $219, this will be a less expensive alternative to the CSGShop receiver when it becomes available.
Great post. I’ve just get hold of M8P recently and thinking of doing similar tests.
As for the NMEA resolution, i did found out that you can enable high precision mode in the UBX-CFG-NMEA setting. It will improve the precision of NMEA solution.
Hi Charles. Thanks for pointing this out! I’ve added a comment to the post with this info.
Great article Tim! This explains some of the issues i was having trying to get the Pixhawk2 Here+ system working, which i believe uses the m8p.
I am noticing that the manual (version 2.4.2) mentions only five fields after the fix status in the $SAT status message. I have processed some files which have four additional arguments in $SAT message after the last argument (rejc). Can you tell me how to interpret them? Here is a sample from one second:
Can you help me?
Hi Tom. Yes, I added those to the demo5 code. The additional four outputs are bias state, bias state variance, wavelength, and GLONASS hardware bias.
Thank you, Tim. You are doing a great thing to advance science.