GPS 定位技术与应用实验
——GPS 用户位置求解 Matlab 仿真
一、定位原理
GPS 用户对卫星 j 进行伪距测量,产生观测方程:
j
(
x
j
x
u
2
)
(
y
j
y
u
2
)
(
z
j
z
u
2
)
c
u
(1)
其中(xj, yj, zj)表示第 j 颗卫星的位置坐标;(xu, yu, zu)是用户的位置坐标,u 是用户接收机
钟与 GPS 系统时钟的相对误差。设一共观测到 N 颗卫星,则得到方程组:
x
(
1
x
(
2
x
u
x
u
2
2
)
)
(
(
y
1
y
2
2
y
u
y
u
)
)
2
2
z
(
1
z
(
2
z
u
z
u
)
)
2
c
u
c
u
(2)
1
2
N
(
x
N
x
u
2
)
(
y
N
y
u
2
)
(
z
N
z
u
2
)
c
u
定位的目的就是计算(xu, yu, zu)和u。
直接求解上述非线性方程组十分困难。可以采用牛顿迭代法这种常用的数值计算方
法,其中的关键思想是线性化及最小二乘法。具体过程如下:
对用户位置进行估计,得到估计位置坐标(x0, y0, z0),用(x, y, z)表示估计位置与
真实位置的偏移量,即
x
u
y
u
z
u
x
0
y
z
0
0
x
y
z
(3)
f x y z
(
,
u
,
u
u
)
(
x
j
x
u
2
)
(
y
j
y
u
2
)
(
z
j
z
u
2
)
,并把它在(x0, y0, z0)做一阶泰勒级数展
设
开得:
f x y z
(
,
u
,
u
u
)
f x y z
(
,
,
0
0
f x y z
(
,
,
0
0
)
0
)
0
0
f x y z
,
(
,
0
x
0
x
0
f x y z
,
,
(
x
j
)
0
x
x
)
)
0
y
0
f x y z
(
,
,
0
y
0
y
0
f x y z
,
(
,
y
j
y
)
0
)
0
z
(4)
0
f x y z
(
,
,
0
z
z
0
f x y z
,
(
,
z
0
j
0
0
z
)
0
0
因此,把对卫星 j 的观测方程线性化后得到:
0
0
0
0
j
f x y z
(
,
,
0
0
)
0
j
x
x
0
f x y z
,
(
,
0
0
x
)
0
j
y
y
0
f x y z
(
,
,
0
0
y
)
0
j
z
z
0
f x y z
(
,
,
0
0
z
c
u
(5)
)
0
令
j
a
xj
a
yj
a
zj
j
0
)
)
j
0
0
y
,
0
x
f x y z
,
(
0
x
0
f x y z
,
,
(
0
y
0
f x y z
,
(
,
0
z
0
f x y z
,
(
,
z
0
j
j
0
0
)
0
)
0
伪距观测方程变化为:
j
a
xj
x a
y a
z
yj
zj
c
u
把方程组(2)中的每个方程线性化,得到下面的线性方程组:
1
2
a
a
x
1
x
2
x a
x a
y a
z
y a
1
z
c
u
c
z
u
z
2
y
1
y
2
a
xN
x a
yN
y a
zN
z
c
u
N
把(8)写成矩阵形式,可得:
其中
ρ
1
2
,
N
H
x
1
2
a
a
x
a
xN
1
2
y
a
a
y
a
yN
ρ H x
1
1
,
1
x
x
y
z
c
u
。
1
2
z
a
a
z
a
zN
(6)
(7)
(8)
(9)
按照上述方法,求解非线性方程组(2)的问题被转化为求解线性方程组(见(8)和(9))。
如果只能观察到 4 颗卫星,即 N=4,(8)和(9)是个根据 4 条线性方程求解 4 个未知
数的问题,具有唯一解:
x H ρ
1
(10)
如果能观察到的卫星数量大于 4,即 N>4,求解(8)和(9)是个超定方程组(即方程数量大
于未知数的数量),此时需要使用最小二乘法求,解的形式为:
x H H H ρ
1
(
)
T
T
(11)
求出(x, y, z)后,使用(3)便求出用户坐标。
迭代:因为线性化使用了一阶泰勒级数展开近似,这种近似只有当估计坐标(x0, y0, z0)
非常接近真实坐标(xu, yu, zu)时才有效。如果(x, y, z)太大,需要用本次计算得出的坐
标(xu, yu, zu)作为下一次计算的估计坐标(x0, y0, z0),重新迭代上述计算过程,直到计算得
到的(x, y, z)的值比较小为止。
二、Matlab 程序代码
下面 Matlab 程序完成利用伪距测量用户位置的 Matlab 仿真计算。
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)]; %卫星位置
%卫星位置坐标,每一行数据的前三列分别表示卫星的X、Y、Z坐标值,第4列数据表示本颗卫星是
否可见,1为可见,0为不可见。
UserPosition=[6400 0 0 ];
%用户真实位置(注意:定位程序并未用到此参数)
Prange=CalculatePseudoRange(SatellitePosition, UserPosition);
%函数CalculatePseudoRange用于计算机模拟伪距测量结果,计算结果Prange是一个矢量,其
中的不同元素表示对不同卫星的伪距测量结果
[CalUserPosition, OK]=CalculateUserPosition2(SatellitePosition, Prange);
%调用函数CalculateUserPosition2,进行定位计算,计算CalUserPosition中包含位置计
算结果。
2、伪距测量模拟函数 CalculatePseudoRange
function Prange=CalculatePseudoRange(SatellitePosition,UserPosition) %计
算机模拟伪距测量
c=3e5; %光速,单位:km/s;
DeltaT=1e-4; %钟差为 1e-4 数量级秒,假设卫星钟间时钟一致,DeltaT=Tu-Ts;钟差不
宜超过 3e-4,否则不收敛;
VisSatNum=0;
%首先找出可以观测到的卫星数量
SatellitePosNew=[];
for k=1:24
if SatellitePosition(k,4)==1
VisSatNum=VisSatNum+1;
SatellitePosNew=[SatellitePosNew; SatellitePosition(k,1:3)];
end %if
end %for
Prange=ones(1,VisSatNum);
%求解用户接收机收到的伪距信息
for n=1:VisSatNum
Prange(1,n)=sqrt(
(SatellitePosNew(n,:)-UserPosition)' + c*DeltaT );
end
(SatellitePosNew(n,:)-UserPosition)
*
3、定位计算函数 CalculateUserPosition2
[CalUserPosition,
function
CalculateOK]=CalculateUserPosition2(SatellitePosition,Prange)
%输入参数:
%卫星位置坐标SatellitePosition,对每一颗可见卫星的伪距测量结果Prange
%输出参数:
%用户位置坐标:CalUserPosition,是一个矩阵,第一行表示最终定位结果,后面几行显示定位
计算的中间过程结果;
%参数CalculateOK表示用户位置计算是否成功,1为成功,0为失败;
%该程序用线性化方法求解四个或多个卫星的伪距、钟差方程,具体算法见课本
%假设我们接收到4个或者更多伪距后,有如下方程
%PR = sqrt( (xi-x)^2 + (yi-y)^2 + (zi-z)^2 ) + ct , i=1,2,3,4
%使用最小二乘法求解
c=3e5; %光速,单位:km/s;
DeltaT=1e-3; %钟差为 1e-4 数量级秒,假设卫星钟间时钟一致,DeltaT=Tu-Ts;钟差不
宜超过 3e-4,否则不收敛;
VisSatNum=0;
CalculateOK=1;
%首先找出可以接收到的卫星,多于4颗继续运算,否则返回
SatellitePosNew=[];
for k=1:24
if SatellitePosition(k,4)==1
VisSatNum=VisSatNum+1;
SatellitePosNew=[SatellitePosNew; SatellitePosition(k,1:3)];
end
end
if VisSatNum<4 %不足 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)' ) + DeltaT0*c;
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 %while
if ComputeTime==1000
CalUserPosition=[0 0 0];
CalculateOK=0;
else
CalUserPosition=[XYZ0; CalculateRecord];
end
三、实验内容
1、熟悉 Matlab 编程的语法、环境。
2、定位程序是一个迭代运算程序,卫星坐标和用户坐标由上述语句给出,运行程序,
那么
出具体程序语句。)
a) 写出最终算出的用户坐标结果(要求精确到小数点后 4 位);
b) 写出程序的迭代计算次数;
c) 通过编程,计算出每次迭代计算的中间结果与用户真实位置的距离。(要求:给
提示:CalculateUserPosition2 程序返回的变量 CalUserPosition 包含了每一次迭代计算
的中间结果。设用户真实坐标为(xu, yu, zu),迭代中间结果的坐标为(xc, yc, zc),则两者的
距离为:
(
x
u
x
c
2
)
(
y
u
y
c
2
)
(
z
u
z
c
2
)
,这反映了计算结果的误差。
3、把用户真实坐标设为(你的学号后四位+4000, 0, 0),保持卫星坐标不变,重复上述的
a)、b)、c)三步,分别给出程序运行结果。
四、思考题
1. 程序中的坐标是在哪个坐标系下的坐标?坐标的单位是什么?
2. 在实验中,卫星的位置坐标是已知量。问:在实际使用中,用户如何获知卫星的坐
标信息?
3. 定位计算,除了要知道卫星的坐标,还要知道伪距信息。问:a)什么叫伪距?b)伪
距信息如何获得?
4. 程序 CalculateUserPosition2 中,语句“XYZ0=[0 0 0];”给用户坐标附的初始值为(0,
0,0)。问(0,0,0)是否最佳的用户坐标初始值?有更好的用户坐标初始值吗?
为什么?
5. 程 序 CalculateUserPosition2 中 , while 语 句 的 判 断 条 件 为 “ (Error>1) &&
(ComputeTime<1000)”,即要求两个判断条件同时成立才循环,问:a)判断条件
Error>1 是什么意思?解释其物理含义。b)判断条件 ComputeTime<1000 是什么意
思?解释其在程序中的作用。
6. 程序 CalculateUserPosition2 中,语句“A(n,:)=(Wxyz(n,:)-XYZ0)./R(1,n);”是什么意
思?请用定位原理中的数学公式来解释。
7. 程序 CalculateUserPosition2 中,语句“XYZ0=XYZ0+DeltaX(1:3,:)';”是什么意思?
请用定位原理中的内容解释。
8. 指出程序需要改善的地方。
实验报告内容要求
1、结合 Matlab 程序叙述 GPS 的定位原理。
2、给出实验内容第 2、3 步的结果。
3、回答思考题。