#调用传感器数据_ROS传感器之GPS实践

2023-05-16

一. GPS接口类型

GPS接口大体可以分为两类,一是单独的GPS接收器,通常为USB接口;二是与其他传感器集成,例如激光雷达或者imu,大多是USB或者网络接口,本文主要介绍USB接口实例。

二. 概念

这里有三个概念,需要明确下:驱动,SDK和ROS驱动。以USB GPS为例,GPS驱动是作为操作系统层面的驱动程序,一般需要事先安装,安装成功后,接入GPS设备时,会出现相应的设备文件,

通常为/dev/ttyUSBx,x是一个数字,代表设备号,与主机接入的设备个数和顺序有关。在驱动安装完成之后,我们就获得了设备文件。GPS SDK是一套应用层程序,可以从设备文件中获取设备数据,驱动和SDK一般都由厂家提供。

ROS驱动通常是基于SDK进行ROS封装而成,目前有不少传感器厂商和ROS社区提供了常用传感器的ROS驱动。

三.GPS ROS驱动获取

当我们拿到一个GPS之后,可以首先查下这款GPS有没有ROS驱动,可以咨询厂商或者到ros wiki查询,链接:

Sensors - ROS Wiki​wiki.ros.org

如果没有现成的ROS驱动,可以基于厂商提供的SDK自己封装,可以参考同类型ros驱动设计。

四. nmea_navsat_driver

nmea_navsat_driver是一套用于获取并解析GPS数据的ROS驱动包,使用Python语言实现。GPS设备使用此包的条件是:遵守或者兼容NMEA0184协议。nmea_navsat_driver提供四个节点:nmea_topic_driver,

nmea_serial_driver,nmea_topic_serial_reader和nmea_socket_driver。

1. 文件结构

执行以下指令:

roscd nmea_navsat_driver
sudo  apt install tree
tree -L 4

执行效果如图:

scripts目录存放顶层节点文件,对应上述四个节点,其中的文件只是调用main()函数,实际实现在src/nodes目录下对应文件名的Python文件中。launch目录存放启动nmea_serial_driver节点launch文件。

setup.py是Python语言ROS包编译配置文件,内容不要更改。

2. nmea_topic_serial_reader节点

此节点从串口读入GPS数据,然后封装为nmea_msgs/Sentence数据格式,发布话题nmea_sentence。

nmea_topic_serial_reader文件只有两行,如下:

import libnmea_navsat_driver.nodes.nmea_topic_serial_reader
libnmea_navsat_driver.nodes.nmea_topic_serial_reader.main()

第一行导入nodes目录下的nmea_topic_serial_reader.py文件,第二行调用nmea_topic_serial_reader.py中的main()函数。

nmea_topic_serial_reader.py文件内容如下,因为增加中文注释,所以需要包含“# -*- coding: UTF-8 -*-”。

# -*- coding: UTF-8 -*-
import serial   #引入串口模块
from nmea_msgs.msg import Sentence  #引入nmea_msgs/Sentence结构
import rospy    #引入ROS的Python接口模块
from libnmea_navsat_driver.driver import RosNMEADriver  #引入driver.py中的RosNMEADriver

def main():
    rospy.init_node('nmea_topic_serial_reader')     #初始化ros节点名
    nmea_pub = rospy.Publisher("nmea_sentence", Sentence, queue_size=1)     #定义发布者
    serial_port = rospy.get_param('~port', '/dev/ttyUSB0')      #设置串口设备文件名
    serial_baud = rospy.get_param('~baud', 4800)                #设置波特率

    # Get the frame_id
    frame_id = RosNMEADriver.get_frame_id()                 #设置frame_id
    try:
        GPS = serial.Serial(port=serial_port, baudrate=serial_baud, timeout=2)      #调用python串口模块Serial
        while not rospy.is_shutdown():
            data = GPS.readline().strip()         #从串口读入数据

            sentence = Sentence()       #创建nmea_msgs/Sentence结构变量sentence
            sentence.header.stamp = rospy.get_rostime()     #设置sentence的时间戳为当前时间
            sentence.header.frame_id = frame_id             #设置sentence的frame_id
            sentence.sentence = data                        #设置sentence的sentence变量。

            nmea_pub.publish(sentence)                      #发布sentence

    except rospy.ROSInterruptException:                     #异常处理
        GPS.close()  # Close GPS serial port

文件添加了详细的注释,大家可以对比阅读。需要注意的是,在串口设置时需要根据实际情况,配置设备文件以及波特率。

3. nmea_topic_driver节点

此节点订阅话题nmea_sentence,然后根据NMEA0184协议解析,并发布解析后的数据,发布话题为:经纬度/fix,速度/vel,gps时间/time_reference和航向角/heading。

执行以下指令:

rosrun nmea_navsat_driver nmea_topic_driver
rqt_graph

执行效果如图

nmea_topic_driver节点文件流程同nmea_topic_serial_reader,顶层节点文件nmea_topic_driver调用nmea_topic_driver.py中的main函数,nmea_topic_driver.py内容如下:

