Este tutorial explica como integrar o u-blox ZED-F9P RTK GNSS receptor com um robô executando o ROS 2 (Jazzy). Você aprenderá a conectar o hardware, configurar o receptor, configurar um espaço de trabalho ROS 2 e iniciar os nós necessários para receber e processar dados GPS de alta precisão com correções RTK por meio de um NTRIP serviço.
Ao final deste guia, você terá uma configuração ROS 2 totalmente funcional transmitindo dados RTK em tempo real do seu receptor RTK com base em u-blox ZED-F9P—adequado para aplicações de robótica que exigem precisão de posicionamento em nível centimétrico.
Hardware necessário:
- simpleRTK2B – Kit básico para iniciantes
- cabo USB compatível com a porta USB do seu receptor para conectar a um PC ou plataforma incorporada
- um PC ou plataforma embarcada com acesso à internet (usamos um PC neste tutorial)
Software necessário:
- Ubuntu 24.04 (instalado nativamente, em uma máquina virtual ou via WSL)
- ROS 2 (Jazzístico) (instalado na plataforma Ubuntu)
Recursos úteis
- Recursos úteis para instalar o Ubuntu:
- Usando WSL ou máquinas virtuais: Caso você queira usar WSL ou máquinas virtuais, é necessário compartilhar o receptor RTK com o Ubuntu. Há instruções sobre como compartilhá-lo com o sistema:
- NTRIP Acesso ao Serviço: Certifique-se de ter acesso e credenciais para NTRIP serviço. Se precisar de ajuda para encontrar um serviço de correção, consulte nosso Lista de NTRIP serviços de correção em seu país.
- Configuração do receptor RTK: Certifique-se de que seu receptor RTK esteja configurado como um Rover. Se precisar de ajuda para configurar um u-blox ZED-F9P como um Rover, consulte o nosso ZED-F9P Arquivos de configuração.
Como configurar u-blox ZED-F9P Receptor RTK com ROS 2?
Configurar ambiente ROS 2
- Quando o ambiente ROS 2 for instalado seguindo o Guia de instalação do ROS2, por padrão ele não fica ativo quando você abre um terminal.
Para corrigir isso, abra o Terminal e execute o seguinte comando para configurar o Ubuntu para carregar o ambiente ROS 2 na configuração de inicialização do Terminal automaticamente.
echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
Para aplicar as alterações, use o comando abaixo. Depois disso, o ROS 2 estará pronto para uso sempre que você abrir um Terminal.
source ~/.bashrc
- Para gerenciar dependências no ROS 2, atualize sua lista de pacotes e instalações ferramentas de desenvolvimento ros, Que inclui Rosdep e outras ferramentas de desenvolvimento úteis para ROS 2.
sudo apt update && sudo apt install ros-dev-tools
Conecte o receptor RTK
- Conecte a antena RTK ao seu receptor. Coloque-a em um local com boa visão do céu ou perto de uma janela para testar a funcionalidade.
- Conecte seu receptor ao PC através da porta USB identificada com “POWER+GPS. "
- O receptor deve ser configurado automaticamente. Para verificar isso, abra o Terminal e digite o comando. Você deverá ver / dev / ttyACM0 (ou um dispositivo semelhante, por exemplo, / dev / ttyACM1).
ls /dev/ttyACM*

- Para verificar o fluxo de GPS do receptor RTK, execute o comando no Terminal. Ele mostra os dados brutos de GPS transmitidos pelo receptor. Pressione Ctrl + C parar.
sudo cat /dev/ttyACM0
- Dica: Se você não vir nenhuma saída ou o dispositivo estiver ausente, certifique-se de que seu usuário tenha as permissões apropriadas (por exemplo, estar no grupo dialout). Você pode se adicionar com o comando abaixo. Depois, saia e faça login novamente para que as alterações entrem em vigor.
sudo usermod -a -G dialout $USER
- Imprensa Ctrl + X para sair do arquivo e pressione Y para salvar o buffer modificado.
- Desconecte (desligue) o receptor RTK e conecte-o (ligue) novamente.
- Agora, sempre que um receptor RTK estiver conectado, ele estará acessível a partir do “/dev/tty_Ardusimple” link. Para verificar isso, digite os comandos:
sudo service udev reload
sudo service udev restart
sudo udevadm trigger
ls /dev/
Preparar um novo espaço de trabalho ROS 2 para o projeto
- Para criar um Diretório de Espaço de Trabalho, abra um Terminal e crie uma pasta (por exemplo, ros2_ws) com um src subpasta:
mkdir -p ~/ros2_ws/src
- Navegue até seu espaço de trabalho.
cd ~/ros2_ws
- Para construir o espaço de trabalho, use Colcon para construir todos os pacotes dentro src:
colcon build
- Obtenha o arquivo de instalação para que seu shell reconheça os pacotes recém-criados:
source install/setup.bash
- Adicione este comando ao seu ~/.bashrc (ou equivalente) para obter o código-fonte automaticamente sempre que você abrir um novo terminal.
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc

