坪地做网站百度网盘会员
利用星历数据解算北斗卫星位置
网上已经有了比较多关于如何利用播发的广播星历来解算卫星位置的blog,此文章的目的是为了记录一下学习成果的同时回馈一下。(毕竟看过很多blog了,但是从来没写过),我在文中用到的数据是我处理过的,只保留了北斗的数据,如果直接用rinex格式下的星历文件,同样可以按照相同的步骤进行求解,不过在数据处理方面有所不同。
在实现之前首先得下载好广播星历文件并且导入
下载的网址就比较多了,比如说武汉IGS数据中心,广播星历和精密星历都能下载。
下面是具体实现
1.首先对参数初始化
代码目前没有做交互,也没有采用循环(这些都比较容易在后期实现)所以在一开始只能选定一个卫星号prn,并且只能人为修改prn号来更换卫星的选择。在观测时间的选择上,我所读取的广播星历数据的起始时间为BDT 783周259200s,所以我选取的初始观测时间为259200s。计算卫星位置的数量为可以自己选择,由于我下载的精密星历同一卫星仅有95个数据,所以我设定为95个。卫星的时间间隔我选择的是900s,也即15mins。(与精密星历播发数据相匹配方便精度检验)。
clc;
close;
clear;%1. 读取下载好的广播星历数据
Data_bro=importdata("Nfile-new.csv");%2.参数初始化
prn=07; %卫星号
t=259200; %观测起始时间
number=95; %设定计算位置点的数量(当gap=900时,number应小于95,精密星历中只有95条数据)
gap=900; %时间上的间隔(单位为s)
flag=0; %选择是否播放动画(flag=0时不播放,flag=1时播放)
2.计算卫星位置
计算卫星位置之前首先要对星历数据进行选择,选择星历要进行两步处理,第一是在星历文件中找到与所设定卫星号prn相同的星历数据,第二步是在第一步的结果中选取当前观测时刻内依旧有效的精度最高的卫星星历数据,由于我们是非实时解算,所以我们可以选取与观测时刻时间间隔最小的星历数据作为我们解算位置所用的数据。也就是说最终选取得到的结果是针对单一卫星在某时刻播发的一条星历数据。
%3.计算卫星位置
for i=1:number t=t+gap; %每隔gap观测一次broadEph_tar = select_eph(t,prn,Data_bro.data); %选星历[Xk(i),Yk(i),Zk(i)] = cal_coordinate(t,prn,broadEph_tar);
end
其中select_eph函数为我设立的选取星历的函数,cal_coordinate为我计算卫星位置的函数。(其实可以把两个函数二合一)其代码如下
select_eph函数:
function broadEph_tar = select_eph(t,prn,Broad_eph)%1.选择prn相对应的所有星历数据
result_pre=[];
num=1;
for k=1:length(Broad_eph)if Broad_eph(k,1)==prn result_pre(num,1)=num;result_pre(num,2)=k;num=num+1;end
end%2.选择与观测时间相近且已经播发的星历数据
delta_t=[];
%从对应的广播星历中找到与观测时间最相近的星历数据
for k=1:size(result_pre,1)delta_t(k)=t-Broad_eph(result_pre(k,2),3);%使用在有效期内的星历数据,将尚未播发的星历数据剔除if delta_t(k)<0delta_t(k)=1e8;end
end
%找到最近播发的星历文件及在数据中所排位置eph_tar,返回所找到的星历文件
[Min,c]=min(delta_t);
eph_tar=result_pre(c,2);
broadEph_tar=Broad_eph(eph_tar,:)