# -*- coding: UTF-8 -*-
from nmea_msgs.msg import Sentence
import rospy

from libnmea_navsat_driver.driver import RosNMEADriver
def nmea_sentence_callback(nmea_sentence, driver):
    try:
        driver.add_sentence(
            nmea_sentence.sentence,
            frame_id=nmea_sentence.header.frame_id,
            timestamp=nmea_sentence.header.stamp)   #add_sentence()接收frame_id和时间戳,接收sentence并解析,发布解析后的时间,位置,速度和航向角信息。
    except ValueError as e:
        rospy.logwarn(
            "Value error, likely due to missing fields in the NMEA message. "
            "Error was: %s. Please report this issue at ros-drivers/nmea_navsat_driver, "
            "including a bag file with the NMEA sentences that caused it." %
            e)

def main():
    rospy.init_node('nmea_topic_driver')
    driver = RosNMEADriver()    #实例化RosNMEADriver()类
    rospy.Subscriber("nmea_sentence", Sentence, nmea_sentence_callback,driver)    #订阅话题nmea_sentence,话题类型Sentence,回调函数nmea_sentence_callback,回调函数第二个参数driver。

    rospy.spin()

这里比较关键的是add_sentence()函数,此函数是driver.py文件RosNMEADriver类的成员函数,主要功能是根据NMEA0184协议,对sentence数据进行解析,进而获取gps时间,位置,速度以及航向角信息,然后发布出来,

感兴趣的可以对照NMEA0184协议研究此函数,这里不再深入分析。

需要说明的是,虽然此函数提供了四个话题,但是不同的GPS设备,其提供的信息可能也不一样,所以有的话题可能是空的,例如heading和vel。

4. nmea_serial_driver节点

此节点从串口读数据,直接解析发布数据,相当于nmea_topic_driver节点和nmea_topic_serial_reader节点的结合体,有了上面两个基础,相信应该可以看懂这个程序,就不再介绍了。

此节点是通过网口读取gps数据,除了接口不同外,在拿到sentence之后的处理流程是一致的,这里就不在介绍,需要说明的是利用网口,只需要配置ip和端口号,不需要安装驱动。

五. 说明

虽然GPS设备输出数据兼容NMEA0184,但是不同厂家的设备,可能需要不同的配置,所以一个GPS ROS驱动不一定适应所有GPS设备,即使GPS设备遵守NMEA0184,nmea_navsat_driver包在Garmin GPS 18x以及

Venus Venus634LPx上测试,其他GPS设备未必可以直接使用,最终还是以厂家手册为准。

六. 参考

本篇参考wiki:

nmea_navsat_driver - ROS Wiki​wiki.ros.org

代码取自其中的github仓库:

ros-drivers/nmea_navsat_driver​github.com

添加了部分中文注释,修改后的代码提交到仓库:

https://github.com/ahuer2435/ros_program_melodic.git​github.com

七. 小结

本篇首先明确驱动,sdk以及ros驱动的概念,介绍了实现ros驱动的几种途径,然后以nmea_navsat_driver为例,介绍在ros系统中,如何获取,解析以及发布gps数据,由于没有实际硬件,所以没有运行串口读取的节点,有条件的话,大家可以自行测试。

