车辆行驶过程中如何获得准确位置信息?——GNSS PVTPOS 算法(1)
2026/9/11 16:10:54 网站建设 项目流程

PVT代表的是位置(position)、速度(velocity)、时间(time)的缩写,即通过该算法可以获得接收机的这三个信息量,其核心思想是:以全球卫星导航系统(GNSS,如GPS、北斗)为基础,通过LSQ/KALMAN算法进行最优估计,从而在各种环境下输出连续、可靠、准确的定位结果。

在之前文章中提到过伪距的计算公式,在此可以看出伪距、接收机位置rcv_pos、接收机钟差clkerr_rcv与卫星位置sat_pos、卫星钟差clkerr_sat的数学关系。

不论是基于冷启动还是热启动,伪距量可以通过初始化本地时间减去帧同步获得的发射时间得到,该信息量包含了所有的误差项,卫星位置和钟差可以通过星历解算得到,电离层误差和对流层等误差项可以通过常规建模消除掉,最终通过一定的数学方法求解得到接收机位置和时间信息。

1. 最小二乘估计算法

最小二乘估计算法(Least squares estimation,LSQ)是一种数学优化技术,用于在观测数据多于未知数(即方程数多于变量数)且存在误差的情况下,使得所有观测方程的残差平方和最小的情况下寻找未知数的最优解。

GNSS导航定位中所使用的伪距方程是关于位置pos+钟差clkerr的一个非线性方程(存在平方根),所以第一步需要将其线性化,线性化所使用的工具是泰勒展开公式,即在一个已知的初始起点(x0、y0、z0,clkerr0)对该函数进行一阶泰勒展开计算

对上述公式的偏导数进行计算:

在初始点(x0、y0、z0)处,这个表达式变为:

x、y、z的推导公式一样,则对于y、z的表达式为:

对于钟差(单位:秒)来说,位置信息和其求导没有关系,只和光速有关,假设该部分求解的钟差单位为m的话,求导的关系直接为1,为保持未知参数单位的一致性,后续将钟差的单位都默认为m;

综上,可以将伪距方程转换为:

即:

可以转换为经典的伪距解算方程:

(1)

此处,伪距方程的左边为伪距残差,H为转换矩阵,为求解的未知量,但是此时的仅仅为一个相对于(x0、y0、z0,clkerr0)的变化量,叠加后形成的(x1、y1、z1,clkerr1)才为最终的结果输出。

1.1 伪距残差的计算

伪距残差,是实际观测到的原始伪距与当前状态估计出的理论伪距之间的差异。

(1)原始伪距=(本地时间tow-发射时间transmite)*C,其包含所有误差的伪距。

(2)模型预测值=卫地距r 和钟差部分(clkerr_rcv-clkerr_sat)以及各项传播时延误差项;

,对于多次迭代计算,该数值部分中模型误差部分保持不变,所以在整个LSQ迭代前端可以直接将该数值计算好,便于后续计算。

各项传播误差项除了电离层误差、对流层误差外,一般还有TGD误差以及地球自转影响误差。

1.1.1 电离层模型误差

电离层是地球上空约60-1000公里高度的大气层,受太阳辐射影响,部分气体分子被电离,形成大量自由电子和离子。当GNSS卫星信号穿过电离层时,与自由电子相互作用,导致信号传播路径和速度改变,其对信号的影响与频率的平方成反比。电离层模型是基于经验模型建立的,常用的有Klobuchar模型、BDS格网点电离层模型、北斗三代的BDGIM电离层模型

