组合导航、卫星定位与RTK、石英表计时

2024-09-04 12:36

本文主要是介绍组合导航、卫星定位与RTK、石英表计时,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导航是现代生活必不可少的基础设施,大到俄乌冲突导弹互相暴揍,小到出门游玩,都离不开导航功能。我们常说导航,但是导航这一功能的核心是定位。沿着定位这条线我们开始本篇文章的内容。

卫星定位的原理

全球卫星定位系统的英文是Global Navigation Satellite System(GNSS),GNSS主要由空间卫星、地面监控系统、用户接收机三部分组成。空间卫星按照一定的频率昼夜不停的通过高频载波信号广播自己的位置和发送时间戳。用户接收机收到卫星高频载波信号后,通过光速乘以载波传播的时间,便可以计算出与卫星的距离,用公式表达如下。

式中,(x1, y1, z1)为卫星坐标,已知量;(x, y, z)为接收机位置,未知量;c为光速,已知量;△t为卫星载波到达接收机所经历的时间,已知量。卫星和接收机使用各自的时钟计时,卫星上使用精度极高的原子钟,可以认为是无误差的时钟源。而接收机上一般为普通的石英钟,存在较大的且不可忽略的时钟误差 tl,因此在计算时需要其影响,未知量。

从以上公式可知,存在四个未知量,需要四个方程式才可以求解。因此还需要接收到另外卫星载波信号,才可计算出接收机的位置。这也是为什么,GNSS需要在可以接收到四颗及以上数量卫星信号的地方才能正常工作。

但由于内部和外部误差的存在,包括卫星高频载波穿透电离层和对流层产生的误差、卫星高速移动产生的多普勒效应引起的误差、轨道误差,卫星钟差、星历误差等,单纯GNSS的定位精度只能达到米级,无法满足自动驾驶对厘米级的定位需求。在这里插入图片描述
星历是描述卫星运行轨道的一组参数,卫星轨道是一个椭圆,通过几个参数和时间,可以唯一确定卫星的准确位置。

星历的获取有两种方式,一种是卫星直接播发,这种方式的好处是定位过程不依赖卫星信号以外的任何输入,即使没有网络也可以定位成功,但问题是卫星链路带宽很小,要下载完整星历,需要30秒左右的时间,早期的手机和一些车载设备定位过程很慢,就是由于这个原因。
另一种方式是通过互联网播发,这种方式叫A-GNSS,具体的传输协议叫SUPL(Secure User Plane Location),这种数据一般不对应用层透出,在手机上,操作系统会在底层定时请求SUPL数据,然后将获得的星历注入GNSS芯片。有了A-GNSS,设备就可以在秒级获得定位,不需要任何等待过程,目前所有的手机都支持这种方式。A-GNSS的服务提供商,主要是通信运营商,以及一些定位服务商,比如谷歌、千寻等。

卫星不间断的向地面广播信号,这个信号主要包括以下信息:
卫星编号。用于从星历中查找卫星轨道,再结合时间戳获得当前卫星位置
当前时间戳。用于获得卫星位置,另一方面计算伪距。伪距是(本地时间-信号发射时间)*光速,之所以叫伪距,是因为本地时间与卫星时间不同步,所以这个距离并不是真正的设备-卫星距离。
星历数据。用于计算卫星位置。

卫星定位接收机

用于接收卫星信号。由于卫星信号微弱,天线当然是越大越好,但是由于接收机需要移动,天线尺寸受到制约。天线的主要作用是放大信号和抑制多径,主要的类型有以下几种:
在这里插入图片描述
左边的是比较常见的天线,内部是陶瓷天线,外部带磁铁,可以吸附在车顶;中间的是专业天线,旁边带扼流圈,可以抑制来自四周和地面反射的信号,只接收从天顶方向来的信号,这种天线的效果最好,一般用于专业研究和高精测绘;右侧是手机天线,长度只有几厘米,效果最差。
卫星信号的电磁波是圆极化的(传播时在垂直于传播方向的一个平面上波动),因此,采用圆极化天线(如平面的陶瓷天线)接收效果最好。但手机上天线尺寸太小,只能采用线极化天线,信号捕获能力大幅下降,再加上缺乏信号屏蔽(扼流圈),极易受到多径效应以及其他信号干扰。

