The Combine Forum banner

Cómo usar ZED-F9P como estación base para Trimble

57K views 81 replies 19 participants last post by  torriem  
#1 ·
Solo un pequeño FYI para referencia futura en caso de que alguien siga el camino por el que acabo de pasar. He usado con éxito el ZED-F9P como estación base GNSS RTK para mi receptor Trimble 372, e imagino que lo que he aprendido funcionará con cualquier receptor Trimble que pueda recibir datos RTCM de una fuente RS232 externa en el puerto C. Para una corrección solo GPS, Trimble parece funcionar con los tipos de mensaje 1005 (o 1006), 1008 y 1077. Para una corrección GPS y Glonass, Trimble parece funcionar con 1005 (o 1006), 1008, 1077, 1087 y 1230.

El tipo de mensaje que Trimble requiere y que no está disponible en el ZED-F9P es 1008, que es "Descriptor de antena". Por qué Trimble necesita esto, no lo sé. Escribí un simple programa Python que toma datos RTCM como entrada y genera los datos directamente, pero después de cada mensaje 1005 o 1006, genera un mensaje 1008 ficticio (ficticio en el sentido de campos en blanco, vacíos). Con esto agregado al flujo RTCM, el 372 adquiere una corrección RTK con bastante rapidez.

Pienso convertir este programa de Python a C y ejecutarlo en un arduino, que estará entre el ZED-F9P y la radio de la estación base, o entre la radio del rover y el receptor Trimble. Me inclino por el primero para que no se requiera nada especial en el receptor Trimble.

Aquí está el código Python, que toma datos en la entrada estándar y genera en la salida estándar:
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()
Para fines de prueba, uso socat para leer de un puerto serie, pasar los datos a través de este pequeño programa y escribirlos en otro puerto serie, conectado a la máquina:
Code:
socat /dev/ttyUSB1,b57600,raw - | ./trimbleadd1008.py | socat - /dev/ttyUSB2b,38400,raw
Tal vez alguien encuentre esto útil. Publicaré el código arduino en los próximos días.
 
#2 ·
He decidido hacer la inyección del tipo de mensaje 1008 en la estación base. De esa manera, los clientes móviles simplemente funcionan.

Así que la forma en que estoy pensando en hacer esto es tener un Arduino Uno en la parte inferior, y luego la placa SimpleRTK2 en eso, y luego el módulo de radio en una placa adaptadora encima de eso. De esa manera, el puerto uart1 del Simple RTK2 se conecta directamente a la interfaz serie principal del Arduino Uno, y el pin serie TX alternativo pasará por el pin 9. El pinout del Uno proporcionará 5 V a la entrada IOREF del SimpleRTK2. Tendré que pedir algunos de esos encabezados apilables para soldar al SimpleRTK2.

Aquí hay algo de código, que usa la biblioteca AltSoftSerial, pero creo que cualquiera de las bibliotecas seriales de software funcionará para esta simple aplicación:
Code:
#include <AltSoftSerial.h>

/*
  Lee una secuencia de datos RTCM3 en el software serie
  puerto, lo emite al puerto serie incorporado.  Si
  se detecta un tipo de mensaje de 1005 o 1006, un espacio en blanco
  El mensaje 1008 se insertará en el flujo de salida,
  lo que debería permitir que una estación base ZED-F9P RTK funcione con
  Receptores móviles Trimble, que requieren 1008.

  El pin 8 es RX del módulo de radio (no utilizado)
  El pin 9 es TX al módulo de radio

  El pin 0 es RX del F9P
  El pin 1 es TX al F9P (no utilizado)

  Para Uno o placa similar. Otras placas pueden requerir
  diferentes pines para el puerto AltSoftSerial.  Ver el
  Documentación de AltSoftSerial para obtener más información.
 */

// Mensaje RTCM3 en blanco tipo 1008
const char packet1008[12] = { 0xd3,0x00,0x06,0x3f,0x00,0x00,0x00,0x00,0x00,0x99,0x25,0xca };

