资讯详情

对流层延时到底怎么算?从物理原理到工程实现的完整拆解

📅 2026/9/15 14:44:49 | 华诺云谱 👁 阅读
对流层延时到底怎么算?从物理原理到工程实现的完整拆解
读GPS误差源的时候大多数人的心理活动是这样的星历误差、钟差还好说电离层延时用双频就能干掉大半可一翻到对流层延时这页就头疼。“从入门到放弃”系列写到现在第十六期后台留言问得最多的就是两个一个是周跳到底怎么修另一个就是对流层延时到底怎么算。为什么大家觉得它难因为电离层那是“知难行易”——频率一叉开就没了对流层恰恰反过来看起来公式就那几条真放到实际定位里它又悄悄把你的平面坐标往旁边推几厘米、高程往下压几米。今天这一期咱们把对流层延时从物理原理到工程实现整个捋一遍。这个内容适合谁看正在学GPS原理的在校生、刚入手RTK测量和测绘作业的现场人员以及写定位解算代码的开发者。整篇我会尽量少堆公式、多讲人话把“为什么会有延时”“模型凭什么这么算”“工程里到底怎么处理”三件事讲透。1. 对流层延时到底是什么先搞清它在跟你玩什么花招1.1 信号穿透大气层为什么就“慢”了GPS卫星距地面约2万公里信号从卫星发出来要先穿过几乎真空的太空再一头扎进地球大气层。太空那一段基本没干扰真正让它“迟到”的就是最后的几十公里大气层。这个问题有个专门说法叫对流层延时Tropospheric Delay。这里要先较个真GPS应用里说的“对流层延时”其实指的是从地表到大约50公里高度的中性大气层带来的信号延时包含了真正的对流层0~12公里左右和平流层12~50公里。因为延时机制一样业界习惯上叫它“对流层延时”也有文献叫“中性大气延时”知道是同一回事就行。为什么信号会慢因为大气不是真空。光在真空中的速度是c进入折射率大于1的介质后速度变成v c/nn是大气折射率。速度变慢信号到达接收机的时间自然就晚了。除了速度变慢信号路径还会因为折射发生弯曲路径变长也贡献了一部分延时。两者加在一起才是你最终看到的“对流层延时”。实际量级有多大呢我在工程里常用的经验值天顶方向卫星在正头顶大约是2.5米左右其中干分量约2.3米湿分量约0.2米仰角越低穿过大气层的路径越长延时越大5度仰角时总延时能到25米上下。这个量级对厘米级定位来说是必须认真对待的。1.2 非色散介质双频消不掉这才是它“难搞”的根源GPS老玩家都知道电离层延时有个致命弱点它跟频率相关。L1载波上的延时和L2载波上的延时不一样而且比例关系是1比(f1/f2)^2。所以你把L1和L2的观测值做个线性组合就能把电离层延时消掉这就是经典的消电离层组合IF组合Iono-Free。但对流层不行。它的折射率在GPS的L波段频率范围内几乎不随频率变化属于非色散介质。也就是说L1和L2穿过去受到的延时完全一样你根本没法用双频组合把它消掉。我经常跟刚入门的朋友开玩笑电离层是“明牌”可以用组合“手术”切掉对流层是“暗牌”只能靠建模“硬扛”或者估计“硬猜”。还有一个容易忽略的点对流层延时和卫星高度角强相关。天顶方向延时最小仰角越低延时越大。这个相关性带来的后果就是所有定位模式在处理对流层时都要先算一个天顶方向的延时再通过“映射函数”把它换算到卫星视线方向。映射函数选得好不好直接决定低仰角卫星是否可用这在后面的实操里会反复踩到。1.3 干分量和湿分量一个乖一个皮对流层延时按物理成因可以拆成两部分干分量也叫静力学分量和湿分量。干分量由大气中的干燥气体主要是氮气和氧气引起占总延时的80%~90%。它由大气压强和温度决定而P和T在时间和空间上的变化相对平缓所以干分量特别好建模做到毫米级精度也不是难事。湿分量则来自水汽量级虽然只占10%左右但这家伙非常不老实。水汽在大气中的分布极不均匀受季节、天气、地形影响巨大。夏天的午后阵雨前天顶湿延迟可能在几个小时内变化几十毫米而它又恰恰是决定精密定位成败的关键部分之一。打个比方干分量像电影院的背景灯光全场亮度稳定你把光照模型调好了误差就很小湿分量像有人在场内举着荧光棒走来走去亮度和位置全看心情你只能通过不断观测去“跟踪”它的变化。这也解释了为什么精密单点定位PPP里要对流层天顶延迟ZTD作为一个参数持续估计因为单纯靠模型真的跟不上水汽的变化节奏。2. 从折射率到天顶延时公式背后其实就两件事2.1 折射率是一切计算的起点任何对流层延时模型底层都是同一个物理起点大气折射率N。工程上习惯用无量纲的折射率差N (n-1)×10^6来写它由温度T、大气压P和水汽压e共同决定经典形式的经验公式是这样N 77.6 × P / T 3.73 × 10^5 × e / T²第一项对应干分量第二项对应湿分量。把N沿着信号传播路径做积分就得到总延时。P、T、e的单位分别是hPa百帕、K开尔文和hPa。看着简单实际坑不少。比如单位N公式里P和e必须用hPa有人误把Pa的值带进去结果差了100倍。再比如e并不是直接能测的量气象站一般给的是相对湿度RH你要通过饱和水汽压公式先换算e RH × es / 100而es又是个关于温度的经验函数。换算错一步湿延迟就面目全非。正因为积分需要知道整条路径上每一处的P、T、e而接收机通常只能测到地面这一点的气象数据所以才有后来的各种简化模型。它们的核心思路其实都一样假设大气参数随高度的变化符合某种标准剖面然后把积分用解析方式算出来。理解了这一层再去看Hopfield和Saastamoinen公式就不会觉得它们是从天上掉下来的了。2.2 天顶延时模型Saastamoinen和Hopfield怎么选天顶方向的对流层延时是所有计算的地基。最常用的模型有两个Saastamoinen模型和Hopfield模型。两者都用地面气象观测值作为输入只是对大气剖面的假设不同。Saastamoinen模型的形式很紧凑我天天用Δρ_z 0.002277 / f(φ, H) × [P (1255/T 0.05) × e]其中f(φ, H) 1 - 0.00266 × cos(2φ) - 0.00028 × Hφ是测站纬度H是测站高程单位千米。P、T、e分别是地面气压hPa、温度K、水汽压hPa。方括号里第一项除以f就是干分量第二项除以f是湿分量。Hopfield模型的思路略有不同它假设大气折射率随高度按四次多项式递减干分量延伸到大约43公里高度湿分量只延伸到约11~12公里。优势在于它对中纬度地区拟合得不错公式也有不少变体。那到底用哪个我的个人经验在常规测量场景Saastamoinen模型和Hopfield模型的差异通常在毫米到厘米级对单点定位影响不大。Saastamoinen计算更简洁所以我优先推荐它如果你做PPP后处理或者研究用建议直接用更精细的VMF1/VMF3网格产品那几个模型的极限精度不在一个量级上。模型输入的气象数据从哪来三种途径一是接收机自带气象传感器精度最高但设备贵二是用标准大气参数也就是固定P1013.25hPa、T288.15K这类“平均脸”误差在天顶方向通常有几厘米三是用GPT2/GPT3这类全球气压温度经验模型按测站位置和年积日给出一组合理的气象参数精度比标准大气好很多无气象传感器的单点定位首选。2.3 映射函数把天顶延时“掰”到视线方向天顶延时算出来后下一步要把天顶方向的延时换算到卫星视线方向这个换算系数就叫映射函数Mapping Function。最朴素的做法是假设大气是平面平行层m(E) 1 / sin(E)E是卫星高度角。这个映射函数在高度角高于30度时误差不大但低仰角时非常拉胯。原因是信号路径对同样的大气层剖面来说真实的几何关系比1/sin(E)复杂得多再加上路径弯曲1/sin(E)在10度仰角可能带来几十厘米的误差。以前看一些老资料直接用1/sin(E)处理低仰角卫星最后收敛结果飘得厉害多半就是栽在这里。后来工程界发展了一系列更精细的映射函数比如Niell映射函数NMF、全球映射函数GMF、维也纳映射函数VMF1/VMF3。它们的基本思想是利用大气折射率剖面或数值天气预报模型把映射函数系数预先算好。干分量用一套系数湿分量用另一套系数分开映射。VMF1需要用外部网格数据后处理精度最高NMF和GMF则是纯经验模型不需要外部数据就能用适合实时解算场景。在PPP里映射函数精度直接决定了ZTD参数估得准不准因为湿延迟在低仰角观测中贡献大映射函数一旦偏差ZTD估出来就带着系统性误差。这也是为什么现在VMF3逐渐成为高精度研究的标配。3. 不同定位模式下的对流层处理单点、差分、PPP各有各的活法3.1 单点定位模型改正剩下的交给天意单点定位SPP/SPS的时代伪距精度本来就在米级对流层延时用模型改正一下就够了。标准做法用Saastamoinen或GPT模型算出每个卫星视线方向的对流层延时直接从伪距观测方程里扣掉。但这里面有个很有意思的现象如果模型改正不完善残余误差并不会均匀分布到三个坐标分量上而是大量泄漏到高程分量。原因很简单对流层延时和测站高程这两个参数在几何上是强相关的——卫星都在天上信号都是从头顶斜着打下来一个“往下的方向误差”和一个“测站高度误差”观测方程几乎分不清。所以你会发现单点定位的水平精度可能做到2~5米但高程精度经常要到5~8米。有人误以为是多路径导致的其实对流层残余的贡献不小。这也是为什么测量规范里要求控制点高程测量用等级水准或至少用RTK而不是靠单点定位的高程。3.2 差分定位短基线是“天赐”长基线要“补课”RTK等差分定位模式对流层延时算是捡了个大便宜。因为在短基线比如10公里内情况下两台接收机上空的对流层状况非常接近信号路径也接近做双差后大部分对流层延时被抵消掉了。我做过一组实测基线长度8.7公里双差残差里的对流层部分在水平方向一般不到5毫米高程方向也就1~2厘米。这个量级对RTK来说可以忽略所以短基线RTK的默认模式根本不处理残余对流层。但基线一拉长事情就变了。超过50公里甚至上百公里两台接收机上空的水汽分布开始出现明显差异双差后的残余对流层延时能到几厘米甚至十几厘米。此时还硬着头皮不处理固定解就会频繁失锁。工程上常规做法是在观测模型中把相对天顶对流层延迟差RZTD作为参数估计出来同时给映射函数差分后的系数建模而不是当成已知量。长基线网络RTK里的对流层改正本质就是在做这件事。3.3 PPP把对流层延时当“活参数”一路估下去精密单点定位PPP是目前对对流层延时处理最考究的一种模式。它不像单点定位那样只靠模型扣也不像差分那样指望空间相关性抵消而是把天顶对流层延时当作未知参数随历元逐步估计。具体做法用无电离层组合的观测值建立方程时把天顶湿延迟作为待估参数干延迟用模型扣掉残差交给湿参数吸收ZTD的时间变化用随机游走Random Walk描述过程噪声根据气候区域设定比如雨季设大一些旱季设小一些映射函数用NMF或GMF一类的精细函数。解算过程中ZTD、接收机钟差、相位模糊度、坐标参数一起平差每个历元都会更新ZTD的估值。这里有个困扰很多新手的问题为什么PPP的收敛这么慢原因之一就是ZTD参数和天顶方向的模糊度参数存在强相关性。天顶方向的观测几何本来就弱你在方程里又多放了一个随时间漂移的ZTD模糊度和ZTD就互相“争抢”天顶方向的残差导致模糊度不好固定、高程收敛慢。要缓解这个现象一方面要靠提高映射函数精度、引入多系统观测丰富几何另一方面就是等靠长时间观测把两个参数慢慢“盼开”。作为参考我在后处理软件里一般把ZTD设成15分钟估计一个值过程噪声在雨季给5mm/sqrt(h)旱季给2mm/sqrt(h)效果比较平衡。实时PPP有时会密一些5分钟一估但导航解算负担会上升。4. 实操中的坑与排查这些雷我都替你踩过4.1 气象输入单位与高程基准的经典翻车现场做对流层改正90%的坑出在气象输入上。先讲最常见的气压单位问题。Saastamoinen公式里P和e的单位都是hPa但有些气象仪器给的是Pa或kPa大气压力表给的是mmHg的也大有人在。我接手过一份观测数据处理出来的高程一直偏低好几米排查半天发现是气压值被人从Pa当成了hPa带进公式整整差了100倍。换算关系1 hPa 100 Pa 0.75 mmHg写代码时务必统一。第二个坑是温度单位。公式里的T必须是开尔文但气象站通常给摄氏度。有人记得乘273.15有人记得不乘更隐蔽的是把15°C直接写成288.15却没注意到公式里还有(T-273.16)形式的版本。我建议写一个统一的气象数据预处理函数把C、K、hPa、Pa、RH与e的换算全部封在里面调用处只传原始读数能砍掉一大半低级错误。第三个坑是模型里H的含义。Saastamoinen里的H是测站高程单位千米但这个高程要和你使用的坐标框架一致。如果用WGS84椭球高就把椭球高带进去如果用正常高要先把高程系统搞清楚。混用椭球高和正高天顶干延迟通常差几毫米影响不大但在高精度处理里会造成系统性偏差。4.2 低高度角卫星用还是不用一句话说不清低高度角卫星对流层延时大映射函数误差也大但它能给定位几何带来很大改善能显著提升高程和ZTD的可估性。所以“用还是不用”是所有GNSS处理里的一道送命题。以我个人的经验实时RTK测量截止高度角设15度比较稳妥再低容易出现多路径和对流层残余误差爆表的伪观测。做静态后处理可以大胆放到10度甚至5度因为后处理有更多的质量控制和残差检验手段。做PPP通常最少也要15度起步但在观测条件差、卫星少的环境下降到8度往往比损失几何构型更划算前提是你的映射函数精度要跟得上。还有一个容易被忽视的点低高度角卫星最容易夹带多路径误差。多路径和环境相关很难和对流层残余误差区分。如果你发现在某个测站上固定解的残差在低高度角卫星上系统性偏大多半是周围有水面或金属反射面在捣乱这时候与其纠结映射函数不如先换测站位置。4.3 为什么高程总是最后收敛ZTD和高程的“兄弟关系”很多做静态或PPP的朋友都有感受收敛过程中平面坐标半小时就稳定了高程却要磨一两个小时。这里面对流层ZTD的贡献非常大。道理不难懂。对流层延时在天顶方向最大映射函数在天顶方向最不敏感所以ZTD和测站高程这两个参数的观测量几乎都来自同一个方向——天顶。方程里它们分成两个参数但几何上你只有一组“从头顶下来的观测”于是数值上它们高度相关。RMS的协方差矩阵里ZTD和高程的相关系数经常能到0.7以上。要改善这种相关性有两个土办法实测很有效一是尽量增加低高度角卫星的观测它们对ZTD和解算几何都有好处二是引入外部气象约束比如用GPT3给ZTD一个先验值和方差约束把ZTD往合理范围里拽。你可以在解算软件里设置“ZTD先验约束”选项把先验标准差从无穷大改成5厘米往往收敛速度明显变快尤其在天气平稳的环境下。5. 用Python自己动手把对流层延时算明白5.1 最小可用的Saastamoinen实现最后动手环节写一个最简单的Python函数输入测站位置、地面气象数据和卫星高度角输出某个视线方向的对流层延时。直接可以用也可以在RTKLIB、自研解算器里做验证参考。import math def saastamoinen_delay(lat_deg, height_m, P, T_celsius, RH, elev_deg): 计算单颗卫星视线方向的对流层延时Saastamoinen模型 1/sin映射 Parameters ---------- lat_deg : float 测站纬度单位度 height_m : float 测站高程单位米 P : float 地面大气压单位hPa T_celsius : float 地面温度单位摄氏度 RH : float 相对湿度单位% elev_deg : float 卫星高度角单位度 Returns ------- trop_delay : float 对流层延时单位米 # 1. 温度转开尔文计算饱和水汽压与真实水汽压 T_K T_celsius 273.15 # Bolton公式饱和水汽压(mbar/hPa) es 6.112 * math.exp(17.67 * T_celsius / (T_celsius 243.5)) e RH / 100.0 * es # 2. 测站纬度转换、高程转千米 lat_rad math.radians(lat_deg) H_km height_m / 1000.0 # 3. Saastamoinen天顶延时 f 1 - 0.00266 * math.cos(2 * lat_rad) - 0.00028 * H_km zhd 0.002277 * P / f zwd 0.002277 * (1255.0 / T_K 0.05) * e / f # 4. 映射到视线方向这里用简单1/sin高精度场景建议换VMF3 elev_rad math.radians(elev_deg) m 1.0 / math.sin(elev_rad) return (zhd zwd) * m # 示例纬度30度、高程50m气温20°C气压1010hPa湿度60%卫星高度角30° delay saastamoinen_delay(30.0, 50.0, 1010.0, 20.0, 60.0, 30.0) print(f视线方向对流层延时: {delay:.3f} m)跑一下这组参数输出的结果会比较接近5米。你可以验证一个物理直觉同样的天气卫星高度角越低返回的延时越大把高度角从30度换成15度延时大概会翻倍。另外湿度和气温变化时湿分量的波动也会直接反映在结果里。这个脚本加上气象传感器读数的接口就能接到自制的GNSS数据后处理流水线里。在RTKLIB里也有现成的对流层模型选项选Saastamoinen时它内部用的就是这个量级的气象参数换算。如果手头有观测文件但缺气象文件RTKLIB会自动用标准大气补这也是为什么你解算出来的高程偶尔会带几厘米到十几厘米的量级偏差——不是软件坏了是对流层没喂饱。5.2 几个能写进简历的处理技巧最后分享几个我在实际数据处理中验证过的经验算不上什么高深理论但能省不少弯路第一尤其在南方夏季对流层ZTD的变化是实打实的“天气现象”。做PPP或长基线处理时如果发现ZTD估计值在一两个小时里并不平滑先别急着骂算法去查对应时段的气象记录经常能看到短时强降雨或冷锋过境导致的水汽突变。必要时把过程噪声适当调大让参数能跟上天气变化。第二处理GPS数据时把ZTD估值的变化序列当成一种“大气观测”用。ZTD的时间序列能反映测站上空的积分水汽变化很多气象研究用它反演可降水量PWV。做测量工作之余顺手把ZTD序列存下来偶尔跟当地气象台的数据对比你会发现GNSS这项“副产品”比想象中有价值。第三如果要把GPS的经纬度、高程数据进一步用到地图或业务系统中记得先在数据链路上把坐标框架统一好。WGS84椭球高和常用高程基准之间存在差异对流层改正依赖的测站高程数值也要保持一致否则模型算得再准坐标框架一错位前面所有精度都白搭。写到这儿对流层延时这个“老熟人”算是彻底拆开了。回顾整个系列它确实是我见过最“粘人”的误差源——不让你用频率组合消又不让你用简单映射糊弄还得跟高程参数“抢饭碗”。但把原理理清楚之后它其实很有规律干延迟看气压温度湿延迟看水汽方向看高度角精细处理看映射函数。把这四根线抓住无论你是做单点、RTK还是PPP对流层延时都不会再是那个让你想放弃的坎。下一期等我哪天有勇气了把周跳检测和修复那块“硬骨头”也掰开来聊聊。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。