对流层(Troposphere)地球大气层靠近地面的一层。它同时是地球大气层里密度最高的一层,它蕴含了整个大气层约75%的质量,以及几乎所有的水蒸气及气溶胶。
因为卫星都处于大气层外,卫星信号传播到地球上必须要经过大气层中的对流层,于是必然要受到对流层的影响。
对流层是非弥散性介质,即介质的介电常数与频率无关,所以在对流层中,不同频率的电磁波具有相同的传播速度。因此在电离层延时一文中用到的利用双频接收机消除电离层延时的方法对对流层就无法使用了。这使得我们在实际中一般采用数学模型来估计对流层延时。当然,对于有基站的情况,也可以通过差分的方式来消除对流层延时(可参考文章差分GPS)。
可能是由于对流层模型太多,准确度并不是那么高,在GPS的接口说明文档中并没有给出官方的参考对流层模型。这里我们以 RTKLIB 中用到的 Saastamoinen 模型说一下。
标准大气层模型可以表示为:
p = 1013.25 × ( 1 − 2.2557 × 1 0 − 5 h ) 5.2568 p = 1013.25 \times (1-2.2557\times 10^{-5} h)^{5.2568} p=1013.25×(1−2.2557×10−5h)5.2568
t = 15.0 − 6.5 × 1 0 − 3 h + 273.15 t = 15.0 - 6.5 \times 10^{-3} h +273.15 t=15.0−6.5×10−3h+273.15
e = 6.108 × exp [ 17.15 T − 4684.0 T − 38.45 ] × h r e l e = 6.108 \times \exp\left[\frac{17.15T-4684.0}{T-38.45}\right] \times h_{rel} e=6.108×exp[T−38.4517.15T−4684.0]×hrel
其中 h h h 是海拔高度, h r e l h_{rel} hrel 是相对湿度, p p p 为大气压力, e e e 为大气中的水汽压力, T T T 为大气温度。
一般对流层模型中,将对流层天顶总延迟(ZTD:Zenith Total Delay)分为对流层静力学延迟(ZHD:Zenith Hydrostatic Delay)和对流层湿延迟(ZWD:Zenith Wet Delay)。静力学延迟约占总延迟量的90%,可以通过实测气压和气温来计算,而湿延迟影响因素较多,不太容易估算。
根据 Saastamoinen 模型,对流层延时 T r T_r Tr 可以表示为静力学延迟 T h T_h Th 与 湿延迟 T w T_w Tw 的和:
T h = 0.0022768 p 1.0 − 0.00266 cos ( 2 ϕ ) − 0.00028 h × 1 0 − 3 × 1 cos z T_h = \frac{0.0022768\:p}{1.0-0.00266\cos(2\phi)-0.00028\:h\times 10^{-3}} \times \frac{1}{\cos z} Th=1.0−0.00266cos(2ϕ)−0.00028h×10−30.0022768p×cosz1
T w = 0.0022768 ( 1255 T + 0.05 ) e × 1 cos z T_w = 0.0022768\left(\frac{1255}{T}+0.05\right)e \times \frac{1}{\cos z} Tw=0.0022768(T1255+0.05)e×cosz1
T r = T h + T w T_r = T_h + T_w Tr=Th+Tw
其中 z = π / 2 − e l z = \pi/2-el z=π/2−el 为天顶角, e l el el 为卫星仰角。
下面摘录了 RTKLIB 中用 Saastamoinen 模型计算对流层延时的函数代码,可以跟以上公式进行一一对应。需要注意的是计算时的单位换算,azel[0], azel[1]分别是方位角和仰角,pos[0], pos[1]分别是接收机纬度和经度,它们的单位都是弧度,pos[2]为接收机高度,单位为米。
/* 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;
}