坐标转换(三)—— ENU坐标系与机体坐标系之间的转换

2024-03-01 23:50

本文主要是介绍坐标转换(三)—— ENU坐标系与机体坐标系之间的转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天我们要讲的是应用于卫星通信领域、雷达目标跟踪领域、无源目标定位领域的一个坐标转换过程——机体坐标系与ENU坐标系的转换。小D将以《机载卫星通信天线角度的计算推导》为基础,来分析和推导坐标转换公式。

开头部分,我们先讲一下ENU坐标系和机体坐标系的定义。

1、ENU坐标系(导航坐标系)

ENU坐标系中的E表示East,N表示North,U表示Up,翻译过来就是东北天坐标系,小D第一次看到东北天这个名字时,还以为这个坐标系跟咱们祖国大东北有啥关系,后来发现没有关系。

所以,为了不让别人产生误解,小D就叫的北天东,其他文献中也有叫北东天的。另外还有一个坐标系是END,D表示Down。

ENU坐标系是以某个点为原点,三个轴表示出正东方向,正北方向和指向天上的方向,其中的“指向天上”是指垂直于水平面或海平面向上。

在大多数的文献中,ENU坐标系Z轴一般表示指向天,如果X轴指向正东方向,Y轴指向正北方向,那么这个坐标系就是ENU右手坐标系;如果Z轴指向天,X轴指向正北,Y轴指向正东,那么这个ENU坐标系就是左手坐标系。

我们今天参考的文献《机载卫星通信天线角度的计算推导》中的NEU坐标系是一个左手坐标系,并且ENU坐标系在这篇文献中也被称为导航坐标系,记作n系。ENU左手坐标系示意图如下图所示:

图1 ENU左手坐标系(导航坐标系n系)

2、机体坐标系(载体坐标系)

机体坐标系也叫载体坐标系,记作b系。机体坐标系也有很多种定义方式,有的地方定义的是左手坐标系,有的地方是右手坐标系;有的机体Z轴垂直于水平面向上,有的垂直于水平面向下。

我们今天讲的机体坐标系是这样定义的:X轴正方向指向飞机前进的方向,与机身纵轴重合,Y轴指向机身右翼,Z轴垂直于机身平面向上,构成左手坐标系。

航向角、俯仰角、横滚角

机体坐标系中有个重要的概念,就是机体姿态角,姿态角包含三个角度:航向角(yaw),俯仰角(pitch),横滚角(roll),这三个角的定义如下:

航向角α机头方向在水平面的投影与正北之间的夹角,北偏东为正,范围为0-360°;也可定义右偏为正,左偏为负,范围为-180-180°。

俯仰角β:机头方向与水平面的夹角,抬头为正,范围为-90-90°。

横滚角γ:机体绕机体纵轴旋转过的角度,右滚为正,范围为-180-180°。

其实上面各个角度都是人为定义的,你也可以有不同的定义方式,重要的是在解算角度的时候,实际的偏离角度要和定义的角度一致。

机体坐标系的航向角、俯仰角和横滚角示意图如下所示:

图2 飞机航向角、俯仰角和横滚角图解

上面的图是小D用visio画的,应该可以很好地说明航向角、俯仰角和横滚角。 

3、ENU左手坐标系转换到机体左手坐标系

ENU左手坐标系(导航坐标系)转到机体左手坐标系(载体坐标系)是一个有点抽象的过程,小D第一次看这个转换过程的时候,觉得头都大了,想了好久才想明白是怎么旋转的。为了讲清楚转换原理,小D根据《机载卫星通信天线角度的计算推导》里的图,重新画了一个三维图,希望可以让大家更好地理解这个过程。

下图中,α是飞机的航向角,β是俯仰角,γ是横滚角,大家可以结合小D参考的这篇文献中的解释来看这几个角,小D把截图放在文末了。

紫色的XnYnZn坐标系代表NEU坐标系,灰色的XbYbZb坐标系代表机体坐标系,虚线坐标系是中间过程坐标系。为了不让示意图看起来很复杂,文献以及小D都把ENU坐标系XnYnZn的原点放到了机尾位置,它本来应该是和机体坐标系XbYbZb共用一个原点的。

图3 ENU坐标系转换到机体坐标系的过程示意图

现在我们来看看ENU坐标系XnYnZn转换到机体坐标系XbYbZb的整个旋转过程,一共有三个旋转变换:

①XnYnZn坐标系先绕Zn轴顺时针旋转α角,形成X´nY´nZ´n坐标系;

②X´nY´nZ´n坐标系绕Y´n轴逆时针旋转β角,形成X´´nY´´nZ´´n坐标系;

③X´´nY´´nZ´´n坐标系绕X´´n轴逆时针旋转γ角,与机体坐标系XbYbZb重合。

图中没有画出第③个过程,大家可以自己想像一下,或者用模型比划一下,模型小D是用便签纸和胶棒粘的一个三维的空间XYZ坐标系,用来理解空间中的变换过程,大家也可以像小D一样做一个模型。

图片

图4 自制模型

由于上面的过程是左手坐标系的旋转过程,所以顺时针旋转时,计算带入的角度是正的,逆时针旋转计算带入的角度是负的,根据小D上次发的公众号文章中的左手坐标系的旋转矩阵,我们可以计算ENU坐标系XnYnZn转换到机体坐标系XbYbZb的旋转矩阵:

图片

这就是最终的旋转矩阵了。

