卫星信号
在介绍所有卫星信号之前,首先要明确一些概念:
所有的卫星信号,都是一段电磁波,用户接收的,也是一段电磁波。
但是我们认知中的电磁波,就是一段波,就像我们打出去的交一样,怎么通过这一段波来转换成有用的数据呢?
首先,卫星发射信号的是计算机,接收机也是计算机,卫星发出信号,我们接收信号,接收的都是一段二进制01码,然后把01码进行转换。因为卫星不可能直接发出一串文字,而计算机就算接收到了这串文字,也无法看懂,所以计算机之间的交互很默契地都采用二进制码来交互。
因此,我们接收信号,方法就是将电磁波转换为二进制序列。但是怎么转换?转换方法就多了,我们可以:
- 电磁波高波峰表示1,低波峰表示0
- 电磁波正波表示1,负波表示0,曼波out
具体的实现方案,我们就不需要深究,也不是我们需要管的事,我们只用知道:卫星发出和我们接收的信号都是电磁波,最终转换为的形式为二进制序列。
而因为电磁波可以转化成二进制码,我们可以重新用码的特性去定义卫星信号的一些特性:
- 码元:二进制序列中每一个二进制数称为一个码元
- 码元宽度:每个码元持续时间或其对应的距离成为码元宽度
- 码速率:码发生器每秒输出的码元个数
卫星信号分为三种:载波,测距码与导航电文。
测距码
测距码是用来测距的一串码序列,最终他的形式也是可以转换成01的。测距码最大的特性,也就是他定位的原理,便是他采用的是一段伪随机码。什么是伪随机?
就如同我们在编程语言中涉及到的获得伪随机数与设定种子一样:
伪随机数列是一个数组:
对每一个数组中的元素,都有一个固定的算法:比如:第一空的算法为
我们在给定种子为x=2的时候,第一个空的数据就是f(2)=14
同理,一直填满所有的空
而当我们想取随机数的时候,就按顺序依次从这个数组里取,
比如我们在玩掷硬币,假设为奇数是正面,偶数是反面
那么第一次掷硬币,我们取第一个元素,14,为反面
第二次掷硬币,我们取第二个元素,g(2)
过了很长时间,我们再掷第三次硬币,只要我们不重新设置种子,还是从上一次的位置开始往下取,即取第三个元素h(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时刻时,卫星的运动状态和轨道参数。
载波
载波,翻译成人话,就是搭载信号的波,再通俗地说,就是信号波的交通工具。信号从外太空发射过来,会经历大气层,而在传输的过程中会有个特点:
- 如果波的频率过高,则电离层的延迟很严重,导致电离层误差过高
- 如果波的频率过低,则会被大气层严重吸收,导致信号的强度大大降低
所以采用适中频率的波——L波段无线电信号最合适。载波就是一个交通工具,如果直接用导航电文和测距码,那么要么频率过高要么频率过低,所以就要把导航电文和测距码与载波相调制,把导航电文和测距码调制到L波段上,减少误差。
载波一共有三个频率,
- 第一个频率负责搭载信号,
- 第二个频率用来采用差分的方法消除电离层延迟,
- 第三个频率来实现更多用以提升定位精度的功能
卫星定位原理
测距码测量
原理:测距码是一串伪随机码,只有码序列相同并且对齐,其相关系数才为1
所以,我们可以利用这一特性,在接收机上输入相同的种子,产生一段与卫星相同的伪随机序列
比如:
卫星发出的伪随机码是:abcdefghijk...
(卫星当然发出的是二进制码,但是这里为了更直观比对结果,举例就采用更直观的码序列)
那我们就用相同的种子,在接收机上也构建一段相同的码序列:abcdefghijk...
但是,当接收机接收到信号的时候,不可能是从起点abcd开始的,有可能出现下面的情况:
因为没有对齐,他们的相关系数是极低的。于是,我们就固定住接收到的卫星码,然后向后挪动接收机自己产生的码:
他们之间的差距由两个字母到了一个字母,但是还是没有对齐,相关系数还是很低,我们再挪动一下:
这个时候,计算相关系数,发现相关系数为1了,而且再读取计数器,发现挪动了两个码,所以计算机就知道了:
在一个码序列周期内,他们之间相差了两个码的距离
所以,就可以计算出,在一个码序列周期内,他们相差的时间为:
但是除此之外,他们还相差了很多个整周期T,这个整周期T因为码序列的长度是固定的,所以T一般来说也是固定的一个数,可以直接采用。
所以,信号的传输时间为:
然后再用最基础的L=V*t,就可以求出卫星到接收机之间的距离:
载波测量
但是在高精度测量中,测距码的测量精度并不高。因为其精度求得的时间和码元的宽度强相关,如果码元过宽,对齐过于简单,那么最终的精度也会很低。但是,载波就像三角函数一样,是一段连续的波,我们可以采用这段连续的波,缩短他们的误差,来提高定位精度。
比如在途中,我们接收到的卫星信号是波峰的位置,我们就可以知道,卫星信号的相位是二分之Pi。但是,光知道这个二分之Pi,我们并无法进行定位,因为从卫星发出信号到接收机接收到信号,一定有以下几个部分:
用公式表示便是:
,前者为不满一整周期的相位,后者为整周期数,因为我们并不知道整周期数是多少,又叫他整周模糊度。
但是,这个整周模糊度,我们怎么求出来?
我们在测距码定位的时候,就已经求出来了传播的时间,只不过,这个时间的精度不怎么高。
但是,就算再怎么不高,他也不可能相差一整个周期。所以,我们就采用这个测距码测量时得到的时间,逆推出整周模糊度的大小,然后就可以求出卫星到接收机的波长长度。
所以,可以认为,测距码测量的目的是确定整周的长度,而载波测量实际上是确定了不满一周的相位长度,提高了定位的精度。
导航电文测量
导航电文的测量,和前两个有着很大的不同。导航电文测量就不再用波进行测量,而是采用导航电文给出的数据进行解算。在导航电文的第二三子帧中,会给出GPS的轨道参数,而在卫星定位中,采用的卫星轨道描述方法为:开普勒轨道根数
在人工轨道理论中,用六个开普勒轨道根数来描述卫星椭圆轨道的形状,大小和在空间的指向,其包含以下六个参数:
- 升交点赤经
- 轨道倾角
- 长半径
- 偏心率
- 近地点角距
- 卫星过近地点的时刻
升交点赤经
一般来说,卫星轨道和赤道会有两个交点,东边一个西边一个。卫星从赤道下也就是南半球,经过交点,进入赤道上北半球,这个交点叫做升交点,就像太阳升起;而另外一个叫做降交点,就像太阳落下。升交点的赤经,也就是天球下的经度,叫做升交点赤经。
轨道倾角
在升交点处,轨道正方向(也就是卫星运动的方向)与赤道的正方向(赤经增加的方向) 的夹角。
长半径
轨道椭圆长轴的一半
偏心率
近地点角距
由地心(A),升交点(B),近地点(C)组成的角BAC就称为近地点角距
而除了给出这几个参数以外,还会给出几个摄动参数。因为导航电文是2个小时更新一次,在两个小时之间,卫星已经运动出了一段距离。我们需要通过这些摄动参数,来模拟卫星的运动状态,从而求出卫星在任意时刻的位置,而非两个小时之前的位置。
具体的公式,可以看看具体代码实现的文章:
卫星位置解算http://t.csdnimg.cn/iKBmL
最后,给自己叠个甲。因为自己才是导航工程大二的本科生,有些概念理解可能不到位,而又想用最容易理解的方式表达出来,所以可能正确性会稍微有些偏差。但是对初学者来说,应该不会存在太大的错误,如果可以帮到你,真的荣幸之极。还有,