【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).T

        return [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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

京东数据分析:2023年9月京东洗地机行业品牌销售排行榜

鲸参谋监测的京东平台9月份洗地机市场销售数据已出炉! 9月份,洗地机市场的销售额增长。根据鲸参谋电商数据分析平台的相关数据显示,9月京东平台上洗地机的销量为9.2万,销售额将近2.2亿,同比增长约9%。从价格上看&#…

爬虫 | 【实践】百度搜索链接爬取,生成标题词云 | 以“AI换脸”为例

目录 📚链接爬取 🐇流程梳理 🐇代码实现 🐇结果 📚词云生成 🐇代码实现 🐇结果 📚链接爬取 🐇流程梳理 总体流程是:构建搜索链接 -> 发送HTTP请求…

大坝水库安全监测终端MCU,智能化管理的新篇章!

我国目前拥有超过9.8万座水库大坝,其中超过95%为土石坝,这些大坝主要是在上世纪80年代以前建造的。这些水库大坝在保障防洪、发电、供水、灌溉等方面发挥了巨大的作用,但是同时也存在一定的安全风险,比如坝体结构破损、坝基渗漏、…

当你在浏览器地址栏输入一个URL后,将会发生的事情?个人笔记

客户端 在浏览器输入 URL 回车之后发生了什么(超详细版) - 知乎 (zhihu.com) 大致流程是: URL 解析DNS 查询TCP 连接处理请求接受响应渲染页面 1.URL解析 地址解析: 首先判断你输入是否是一个合法的URL还是一个待搜索的关键…

【C++】set和multiset

文章目录 关联式容器键值对一、set介绍二、set的使用multiset 关联式容器 STL中的部分容器,比如:vector、list、deque、forward_list(C11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元…

从内存管理的角度来看,Python语言的变量和参数传递情况解析

从内存管理的角度来看,Python语言的变量和参数传递情况解析 概述 从内存管理的角度来看,Python中的变量和参数传递有一些特点: ☆ 变量是对象的引用:在Python中,变量实际上是对象的引用,而不是对象本身。…

vi vim 末尾编辑按GA 在最后一行下方新增一行编辑按Go

vim 快速跳到文件末尾 在最后一行下方新增一行 移到末尾,并且进入文本录入模式 GA (大写G大写A) 在一般模式(刚进入的模式,esc模式) GA 或 Shift ga 先 G 或 shiftg 到最后一行 然后 A 或 shifta 到本行末尾 并且进入文本录入模式 在最后一行下方新增一行 (光标换行,文字不…

【Linux】Nginx安装使用负载均衡及动静分离(前后端项目部署),前端项目打包

一、Nginx导言 1、引言 Nginx 是一款高性能的 Web 服务器和反向代理服务器,也可以充当负载均衡器、HTTP 缓存和安全防护设备。它的特点是内存占用小、稳定性高、并发性强、易于扩展,因此在互联网领域得到了广泛的使用。 总结出以下三点: 负载均衡&#x…

lvsDR模式

LVS-DR模式 是最常用的LVS负载方式 直接路由模式 Lvs调度器 只负责请求和转发 转发到真实服务器 但是响应结果 由后端服务器直接转发给客户端 不需要经过调度器处理 可以减轻Lvs调度器的负担 提高系统性能和稳定性 工作原理: 客户端发送请求到vipLVS调度器接受请求…

miniconda快速安装

目录 一、Linux下miniconda安装 1.1、安装 1.2、miniconda初始化 二、Windows下miniconda安装 三、maOS下miniconda安装 3.1、安装 3.2、miniconda初始化 四、参考: 本文给出windows、macos、linux下快速安装miniconda方法。 对比conda,minicond…

光学仿真|优化汽车内部照明体验

当我们谈论优化人类感知的内部照明时,我们实际上指的是两个重点领域:安全性和驾驶员体验。如果内部照明可以提供尽可能最佳的体验,驾驶员则能够更好地应对颇具挑战性或意外的驾驶状况,并且减轻疲劳感。除了功能优势外,…

【Servlet】 一

本文主要介绍了如何在tomcat部署一个webapp 以及 如何借助maven用servlet编写一个hello world . 一.Tomcat Tomcat是一个Java里广泛使用的http服务器 HTTP服务器有很多实现,其中最知名的是Nginx;而在Java里,最知名的是Tomcat 一个Tomcat服务…

【K8S】二进制安装

常见的K8S安装部署方式 ●Minikube Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用。 部署地址:https://kubernetes.io/docs/setup/minikube ●Kubeadm☆ Kubeadm也是一个工具,提…

LInux之在同一Tomcat下使用不同的端口号访问不同的项目

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《LInux实战开发》。🎯🎯 …

Vue入门——核心知识点

简介 Vue是一套用于构建用户界面的渐进式JS框架。 构建用户界面:就是将后端返回来的数据以不同的形式(例如:列表、按钮等)显示在界面上。渐进式:就是可以按需加载各种库。简单的应用只需要一个核心库即可,复杂的应用可以按照需求…

transformers-AutoClass

https://huggingface.co/docs/transformers/main/en/autoclass_tutorialhttps://huggingface.co/docs/transformers/main/en/autoclass_tutorialAutoClass可以自动推断和加载给定checkpoint的正确架构。 对于文本,使用Tokenizer将文本转换为token序列,创…

IDEA中application.properties文件中文乱码

现象: 原因: 项目编码格式与IDEA编码格式不一致导致的 解决办法: 在File->Settings->Editor->File Encodings选项中,将Global Encoding,Project Encoding,Default encoding for properties files这三个选项置为一致&a…

通过netstat命令查看Linux的端口占用

一、netstat 完整写作network statistics,简写为netstat ,常用的几个参数为l、n、t、u、p。 -l : 仅展示监听状态下的程序(state 为LISTEN)。 -n :会使用ip端口的方式,来进行地址的描述。不使用-n就会变成服务器的名称…

毕业设计基于SpringBoot+Vue智慧云办公系统源码+数据库+项目文档

智慧云办公管理系统 一、系统简介 智慧云办公系统是一个采用SpringBootVue技术开发的前后端分离的项目,云办公系统通过软件的方式,方便快捷处理中小型企业的公司日常事务,能够提高整体的管理运营水平,使得办公更加高效方便&…

随想录一刷·数组part1

你好&#xff0c;我是安然无虞。 文章目录 1. 二分查找题型2. 移除元素题型 1. 二分查找题型 二分查找传送门 class Solution { public:int search(vector<int>& nums, int target) {// 在有序数组中查找第一时间想到二分查找int left 0, right nums.size() - 1…