Advertisement

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

阅读量:

该文介绍了一种使用Matlab编程根据广播星历表计算卫星坐标的方法。该方法通过读取卫星星历文件中的数据并结合天体力学公式进行多次迭代运算,最终得到卫星在协议地球坐标系中的位置坐标(X, Y, Z)。具体步骤包括读取星历数据、计算轨道参数(如平均角速度n0)、迭代求解近点角Ek以及利用旋转矩阵进行坐标转换。该方法能够精确地计算出不同时间点的卫星位置,并将结果保存为GPS时下的三维坐标形式。

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

卫星星历文件

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~