00 总览 01 水平风 02 垂直风 03 实测修正 04 置信度 05 连续估计 06 成熟度
DroneWind Estimator · V1.1

飞控为了扛住风,
不得不暴露自己

悬停时若有风来袭,飞控必须倾斜机体、改变推力才能保持原位——这些被迫做出的姿态与推力调整,就是风留在遥测数据里的指纹。在遥测完整、机型参数已标定且飞行处于适用包络时,系统可不依赖专用机载风速计,把这枚指纹反解回风速与风向。

交互演示 · 姿态 → 补偿加速度
ROLL
0.0°
PITCH
0.0°
|A_COMP|
0.00 m/s²
roll(横滚)
pitch(俯仰)
ax_body ≈ g·tan(pitch) ay_body ≈ −g·tan(roll)
注意:这是"补偿加速度",还不是风速——它必须再经过复合阻力模型才能反解出相对空气速度 Va(见 §01)。
这套系统的立场
复用已有飞行遥测
水平风主要使用姿态、对地速度、导航系平动加速度和机型标定参数;垂直风另需总推力等价观测,电机转速只是获得总推力的一种可选路径。
物理优先,绝不硬算
缺标定或缺遥测时直接返回 valid=false 和明确原因,不臆造数值。
水平 / 垂直相互独立
垂直风是增量能力,它的失效从不拖累水平风结果。
可追溯
即便用实测数据做了偏差修正,原始纯姿态反演值 rawWind* 也永远保留、不被覆盖。

它带来的不是一个孤立风速,而是一条任务证据链

遥测复用
在物理条件成立时,从已有飞行数据补充同时同地的风环境证据。
定点 + 沿程
悬停窗口表达局地风,连续 EKF 表达航线上的水平风趋势。
任务追溯
与任务摘要、数据时间范围、阶段标注和参数版本关联,便于回看和对比。
质量可解释
有效性、无效原因、质量分和成熟度一起返回,说明什么时候不应使用。
查看完整技术解读 →
00

总览:两条主链,一次汇合

同一段遥测,走两条完全独立的计算主链——悬停窗口模式只在飞机"站定不动"时给出一个结果;连续飞行模式不挑窗口,对整段飞行逐点递推。两条链禁止互相嵌套,最后才在"是否有同时间实测"这一个判断点上汇合。

悬停窗口模式(§3–§7)
样本筛选
M1 姿态反演
复合阻力反解
窗口水平风
置信度评分
推力平衡
窗口垂直风
独立置信度
连续飞行模式(§11)— 不经过悬停筛选
逐点比力观测
机动包络定噪声
EKF 预测
阻力观测更新
逐点 wN / wE
↓ 两条链的结果都要回答一个问题 ↓
同任务同时间实测匹配充分?
→ 是 →
稳健矢量偏差修正(保留原始值)
否 → 纯姿态反演,直接落库
纯函数算法层
算法模块不抛业务异常,由 service 层决定错误码映射,方便测试与复用。
双模式自动降级
实测只是可选的偏差校准参考,缺失或不合格时完全不影响纯姿态反演结果。
双计算主链
窗口模式先筛悬停样本,连续模式直接按时间递推,二者不允许串联嵌套。
01

水平风:倾角 + 阻力法

悬停时飞控用倾斜机体来抵消风阻。倾角本身不是风速——它只对应一个"补偿加速度";要把这个加速度换算成风,必须先假设一个阻力模型,把加速度反解成相对空气速度 Va,再用地速减去它,才是风。

M1 姿态反演roll,pitch,yaw → aN,aE
M2 加速度修正+整机平动加速度(可选)
旋转到机体系a_drag_x, a_drag_y
复合阻力反解→ Va_x, Va_y
旋转回 NED→ Va_n, Va_e
M0 运动学W = Vg − Va

小角度姿态反演(M1)

适用于稳定悬停、|roll|<20°|pitch|<20°。机体水平补偿加速度按小角度近似给出,再经 yaw 旋转到 NED:

