🧪 新教程持续更新中 · 从机械臂到传感器,跟着教程从零搭建
跳到主要内容

ROS:读取 GPS 数据 ​

该功能是通过终端读取GPS模块数据以及解析GPS数据得到经纬度和海拔数据。

1、通过终端读取GPS数据 ​

终端输入,

ros2 launch nmea_navsat_driver nmea_serial_driver.launch.py

图 1

然后我们查看下话题数据,终端输入,

ros2 topic list

图 2

关于GPS这几个话题的数据,这里做个说明,

话题类型说明
/extend_fixgps_common/GPSFixGPSFix消息包含GPS卫星状态和定位信息
/fixsensor_msgs/NavSatFixGPS定位信息
/time_referencesensor_msgs/TimeReferencdGPS时间信息
/velgeometry_msgs/TwistStampedGPS的速度信息

各个话题消息类型可以参考以官网网址,

sensor_msgs/NavSatFix Documentation (ros.org)

sensor_msgs/TimeReference Documentation (ros.org)

geometry_msgs/TwistStamped Documentation (ros.org)

我们可以在在终端打印出这些话题消息,得到的就是GPS数据,以打印/fix为例,终端输入

ros2 topic echo /fix

终端会打印出以下数据,

图 3

其中,latitude,longitude,altitude分别代表的是纬度、经度和海拔。

2、读取GPS数据的经纬度和海拔 ​

终端运行,

ros2 launch nmea_navsat_driver nmea_serial_driver.launch.py

在另一个终端运行,

ros2 run nmea_navsat_driver read_lat_long.py

图 4

终端打印的数据就是当前GPS模块的经纬度和海拔,看看源码,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()

程序订阅了/fix话题的数据,然后在回调函数里边做了解析,最终打印到终端上。