【ROS系列】坐标系转换介绍和对齐

一、坐标系简介

本篇文章介绍:ECEF、ENU、UTM、WGS-84坐标系(LLA)

1.1、ECEF坐标系

ECEF坐标系也叫地心地固直角坐标系

原点:地球的质心,

x轴:原点延伸通过本初子午线(0度经度)和赤道(0维度)的交点。

z轴:原点延伸通过的北极,也就是理想地球旋转轴。

y轴:Z-->X 完成右手定则,穿过赤道和90度经度。如下图所示:

 

1.2、 WGS-84坐标系(LLA)

WGS-84坐标系也叫经纬高坐标系(经度(longitude),纬度(latitude)和高度(altitude)LLA坐标系),全球地理坐标系、大地坐标系。

特点:最为广泛应用的一个地球坐标系,它给出一点的大地纬度、大地经度和大地高程。更加直观地告诉我们该点在地球中的位置,故又被称作经纬高坐标系。

WGS-84坐标系:

X轴:指向BIH(国际时间服务机构)1984.0定义的零子午面(Greenwich)和协议地球极(CTP)赤道的交点。

Z轴:指向CTP方向。

Y轴:与X、Z轴构成右手坐标系。
其中:
(1)大地纬度是过点P的基准椭球面法线与赤道面的夹角。纬度值在-90°到+90°之间。北半球为正,南半球为负。

(2)大地经度是过点P的子午面与本初子午线之间的夹角。经度值在-180°到+180°之间。

(3)大地高度h是过点P到基准椭球面的法线距离,基准椭球面以内为负,以外为正。
图示可以参照上图,清楚描述ECEF 和 WGS-84的关系。WGS-84和GPS关系参照下图:

1.3、 东北天坐标系(ENU)

东北天坐标系(ENU)也叫站心坐标系以用户所在位置P为坐标原点。

坐标系定义为:

X轴:指向东边

Y轴:指向北边

Z轴:指向天顶

ENU局部坐标系采用三维直角坐标系来描述地球表面,实际应用较为困难,因此一般使用简化后的二维投影坐标系来描述。

二维投影坐标系中 统一横轴墨卡托(The Universal Transverse Mercator ,UTM)坐标系是一种应用较为广泛的一种。

UTM 坐标系统使用基于网格的方法表示坐标,它将地球分为 60 个经度区,每个区包含6度的经度范围,每个区内的坐标均基于横轴墨卡托投影,如下图所示:

将上图切分后展平得到下图:

DMAP: UTM Grid Zones of the World

根据中国utm分区表,确定所在地区的utm分区,最常用的对照以下表:

等会坐标转换就可以使用这个图上的分区。

二、坐标转换

2.1、工具介绍

主要使用pyproj工具进行坐标的转换,文档地址:入门 — pyproj 2.1.1 文档

2.2、坐标之间相互转换

知识前置,我们最常见的的是gps坐标拿到经纬度和海拔信息。gps使用的坐标系为WGS,其编号(EPSG)EPSG:4326 ,这个参数后续要用到

在使用UTM坐标系转化时要弄清处数据在utm分区表中哪一个分区,假设当前经纬信息为【121.398926,31.559815 】可以根据分区表得到北半球51分区,即51N

网站EPSG.io: Coordinate Systems Worldwide 上查询utm分区对应的utm坐标系编码,输入 51N 进行查询,找到对应WGS84 转换前坐标系。得到EPSG:32651

转换原理

(1) 经纬度坐标系转ECEF

 

 (2)ECEF坐标系转LLA坐标系

start:lon是未知的,假设为0,经过几次迭代之后就能收敛

update公式:  alt=(p/cos(lat))-N

(3)ECEF坐标系转ENU坐标系

用户所在坐标原点𝑃0=(𝑥0,𝑦0,𝑧0),计算点𝑃=(𝑥,𝑦,𝑧)在以点𝑃0为坐标原点的ENU坐标系位置(e,n,u)这里需要用到LLA坐标系的数据,𝑃0的LLA坐标点为𝐿𝐿𝐴0=(𝑙𝑜𝑛0,𝑙𝑎𝑡0,𝑎𝑙𝑡0)

(4)ENU坐标系转ECEF坐标系

上面介绍S为单位正交阵

 (5)经纬度LLA坐标系直接转ENU坐标系

上述可以看到,从LLA坐标系转换到enu坐标系有较多计算量,在考虑地球偏心率𝑒很小的前提下,可以做一定的近似公式计算

代码实现

(1) 经纬度转UTM坐标

    # 经纬度到UTM世界平面坐标系def wgs2utm_51N(lat,lon):crs = pyproj.CRS.from_epsg(4326)crs_cs = pyproj.CRS.from_epsg(32651)transformer = Transformer.from_crs(crs, crs_cs)x, y = transformer.transform(lat, lon)return [x, y]

