ROS:GPS データの読み取り
この機能は、ターミナルを通じてGPSモジュールデータを読み取り、GPSデータを解析して緯度経度と標高データを得るものです。
1、ターミナルによるGPSデータの読み取り
ターミナルに入力し、
ros2 launch nmea_navsat_driver nmea_serial_driver.launch.py
次にトピックデータを確認します。ターミナルに入力し、
ros2 topic list
GPSのこれらのトピックのデータについて、ここで説明します。
| トピック | タイプ | 説明 |
|---|---|---|
| /extend_fix | gps_common/GPSFix | GPSFixメッセージはGPS衛星の状態と測位情報を含みます |
| /fix | sensor_msgs/NavSatFix | GPS測位情報 |
| /time_reference | sensor_msgs/TimeReferencd | GPS時刻情報 |
| /vel | geometry_msgs/TwistStamped | GPSの速度情報 |
各トピックのメッセージタイプは以下の公式サイトを参照できます。
sensor_msgs/NavSatFix Documentation (ros.org)
sensor_msgs/TimeReference Documentation (ros.org)
geometry_msgs/TwistStamped Documentation (ros.org)
これらのトピックメッセージをターミナルで出力すると、それがGPSデータになります。/fixを出力する場合を例にすると、ターミナルに入力し
ros2 topic echo /fixターミナルには以下のデータが出力されます。

このうち、latitude、longitude、altitudeはそれぞれ緯度、経度、標高を表します。
2、GPSデータの緯度経度と標高の読み取り
ターミナルで実行し、
ros2 launch nmea_navsat_driver nmea_serial_driver.launch.py別のターミナルで実行し、
ros2 run nmea_navsat_driver read_lat_long.py
ターミナルに出力されるデータが現在の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トピックのデータを購読し、その後コールバック関数で解析を行い、最終的にターミナルに出力します。