AltSoftSerial mySerial(8,9); // RX, TX

void setup() {
    Serial.begin(57600);
    while (!Serial) {
    ; // espere a que el puerto serie se conecte. Necesario solo para el puerto USB nativo
    }

    // establezca la velocidad de datos para el puerto SoftwareSerial
    mySerial.begin(57600);
}

void loop() {
    byte c;
    int length;
    unsigned int type;

    int count;
    c = 0;

    //Busque el inicio del mensaje RTCM3
    while (c != 0xd3) {
        if (Serial.available()) {
            c = Serial.read();
            mySerial.write(c); //páselo a la radio
        }
    }
  
    //Ok, es posible que hayamos encontrado uno, obtengamos la longitud
    count = 0;
    length = 0;
    while (count < 2) {
        if (Serial.available()) {
            c = Serial.read();
            mySerial.write(c);
            length = (length << 8) + c;
            count ++;
        }
    }
    length = length & 0x07ff; //aislar solo los 10 bits menos significativos
 
    //identificar el tipo de mensaje
    count = 0;
    type = 0;
    while (count < 2) {
        if (Serial.available()) {
            c = Serial.read();
            mySerial.write(c);
            type = (type << 8) + c;
            count ++;
        }
    }
    type = type >> 4; //aislar el tipo de los 12 bits más significativos

    //Ahora pase el resto del mensaje
    count = 0;
    while (count < length + 1) {
        //lea el cuerpo del mensaje, menos los 2 bytes de tipo, y luego
        //los 3 bytes CRC, por lo que la longitud + 1.
        if (Serial.available()) {
            c = Serial.read();
            mySerial.write(c);
            count ++;
        }
    }

    if (type == 1005 || type == 1006) {
        //inyectar un mensaje 1008
        mySerial.write(packet1008, 12);
    }
}
 
#4 · (Edited)
A pesar de mis intentos fallidos anteriores, parece que el Reach RS+ puede usar el F9P directamente como estación base. Al menos, está funcionando perfectamente esta mañana para mí. Esta inyección 1008 no es necesaria para el reach. Haré algunos experimentos más y me pondré en contacto con usted. Creo que antes estaba usando mensajes MSM4, mientras que ahora he agregado mensajes MSM7, que son redundantes con los MSM4. Haré algunas pruebas y me pondré en contacto con usted sobre esto.
 
#5 ·
Sí, el Reach RS funcionó muy bien hoy con 1005, 1077, 1087, 1097, 1127 y 1230 en la base. Ahora la pregunta es cuál es la mejor manera de obtener las correcciones para el Reach. Estoy enviando RTCM a rtk2go, por lo que puedo habilitar ntrip en el propio Reach si tiene acceso a Internet. He probado Bluetooth y el uso del cliente ntrip en el teléfono, pero no he tenido suerte con Bluetooth en el Reach. Simplemente no se conecta.
 
#6 ·
Es genial escucharlo. Es posible que tenga que probar algo similar en el futuro.

He podido hacer que el Reach RS+ envíe su ubicación a mi teléfono a través de bluetooth y habilitar ubicaciones simuladas, pero nunca lo he intentado al revés con el cliente NTRIP de Lance Lefebure. Espero que sea algo sencillo. Bluetooth siempre es delicado.
 
#7 · (Edited)
Soldé las cosas y las apilé bien. El SimpleRTK2 es perfecto para esto, ya que ya es un escudo Arduino. Todo se alimenta con un carril común de 5v, que se alimentará en el pin de entrada de 5v en el SimpleRTK. El SimpleRTK no produce suficiente energía para hacer funcionar la radio (requiere 1 amperio). El arduino podría ser capaz de hacerlo, pero es mucha carga en el regulador lineal. Así que lo alimentaré con una fuente de alimentación externa de 5v.

