说实话,只要是了解导航的朋友们都知道RNSS单点定位的原理是比较简单的,从几何原理分析,只需要3颗卫星(三球交汇嘛)就能确定用户接收机天线的位置。
但由于卫星钟和接收机中两者内的钟难以保持严格同步,实际观测的接收机至卫星之间的距离均含有卫星钟和接收机钟不同步的影响。对于卫星钟差,可以应用导航电文中给出的钟差修正参数进行改正;对于接收机钟差,一般难以预先准确地确定。所以在实际应用中常把接收机钟差和接收机天线的位置一并作为未知量,这样求解四个未知参数需要四个观测量,即接收机需同时观测至少4颗卫星。但从其原理到实现还有一段路要走,下面我浅谈一下我对于编写相应程序的理解。对于基本流程不是特别清晰的还可以参考这篇文章
文章目录
(不太会用LaTeX,干脆直接贴图)
1.读取数据及初始化
首先还是读取数据和设定好相关参数,其中所用到的read_Ofile函数是我自己定义的主要用于读取观测文件的一个函数,由于大家读取的方式可能有所不同,我在这不过多赘述,其读取所得结果分别为t_R(钟面时)、sat_num(该历元下接收到北斗卫星信号的卫星数目)、PRN(卫星号)、PR(伪距)
clc;
clear;
close;
% 1.读取数据
%1.1 读取观测文件数据
data_fre1 = fopen('WUH200CHN_R_20210060000_01D_30S_MO_Observations1.txt','r');
% data_fre3=importdata('WUH200CHN_R_20210060000_01D_30S_MO_Observations3.txt');
[t_R,sat_num,PRN,PR] = read_Ofile(data_fre1); %通过自编写函数实现对数据的有效读取
%1.2 读取星历文件数据
Data_bro=importdata("Nfile-new.csv");
Broad_eph=Data_bro.data;
% 2.设定解算过程中所用常数
c = 2.99792458e8;
omegaDote = 7.2921150e-5;
flag=1; %绘制动图开关
% 3.给定待定点的近似坐标和初始接收机钟差
% x0 = -2267749.0000;
% y0 = 5009154.0000;
% z0 = 3221290.0000;
x0=0;
y0=0;
z0=0;
delta_tR=0;
corrdinate_r=[-2267749.0000,5009154.0000,3221290.0000]; %由观测文件中读取到的近似点
2.解算主体过程
然后就是按照上诉流程来进行迭代计算,基本可以看成是以下4个步骤
(1)迭代计算出收敛的信号传播时间
(2)遍历同一历元下的所有卫星计算出其传播时间,并解算传播时间过程中得到的中间量来计算方向余弦,构造出法方程,解算得到改正量也即得到了接收机的近似位置和接收机钟差
(3)解算出的接收机的近似位置并不能看作解算结果,需要继续迭代,直至前后两次迭代的三维坐标之差绝对值中的最小值满足条件时,所得的解算结果才可看作为接收机的位置(由于钟差较小且较稳定,所以并不对钟差做限定)
(4)遍历历元得到不同历元下接收机的位置坐标和钟差
% 4.计算信号传播时间并据此得到接收机位置(迭代计算)
for i=1:size(sat_num) %时间遍历
a=zeros(sat_num(i),3);
l=zeros(sat_num(i),1);
corrdinate0(i,:)=[x0,y0,z0];
corrdinate1(i,:)=ones(1,3);
while min(abs(corrdinate0(i,:)-corrdinate1(i,:)))>0.01
corrdinate0(i,