ax_body ≈ g · tan(pitch) ay_body ≈ −g · tan(roll) aN = cos(yaw)·ax_body − sin(yaw)·ay_body aE = sin(yaw)·ax_body + cos(yaw)·ay_body
大白话g 就是地球引力加速度,约 9.8 m/s²,一个几乎不变的"换算尺"。tan(角度)(正切)是"倾斜程度"的放大器:角度小的时候它跟角度差不多成正比,涨得很平缓;可角度越靠近 90°,它就越往上"爆炸"式增长。这就是为什么飞机被风吹得越歪、算出来的补偿加速度就越大——也是为什么这套公式只敢用在 20° 以内:拖动下面的滑块,看那条"对边"在角度变大时如何越窜越快。
邻边(固定) 对边
角度 θ18°
tan(θ) = 0.32

复合阻力反解

机体系上同时叠加"动量阻力线性项"(旋翼改变来流方向)与"钝体二次阻力"(机体迎风面):

a_drag = −(mcoef·Va + k·Va·|Va|)
q = (−mcoef + √(mcoef² + 4·k·|a_drag|)) / (2·k) Va = −sign(a_drag) · q
大白话把手伸出车窗感受阻力:车开得慢时,阻力大致跟车速成正比——这是 mcoef·Va(旋翼把气流"拨"歪产生的阻力,线性)。车开得快了,阻力会长得比车速快得多——这是 k·Va·|Va|(机身正面硬顶风,二次方)。两种效应同时发生,公式里就把它们加在一起;再"倒着算"回去(那个根号)就能从测到的阻力反推出风速。拖动下面的滑块,看两根力条谁先冲上去、谁后来居上。
动量阻力(线性项 · mcoef·Va)0.00
钝体阻力(二次项 · k·Va²)0.00
相对风速 Va(示意,非真实标定)3 m/s
!momentumDragCoeff=0 时严格退化为传统二次反演;但线性项在非零低空速下相对量级更重要,不能仅凭"悬停"就假定它可以忽略——悬停窗口与连续模式必须共用同一套标定系数。

窗口聚合

窗口内逐样本求 (w_n, w_e),取北/东分量各自的中位数而非平均,抵抗 tan() 在姿态尖峰处被放大形成的异常样本,再换算合速与气象风向——风向本身绝不做算术平均

