W tym samouczku wyjaśniono, jak zintegrować u-blox ZED-F9P RTK GNSS odbiornik z robotem obsługującym ROS 2 (Jazzy). Dowiesz się, jak podłączyć sprzęt, skonfigurować odbiornik, skonfigurować przestrzeń roboczą ROS 2 i uruchomić niezbędne węzły, aby odbierać i przetwarzać precyzyjne dane GPS z poprawkami RTK za pośrednictwem NTRIP service.
Do końca tego przewodnika będziesz mieć w pełni funkcjonalną konfigurację ROS 2, która umożliwia strumieniowe przesyłanie danych RTK w czasie rzeczywistym z odbiornika RTK na podstawie u-blox ZED-F9P—nadaje się do zastosowań robotyki wymagających dokładności pozycjonowania na poziomie centymetrów.
Wymagany sprzęt:
- simpleRTK2B – Podstawowy zestaw startowy
- kabel USB kompatybilny z portem USB odbiornika do podłączenia do komputera PC lub platformy wbudowanej
- komputer PC lub platforma wbudowana z dostępem do Internetu (w tym samouczku korzystamy z komputera PC)
Wymagane oprogramowanie:
- Ubuntu 24.04 (instalowany natywnie, na maszynie wirtualnej lub za pośrednictwem WSL)
- ROS 2 (Jazzowy) (zainstalowano na platformie Ubuntu)
Przydatne zasoby
- Przydatne zasoby do instalacji Ubuntu:
- Korzystanie z WSL lub maszyn wirtualnych: Jeśli chcesz używać WSL lub maszyn wirtualnych, konieczne jest udostępnienie odbiornika RTK z Ubuntu. Istnieją instrukcje, jak udostępnić go systemowi:
- NTRIP Dostęp do usług: Upewnij się, że masz dostęp i uprawnienia do NTRIP usługa. Potrzebujesz pomocy w znalezieniu usługi korekcyjnej, zapoznaj się z naszą Lista NTRIP usługi korekcyjne w Twoim kraju.
- Konfiguracja odbiornika RTK: Upewnij się, że odbiornik RTK jest skonfigurowany jako Rover. Jeśli potrzebujesz pomocy w konfiguracji u-blox ZED-F9P jak Rover, zapoznaj się z naszymi ZED-F9P Pliki konfiguracyjne.
Jak skonfigurować u-blox ZED-F9P Odbiornik RTK z ROS 2?
Konfiguracja środowiska ROS 2
- Po zainstalowaniu środowiska ROS 2 zgodnie z poniższą instrukcją Instrukcja instalacji ROS2, domyślnie nie jest aktywny po otwarciu terminala.
Aby rozwiązać ten problem, otwórz terminal i uruchom następujące polecenie, aby skonfigurować system Ubuntu tak, aby automatycznie ładował środowisko ROS 2 do konfiguracji startowej terminala.
echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
Aby zastosować zmiany, użyj poniższego polecenia. Po tym ROS 2 będzie gotowy do użycia za każdym razem, gdy otworzysz Terminal.
source ~/.bashrc
- Aby zarządzać zależnościami w systemie ROS 2, zaktualizuj listę pakietów i zainstaluj narzędzia ros-dev, Która obejmuje rosdep i inne przydatne narzędzia programistyczne dla ROS 2.
sudo apt update && sudo apt install ros-dev-tools
Podłącz odbiornik RTK
- Podłącz antenę RTK do odbiornika. Umieść antenę w miejscu z dobrym widokiem na niebo lub w pobliżu okna, aby przetestować jej funkcjonalność.
- Podłącz odbiornik do komputera za pomocą portu USB oznaczonego jako „POWER+GPS".
- Odbiornik powinien zostać automatycznie skonfigurowany. Aby to sprawdzić, otwórz Terminal i wpisz polecenie. Powinieneś zobaczyć / dev / ttyACM0 (lub podobne urządzenie, np. / dev / ttyACM1).
ls /dev/ttyACM*

