🧪 Novos tutoriais em andamento — do braço robótico ao sensor
Ir para o conteúdo

ROS: leitura de dados GPS ​

Esta função lê os dados do módulo GPS através do terminal e analisa os dados de GPS para obter os dados de latitude, longitude e altitude.

1. Ler dados de GPS através do terminal ​

No terminal, introduza,

ros2 launch nmea_navsat_driver nmea_serial_driver.launch.py

Imagem 1

De seguida, vamos verificar os dados do tópico; no terminal, introduza,

ros2 topic list

Imagem 2

Sobre os dados desses tópicos de GPS, aqui vai uma explicação,

TópicoTipoDescrição
/extend_fixgps_common/GPSFixA mensagem GPSFix contém o estado dos satélites de GPS e informações de posicionamento
/fixsensor_msgs/NavSatFixInformações de posicionamento de GPS
/time_referencesensor_msgs/TimeReferencdInformações de tempo do GPS
/velgeometry_msgs/TwistStampedInformações de velocidade do GPS

Os tipos de mensagem de cada tópico podem ser consultados nos seguintes sites oficiais,

Documentação de sensor_msgs/NavSatFix (ros.org)

Documentação de sensor_msgs/TimeReference (ros.org)

Documentação de geometry_msgs/TwistStamped (ros.org)

Podemos imprimir essas mensagens de tópico no terminal; o que se obtém são os dados de GPS. Tomando a impressão de /fix como exemplo, no terminal, introduza

ros2 topic echo /fix

O terminal imprimirá os seguintes dados,

Imagem 3

Entre eles, latitude, longitude e altitude representam, respetivamente, a latitude, a longitude e a altitude.

2. Ler a latitude, longitude e altitude dos dados de GPS ​

Execute no terminal,

ros2 launch nmea_navsat_driver nmea_serial_driver.launch.py

Noutro terminal, execute,

ros2 run nmea_navsat_driver read_lat_long.py

Imagem 4

Os dados impressos no terminal são a latitude, longitude e altitude atuais do módulo GPS. Vejamos o código-fonte, read_lat_long.py

python
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import NavSatFix

class GPSSubscriber(Node):
    def __init__(self):
        super().__init__('GPS_subscriber')
        self.subscription = self.create_subscription(
            NavSatFix,
            '/fix',
            self.gps_callback,
            10)
        self.subscription

    def gps_callback(self, msg):
        self.get_logger().info(f"latitude:{msg.latitude:.6f}, longitude:{msg.longitude:.6f}, altitude:{msg.altitude:.6f}")

def main(args=None):
    rclpy.init(args=args)
    gps_subscriber = GPSSubscriber()
    rclpy.spin(gps_subscriber)
    gps_subscriber.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

O programa subscreve os dados do tópico /fix e, em seguida, realiza a análise dentro da função de callback, imprimindo finalmente no terminal.