Just a quick little FYI for future reference in case anyone goes down the road I've just been on. I have successfully used the ZED-F9P as a GNSS RTK base station for my Trimble 372 receiver, and I imagine that what I've learned will work with any Trimble receiver that can receive RTCM data from an external RS232 source on Port C. For a GPS-only fix, Trimble seems to work with message types 1005 (or 1006), 1008, and 1077. For a GPS and Glonass fix, Trimble appears to work with 1005 (or 1006), 1008, 1077, 1087, and 1230.
The message type that Trimble requires that isn't available on the ZED-F9P is 1008, which is "Antenna Descriptor." Why Trimble needs this I don't know. I wrote a simple Python program that takes RTCM data as input, and outputs the data straight out, but after each 1005 or 1006 message, it outputs a dummy 1008 message (dummy as in blank, empty fields). With this added to the RTCM stream, The 372 acquires an RTK fix fairly quickly.
I intend to convert this python program to C and run it on an arduino, which will either stand between the ZED-F9P and the base station radio, or stand between the rover radio and the Trimble receiver. I am leaning towards the former so that nothing special is required on the Trimble receiver.
Here's the Python code, which takes data on standard in and outputs to standard out:
for testing puroses, I use socat to read from one serial port, pass the data through this little program, and write it to another serial port, connected to the machine:
Maybe someone will find this useful. I'll post arduino code in the next few days.
The message type that Trimble requires that isn't available on the ZED-F9P is 1008, which is "Antenna Descriptor." Why Trimble needs this I don't know. I wrote a simple Python program that takes RTCM data as input, and outputs the data straight out, but after each 1005 or 1006 message, it outputs a dummy 1008 message (dummy as in blank, empty fields). With this added to the RTCM stream, The 372 acquires an RTK fix fairly quickly.
I intend to convert this python program to C and run it on an arduino, which will either stand between the ZED-F9P and the base station radio, or stand between the rover radio and the Trimble receiver. I am leaning towards the former so that nothing special is required on the Trimble receiver.
Here's the Python code, which takes data on standard in and outputs to standard out:
Code:
#!/usr/bin/python3
import sys
while True:
data = sys.stdin.buffer.read(1)
while (data != b'\xd3'):
data = sys.stdin.buffer.read(1)
length_data = sys.stdin.buffer.read(2)
length = (length_data[0] << 8) + length_data[1]
packet_data = sys.stdin.buffer.read(length)
crc24_data = sys.stdin.buffer.read(3)
message_number = (packet_data[0] << 8) + packet_data[1]
message_number >>= 4
sys.stdout.buffer.write(b'\xd3')
sys.stdout.buffer.write(length_data)
sys.stdout.buffer.write(packet_data)
sys.stdout.buffer.write(crc24_data)
sys.stdout.flush()
if message_number == 1005:
# blank 1008 message for Trimble
sys.stdout.buffer.write(bytes([0xd3,0x00,0x06,0x3f,0x00,0x00,0x00,0x00,0x00,0x99,0x25,0xca]))
sys.stdout.flush()
Code:
socat /dev/ttyUSB1,b57600,raw - | ./trimbleadd1008.py | socat - /dev/ttyUSB2b,38400,raw