- Aby sprawdzić strumień GPS z odbiornika RTK, uruchom polecenie w terminalu. Pokazuje ono surowe dane GPS przesyłane strumieniowo z odbiornika. Naciśnij Ctrl + C zatrzymać.
sudo cat /dev/ttyACM0
- Wskazówka: Jeśli nie widzisz żadnego wyniku lub brakuje urządzenia, upewnij się, że Twój użytkownik ma odpowiednie uprawnienia (np. jest w grupie dialout). Możesz dodać siebie za pomocą poniższego polecenia. Następnie wyloguj się i zaloguj ponownie, aby zmiany zostały zastosowane.
sudo usermod -a -G dialout $USER
- Naciśnij przycisk Ctrl + X aby wyjść z pliku i naciśnij Y aby zapisać zmodyfikowany bufor.
- Odłącz odbiornik RTK (wyłącz zasilanie) i podłącz go ponownie (zasilanie).
- Teraz, gdy podłączony zostanie odbiornik RTK, będzie on dostępny z poziomu „/dev/tty_Ardusimple” link. Aby to sprawdzić, wprowadź polecenia:
sudo service udev reload
sudo service udev restart
sudo udevadm trigger
ls /dev/
Przygotuj nową przestrzeń roboczą ROS 2 dla projektu
- Aby utworzyć katalog obszaru roboczego, otwórz terminal i utwórz folder (na przykład ros2_ws) z src podfolder:
mkdir -p ~/ros2_ws/src
- Przejdź do swojego obszaru roboczego.
cd ~/ros2_ws
- Aby utworzyć obszar roboczy, użyj kolkon aby zbudować wszystkie pakiety wewnątrz src:
colcon build
- Podaj plik instalacyjny, aby powłoka mogła rozpoznać nowo skompilowane pakiety:
source install/setup.bash
- Dodaj to polecenie do pliku ~/.bashrc (lub podobnego), aby źródło było pobierane automatycznie za każdym razem, gdy otworzysz nowy terminal.
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc

- Teraz masz podstawową przestrzeń roboczą ROS2 skonfigurowaną do dalszego rozwoju i integracji z ArduSimple RTK-u
Uruchom węzeł w systemie ROS 2, aby połączyć się z odbiornikiem RTK
- Aby sklonować u-blox repozytorium do obszaru roboczego ROS 2 (~/ros2_ws/src):
cd ~/ros2_ws/src
git clone --branch ros2 https://github.com/KumarRobotics/ublox.git
- Inicjować rosdep i pobierz najnowsze definicje zależności pakietów.
sudo rosdep init
rosdep update

- Teraz u-blox Węzeł jest dostępny w środowisku ROS2.
- Zmodyfikuj plik konfiguracyjny, aby zaktualizować ścieżki lub parametry urządzeń w razie potrzeby (będziemy używać /dev/tty_Ardusimple). Pakiet ublox_gps zawiera domyślny plik konfiguracyjny o nazwie zed_f9pPlik yaml. Otwórz plik konfiguracyjny za pomocą polecenia:
nano ~/ros2_ws/src/ublox/ublox_gps/config/zed_f9p.yaml
- Odbuduj pakiety. Zalecamy użycie oddzielny pakiet dla twoich niestandardowych plików konfiguracyjnych i uruchomieniowych, aby zachować porządek. Omówimy to podejście później.
cd ~/ros2_ws
colcon build
source install/setup.bash