#define IONOOPT_OFF 0 /* ionosphere option: correction off */ #define IONOOPT_BRDC 1 /* ionosphere option: broadcast model */ #define IONOOPT_SBAS 2 /* ionosphere option: SBAS model */ #define IONOOPT_IFLC 3 /* ionosphere option: L1/L2 or L1/L5 iono-free LC */ #define IONOOPT_EST 4 /* ionosphere option: estimation */ #define IONOOPT_TEC 5 /* ionosphere option: IONEX TEC model */ #define IONOOPT_QZS 6 /* ionosphere option: QZSS broadcast model */ #define IONOOPT_LEX 7 /* ionosphere option: QZSS LEX ionospehre */ #define IONOOPT_STEC 8 /* ionosphere option: SLANT TEC model */ /* ionosphere model ------------------------------------------------------------ * compute ionospheric delay by broadcast ionosphere model (klobuchar model) * args : gtime_t t I time (gpst) * double *ion I iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} * double *pos I receiver position {lat,lon,h} (rad,m) * double *azel I azimuth/elevation angle {az,el} (rad) * return : ionospheric delay (L1) (m) *-----------------------------------------------------------------------------*/ extern double ionmodel(gtime_t t, const double *ion, const double *pos, const double *azel) { const double ion_default[]={ /* 2004/1/1 */ 0.1118E-07,-0.7451E-08,-0.5961E-07, 0.1192E-06, 0.1167E+06,-0.2294E+06,-0.1311E+06, 0.1049E+07 }; double tt,f,psi,phi,lam,amp,per,x; int week; if (pos[2]<-1E3||azel[1]<=0) return 0.0; if (norm(ion,8)<=0.0) ion=ion_default; /* earth centered angle (semi-circle) */ psi=0.0137/(azel[1]/PI+0.11)-0.022; /* subionospheric latitude/longitude (semi-circle) */ phi=pos[0]/PI+psi*cos(azel[0]); if (phi> 0.416) phi= 0.416; else if (phi<-0.416) phi=-0.416; lam=pos[1]/PI+psi*sin(azel[0])/cos(phi*PI); /* geomagnetic latitude (semi-circle) */ phi+=0.064*cos((lam-1.617)*PI); /* local time (s) */ tt=43200.0*lam+time2gpst(t,&week); tt-=floor(tt/86400.0)*86400.0; /* 0<=tt<86400 */ /* slant factor */ f=1.0+16.0*pow(0.53-azel[1]/PI,3.0); /* ionospheric delay */ amp=ion[0]+phi*(ion[1]+phi*(ion[2]+phi*ion[3])); per=ion[4]+phi*(ion[5]+phi*(ion[6]+phi*ion[7])); amp=amp< 0.0? 0.0:amp; per=per<72000.0?72000.0:per; x=2.0*PI*(tt-50400.0)/per; return CLIGHT*f*(fabs(x)<1.57?5E-9+amp*(1.0+x*x*(-0.5+x*x/24.0)):5E-9); }

RTKLIB中介绍了很多电离层模型,在量产算法的使用最多、最基础的还是Klobuchar模型,其主要依据8个参数计算接收机至卫星连线与电离层交点的电离层垂直延迟改正,通过导航电文播发,其为一个经验模型,基于“电离层延迟在地方时夜间相对稳定且较小,在白天(尤其是中午前后)达到最大,并随纬度升高而总体减弱”。

注意点:
(1)根据Klobuchar模型计算的为L1/B1I频点的电离层误差,假设要计算B2I频点,需要乘以频率系数:

(2)由于其对于全球范围内建模,它在某些特定区域(如低纬度)的表现可能差于中纬度,所以在使用双频接收机的话,可以直接使用无电离层组合,几乎可以完全消除(>99%)一阶电离层延迟,Klobuchar模型不再需要

如果对电离层误差或者高程信息严格要求,代码本身空间足够的情况下,可以使用BDS 格网点电离层模型。电离层格网覆盖范围为东经70~145 度,北纬7.5~55 度,按经纬度5×2.5
度进行划分,形成320 个格网点。每个格网点电离层信息包括格网点垂直延迟(dτ)和误差指数(GIVEI),目标就是将接收机点划分到以4个点为边界的网格中,从而计算电离层模型误差,
具体可以参见BDS ICD文件。

TEC计算公式:

总电子含量:指在截面为1平方米的圆柱体内,沿信号从卫星到接收机路径上的总自由电子数。卫星信号传播路径上的总电子含量TEC是利用电离层延迟的色散特性(与频率平方成反比)。使用同一卫星同一历元的两个频率的观测值进行组合,常用单位为TECU(1TECU=10^16 个电子/平方米)。

双频伪距公式:

以及TEC和I的关系:

则:

这里的TGD如何处理是该公式的又一重点,TEC是斜路径上的电子含量,一般会转换为VTEC存储计算。

是信号路径在电离层单层模型穿刺点处的天顶角。

VTEC是Septentrio和天宝电离层闪烁接收机的计算原理,但是TEC计算出来为一个很大的数值,一般以滑动窗(60个历元)取其数值与均值变化的差值或者std数值来判断是否发生电离层闪烁。

1.1.2 对流层模型误差

