GPS大作业
学院:电子工程学院
班级:
学号:
GPS定位技术与应用实验
——GPS用户位置求解Matlab 一、定位原理
GPS用户对卫星j进行伪距测量,产生观测方程:
(1)
其中(xj,yj,zj)表示第j颗卫星的位置坐标;(xu,yu,zu)是用户的位置坐标,是用户接收机钟与GPS系统时钟的相对误差。
设一共观测到N颗卫星,则得到方程组:
(2)
定位的目的就是计算(xu,yu,zu)和。
直接求解上述非线性方程组十分困难。
可以采用牛顿迭代法这种常用的数值
计算方法,其中关键思想是线性化及最小二乘法。
具体过程如下:
对用户位置进行估计,得到估计位置坐标(x0,y0,z0),用表示估计位置与真实位置的偏移量,即
(3)
设,并把它在(x0,y0,z0)做一阶泰勒级数展开得:
(4)
因此,把卫星j的观测方程线性化后得到:
(5)
令
(6)
伪距观测方程变化为:
(7)
把方程组(2)中的每个方程组线性化,得到下面的线性方程组:
(8)
把(8)写成矩阵形式,可得:
(9)
其中
按照上述方法,求解非线性方程组(2)的问题被转化为求解线性方程组。
如果能观测到的卫星数量大于4,求解(8)(9)是个超定方程组,此时需要使用最小二乘法。
迭代:因为线性化使用了一阶泰勒级数展开近似,这种近似只有当估计坐标非常接近真实坐标时才有效。
如果差距太太,需要用本次计算得出的坐标作为下次计算的估计坐标,重新迭代上述计算过程,知道计算得到的
比较小为止。
二、程序代码
1、主程序
SatellitePosition=[17746 17572 7365 1;
12127 -9774 21091 1;
13324 -18178 14392 1;
14000 -13073 19058 1;
19376 -15756 -7365 1;
zeros(19, 4)];
UserPosition=[6400 0 0 ];
Prange=CalculatePseudoRange(SatellitePosition, UserPosition); [CalUserPosition, OK]=CalculateUserPosition2(SatellitePosition, Prange);
2、伪距测量模拟函数
function Prange=CalculatePseudoRange(SatellitePosition,UserPosition)
c=3e5;
DeltaT=1e-4;
VisSatNum=0;
SatellitePosNew=[];
for k=1:24
if SatellitePosition(k,4)==1
VisSatNum=VisSatNum+1;
SatellitePosNew=[SatellitePosNew; SatellitePosition(k,1:3)];
end
end
Prange=ones(1,VisSatNum);
for n=1:VisSatNum
Prange(1,n)=sqrt((SatellitePosNew(n,:)-UserPosition)*(SatellitePosNew(n,:)-Us erPosition)')+c*DeltaT ;
end
3、定位计算函数
function
[CalUserPosition,CalculateOK]=CalculateUserPosition2(SatellitePosition,Prange )
c=3e5;
DeltaT=1e-4;
VisSatNum=0;
CalculateOK=1;
SatellitePosNew=[];
for k=1:24
if SatellitePosition(k,4)==1
VisSatNum=VisSatNum+1;
SatellitePosNew=[SatellitePosNew; SatellitePosition(k,1:3)];
end
end
if VisSatNum<4
CalculateOK=0;
CalUserPosition=[0 0 0];
return
end
XYZ0=[0 0 0];
CalculateRecord=XYZ0;
DeltaT0=0;
Wxyz=SatellitePosNew;
Error=1000;
ComputeTime=0;
while (Error>0.01) && (ComputeTime<1000)
ComputeTime=ComputeTime+1;
R=ones(1,VisSatNum);
for n=1:VisSatNum
R(1,n)=sqrt( (Wxyz(n,:)-XYZ0) * (Wxyz(n,:)-XYZ0)' );
end%for
DeltaP=R-Prange;
A=ones(VisSatNum,3);
for n=1:VisSatNum
A(n,:)=(Wxyz(n,:)-XYZ0)./R(1,n);
end
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 ComputeTime<10
CalculateRecord=[CalculateRecord; XYZ0];
end
DeltaT0=DeltaX(4,1)/(-c);
end
if ComputeTime==1000
CalUserPosition=[0 0 0];
CalculateOK=0;
else
CalUserPosition=[XYZ0; CalculateRecord];
End
三、仿真结果
1、a)、最终运算结果为
[6400.0000-8.18361.1716]
b)、程序迭代运算次数为4次。
c)d=sqrt((CalUserPosition(n,1)-6400)^2+(CalUserPosition(n,2)-0)^2+(CalUserP osition(n,3)-0)^2) n=[3,4,5]
第一次迭代d =1.0306e+03
第二次迭代d=16.4265
第三次迭代d=0.0053
第四次迭代d=5.5619e-10
2、a)、最终运算结果为
[4004.9999 7.0325 -1.00754]
b)、程序迭代运算次数为4次。
c)、
d=sqrt((CalUserPosition(n,1)-4005)^2+(CalUserPosition(n,2)-0)^2+(CalUserPosit ion(n,3)-0)^2) n=[3,4,5,6]
第一次迭代d =409.0351
第二次迭代d=3.4830
第三次迭代d= 2.7533e-004
第四次迭代d=3.2852e-011
四、思考题
1、WGS-84坐标系,单位为Km。
2、通过导航电文计算出行星位置
3、a)、定位采用的是被动式单程测距。
它的信号发射书机由卫星钟确定,收到时刻是由接收机钟确定,这就在测定的卫星至接收机的距离中,不可避免地包含着两台钟不同步的误差和电离层、对流层延迟误差影响,它并不是卫星与接受机之间的实际距离,所以称之为伪距。
b)、可通过测量PRN的码相位而得到伪距,通过纪录卫星信号传播到用户所经历的时间 ,再将其乘以光速得到伪距
4、不是,有。
因为线性化使用了一阶泰勒级数展开近似,这种近似只有当估计坐标(x0, y0, z0)非常接近真实坐标(xu, yu, zu)时才有效。
如果
(?x, ?y, ?z)太大,需要用本次计算得出的坐标(xu, yu, zu)作为下一次计算的估计坐标(x0, y0, z0),重新迭代上述计算过程,直到计算得到的
(?x, ?y, ?z)的值比较小为止。
5、a)、牛顿迭代收敛所需要的精度。
若大于,说明还需继续运算,直到小于预先设定的门限值。
b)、防止程序计算死循环,若computetime>=1000,则跳出程序,并认为用户计算位置失败。
6、矩阵A即非线性方程组线性化之后的线性方程组的系数矩阵。
7、更新接收机的位置坐标和钟差值。
8、无。