(2)UTM转经纬坐标

    # 经纬度到UTM世界平面坐标系def utm_51N2wgs(x,y):transformer = Transformer.from_crs("epsg:32651", "epsg:4326")lat, lon = transformer.transform(x, y)return [lat, lon]

(3)经纬海拔转 地心地固坐标

    # 经纬度到地心地固(earth-central, earth-fixed)坐标系def wgs2ecef(lon,lat,alt):ecef = pyproj.Proj(proj='geocent', ellps='WGS84', datum='WGS84')lla = pyproj.Proj(proj='latlong', ellps='WGS84', datum='WGS84')x, y, z = pyproj.transform(lla, ecef, lon, lat, alt,radians=False)return np.array([x, y, z])

(4)地心地固转enu坐标

  # 用户所在坐标原点Pb=(x0,y0,z0),计算点P=(x,y,z)在以点P0为坐标原点的坐标系位置(e,n,u),# 这里需要用到LLA的数据,P0的LLA坐标点为LLAo=(lon0,lat0,alt0)# 地心地固到东北天坐标系def ecef2enu(self, point0, point):# 转换为弧度lat_r = math.radians(self.lat)lon_r = math.radians(self.lon)line1 = np.array([-math.sin(lon_r), math.cos(lon_r), 0])line2 = np.array([-math.sin(lat_r) * math.cos(lon_r),-math.sin(lat_r) * math.sin(lon_r),math.cos(lat_r)])line3 = np.array([math.cos(lat_r) * math.cos(lon_r),math.cos(lat_r) * math.sin(lon_r),math.sin(lat_r)])trans = np.vstack((line1, line2, line3))difference = point - point0[e, n, u] = np.matmul(trans, np.array(difference).T).Treturn [e, n, u]

(5)enu转地心地固坐标

    def enu2ecef(self, point):# 转换为弧度lat_r = math.radians(self.lat)lon_r = math.radians(self.lon)line1 = np.array([-math.sin(lon_r), math.cos(lon_r), 0])line2 = np.array([-math.sin(lat_r) * math.cos(lon_r),-math.sin(lat_r) * math.sin(lon_r),math.cos(lat_r)])line3 = np.array([math.cos(lat_r) * math.cos(lon_r),math.cos(lat_r) * math.sin(lon_r),math.sin(lat_r)])trans = np.vstack((line1, line2, line3))[B, L, H] = np.matmul(trans.T, point)return [B, L, H]

(6)enu转imu坐标

    # enu空间中的点在惯导坐标系下的坐标,俯仰角绕东轴(x)旋转,横滚角绕北轴(y)旋转,# 航向角绕天轴(z)旋转,这里可以认为简化,只考虑偏航角的情况下# def enu2imu(self, imu_enu, pitch, roll, yaw):def enu2imu(self, imu_enu, yaw, points_enu):Rz = np.array([[math.cos(yaw), -math.sin(yaw), 0],[math.sin(yaw), math.cos(yaw), 0],[0, 0, 1]])T = np.array(-imu_enu)trans = np.hstack((Rz, T))imu_xyz = np.matmul(trans, points_enu)return imu_xyz

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

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

相关文章

macOS 创建Flutter项目

参考在 macOS 上安装和配置 Flutter 开发环境 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 这个文档,配置好flutter的环境 编辑器可以选择vscode或者IDEA。 我这里以IDEA为例 打开 IDE 并选中 New Flutter Project。 选择 Flutter,验证 F…

嵌入式Linux系统的闪存设备和文件系统学习纪要

嵌入式Linux系统的闪存设备和文件系统学习纪要 Linux下的文件系统结构如下: NAND Flash 是一种非易失性存储器(Non-Volatile Memory),常用于闪存设备和固态硬盘(SSD)中。以下是几种常见的 NAND Flash 种类&…

中期科技:智慧公厕打造智能化城市设施,提升公共厕所管理与服务体验

智慧公厕是利用先进的技术和创新的解决方案来改进公厕的设施和管理。借助物联网、互联网、5G/4G通信、人工智能、大数据、云计算等新兴技术的集成,智慧公厕具备了一系列令人惊叹的应用功能。从监测公厕内部人体活动状态、人体存在状态,到空气质量情况、环…

【k8s】pod集群调度

调度约束 Kubernetes 是通过 List-Watch **** 的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件,向 APIServer 发送命令,在 Node 节点上面建立 Pod 和 Container。…

注册中心ZK、nameServer、eureka、Nacos介绍与对比

前言 注册中心的由来 微服务架构是存在着很多跨服务调用,每个服务都存在着多个节点,如果有多个提供者和消费者,当提供者增加/减少或者消费者增加/减少,双方都需要感知发现。所以诞生了注册中心这个中间件。 市面上有很多注册中心,如 Zookeeper、NameServer、Eureka、Na…