对流层是地面以上约0-12公里的大气层。信号在此传播的延迟由干延迟湿延迟两部分组成,干延迟 (约90%):主要由非水汽的干空气(氮气、氧气等)引起。这部分延迟比较稳定,可以通过地面气压很好地预测和建模。湿延迟 (约10%):主要由大气中的水汽引起。水汽时空分布极不均匀、变化剧烈(分钟级、公里级),是主要的误差来源。常见的模型如 Saastamoinen、Hopfield、UNB模型、UNB3m等。前两者需要实测气象参数的模型,后两者不需要实测气象参数的模型只需要提供高程、纬度和年积日即可计算对流层延迟量。

RTKLIB中介绍了两种对流层模型,量产算法中使用比较多的还是Saastamoinen模型。

/* troposphere model ----------------------------------------------------------- * compute tropospheric delay by standard atmosphere and saastamoinen model * args : gtime_t time I time * double *pos I receiver position {lat,lon,h} (rad,m) * double *azel I azimuth/elevation angle {az,el} (rad) * double humi I relative humidity * return : tropospheric delay (m) *-----------------------------------------------------------------------------*/ extern double tropmodel(gtime_t time, const double *pos, const double *azel, double humi) { const double temp0=15.0; /* temparature at sea level */ double hgt,pres,temp,e,z,trph,trpw; if (pos[2]<-100.0||1E4<pos[2]||azel[1]<=0) return 0.0; /* standard atmosphere */ hgt=pos[2]<0.0?0.0:pos[2]; pres=1013.25*pow(1.0-2.2557E-5*hgt,5.2568); temp=temp0-6.5E-3*hgt+273.16; e=6.108*humi*exp((17.15*temp-4684.0)/(temp-38.45)); /* saastamoninen model */ z=PI/2.0-azel[1]; trph=0.0022768*pres/(1.0-0.00266*cos(2.0*pos[0])-0.00028*hgt/1E3)/cos(z); trpw=0.002277*(1255.0/temp+0.05)*e/cos(z); return trph+trpw; }

上面也提到了UNB3模型,其核心思想与Klobuchar模型类似:用一个预先定义好的、参数化的全球平均气候模型,为全球任意地点的用户提供对流层延迟估计,而用户无需输入任何实时气象数据。其并不是一个全新的物理公式,而是一个“Saastamoinen计算框架 + 内置全球平均气象参数数据库”的组合,具体参见《周命端,郭际明,孟祥广.GPS对流层延迟改正UNB3模型及其精度分析[J]》的详细介绍。

1.1.3地球自转改正

在信号从卫星传播到接收机的几十毫秒内,地球坐标系发生了旋转,导致基于“信号发射时刻”坐标系计算的卫星位置,与“信号接收时刻”的坐标系不再对齐,从而引入了一个几何偏差,具体计算公式为:

为地球自转角速度,C为光速,(x_sat、y_sat)为卫星位置,(x_rcv、y_rcv)为接收机位置,RTKLIB中直接将其作为卫地距的修正,直接附加在r中修改掉,这也是一种常用的方式。

/* geometric distance ---------------------------------------------------------- * compute geometric distance and receiver-to-satellite unit vector * args : double *rs I satellilte position (ecef at transmission) (m) * double *rr I receiver position (ecef at reception) (m) * double *e O line-of-sight vector (ecef) * return : geometric distance (m) (0>:error/no satellite position) * notes : distance includes sagnac effect correction *-----------------------------------------------------------------------------*/ extern double geodist(const double *rs, const double *rr, double *e) { double r; int i; if (norm(rs,3)<RE_WGS84) return -1.0; for (i=0;i<3;i++) e[i]=rs[i]-rr[i]; r=norm(e,3); for (i=0;i<3;i++) e[i]/=r; return r+OMGE*(rs[0]*rr[1]-rs[1]*rr[0])/CLIGHT; }

1.1.4 TGD修正

星上设备时延(time group delay)指从卫星的时间基准到发射天线相位中心的时延,即卫星上不同频率信号从卫星钟参考点到天线相位中心的传播时间存在差异。如果是双频甚至三频观测量一起参与定位的话,需要将其拉到同一时间轴上解算,该数值必须消除掉。

(1)BDS:以B3I 信号为基准,B1I、B2I的TGD1、TGD2在D1/D2的导航电文中播发,用于补偿B1C 导频分量、B2a 导频分量的时延差TGDB1Cp 和TGDB2ap 在B-CNAV1 电文中播发,用于补偿B2b 信号 I 支路的时延差TGDB2bI在B-CNAV3 电文中播发,即:

(2)GPS:L1CA导航电文中播发的是L1P和L2P之间的群延迟TGD,

具体也可参考:《广伟,李玮,袁海波.TGD改正对北斗授时性能的影响[C]》

(3)GALILEO:INAV中播发BGD(E1,E5A)和BGD(E1,E5B),FNAV中播发BGD(E1,E5A),假设以E1为基础计算E5A和E5B,计算公式为:

代码如下:

#define SYS_NONE 0x00 /* navigation system: none */ #define SYS_GPS 0x01 /* navigation system: GPS */ #define SYS_GAL 0x08 /* navigation system: Galileo */ #define SYS_QZS 0x10 /* navigation system: QZSS */ #define SYS_CMP 0x20 /* navigation system: BeiDou */ #define CODE_NONE 0 /* obs code: none or unknown */ #define CODE_L1C 1 /* obs code: L1C/A,G1C/A,E1C (GPS,GLO,GAL,QZS,SBS) */ #define CODE_L1P 2 /* obs code: L1P,G1P (GPS,GLO) */ #define CODE_L1B 11 /* obs code: E1B (GAL) */ #define CODE_L2C 14 /* obs code: L2C/A,G1C/A (GPS,GLO) */ #define CODE_L2P 19 /* obs code: L2P,G2P (GPS,GLO) */ #define CODE_L5Q 25 /* obs code: L5/E5aQ (GPS,GAL,QZS,SBS) */ #define CODE_L7I 27 /* obs code: E5bI,B2I (GAL,CMP) */ #define CODE_L7Q 28 /* obs code: E5bQ,B2Q (GAL,CMP) */ #define CODE_L2I 40 /* obs code: B1I (CMP) */ #define CODE_L6I 42 /* obs code: B3I (CMP) */ #define CODE_L1P 50 /* obs code: B1C (CMP) * #define CODE_L5P 51 /* obs code: B2A (CMP) * #define CODE_L7P 52 /* obs code: B2B (CMP) * double tgd[5]; /* group delay parameters */ /* GPS/QZS:tgd[0]=TGD */ /* GAL :tgd[0]=BGD E5a/E1,tgd[1]=BGD E5b/E1 */ /* CMP :tgd[0]=BGD1,tgd[1]=BGD2 tgd[2]=B1C BGD,tgd[3]=B2A BGD,tgd[4]=B2B BGD*/ double get_sys_tgd(int sys, int code_id, eph_t gbg_eph){ double tgd=0.0,gamma; if(SYS_GPS == sys || SYS_QZS== sys ){ if(CODE_L1C == code_id || CODE_L1P == code_id) tgd=gbg_eph.tgd[0]; if(CODE_L2C == code_id || CODE_L2P == code_id){ gamma=(FREQ1/FREQ2)^2; tgd=gamma*gbg_eph.tgd[0]; } } else if(SYS_CMP == sys){ if(CODE_L2I == code_id) tgd=gbg_eph.tgd[0]; else if(CODE_L7I == code_id) tgd=gbg_eph.tgd[1]; else if(CODE_L1P == code_id) tgd=gbg_eph.tgd[2]; else if(CODE_L5P == code_id) tgd=gbg_eph.tgd[3]; else if(CODE_B7b == code_id) tgd=gbg_eph.tgd[4]; } else if(SYS_GAL== sys){ if(CODE_L1B == code_id) tgd=gbg_eph.tgd[0]; else if(CODE_L5Q == code_id){ gamma=(FREQ1/FREQ5)^2; tgd=gamma*gbg_eph.tgd[0]; } else if(CODE_L7Q == code_id){ gamma=(FREQ1/FREQ7)^2; tgd=gamma*gbg_eph.tgd[1]; } } return tgd; }

1.2 LSQ迭代过程

对于公式(1),伪距残差l和转换矩阵H已知,对于解算函数对其求解x:

(2)

RTKLIB中LSQ解算代码:

/* least square estimation ----------------------------------------------------- * least square estimation by solving normal equation (x=(A*A')^-1*A*y) * args : double *A I transpose of (weighted) design matrix (n x m) * double *y I (weighted) measurements (m x 1) * int n,m I number of parameters and measurements (n<=m) * double *x O estmated parameters (n x 1) * double *Q O esimated parameters covariance matrix (n x n) * return : status (0:ok,0>:error) * notes : for weighted least square, replace A and y by A*w and w*y (w=W^(1/2)) * matirix stored by column-major order (fortran convention) *-----------------------------------------------------------------------------*/ extern int lsq(const double *A, const double *y, int n, int m, double *x, double *Q) { double *Ay; int info; if (m<n) return -1; Ay=mat(n,1); matmul("NN",n,1,m,1.0,A,y,0.0,Ay); /* Ay=A*y */ matmul("NT",n,n,m,1.0,A,A,0.0,Q); /* Q=A*A' */ if (!(info=matinv(Q,n))) matmul("NN",n,1,n,1.0,Q,Ay,0.0,x); /* x=Q^-1*Ay */ free(Ay); return info; }

1.2.1 退出LSQ迭代的条件是什么?

从伪距方程的线性化方程来讲,其主要是基于初始点做了一阶展开,后续高阶阶数并未展开,即当前的整个方程具有一定近似性,只有当每次迭代出的结果足够小的情况下的时候,才能一步步的消除由于泰勒展开所丢失的高阶部分,所以大部分算法中要求的输出门限是:的条件下终止整个循环,可以举例说明理解为:

迭代结果泰勒展开的起始点
第一次10102010初始点
第二次0.10.10.20.1第一次
第三次0.00020.00020.00040.0002第二次
结束

可以理解在一次大的LSQ解算过程中,每一次迭代的结果都作为下一次泰勒展开的初始点,当迭代出的结果越来越小的时候,说明前一次和本次的结果相近,在考虑到耗时以及精度的前提下可以结束,本次LSQ结束

在考虑迭代出满足条件的结果之前,还需要考虑迭代过程耗时和运行效率的影响,即一次LSQ迭代循环里最多可以迭代运算几次,一般情况下在卫星数量少或者首次定位的时候,迭代次数≤10,后续的迭代次数≤5。

1.2.2 LSQ中相关计算

(1)加权最小二乘算法

导航接收机所接收到的卫星信号传播路径不同,其所受到的各部分误差影响也不同,针对这一情况,在实际运算中会对每一个卫星根据高度角、载噪比、基带参数、系统型号分配不一样的权重,即卫星定权P阵,引入最小二乘解算中,即加权最小二乘算法,具体公式为:

(3)

RTKLIB.C lsq() /* weight by variance */ for (j=0;j<nv;j++) { sig=sqrt(var[j]); v[j]/=sig; for (k=0;k<NX;k++) H[k+j*NX]/=sig; }

(2)LSQ计算指标

验前伪距残差:

一般使用验前伪距残差来做剔星/定权操作,即在进入LSQ之前,基于上一个定位点和本次伪距量计算出所有观测量的伪距残差,假设本环节存在粗差情况,就可以剔除,可以作为是一个预处理环节。GNSS模组上车路测环节,会配备一个高精度POS设备,可以依据该高精结果反算伪距残差,来做基础校验。

验后伪距残差:

验前剔星只是作为一个预处理环节,在真正LSQ环节中,第一次迭代出,可以依据更新本地位置,再重新计算伪距残差部分,依据该部分再次做粗差探测,剔除异常观测量。

(3)LSQ质量控制

下面介绍的相关指标都可作为迭代结果的有效性判断指标,输出到RTK侧或者INS侧来判断当前定位是否有效。

残差平方和(RSS):

方差:

一般来说,在LSQ迭代后伪距残差较小,所以粗略门限可以设置为:

粗差探测:极大值删除法、聚类法、中值检验法、标准化残差法。

当前阶段的难点:伪距残差呈现两个极端聚类情况,分不清到底哪端到底是可以使用的,是正确的?会引入更多的剔星方法、基于高精计算残差、考虑当前定权是否分配合理,如果都无法解决,就尝试分别使用一端做定位,查看定位结果,再考虑如何处理。

残差检验方法:

卡方检验是在LSQ中用于检验伪距残差的合理性(RTKLIBchisqr()函数),即比较残差平方和与理论方差来评估定位结果的可靠性,当残差平方和超过基于自由度的卡方分布临界值,则标记本次迭代结果不正常,不采用本次结果。卡方检验中的显著性水平影响整个结果的判断,在衡量伪距、载波、多普勒的定位、定速结果的时候要作以区分,以及在针对不同运动场景、运动状态下也要做好区分。

问题:简单的高度角定权对卡方检验是否有影响?