接收机获得数据之后,会进行三个步骤的解算操作。

射频前端模块:主要是将原始信号进行下变频、功率放大以及滤波,提取真正有用的信号,便于解码处理。

基带处理模块:对卫星信号进行解码,获得卫星报文。每颗卫星的信号需要一个单独的通道进行处理,如果有100颗卫星,2个频段,那可能需要200个通道才能有效处理这些信息。通道数越多,可以获得的卫星观测值也就越丰富,定位精度也就越高。解码的过程,分为搜索-锁定-分析三步,首先生成每颗卫星的伪码,然后与信号进行自相关操作,相关度达到一定程度就可以锁定卫星,然后进行码锁定、位同步、帧同步,最终提取出报文。这个过程要持续进行,因为多普勒效应,信号的频率会不断变化,所以本地生成的伪码也要不断变换频率去适配卫星的变化。一旦失去锁定,就会丢失信号,也就无法定位了。

PVT解算模块:PVT包括Position,Velocity和Time。这一步是真正进行定位的步骤,是利用基带解码获得的报文,提取出时间戳、星历等信息,代入公式进行计算,然后将计算结果输出给应用程序。

卫星定位误差来源与精度提升

卫星定位虽然已经很准确了,但是在某些场景下,还是无法满足需求,比如,打车的时候定位点离车辆有一定距离、步导的时候难以区分方向甚至会定位到马路对面、静止的时候定位点总数飘来飘去、室内的时候定位点乱飘。这需要从卫星信号的发射、传输、接收过程来解释。

卫星信号从发射到被设备接收,需要经过大气层,其中,大气电离层有数千公里厚,这部分大气非常稀薄,但是存在大量被电离的电子,这部分电子会让电磁波变慢一点,从而产生延迟。在对流层,也会产生一定的延迟。在地表附近,由于各种建筑、山体、水面的影响,卫星信号可能被反射或折射(多径效应),产生延迟。
在卫星信号发射侧和接收侧,也有很多系统相关的误差,比如时钟偏差、处理延迟等,这些延迟加上传输延迟,使得卫星信号的传输时间,并不是准确的等于物理距离/光速,另一方面,卫星的星历也有误差,卫星位置和真实位置存在偏差,最终造成了定位结果产生偏差。

要提升定位精度,需要想办法消除这些误差,主要有以下几种方案。
双频GNSS
不同频率的电磁波通过电离层时会有不同的延迟,人们发现,对两个或多个频率的观测值进行线性组合,可以消除电离层误差,从而能提升精度。这就是双频GNSS定位的原理。小米8是业界第一款支持双频GNSS定位的手机,后续各大厂商均进行了跟进,一些高端手机均采用双频定位。消除电离层误差后,定位精度可以提升到5米以内。
地基/星基增强
星历误差、卫星时钟误差、甚至是电离层和对流层误差都是可以观测或建模的,一旦计算出了实时的误差值,就可以通过一个单独的通道进行播发,接收设备在定位过程中使用这些修正项,就可以提升定位精度。播发的通道一般有两种,一种是直接通过卫星播发,称为SBAS(Satellite-Based Augmentation System),好处是覆盖广,但设备需要增加额外的信号接收通道;另一种是地基增强,比如通过互联网,这需要设备具备联网能力。
这些增强方式对于精度提升是有限的,还是有很多误差项无法消除,比如电离层误差。
高精定位-差分定位(RTK)
RTK是Real - time kinematic的缩写,是一种差分定位。其原理是利用一个参考站提供基准观测值,然后用设备的观测值与基准站的观测值进行差分,差分后可以消掉星历误差、卫星钟差、电离层误差,再进行星间差分后可以进一步消除掉设备的钟差,最终可以算出设备相对基准站的相对坐标,如果基准站位置已知,就可以完成准确的绝对坐标,精度可以达到厘米级甚至毫米级。
RTK能提升精度的另一个原因是引入了载波相位观测,相比伪距观测值,载波相位观测值的误差更小。
使用RTK,需要在附近20km内有参考站(距离太远,电离层误差不一样,做差分无法完全消除误差),同时需要持续不断的获得参考站的观测数据(一般通过互联网传输,使用RTCM协议),因此相对普通的定位,RTK定位成本较高,但对于一些对精度要求很高的场景,比如车道级定位、自动驾驶等,是必不可少的。
RTK服务一般由专业服务商提供,如千寻、六分,这些服务商在全国范围内部署了数千个基准站,持续对订阅用户播发数据。
高精定位-精密单点定位(PPP)
RTK需要布设密集的参考站,有没有办法不依赖参考站?PPP(precise point positioning)就是一种方法,它的原理是对每一种误差进行准确建模,最终求解出卫星和设备之间的准确距离。为了确定准确的误差,PPP定位时需要不断的迭代内部参数,而且,一些卫星的误差只有当卫星位置变化后才能体现出来,所以PPP需要比较长的收敛时间,一般需要30分钟才能收敛到理想的精度,如何更快的收敛是目前学术界的一个研究热点。
组合定位
卫星定位的一个最大问题,就是丢失卫星信号后如何定位,这就需要其他定位方式来补充。组合定位是利用卫星信号和其他定位技术,比如惯性导航,来完成定位,二者相互配合。最简单的一个例子,就是卫星定位是有一个最高频率的,一般最多是10Hz,在两次定位之间,可用惯导来进行位置推算,获得更高频率的位置输出。而组合导航最重要的作用,是提升精度,比如,利用卡尔曼滤波方法,用惯导计算推算位置,用卫星定位提供观测量,对推算位置进行修正,这可以让定位结果更加平滑,而且可以对异常的卫星观测量进行过滤或降权。

