GPS学习(一):在ROS2中将GPS经纬度数据转换为机器人ENU坐标系,在RVIZ中显示坐标轨迹

文章目录

  • 一、GPS模块介绍
  • 二、坐标转换
    • 转换原理
      • 参数解释:
    • 增加回调函数
    • 效果演示

本文记录在Ubuntu22.04-Humbel中使用NMEA协议GPS模块的过程,使用国产ROS开发板鲁班猫(LubanCat )进行调试。

一、GPS模块介绍

在淘宝找了款性价比较高的轮趣科技GPS北斗双模定位模块作为入门学习使用,支持GNSS系统(北斗、GPS、GLONASS、日本的QZSS以及卫星增强系统SBAS),定位精度在2.5m左右,属于民用级别。引出了常用的几个外部接口,主要用type-c调试比较方便,售后技术也相当给力。接线示意图如下,注意:测试时需要将GPS天线放置在室外,否则模块将没有GPS信号
在这里插入图片描述

二、坐标转换

机器人基于Ubuntu-ROS平台做开发调试,所以需要将GPS模块的经纬度和高度信息转化为机器人所能认识的本地坐标系(局部笛卡尔坐标系)。参考其他博主案例,使用半正矢公式来将经纬度转为xyz坐标值。

转换原理

半正矢公式介绍:
半正矢公式是一种根据两点的经度和纬度来确定大圆上两点之间距离的计算方法,在导航有着重要地位。它是球面三角学中“半正矢定理”公式的特例,该定理涉及了球面三角形的边和角。
对于任何球面上的两点,圆心角的半正矢值可以通过如下公式计算:

          hav( d r \frac{d}{r} rd)=hav( ψ 2 \psi_{2} ψ2- ψ 1 \psi_{1} ψ1)+cos( ψ 1 \psi_{1} ψ1)cos( ψ 2 \psi_{2} ψ2)hav( λ 2 \lambda_{2} λ2- λ 1 \lambda_{1} λ1)

hav 是半正矢函数的缩写:

          haversin( θ \theta θ)= s i n 2 sin^{2} sin2( ( θ ) 2 \frac{(\theta)}{2} 2(θ))= 1 − c o s ( θ ) 2 \frac{1-cos(\theta)}{2} 21cos(θ)

参数解释:

d :两点之间的距离(沿大圆,见球面距离);
r :球的半径;
ψ 1 \psi_{1} ψ1 ψ 2 \psi_{2} ψ2 :点 1 的纬度和点 2 的纬度,以弧度制度量;
λ 1 \lambda_{1} λ1 λ 2 \lambda_{2} λ2:点 1 的经度和点 2 的经度,以弧度制度量。
等号左边的 d r \frac{d}{r} rd:圆心角,单位是弧度。

所以,可以通过应用反半正矢函数(如果可以查到值)或通过使用反正弦函数来解出d :
           d = r ∗ a r c h a v ( h ) d=\sqrt[]{r*archav(h)} d=rarchav(h)                   =  2r*arcsin h \sqrt[]{h} h )

将h=hav d r \frac{d}{r} rd代入后可得:
   在这里插入图片描述
对于中短距离来说,半正矢公式是计算地球表面 GPS 坐标之间距离的有用且相对准确的方法,在距离较长时其准确性可能会降低。

增加回调函数

这里简单解释一下gpsCallback回调函数的内容,此处订阅sensor_msgs::msg::NavSatFix数据格式的GPS话题进行数据处理。

