Copyright: | Copyright 2007 Dean Hall. All rights reserved. |
---|---|
Author: | Dean Hall |
Revision: | 3 |
Date: | 2007/08/05 |
This page describes an early stage of experimentation with GPS navigation. For more, see the parent GPS page.
I need a GPS unit for my mobile robots in order to navigate to given coordinates outdoors. I've read that the SiRFstarIII (SSIII) chipset is the best thing going. Indeed some former GPS chip makers are now using chips made by SiRF Technology, Inc.
While researching the different SSIII modules, I noted that all the modules made for plugging into a PC were roughly the same dimensions with similar looking patch antennas. I estimate that they all use the same OEM module or that the various OEM modules are based on the same reference design. If the circuits and antennas are identical, then the differently branded modules should have roughly the same performance.
I priced many SSIII solutions and found the following two models to be the least expensive at Semsons:
Make | Model | Street Price | Picture |
---|---|---|---|
EverMore | GM-R900 | $43 | |
Holux | GR-213 | $50 |
I ordered both so I could compare resolutions and so I would have a module for my bot and my field computer.
The SSIII product insert has the closest thing to a pinout for the SSIII chip. It shows that the SSIII offers UART and SPI units for host communication. I hypothesize that at least one of the two GPS modules use the UART and a UART-to-USB bridge for its data output path. I hope to tap into the UART signals between the SSIII and the USB bridge in order to get TTL level signals that can be used by a microcontroller. I would also like to try tapping into the SPI lines, but I give a low probability that the products' firmware uses the SPI. I also estimate that the module power is provided by the USB interface. So I should be able to easily find where to provide +5 V to the circuit.
The Holux packaging has a UPC barcode and a sticker with part number and serial number on it; whereas the EverMore is in "cheap China" packaging with none of those markings. The Holux mouse looks to be a little bit smaller (by volume) than the EverMore, but I cannot prove that. The base magnet in the EverMore feels quite a bit stronger than the 2 (or more?) magnets in the Holux. The Holux module comes with a suction cup and velcro strap for mounting; the EverMore does not. The Holux module has an orange LED on the top of the case that is very easy to see. The EverMore module has a red LED inside the case, mounted on the PCB that is very difficult to see through the side of the barely translucent blue case. Worse yet, the red LED is mounted right behind the seam where the top and bottom halves of the case meet. Both modules come with a mini-CD containing (I suspect) device drivers for MS Windows and WinCE. I cannot confirm this because the mini-CDs do not fit in my slot-loading drive.
For the purposes of the Argonaut project two distinctive features make my decision of which module to use very easy. The EverMore module has its UART-to-USB bridge circuit contained in the "pod" in the cable and not in the mouse housing itself. Furthermore, the EverMore's UART-to-USB converter circuit board is clearly labled. This means the EverMore is more easily hacked to connect to a microcontroller's UART and this unit will likely end up on the robot vehicle.
The second feature that makes it easy to decide where to use each module is that the Holux and Prolific websites offer device drivers for Macintosh OS X. The driver installs as a system kernel extension: /System/Library/Extensions/ProlificUsbSerial.kext. The driver from Holux is version 1.0, but the driver from Prolific is 1.2.1.
Lastly, the study of each modules' readings, shown below, reveals that the two modules have roughly equal accuracy for outdoor measurements.
I plugged the EverMore GM-R900 into my Apple Macintosh Powerbook 12". The USB Prober application reveals that the GM-R900 uses the CP2102 (pdf1) USB-to-UART bridge from Cygnal (purchased by Silicon Labs). The Mac OS X driver for the EverMore is found at Silicon Labs. It installs the file /System/Library/Extensions/SLAB_USBtoUART.kext. A reboot is required. When the module is connected, the devices /dev/cu.SLAB_USBtoUART and /dev/tty.SLAB_USBtoUART are available.
The USB Prober application reveals that the GR-2123 uses the PL-2303 (pdf2) USB-to-UART bridge from Prolific Technology. The Mac OS X device driver is found on the Holux GR-213 downloads page, but later find a more up-to-date driver from Prolific and install it. A reboot is required. When the module is connected, the devices /dev/cu.usbserial and /dev/tty.usbserial are available.
The following method works for both modules, just use the proper device file name. For this example, I use the driver for the Holux module.
I use the Python interactive command line to open /dev/cu.usbserial0 and read from it at 4800 baud. The first line of output is junk, but after that, it's all NMEA sentences:
>>> import serial >>> s = serial.Serial("/dev/cu.usbserial", 4800) >>> while True: s.readline() #ignore any junk on the first line of output ... 'x\x0f\xcf\xf8\xe6\xe0\x86\x00VTG,,T,,M,,N,,K,N*2C\r\n' '$GPGGA,175914.000,2940.1044,N,09531.4268,W,1,04,1.8,5.4,M,-23.6,M,,0000*6F\r\n' '$GPRMC,175914.000,A,2940.1044,N,09531.4268,W,0.00,,161107,,,A*65\r\n' '$GPVTG,,T,,M,0.00,N,0.0,K,A*13\r\n' '$GPGGA,175915.000,2940.1044,N,09531.4268,W,1,04,1.8,5.4,M,-23.6,M,,0000*6E\r\n' '$GPGSA,A,3,28,11,26,04,,,,,,,,,4.4,1.8,4.0*35\r\n' '$GPGSV,3,1,10,08,67,162,23,17,63,277,,28,58,003,37,27,41,159,*7B\r\n' '$GPGSV,3,2,10,11,39,058,36,25,21,154,,29,19,278,,26,18,288,32*7F\r\n' '$GPGSV,3,3,10,04,16,192,27,20,03,113,*76\r\n' '$GPVTG,,T,,M,0.00,N,0.0,K,A*13\r\n' ^C
I made this command line script to squirt NMEA sentences to stdout so you can pipe the results wherever you like. .. I also made this NMEA parser, but it's not complete yet.
As an experiment to compare indoor reception between the EverMore and the Holux modules, I wrote gpsduel.py to capture data from both modules simultaneously. I used the following command line to get the GGA sentences from each module:
$ ./gpsduel.py --gga
I took both modules outside to get a good fix before returning inside to test. Inside, I set the modules about 10 cm apart about one meter away from large, north-facing windows. I waited one minute before starting to gather data points.
Here are the last 10 lines of each output file. First, the EverMore data from Trial 1:
$GPGGA,150606.000,2940.0824,N,09531.4222,W,1,05,2.0,31.0,M,-23.6,M,18.8,0000*43 $GPGGA,150607.000,2940.0824,N,09531.4222,W,1,06,1.1,31.0,M,-23.6,M,18.8,0000*43 $GPGGA,150608.000,2940.0824,N,09531.4222,W,1,06,1.1,31.0,M,-23.6,M,18.8,0000*4C $GPGGA,150609.000,2940.0824,N,09531.4222,W,1,06,1.1,31.0,M,-23.6,M,18.8,0000*4D $GPGGA,150610.000,2940.0824,N,09531.4222,W,1,06,1.1,31.0,M,-23.6,M,18.8,0000*45 $GPGGA,150611.000,2940.0824,N,09531.4222,W,1,06,1.1,31.0,M,-23.6,M,18.8,0000*44 $GPGGA,150612.000,2940.0824,N,09531.4222,W,1,06,1.1,31.0,M,-23.6,M,18.8,0000*47 $GPGGA,150613.000,2940.0824,N,09531.4222,W,1,05,1.2,31.0,M,-23.6,M,18.8,0000*46 $GPGGA,150614.000,2940.0824,N,09531.4222,W,1,04,6.8,31.0,M,-23.6,M,18.8,0000*4D $GPGGA,150615.000,2940.0824,N,09531.4222,W,1,06,1.1,31.0,M,-23.6,M,18.8,0000*40
Next, the Holux data from Trial 1:
$GPGGA,150607.000,2940.0896,N,09531.4356,W,1,06,1.9,-0.1,M,-23.6,M,25.8,0000*50 $GPGGA,150608.000,2940.0896,N,09531.4356,W,1,06,1.9,-0.1,M,-23.6,M,25.8,0000*5F $GPGGA,150609.000,2940.0896,N,09531.4356,W,1,06,1.9,-0.1,M,-23.6,M,25.8,0000*5E $GPGGA,150610.000,2940.0896,N,09531.4356,W,1,06,1.9,-0.1,M,-23.6,M,25.8,0000*56 $GPGGA,150611.000,2940.0896,N,09531.4356,W,1,06,1.9,-0.1,M,-23.6,M,25.8,0000*57 $GPGGA,150612.000,2940.0896,N,09531.4356,W,1,06,1.9,-0.1,M,-23.6,M,25.8,0000*54 $GPGGA,150613.000,2940.0896,N,09531.4356,W,1,06,1.9,-0.1,M,-23.6,M,25.8,0000*55 $GPGGA,150614.000,2940.0896,N,09531.4356,W,1,06,1.9,-0.1,M,-23.6,M,25.8,0000*52 $GPGGA,150615.000,2940.0896,N,09531.4356,W,1,06,1.9,-0.1,M,-23.6,M,25.8,0000*53 $GPGGA,150616.000,2940.0896,N,09531.4356,W,1,06,1.9,-0.1,M,-23.6,M,25.8,0000*50
The most telling difference between the two data sets is that the EverMore module was only receiving signals from 5 satellites 70% of the time. Meanwhile, the Holux module received signals from 6 satellites 100% of the time. However, in the other trials, Holux did not repeatedly track more satelites. The data shows enough variance that I cannot conclude that one module has better indoor reception than the other.
The critical comparison: accuracy of the lat/long coordinates. I compared the "settled" coordinate of each dataset to my "actual" lat/lon as determined by pinpointing my location (to the best of my ability) using Google Earth. I then used this website to calculate the distance between the Google Earth pinpoint and the GPS modules' coordinates.
Distance from Google Earth Reference Point | |||
---|---|---|---|
GPS Module | Trial 1 | Trial 2 | Trial 3 |
EverMore | 12.43 m | 21.79 m | 6.392 m |
Holux | 27.72 m | 68.31 m | 19.310 m |
These results show that the EverMore module is repeatedly "closer" to the reference point than the Holux module during indoor measurements.
I repeated the experiment from Indoor Reception, with a change in location. This time, I moved outside to my front lawn with a clear view of the sky. I set each module on the ground about 10 cm apart. I waited one minute for the readings to stabilize, even though both modules' LEDs already signaled a fix. Then I took the readings. Here is the last 10 lines of each output file. First the EverMore data:
$GPGGA,142957.000,2940.0791,N,09531.4230,W,1,09,1.0,10.6,M,-23.6,M,0.0,0000*72 $GPGGA,142958.000,2940.0791,N,09531.4230,W,1,09,1.0,10.6,M,-23.6,M,0.0,0000*7D $GPGGA,142959.000,2940.0791,N,09531.4230,W,1,09,1.0,10.6,M,-23.6,M,0.0,0000*7C $GPGGA,143000.000,2940.0791,N,09531.4230,W,1,09,1.0,10.6,M,-23.6,M,0.0,0000*78 $GPGGA,143001.000,2940.0791,N,09531.4230,W,1,09,1.0,10.6,M,-23.6,M,0.0,0000*79 $GPGGA,143002.000,2940.0791,N,09531.4230,W,1,09,1.0,10.6,M,-23.6,M,0.0,0000*7A $GPGGA,143003.000,2940.0791,N,09531.4230,W,1,09,1.0,10.6,M,-23.6,M,0.0,0000*7B $GPGGA,143004.000,2940.0791,N,09531.4230,W,1,09,1.0,10.6,M,-23.6,M,0.0,0000*7C $GPGGA,143005.000,2940.0791,N,09531.4230,W,1,09,1.0,10.6,M,-23.6,M,0.0,0000*7D $GPGGA,143006.000,2940.0791,N,09531.4230,W,1,09,1.0,10.6,M,-23.6,M,0.0,0000*7E
Next, the Holux data:
$GPGGA,142958.000,2940.0787,N,09531.4234,W,1,09,1.0,4.9,M,-23.6,M,,0000*6A $GPGGA,142959.000,2940.0787,N,09531.4234,W,1,09,1.0,4.9,M,-23.6,M,,0000*6B $GPGGA,143000.000,2940.0787,N,09531.4234,W,1,09,1.0,4.9,M,-23.6,M,,0000*6F $GPGGA,143001.000,2940.0787,N,09531.4234,W,1,09,1.0,4.9,M,-23.6,M,,0000*6E $GPGGA,143002.000,2940.0787,N,09531.4234,W,1,09,1.0,4.9,M,-23.6,M,,0000*6D $GPGGA,143003.000,2940.0787,N,09531.4234,W,1,09,1.0,4.9,M,-23.6,M,,0000*6C $GPGGA,143004.000,2940.0787,N,09531.4234,W,1,09,1.0,4.9,M,-23.6,M,,0000*6B $GPGGA,143005.000,2940.0787,N,09531.4234,W,1,09,1.0,4.9,M,-23.6,M,,0000*6A $GPGGA,143006.000,2940.0787,N,09531.4234,W,1,09,1.0,4.9,M,-23.6,M,,0000*69 $GPGGA,143007.000,2940.0787,N,09531.4234,W,1,09,1.0,4.9,M,-23.6,M,,0000*68
Both modules received signals from 9 satellites and kept a steady pair of coordinates. In other data sets, the Holux seems to acquire one ore more satellites than the EverMore.
Distance from Google Earth Reference Point | |||
---|---|---|---|
GPS Module | Trial 1 | Trial 2 | Trial 3 |
EverMore | 7.437 m | 1.149 m | 3.282 m |
Holux | 7.926 m | 2.782 m | 5.183 m |
These results show that the EverMore module is somewhat more accurate than the Holux module. However, this report only shows three trials. I suspect that the two modules would demonstrate equivalent accuracy if more trials were run. I noticed that the both modules acquired a fix in roughly the same time when outside, and that the Holux module would usually acquire one more satellite signal than the EverMore.
I repeat the comparison experiment, but this time, both modules are fixed to an automobile as I drive through my neighborhood. I stay in the right-most lane for the majority of the trip. One other difference is that I record RMC sentences so I can obtain course (compass heading) data in addition to location during the measurement stage. I affix each module on the roof of my car about 10 cm apart. The modules' magnetic bases hold them in place. I wait until both modules' LEDs signaled a fix. Then I start taking readings and driving. I stop taking readings when I reach my destination. I repeat the data collection for the trip home.
To compare the datasets, I convert them to a visual format. A script, gpsdueltokml.py converts files of NMEA sentences to a KML track. The output KML file can be viewed in Google Maps or Google Earth
After retracing tracks using Google Earth, it seems that the red lines of the EverMore module follow my car's path more closely and that the green lines of the Holux module have greater distortion when under tree cover. This is my qualitative opinion, not a quantitative measure.
I compared the EverMore GM-R900 and the Holux GR-213 GPS modules both of which have the SiRFstar III chipset in them. I ran multiple trials of three kinds of tests: indoor static, outdoor static and outdoor dynamic. In each kind of test the EverMore module performed a little bit better than the Holux module. This is great news because it means that the EverMore module that is the least expensive and easiest to hack is returning the better location data.
Here are the USB descriptor details for the EverMore GM-R900:
Full Speed device @ 6 (0x19100000): Composite device: "CP2102 USB to UART Bridge Controller" Device Descriptor: Descriptor Version Number: 0x0110 Device Class: 0 (Composite) Device Subclass: 0 Device Protocol: 0 Device MaxPacketSize: 64 Device VendorID/ProductID: 0x10C4/0xEA60 (Cygnal Integrated Products, Inc.) Device Version Number: 0x0100 Number of Configurations: 1 Manufacturer String: 1 "Silicon Labs" Product String: 2 "CP2102 USB to UART Bridge Controller" Serial Number String: 3 "0001" Configuration Descriptor: Length (and contents): 32 Raw Descriptor (hex) 0000: 09 02 00 20 01 01 00 80 32 09 04 00 00 02 FF 00 Raw Descriptor (hex) 0010: 00 02 07 05 81 02 40 00 00 07 05 01 02 40 00 00 Unknown Descriptor 0020: Number of Interfaces: 1 Configuration Value: 1 Attributes: 0x80 (bus-powered) MaxPower: 100 ma Interface #0 - Vendor-specific Alternate Setting 0 Number of Endpoints 2 Interface Class: 255 (Vendor-specific) Interface Subclass; 0 (Vendor-specific) Interface Protocol: 0 Endpoint 0x81 - Bulk Input Address: 0x81 (IN) Attributes: 0x02 (Bulk no synchronization data endpoint) Max Packet Size: 64 Polling Interval: 0 ms Endpoint 0x01 - Bulk Output Address: 0x01 (OUT) Attributes: 0x02 (Bulk no synchronization data endpoint) Max Packet Size: 64 Polling Interval: 0 ms
Here are the USB descriptor details for the Holux GR-213:
Full Speed device @ 6 (0x19100000): Composite device: "USB-Serial Controller D" Device Descriptor Descriptor Version Number: 0x0110 Device Class: 0 (Composite) Device Subclass: 0 Device Protocol: 0 Device MaxPacketSize: 64 Device VendorID/ProductID: 0x067B/0x2303 (Prolific Technology, Inc.) Device Version Number: 0x0400 Number of Configurations: 1 Manufacturer String: 1 "Prolific Technology Inc. " Product String: 2 "USB-Serial Controller D" Serial Number String: 0 (none) Configuration Descriptor Length (and contents): 39 Raw Descriptor (hex) 0000: 09 02 00 27 01 01 00 80 32 09 04 00 00 03 FF 00 Raw Descriptor (hex) 0010: 00 00 07 05 81 03 0A 00 01 07 05 02 02 40 00 00 Raw Descriptor (hex) 0020: 07 05 83 02 40 00 00 Number of Interfaces: 1 Configuration Value: 1 Attributes: 0x80 (bus-powered) MaxPower: 100 ma Interface #0 - Vendor-specific Alternate Setting 0 Number of Endpoints 3 Interface Class: 255 (Vendor-specific) Interface Subclass; 0 (Vendor-specific) Interface Protocol: 0 Endpoint 0x81 - Interrupt Input Address: 0x81 (IN) Attributes: 0x03 (Interrupt no synchronization data endpoint) Max Packet Size: 10 Polling Interval: 1 ms Endpoint 0x02 - Bulk Output Address: 0x02 (OUT) Attributes: 0x02 (Bulk no synchronization data endpoint) Max Packet Size: 64 Polling Interval: 0 ms Endpoint 0x83 - Bulk Input Address: 0x83 (IN) Attributes: 0x02 (Bulk no synchronization data endpoint) Max Packet Size: 64 Polling Interval: 0 ms