手机上的卫星定位

在移动互联网出现以前,卫星定位终端是一个很专业的领域,只有测绘、军事等领域会应用这种技术,定位需要使用专用的接收机,比如Trimble、ublox等。随着智能手机将卫星定位芯片集成,卫星定位的应用得到爆发式增长,终端数量一下子提升到几十亿量级,也产生了海量的位置数据。
手机上的卫星定位与专业接收机,还是存在比较大的差异,主要体现在:

手机受限于尺寸,天线比较小,对原始信号的捕获、锁定、去噪能力都比较差,造成接收到的信号质量天然不如专业接收机。
手机上芯片成本比较低,支持的通道数比较有限,一次定位能够解码的卫星数量和系统数量都比较少,主要是单频,少数是双频,没有三频。
手机上对功耗、性能开销的要求比较高,不能花费大量资源在定位上,解算算法的复杂度比较低,效果也比较有限,精度比较差。

RTK和INS的知识细节

RTK:实时动态差分(Real-Time Kinematic,RTK)技术便是地基增强系统的关键技术,一种具有实时处理两个测量站载波相位观测量的差分方法。RTK系统组成和通信链路示意图如下所示。

在这里插入图片描述
RTK系统组成及通信链路示意图
通过在地面建设参考基准站,并进行测绘,我们能够获知这个参考基准站的准确位置数据,并将这个位置数据写入参考基准站控制器内部。参考基准站内部接收机同时接收卫星载波信号来获取观测数据(伪距观测值,相位观测值),并将测绘数据和观测数据打包作为作为差分数据,通过无线通信网络广播给覆盖范围内的接收机。
接收机收到参考基准站差分数据后,结合自身观测数据,调用RTK结算算法,修正观测数据误差,从而获得厘米级的定位。对于一个参考基准站来讲,与其半径几十公里覆盖范围内的接收机产生的误差认为是相同的,因此RTK的网络建设也是一个超级基建工程。
但融合了RTK技术的GNSS还是存在如下缺点:
(1)在完全遮蔽或严重遮蔽的场景(比如隧道、高层密集建筑、浓密树荫等),由于无法接收到卫星信号或可接收卫星信号数量较少,无法输出准确的定位数据;
(2)在无线通信网络无法覆盖或通信链路断连时,无法获得参考基准站的差分数据,导致无法输出准确的定位数据;
(3)在不增加额外硬件条件下,无法输出载体的姿态(航向、俯仰、横滚角)数据;
(4)在多金属的工作场景,由于严重的多径影响,会导致定位数据的假固定;
(5)定位数据输出频率较低(通常为10Hz左右),短期精度较低。
从以上缺点可以看出,GNSS+RTK在大部分场景下表现优秀,是全局定位当之无愧的主心骨。但在部分恶劣场景下存在短期的定位不准情况,因此自然而然的想增加一位成员,来弥补这方面的不足,INS便是在这样的背景下被引入。