4、机体左手坐标系转换到ENU左手坐标系

机体坐标系转到ENU坐标系的过程是一个逆过程:

XbYbZb坐标系先绕Xb轴顺时针旋转γ角,形成X´bY´bZ´b坐标系;

②X´bY´bZ´b坐标系绕Y´b轴顺时针旋转β角,形成X´´bY´´bZ´´b坐标系;

X´´bY´´bZ´´b坐标系绕Z´´b轴逆时针旋转α角,与ENU坐标系XnYnZn重合。

所以,机体左手坐标系转换到ENU左手坐标系旋转矩阵为:

图片

5、文献中的公式推导

《机载卫星通信天线角度的计算推导》中的转换过程示意图如下图所示,其中U轴是水平面正上方,小D绘制的跟文献中的图有一些不同的地方,就是Zb轴小D觉得应该画在U轴的右边。

图片

图5 文献中的旋转过程示意图

除此之外,小D觉得文献中给出的绕X,Y,Z轴逆时针旋转的旋转矩阵是有点问题的,正确的旋转矩阵小D在上篇公众号文章中给出了,大家可以对比一下,如果你觉得小D的观点有问题,也可以告诉小D。

图片

图片

文献中关于ENU坐标系(导航坐标系)与机体坐标系(载体坐标系)的推导过程是这样的:

图片

图片

需要注意的是,上面的“逆时针旋转2π-α”与“顺时针旋转α”是等效的。该篇文献的作者讲解的旋转过程是导航坐标系转到载体坐标系的过程,但是计算的旋转矩阵是载体坐标系转到导航坐标系的公式。

还有一点就是,作者可能是笔误,三个矩阵相乘的结果也有一点问题,小D用matlab计算了一下作者给出的三个矩阵相乘的公式,计算过程如下:

图片

图6 旋转矩阵相乘的验证代码

图片

图7 代码计算结果 

代码计算结果如上图所示,和作者计算的不一样,字体有点小,大家可以自己在matlab里验证旋转矩阵计算结果。

虽然文献有一些小问题,但是文献中的示意图画得很形象,小D就是通过这篇文献理解了整个旋转过程。

如果大家觉得小D讲的坐标转换有问题,欢迎在评论区讨论。

参考文献

[1] 李川.《机载卫星通信天线角度的计算推导》. 天津市电子工业协会2022年年会.

[2] 党亚民.《大地坐标系及其应用》, 测绘出版社, 2010年10月1日第1版.

[3] 黄珹、刘林. 《参考坐标系及航天应用》, 电子工业出版社, 2015年5月1日.

6、期刊论文及书籍PDF下载链接

①《机载卫星通信天线角度的计算推导》:

https://pan.baidu.com/s/1dD94KeA8OFCJwxOcp3ozRA?pwd=nvl9 
提取码:nvl9 

②《大地坐标系及其应用》:

链接:https://pan.baidu.com/s/1Min-PZcR6_hl2uyQq7HTdQ?pwd=8r3h

提取码:8r3h

③《参考坐标系及航天应用》:

链接:https://pan.baidu.com/s/1ocTwQptGg0UY1qsBwfHpwg?pwd=ozmb 
提取码:ozmb 

这篇关于坐标转换(三)—— ENU坐标系与机体坐标系之间的转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/764243

相关文章

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

O(n)时间内对[0..n^-1]之间的n个数排序

题目 如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序 思路 把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序 代码 #include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A,

16 子组件和父组件之间传值

划重点 子组件 / 父组件 定义组件中:props 的使用组件中:data 的使用(有 return 返回值) ; 区别:Vue中的data (没有返回值);组件方法中 emit 的使用:emit:英文原意是:触发、发射 的意思components :直接在Vue的方法中声明和绑定要使用的组件 小炒肉:温馨可口 <!DOCTYPE html><html lang="en"><head><

SW - 引入第三方dwg图纸后,修改坐标原点

文章目录 SW - 引入第三方dwg图纸后,修改坐标原点概述笔记设置图纸新原点END SW - 引入第三方dwg图纸后,修改坐标原点 概述 在solidworks中引入第三方的dwg格式图纸后,坐标原点大概率都不合适。 全图自动缩放后,引入的图纸离默认的原点位置差很多。 需要自己重新设置原点位置,才能自动缩放后,在工作区中间显示引入的图纸。 笔记 将dwg图纸拖到SW中

数据流与Bitmap之间相互转换

把获得的数据流转换成一副图片(Bitmap) 其原理就是把获得倒的数据流序列化到内存中,然后经过加工,在把数据从内存中反序列化出来就行了。 难点就是在如何实现加工。因为Bitmap有一个专有的格式,我们常称这个格式为数据头。加工的过程就是要把这个数据头与我们之前获得的数据流合并起来。(也就是要把这个头加入到我们之前获得的数据流的前面)      那么这个头是

【编程底层原理】方法区、永久代和元空间之间的关系

Java虚拟机(JVM)中的内存布局经历了几个版本的变更,其中方法区、永久代和元空间是这些变更中的关键概念。以下是它们之间的关系: 一、方法区: 1、方法区是JVM规范中定义的一个概念,它用于存储类信息、常量、静态变量、即时编译器编译后的代码等数据。 3、它是JVM运行时数据区的一部分,与堆内存一样,是所有线程共享的内存区域。 二、永久代(PermGen): 1、在Java SE 7之前,