如果只用简单高度角分段方法或正弦模型定权,即高度角越来越大权重越高,其改变了残差的相对贡献,当方差大→权大(高高度角)→贡献变小,当方差小→权小(高度角低)→贡献越小, 会模糊残差对卡方检验的贡献,计算的定权残差平方和可能会偏离理论期望,导致卡方检验做出错误的判断。

协方差矩阵:

一般会直接转为标准差的方式评价,即,可以看出Q阵的每个元素代表的都是未知数之间的作用关系,一般只使用对角线元素,即:

在LSQ迭代过程或者结束后,也会对std的数值进行判断,是否满足条件。由于P权重对于Q的影响较大,所以在定权的时候要做好衡量,在定位异常/STD异常的时候要去判断权重是否分配合理(是否有接近0的情况,避免出现nan/inf数值)。

注意点:该处使用的是ECEF坐标系,如果需要使用ENU坐标系,则需要做一定转换。

//RTKLIB rtkcmn.c ECEF坐标(xyz)转换为ENU坐标(llh) extern void ecef2pos(const double *r, double *pos) { double e2=FE_WGS84*(2.0-FE_WGS84),r2=dot(r,r,2),z,zk,v=RE_WGS84,sinp; for (z=r[2],zk=0.0;fabs(z-zk)>=1E-4;) { zk=z; sinp=z/sqrt(r2+z*z); v=RE_WGS84/sqrt(1.0-e2*sinp*sinp); z=r[2]+v*e2*sinp; } pos[0]=r2>1E-12?atan(z/sqrt(r2)):(r[2]>0.0?PI/2.0:-PI/2.0); pos[1]=r2>1E-12?atan2(r[1],r[0]):0.0; pos[2]=sqrt(r2+z*z)-v; } //转换矩阵E(R) extern void xyz2enu(const double *pos, double *E) { double sinp=sin(pos[0]),cosp=cos(pos[0]),sinl=sin(pos[1]),cosl=cos(pos[1]); E[0]=-sinl; E[3]=cosl; E[6]=0.0; E[1]=-sinp*cosl; E[4]=-sinp*sinl; E[7]=cosp; E[2]=cosp*cosl; E[5]=cosp*sinl; E[8]=sinp; }

精度衰减因子dop数值计算:

dop值是衡量卫星几何构型对定位精度影响的无量纲标量,描述卫星与GNSS接收机之间的空间几何关系如何放大或缩小观测误差。当卫星卫星分散在天空各处,计算dop值较小,误差放大效应小;当卫星聚集在天空一角,计计算dop值较大,误差放大效应大。
a:依据高度角方位角构造H阵,构造方法为:


b:依据协方差矩阵计算:

c:垂直精度衰减因子:

水平精度衰减因子:

位置精度衰减因子:

几精度衰减因子:

/*RTKLIB rtkcmn.c 更新dop数值*/ extern void dops(int ns, const double *azel, double elmin, double *dop) { double H[4*MAXSAT],Q[16],cosel,sinel; int i,n; for (i=0;i<4;i++) dop[i]=0.0; for (i=n=0;i<ns&&i<MAXSAT;i++) { if (azel[1+i*2]<elmin||azel[1+i*2]<=0.0) continue; cosel=cos(azel[1+i*2]); sinel=sin(azel[1+i*2]); H[ 4*n]=cosel*sin(azel[i*2]); H[1+4*n]=cosel*cos(azel[i*2]); H[2+4*n]=sinel; H[3+4*n++]=1.0; } if (n<4) return; matmul("NT",4,4,n,1.0,H,H,0.0,Q); if (!matinv(Q,4)) { dop[0]=SQRT(Q[0]+Q[5]+Q[10]+Q[15]); /* GDOP */ dop[1]=SQRT(Q[0]+Q[5]+Q[10]); /* PDOP */ dop[2]=SQRT(Q[0]+Q[5]); /* HDOP */ dop[3]=SQRT(Q[10]); /* VDOP */ } }

注意:
(1)如果在预处理模块对卫星进行高度角定权的部分占很大比重的话,即低仰角卫星的权重降低,其实是对dop数值存在很大的影响,所以在整个定权模块,要尽量采用多种定权方式结合的方式,以至于dop更真实地反映实际定位中采用的策略。

(2)判断指标:当前定位算法中一般评价hdop和pdop比较多,在dop<2.0的时候认为当前是一个很好的卫星分布情况,越大(>6.0)越异常。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询