- Aby uniknąć zatrzymania węzła, otwórz nowy terminal i zainicjuj obszar roboczy za pomocą poniższego polecenia. Jeśli ten węzeł zostanie zatrzymany, u-blox Urządzenie nie będzie już publikować swoich tematów i świadczyć usług.
source ~/ros2_ws/install/setup.bash
- Aby zatrzymać strumień, naciśnij Ctrl + C.
- Wyświetl listę dostępnych usług świadczonych przez Node.
ros2 service list
- Teraz masz u-blox Węzeł ROS 2 uruchamia się i publikuje dane w czasie rzeczywistym z odbiornika RTK.
Ważne:- Nie zatrzymuj się u-blox węzeł. Ten węzeł musi być uruchomiony przed wykonaniem następujących kroków uruchamiania NTRIP klienta, ponieważ serwer korekcyjny potrzebuje bieżących danych GPS do obliczania i wysyłania poprawek RTCM.
- u-blox węzeł musi pozostać aktywny, aby wizualizować dane wyjściowe GPS za pomocą echa tematu ros2, jak pokazano w poprzednim kroku.
Uruchom węzeł w systemie ROS 2, aby go używać NTRIP Korekty
Uwaga: Upewnij się, że węzeł połączenia GPS jest już uruchomiony, ponieważ jest on wymagany do przesyłania danych korekcyjnych.
- Przejdź do katalogu obszaru roboczego ROS2 i sklonuj gałąź ROS 2.
cd ~/ros2_ws/src
git clone --branch ros2 https://github.com/LORD-MicroStrain/ntrip_client.git
- Aby uniknąć zamknięcia węzła, otwórz nowy terminal i zainicjuj obszar roboczy.
Uwaga: Jeżeli węzeł jest zatrzymany, u-blox urządzenie przestanie odbierać dane korekcyjne. u-blox węzeł musi być uruchomiony przed uruchomieniem NTRIP klient, ponieważ dostarcza niezbędne dane GPS do serwera korekcyjnego. Jeśli u-blox węzeł zostanie zatrzymany, nie będzie już publikował wymaganych tematów i usług, a odbiornik rtk przestanie odbierać dane korekcyjne.
source ~/ros2_ws/install/setup.bash
- Aby uniknąć zamknięcia węzła, otwórz nowy terminal i zainicjuj obszar roboczy.
Uwaga: Jeżeli węzeł jest zatrzymany, u-blox urządzenie przestanie odbierać dane korekcyjne. u-blox węzeł musi być uruchomiony przed uruchomieniem NTRIP klient, ponieważ dostarcza niezbędne dane GPS do serwera korekcyjnego. Jeśli u-blox węzeł zostanie zatrzymany, nie będzie już publikował wymaganych tematów i usług, a odbiornik rtk przestanie odbierać dane korekcyjne.
source ~/ros2_ws/install/setup.bash
- Zobacz listę dostępnych tematów.
ros2 topic list
- Najważniejsze tematy, które możesz zobaczyć:
- /rtcm: Publikuje dane korekcyjne RTCM (mavros_msgs/RTCM lub rtcm_msgs/Message, w zależności od konfiguracji).
- /nmea: Subskrybuje lokalne zdania NMEA i przesyła je do serwera.
- /ublox_gps_node/napraw:Można również przekazywać dane o położeniu globalnym, jeśli nie są już w formacie NMEA.
- Jeśli wszystko zostanie wykonane poprawnie i zakończy się sukcesem, zobaczysz, że węzeł opublikował poprawki RTCM na /rtcm temat. Używanie klient ntrip Węzeł, możesz zintegrować dane korekcyjne RTCM ze swoim projektem ROS 2, aby umożliwić precyzyjne pozycjonowanie za pomocą odbiornika RTK.
ros2 topic echo /rtcm
- Używając tego węzła możesz zintegrować dane korekcyjne RTCM z projektem ROS 2, aby umożliwić precyzyjne pozycjonowanie za pomocą odbiornika RTK.
Tworzenie połączonego pakietu startowego
Utworzymy dedykowany pakiet zawierający pojedynczy plik startowy do uruchomienia obie dotychczasowy ublox_gps węzeł (publikujący dane GPS) i klient ntrip węzeł (obsługujący poprawki RTK) jednocześnie. Takie podejście utrzymuje porządek w miejscu pracy i ułatwia uruchamianie wszystkich wymaganych węzłów za pomocą jednego polecenia.
- Otwórz nowy terminal, przejdź do obszaru roboczego ROS2 i utwórz nowy pakiet. W przypadku pliku nano uruchomieniowego opartego na Pythonie uruchom polecenia:
cd ~/ros2_ws/src
ros2 pkg create combined_rtk --build-type ament_python
- Utwórz katalog startowy i plik startowy Pythona wewnątrz nowego pakietu.
mkdir -p combined_rtk/launch
nano ~/ros2_ws/src/combined_rtk/launch/combined_nodes.launch.py
- Skopiuj kod z poniższego przykładu i wklej go do pliku. Kod wykonuje:
- ublox_gps Węzeł: Publikuje surowe dane GPS z Twojego ArduSimple urządzeń.
- klient ntrip Węzeł: Łączy się z NTRIP caster/serwer i publikuje poprawki RTCM na /rtcm (i możesz także zasubskrybować /nmea lub /fix, jeśli zajdzie taka potrzeba).
- Szermierka (#!/usr/bin/env python3) – Zapewnia, że plik zostanie uruchomiony jako skrypt Pythona.
- Opis uruchomienia – Definiuje, które węzły mają zostać uruchomione.
- Node parametry – Ustawia parametry specyficzne dla węzła (np. urządzenie, host, port, uwierzytelnianie).
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
])
- Otwarte konfiguracja.py.
nano ~/ros2_ws/src/combined_rtk/setup.py
- Skopiuj poniższy kod i wklej go do konfiguracja.py plik, aby uwzględnić pliki startowe i zależności. Zamknij plik i zapisz zmiany.
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': [
],
},
)
- Uruchom oba ublox_gps i klient ntrip Węzły z jednym poleceniem:
ros2 launch combined_rtk combined_nodes.launch.py
- W terminalu powinny zostać wyświetlone logi z obu węzłów, wskazujące, że:
- ublox_gps odczytuje dane GPS z określonego urządzenia (np. /dev/tty_Ardusimple).
- klient ntrip jest połączony z Twoim NTRIP serwera i publikowania poprawek RTCM w katalogu /rtcm (oraz ewentualnego subskrybowania katalogu /nmea, jeśli jest skonfigurowany).
- Aby sprawdzić tematy, usługi, stan urządzenia, otwórz nowy terminal i zainicjuj:
source install/setup.bash
- ublox_gps Node publikuje diagnostykę na temat taki jak /diagnostyka. Aby sprawdzić informacje diagnostyczne:
ros2 topic echo /diagnostics
Zawiera komunikaty o stanie, takie jak dokładność pozioma, dokładność pionowa i „naprawa 3D”, gdy odbiornik ma prawidłową pozycję, lub „naprawa nieprawidłowa”, gdy GPS nie został jeszcze prawidłowo ustalony.
- Kluczowe wskazówki dotyczące sprawdzania statusu naprawy:
- Monitorowanie /ublox_gps_node/napraw w komunikatach NavSatFix (pole status.status) lub komunikatach diagnostycznych, w celu uzyskania bardziej szczegółowych informacji o statusie w formie tekstowej.
- /diagnostyka temat często zawiera czytelne podsumowanie, np. „naprawa 3D”.
- Zastosowanie /ublox/navpvt Aby uzyskać szczegółowe informacje:
- Pole fix_type powinno mieć wartość 3 w przypadku poprawki 3D.
- Pole flag powinno wskazywać, że poprawki są stosowane.
- Pole flags2 zawiera status RTK: 67 RTK Float, 128 RTK Fix. Jeśli wartość jest znacznie niższa, prawdopodobnie oznacza to, że nie są stosowane żadne poprawki RTK.
- Upewnij się, że antena ma czysty widok na niebo i Twój NTRIP caster dane uwierzytelniające są poprawne, aby uzyskać stabilną poprawkę RTK.
Jeśli chcesz skorzystać z tego samouczka, wszystkie produkty mamy w magazynie i gotowe do wysyłki:
-
Promocja!Wykonane w EuropieRTK starter kits
simpleRTK2B – Basic Starter Kit
Cena Od 199,00€ Ten produkt ma wiele wariantów. Opcje można wybrać na stronie produktu