Este tutorial explica cómo integrar el u-blox ZED-F9P RTK GNSS Receptor con un robot que ejecuta ROS 2 (Jazzy). Aprenderá a conectar el hardware, configurar el receptor, configurar un espacio de trabajo ROS 2 y lanzar los nodos necesarios para recibir y procesar datos GPS de alta precisión con correcciones RTK mediante un... NTRIP .
Al finalizar esta guía, tendrá una configuración ROS 2 completamente funcional que transmite datos RTK en tiempo real desde su receptor RTK en función de u-blox ZED-F9P—adecuado para aplicaciones robóticas que requieren precisión de posicionamiento a nivel de centímetros.
Hardware requerido:
- simpleRTK2B – Kit básico de inicio
- cable USB compatible con el puerto USB de su receptor para conectarse a una PC o plataforma integrada
- una PC o plataforma integrada con acceso a Internet (en este tutorial usamos una PC)
Software requerido
- Ubuntu 24.04 (instalado de forma nativa, en una máquina virtual o mediante WSL)
- ROS 2 (Jazzy) (instalado en la plataforma Ubuntu)
Recursos útiles
- Recursos útiles para instalar Ubuntu:
- Usando WSL o máquinas virtuales: Si desea usar WSL o máquinas virtuales, es necesario compartir el receptor RTK con Ubuntu. Existen instrucciones para compartirlo con el sistema:
- NTRIP Acceso al servicio:Asegúrese de tener acceso y credenciales para NTRIP Servicio. Si necesita ayuda para encontrar un servicio de corrección, consulte nuestro Lista de NTRIP servicios de corrección en su país.
- Configuración del receptor RTKAsegúrese de que su receptor RTK esté configurado como RoverSi necesita ayuda para configurar un u-blox ZED-F9P como herramienta de edición del Rover, consulte nuestro ZED-F9P Archivos de configuración.
Cómo configurar u-blox ZED-F9P Receptor RTK con ROS 2?
Configurar el entorno ROS 2
- Una vez instalado el entorno ROS 2 siguiendo las instrucciones Guía de instalación de ROS2, de forma predeterminada no está activo cuando abres una terminal.
Para solucionar esto, abra la Terminal y ejecute el siguiente comando para configurar Ubuntu para que cargue automáticamente el entorno ROS 2 en la configuración de inicio de su Terminal.
echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
Para aplicar los cambios, use el siguiente comando. Después, ROS 2 estará listo para usar cada vez que abra una terminal.
source ~/.bashrc
- Para administrar dependencias en ROS 2, actualice su lista de paquetes e instalaciones herramientas de desarrollo de ros, Que incluye Rosdep y otras herramientas de desarrollo útiles para ROS 2.
sudo apt update && sudo apt install ros-dev-tools
Conectar el receptor RTK
- Conecte la antena RTK a su receptor. Colóquela en un lugar con buena vista del cielo o cerca de una ventana para probar su funcionamiento.
- Conecte su receptor a la PC a través del puerto USB etiquetado con “POWER+GPS."
- El receptor debería configurarse automáticamente. Para verificarlo, abra la Terminal y escriba el comando. Debería ver... / dev / ttyACM0 (o un dispositivo similar, por ejemplo, / dev / ttyACM1).
ls /dev/ttyACM*

- Para comprobar la transmisión GPS del receptor RTK, ejecute el comando en la terminal. Este muestra la transmisión de datos GPS sin procesar del receptor. Pulse Ctrl + C para detener.
sudo cat /dev/ttyACM0
- Consejo: Si no ve ningún resultado o el dispositivo no aparece, asegúrese de que su usuario tenga los permisos adecuados (por ejemplo, estar en el grupo de acceso telefónico). Puede agregarse con el siguiente comando. Después, cierre sesión y vuelva a iniciarla para que los cambios surtan efecto.
sudo usermod -a -G dialout $USER
- Prensa Ctrl + X para salir del archivo y presione Y para guardar el búfer modificado.
- Desconecte (apague) el receptor RTK y vuelva a conectarlo (apague).
- Ahora, cada vez que se conecte un receptor RTK, será accesible desde el “/dev/tty_Ardusimple" enlace. Para comprobarlo, introduzca los comandos:
sudo service udev reload
sudo service udev restart
sudo udevadm trigger
ls /dev/
Preparar un nuevo espacio de trabajo de ROS 2 para el proyecto
- Para crear un directorio de espacio de trabajo, abra una terminal y cree una carpeta (por ejemplo, ros2_ws) con un src subcarpeta:
mkdir -p ~/ros2_ws/src
- Navega a tu espacio de trabajo.
cd ~/ros2_ws
- Para crear el espacio de trabajo, utilice colcón para construir todos los paquetes dentro src:
colcon build
- Obtenga el archivo de instalación para permitir que su shell reconozca los paquetes recién creados:
source install/setup.bash
- Agregue este comando a su ~/.bashrc (o equivalente) para obtener el código fuente automáticamente cada vez que abra una nueva terminal.
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc

