In questa pagina
Prodotti utilizzati in questo tutorial
Questo tutorial spiega come integrare il ricevitore GNSS RTK u-blox ZED-F9P con un robot che utilizza ROS 2 (Jazzy). Imparerai come collegare l'hardware, configurare il ricevitore, impostare uno spazio di lavoro ROS 2 e avviare i nodi necessari per ricevere ed elaborare dati GPS ad alta precisione con correzioni RTK tramite un servizio NTRIP.
Al termine di questa guida, avrai a disposizione una configurazione ROS 2 perfettamente funzionante in grado di trasmettere in tempo reale i dati RTK dal tuo ricevitore RTK basato sul chip u-blox ZED-F9P, ideale per applicazioni robotiche che richiedono una precisione di posizionamento dell'ordine dei centimetri.
Hardware richiesto:
- simpleRTK2B – Kit base per principianti
- Cavo USBcompatibile con la porta USB del ricevitore per il collegamento a un PC o a una piattaforma integrata
- un PC o una piattaforma integrata con accesso a Internet (in questo tutorial utilizziamo un PC)
Software necessario:
- Ubuntu 24.04 (installato in modo nativo, in una macchina virtuale o tramite WSL)
- ROS 2 (Jazzy) (installato su piattaforma Ubuntu)
Risorse utili
- Risorse utili per l'installazione di Ubuntu:
- Utilizzo di WSL o macchine virtuali: Se si desidera utilizzare WSL o macchine virtuali, è necessario condividere il ricevitore RTK con Ubuntu. Di seguito sono riportate le istruzioni su come condividerlo con il sistema:
- Accesso al servizio NTRIP: assicurati di disporre dell'accesso e delle credenziali per il servizio NTRIP. Se hai bisogno di aiuto per trovare un servizio di correzione, consulta il nostro elenco dei servizi di correzione NTRIP disponibili nel tuo Paese.
- Configurazione del ricevitore RTK: assicurarsi che il ricevitore RTK sia configurato come Rover. Se occorre assistenza per configurare un u-blox ZED-F9P come Rover, consultare i nostri file di configurazione ZED-F9P.
Come configurare il ricevitore RTK u-blox ZED-F9P con ROS 2?
Configurazione dell'ambiente ROS 2
- Una volta installato l'ambiente ROS 2 seguendo la guida all'installazione di ROS 2, per impostazione predefinita esso non è attivo all'apertura del terminale.
Per risolvere questo problema, apri il terminale ed esegui il seguente comando per configurare Ubuntu in modo che carichi automaticamente l'ambiente ROS 2 all'avvio del terminale.
echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
Per applicare le modifiche, utilizza il comando riportato di seguito. A questo punto, ROS 2 sarà pronto all'uso ogni volta che aprirai un terminale.
fonte ~/.bashrc
- Per gestire le dipendenze in ROS 2, aggiorna l'elenco dei pacchetti e installa ros-dev-tools, che include rosdep e altri strumenti di sviluppo utili per ROS 2.
sudo apt update && sudo apt install ros-dev-tools
Collegare il ricevitore RTK
- Collegare l'antenna RTK al ricevitore. Posizionare l'antenna in un punto con una buona visuale verso il cielo oppure vicino a una finestra per verificarne il funzionamento.
- Collega il ricevitore al PC tramite la porta USB contrassegnata con la dicitura “POWER+GPS”.
- Il ricevitore dovrebbe configurarsi automaticamente. Per verificarlo, apri Terminale e digita il comando. Dovresti vedere /dev/ttyACM0 (o un dispositivo simile, ad esempio /dev/ttyACM1).
ls /dev/ttyACM*
- Per controllare il flusso GPS proveniente dal ricevitore RTK, esegui il comando nel Terminale. Verranno visualizzati i dati GPS grezzi trasmessi dal ricevitore. Premi Ctrl + C per interrompere l'operazione.
sudo cat /dev/ttyACM0
- Suggerimento: se non viene visualizzato alcun output o se il dispositivo non è presente, assicurati che il tuo utente disponga delle autorizzazioni appropriate (ad esempio, che faccia parte del gruppo "dialout"). Puoi aggiungerti al gruppo utilizzando il comando riportato di seguito. Successivamente, esci e accedi nuovamente affinché le modifiche abbiano effetto.
sudo usermod -a -G dialout $USER
- Per evitare che il ricevitore RTK si avvii ogni volta in una"ttyACM*" diversa all'accensione, creare una regola udev (un collegamento dinamico) che generi una voce con un nome specifico, aggiungendo il seguente file prima di collegare il ricevitore RTK.
sudo nano /etc/udev/rules.d/50-ardusimple.rules
- Premere Ctrl+X per uscire dal file e premere Y per salvare il buffer modificato.
- Scollegare (spegnere) il ricevitore RTK e ricollegarlo (accenderlo) nuovamente.
- D'ora in poi, ogni volta che verrà collegato un ricevitore RTK, sarà accessibile tramite il collegamento “/dev/tty_Ardusimple”. Per verificarlo, digitare i seguenti comandi:
sudo service udev reload
sudo service udev restart
sudo udevadm trigger
ls /dev/
Preparare un nuovo spazio di lavoro ROS 2 per il progetto
- Per creare una directory Workspace, apri un terminale e crea una cartella (ad esempio, ros2_ws) contenente una sottocartella denominata src:
mkdir -p ~/ros2_ws/src
- Accedi al tuo spazio di lavoro.
cd ~/ros2_ws
- Per compilare Workspace, usa colcon per compilare tutti i pacchetti presenti nella directory src:
colcon build
- Procurati il file di configurazione per consentire alla tua shell di riconoscere i pacchetti appena compilati:
fonte install/setup.bash
- Aggiungi questo comando al tuo file ~/.bashrc (o equivalente) affinché venga eseguito automaticamente ogni volta che apri un nuovo terminale.
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
- Ora disponi di un'area di lavoro ROS2 di base configurata per ulteriori sviluppi e per l'integrazione con ArduSimple RTK.
Avvia Node su ROS 2 per connetterti al ricevitore RTK
- Per clonare il repository u-blox nel proprio spazio di lavoro ROS 2 (~/ros2_ws/src):
cd ~/ros2_ws/src
git clone --branch ros2 https://github.com/KumarRobotics/ublox.git
- Avvia rosdep e scarica le definizioni più recenti delle dipendenze dei pacchetti.
sudo rosdep init
rosdep update
- Ora u-blox Node è disponibile nel tuo ambiente ROS2.
- Modifica il file di configurazione per aggiornare i percorsi o i parametri del dispositivo secondo necessità (useremo /dev/tty_Ardusimple). Il pacchetto ublox_gps include un file di configurazione predefinito denominato zed_f9p.yaml. Apri il file di configurazione con il comando:
nano ~/ros2_ws/src/ublox/ublox_gps/config/zed_f9p.yaml
- Ricompilare i pacchetti. Si consiglia di utilizzare un pacchetto separato per i file di configurazione e di avvio personalizzati, in modo da mantenere tutto ben organizzato. Approfondiremo questo approccio più avanti.
cd ~/ros2_ws
colcon build
source install/setup.bash
- Per evitare che il nodo venga arrestato, aprire una nuova finestra di Terminale e inizializzare l'area di lavoro utilizzando il comando riportato di seguito. Se questo nodo viene arrestato, il dispositivo u-blox non pubblicherà più i propri argomenti né fornirà i propri servizi.
fonte ~/ros2_ws/install/setup.bash
- Per interrompere lo streaming, premi Ctrl + C.
- Visualizza l'elenco dei servizi disponibili forniti dal Nodo.
Elenco dei servizi ros2
- Ora il nodo u-blox ROS 2 è in esecuzione e pubblica dati in tempo reale dal ricevitore RTK.
Importante:- Non arrestare il nodo u-blox. Questo nodo deve essere in esecuzione prima di procedere con i passaggi successivi per l'avvio del client NTRIP, poiché il server di correzione necessita di dati GPS in tempo reale per calcolare e inviare le correzioni RTCM.
- Il nodo u-blox deve rimanere attivo per visualizzare i dati GPS tramite l'echo dell'argomento ros2, come illustrato nel passaggio precedente.
Avvia Node su ROS 2 per utilizzare le correzioni NTRIP
Nota: assicurati che il nodo di connessione GPS sia già in esecuzione, poiché è necessario per trasmettere i dati di correzione.
- Accedi alla directory dell'area di lavoro di ROS 2 e clona il ramo ROS 2.
cd ~/ros2_ws/src
git clone --branch ros2 https://github.com/LORD-MicroStrain/ntrip_client.git
- Per evitare di chiudere il nodo, aprire una nuova finestra di terminale e inizializzare l'area di lavoro.
Nota: se il nodo viene arrestato, il dispositivo u-blox smetterà di ricevere i dati di correzione. Il nodo u-blox deve essere in esecuzione prima di avviare il client NTRIP, poiché fornisce i dati GPS necessari al server di correzione. Se il nodo u-blox viene arrestato, non pubblicherà più gli argomenti e i servizi richiesti e il ricevitore RTK smetterà di ricevere i dati di correzione.
fonte ~/ros2_ws/install/setup.bash
- Per evitare di chiudere il nodo, aprire una nuova finestra di terminale e inizializzare l'area di lavoro.
Nota: se il nodo viene arrestato, il dispositivo u-blox smetterà di ricevere i dati di correzione. Il nodo u-blox deve essere in esecuzione prima di avviare il client NTRIP, poiché fornisce i dati GPS necessari al server di correzione. Se il nodo u-blox viene arrestato, non pubblicherà più gli argomenti e i servizi richiesti e il ricevitore RTK smetterà di ricevere i dati di correzione.
fonte ~/ros2_ws/install/setup.bash
- Visualizza l'elenco degli argomenti disponibili.
Elenco degli argomenti di ros2
- Argomenti principali che potresti trovare:
- /rtcm: Pubblica i dati di correzione RTCM (mavros_msgs/RTCM o rtcm_msgs/Message, a seconda della configurazione).
- /nmea: Si abbona alle frasi NMEA locali, inoltrandole al server.
- /ublox_gps_node/fix: Può anche inoltrare i dati di posizione globali se questi non sono già in formato NMEA.
- Se tutto viene eseguito correttamente e con esito positivo, vedrai il Node pubblicare le correzioni RTCM sull'argomento /rtcm. Utilizzando il Node ntrip_client, puoi integrare i dati di correzione RTCM nel tuo progetto ROS 2 per consentire un posizionamento preciso con un ricevitore RTK.
ros2 argomento echo /rtcm
- Utilizzando questo nodo, è possibile integrare i dati di correzione RTCM nel proprio progetto ROS 2 per consentire un posizionamento preciso con un ricevitore RTK.
Creazione di un pacchetto di lancio combinato
Creeremo un pacchetto dedicato contenente un unico file di avvio che consente di eseguire contemporaneamente sia il nodo ublox_gps (che pubblica i dati GPS) sia il nodo ntrip_client (che gestisce le correzioni RTK). Questo approccio mantiene ordinata l'area di lavoro e semplifica l'avvio di tutti i nodi necessari con un unico comando.
- Apri una nuova finestra di Terminale, accedi al tuo spazio di lavoro ROS2 e crea un nuovo pacchetto. Per creare un file nano di avvio basato su Python, esegui i seguenti comandi:
cd ~/ros2_ws/src
ros2 pkg create combined_rtk --build-type ament_python
- Crea una directory di avvio e un file di avvio Python all'interno del nuovo pacchetto.
mkdir -p combined_rtk/launch
nano ~/ros2_ws/src/combined_rtk/launch/combined_nodes.launch.py
- Copia il codice dall'esempio riportato di seguito e incollalo nel file. Il codice:
- Nodo ublox_gps: pubblica i dati GPS grezzi provenienti dal dispositivo ArduSimple.
- Nodo ntrip_client: si connette al caster/server NTRIP e pubblica le correzioni RTCM su /rtcm (e, se necessario, può anche sottoscrivere i feed su /nmea o /fix).
- Shebang (#!/usr/bin/env python3) – Assicura che il file venga eseguito come script Python.
- LaunchDescription – Definisce quali nodi avviare.
- Parametri del nodo – Consente di impostare i parametri specifici del nodo (ad esempio: dispositivo, host, porta, autenticazione).
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
])
- Apri il file setup.py.
nano ~/ros2_ws/src/combined_rtk/setup.py
- Copia il codice riportato di seguito e incollalo nel file setup.py per includere i file di avvio e le dipendenze. Chiudi il file e salva le modifiche.
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': [
],
},
)
- Avvia entrambi i nodi ublox_gps e ntrip_client con un unico comando:
ros2 launch combined_rtk combined_nodes.launch.py
- Nel terminale dovresti vedere i log di entrambi i nodi, che indicano che:
- ublox_gps sta leggendo i dati GPS dal dispositivo specificato (ad esempio, /dev/tty_Ardusimple).
- ntrip_client è connesso al tuo server NTRIP e pubblica le correzioni RTCM su /rtcm (e, se configurato, potrebbe anche essere iscritto a /nmea).
- Per verificare gli argomenti, i servizi e lo stato dei dispositivi, aprire una nuova finestra di Terminale ed eseguire il comando:
fonte install/setup.bash
- Il nodo ublox_gps pubblica i dati diagnostici su un argomento come /diagnostics. Per verificare le informazioni diagnostiche:
ros2 argomento echo /diagnostics
Include messaggi di stato quali "precisione orizzontale", "precisione verticale" e "posizionamento 3D" quando il ricevitore ha una posizione valida, oppure "posizionamento non corretto" quando il GPS non ha ancora effettuato correttamente il posizionamento.
- Consigli utili per verificare lo stato della riparazione:
- Controllare /ublox_gps_node/fix nei messaggi NavSatFix (campo status.status) o nei messaggi diagnostici per ottenere informazioni più dettagliate in formato testuale.
- L'argomento /diagnostics fornisce spesso un riepilogo di facile comprensione, come ad esempio “3D fix”.
- Utilizzo /ublox/navpvt per ottenere informazioni dettagliate:
- Il campo "fix_type" deve essere impostato su 3 per la correzione 3D.
- Il campo "flags" dovrebbe indicare che sono state applicate delle correzioni.
- Il campo flags2 indica lo stato RTK: 67 RTK Float, 128 RTK Fix. Se il valore è notevolmente inferiore, significa probabilmente che non vengono applicate correzioni RTK.
- Assicurati che l'antenna abbia una visuale libera verso il cielo e che le credenziali del tuo caster NTRIP siano corrette per ottenere una posizione RTK stabile.
Infine, si desidera integrare contemporaneamente sia i dati GPS che le correzioni RTCM. Per farlo, è necessario che entrambi i nodi siano in esecuzione contemporaneamente. Ecco come funziona:
nodo ublox_gps
Pubblica le posizioni GNSS grezze su
/correggiargomento.Espone un'interfaccia (la
rtcm_inputparametro) in modo che i messaggi RTCM in arrivo possano essere inviati al dispositivo u-blox tramite ROS 2.
nodo ntrip_client
Si collega al tuo trasmettitore NTRIP e pubblica messaggi di correzione RTCM su
/rtcmargomento.Questi messaggi devono quindi essere inoltrati al ricevitore u-blox tramite
/rtcm➔rtcm_input.
Sebbene il tutorial spieghi ogni passaggio separatamente, per illustrare come avviare ciascun nodo e verificare che i dati vengano pubblicati, non li collega automaticamente tra loro. In pratica, è necessario avviare entrambi gli stack contemporaneamente, ad esempio:
# Terminale 1: eseguire il driver ublox
ros2 launch ublox_gps ublox_gps_node-launch.py# Terminale 2: avvia il client NTRIP
ros2 launch ntrip_client ntrip_client-launch.pyIn questo modo, le correzioni RTCM che transitano su
/rtcmvengono immediatamente rilevati dal driver ublox e inviati al dispositivo ZED-F9P, il quale a sua volta pubblicherà un segnale con correzione RTK effettiva/correggi.
Se sei arrivato fin qui, complimenti! Questo è probabilmente uno dei nostri tutorial più lunghi 🙂
Se vuoi seguire questo tutorial, abbiamo tutti i prodotti disponibili in magazzino e pronti per la spedizione:
Hai ancora problemi?
Contattaci per ricevere assistenza da un vero ingegnere — non dall’intelligenza artificiale — oppure richiedi il tutorial che ti manca