В этом руководстве объясняется, как интегрировать u-blox ZED-F9P Приемник RTK GNSS с роботом, работающим под управлением ROS 2 (Jazzy). Вы узнаете, как подключить оборудование, настроить приемник, настроить рабочее пространство ROS 2 и запустить необходимые узлы для получения и обработки высокоточных данных GPS с поправками RTK через NTRIP услуги.
К концу этого руководства у вас будет полностью функциональная установка ROS 2, передающая потоковые данные RTK в реальном времени с вашего приемника RTK на основе u-blox ZED-F9P— подходит для робототехнических приложений, требующих точности позиционирования на уровне сантиметра.
Требуемое оборудование:
- simpleRTK2B – Базовый стартовый комплект
- USB-кабель совместим с USB-портом вашего приемника для подключения к ПК или встроенной платформе
- ПК или встроенная платформа с доступом в Интернет (в этом руководстве мы используем ПК)
Требуемое программное обеспечение:
- Ubuntu 24.04 (устанавливается изначально, на виртуальной машине или через WSL)
- ROS 2 (Джазовый) (установлено на платформе Ubuntu)
Полезные ресурсы
- Полезные ресурсы по установке Ubuntu:
- Использование WSL или виртуальных машин: В случае, если вы хотите использовать WSL или виртуальные машины, необходимо поделиться приемником RTK с Ubuntu. Вот инструкция, как поделиться им с системой:
- NTRIP Доступ к сервису: Убедитесь, что у вас есть доступ и учетные данные для NTRIP служба. Вам нужна помощь в поиске службы исправления, обратитесь к нашему Список стран, NTRIP коррекционные услуги в вашей стране.
- Конфигурация приемника RTK: Убедитесь, что ваш RTK-приемник настроен как Rover. Если вам нужна помощь в настройке u-blox ZED-F9P как Roverобратитесь к нашему ZED-F9P Конфигурационные файлы.
Как настроить u-blox ZED-F9P Приемник RTK с ROS 2?
Настройка среды ROS 2
- После установки среды ROS 2, следуя инструкциям Руководство по установке ROS2, по умолчанию он не активен при открытии терминала.
Чтобы исправить это, откройте Терминал и выполните следующую команду, чтобы настроить Ubuntu на автоматическую загрузку среды ROS 2 в конфигурацию запуска Терминала.
echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
Для применения изменений используйте команду ниже. После этого ROS 2 будет готов к использованию каждый раз, когда вы открываете Терминал.
source ~/.bashrc
- Для управления зависимостями в ROS 2 обновите список пакетов и установите ros-dev-инструменты, Который включает в себя Росдеп и другие полезные инструменты разработки для ROS 2.
sudo apt update && sudo apt install ros-dev-tools
Подключить RTK-приемник
- Подключите антенну RTK к приемнику. Расположите антенну в месте с хорошим обзором неба или около окна для проверки функциональности.
- Подключите приемник к ПК через USB-порт с маркировкой «POWER+GPS".
- Приемник должен быть автоматически настроен. Чтобы проверить это, откройте Терминал и введите команду. Вы должны увидеть / dev / ttyACM0 (или аналогичное устройство, например, / dev / ttyACM1).
ls /dev/ttyACM*
- Чтобы проверить поток GPS с приемника RTK, выполните команду в Терминале. Она показывает необработанные потоковые данные GPS с приемника. Нажмите Ctrl + C остановиться.
sudo cat /dev/ttyACM0
- Наконечник: Если вы не видите никаких выходных данных или устройство отсутствует, убедитесь, что у вашего пользователя есть соответствующие разрешения (например, он находится в группе dialout). Вы можете добавить себя с помощью команды ниже. После этого выйдите из системы и войдите снова, чтобы изменения вступили в силу.
sudo usermod -a -G dialout $USER
- Чтобы предотвратить запуск приемника RTK в другом «ttyACM*” каждый раз при включении питания создавайте правило udev (динамическая ссылка), которая создает запись с определенным именем путем добавления следующего файла перед подключением приемника RTK.
sudo nano /etc/udev/rules.d/50-ardusimple.rules
- Press Ctrl + X чтобы выйти из файла и нажмите Y сохранить измененный буфер.
- Отключите (отключите) приемник RTK и снова подключите его (отключите питание).
- Теперь при каждом подключении приемника RTK он будет доступен из «/dev/tty_Ardusimple” ссылка. Чтобы проверить это, введите команды:
sudo service udev reload
sudo service udev restart
sudo udevadm trigger
ls /dev/
Подготовьте новое рабочее пространство ROS 2 для проекта
- Чтобы создать каталог рабочей области, откройте Терминал и создайте папку (например, ros2_ws) с SRC подпапка:
mkdir -p ~/ros2_ws/src
- Перейдите в свое рабочее пространство.
cd ~/ros2_ws
- Чтобы создать рабочее пространство, используйте Colcon для сборки всех пакетов внутри SRC:
colcon build
- Создайте файл установки, чтобы ваша оболочка распознавала вновь созданные пакеты:
source install/setup.bash
- Добавьте эту команду в ваш ~/.bashrc (или эквивалент) для автоматического запуска источника при каждом открытии нового терминала.
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
- Теперь у вас есть базовая рабочая среда ROS2, настроенная для дальнейшей разработки и интеграции с ArduSimple РТК.
Запустите узел на ROS 2 для подключения к приемнику RTK
- Чтобы клонировать u-blox репозиторий в вашем рабочем пространстве ROS 2 (~/ros2_ws/src):
cd ~/ros2_ws/src
git clone --branch ros2 https://github.com/KumarRobotics/ublox.git
- Инициировать Росдеп и загрузите последние определения зависимостей пакетов.
sudo rosdep init
rosdep update
- Сейчас u-blox Узел доступен в вашей среде ROS2.
- Измените файл конфигурации, чтобы обновить пути или параметры устройств по мере необходимости (мы будем использовать /dev/tty_Ardusimple). Пакет ublox_gps включает файл конфигурации по умолчанию с именем зед_f9p.yaml. Откройте файл конфигурации командой:
nano ~/ros2_ws/src/ublox/ublox_gps/config/zed_f9p.yaml
- Пересоберите пакеты. Мы рекомендуем использовать отдельный пакет для ваших пользовательских файлов конфигурации и запуска, чтобы все было организовано. Мы обсудим этот подход позже.
cd ~/ros2_ws
colcon build
source install/setup.bash
- Чтобы избежать остановки узла, откройте новый Терминал и инициализируйте рабочее пространство с помощью команды ниже. Если этот узел остановлен, u-blox устройство больше не будет публиковать свои темы или предоставлять свои услуги.
source ~/ros2_ws/install/setup.bash
- Чтобы остановить трансляцию, нажмите Ctrl + C.
- Просмотрите список доступных услуг, предоставляемых Node.
ros2 service list
- Теперь у вас есть u-blox Узел ROS 2, работающий и публикующий данные в реальном времени с вашего RTK-приемника.
Важно:- Не останавливайте u-blox узел. Этот узел должен быть запущен перед выполнением следующих шагов по запуску NTRIP клиент, поскольку серверу коррекции необходимы данные GPS в реальном времени для расчета и отправки поправок RTCM.
- u-blox узел должен оставаться активным для визуализации выходных данных GPS с использованием темы ros2 echo, как показано на предыдущем шаге.
Запустите узел на ROS 2 для использования NTRIP корректировки
Примечание: Убедитесь, что узел подключения GPS уже запущен, так как он необходим для передачи данных коррекции.
- Перейдите в каталог рабочей области ROS2 и клонируйте ветку ROS 2.
cd ~/ros2_ws/src
git clone --branch ros2 https://github.com/LORD-MicroStrain/ntrip_client.git
- Чтобы избежать закрытия узла, откройте новый терминал и инициализируйте рабочее пространство.
Примечание: Если узел остановлен, u-blox Устройство перестанет получать данные коррекции. u-blox узел должен быть запущен перед запуском NTRIP клиент, так как он предоставляет необходимые данные GPS на сервер коррекции. Если u-blox узел остановлен, он больше не будет публиковать требуемые темы и службы, а приемник rtk прекратит получать данные коррекции.
source ~/ros2_ws/install/setup.bash
- Чтобы избежать закрытия узла, откройте новый терминал и инициализируйте рабочее пространство.
Примечание: Если узел остановлен, u-blox Устройство перестанет получать данные коррекции. u-blox узел должен быть запущен перед запуском NTRIP клиент, так как он предоставляет необходимые данные GPS на сервер коррекции. Если u-blox узел остановлен, он больше не будет публиковать требуемые темы и службы, а приемник rtk прекратит получать данные коррекции.
source ~/ros2_ws/install/setup.bash
- Просмотреть список доступных тем.
ros2 topic list
- Основные темы, которые вы можете увидеть:
- /rtcm: публикует данные коррекции RTCM (mavros_msgs/RTCM или rtcm_msgs/Message, в зависимости от конфигурации).
- /нмеа: Подписывается на локальные предложения NMEA, пересылая их на сервер.
- /ublox_gps_node/исправить: Также может пересылать глобальные данные о местоположении, если они еще не в формате NMEA.
- Если все сделано правильно, успешно, вы увидите, как узел публикует исправления RTCM на /rtcm Тема. Использование ntrip_client Node, вы можете интегрировать данные коррекции RTCM в свой проект ROS 2, чтобы обеспечить точное позиционирование с помощью приемника RTK.
ros2 topic echo /rtcm
- Используя этот узел, вы можете интегрировать данные коррекции RTCM в свой проект ROS 2, чтобы обеспечить точное позиционирование с помощью приемника RTK.
Создание комбинированного стартового пакета
Мы создадим специальный пакет, содержащий один файл запуска для запуска и ublox_gps узел (публикация данных GPS) и ntrip_client узел (обработка RTK-коррекций) одновременно. Такой подход позволяет организовать рабочее пространство и упрощает запуск всех требуемых узлов одной командой.
- Откройте новый терминал, перейдите в рабочее пространство ROS2 и создайте новый пакет. Для запуска nanofile на основе Python выполните команды:
cd ~/ros2_ws/src
ros2 pkg create combined_rtk --build-type ament_python
- Создайте каталог запуска и файл запуска Python внутри нового пакета.
mkdir -p combined_rtk/launch
nano ~/ros2_ws/src/combined_rtk/launch/combined_nodes.launch.py
- Скопируйте код из примера ниже и вставьте его в файл. Код делает:
- ublox_gps Узел: публикует необработанные данные GPS с вашего ArduSimple устройства.
- ntrip_client Узел: Подключается к NTRIP caster/server и публикует исправления RTCM на /rtcm (а также можно подписаться на /nmea или /fix при необходимости).
- Шебанг (#!/usr/bin/env python3) – Гарантирует, что файл запустится как скрипт Python.
- ЗапускОписание – Определяет, какие узлы следует запустить.
- Узел параметры – устанавливает параметры, специфичные для узла (например, устройство, хост, порт, аутентификация).
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
])
- Открыто setup.py.
nano ~/ros2_ws/src/combined_rtk/setup.py
- Скопируйте код ниже и вставьте его в setup.py файл для включения файлов запуска и зависимостей. Закройте файл и сохраните изменения.
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': [
],
},
)
- Запустите оба ublox_gps и ntrip_client Узлы с одной командой:
ros2 launch combined_rtk combined_nodes.launch.py
- Вы должны увидеть журналы с обоих узлов в своем терминале, указывающие на следующее:
- ublox_gps считывает данные GPS с указанного устройства (например, /dev/tty_Ardusimple).
- ntrip_client связан с вашим NTRIP сервер и публикация исправлений RTCM на /rtcm (и возможная подписка на /nmea, если настроено).
- Чтобы проверить темы, службы и состояние устройства, откройте новый терминал и инициализируйте:
source install/setup.bash
- ublox_gps Node публикует диагностику по таким темам, как /диагностика. Чтобы проверить диагностическую информацию:
ros2 topic echo /diagnostics
Он включает в себя сообщения о состоянии, такие как горизонтальная точность, вертикальная точность и «3D fix», когда приемник имеет правильное положение, или «fix not ok», когда GPS еще не зафиксирован должным образом.
- Основные советы по проверке статуса исправления:
- Монитор /ublox_gps_node/исправить в сообщениях NavSatFix (поле status.status) или диагностических сообщениях для получения более подробных текстовых статусов.
- /диагностика Тема часто содержит читабельное резюме, например «3D fix».
- Используйте /ublox/navpvt чтобы получить подробную информацию:
- Поле fix_type должно быть равно 3 для 3D-фиксации.
- Поле флагов должно указывать на то, что исправления используются.
- Поле flags2 включает статус RTK: 67 RTK Float, 128 RTK Fix. Если значение значительно ниже, это, скорее всего, означает, что поправки RTK не применяются.
- Убедитесь, что ваша антенна имеет свободный обзор неба и вашего NTRIP caster Учетные данные верны для достижения стабильного RTK Fix.
Наконец, вам необходимо одновременно интегрировать данные GPS и поправки RTCM. Для этого вам необходимо оба узла работают одновременно, Вот как это работает:
узел ublox_gps
Публикует необработанные данные GNSS на
/fixтема.Предоставляет интерфейс (
rtcm_inputпараметр), чтобы входящие сообщения RTCM могли быть отправлены на u-blox устройство на базе ROS 2.
узел ntrip_client
Подключается к вашему NTRIP caster и публикует сообщения о коррекции RTCM на
/rtcmтема.Эти сообщения затем должны быть пересланы в u-blox приемник через
/rtcm➔rtcm_input.
Хотя в руководстве каждый шаг объясняется отдельно, чтобы показать вам, как запустить каждый узел и проверить, что данные публикуются, это не не автоматически связать их вместе. На практике следует запускать оба стека одновременно, например:
# Терминал 1: запустить драйвер ublox
ros2 запуск ublox_gps ublox_gps_node-launch.py# Терминал 2: запустить NTRIP клиент
ros2 запуск ntrip_client ntrip_client-launch.pyТаким образом, поправки RTCM, текущие
/rtcmнемедленно подхватываются драйвером ublox и отправляются в ZED-F9P устройство, которое, в свою очередь, будет публиковать истинный RTK-скорректированный/fix.
Если вы дошли до этого места, поздравляем! Это, пожалуй, один из самых длинных уроков 🙂
Если вы хотите следовать этому руководству, все товары у нас есть на складе и готовы к отправке:
и

