天天看点

Matlab根据广播星历表计算卫星坐标Matlab根据广播星历表计算卫星坐标

Matlab根据广播星历表计算卫星坐标

clear,clc;

%读取卫星星历文件

filename='20040130.04N.txt';

fid=fopen(filename);

%按行读取星历文件的每一个元素,从PRN7号卫星开始

data=textscan(fid,'%f %f %f %f %f %f %f %f %f
%f\n','HeaderLines',11);

%将读取的数组转换成数值型矩阵

B1=cell2mat(data);

data=textscan(fid,'%f %f %f %f\n','HeaderLines',1);

B2=cell2mat(data);

data=textscan(fid,'%f %f %f %f\n','HeaderLines',1);

B3=cell2mat(data);

data=textscan(fid,'%f %f %f %f\n','HeaderLines',1);

B4=cell2mat(data);

data=textscan(fid,'%f %f %f %f\n','HeaderLines',1);

B5=cell2mat(data);

data=textscan(fid,'%f %f %f %f\n','HeaderLines',1);

B6=cell2mat(data);

data=textscan(fid,'%f %f %f %f\n','HeaderLines',1);

B7=cell2mat(data);

data=textscan(fid,'%f\n','HeaderLines',1);

B8=cell2mat(data);

 

%定义常量GM,Ve

GM=3.986004e14;

Ve=7.2921151467e-5;

%求出轨道长半轴a

sqrta=B3(4);

a=sqrta^2;

e=B3(2);

%求出平均角速度n0

n0=sqrt(GM/(a^3));

XYZ=[];

 

%计算从2004年1月30日16:00开始,每隔1分钟的卫星坐标

for i=0:1:20

    %计算当前时刻的儒略日

    JulianDay=fix(365.25*(2004-1))+fix(30.6001*(1+13))+30+(16+i/60+0/3600)/24+1720981.5;

    %将儒略日转换成GPS时

   
t2=(JulianDay-2444244.5)/7-fix((JulianDay-2444244.5)/7);

    t=t2*604800;

    %计算卫星钟差改正后的当前时刻的GPS时

   
t=t-(B1(8)+B1(9)*(t-B4(1))+B1(10)*(t-B4(1))^2);

    

     %计算参考时刻的儒略日

   
JulianDayoe=fix(365.25*(2004-1))+fix(30.6001*(1+13))+30+(8+0/60+0/3600)/24+1720981.5;

     %将儒略日转换成GPS时

   
t2oe=(JulianDayoe-2444244.5)/7-fix((JulianDayoe-2444244.5)/7);

    toe=t2oe*604800;

    %计算时间差tk

    tk=t-toe;

    

    %计算改正平角速度

    n=n0+B2(3);

    %计算平近点角Ek

    Mk=B2(4)+n*tk;

    %迭代计算,求出偏近点角Ek

    Ek=Mk;

    Ek0=inf;

    while
abs(Ek0-Ek)>1e-100

        Ek0=Ek;

        Ek=Mk+e*sin(Ek0);

    end

    %计算真近点角

   
Sinfk=(sqrt(1-e^2)*sin(Ek))/(1-e*cos(Ek));

    Cosfk=(cos(Ek)-e)/(1-e*cos(Ek));

   
fk=atan2(Sinfk,Cosfk);

    %计算升交角距

    phik=fk+B5(3);

    %从卫星星历文件中读取各个方向的振幅Crs,Cuc,Cus,Cic,Cis,Crc

    Crs=B2(2);

    Cuc=B3(1);

    Cus=B3(3);

    Cic=B4(2);

    Cis=B4(4);

    Crc=B5(2);

    %计算卫星轨道摄动项改正数

    deltauk=Cus*sin(2*phik)+Cuc*cos(2*phik);

   
deltark=Crs*sin(2*phik)+Crc*cos(2*phik);

   
deltaik=Cis*sin(2*phik)+Cic*cos(2*phik);

    %计算改正后的升交角距uk

    uk=phik+deltauk;

    %计算改正后的向径rk

   
rk=a*(1-e*cos(Ek))+deltark;

    %计算改正后的倾角ik

    ik=B5(1)+deltaik+B6(1)*tk;

    %计算观测瞬间升交点的经度Lk

   
Lk=B4(3)+(B5(4)-Ve)*tk-Ve*B4(1);

    %计算卫星在轨道平面内的坐标x,y,z

   
xyz=[rk*cos(uk);rk*sin(uk);0];

    %计算旋转矩阵的值

   
RzRx=[cos(Lk),-sin(Lk)*cos(ik),sin(Lk)*sin(ik);sin(Lk),cos(Lk)*cos(ik),-cos(Lk)*sin(ik);0,sin(ik),cos(ik)];

    %计算卫星在协议地球坐标系中的位置

   
XYZ=vpa([XYZ;1e-3*(RzRx*xyz)'],10);

end

XYZ
           

卫星星历文件

Matlab根据广播星历表计算卫星坐标Matlab根据广播星历表计算卫星坐标

继续阅读