GPS卫星运动及定位matlab仿真

GPS系统的前身为美军研制的一种子午仪卫星定位系统(Transit),1958年研制,64年正式投入使用。该系统用5到6颗卫星组成的星网工作,每天最多绕过地球13次,并且无法给出高度信息,在定位精度方面也不尽如人意。然而,子午仪系统使得研发部门对卫星定位取得了初步的经验,并验证了由卫星系统进行定位的可行性,为GPS系统的研制埋下了铺垫。由于卫星定位显示出在导航方面的巨大优越性及子午仪系统存在对潜艇和舰船导航方面的巨大缺陷。美国海陆空三军及民用部门都感到迫切需要一种新的卫星导航系统[13]。
1973年12月 ,美国国防部批准它的陆海空三军联合研制新的卫星导航系统: NAVSTAR/GPS。它是英文“Navigation Satellite Timing and Ranging/Global Positioning System” 的缩写词。其意为 “卫星测时测距导航/全球定位系统”,简称 GPS。这个系统向有适当接受设备的全球范围用户提供精确、 连续的三维位置和速度信息 ,并且还广播一种形式的世界协调时(U TC) 。通过遍布全球的(21+3)GPS导航卫星,向全球范围内的用户全天候提供高精度的导航、跟踪定位和授时服务。目前,GPS已在地形测量,交通管理,导航,野外勘探,空间宇宙学等诸多领域得到了广泛的应用[11]。
 目前全球共有4大GPS系统,分别是:
美国 GPS ,由美国国防部于 20 世纪 70 年代初开始设计、 研制 ,于1993 年全部建成。1994 年 ,美国宣布在 10 年内向全世界免费提供 GPS使用权 ,但美国只向外国提供低精度的卫星信号。
欧盟 “伽利略”,1999 年 欧洲提出计划 ,准备发射 30 颗卫星 ,组成 “伽利略” 卫星定位系统。
俄罗斯 “格洛纳斯”,尚未部署完毕。始于上世纪 70年代,需要至少 18 颗卫星才能确保覆盖俄罗斯全境;如要提供全球定位服务 ,则需要 24 颗卫星。
中国“北斗”2003 年我国北斗一号建成并开通运行 ,不同于 GPS, “北斗” 的指挥机和终端之间可以双向交流。四川大地震发生后 ,北京武警指挥中心和四川武警部队运用 “北斗” 进行了上百次交流。北斗二号系列卫星今年起将进入组网高峰期 ,预计在 2015 年形成由三十几颗卫星组成的覆盖全球的系统。

1.2 本课题研究的意义和方法

GPS系统是一个很庞大的系统,包含了天文,地理,计算机,电磁学,通信学,信息学等等。通过本文对GPS的学习研究,最重要的还是要学习其原理:卫星运动原理;卫星定位原理;卫星跟踪原理等等。通过基础原理的学习,一方面,可以使我们更进一步的理解卫星运动,定位的实现方法;通过仿真,进一步了解简单定位的方法及其在仿真平台上的实现途径;另一方面,也可以培养我们自学的能力,训练仿真模拟的技巧和方法。

至今,基本上完成了课题的要求,通过不断的注入既定参数,可以更加详细,直观的理解基本的定位原理和实现方法!

1.3 GPS前景

GPS导航定位以其定位精度高、观测时间短、测站间无需通视、可提供三维坐标、操作简便、全天候作业、功能多、应用广泛等特点著称。

用GPS信号可以进行海、空和陆地的导航、导弹的制导、大地测量和工程测量的精密定位、时间的传递和速度的测量等。对于测绘领域,GPS卫星定位技术已经用于建立高精度的全国性的大地测量控制网,测定全球性的地球动态参数;用于建立陆地海洋大地测量基准,进行高精度的海岛陆地联测以及海洋测绘;用于检测地球板块运动状态和地壳形变;用于工程测量,成为建立城市与工程控制网的主要手段。用于测定航空航天摄影瞬间相机位置,实现仅有少量的地面控制或无地面控制的航测快速成图,导致地理信息系统、全球环境遥感监测的技术革命[4]。