El SimpleRTK2 envía rtcm3 a través de uart1, al pin 1 del arduino en la parte inferior. El arduino inyecta 1008 mensajes y envía todos los datos de vuelta por el pin 9, que está conectado a la entrada de datos de la radio. La radio es un módulo de 1 vatio y 900 Mhz de Digi que rescaté de algunos otros componentes electrónicos obsoletos (9Xtend, obsoleto por SX pro), que ejecuta el firmware de salto a 112500 bps por aire. Usaré el módulo Digi SX (10 mw) en las unidades rover, de nuevo con el firmware de salto.

Simplemente lo montaré en una caja y luego estará listo para instalarlo en mi taller. No estoy seguro de cuánto puede medir el cable de la antena GPS (la antena viene con un cable de 15'), por lo que probablemente se montará dentro del taller cerca del techo. Eventualmente, podría agregar una placa ESP32 que ejecute ESPRTK para enviarla a un emisor NTRIP. Para las pruebas beta, será solo radio por ahora (siempre puedo conectar al emisor ntrip en una PC con otro receptor de radio conectado por USB).
 

Attachments

#9 ·
Realmente se limita a la línea de visión. Según la documentación de Digi, deberías poder alcanzar hasta 100 km y aún obtener una señal coherente, si no hay obstáculos entre el transmisor y el receptor. Por lo tanto, depende de tu terreno y de la altura de tu mástil de antena. Con solo unos 8 metros, puedo alcanzar fácilmente varios km, excepto en algunas áreas donde las colinas bloquean la línea de visión. Planeo instalar la antena transmisora en la parte superior de mi taller en un mástil pequeño. Debería funcionar en todas partes de mi granja, como máximo unos pocos km. Un mástil agradable de 30 metros de altura sería aún mejor y probablemente alcanzaría unos 15-20 km en mi país llano.
 
#13 ·
¡Gran hilo, chicos!

Estoy tratando de poner esto en funcionamiento con placas receptoras ArduSimpleRTKB y Drotek Sirius F9P. Diferentes integradores de sistemas, pero esencialmente las mismas entrañas ZED-F9P.

Actualmente enviando mensajes 1005, 1077, 1087, 1097, 1127 y 1230 MSM7 a través del puerto USB a una computadora portátil que ejecuta SNIP Lite. Luego, tomando esa transmisión y alimentándola a mi SNIP Pro Caster más grande, que está usando la función PFAT para agregar el mensaje 1008 de otra transmisión del receptor. Entonces, no es del todo un mensaje 1008 ficticio (vacío) allí, sino en realidad algunos descriptores en el mensaje.

Desafortunadamente, en las pruebas con un AGCO/Trimble AG-382 (que debería ser el mismo hardware que un 372) resulta en un receptor algo confundido. No está obteniendo una lectura de fijación y retención adecuada y una lectura extraña de distancia a la base (el valor predeterminado de 50.000 m).

Curiosamente, si alimento el 372 con otra transmisión MSM7 de un receptor Leica, está muy contento y obtiene una fijación en unos segundos. Las únicas diferencias que puedo ver son que la transmisión Leica MSM7 también contiene 1006 en lugar de 1005 y tiene mensajes 1013 y 1033 en la transmisión además de 1077, 1087, 1097, 1127 y 1230.

¿Alguna idea de qué debería intentar a continuación?
 
#14 · (Edited)
Por lo que vale, creo que voy a intentar agregar 1033 mensajes (Descriptores del receptor y la antena) del otro receptor al flujo u-blox, y ver si el receptor Trimble está contento con eso...

Edición:
(tomado del Manual de integración u-blox ZED-F9P)

El flujo de corrección RTCM3.3 debe contener el mensaje de sesgos de fase de código GLONASS (tipo 1230) o el mensaje de descripción de la antena del receptor (tipo 1033), de lo contrario, las ambigüedades GLONASS solo se pueden estimar como flotantes, incluso en modo RTK fijo.

...Acabo de inspeccionar el mensaje 1230 que viene del receptor u-blox (Estación 0) y lo comparé con el 1230 que viene del receptor Leica (Estación 1492)....¡Creo que me puede estar faltando un truco (de configuración) aquí!:
 

Attachments

#19 ·
....Acabo de inspeccionar el mensaje 1230 proveniente del receptor u-blox (Estación 0) y lo comparé con el 1230 proveniente del receptor Leica (Estación 1492)....¡Creo que me puede estar faltando un truco (de configuración) aquí!:
Muy interesante. ¿Qué programa estás usando para decodificar el mensaje? ¿Supongo que fuiste tú quien publicó en el foro uBlox ayer también? Espero que obtengas una respuesta. Muy curioso.
 
#15 ·
Estoy tratando de configurar una estación base también con un F9P como base. Configuré un caster SNIP NTRIP y envío la transmisión a través de STRSVR a SNIP. Con RTKNAVI de RTKLib obtengo una corrección RTK bastante buena. Pero cuando intento conectarme a mi tractor con un AG382 de Trimble instalado, tengo el mismo problema. Muestra NTRIP activo pero la distancia a la base es la predeterminada de 50.000 m. Mensajes RTCM: 1004, 1012, 1006, 1008, 1033, 1077, 1087 y 1097. ¿Qué podría estar mal con la configuración?
 
#16 ·
También estoy tratando de configurar una estación base con un F9P como base. Configuré un caster SNIP NTRIP y envío el flujo a través de STRSVR a SNIP. Con RTKNAVI de RTKLib obtengo una corrección RTK bastante buena.
Pero cuando intento conectarme a mi tractor con un Trimble AG382 instalado, tengo el mismo problema. Muestra NTRIP activo pero la distancia a la base es por defecto de 50.000 m. Mensajes RTCM: 1004, 1012, 1006, 1008, 1033, 1077, 1087 y 1097.
¿Qué podría estar mal con la configuración?
En la línea de mi última publicación, ahora sospecho que mi problema con la falta de corrección usando el AG-382 como rover y el F9P como base puede deberse a sesgos de fase de código GLONASS vacíos/incompletos en el mensaje 1230 del F9P.

Tienes una interesante mezcla de tipos de mensajes allí. ¡Algunos heredados (1004/1012) y algunos MSM7! No es la mejor idea mezclar ambos en el mismo flujo; generalmente es heredado o MSM, pero no ambos.
 
#21 ·
Mi 372 obtiene una solución fácilmente con los mensajes que describí anteriormente. Sin embargo, no sé si es solo GPS o si Glonass también está en la mezcla. Sospecho que es solo GPS, dado su descubrimiento de que los mensajes 1230 no son correctos.
 
#22 ·
Mi 372 se corrige fácilmente con los mensajes que describí anteriormente. Sin embargo, no sé si es solo GPS o si Glonass también está en la mezcla. Sospecho que es solo GPS, dado su descubrimiento de que los mensajes 1230 no son correctos.
Bueno, ahora he sacado GLONASS de la mezcla (mensajes 1087 y 1230) y solo confío en las observaciones GPS, Galileo y BeiDou MSM7.Así que enviando 1005, 1008, 1077, 1097 y 1127. Una prueba muy rápida y sucia con un rover RS2 sugiere una corrección mucho más rápida y estable. Lo intentaré de nuevo con el AG-382 mañana.
 
#23 ·
Actualización:

Sin éxito con el AG-382 y la base F9P que ejecuta MSM7 nativo, desafortunadamente. Probé varias combinaciones:

1. Se eliminaron todos los mensajes GLO (1087 y 1230)

2. Se volvió a habilitar 1087 desde el F9P y se agregaron mensajes 1033 desde la base Leica cercana (con la que el AG-382 acepta trabajar)

3. Se volvió a habilitar 1087 desde el FP9 y se agregaron mensajes "válidos" (o al menos parecen tener contenido válido) 1230 desde la base Leica cercana

Así que creo que he agotado todas las combinaciones posibles para que el AG-382 funcione con una transmisión MSM7 desde un F9P. Hay algo ahí con lo que se está atascando, pero no estoy seguro de qué.

Lo único que queda por hacer es convertir la transmisión de mensajes MSM a Classic 1004/1012 y alimentarla al AG-382, lo que, según la publicación de Konrad anterior, debería funcionar bien. Oh, bueno.
 
#24 ·
Actualización:

Sin éxito con el AG-382 y la base F9P que ejecuta MSM7 nativo, desafortunadamente. Probé varias combinaciones:

1. Se eliminaron todos los mensajes GLO (1087 y 1230)

2. Se volvió a habilitar 1087 desde el F9P y se agregaron mensajes 1033 desde la base Leica cercana (con la que el AG-382 acepta jugar)

3. Se volvió a habilitar 1087 desde el FP9 y se agregaron mensajes "válidos" (o al menos parecen tener contenido válido) 1230 desde la base Leica cercana

Así que creo que he agotado todas las combinaciones posibles para que el AG-382 funcione con una transmisión MSM7 desde un F9P. Hay algo ahí con lo que se está atascando, pero no estoy seguro de qué.

Lo único que queda por hacer es convertir la transmisión de mensajes MSM a Classic 1004/1012 y alimentarla al AG-382, lo que, según la publicación de Konrad anterior, debería funcionar bien. Bueno.
¿Por qué enviarías mensajes MSM7 en el AG-382?
 
#30 ·
Muy extraño. Debería estar funcionando. ¿Estás usando AgRemote o la pantalla RDI para hablar y configurar el receptor? En Estado DGPS, ¿muestra una identificación de estación base (generalmente 0) y una distancia de la estación base? ¿Estás obteniendo algún tipo de lectura de antigüedad?

Una cosa sobre el F9P que descubrí es que mi placa en particular (la Sparkfun RTK2) tiene una batería que guarda algunas configuraciones, incluida la latitud y longitud de la encuesta. Entonces, si cuando movía la estación base, necesitaba entrar y hacer una nueva encuesta. De lo contrario, la posición estaba desviada por la distancia que movía la estación base, lo que a veces hacía que mi 372 no obtuviera una solución, simplemente no podía resolver la ambigüedad.

De vez en cuando, el 372 no entrará en modo RTK. Dice esperando DGPS en el Pro 700. Si lo cambio a WAAS y espero una señal DGPS, y luego vuelvo a RTK, generalmente capta la solución de inmediato.
Sí, lo sé, me estoy frustrando un poco con esto. Todavía no he conectado una computadora portátil con AgRemote a un puerto serie de repuesto en el receptor; espero probar eso en los próximos días...

Al probar la placa Ardusimple, normalmente verifico todas las configuraciones, la cargo como un "rover" en u-center primero para ejecutar el receptor en modo rover, para obtener una posición fija RTK de la base Leica.
Herramientas -> Configuración del receptor (elegir archivo) -> Cargar configuración -> Transferir archivo a GNSS

Una vez que tengo las coordenadas base fijas y referenciadas, envío una configuración de "base" (como el procedimiento anterior) desde u-center a Ardusimple e ingreso las coordenadas base en u-center:

Ventana de configuración -> TMODE3 -> "Posición fija" e ingrese o verifique que las coordenadas ECEF X, Y, Z cargadas sean las mismas que la posición RTK fija del rover anterior, todo como referencia a la base Leica.

Sospecho que la solución que está obteniendo el receptor AG-382 es solo "simple" o, si se deja el tiempo suficiente, lo mejor de una solución "flotante". Nunca se acerca lo suficiente como para resolver las ambigüedades y obtener una "solución" clara como lo hace en el Leica con MSM7.

Investigaré esto más a fondo, como se dijo, ya que la pantalla VarioGuide simplemente no proporciona suficiente información allí para llamarlo. Todo lo que tengo por ahora son las indicaciones de estado según las fotos a continuación, de la pantalla host de VarioGuide.

Como se señaló en mis publicaciones anteriores, la distancia a la base se niega obstinadamente a moverse de 50,000 m (el valor predeterminado) y la antigüedad de la corrección (retardo de la señal) es más alta de lo que esperaría, variando entre 5 y 8 segundos normalmente. La mejor precisión que he visto (después de 40 minutos) es de 3 cm.

Por otro lado, la base Leica que funciona desde el mismo emisor, casi de inmediato da la distancia correcta a la base (menos de unos cientos de metros) y la antigüedad de la corrección es de alrededor de 0 a 1 segundo (como normalmente esperaría con NTRIP). Por lo general, converge en cuestión de segundos o menos de un minuto cuando está 'frío'.

Al revisar los mensajes RTCM3 anteriores, es (como era de esperar) evidente que los dos receptores base están procesando observaciones de código ligeramente diferentes para las diversas constelaciones. Las observaciones de código Leica en los mensajes MSM7 parecen más "completas". ¿Quizás como cabría esperar con un receptor de clase de referencia?

Leica
GPS: L1C, L2W, L5Q
GLONASS: L1C, L2P
Galileo: E1C, E5Q
BeiDou: B1, B2

ZED-F9P en Ardusimple RTK2B
GPS: L1C, L2L
GLONASS: L1C, L2C
Galileo: E1C
BeiDou: B2I

Hay una preocupación preocupante en mi mente, basada en lo que alguien más me dijo en el foro TFF hace un tiempo, efectivamente que el u-blox F9P es una causa perdida que actúa como base con receptores de terceros heredados, cito:

"Todos los 'expertos' que afirman que los receptores de doble frecuencia de bajo costo van a ser una gran alternativa a las estaciones base de las principales marcas sin probar primero las especificaciones. No hay código P, solo L2C, lo que significa que, de fábrica, su Topcon, Trimble, etc. no se fija en RTK. Lo sé, he pasado algún tiempo probándolo."

Hmmmm....sí.
 

Attachments

#31 · (Edited)
EDIT: Así que estaba mirando tus capturas de pantalla y me doy cuenta de que dice RTCM 3.1. Estoy bastante seguro de que el F9P está usando RTCM 3.2. Pero, de nuevo, el Leica está usando los mismos mensajes y, por lo tanto, la misma versión RTCM. Así que eso no debería hacer ninguna diferencia.
 
#32 ·
Sí, el F9P definitivamente está usando RTCM 3.2, ya que los mensajes MSM modernos solo se introdujeron a partir de esa revisión del estándar. RTCM 3.1 es "solo" los tipos de mensajes heredados originales y solo GPS+GLO. Sin embargo, como casi has dicho, creo que es una distracción, hasta cierto punto, ya que el 382 está muy contento de recibir MSM7 de la base Leica....

Investigaré las cifras DOP en la pantalla y las compararé con ambas correcciones de base. También conectaré mi computadora portátil al techo para ver qué otra información puedo obtener directamente del receptor.

Gracias por tus pensamientos y ayuda. Es apreciado.
 
#33 ·
Así que hoy volví a revisar mi configuración. Por alguna razón, los números DOP nunca parecen cambiar, ya sea en RTK o WAAS. Sin embargo, en la consola AgRemote (RDI en el pro700), en Estado del GPS, dice que la fuente de posición es RTK Fix. Además, mi teléfono que ejecuta el cliente Lebefure NTRIP informa que el 372 está en modo RTK completo, no RTK Float, y el flujo NMEA que proviene de él informa una precisión horizontal de 2,0 cm. En WAAS, eso suele ser alrededor de 100 cm. RTK Float generalmente se informa como 50 cm en mi experiencia.

Así que estoy bastante seguro de que estoy obteniendo un RTK Fix completo en el 372, con entre 8 y 12 satélites.

Una cosa que pensé es usar AgRemote para ver cuáles son sus máscaras SNR y de elevación. Cambiar esas máscaras puede incluir más satélites en la solución, lo que podría ayudar.
 
#34 ·
- La cantidad y los ID de los SV se muestran para el Leica pero no para la base F9P, lo que indica "00SVs"
 

Attachments