GPS可以实现全球范围内定位,但是由于其频率较低,且易受外界影响,在实际使用中多与IMU配合使用,下一篇介绍GPS的黄金搭档:惯性测量单元IMU。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#调用传感器数据_ROS传感器之GPS实践 的相关文章

  • 使用 Android.Xamarin 查找纬度和经度

    我正在尝试在 Android Xamarin 中开发商店定位器应用程序 我的第一步是找到我所在位置的纬度和经度 但我的模拟器 设备屏幕没有显示任何内容 我有我的uses permissions set to
  • 位置侦听器从服务工作,但不是 IntentService

    我有一个应用程序 我试图定期获取用户位置并将其发送到服务器 我有一项服务附加到AlarmManager每分钟执行一次 用于测试 该服务正确找到用户位置并注销 GPS 坐标 一旦出现 GPS 锁定 我就会取消位置请求并停止服务 当我请求位置更
  • C#:GPS跟踪系统[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 C net 中构建带有移动设备 带 GPS 的 GPS 跟踪系统 场景是 通过支持 GPS 的手机跟踪用户 服务工程师 这里没
  • GPS坐标:一个点周围1平方公里

    我希望有人能给我提供一个方程来计算给定点周围 1 公里的平方 X 从 a aaa 到 b bbb Y 从 c ccc 到 c ccc 例如lat 53 38292839 and lon 6 1843984 我还需要围绕一个点 2 公里 5
  • 如何在 Android 中找到附近的应用程序用户?

    我正在制作一个应用程序 需要能够找到附近的人 他们是我的应用程序的用户 我看了很多类似问题的答案 似乎我别无选择 只能不断将用户的当前位置上传到服务器 并在必要时获取附近的用户列表 那么我的问题是 1 要获取附近的列表 应该有一些计算距离的
  • 如何确定当前用户位置是否在我的 MKCooperativeRegion 内?

    我有一个坐标区域 我已确定该区域包含我想要为我的应用程序显示的内容的限制 我已将其设置为具有中心点纬度 经度和跨度的 MKCooperativeRegion 如何确定当前 userLocation 是否在我的坐标区域内 使用地图矩形 这是使
  • React Native Android 位置请求超时

    在 IOS 中查找 GPS 坐标时没有问题 效果很好 Android 端不如 IOS 稳定 在真机和模拟器中都会出现这个问题 有时它可以找到位置 但有时却找不到 寻找了3天 但没有找到解决方案 当我的应用程序无法找到我的位置时 我尝试通过谷
  • 从 GPS 点绘制线

    我有大约 100 个 GPS 坐标列表 我想画出每个列表所构成的线 使用散点图绘制的列表之一 看起来有点像这样 显然那里有一条线 我尝试了几种方法来对 GPS 位置进行排序并绘制它们 lats lngs with open filename
  • 在不改变我的位置的情况下获取当前位置的经度和纬度

    我可以找到当前位置的纬度和经度 但是这些数据在更改我的当前位置之前不会显示 我想在不更改我的位置的情况下获取当前位置的经度和纬度 package com example gps import android app Activity imp
  • 帮助使用 GPS 坐标,Android

    我正在使用此代码来获取我的位置并在屏幕上打印坐标 package com example alpha import android app Activity import android content Context import and
  • 移动应用程序在后台时的 GPS 位置(使用 ionicframework)

    我需要实现一个应用程序来存储用户从 A 移动到 B 时的旅程 路径 现在 我知道 ionicframework 可以使用 GPS 但是当我的应用程序转到后台时会发生什么 我的应用程序如何继续存储用户位置 这可能吗 有没有我可以使用的插件 请
  • 如何从 Android 手机获取 GPS 数据?

    有没有办法将 Android 手机的 GPS 数据连接 USB 有线 到 PC 我目前正在使用基于 gpsd 项目的 GPSTether 应用程序 我正在寻找比该应用程序提供更多控制且错误更少的替代方案 另外 是否有另一种方法可以在不使用任
  • 谷歌地图定位是如何工作的?

    我的问题是谷歌地图或移动 GPS 如何找到我的当前位置 读完本文后我的高层次理解article http www physics org article questions asp id 55就是 GPS接收器通过这些卫星获取位置坐标 该位
  • Android 查找 GPS 位置一次,显示加载对话框

    我正在编写一个应用程序 它需要用户的当前位置 lastknownlocation 不会很有帮助 并显示从数据库中获取的所有最接近的 项目 的列表 我已经找到了最近的项目 效果很好 但暂时只使用硬编码的纬度和经度位置 但现在是时候实现查找实际
  • 当我的活动结束时,如何停止 GPS/位置跟踪?

    我有一个非常简单的 Android 应用程序 它显示 Google 地图视图并使用 GPS 跟踪位置 基本上像这样 public void onCreate Bundle savedInstanceState mLocationManage
  • requestLocationUpdates minTime 参数用途

    我正在创建一个应用程序 用于教育目的 它每 30 分钟记录一次用户的位置 并使用户能够查看地图上的所有位置 我不希望更新频率超过 30 分钟 但事实确实如此 这就是我的称呼requestLocationUpdates locationMan
  • 向 tk103 GPS 跟踪器发送命令

    我正在使用 php 开发实时 GPS 跟踪器 Web 应用程序 跟踪器参考号是tk103 我可以从跟踪器接收信息并将其存储到数据库中 设备的 GPRS 模式已启用 我的问题是 如何使用 php ini 将命令从服务器发送到设备 提前致谢 这
  • 如何在Android中获取当前位置[重复]

    这个问题在这里已经有答案了 我在使用 Android 定位系统的网络提供程序获取当前位置坐标时遇到麻烦 已经阅读了大量教程并在我的项目中实现了 4 或 5 个现有类 所有这些类都给了我最后的坐标 但不是当前的坐标 我很确定这个问题是我所缺少
  • 检查用户设备的 GPS 是否开启

    我正在使用 jQuery Mobile 和 PHP 开发一个应用程序 我没有使用 Phonegap 或其他框架 我需要找到用户的geolocation 如果用户设备的 GPS 关闭 那么我无法获取位置 现在我需要查找用户设备的 GPS 是否
  • 如何在从另一个活动调用一个活动时延迟一些?

    我有一个应用程序 其中我正在接收包含他的位置的短信 收到短信后 它会调用另一个活动来启动并将该位置传递给该活动以将其绘制在地图上 在调用第二个活动之前 它会显示一个类似于通知的吐司在屏幕上 但由于调用第二个活动 吐司没有出现 我的问题是我们

随机推荐