目前,GPS、GLONASS、INMARSAT等系统都具备了导航定位功能,形成了多元化的空间资源环境。这一多元化的空间资源环境,促使国际民间形成了一个共同的策略,即一方面对现有系统充分利用,一方面积极筹建民间GNSS系统,待2011年左右,GNSS纯民间系统建成,全球 将形成GPS/GLONASS/GNSS三足鼎立之势,才能从根本上摆脱对单一系统的依赖,形成国际共有、国际共享的安全资源环境。世界才可以将卫星导航作为单一导航手段的最高应用境界。国际民间的这一策略,反过来又影响和迫使美国对其GPS使用政策作出更开放的调整。多元化的空间资源环境的确立,给GPS的发发展应用创造了一个前所未有的良好的国际环境。

 

 

第二章 GPS测量原理

GPS导航系统的基本原理是测量出已知位置的卫星到用户接收机之间的距离 ,然后综合多颗卫星的数据就可知道接收机的具体位置。要达到这一目的 ,卫星的位置可以根据星载时钟所记录的时间在卫星星历中查出。而用户到卫星的距离则通过纪录卫星信号传播到用户所经历的时间 ,再将其乘以光速得到(由于大气层电离层的干扰 ,这一距离并不是用户与卫星之间的真实距离 ,而是伪距( PR) :当GPS卫星正常工作时 ,会不断地用 1 和 0 二进制码元组成的伪随机码(简称伪码)发射导航电文。GPS系统使用的伪码一共有两种 ,分别是民用的 C/ A 码和军用的 P( Y)码。C/ A 码频率 1. 023MHz ,重复周期一毫秒 ,码间距 1 微秒 ,相当于 300m; P 码频率10. 23MHz ,重复周期266. 4 天 ,码间距0. 1 微秒 ,相当于 30m。而 Y码是在 P码的基础上形成的 ,保密性能更佳。

GPS导航系统卫星部分的作用就是不断地发射导航电文。然而 ,由于用户接受机使用的时钟与卫星星载时钟不可能总是同步 ,所以除了用户的三维坐标 x、 y、 z外 ,还要引进一个Δt 即卫星与接收机之间的时间差作为未知数 ,然后用 4 个方程将这 4个未知数解出来。所以如果想知道接收机所处的位置 ,至少要能接收到 4 个卫星的信号。

2.1 伪距测量的原理

GPS定位采用的是被动式单程测距。它的信号发射书机由卫星钟确定,收到时刻是由接收机钟确定,这就在测定的卫星至接收机的距离中,不可避免地包含着两台钟不同步的误差和电离层、对流层延迟误差影响,它并不是卫星与接受机之间的实际距离,所以称之为伪距。

伪距定位法是利用全球卫星定位系统进行导航定位的最基本的方法,其基本原理是:在某一瞬间利用GPS接收机同时测定至少四颗卫星的伪距,根据已知的卫星位置和伪距观测值,采用距离交会法求出接收机的三维坐标和时钟改正数。它的优点是速度快、无多值性问题,利用增加观测时间可以提高定位精度;缺点是测量定位精度低,但足以满足部分用户的需要。

 

 

用户位置

GPS卫星运动及定位matlab仿真_第1张图片

地心位置

 

GPS卫星运动及定位matlab仿真_第2张图片

图5-5 用户可见的卫星分布

SatellitePosition =                     

  1.0e+004 *

    1.7746    1.7572    0.7365    0.0001

   -1.2161    0.9732    2.1091    0.0001

    2.2883    0.2975   -1.4132    0.0001

   -2.3882   -0.8836    0.7869         0

   -0.3681   -2.5255    0.7012         0

   -0.1323    2.7059   -0.0000    0.0001

   -1.5424    0.4273    2.1704    0.0001

    1.4582    0.4926   -2.1144         0

   -2.4090    0.6583    0.7365         0

    1.0759    1.1599   -2.1757         0

    1.3324   -1.8178    1.4392    0.0001

   -1.3225    1.7688   -1.3835         0

    1.2127   -0.9774    2.1091    0.0001

   -1.8766    0.3838   -1.9058         0

   -2.4302   -0.9295   -0.7516         0

    0.4443    1.8187   -1.8463         0

   -0.6718    2.4562   -0.7869         0

    1.4000   -1.3073    1.9058    0.0001

   -1.4992    0.4223   -2.1091         0

   -0.8706   -2.0297   -1.3835         0

   -1.7722   -0.6021   -1.9217         0

   -0.2481   -1.5812   -2.1704         0

   -0.5421    1.7915    1.9217    0.0001

    1.9376   -1.5756   -0.7365    0.0001

仿真程序四:用可见卫星计算用户位置

程序见附录

多于四颗的卫星用最小二乘法逼近计算。对于前面的假设用户位置(6400,3352,5410)进行计算,结果如下:

 

GPS卫星运动及定位matlab仿真_第3张图片

图5-6 用户位置的计算

由图13可见,根据最小二乘法的原理,计算出来了用户在一个时刻的位置坐标,并把它表示在了这个天球坐标系当中。

calculaterecord =

  1.0e+003 *

       0         0         0

    7.3399    3.8857    6.1388

    6.3034    3.2976    5.3346

    6.3914    3.3470    5.4034

    6.4009    3.3525    5.4107

    6.4001    3.3520    5.4101

先后经过了六次的迭代算法,吧用户的计算位置一步一步的逼近了用户的实际位置,根据部同的精度要求,我们运算的量的大小也有不同。这点,可以根据程序当中的参数Error的设定而有所出入。

 

图5-7 用户位置的计算

通过对用户仿真计算的进一步放大,可以很清楚地看到:在每一次迭代的过程当中,我们都实时的把每一步迭代的值也表示在了同一个坐标轴里面:目的就是很直观的反应出我们基于最小二乘法的伪距算法的主要思路。如下图所示:

 

图5-8 用户位置的计算

   上图15当中的黑色箭头从上到下一次表示的是第一次到第六次计算出来的用户的位置,第七箭头表示的用户的实际位置(用白色的柱体表示)。

 

 

程序一(绘制卫星的轨道平面)代码

function drawsatelliteorbit

a=26560;% 卫星轨道的长半轴.

e=0.02;%e是椭圆的偏心率.

E=[0:0.1:2*pi];

x=a*(cos(E)-e);

y=a*sqrt((1-e^2))*sin(E);

z=0*E;

DtoR=2*pi/360;

A1=[32.8  92.8  152.8  212.6  272.8  332.8];%卫星星座数据.

for k=1:6

    A=A1(k)*DtoR;%升交点的经度

    B=55*DtoR;%轨道的倾角

    C=pi/100;%近地点幅角

    %总共有6个卫星轨道平面

    R1=[cos(A)  -sin(A)  0;

        sin(A)  cos(A)   0;

        0        0       1;];

    R2=[1         0       0;

        0        cos(B)  -sin(B);

        0        sin(B)   cos(B);];

    R3=[cos(C)    -sin(C)    0;

        sin(C)    cos(C)     0;

        0          0        1;];

    L1=length(E);

    R312=R1*R2*R3;

    Ans=R312*[x;y;z;];

    x1=Ans(1,:);

    y1=Ans(2,:);

    z1=Ans(3,:);

    plot3c(x1,y1,z1,k);

    boxplot3(0,0,0,200,200,200,7);

    hold on;

  axis equal;

  axis off;

end

程序二(单颗卫星不同时刻的动态仿真)代码

clear; clc;close all;

DtoR=2*pi/360;

jiaostep=360/24*DtoR;

 j=0;

    a=26560;% 卫星轨道的长半轴.

e=0.02;%e是椭圆的偏心率.

E=[0:0.1:2*pi];

x=a*(cos(E)-e);

y=a*sqrt((1-e^2))*sin(E);

z=0*E;

    drawearth(0);

hold on;

for time=1:12

    axis on;

A1=32.8 ;%卫星星座数据.

    A=A1*DtoR;%升交点的经度

    B=55*DtoR;%轨道的倾角

    C=pi/100;%近地点幅角

    R1=[cos(A)  -sin(A)  0;

        sin(A)  cos(A)   0;

        0        0       1;];

    R2=[1         0       0;

        0        cos(B)  -sin(B);

        0        sin(B)   cos(B);];

    R3=[cos(C)    -sin(C)    0;

        sin(C)    cos(C)     0;

        0          0        1;];

    L1=length(E);

    R312=R1*R2*R3;

    Ans=R312*[x;y;z;];

    x1=Ans(1,:);

    y1=Ans(2,:);

    z1=Ans(3,:);

    plot3c(x1,y1,z1,2);

    hold on;

  axis equal;

  axis on;

  grid on;

ctable=10;

        A=A1*DtoR;

        B=55*DtoR;

            C=ctable*DtoR+time*2*pi/24;         %近地点幅角

              x=a*(cos(C)-e);

y=a*sqrt((1-e^2))*sin(C);

z=0*C;

 R1=[cos(A)    -sin(A)       0;

      sin(A)    cos(A)       0;

        0           0       1;];

    R2=[1         0        0;

        0        cos(B)  -sin(B);

        0        sin(B)   cos(B);];

    R3=[cos(C)    -sin(C)     0;

        sin(C)    cos(C)      0;

        0          0        1;];

    L1=length(E);

    R312=R1*R2*R3;

    Ans=R312*[x;y;z;];

    x1=Ans(1,:);

    y1=Ans(2,:);

    z1=Ans(3,:);

    drawsatellite(x1,y1,z1,6);  

    M(time)=getframe;

    M(time+1) = getframe;

   end

axis on;           

程序三(卫星在某个时刻的全轨道平面的分布和可见卫星)代码

clear;clc;close all;

a=26560;                                          % 卫星轨道的长半轴.

e=0.02;   

temp=0;%便于把卫星的指标点顺序放到矩阵指标当中。

%e是椭圆的偏心率.

E=[0:0.1:2*pi];

x=a*(cos(E)-e);

y=a*sqrt((1-e^2))*sin(E);

z=0*E;

timenow=0;%单位是小时

global SatellitePosition

global ttum

SatellitePosition=ones(24,4);

figure(1);

drawearth(0);  

ttum=ones(24,4);

hold on;

DtoR=2*pi/360;

A1=[32.8  92.8  152.8  212.6  272.8  332.8];

drawsatelliteorbit;                                                            

ctable=[10 50 160 260;                                  %平均近地角

        80 180 220 320;

        10 130 250 340;

        50 150 170 300;

        100 210 310 340;

        120 140 240 350;];

    simple=1;

     for k=1:6

        A=A1(k)*DtoR;                                %升交点经度

        B=55*DtoR;                                   %轨道倾角

        for m=1:4

            C=ctable(k,m)*DtoR+timenow*2*pi/24;         %近地点幅角

              x=a*(cos(C)-e);

y=a*sqrt((1-e^2))*sin(C);

z=0*C;

 R1=[cos(A)    -sin(A)       0;

      sin(A)    cos(A)       0;

        0           0       1;];

R2=[1         0        0;

        0        cos(B)  -sin(B);

        0        sin(B)   cos(B);];

R3=[cos(C)    -sin(C)     0;

        sin(C)    cos(C)      0;

        0          0        1;];

    L1=length(E);

    R312=R1*R2*R3;

    Ans=R312*[x;y;z;];

    x1=Ans(1,:);

    y1=Ans(2,:);

    z1=Ans(3,:);

   drawsatellite(x1,y1,z1,k);                             

    temp=temp+1;

    SatellitePosition(temp,:)=[x1 y1 z1 1];

    ttum(temp,:)=[x1 y1 z1 1];

    hold on;

        end

     end

 %用余弦定理计算地心到用户和用户到卫星证件的夹角要是两者证件的夹角小于90°,就认为改卫星是不可见的.

     earthcenterpos=[0 0 0];

     userposition=[6400  3352  5410];               %假设一个用户的位置

     for k=1:24

         temp=SatellitePosition(k,1:3)-userposition;

         Dist1=temp*temp';

         temp=userposition-earthcenterpos;

         Dist2=temp*temp';

         temp=SatellitePosition(k,1:3)-earthcenterpos;

         Dist3=temp*temp';

         jiajiao=acos((Dist2+Dist3-Dist1)/2/sqrt(Dist3)/sqrt(Dist2));

         if(jiajiao>=pi/2)

             SatellitePosition(k,4)=0;

             %ttum(k,:)=SatellitePosition(k,1:3);

         end

     end

   %  ttum    

     figure(2)

    drawearth(0);                                    

     hold on;

     drawsatelliteorbit; 

         j=1;

      for k=1:6

          for m=1:4

         if(SatellitePosition(j,4)==1)

             tempx=SatellitePosition(j,1);

             tempy=SatellitePosition(j,2);

             tempz=SatellitePosition(j,3);

             drawsatellite(tempx,tempy,tempz,k);           

         end

          j=j+1;

          end

      end

     tempx=userposition(1);

     tempy=userposition(2);

     tempz=userposition(3);

     cube=100;

     boxplot3(tempx,tempy,tempz,cube,cube,cube,0); %标记出用户的位置

程序四(用可见卫星计算用户的位置)代码(mian3)

%用余弦定理计算地心到用户和用户到卫星证件的夹角要是两者证件的夹角小于90°,就认为该卫星是不可见的.

     earthcenterpos=[0 0 0];

     userposition=[6400  3352  5410];               %假设一个用户的位置

     for k=1:24

     SatellitePosition(k,:)=ttum(k,:);

     end

     for k=1:24

         temp=SatellitePosition(k,1:3)-userposition;

         Dist1=temp*temp';

         temp=userposition-earthcenterpos;

         Dist2=temp*temp';

         temp=SatellitePosition(k,1:3)-earthcenterpos;

         Dist3=temp*temp';

         jiajiao=acos((Dist3+Dist2-Dist1)/2/sqrt(Dist3)/sqrt(Dist2));

         if(jiajiao>=pi/2)

             SatellitePosition(k,4)=0;

         end

     end

     figure(1)

    drawearth(0);                                  

     hold on;

     drawsatelliteorbit; 

      tempx=userposition(1);

     tempy=userposition(2);

     tempz=userposition(3);

         cube=55;

         boxplot3(tempx,tempy,tempz,cube,cube,cube,7);            

         hold on; %先画出用户的位置,以便和后面的做比较

      j=1;

      for k=1:6

          for m=1:4

         if(SatellitePosition(j,4)==1)

             tempx=SatellitePosition(j,1);

             tempy=SatellitePosition(j,2);

             tempz=SatellitePosition(j,3);

             drawsatellite(tempx,tempy,tempz,k);            

         end

          j=j+1;

          end

      end

      tempx=userposition(1);

     tempy=userposition(2);

     tempz=userposition(3);

     hold on;

     SatellitePosition=[SatellitePosition;userposition 0];    

   %用变量caluserpos来记录迭代计算的结果.

     caluserpos=calculateuserposition(SatellitePosition);

     [m,n]=size(caluserpos);

     for(k=3:m);

         tempx=caluserpos(k,1);

         tempy=caluserpos(k,2);

         tempz=caluserpos(k,3);

         cube=50;

         boxplot3(tempx,tempy,tempz,cube,cube,cube,0);            

         hold on;

     end

以下是一个和上面程序配套使用的功能函数,把它命名为calculateuserposition.m。并且要和上面的程序放在一个文件夹当中。

function caluserposition=calculateuserposition(SatellitePosition)

global SatellitePosition             

 %单独运行此程序时候,为调用前面程序而得的satelliteposotion结果,应该声明satelliteposotion为全局变量,即应该在satelliteposition前面加上global

r1=6400;                                                    %地球半径

c=300000;

deltat=0.00001;

satelliteposnew=ones(1,3);

vissatnum=0;

calculateok=1;

for k=1:24

    if(SatellitePosition(k,4)==1)

        vissatnum=vissatnum+1;

        satelliteposnew=[satelliteposnew;SatellitePosition(k,1:3)];

    end%if

end%for

satelliteposnew(1,:)=[];

if(vissatnum<4)

    calculateok=0;

    caluserposition=[0 0 0 0];

    return

end

prange=ones(1,vissatnum);

userpos=SatellitePosition(25,1:3);

for n=1:vissatnum    prange(1,n)=sqrt((satelliteposnew(n,:)-userpos)*(satelliteposnew(n,:)-userpos)')+c*deltat;

end

calculaterecord=[0    0   0];

xyz0=[0 0 0];

deltat0=0;

wxyz=satelliteposnew;

Error=1000;

computertime=0;

while((Error>0.00001)&(computertime<1000))

    computertime=computertime+1;

    r=ones(1,vissatnum);

    for n=1:vissatnum

        r(1,n)=sqrt((wxyz(n,:)-xyz0)*(wxyz(n,:)-xyz0)')+deltat0*c;

    end

    deltap=r-prange;

    A=ones(vissatnum,3);

    for n=1:vissatnum

    A(n,:)=(wxyz(n,:)-xyz0)./r(1,n);

    end%for

    H=[A ones(vissatnum,1)];

    deltax=inv(H'*H)*H'*deltap';

    tempdeltax=deltax(1:3)

    Error=max(abs(tempdeltax));

    xyz0=xyz0+deltax(1:3,:)';

    if(computertime<1000)

        calculaterecord=[calculaterecord;xyz0];

    end

    deltat0=deltax(4,1)/(-c);

end%while

calculaterecord;

if(computertime==1000)

    caluserposition=[99999999999 99999999999 999999999999];

else

    caluserposition=[xyz0;calculaterecord];

end

你可能感兴趣的:(MATLAB,板块1:通信与信号处理)