www.gusucode.com > gps卫星位置预报,MATLAB编写,有动画界面源码程序 > code5/gps_final_new/TestAlmFromGPS.m

    clear;clc;close all;

PRN=zeros(32,1);
type=zeros(32,1);
Health=zeros(32,1);
es=zeros(32,1);
Toe=zeros(32,1);
delta_i=zeros(32,1);
dot_omega=zeros(32,1);
sqrt_as=zeros(32,1);
omega0=zeros(32,1);
w=zeros(32,1);
M0=zeros(32,1);
af0=zeros(32,1);
af1=zeros(32,1);
week=zeros(32,1);

SatPosX=zeros(32,1);
SatPosY=zeros(32,1);
SatPosZ=zeros(32,1);

UserPosLat=32.02*pi/180;
UserPosLon=118.48*pi/180;
UserPosHeight=20;
[UserPosX,UserPosY,UserPosZ]=llh2xyz(UserPosLat,UserPosLon,UserPosHeight);
UserPos=[UserPosX/1000.0 UserPosY/1000.0 UserPosZ/1000.0];

EarthCenPos=[0 0 0];

opentype=0;  % 0 from gps realtime almanac data; 1 from internet almanac data
if opentype==0
    fid=fopen('gps.log','r');
    BinData=fread(fid,85*32);
    fclose(fid);
    for i=0:31
        PRN(i+1)=bitand(BinData(5+i*85),63);
        type(i+1)=bitshift(bitand(BinData(5+i*85),192),-6);
        Toe(i+1)=BinData(6+i*85)+BinData(7+i*85)*256+BinData(8+i*85)*256*256+BinData(9+i*85)*256*256*256;
        af0(i+1)=ProcessDouble(BinData(10+i*85:17+i*85));
        af1(i+1)=ProcessDouble(BinData(18+i*85:25+i*85));
        M0(i+1)=ProcessDouble(BinData(26+i*85:33+i*85));
        w(i+1)=ProcessDouble(BinData(34+i*85:41+i*85));
        omega0(i+1)=ProcessDouble(BinData(42+i*85:49+i*85));
        sqrt_as(i+1)=ProcessDouble(BinData(50+i*85:57+i*85));
        dot_omega(i+1)=ProcessDouble(BinData(58+i*85:65+i*85));
        delta_i(i+1)=ProcessDouble(BinData(66+i*85:73+i*85));
        es(i+1)=ProcessDouble(BinData(74+i*85:81+i*85));
        week(i+1)=BinData(82+i*85)+BinData(83+i*85)*256;
        %[PRN(i),type(i),Toe(i),af0(i),af1(i),M0(i),w(i),omega0(i),sqrt_as(i),dot_omega(i),delta_i(i),es(i),week(i)]=ProcessGpsData(BinData((i-1)*85+1:i*85));
    end
else
    cnt=0;
    fid=fopen('almanac_yuma_week0552.txt','r');
    while 1
        tline=fgetl(fid);
        cnt=cnt+1;
        if ~ischar(tline),   break,   end
    end
    fclose(fid);

    recordnum=floor(cnt/15);

    fid=fopen('almanac_yuma_week0552.txt','r');
    for m=1:recordnum
        tline=fgetl(fid);
        tline=fgetl(fid);
        [temp,tempx]=strread(tline,'%s %d');
        i=tempx;
        PRN(i)=i;
        tline=fgetl(fid);
        [temp,Health(i)]=strread(tline,'%s %d');
        tline=fgetl(fid);
        [temp,es(i)]=strread(tline,'%s %f');
        tline=fgetl(fid);
        [temp,temp1,temp2,Toe(i)]=strread(tline,'%s %s %s %f');
        tline=fgetl(fid);
        [temp,temp1,delta_i(i)]=strread(tline,'%s %s %f');
        tline=fgetl(fid);
        [temp,temp1,temp2,temp3,dot_omega(i)]=strread(tline,'%s %s %s %s %f');
        tline=fgetl(fid);
        [temp,temp1,temp2,sqrt_as(i)]=strread(tline,'%s %s %s %f');
        tline=fgetl(fid);
        [temp,temp1,temp2,temp3,omega0(i)]=strread(tline,'%s %s %s %s %f');
        tline=fgetl(fid);
        [temp,temp1,temp2,w(i)]=strread(tline,'%s %s %s %f');
        tline=fgetl(fid);
        [temp,temp1,M0(i)]=strread(tline,'%s %s %f');
        tline=fgetl(fid);
        [temp,af0(i)]=strread(tline,'%s %f');
        tline=fgetl(fid);
        [temp,af1(i)]=strread(tline,'%s %f');
        tline=fgetl(fid);
        [temp,week(i)]=strread(tline,'%s %d');
        tline=fgetl(fid);
    end 
    fclose(fid);
end

for t=0:11
    
    figure(t+1)
    set (gcf,'Position',[0,30,1200,800], 'color','w')
    DrawEarth(0);%地球可视化
    DrawUser(UserPos);%用户可视化
    axis([-30000 30000 -30000 30000 -30000 30000]);
    hold on;
    
    T=Toe(1,1)+t*3600*2;
    
    for i=1:32
        %从历书计算卫星位置
        [SatPosX(i),SatPosY(i),SatPosZ(i)]=CompSatPosFromAlm(PRN(i),T,Toe(i),M0(i),sqrt_as(i),es(i),w(i),delta_i(i),omega0(i),dot_omega(i));        
        SatPos(i,1)=SatPosX(i);
        SatPos(i,2)=SatPosY(i);
        SatPos(i,3)=SatPosZ(i);
        SatPos(i,4)=1;
        
        %可见性计算
        Temp=SatPos(i,1:3)-UserPos;
        Dist1=Temp*Temp';
        Temp=UserPos-EarthCenPos;
        Dist2=Temp*Temp';
        Temp=SatPos(i,1:3)-EarthCenPos;
        Dist3=Temp*Temp';
        ViewAngle=acos((Dist1+Dist2-Dist3)/2/sqrt(Dist1)/sqrt(Dist2));
        if(ViewAngle<=pi/2)
            SatPos(i,4)=0;
        end
        
        %卫星可视化
        DrawSat(SatPos(i,:));
        DrawSatOrbit(PRN(i),T,Toe(i),M0(i),sqrt_as(i),es(i),w(i),delta_i(i),omega0(i),dot_omega(i));
    end

    drawnow;
    M(t+1)=getframe;
end

close all;
figure(111);
set (gcf,'Position',[0,30,1200,800], 'color','w')
axis equal;
axis off;
%动画
movie(M,12,2);