我们如何收到卫星信号?(导航电文,载波与测距码)

卫星信号

在介绍所有卫星信号之前,首先要明确一些概念:

所有的卫星信号,都是一段电磁波,用户接收的,也是一段电磁波。

但是我们认知中的电磁波,就是一段波,就像我们打出去的交一样,怎么通过这一段波来转换成有用的数据呢?

首先,卫星发射信号的是计算机,接收机也是计算机,卫星发出信号,我们接收信号,接收的都是一段二进制01码,然后把01码进行转换。因为卫星不可能直接发出一串文字,而计算机就算接收到了这串文字,也无法看懂,所以计算机之间的交互很默契地都采用二进制码来交互。

因此,我们接收信号,方法就是将电磁波转换为二进制序列。但是怎么转换?转换方法就多了,我们可以:

  • 电磁波高波峰表示1,低波峰表示0
  • 电磁波正波表示1,负波表示0,曼波out

具体的实现方案,我们就不需要深究,也不是我们需要管的事,我们只用知道:卫星发出和我们接收的信号都是电磁波,最终转换为的形式为二进制序列。

而因为电磁波可以转化成二进制码,我们可以重新用码的特性去定义卫星信号的一些特性:

  1. 码元:二进制序列中每一个二进制数称为一个码元
  2. 码元宽度:每个码元持续时间或其对应的距离成为码元宽度
  3. 码速率:码发生器每秒输出的码元个数

卫星信号分为三种:++载波,测距码与导航电文++。

测距码

测距码是用来测距的一串码序列,最终他的形式也是可以转换成01的。**测距码最大的特性,也就是他定位的原理,便是他采用的是一段伪随机码。**什么是伪随机?

就如同我们在编程语言中涉及到的获得伪随机数与设定种子一样:

伪随机数列是一个数组:

对每一个数组中的元素,都有一个固定的算法:

比如:第一空的算法为

我们在给定种子为x=2的时候,第一个空的数据就是f(2)=14

同理,一直填满所有的空

而当我们想取随机数的时候,就按顺序依次从这个数组里取,

比如我们在玩掷硬币,假设为奇数是正面,偶数是反面

那么第一次掷硬币,我们取第一个元素,14,为反面

第二次掷硬币,我们取第二个元素,g(2)

过了很长时间,我们再掷第三次硬币,只要我们不重新设置种子,还是从上一次的位置开始往下取,即取第三个元素h(2)

也就是说,只要种子确定了,我们就能把这个序列给推算出来。但是,因为随机数组对于不同种子是完全不同的,所以我们可以近似认为他是随机的,也便是可以预测的随机:伪随机。而用这个特性,我们可以得到两个结论:

  1. 知道卫星产生随机序列的种子,我们可以在接收机端产生一段一模一样的序列
  2. 因为序列是随机产生的,对不同种子,序列完全不同,而且就算一个相同的序列,如果没有对齐(即第一个数组以a[0]为起点,第二个数组以a[2]为起点),所以序列的自相关性极强
    (自相关性是指,两个序列的重合程度)

导航电文

导航电文,导航电文是一串比较特殊的序列,他又叫做数据码,作用是传递一些与定位有关的数据和卫星状态。导航电文搭载的信息就比较格式化,

  • 导航电文的传输速率为为50b/s,也就是每秒传输50个二进制码
  • 一个完整的导航电文信息为1500b,为一个主帧,所以发送完一个主帧需要1500/50=30秒
  • 一个主帧分为5个子帧,每个子帧含1500/5=300b
  • 一个子帧有10个字,每个字30b

也就是,一个导航电文被分为了很多很多小块,系统地来分便是5个子帧,50个字,每个字代表着一个信息。我们知道,一个int类型为4子节32个bit,而一个字30个bit,也就是一个字刚好能表示一个数,这也是导航电文的分块------分成了一块又一块的数字。

但是,导航电文的数据非常多,用50个字没有办法全部表示完。怎么办?所以我们不得不用两串完整的导航电文去表示一个定位数据,也就是用100个字来表示,还不够就150个,200个。

而在实际实现的过程中,采用的是25串完整的导航电文,去表示一个导航数据,其中:

  • 对一串完整的导航电文,前三个子帧播发卫星的基本数据,如时间等。这些是不会变的,25串导航电文一直重复播发
  • 而后两个子帧,需要播发卫星的状态和定位数据,在25串导航电文里,轮流去表示这些数据。

也就是,前三个子帧是不会变的,一直重复播发,而后两个子帧则在25串电文,一共2*25=50个子帧中,将数据播发完整。

导航电文的更新频率是2个小时,也就是在两个小时之内一直会重复播发这25个主帧。

假设在12:00的时候更新,那么一直到14:00,导航电文会重复播发25个子帧,这25个子帧表示的状态都是12:00时刻时,卫星的运动状态和轨道参数。

载波

载波,翻译成人话,就是搭载信号的波,再通俗地说,就是信号波的交通工具。信号从外太空发射过来,会经历大气层,而在传输的过程中会有个特点:

  1. 如果波的频率过高,则电离层的延迟很严重,导致电离层误差过高
  2. 如果波的频率过低,则会被大气层严重吸收,导致信号的强度大大降低

所以采用适中频率的波------L波段无线电信号最合适。载波就是一个交通工具,如果直接用导航电文和测距码,那么要么频率过高要么频率过低,所以就要把导航电文和测距码与载波相调制,把导航电文和测距码调制到L波段上,减少误差。

载波一共有三个频率,

  1. 第一个频率负责搭载信号,
  2. 第二个频率用来采用差分的方法消除电离层延迟,
  3. 第三个频率来实现更多用以提升定位精度的功能

卫星定位原理

测距码测量