log4j 日志的简单使用

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 前言 System.out.println("这是我的测…

2023年云栖大会来啦!!(2022年就已经深受震撼)

2023云栖大会已经开始啦,让我们来回顾回顾去年的云栖大会吧。 云栖大会是中国阿里巴巴集团每年举办的一项技术盛会,前身可追溯到2009年的地方网站峰会,2011年演变为阿里云开发者大会,2015年正式更名为“云栖大会”,并且…

暴涨3倍!通过受感染 USB 窃密的事件愈发变多

2023 年上半年,Mandiant 观察到使用受感染 USB 驱动器窃取机密数据的事件至少增加了3倍。此前,Mandiant 披露了在菲律宾的一次攻击行动。本文将会介绍研究人员发现的两外两次基于 USB 驱动器的网络间谍行动。 CSDN大礼包:《黑客&网络安全…

【Verilog】7.2.1 Verilog 并行 FIR 滤波器设计

FIR(Finite Impulse Response)滤波器是一种有限长单位冲激响应滤波器,又称为非递归型滤波器。 FIR 滤波器具有严格的线性相频特性,同时其单位响应是有限长的,因而是稳定的系统,在数字通信、图像处理等领域…

nginx 转发数据流文件

1.问题描述 后端服务,从数据库中查询日志,并生成表格文件返回静态文件。当数据量几兆时,返回正常,但是超过几十兆,几百兆,就会超过网关的连接超时时间30秒。 时序图 这里面主要花费时间的地方在&#xff…

从零开始的目标检测和关键点检测(二):训练一个Glue的RTMDet模型

从零开始的目标检测和关键点检测(二):训练一个Glue的RTMDet模型 一、config文件解读二、开始训练三、数据集分析四、ncnn部署 从零开始的目标检测和关键点检测(一):用labelme标注数据集 从零开始的目标检测…

领先实践|IDEO 最佳设计思维和策略框架

设计思维是一种以人为本的创新方法,它从人类的角度出发,考虑技术上可行和经济上可行的内容。框架可以成为实现设计思维、策略和系统设计的有用工具。本文由此展开阐述 IDEO 的最佳设计思维和策略框架。 01. 设计思维框架 1.1 设计思维过程 设计思维?是…

python3 阿里云api进行巡检发送邮件

python3 脚本爬取阿里云进行巡检 不确定pip能不能安装上,使用时候可以百度一下,脚本是可以使用的,没有问题的 太长时间了,pip安装依赖忘记那些了,使用科大星火询问了下,给了下面的,看看能不能使…

X64(64位)汇编指令与机器码转换原理

X64(64位)汇编指令与机器码转换原理 1 64位寻址形式下的ModR/M字节1.1 寻址方式1.2 寄存器编号 2 汇编指令转机器码2.1 mov rcx, 1122334455667788h2.2 mov rcx,[r8]与mov [r8],rcx2.3 mov rcx,[r8r9*2] 本文属于《 X86指令基础系列教程》之一&#xff…

9.MySQL索引的操作

个人主页:Lei宝啊 愿所有美好如期而遇 目录 索引操作 查询索引 创建主键索引 唯一索引的创建 普通索引的创建 全文索引的创建 删除索引 索引创建原则 索引操作 查询索引 第一种方法: show keys from 表名\G 我们了解其中几个就好。 第二种方法…

双目视觉检测 KX02-SY1000型测宽仪 有效修正和消除距离变化对测量的影响

双目视觉检测的基本原理 利用相机测量宽度时,由于单个相机在成像时存在“近大远小”的现象,并且单靠摄入的图像无法知道被测物的距离,所以由被测物的跳动导致的被测物到工业相机之间距离变化,使测量精度难以提高。 因此测宽仪需…

项目综合实训,vrrp+bfd,以及策略路由的应用

目录 一. 项目需求 二. Visio设备画图 三. 设备选型 三.vlan规划 四.Ip地址规划 五.实验拓扑图 六.配置过程及结果 项目需求 1.S1作为VLAN10的主网关和根桥,S2作为v…

【C语法学习】5 - fputc()函数

文章目录 1 函数原型2 参数3 返回值4 示例4.1 示例14.2 示例24.3 示例3 1 函数原型 fputc():将一个字符发送至指定流stream,函数原型如下: int fputc(int c, FILE *stream);2 参数 fputc()函数有两个参数c和stream: 参数c是待…

Servlet

Servlet是运行在服务端的小型Java程序,是sun公司提供一套规范,用来处理客户端请求,响应给浏览器的动态资源。但servlet的实质就是Java代码,通过Java的API动态的向客户端输出内容(HTML) 一、使用servlet2.5实…

量化交易Copula建模应对市场低迷

一、简介 传统上,我们依靠相关矩阵来理解资产间的动态。然而,正如过去的市场崩盘所表明的那样,当风暴袭来时,许多模型都会陷入混乱。突然之间,相关性似乎趋于一致,而多样化这一经常被吹捧的风险管理口号似乎并没有提供什么庇护。 这种出乎意料的同步,即资产在经济低迷时…