大白话平均数是"揉在一起摊平",一个离谱的极端值就能把整体拽偏;中位数是"把所有样本排好队,取正中间那个",极端值再远也只是排在队尾,挤不动中间的位置。点一下下面的按钮,模拟一次姿态尖峰混进窗口,看平均值(琥珀色)被带偏多远,中位数(青色)几乎纹丝不动。
均值
均值 = 3.20 中位数 = 3.20
样本筛选门槛(§3.2,节选)阈值
水平地速groundSpeed < 0.5 m/s
俯仰 / 横滚角|roll| < 20°|pitch| < 20°(小角度近似成立的前提)
连续窗口≥ 30 s 且样本数 ≥ 100
相对高度> 10 m(避开地效;可配置下调,但强制打 low_altitude_ground_effect_risk

不满足门槛 → 直接返回 valid=false + 明确的 invalidReason(如 unstable_flight_state),绝不臆造一个风速。

02

垂直风:推力平衡法

上升/下降气流在悬停中几乎不改变姿态,而是改变推力——飞控要靠增减推力来维持高度。所以垂直风不能沿用倾角法,必须用"推力相对基线的偏离"反推。

交互演示 · 推力偏离 → 垂直风方向
T < T0 T > T0
推力相对基线偏离 (Tz − T0)/T0
0.0%
拖动感受推力变化0%
仅用固定示意系数演示方向关系,非真实标定数值。

垂直力平衡(NED,down 为正)

a_drag_d = a_D + (Tz − T0)/m + a_lift Va_d = −sign(a_drag_d)·√(|a_drag_d|/kz) W_d = velocityD − Va_d W_up = −W_d # 对外:up 为正
大白话T0 想象成一台"秤"先在无风时归零:无风悬停时电机output的推力就是这台秤的"零点"。之后只要推力比零点,就说明飞机在被往下压,得使劲顶——那是下降风;推力比零点,说明有风在帮忙托着它,电机可以偷懒——那是上升风。公式里那个开平方根,是因为阻力随风速增长得比风速本身快(二次关系);已知"阻力"要倒推"风速",就像已知正方形面积倒推边长一样,得开根号。

引入推力基线 T0(无风稳定悬停下 Tz 的稳健中心值)是关键一步——它把质量误差、推力系数误差、电池电压漂移等"常值偏置"一次性吸收掉,反演只关心相对基线的推力偏离

物理自洽性校验(§5.6)

场景推理结果
无风悬停Tz ≈ T0W_up ≈ 0(无风)
上升气流控制器降推力,Tz < T0W_up > 0(上升风)
下降气流控制器增推力,Tz > T0W_up < 0(下降风)
仅水平来风升力压低推力,但 a_lift 项抵消W_up ≈ 0(不误判)
为什么要修"升力交叉项"
水平来风会让旋翼额外产生升力、压低所需推力——不修正的话,这部分推力下降会被误读成上升气流,也就是"水平风冒充上升风"。a_lift = lift_coeff·Va_h² 直接复用水平风管线算出的相对空速来抵消这个串扰。
T0 的三级来源优先级
TASK_CALIBRATED(当次任务操作者确认的稳定基准段,优先)→ PROFILE_CALIBRATED(同机型档案标定值)→ THEORETICAL(缺省 m·g,打标记,不作为正式绝对垂直风)。
当前 kz 是上下方向共用、指数固定为 2 的工程简化,没有显式建模桨盘轴向入流、上升/下降非对称或涡环状态——所有有效垂直结果都固定携带 vertical_symmetric_quadratic_model_simplification 标记:公式自洽,不代表垂直气动机理已完整。
03

同时间实测辅助修正(可选)

如果同一次任务里恰好有一台三维风传感器的同时间实测数据,系统会尝试用它做一次稳健的常量偏差修正——但绝不会用实测值替换姿态反演本身,也绝不会因为修正而"提高"原有置信度。

传感器 FLU 原始 U/V/W需声明轴定义 + 矢量语义
姿态旋转 R_NS安装偏角 + 无人机/传感器姿态
平动 + 杆臂补偿转成地球系 N/E/up
按时间配对|Δt| ≤ 1.0 s,quality ≥ 0.5
稳健偏差 b = median(Δ)至少 5 对、覆盖 ≥ 4 s
b_N = median( W_sensor,N(t_i) − W_raw,N(t_i) ) b_E = median( W_sensor,E(t_i) − W_raw,E(t_i) ) W_corrected = W_raw + b # 只拟合一个常量偏差,不拟合增益
条件correctionMode最终结果
同任务同时间实测匹配充分SENSOR_ASSISTED_BIAS姿态反演 + 稳健常量偏差
没有实测 / 时间对不上 / 匹配不足ATTITUDE_ONLY纯姿态反演,绝不硬修正
请求显式指定 OFFATTITUDE_ONLY用于独立盲测对照
修正结果会同时保留 rawWind*(修正前原始值)、匹配数、偏差大小与传感器编号——用同一批实测算出的偏差再去验证同一批数据,属于同窗校准,不是独立精度验证。评估泛化能力时必须换一批未参与修正的数据做盲测。
04

置信度评分与有效性门控

窗口结果的置信度从 1.0 起步,按触发条件逐项扣分,最终截断到 [0, 1]。拖动下面的开关,感受几种典型问题如何叠加拉低质量分。

交互演示 · 扣分如何叠加
1.00

这只是"未校准的工程质量指数"

扣分权重尚未用独立真值航次校准过,所以每个窗口都固定携带 confidence_heuristic_uncalibrated 标记——前端应该显示"质量分",不能解释成"75% 准确率"

大白话可以类比成老师批作业时打的"卷面工整度"分——字迹越工整、步骤越完整,这个分越高;但它评价的是"这次考试环境好不好、能不能信",不是"这道题算对的概率是多少"。姿态晃动明显、定位信号差、风向东一下西一下……这些都会让"卷面"扣分,即便风速本身算得可能没错。
confidence含义
≥ 0.75内部质量条件较好,仍须结合质量标记判断
[0.60, 0.75)内部参考级
< 0.60默认门槛下结果无效,固定 invalidReason=low_confidence
05

连续估计:M3 比力模型 + M4 EKF

悬停窗口只能给"站定不动"时的一个结果。要覆盖前飞、加减速、转弯的整段飞行,系统改用一个只估计风、不联合估计阻力系数的扩展卡尔曼滤波器——阻力参数离线标定固定,在线只追踪 wN, wE 两个状态。

预测 — 更新循环

预测P⁻ = P + q_w·dt·I
阻力观测更新Joseph 形式协方差更新
大白话就像开车时低头看了眼油量表,这几秒凭经验估计车子往前挪了多远(预测,越久没校准就越没底、"不确定的范围"越画越大);抬头再看一眼导航,把估计位置一把拉回真实位置附近(更新,不确定范围立刻收窄)。EKF 就是不停地"预测→变得没底→更新→变得有把握→再预测……"。下面这个圆点在自动演示这个循环,光晕越大代表越不确定。
观测 ← 预测:漂移,光晕变大 更新:拉回 →
状态 x = [wN, wE]ᵀ 观测 z 来自机体系气动比力 innovation y = z − h(x⁻) K = P⁻Hᵀ(HP⁻Hᵀ + R_eff)⁻¹ x = x⁻ + K·y

默认初始化 P0 = 25·I、过程噪声 q_w = 0.02 (m/s)²/sS 不可逆或观测非有限时跳过该次更新、保留预测状态,绝不用零增益伪装成一次成功观测。

机动包络 → 观测噪声倍率

超出验证包络的样本不会被删除,而是用更大的观测噪声"弱参与"更新:

触发条件倍率
正常×1
加速度分量缺失 / 垂速 > 1.0 m/s×4
|roll|>35°|pitch|>35° 或角速度 > 30°/s×25(上限,多条件同时触发不相乘)

时间间隔与断档处理

Δt处理
≤ 0重复/乱序点,丢弃并计数
0 ~ 2 s正常预测 + 更新
2 ~ 10 s保留状态,按实际 dt 膨胀协方差
> 10 s保留风估计,重置协方差 P=P0

连续质量分怎么来

confidence = 1 / (1 + √trace(P) / σref) σref = 1.0 m/s

P 是 EKF 对北向风和东向风的不确定性,trace(P) 把两个方向的不确定程度汇总。P 越大,分数越低。整段分数取后半段逐点分数的中位数,避免初始收敛阶段占据主导。

有曲线,为什么还是无效

一个实际门控例子0.517 < 0.600valid=falseinvalidReason=low_confidence。这表示本次估计的内部不确定性未达默认发布门槛,不是 CSV 无效,也不是 51.7% 准确

曲线和修正前平均风速 12.3284 m/s 可保留用于诊断;正式平均风速和风向字段应置空,防止将诊断数字误当作可用结论。

连续垂直风目前仍是实验性能力,复用悬停垂直动力学逐点反演 + 滚动中位数平滑——飞行中垂直风缺乏成熟文献支撑,连续水平风可用不代表连续垂直风已验证。
06

适用边界与模型成熟度地图

算法能力成熟度、当前部署是否具备该能力、以及本次结果是否有效,是三件不同的事,绝不用一个混合枚举同时表达:capabilityMaturity(模型成熟度)、available(当前部署是否具备)、valid(本次结果是否可用)。

悬停窗口:|roll|/|pitch| < 20° 连续模式:|roll|/|pitch| ≤ 35°,角速度 ≤ 30°/s 默认高度 > 10 m(避开地效) 输出不可替代标准气象观测
M0 风矢量运动学
必须
M1 悬停姿态反演
必须
复合阻力反演(水平)
必须
M2 加速度修正
字段齐全时启用
垂直风(推力平衡 + 对称二次简化)
EXPERIMENTAL
同时间实测稳健偏差修正
已实现
M3 复合阻力比力模型
已实现
M4 风增广 EKF(在线只估风)
PROVISIONAL
连续垂直风
实验性
分方向垂直幂律 / VRS 包络
工程规划
UKF / IEKF、M5 标定查表、M6 ML 修正
工程版规划
当前 M400 provisional profile 尚未完成独立真值验证,其悬停水平风与连续水平风均不得标记 VALIDATED;垂直参数缺失时固定 capabilityMaturity=EXPERIMENTAL, available=false