系列前篇:①《不下载 900 MB 官方数据,我照样把 PyWingpod 的五孔探针算法跑通了》②《从 900 MB 到 546 KB:PyWingpod 最小实现环境搭建与逐行实操》③《五孔探针如何把压力变成风?标定与三维风矢量反演全公式推导》④《风测出来了,然后呢?L1→L2 通量链路全拆解》
1. 为什么还要写一篇"数据包解剖"
前四篇里,我们验证了算法、搭好了环境、推完了公式、拆解了通量链路——但一直绕着一个问题:官方发布的数据到底长什么样?
做研究不是跑通 demo:你要么直接消费官方产品,要么拿官方数据复现/改进算法。这都需要先搞清楚四个数据包的层级关系、文件结构、变量含义和坑。
官方数据仓库(GFZ Data Services,DOI 10.5880/GFZ.1.4.2024.003)实际提供四个数据包,我全部下载并实测了一遍:
| ASK16_Calibration_data.zip | 202.9 MB | 标定机动原始数据(120 个文件) | L0 标定输入 |
| ASK16_L1_Wind_data.zip | 官方自述 5.09 GB | 20 Hz 三维风矢量 | L1 输出 |
| ASK16_Merged_Wind_and_Concentration_data.zip | 49.1 MB | 风 + 浓度合并 10 Hz 数据 | L1.5(合并) |
| ASK16_Flux_data.zip | 180 KB | 通量产品(小波/Reynolds/ITCS) | L2 输出 |
四条链路对应论文 Fig. 2 的处理流程:五孔探针 + INS-GNSS 原始压力/姿态 → PyWingpod 标定并解算风(L0→L1)→ 与 Picarro 气体分析仪浓度合并(Merged)→ eddy4R 计算通量(L2)→ 足迹 / 通量地形图。
四个包的数据粒度完全不同,决定了各自的用途边界:
| Calibration | 50 Hz 原始压力/姿态 | 单个机动一段 | 2017–2022 七个日期 | 标定参数求解(S1–S7 输入) |
| L1 Wind | 20 Hz | 逐点风矢量 | 各航次(下载损坏) | 湍流/风场研究(当前不可用) |
| Merged | 10 Hz | 逐点风+浓度 | 2018-08-29、2019-08-21 | 边界层廓线、风场质检、跨航次对比 |
| Flux | —(产品) | 每 200 m 一段 | 2018-08-29(5 段) | 区域通量、足迹、地形图 |
下面逐层解剖。
2. 第一层:Calibration 包——“标定参数不是查表查来的,是飞出来的”
2.1 实测结构
120 个 .csv.gz 压缩文件,文件名日期分组覆盖 2017-08-14、2018-08-2x、2019-08-0x、2019-08-2x、2019-09-0x、2022-05-0x、2022-06-1x 七个标定航次。文件名分两种格式(实测):
- 旧式(日期内嵌):CAL_ASK160170814_Leg1.csv.gz
- 新式(机动类型显式):CAL_ASK16_acc_dec_0_.csv.gz、CAL_ASK16_yaw_3_.csv.gz、CAL_ASK16_pitch_5_.csv.gz、CAL_ASK16_square_2_.csv.gz
机动类型实测统计(新旧命名合并):Leg(平直段)76 个、acc_dec(加减速)12 个、square(风平方)12 个、yaw(偏航)10 个、pitch(俯仰)10 个,其中 2 个 Leg 文件带 _flight1/_flight2 后缀(同日第二架次的重复段)。
2.2 每类机动在解哪个参数(论文 2.4.4–2.4.7)
标定不是"对着说明书抄系数",而是用专门的飞行机动把每个标定参数孤立出来求解。ASK-16 的做法:
① 静压缺陷 ps,err —— 加减速机动 + 偏航机动
机身上测到的静压不等于自由来流静压,这个偏差叫静压缺陷,论文用三项多项式描述(Eq. 4,原文):
ps,err = a1 × pq + a2 × pq × pα² + a3 × pq × pβ²
- pq 动压、pα/pβ 差压传感器读数
- **加减速机动(speed runs)**定 a1、a2(速度变化 → 动压项;α 变化 → α 项)
- **偏航机动(yaw)**定 a3(β 变化 → β 项)
- 求解前先按高度归一化静压,剔除高度起伏的影响
② 动压标定 —— 加减速机动 + 往返法(Hartmann et al., 2018)
核心假设:往返两段的地速平均值 = 真空速(论文 Eq. 5):
(vgs,1 / cos γ + vgs,2 / cos γ) / 2 = (vtas,1 + vtas,2) / 2 = vref
其中 γ 是航迹与航向的夹角(侧风漂移)。然后求参考动压 pq.ref = ½ ρ vref²(Eq. 6),再对实测动压拟合修正系数 cq:pq.ref = cq × pq.i(Eq. 7)。
③ Cβ 与 β0 —— 偏航机动 + 往返平直段
- Cβ:对偏航机动先算风矢量,用 SciPy Nelder–Mead 迭代最小化水平风 u、v 的标准差之和(机动的风场应当是平稳的)
- β0:对多组往返平直段(reverse heading),迭代最小化往返两段的平均水平风差,取多组机动均值
④ Cα 与 α0 —— 俯仰机动 + 平直段
- Cα:俯仰机动中,假设垂直风 w 的波动主要由机身运动造成(应最小化),用 w 标准差做目标函数迭代优化;初值用 Rosemount 厂家给的 0.079 [1/°]
- α0:足够长的平直段上,平均垂直风应当为 0 → 迭代最小化 |w̅|;也可用加减速/往返机动按 Hartmann 2018 替代法
一句话总结:加减速解动压与静压速度项,偏航解 β 与静压 β 项,俯仰解 α,往返平直段解零偏。这也解释了为什么 Calibration 包按机动类型组织文件——每个文件就是一次"单参数实验"。
2.3 标定参数凭什么可信:Table 2 的实测精度账
标定做完不等于误差为零,论文 Table 2 把每台传感器的精度账摊开(均为厂商数据 + 2022-05-04 Lüsse 地面静止实测):
| Picarro G2311-f CO₂ | 10 Hz(响应 ≥5 Hz) | 300–500 ppm | 0.2 ppm(τ: 0.15 ppm) |
| Picarro G2311-f CH₄ | 10 Hz | 100–300 ppb | 3 ppb(τ: 1.1 ppb) |
| Picarro G2311-f H₂O | 10 Hz | 0–99 % RH | 0.30 %(体积分数) |
| CPT6100 静压 | 50 Hz(输出 10 Hz) | 552–1172 hPa | 0.004 % |
| CPT6100 α/β 差压 | 50 Hz | ±35 hPa | 0.004 %(地面静止 0.26/0.73 Pa) |
| CPT6100 动压 | 50 Hz | 0–70 hPa | 0.004 %(地面静止 0.39 Pa) |
| HMT311 相对湿度 | 20 Hz(响应 17 s) | 0–100 % RH | 0.5–0.85 % |
| CHAL-003 快速温度 | 50 Hz(响应 125 Hz) | −20~60 °C | 0.4 % |
| SPAN GNSS–INS 高度 | 20 Hz | 0–80 km | 0.39 m(地面静止) |
| SPAN GNSS–INS 飞机速度 | 20 Hz | 0–515 m s⁻¹ | 0.003–0.0038 m s⁻¹ |
| SPAN GNSS–INS 航向/俯仰/滚转 | 20 Hz | 0–2π / ±90° / ±180° | 0.0001 / 0.007 / 0.00017 rad |
这套账的意义:差压传感器 0.26–0.73 Pa 的地面静止精度,直接决定了 α/β 角度分辨的下限;而论文 2.6 明确指出"计算风对输入误差高度敏感"(引 Metzger et al., 2011)——所以标定机动才要设计成"单参数实验",把传感器误差逐项隔离。
3. 第二层:L1 Wind 包——20 Hz 三维风矢量
PyWingpod 处理完 L0→L1 后输出 20 Hz 的风矢量产品:u/v/w、空速、姿态、压力修正结果等,官方自述体积 5.09 GB。
坑(实测):该包在 GFZ 服务端下载即损坏。 下载得到的文件(约 694 MB)不是合法 zip,无法解压。这与第一篇"为什么不下载 900 MB 官方数据"呼应:官方数据链路并非畅通无阻,L1 产品目前就是不可用的状态。需要用 L1 数据做研究的,只能从 Calibration + Merged 自行复算(这也是 PyWingpod 开源的意义)。
4. 第三层:Merged 包——“风 + 浓度合并”,本篇核心实测
4.1 文件结构(实测,7 个文件)
ASK16_Merged_Wind_and_Concentration_data/
├─ DE_ASK-16_20180829_MergedData/
│ └─ combined_data_all_legs_DE_ASK16_2018-08-29.csv ← 84001 数据行
├─ DE_ASK-16_20190821_MergedData/
│ └─ combined_data_all_legs_DE_ASK16_2019-08-21.csv ← 112801 数据行
└─ __Variables_Explained_ASK16_Wind_Concentration_MergedData_Product.csv / .xlsx ← 67 个变量说明
- 采样率 10 Hz(论文 2.5:20 Hz 风与 10 Hz Picarro 浓度做最近邻插值,统一到 10 Hz 公共时间轴)
- 2018-08-29 航次 ≈ 84001 行 ÷ 10 Hz ≈ 2.3 小时;2019-08-21 航次 ≈ 3.1 小时——与论文"巡航 2–3 h"吻合
- 两个航次可做跨航次/跨年对比(同平台、同处理链,不同季节)
4.2 67 个变量实测分组(变量说明文件逐条读取)
| 时间 | TIME(HH:MM:SS.OOO UTC)、NTIME(unix 时间戳) | — |
| 气体浓度 | CH4_sync / CH4_dry_sync(ppb 湿/干摩尔分数)、CO2_sync / CO2_dry_sync(ppm)、H2O_sync(ppt)、CavityPressure_sync、CavityTemp_sync | Picarro G2311-f |
| 探针压力 | p_spd(动压)、p_alt(静压)、p_alp(α 差压)、p_bet(β 差压),单位 Pa | Rosemount 858 AJ + CPT6100 |
| 温湿度 | rh、T_hmt、Td、a、x、pw、pws、h | Vaisala HMT310 |
| 快/慢温度 | Chan 0、T_pt100(慢,FU Berlin Pt100)、Chan 1、T_thermoc(快,热电偶 CHAL-003) | Pt100 / CHAL-003 |
| INS-GNSS | lat/lon/height(WGS84)、u_p/v_p/w_p(机身速度)、psi/theta/phi(航向/俯仰/滚转)、theta_dot/psi_dot、x_ddot/y_ddot/z_ddot、ins_state | NovAtel SPAN-IGM-S1 |
| 高度/地形 | height_dem(EU-DEM 地表高程)、alt_asl、offset_gps_height、alt_agl(离地高度) | EU-DEM v1.1 + PyWingpod |
| 压力修正(PyWingpod 输出) | offset_p_bet/offset_p_spd/offset_p_alt(航段起始零点)、ps_q_err(含角误差的静压缺陷)、ps_q_err2(不含角误差)、p_alt_corr/p_spd_corr(修正后静压/动压) | PyWingpod |
| 气流角 | alp_i/bet_i(理论角)、alp/bet(标定后角度,rad) | 探针 + PyWingpod |
| 最终风矢量 | u/v/w(m/s)、wspd、wdir | PyWingpod |
| 空速 | vtas(真空速)、ias(指示空速) | vtas 来自 INS-GNSS,ias 为 PyWingpod 输出 |
| 热力学 | T(计算用温度)、Tv(虚温)、rho(密度)、T_Theta(位温)、T_Theta_e(等效位温) | PyWingpod |
注意两处细节:
- 湿/干摩尔分数并列:CO2_dry_sync 是去除水汽后的干空气摩尔分数,算通量/浓度梯度时用干分数,这是第四篇讲过的 H₂O 稀释修正的前提
- 文件首行是初始化行(实测 2018 文件第一行 CH4_sync=0、H2O_sync=0,CO2_sync≈365 ppm 正常):仪器同步前的填充值,分析前先做时间切片
4.3 从 Merged 包直接"看到"标定结果
Merged 包不只是消费级产品,它把 L1 的标定结果也摊开了:
- ps_q_err 与 ps_q_err2:含/不含气流角误差的静压缺陷(对应 2.2 节 Eq. 4 的 ps,err)——两者之差就是 α/β 误差对静压修正的污染量,是"风对输入误差敏感"的现成实测证据
- p_alt_corr / p_spd_corr:修正后的静压/动压,直接可与原始 p_alt/p_spd 做差,量化每次飞行的修正量级
- alp/bet(标定后气流角)与 alp_i/bet_i(理论角):气流角标定的输入输出对照
换句话说:想验证官方标定做得好不好,不用看论文,把 Merged 包里这几列拉出来对一下就行。这也是下一篇预告——用 Calibration 包 + PyWingpod 自己复算一遍标定,再拿 Merged 包的这几列当"参考答案"。
4.4 能直接用 Merged 包做什么
- 边界层廓线:爬升/下降段 + 温湿度 + 浓度 → 推断边界层厚度(论文 2.5 用途一)
- 风场质量检查:ps_q_err(含角误差)与 ps_q_err2(不含角误差)的差异就是气流角误差对静压修正的影响——可直接量化"α/β 标定误差的传播"。两个变量并排放在同一条时间轴上,是论文 2.6"风对输入误差敏感"论断的现成证据
- 跨航次对比:2018-08-29(约 2.3 小时)与 2019-08-21(约 3.1 小时)两日风速风向、浓度基线直接对比。同一平台、同一处理链,只是年份与季节不同——这也是官方后续通量地形图等产品的基础输入
5. 第四层:Flux 包——L2 通量产品
180 KB 的单航次产品(2018-08-29,5 个航段),每 200 m 一个通量段,含 WAVE(Morlet 小波通量)、REYN(Reynolds 通量)、ITCS(积分湍流特征 + 质量旗标) 三类文件。已在前篇④完整拆解,这里只补两个结论:
6. 四大包配合使用的典型工作流
| 直接引用官方通量产品 | Flux | 只有 2018-08-29 一个航次 |
| 研究风场/湍流结构 | Merged(u/v/w/wspd/wdir) | 两航次,10 Hz |
| 复现标定流程 | Calibration(机动文件) | 120 文件,需配合 PyWingpod scripts_calibration |
| 自研 L0→L1 算法 | Calibration + Merged 对照 | Merged 里的修正后压力/风可作真值 |
| 足迹 / 通量地形图 | Flux + Merged(lat/lon/height/风) | 后续产品方向 |
三个典型场景帮你对号入座:
- “我只想引用官方通量结论”:下载 Flux 包(180 KB)即可,五分钟拿到 5 航段的 CO₂/CH₄/LE 通量与质量旗标,无需碰其余三个包
- “我想做风场或边界层研究”:用 Merged 包,10 Hz 的 u/v/w/wspd/wdir + 温湿度 + 浓度,两航次足够做状态量统计与季节对比
- “我想复现或改进标定算法”:下载 Calibration 包(202.9 MB),把机动文件喂给 PyWingpod 的 scripts_calibration(S1–S7),用 Merged 包的 p_alt_corr/ps_q_err 当验证真值——这是本系列下一篇的内容
7. 避坑清单
8. 结语:这套数据怎么跟前面的文章接上
- ①(最小实现)——告诉你没有数据也能把算法跑通,本篇补上"有数据时该用哪层"
- ②(环境实操)——跑通的是 PyWingpod 源码,它的输入正是 Calibration 包
- ③(公式推导)——五个标定参数在 2.2 节对上了每一类机动
- ④(通量链路)——Flux 包就是那条链路的终点
快速阅读指南:只想了解产品全貌 → 第 1、6 节;做标定研究 → 第 2 节 + 2.3 的精度账;做风场/浓度研究 → 第 4 节(变量清单和分组是重点);消费通量产品 → 第 5 节 + ④。
下一篇预告:用 Calibration 包 + PyWingpod 实测复现一次完整标定(五个标定参数如何从机动文件里一步步解出来,用 Merged 包的修正压力当参考答案)。关注不迷路,配套复算工具包见资源区。
数据与来源:本文所有数据包结构、文件数、变量清单均来自对 GFZ 官方数据包(DOI 10.5880/GFZ.1.4.2024.003,CC-BY-4.0)的实际下载与解析;标定方法、公式编号、机动设计来自论文 Wiekenkamp et al. 2025(Atmos. Meas. Tech., 18, 749–772, doi:10.5194/amt-18-749-2025,CC-BY-4.0)。
网硕互联帮助中心




评论前必须登录!
注册