//将纬度和经度值从度数转换为弧度。
double rad(double d) 
{return d * 3.1415926 / 180.0;
}
void gps_callback(const sensor_msgs::msg::NavSatFix::SharedPtr gps_msg)
{if (!pose_init){// Initialization code remains the same.//使用接收到的 GPS 消息中的纬度、经度和高度false进行初始化,只初始化一次init_pose.latitude = gps_msg->latitude;init_pose.longitude = gps_msg->longitude;init_pose.altitude = gps_msg->altitude;init = true;}else{//计算当前 GPS 位置与初始 GPS 位置之间的纬度和经度变化double radLat1 ,radLat2, radLong1,radLong2,delta_lat,delta_long,x,y;double deltaLat_y ,deltaLong_x;deltaLat_x = 0; deltaLong_y = 0;radLat1 = rad(init_pose.latitude);//初始化位置的纬度radLong1 = rad(init_pose.longitude);//初始化位置的经度radLat2 = rad(gps_msg->latitude);//当前位置的纬度radLong2 = rad(gps_msg->longitude);//当前位置的经度deltaLat = radLat2 - radLat1; deltaLong = radLong2 - radLong1;// 代入公式进行计算x的坐标值x = 2 * asin(sqrt(pow(sin(delta_lat / 2), 2) + cos(radLat1) * cos(radLat2) * pow(sin(deltaLong_y / 2), 2));//公式计算结果默认为弧度,所以这里要转换成m的单位x = x * EARTH_RADIUS * 1000; //  代入公式进行计算y的坐标值y = 2 * asin(sqrt(pow(sin(deltaLat_x / 2), 2) + cos(radLat2) * cos(radLat2) * pow(sin(deltaLong / 2), 2));y = y * EARTH_RADIUS * 1000; // Convert to meters.// 将高度差计算为z的坐标值double z = gps_msg->altitude - init_pose.altitude;//将计算得到的xyz值发布为ROS中的PoseStamped数据,作为路径发布ros_path_.header.frame_id = "path";ros_path_.header.stamp = rclcpp::Node::now();geometry_msgs::msg::PoseStamped pose;pose.header = ros_path_.header;pose.pose.position.x = x;pose.pose.position.y = y;pose.pose.position.z = z;ros_path_.poses.push_back(pose);state_pub_.publish(ros_path_);}
}

效果演示

使用nmea_navsat_driver驱动启动GPS模块,源码链接:https://github.com/ros-drivers/nmea_navsat_driver/tree/ros2

ros2 launch nmea_navsat_driver nmea_serial_driver.launch.py

然后启动坐标转换节点,将经纬度数据从WGS-84 坐标转换到机器人真实世
界 xyz 坐标系下(一般为东北天方向),以第一个经纬度数据为原点,不断描绘实时经纬度数据的位移方向,显示为机器人运行轨迹图。

ros2 launch gps_path gps_path.launch.py

打开rviz2,修改 Fixed Frame 为path,电机左下角[add],根据topic添加[gps_path]->path后,显示效果为:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/125752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 远程桌面软件

为您的 IT 管理员配备最好的 Linux 远程桌面软件至关重要。原因如下?Linux 是一个开源和免费的操作系统,它提供了一个非常灵活和可定制的软件内核。由于其开源性质,Linux 被认为是市场上最安全的操作系统之一,它拥有一个全球用户社…

Qt 中model/View 架构 详解,以及案例实现相薄功能

model/View 架构 导读 ​ 我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应用程序的界面中。早期的 Qt 要实现这个功能,需要定义一个组件,在这个组件中保存一个数据对象,比如一个列表。我们对这个列表进行查找、插入等的操作,或者把修改…

PHP自定义文件缓存实现

文件缓存:可以将PHP脚本的执行结果缓存到文件中。当一个PHP脚本被请求时,先查看是否存在缓存文件,如果存在且未过期,则直接读取缓存文件内容返回给客户端,而无需执行脚本 1、文件缓存写法一,每个文件缓存一…

语音信号处理给音乐信号增加房间混响效果

语音信号处理给音乐信号增加房间混响效果 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务 1 源码布局 2 源文件与音频文件和生成文件 3 编译方法

「Qt中文教程指南」如何创建基于Qt Widget的应用程序(四)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文描述了如何使用…

点云配准--对称式ICP

对称式ICP 写在前面的话 针对于局部平面不完美的情况,提出了一种对称式ICP目标函数,相较于传统的ICP方法,增大了收敛域,提高了收敛速度。论文理论说明不甚清楚,实验较少,但代码开源。 理论 对称目标函数…

elementUI树节点全选,反选,半选状态

// <template>部分 <div class"check-block"><el-divider></el-divider><el-checkbox :indeterminate"indeterminate" v-model"checkAll" change"handleCheckAllChange">全选</el-checkbox><e…

1-1 prometheus 概述

一、概述 二、特点 三、核心组件 四、基础架构 4.1 Prometheus 的主要模块包含 4.2 运行逻辑 五、Prometheus 与 Zabbix 的对比 六、总结 一、概述 1. 什么是prometheus? 开源系统监控 和 警报工具包受启发于Google的Brogmon监控系统(相似的Kubernetes是从Google的Br…

518抽奖软件,可从Excel~Word~Pdf~网页导入名单

518抽奖软件简介 518抽奖软件&#xff0c;518我要发&#xff0c;超好用的年会抽奖软件&#xff0c;简约设计风格。 包含文字号码抽奖、照片抽奖两种模式&#xff0c;支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 从Excel、WPS表格导入 整列&#xff1a; 用鼠…

华泰证券:新奥能源:零售气待恢复,泛能与智家仍是亮点

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;由于新奥能源&#xff08;02688&#xff09;发布三季度经营数据&#xff1a; 1-3Q23&#xff1a;天然气零售量yoy-4.7%&#xff0c;燃气批发量yoy17.6%&#xff0c;综合能源销量yoy34.2%&#xff…

生态扩展:Flink Doris Connector

生态扩展&#xff1a;Flink Doris Connector 官网地址&#xff1a; https://doris.apache.org/zh-CN/docs/dev/ecosystem/flink-doris-connector flink的安装&#xff1a; tar -zxvf flink-1.16.0-bin-scala_2.12.tgz mv flink-1.16.0-bin-scala_2.12.tgz /opt/flinkflink环境…

相关性网络图 |显著性标记

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 本期教程 写在前面 此图是一位同学看到后&#xff0c;想出的一期教程。 最近&#xff0c;自己的事情比较多&#xff0c;会无暇顾及社群和公众号教程。 1 安装和加载相关的R包 library(ggraph) library(tidy…

MATLAB R2018b详细安装教程(附资源)

云盘链接&#xff1a; pan.baidu.com/s/1SsfNtlG96umfXdhaEOPT1g 提取码&#xff1a;1024 大小&#xff1a;11.77GB 安装环境&#xff1a;Win10/Win8/Win7 安装步骤&#xff1a; 1.鼠标右击【R2018b(64bit)】压缩包选择【解压到 R2018b(64bit)】 2.打开解压后的文件夹中的…

笔记本电脑的键盘鼠标如何共享控制另外一台电脑

环境&#xff1a; 联想E14 x2 Win10 across 2.0 问题描述&#xff1a; 笔记本电脑的键盘鼠标如何共享控制另外一台电脑 解决方案&#xff1a; 1.下载across软件&#xff0c;2台电脑都按装&#xff0c;一台设为服务端&#xff0c;一台客户端 2.把配对好设备拖到右边左侧…

微信小程序怎么制作?【小程序开发平台教学】

随着移动互联网的快速发展&#xff0c;微信小程序已经成为了人们日常生活中不可或缺的一部分。从购物、支付、出行到社交、娱乐、教育&#xff0c;小程序几乎涵盖了我们生活的方方面面。那么&#xff0c;对于有营销需求的企业商家来说&#xff0c;如何制作一个自己的微信小程序…

RPC与HTTP的关系

首选理清楚关系 RPC与HTTP是两个不同维度的东西 HTTP 协议&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff0c;又叫做超文本传输协议&#xff0c;是一种传输协议&#xff0c;平时通过浏览器浏览网页网页&#xff0c;用到的就是 HTTP 协议。 而 RPC&#xff0…

10.2 一文读懂SPI与DSPI、QSPI、OSPI关系与异同

本文主要内容: 1 SPI与DSPI、QSPI、OSPI定义 2 SPI与xSPI对比 3 常用的nor flash 4 驱动架构 5 xSPI镜像烧录 1 SPI与DSPI、QSPI、OSPI定义 1)标准SPI 通过说的SPI,称为标准SPI,是一种串行外设接口,通过有4根线控制,CLK、CS、MISO、MOSI,可工作于4种模式,一般是主机…

【Unity小技巧】可靠的相机抖动及如何同时处理多个震动(附项目源码)

文章目录 每篇一句前言安装虚拟相机虚拟相机震动测试代码控制震动清除震动控制震动的幅度和时间 两个不同的强弱震动同时发生源码完结 每篇一句 围在城里的人想逃出来&#xff0c;站在城外的人想冲进去&#xff0c;婚姻也罢&#xff0c;事业也罢&#xff0c;人生的欲望大都如此…

三.RocketMQ单机安装及集群搭建

RocketMQ单机安装及集群搭建 一&#xff1a;安装环境1.软硬件要求2.下载RocketMQ 二.安装单机MQ1.上传并解压2.目录介绍3.修改MQ启动时初始JVM内存4.启动NameServer与Broker5.测试RocketMQ 三.RocketMQ集群搭建1.集群概念特点2.集群模式分类3.集群工作流程4.双主双从集群搭建4.…

【C++】C++11常见特性

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…