当前位置: 首页 > news >正文

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后,显示效果为:
在这里插入图片描述

相关文章:

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

文章目录 一、GPS模块介绍二、坐标转换转换原理参数解释: 增加回调函数效果演示 本文记录在Ubuntu22.04-Humbel中使用NMEA协议GPS模块的过程,使用国产ROS开发板鲁班猫(LubanCat )进行调试。 一、GPS模块介绍 在淘宝找了款性价比较高的轮趣科技GPS北斗双…...

chatgpt生成文本的底层工作原理是什么?

文章目录 🌟 ChatGPT生成文本的底层工作原理🍊 一、数据预处理🍊 二、模型结构🍊 三、模型训练🍊 四、文本生成🍊 总结 📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN…...

javaEE -11(10000字HTML入门级教程)

一&#xff1a; HTML HTML 代码是由 “标签” 构成的. 例如&#xff1a; <body>hello</body>标签名 (body) 放到 < > 中大部分标签成对出现. 为开始标签, 为结束标签.少数标签只有开始标签, 称为 “单标签”.开始标签和结束标签之间, 写的是标签的内容. (h…...

LeetCode75——Day21

文章目录 一、题目二、题解 一、题目 1207. Unique Number of Occurrences Given an array of integers arr, return true if the number of occurrences of each value in the array is unique or false otherwise. Example 1: Input: arr [1,2,2,1,1,3] Output: true Ex…...

学习笔记---更进一步的双向链表专题~~

目录 1. 双向链表的结构&#x1f98a; 2. 实现双向链表&#x1f41d; 2.1 要实现的目标&#x1f3af; 2.2 创建初始化&#x1f98b; 2.2.1 List.h 2.2.2 List.c 2.2.3 test.c 2.2.4 代码测试运行 2.3 尾插打印头插&#x1fabc; 思路分析 2.3.1 List.h 2.3.2 List.…...

vscode格式化代码, 谷歌风格, 允许短if同行短块同行, tab = 4舒适风格

ctrl ,输入format, 点开C风格设置 在这块内容输入{ BasedOnStyle: Chromium, IndentWidth: 4, ColumnLimit: 200, AllowShortIfStatementsOnASingleLine: true, AllowShortLoopsOnASingleLine: true} C_Cpp: Clang_format_fallback Style 用作回退的预定义样式的名称&#x…...

百度富文本上传图片后样式崩塌

&#x1f525;博客主页&#xff1a; 破浪前进 &#x1f516;系列专栏&#xff1a; Vue、React、PHP ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 问题描述&#xff1a;上传图片后&#xff0c;图片会变得很大&#xff0c;当点击的时候更是会顶开整个的容器的高跟宽 原因&#…...

autoware.ai中检测模块lidar_detector caffe

lidar_apollo_cnn_seg_detect模块&#xff1a;该模块主要是调用百度apollo的目标分割。 1.需要安装caffe进行实现: caffe安装步骤&#xff1a; git clone https://github.com/BVLC/caffecd caffe && mdkir build && cd buildcmake ..出现报错&#xff1a; CM…...

CentOS安装Ruby环境

安装依赖项 sudo yum install -y perl zlib-devel openssl-devel安装git sudo yum install -y git git config --global http.sslVerify falsecurl取消ssl认证 echo "insecure" >> ~/.curlrc安装rbenv https://github.com/rbenv/rbenv git clone https://…...

力扣第509题 斐波那契数 新手动态规划(推荐参考) c++

题目 509. 斐波那契数 简单 相关标签 递归 记忆化搜索 数学 动态规划 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&a…...

canvas绘制签名并保存

实现签名的三个关键方法&#xff1a; 1.mousedown&#xff1a;当鼠标按下时开始绘制签名。 2.mousemove&#xff1a;鼠标移动时持续绘制。 3.mouseup&#xff1a;鼠标抬起时结束绘制。 html&#xff1a; <div class"setSign"><canvasref"canvas&q…...

Android渲染流程

目录 缓冲区的不同生命周期代表当前缓冲区的状态&#xff1a; 多个源 ViewRootImpl&#xff1a; Android4.0&#xff1a; Android5.0&#xff1a; Android应用程序调用SurfaceFliger将测量&#xff0c;布局&#xff0c;绘制好的Surface借助GPU渲染显示到屏幕上。 一个Acti…...

牛客-【237题】算法基础精选题单-第二章 递归、分治

第二章 递归、分治 递归NC15173 The Biggest Water ProblemNC22164 更相减损术 递归 NC15173 The Biggest Water Problem 简单递归&#xff0c;直接暴力 #include <math.h> #include <stdio.h> #include <algorithm> #include <cstring> #include &…...

leetcode-字符串

1.反转字符串LeetCode344. 20230911 难度为0&#xff0c;此处就不放代码了 注意reverse和swap等一系列字符串函数什么时候该用&#xff0c;记一记库函数 swap可以有两种实现&#xff0c;涨知识了&#xff0c;除了temp存值还可以通过位运算&#xff1a;s[i] ^ s[j]; s[j] ^ s[i…...

多线程---synchronized特性+原理

文章目录 synchronized特性synchronized原理锁升级/锁膨胀锁消除锁粗化 synchronized特性 互斥 当某个线程执行到某个对象的synchronized中时&#xff0c;其他线程如果也执行到同一个对象的synchronized就会阻塞等待。 进入synchronized修饰的代码块相当于加锁 退出synchronize…...

Qt实现卡牌对对碰游戏

效果 闲来无事&#xff0c;实现一个对对碰游戏&#xff0c;卡牌样式是火影动漫。 先上效果&#xff1a; 卡牌对对碰_火影主题 玩法 启动游戏&#xff0c;进入第一关卡&#xff0c;所有卡牌都为未翻开状态&#xff0c;即背面朝上&#xff1b;点击卡牌&#xff0c;则将卡牌翻开…...

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割7(数据预处理)

在上一节&#xff1a;【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6&#xff08;数据预处理&#xff09; 中&#xff0c;我们已经得到了与mhd图像同seriesUID名称的mask nrrd数据文件了&#xff0c;可以说是一一对应了。 并且&#xff0c;mask的文件&#xff0c;还根据结…...

极米科技H6 Pro 4K、H6 4K高亮定焦版——开启家用投影4K普及时代

智能投影产业经过几年发展&#xff0c;市场规模正在快速扩大。洛图数据显示&#xff0c;预计今年中国投影出货量有望超700万台&#xff0c;2027年达950万台&#xff0c;可见智能投影产业规模将逐渐壮大&#xff0c;未来可期。2023年&#xff0c;投影行业呈现出全新面貌&#xf…...

软考系统架构师知识点集锦九:数据库系统

一、考情分析 二、考点精讲 2.1数据库概述 2.1.1数据库模式 (1)三级模式:外模式对应视图&#xff0c;模式(也称为概念模式)对应数据库表&#xff0c;内模式对应物理文件。(2)两层映像:外模式-模式映像&#xff0c;模式-内模式映像;两层映像可以保证数据库中的数据具有较高的…...

IOC课程整理-6 Spring IoC 依赖注入

1 依赖注入的模式和类型 模式 类型 2 自动绑定&#xff08;Autowiring&#xff09; 官方定义 “自动装配是Spring框架中一种机制&#xff0c;用于自动解析和满足bean之间的依赖关系。通过自动装配&#xff0c;Spring容器可以根据类型、名称或其他属性来自动连接协作的bean&…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...