原理:测距码是一串伪随机码,只有码序列相同并且对齐,其相关系数才为1

所以,我们可以利用这一特性,在接收机上输入相同的种子,产生一段与卫星相同的伪随机序列

比如:

卫星发出的伪随机码是:abcdefghijk...
(卫星当然发出的是二进制码,但是这里为了更直观比对结果,举例就采用更直观的码序列)

那我们就用相同的种子,在接收机上也构建一段相同的码序列:abcdefghijk...

但是,当接收机接收到信号的时候,不可能是从起点abcd开始的,有可能出现下面的情况:

因为没有对齐,他们的相关系数是极低的。于是,我们就固定住接收到的卫星码,然后向后挪动接收机自己产生的码:

他们之间的差距由两个字母到了一个字母,但是还是没有对齐,相关系数还是很低,我们再挪动一下:

这个时候,计算相关系数,发现相关系数为1了,而且再读取计数器,发现挪动了两个码,所以计算机就知道了:

在一个码序列周期内,他们之间相差了两个码的距离

所以,就可以计算出,在一个码序列周期内,他们相差的时间为:

但是除此之外,他们还相差了很多个整周期T,这个整周期T因为码序列的长度是固定的,所以T一般来说也是固定的一个数,可以直接采用。

所以,信号的传输时间为:

然后再用最基础的L=V*t,就可以求出卫星到接收机之间的距离:


载波测量

但是在高精度测量中,测距码的测量精度并不高。因为其精度求得的时间和码元的宽度强相关,如果码元过宽,对齐过于简单,那么最终的精度也会很低。但是,载波就像三角函数一样,是一段连续的波,我们可以采用这段连续的波,缩短他们的误差,来提高定位精度。

比如在途中,我们接收到的卫星信号是波峰的位置,我们就可以知道,卫星信号的相位是二分之Pi。但是,光知道这个二分之Pi,我们并无法进行定位,因为从卫星发出信号到接收机接收到信号,一定有以下几个部分:

用公式表示便是:

,前者为不满一整周期的相位,后者为整周期数,因为我们并不知道整周期数是多少,又叫他整周模糊度
但是,这个整周模糊度,我们怎么求出来?

我们在测距码定位的时候,就已经求出来了传播的时间,只不过,这个时间的精度不怎么高。

但是,就算再怎么不高,他也不可能相差一整个周期。所以,我们就采用这个测距码测量时得到的时间,逆推出整周模糊度的大小,然后就可以求出卫星到接收机的波长长度。

所以,可以认为,测距码测量的目的是确定整周的长度,而载波测量实际上是确定了不满一周的相位长度,提高了定位的精度。


导航电文测量

导航电文的测量,和前两个有着很大的不同。导航电文测量就不再用波进行测量,而是采用导航电文给出的数据进行解算。在导航电文的第二三子帧中,会给出GPS的轨道参数,而在卫星定位中,采用的卫星轨道描述方法为:开普勒轨道根数

在人工轨道理论中,用六个开普勒轨道根数来描述卫星椭圆轨道的形状,大小和在空间的指向,其包含以下六个参数:

  1. 升交点赤经
  2. 轨道倾角
  3. 长半径
  4. 偏心率
  5. 近地点角距
  6. 卫星过近地点的时刻

升交点赤经

一般来说,卫星轨道和赤道会有两个交点,东边一个西边一个。**卫星从赤道下也就是南半球,经过交点,进入赤道上北半球,这个交点叫做升交点,就像太阳升起;而另外一个叫做降交点,就像太阳落下。**升交点的赤经,也就是天球下的经度,叫做升交点赤经。

轨道倾角

在升交点处,轨道正方向(也就是卫星运动的方向)与赤道的正方向(赤经增加的方向) 的夹角。

长半径

轨道椭圆长轴的一半

偏心率

近地点角距

由地心(A),升交点(B),近地点(C)组成的角BAC就称为近地点角距

而除了给出这几个参数以外,还会给出几个摄动参数。因为导航电文是2个小时更新一次,在两个小时之间,卫星已经运动出了一段距离。我们需要通过这些摄动参数,来模拟卫星的运动状态,从而求出卫星在任意时刻的位置,而非两个小时之前的位置。

具体的公式,可以看看具体代码实现的文章:

卫星位置解算http://t.csdnimg.cn/iKBmL


最后,给自己叠个甲。因为自己才是导航工程大二的本科生,有些概念理解可能不到位,而又想用最容易理解的方式表达出来,所以可能正确性会稍微有些偏差。但是对初学者来说,应该不会存在太大的错误,如果可以帮到你,真的荣幸之极。还有,

相关推荐
笨小古4 天前
路径规划——RRT*算法
算法·路径规划·导航
博主逸尘5 天前
Arcgis地图实战三:自定义导航功能的实现
arcgis·导航
笨小古7 天前
路径规划——RRT-Connect算法
算法·路径规划·导航
Amd7941 个月前
Nuxt.js 应用中的 pages:extend 事件钩子详解
自定义·生命周期·路由·nuxt·管理·导航·钩子
Amd7943 个月前
使用 preloadRouteComponents 提升 Nuxt 应用的性能
组件·nuxt·性能·导航·用户·预加载·体验
Amd7943 个月前
使用 navigateTo 实现灵活的路由导航
中间件·编程·web·路由·url·导航·nuxtjs
海风-3 个月前
扩展【从0制作自己的ros导航小车】C++_ROS_QT5联合编译,简单界面为ROS开发增添交互
c++·qt·ros·可视化·导航
Amd7944 个月前
使用 addRouteMiddleware 动态添加中间
中间件·路由·重定向·权限·导航·nuxt3·动态
Amd7944 个月前
使用 abortNavigation 阻止导航
中间件·路由·错误·重定向·权限·导航·nuxt3