
无人机飞行的“方向感”一张图搞懂速度分解与位置转换从“合速度”到“北东天速度”从“方位角/高低角/距离”到“东北天坐标”其实都在说同一件事把斜着看的东西掰直了算。一、为什么要做这些转换无人机飞到空中你拿到手的数据往往是两类位置类距离R、方位角α、高低角β像雷达或光电设备给出的“球坐标”速度类合速度V一个数比如 8.6 m/s但你真正想知道的往往是它向北飞多快向东飞多快向上/向下飞多快它相对于你北边多远东边多远多高这就需要两套转换位置转换(距离, 方位角, 高低角)⟷(北, 东, 天)速度转换(合速度 方向角)⟷(北向速度, 东向速度, 天向速度)二、位置转换从“斜着看”到“横平竖直”1. 先理解三个角度想象你站在地面原点无人机在空中距离 R你到无人机的直线距离斜着的那条线方位角 α从正北方向顺时针转过的角度指水平方向高低角 β视线与水平面的夹角仰角为正俯角为负 举个例子R1000m, α45°, β45°表示无人机在你东北方向而且仰角 45°斜距 1000m。2. 先算水平距离再算高度这是最关键的一步把斜边“拆”成水平投影和垂直投影水平距离D R × cos(β)就是把斜距压到地面上有多远。高度H R × sin(β)就是无人机比你高多少。 示意图理解斜边是R与水平面的夹角是β邻边 D水平对边 H高度。3. 再把水平距离拆成“北”和“东”水平距离D在水平面上方向由方位角α决定北向位移N D × cos(α)东向位移E D × sin(α) 示意图理解在水平面上画一个直角三角形斜边是D与正北夹角是α邻边 北向对边 东向。4. 完整公式位置转换球坐标 → 东北天[\boxed{\begin{aligned}D R \cdot \cos\beta \H R \cdot \sin\beta \N D \cdot \cos\alpha \E D \cdot \sin\alpha\end{aligned}}]✅ 示例验证用你给的初始数据已知R1000m, α45°, β45°D 1000 × cos45° 707.1mH 1000 × sin45° 707.1mN 707.1 × cos45° 500mE 707.1 × sin45° 500m结果无人机在你北 500m东 500m高 707.1m的位置。三、速度转换从“合速度”到“北东天速度”速度的转换本质上和位置一样只是把“距离”换成了“速度”。1. 速度也需要两个方向角速度方位角 ψ速度方向与正北的夹角不是位置的方位角速度高低角 γ速度方向与水平面的夹角上升为正下降为负⚠️ 特别注意位置角度和速度角度可以不同无人机可以位置在东北 45°但飞向东北偏东 50°还一边下降。2. 分解公式如果已知合速度V、速度方位角ψ、速度高低角γ北向速度V_N V × cos(γ) × cos(ψ)东向速度V_E V × cos(γ) × sin(ψ)天向速度V_U V × sin(γ) 示意图理解先按γ把速度拆成“水平速度”和“垂直速度”再按ψ把水平速度拆成“北向”和“东向”。3. 反过来算已知速度分量反求方向角如果你已经知道V_N, V_E, V_U合速度V √(V_N² V_E² V_U²)速度方位角ψ atan2(V_E, V_N)速度高低角γ atan2(V_U, √(V_N² V_E²))✅ 示例验证用你给的初始速度数据已知V_N5, V_E6, V_U-3V √(25369) 8.37 m/sψ atan2(6, 5) 50.19°北偏东γ atan2(-3, √61) -21.0°下降这就说明无人机合速度 8.37 m/s朝北偏东 50.19° 飞行同时以 21° 俯冲角下降。四、为什么位置角度 ≠ 速度角度这是最容易混淆的地方用你的实际数据一看就明白类型方位角高低角位置角度45°45°仰角速度角度50.19°-21°俯冲位置在东北 45° 高空但飞行方向却是更偏东、且向下俯冲。这说明无人机不是“正对着你飞”而是在斜着切过你前方的空域。五、用你图片里的数据再验证一次你后来发来的图片显示距离R2384m方位α48.60°高低H59m注意这里已经是高度不是角度速度V8.6m/s位置转换D √(2384² − 59²) ≈ 2383.3mN 2383.3 × cos48.60° ≈ 1575.4mE 2383.3 × sin48.60° ≈ 1787.5m此时无人机在北 1575m东 1788m高 59m与初始状态对比参数初始后来的图片变化距离1000m2384m变远 ✅高度707m59m大幅下降 ✅合速度8.37m/s8.6m/s略微加速 ✅这说明无人机从高空俯冲到了低空并且飞远了物理上完全自洽。六、一张图总结所有关系为了帮你更直观地理解下面是整个关系的“思维结构图”【位置类】 球坐标 (R, α, β) │ ├─ D R·cosβ ──→ N D·cosα ├─ H R·sinβ E D·sinα │ ▼ 东北天坐标 (N, E, H) 【速度类】 合速度 V 方向角 (ψ, γ) │ ├─ V_N V·cosγ·cosψ ├─ V_E V·cosγ·sinψ ├─ V_U V·sinγ │ ▼ 东北天速度 (V_N, V_E, V_U)如果反过来已知(N, E, H)也能反算(R, α, β)已知(V_N, V_E, V_U)也能反算(V, ψ, γ)。七、最容易踩的四个坑帮你避开位置角度 ≠ 速度角度位置看“在哪里”速度看“往哪飞”两者可以完全不一样。高低角的单位有的设备显示角度°有的直接显示高度m一定要看清。atan2比atan更安全用atan2(y, x)能自动处理象限避免方向算错。合速度不是水平速度V 8.6是三维合速度水平速度要减去垂直分量。把方位角当成数学角度错误理解方位角从 E 东轴开始逆时针转。工程中常用雷达方位角是从 N 北轴开始顺时针转。所以az atan2(E, N)而不是az atan2(N, E)把位置方向和速度方向混为一谈错误理解目标在 az45°、el45° 方向所以它一定沿这个方向飞。正确理解az、el、R 描述目标在哪里。 vE、vN、vU 描述目标怎么飞。目标的位置方向和速度方向可以完全不同。忘记高低角先影响水平距离从方位角、高低角、距离计算位置时不能直接写成E R * sin(az) N R * cos(az)这是错误的因为 R 是斜距不是水平距离。应该先算水平距离Rh R * cos(el)再分解E Rh * sin(az) N Rh * cos(az) U R * sin(el)atan2 参数顺序写反在 C 中atan2(y,x)但对于雷达方位角x 对应北向 N y 对应东向 E所以azatan2(E,N);如果写成azatan2(N,E);会变成数学角度不再是从北轴顺时针量的方位角。八、Qt / C 实现下面给出一个简单的 Qt/C 计算示例。1 角度转弧度Qt 中可以使用#includeQtMathdoubleradqDegreesToRadians(deg);doubledegqRadiansToDegrees(rad);2 由方位角、高低角、距离计算东北天位置#includeQtMath#includeQDebugstructEnuPosition{doublee;// 东向位置mdoublen;// 北向位置mdoubleu;// 天向位置m};// 方位角 azDeg从北轴顺时针量单位度// 高低角 elDeg从水平面向上量单位度// 距离 range斜距单位mEnuPositionpositionFromAzElRange(doubleazDeg,doubleelDeg,doublerange){constdoubleazqDegreesToRadians(azDeg);constdoubleelqDegreesToRadians(elDeg);EnuPosition pos;pos.erange*qCos(el)*qSin(az);pos.nrange*qCos(el)*qCos(az);pos.urange*qSin(el);returnpos;}调用示例EnuPosition pospositionFromAzElRange(45.0,45.0,1000.0);qDebug()E pos.e;qDebug()N pos.n;qDebug()U pos.u;输出约为E 500.00 N 500.00 U 707.113 由东北天位置反算方位角、高低角、距离structAzElRange{doubleazDeg;// 方位角度doubleelDeg;// 高低角度doublerange;// 斜距m};AzElRangeazElRangeFromPosition(doublee,doublen,doubleu){AzElRange result;constdoublehorizontalRangeqSqrt(e*en*n);result.rangeqSqrt(e*en*nu*u);// 方位角从北轴顺时针量result.azDegqRadiansToDegrees(qAtan2(e,n));// 转成 0~360°if(result.azDeg0.0){result.azDeg360.0;}// 高低角从水平面向上量result.elDegqRadiansToDegrees(qAtan2(u,horizontalRange));returnresult;}4 由东北天速度分量计算合速度和速度方向structVelocityDirection{doublespeed;// 合速度大小m/sdoublevh;// 水平速度大小m/sdoubleazDeg;// 速度方位角度doubleelDeg;// 速度高低角度};// vE东向速度// vN北向速度// vU天向速度VelocityDirectiondirectionFromEnuVelocity(doublevE,doublevN,doublevU){VelocityDirection result;result.vhqSqrt(vE*vEvN*vN);result.speedqSqrt(vE*vEvN*vNvU*vU);// 速度方位角从北轴顺时针量到速度水平投影方向result.azDegqRadiansToDegrees(qAtan2(vE,vN));if(result.azDeg0.0){result.azDeg360.0;}// 速度高低角从水平速度方向向上量到速度方向result.elDegqRadiansToDegrees(qAtan2(vU,result.vh));returnresult;}调用示例VelocityDirection veldirectionFromEnuVelocity(6.0,5.0,-3.0);qDebug()水平速度 vel.vh;qDebug()合速度 vel.speed;qDebug()速度方位角 vel.azDeg;qDebug()速度高低角 vel.elDeg;输出约为水平速度 7.81 合速度 8.37 速度方位角 50.19 速度高低角 -21.045 由合速度和速度方向分解东北天速度structEnuVelocity{doublevE;// 东向速度m/sdoublevN;// 北向速度m/sdoublevU;// 天向速度m/s};// speed速度大小m/s// azDeg速度方位角从北轴顺时针量度// elDeg速度高低角从水平面向上量度EnuVelocityenuVelocityFromDirection(doublespeed,doubleazDeg,doubleelDeg){constdoubleazqDegreesToRadians(azDeg);constdoubleelqDegreesToRadians(elDeg);EnuVelocity vel;vel.vEspeed*qCos(el)*qSin(az);vel.vNspeed*qCos(el)*qCos(az);vel.vUspeed*qSin(el);returnvel;}九. 总结一句话合速度 方向角 → 分解成北东天速度距离 方位角 高低角 → 转换成北东天位置。这两套转换本质上是同一套几何思路只是把“斜边”换成“速度”或“距离”。如果你能拿到无人机的飞控日志或雷达数据用这些公式就能把原始数据变成直观的“北、东、天”坐标和速度这才是做路径规划、碰撞预测、弹道解算的基础。