INS:惯性导航系统(Inertial Navigation System,INS)是一种彻底自主的导航系统,它不需要从外部接收信号,只靠内部的硬件,并在在牛顿三大定律的“魔法”下,输出定位和姿态数据。
惯导测量单元(Inertial Measurement Unit,IMU)是INS系统里的主流硬件,主流产品中一般集成了一个三轴加速度计和陀螺仪,俗称六轴IMU。加速度计可以测量物体在其坐标系下的三轴加速度,陀螺仪可以测量物体在其坐标系下的三轴角速度,通过对加速度和角速度数据进行积分运算,可以解算出载体一个相对的定位和姿态数据。
与GNSS一样,IMU也是起源于军工。长期以来,受限于高昂的成本,一直仅为国防和航天所用。随着价格更加亲民的微机电系统(Micro-Electro-Mechanical System,MEMS)加速度计和陀螺仪出现,普通民众才开始享受IMU的红利。手机屏幕的自动旋转功能、智能手环的计步功能、虚拟现实头盔、无人机,无不是IMU发光发热的地方。
IMU可以输出高频(200HZ左右)定位和姿态数据,具有优秀的短期定位精度,但是单独使用INS同样存在以下缺点:
(1)由于解算模块存在积分计算,因此存在累积误差,随着时间的延长,误差会越来越大。
(2)高频振动会降低INS中IMU硬件的可靠性和精度;
(3)高精度的IMU成本(光纤陀螺)依旧很高。
但是这些缺点又是上文GNSS+RTK可以完美解决的,既然GNSS+RTK和INS各有所长,又都是定位界的狠角色,那就将两者组合在一起,共同实现全局高精度定位,这就是高精度组合导航名称的由来。

IMU(惯性测量单元)的轴数

IMU的轴数指的是它测量的运动方向的数量。通常,IMU测量的是三个基本线性运动(加速度)和三个基本角运动(角速度)。因此,IMU的轴数一般为6轴或9轴。

1、3轴IMU即只有3轴陀螺仪的IMU,其因为只有一个3轴陀螺仪,所以只能感知载体roll、pitch、yawl共3个自由度的姿态信息。(六轴姿态及roll、pitch和yaw解释见参考文献4)

2、 6轴IMU在3轴IMU的基础上加装了3轴加速度计,因此在感知载体姿态的基础上,还能感知载体3个自由度上的加速度信息。

三个加速度轴(X、Y、Z):测量物体在三个方向上的线性加速度。
三个角速度轴(X、Y、Z):测量物体绕其三个轴的旋转速率。
3、 9轴IMU在6轴IMu的基础上加装了3轴磁强计,由于3轴陀螺仪只能估计载体自身的相对位姿变化(通过加速度计也可获得载体的绝对roll和pitch),单凭3轴陀螺仪无法获取载体的全部姿态信息,而通过3轴磁强计就可以,本质上磁强计的感知原理类似于指南针。

除了6轴IMU中的六个轴外,还包括三个磁力计轴(X、Y、Z):测量物体在地磁场中的朝向。
通过这种方式,9轴IMU能够提供更全面的运动信息,尤其是在需要确定物体在三维空间中的方向时。

在IMU规格表或产品描述中,通常使用以下术语来表示轴数:

XYZ: 表示三个线性加速度轴的方向(X、Y、Z)。
XYZω: 表示三个角速度轴的方向(X、Y、Z)。
XYZM: 表示三个磁力计轴的方向(X、Y、Z)。
因此,6轴IMU可能以XYZ或XYZω来表示,而9轴IMU可能以XYZM来表示。这些标识有助于用户了解IMU的测量方向和提供的信息。

石英表计时