- Ahora tiene un espacio de trabajo ROS2 básico configurado para un mayor desarrollo e integración con ArduSimple RTK.
Inicie el nodo en ROS 2 para conectarse al receptor RTK
- Para clonar el u-blox repositorio en su espacio de trabajo ROS 2 (~/ros2_ws/src):
cd ~/ros2_ws/src
git clone --branch ros2 https://github.com/KumarRobotics/ublox.git
- Iniciar Rosdep y descargue las últimas definiciones de dependencias de paquetes.
sudo rosdep init
rosdep update

- Ahora la u-blox El nodo está disponible en su entorno ROS2.
- Modifique el archivo de configuración para actualizar las rutas o los parámetros del dispositivo según sea necesario (usaremos /dev/tty_Ardusimple). El paquete ublox_gps incluye un archivo de configuración predeterminado llamado zed_f9p.yamlAbra el archivo de configuración con el comando:
nano ~/ros2_ws/src/ublox/ublox_gps/config/zed_f9p.yaml
- Reconstruya los paquetes. Recomendamos usar un paquete separado Para tus archivos de configuración e inicio personalizados, para mantener todo organizado. Hablaremos de ese enfoque más adelante.
cd ~/ros2_ws
colcon build
source install/setup.bash

- Para evitar detener el nodo, abra una nueva terminal e inicialice el espacio de trabajo con el siguiente comando. Si este nodo se detiene, u-blox El dispositivo ya no publicará sus temas ni prestará sus servicios.
source ~/ros2_ws/install/setup.bash
- Para detener la transmisión, presione Ctrl + C.
- Ver la lista de servicios disponibles proporcionados por el Nodo.
ros2 service list
- Ahora ya tienes el u-blox Nodo ROS 2 que ejecuta y publica datos en tiempo real desde su receptor RTK.
Importante:- No detengas el u-blox Nodo. Este nodo debe estar en ejecución antes de seguir los pasos para iniciar el NTRIP cliente, ya que el servidor de corrección necesita datos GPS en vivo para calcular y enviar correcciones RTCM.
- La u-blox El nodo debe permanecer activo para visualizar la salida del GPS usando el tema echo de ros2, como se muestra en el paso anterior.
Iniciar nodo en ROS 2 para utilizar NTRIP correcciones
Nota: Asegúrese de que el nodo de conexión GPS ya esté en funcionamiento, ya que es necesario para transmitir datos de corrección.
- Navegue al directorio del espacio de trabajo de ROS2 y clone la rama ROS 2.
cd ~/ros2_ws/src
git clone --branch ros2 https://github.com/LORD-MicroStrain/ntrip_client.git
- Para evitar cerrar el Nodo, abra una nueva Terminal e inicialice el espacio de trabajo.
Nota: Si el nodo se detiene, el u-blox El dispositivo dejará de recibir datos de corrección. u-blox El nodo debe estar ejecutándose antes de iniciar el NTRIP cliente, ya que proporciona los datos GPS necesarios al servidor de corrección. Si el u-blox Si el nodo se detiene, ya no publicará los temas y servicios requeridos y el receptor rtk dejará de recibir datos de corrección.
source ~/ros2_ws/install/setup.bash
- Para evitar cerrar el Nodo, abra una nueva Terminal e inicialice el espacio de trabajo.
Nota: Si el nodo se detiene, el u-blox El dispositivo dejará de recibir datos de corrección. u-blox El nodo debe estar ejecutándose antes de iniciar el NTRIP cliente, ya que proporciona los datos GPS necesarios al servidor de corrección. Si el u-blox Si el nodo se detiene, ya no publicará los temas y servicios requeridos y el receptor rtk dejará de recibir datos de corrección.
source ~/ros2_ws/install/setup.bash
- Ver lista de temas disponibles.
ros2 topic list
- Temas clave que podrías ver:
- /rtcm: Publica datos de corrección RTCM (mavros_msgs/RTCM o rtcm_msgs/Message, según la configuración).
- /nmea:Se suscribe a las sentencias NMEA locales y las reenvía al servidor.
- /ublox_gps_node/fix:También puede reenviar datos de posición global si aún no están en formato NMEA.
- Si todo se hace correctamente, con éxito, verá que el nodo publica correcciones RTCM en el /rtcm tema. Uso cliente ntrip Nodo, puede integrar datos de corrección RTCM en su proyecto ROS 2 para permitir un posicionamiento preciso con el receptor RTK.
ros2 topic echo /rtcm
- Con este nodo, puede integrar datos de corrección RTCM en su proyecto ROS 2 para permitir un posicionamiento preciso con el receptor RTK.
Creación de un paquete de lanzamiento combinado
Crearemos un paquete dedicado que contiene un único archivo de inicio para ejecutar ambas los ublox_gps nodo (que publica datos GPS) y el cliente ntrip Nodo (que gestiona correcciones RTK) simultáneamente. Este enfoque mantiene el espacio de trabajo organizado y facilita el inicio de todos los nodos necesarios con un solo comando.
- Abra una nueva terminal, acceda a su espacio de trabajo de ROS2 y cree un nuevo paquete. Para un nanofile de lanzamiento basado en Python, ejecute los siguientes comandos:
cd ~/ros2_ws/src
ros2 pkg create combined_rtk --build-type ament_python
- Cree un directorio de lanzamiento y un archivo de lanzamiento de Python dentro del nuevo paquete.
mkdir -p combined_rtk/launch
nano ~/ros2_ws/src/combined_rtk/launch/combined_nodes.launch.py
- Copia el código del ejemplo a continuación y pégalo en el archivo. El código hace lo siguiente:
- ublox_gps Nodo: publica datos GPS sin procesar de su ArduSimple .
- cliente ntrip Nodo: Se conecta al NTRIP caster/server y publica correcciones RTCM en /rtcm (y también puede suscribirse a /nmea o /fix si es necesario).
- Shebang (#!/usr/bin/env python3) – Garantiza que el archivo se ejecute como un script de Python.
- Descripción del lanzamiento – Define qué nodos iniciar.
- Nodo parámetros: establece parámetros específicos del nodo (por ejemplo, dispositivo, host, puerto, autenticación).
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import SetEnvironmentVariable
def generate_launch_description():
# ---------------------------------------------
# Node configuration for ublox_gps
# ---------------------------------------------
ublox_node = Node(
package='ublox_gps', # ROS 2 package containing the ublox GPS driver
executable='ublox_gps_node', # Executable name for the ublox GPS node
name='ublox_gps_node', # Name assigned to the node
output='screen', # Output log to screen
parameters=[{ # Node parameters defined inline
'debug': 0, # Debug level (0 = none)
'device': '/dev/tty_Ardusimple', # Serial port where GPS is connected
'frame_id': 'gps', # Frame ID to tag published GPS messages
'uart1': {
'baudrate': 9600 # Baudrate for UART1
},
'tmode3': 1, # Survey-in mode (TMODE3 = 1)
'sv_in': { # Survey-in configuration
'reset': True, # Reset survey-in every startup
'min_dur': 300, # Minimum duration for survey-in (seconds)
'acc_lim': 3.0 # Accuracy limit for survey-in (meters)
},
'inf': {
'all': True # Enable all INF messages on console
},
'publish': {
'all': True, # Publish all available messages
'aid': {
'hui': False # Do not publish aiding HUI messages
},
'nav': {
'posecef': False # Do not publish NAV-POSECEF messages
}
}
}]
)
# ---------------------------------------------
# Environment variable to control NTRIP client debug
# ---------------------------------------------
set_debug_env = SetEnvironmentVariable(
name='NTRIP_CLIENT_DEBUG', # Name of the environment variable
value='false' # Disable debug output
)
# ---------------------------------------------
# Node configuration for NTRIP client
# ---------------------------------------------
ntrip_node = Node(
package='ntrip_client', # ROS 2 package containing the NTRIP client
executable='ntrip_ros.py', # Python script for the NTRIP client
name='ntrip_client', # Name assigned to the node
output='screen', # Output log to screen
parameters=[{ # Parameters required for NTRIP connection
'host': 'ppntrip.services.u-blox.com', # NTRIP caster hostname
'port': 2101, # NTRIP port (integer)
'mountpoint': 'NEAR-RTCM', # Mountpoint on the NTRIP caster
'ntrip_version': 'None', # Optional NTRIP version
'authenticate': True, # Use authentication (username/password)
'username': user', # Auth username
'password': 'password', # Auth password
'ssl': False, # SSL not used
'cert': 'None', # No client certificate
'key': 'None', # No client key
'ca_cert': 'None', # No custom CA certificate
'rtcm_frame_id': 'odom', # Frame ID for published RTCM messages
'nmea_max_length': 128, # Max NMEA sentence length
'nmea_min_length': 3, # Min NMEA sentence length
'rtcm_message_package': 'rtcm_msgs', # Use the rtcm_msgs message format
'reconnect_attempt_max': 10, # Max reconnect attempts before giving up
'reconnect_attempt_wait_seconds': 5, # Wait time between reconnects
'rtcm_timeout_seconds': 4 # Max time without RTCM before reconnect
}],
remappings=[
('/fix', '/ublox_gps_node/fix') # Remap /fix topic to /ublox_gps_node/fix
]
)
# Return the full launch description with all configured actions
return LaunchDescription([
set_debug_env, # Set environment variable for NTRIP debug
ublox_node, # Launch ublox GPS node
ntrip_node # Launch NTRIP client node
])
- Abierto configuración.py.
nano ~/ros2_ws/src/combined_rtk/setup.py
- Copie el código a continuación y péguelo en el configuración.py Archivo para incluir archivos de lanzamiento y dependencias. Cierre el archivo y guarde los cambios.
import os
import glob
from setuptools import find_packages, setup
package_name = 'combined_rtk'
setup(
name=package_name,
version='0.0.0',
packages=find_packages(exclude=['test']),
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
(os.path.join('share', package_name), ['package.xml', *glob.glob('launch/*')]),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='jmnavarrete',
maintainer_email='jmnavarrete@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
],
},
)
- Inicie ambos ublox_gps y cliente ntrip Nodos con un comando:
ros2 launch combined_rtk combined_nodes.launch.py
- Deberías ver registros de ambos nodos en tu terminal, indicando que:
- ublox_gps está leyendo datos GPS del dispositivo especificado (por ejemplo, /dev/tty_Ardusimple).
- cliente ntrip está conectado a tu NTRIP servidor y publicación de correcciones RTCM en /rtcm (y posiblemente suscripción a /nmea si está configurado).
- Para verificar temas, servicios y estado del dispositivo, abra una nueva terminal e inicialice:
source install/setup.bash
- La ublox_gps Node publica diagnósticos sobre un tema como /diagnóstico. Para comprobar la información de diagnóstico:
ros2 topic echo /diagnostics
Incluye mensajes de estado como precisión horizontal, precisión vertical y “corrección 3D” cuando el receptor tiene una posición válida, o “corrección no correcta” cuando el GPS aún no está corregido correctamente.
- Consejos clave para comprobar el estado de la reparación:
- Monitorear /ublox_gps_node/fix en mensajes NavSatFix (campo status.status) o mensajes de diagnóstico para estados basados en texto más detallados.
- La /diagnóstico El tema a menudo proporciona un resumen legible como "solución 3D".
- Use /ublox/navpvt Para obtener información detallada:
- El campo fix_type debe ser 3 para la corrección 3D.
- El campo de banderas debe indicar que se están utilizando correcciones.
- El campo flags2 incluye el estado RTK: 67 RTK Float, 128 RTK Fix. Si el valor es significativamente menor, probablemente significa que no se están aplicando correcciones RTK.
- Asegúrese de que su antena tenga una vista despejada del cielo y de su NTRIP caster Las credenciales son correctas para lograr una solución RTK estable.
Si quieres seguir este tutorial, tenemos todos los productos en stock y listos para ser enviados:
-
OFERTA!Made in EuropeRTK starter kits
simpleRTK2B – Basic Starter Kit
Desde 199,00€ Este producto tiene múltiples variantes. Las opciones se pueden elegir en la página del producto.