- Agora você tem um espaço de trabalho ROS2 básico configurado para posterior desenvolvimento e integração com ArduSimple RTK.
Inicie o Node no ROS 2 para conectar ao receptor RTK
- Para clonar o u-blox repositório para seu espaço de trabalho ROS 2 (~/ros2_ws/src):
cd ~/ros2_ws/src
git clone --branch ros2 https://github.com/KumarRobotics/ublox.git
- Iniciar Rosdep e baixe as últimas definições de dependências de pacotes.
sudo rosdep init
rosdep update

- Agora o u-blox O nó está disponível no seu ambiente ROS2.
- Modifique o arquivo de configuração para atualizar os caminhos ou parâmetros do dispositivo conforme necessário (usaremos /dev/tty_Ardusimple). O pacote ublox_gps inclui um arquivo de configuração padrão chamado zed_f9p.yaml. Abra o arquivo de configuração pelo comando:
nano ~/ros2_ws/src/ublox/ublox_gps/config/zed_f9p.yaml
- Reconstrua os pacotes. Recomendamos usar um pacote separado para seus arquivos de configuração e inicialização personalizados para manter tudo organizado. Discutiremos essa abordagem mais tarde.
cd ~/ros2_ws
colcon build
source install/setup.bash

- Para evitar a parada do nó, abra um novo Terminal e inicialize o espaço de trabalho usando o comando abaixo. Se este nó for parado, o u-blox o dispositivo não publicará mais seus tópicos nem fornecerá seus serviços.
source ~/ros2_ws/install/setup.bash
- Para interromper a transmissão, pressione Ctrl + C.
- Veja a lista de serviços disponíveis fornecidos pelo Node.
ros2 service list
- Agora você tem o u-blox Nó ROS 2 executando e publicando dados em tempo real do seu receptor RTK.
Importante:- Não pare o u-blox nó. Este nó deve estar em execução antes de seguir as etapas de inicialização do NTRIP cliente, já que o servidor de correção precisa de dados de GPS ao vivo para calcular e enviar correções RTCM.
- A u-blox O nó deve permanecer ativo para visualizar a saída do GPS usando o eco do tópico ros2, conforme mostrado na etapa anterior.
Inicie o Node no ROS 2 para usar NTRIP correções
Nota: Certifique-se de que o nó de conexão do GPS já esteja em execução, pois ele é necessário para transmitir dados de correção.
- Navegue até o diretório do espaço de trabalho do ROS2 e clone a ramificação do ROS 2.
cd ~/ros2_ws/src
git clone --branch ros2 https://github.com/LORD-MicroStrain/ntrip_client.git
- Para evitar fechar o Nó, abra um novo Terminal e inicialize o espaço de trabalho.
Nota: Se o nó for interrompido, o u-blox o dispositivo deixará de receber dados de correção. O u-blox o nó deve estar em execução antes de iniciar o NTRIP cliente, pois fornece os dados GPS necessários ao servidor de correção. Se o u-blox Se o nó for interrompido, ele não publicará mais os tópicos e serviços necessários, e o receptor rtk deixará de receber dados de correção.
source ~/ros2_ws/install/setup.bash
- Para evitar fechar o Nó, abra um novo Terminal e inicialize o espaço de trabalho.
Nota: Se o nó for interrompido, o u-blox o dispositivo deixará de receber dados de correção. O u-blox o nó deve estar em execução antes de iniciar o NTRIP cliente, pois fornece os dados GPS necessários ao servidor de correção. Se o u-blox Se o nó for interrompido, ele não publicará mais os tópicos e serviços necessários, e o receptor rtk deixará de receber dados de correção.
source ~/ros2_ws/install/setup.bash
- Ver lista de tópicos disponíveis.
ros2 topic list
- Principais tópicos que você pode ver:
- /rtcm: Publica dados de correção RTCM (mavros_msgs/RTCM ou rtcm_msgs/Message, dependendo da configuração).
- /nmea: Assina frases NMEA locais, encaminhando-as para o servidor.
- /ublox_gps_node/correção: Também é possível encaminhar dados de posição global caso eles ainda não estejam no formato NMEA.
- Se tudo for feito corretamente e com sucesso, você verá o Node publicar as correções RTCM no /rtcm tópico. Usando ntrip_client Node, você pode integrar dados de correção RTCM ao seu projeto ROS 2 para permitir posicionamento preciso com o receptor RTK.
ros2 topic echo /rtcm
- Usando este nó, você pode integrar dados de correção RTCM ao seu projeto ROS 2 para permitir o posicionamento preciso com o receptor RTK.
Criando um pacote de lançamento combinado
Criaremos um pacote dedicado que contém um único arquivo de inicialização para execução ambos da ublox_gps nó (publicação de dados GPS) e o ntrip_client nó (lidando com correções RTK) simultaneamente. Essa abordagem mantém seu espaço de trabalho organizado e facilita a inicialização de todos os nós necessários com um único comando.
- Abra um novo Terminal, navegue até o seu espaço de trabalho ROS2 e crie um novo pacote. Para um nanofile de inicialização baseado em Python, execute os comandos:
cd ~/ros2_ws/src
ros2 pkg create combined_rtk --build-type ament_python
- Crie um diretório de inicialização e um arquivo de inicialização do Python dentro do novo pacote.
mkdir -p combined_rtk/launch
nano ~/ros2_ws/src/combined_rtk/launch/combined_nodes.launch.py
- Copie o código do exemplo abaixo e cole-o no arquivo. O código faz:
- ublox_gps Nó: Publica dados brutos de GPS do seu ArduSimple dispositivo.
- ntrip_client Nó: Conecta-se ao NTRIP caster/server e publica correções RTCM em /rtcm (e também pode assinar /nmea ou /fix se necessário).
- Shebang (#!/usr/bin/env python3) – Garante que o arquivo seja executado como um script Python.
- Descrição do lançamento – Define quais nós iniciar.
- Node parâmetros – Define parâmetros específicos do nó (por exemplo, dispositivo, host, porta, autenticação).
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
])
- Abra setup.py.
nano ~/ros2_ws/src/combined_rtk/setup.py
- Copie o código abaixo e cole-o no setup.py arquivo para incluir arquivos de inicialização e dependências. Feche o arquivo e salve as alterações.
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': [
],
},
)
- Lançar ambos os ublox_gps e ntrip_client Nós com um comando:
ros2 launch combined_rtk combined_nodes.launch.py
- Você deverá ver logs de ambos os nós no seu terminal, indicando que:
- ublox_gps está lendo dados de GPS do dispositivo especificado (por exemplo, /dev/tty_Ardusimple).
- ntrip_client está conectado ao seu NTRIP servidor e publicando correções RTCM em /rtcm (e possivelmente assinando /nmea se configurado).
- Para verificar tópicos, serviços e status do dispositivo, abra um novo terminal e inicialize:
source install/setup.bash
- A ublox_gps O Node publica diagnósticos sobre um tópico como /diagnósticos. Para verificar informações de diagnóstico:
ros2 topic echo /diagnostics
Inclui mensagens de status como precisão horizontal, precisão vertical e “correção 3D” quando o receptor tem uma posição válida, ou “correção não ok” quando o GPS ainda não está corrigido corretamente.
- Dicas importantes para verificar o status da correção:
- Monitore /ublox_gps_node/correção em mensagens NavSatFix (campo status.status) ou mensagens de diagnóstico para status baseados em texto mais detalhados.
- A /diagnósticos O tópico geralmente fornece um resumo legível como “conserto 3D”.
- Use /ublox/navpvt para obter informações detalhadas:
- O campo fix_type deve ser 3 para correção 3D.
- O campo de sinalizadores deve indicar que correções estão sendo usadas.
- O campo flags2 inclui o status RTK: 67 RTK Flutuante, 128 RTK Fixo. Se o valor for significativamente menor, provavelmente significa que nenhuma correção RTK está sendo aplicada.
- Certifique-se de que sua antena tenha uma visão clara do céu e de seu NTRIP caster as credenciais estão corretas para obter uma correção RTK estável.
Se você quiser seguir este tutorial, temos todos os produtos em estoque e prontos para serem enviados:
-
SaleMade in EuropeRTK starter kits
simpleRTK2B – Basic Starter Kit
De 199,00€ Este produto possui múltiplas variantes. As opções podem ser escolhidas na página do produto