石英表就是通过石英的振动来计算时间的。
石英是一种很有意思的物质,当我们给石英晶体通电,它就会开始振动,而它振动的过程又可以反过来向外发电。在石英表内负责计时的就是由石英晶体所制作的石英振荡器,而石英振荡器在出厂的时候,其振荡频率会被统一调整为32768赫兹,也就是说在给石英振荡器通上电之后,它每振荡32768次就是一秒钟,非常精确。

卫星导航使用的原子钟,频率更高,因此测量时间的误差更小。原子钟是不是就是通过原子的振动来计算时间的钟表呢?原子的振动在这里的确发挥了重要的作用,但真正用于计时的其实还是石英钟。在给原子钟通电之后,里面的石英震荡器会开始振动,振动会向外发电,而这些产生的电荷会被转化为振荡频率为9192631770赫兹的微波。在原子钟内部有着一个铯原子发射器,所发射出的铯原子有高能级和低能级两种状态,在经过磁场之后,两种状态的铯原子会发生不同方向的偏转,其中低能级铯原子会与石英震荡器所产生的微波相遇。

参考文章:
石英表如何计时?卫星使用的原子钟是何原理?
关于卫星定位,你想知道的一切
什么是惯性传感器(IMU )
箩筐分享|自动驾驶高精度组合定位系统

这篇关于组合导航、卫星定位与RTK、石英表计时的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

js定位navigator.geolocation

一、简介   html5为window.navigator提供了geolocation属性,用于获取基于浏览器的当前用户地理位置。   window.navigator.geolocation提供了3个方法分别是: void getCurrentPosition(onSuccess,onError,options);//获取用户当前位置int watchCurrentPosition(

Go组合

摘要 golang并非完全面向对象的程序语言,为了实现面向对象的继承这一神奇的功能,golang允许struct间使用匿名引入的方式实现对象属性方法的组合 组合使用注意项 使用匿名引入的方式来组合其他struct 默认优先调用外层方法 可以指定匿名struct以调用内层方法 代码 package mainimport ("fmt")type People struct{}type Pe

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位 一、背景二、定位问题三、解决方法 一、背景 flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案在博主上面这篇文章的基础上,在机器内存、cpu资源、flume agent资源都足够的情况下,flume agent又出现了tmp文件无法关闭的情况 二、

组合c(m,n)的计算方法

问题:求解组合数C(n,m),即从n个相同物品中取出m个的方案数,由于结果可能非常大,对结果模10007即可。       共四种方案。ps:注意使用限制。 方案1: 暴力求解,C(n,m)=n*(n-1)*...*(n-m+1)/m!,n<=15 ; int Combination(int n, int m) { const int M = 10007; int

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题,就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream># include<vector>using namespace std;int main(){int n,m;cin>>n>>m;std::vector<i

一次生产环境大量CLOSE_WAIT导致服务无法访问的定位过程

1.症状 生产环境的一个服务突然无法访问,服务的交互过程如下所示: 所有的请求都是通过网关进入,之后分发到后端服务。 现在的情况是用户服务无法访问商旅服务,网关有大量java.net.SocketTimeoutException: Read timed out报错日志,商旅服务也不断有日志打印,大多是回调和定时任务日志,所以故障点在网关和商旅服务,大概率是商旅服务无法访问导致网关超时。 后

INDEX+SMALL+IF+ROW函数组合使用解…

很多人在Excel中用函数公式做查询的时候,都必然会遇到的一个大问题,那就是一对多的查找/查询公式应该怎么写?大多数人都是从VLOOKUP、INDEX+MATCH中入门的,纵然你把全部的多条件查找方法都学会了而且运用娴熟,如VLOOKUP和&、SUMPRODUCT、LOOKUP(1,0/....,但仍然只能对这种一对多的查询望洋兴叹。   这里讲的INDEX+SMALL+IF+ROW的函数组合,

定位cpu占用过高的线程和对应的方法

如何定位cpu占用过高的线程和对应的方法? 主要是通过线程id找到对应的方法。 1 查询某个用户cpu占用最高的进程号 top -u 用户名 2 查询这个进程中占用cpu最高的线程号 top –p 进程号-H    3 查询到进程id后把进程相关的代码打印到jstack文件 jstack -l pid > jstack.txt 4 在jstack文件中通过16进制的线程id搜索到