坐标系与空间建模:地理坐标系(WGS84)、局部坐标系(ENU)、栅格地图、八叉树地图、高程地图(DEM)

做航迹规划这么多年,我最大的感触就是——坐标系选不对,后面全白费。你想想看,无人机在天上飞,位置怎么描述?高度怎么算?障碍物怎么表示?这些问题的根,都在坐标系和空间建模上。

今天咱们就把这块硬骨头啃下来。我会结合自己踩过的坑,把WGS84、ENU、栅格地图、八叉树、DEM这些概念讲透。

1. 地理坐标系(WGS84)——全球通用的“身份证”

WGS84,全称World Geodetic System 1984。说白了,它就是地球的一个数学模型。GPS卫星发下来的数据,用的就是这套坐标系。

核心参数:

  • 长半轴 a = 6378137.0 m
  • 扁率 f = 1/298.257223563
  • 地心引力常数 GM = 3986004.418×10⁸ m³/s²

嗯,这里要注意:WGS84给出的是经纬度和椭球高度。经纬度好理解,椭球高度可不是你站在地面上的海拔高度。它是以椭球面为基准的几何高度。

⚠️ 我曾经踩过的坑: 有一次做山区航迹规划,直接用GPS给的椭球高度当海拔用,结果无人机差点撞山。后来才意识到,椭球高度和正高(海拔)之间差了一个大地水准面差距。山区这个差距能到几十米!

WGS84坐标的表示方式:

// 经纬度格式
纬度: 39.9042° N
经度: 116.4074° E
椭球高度: 50.0 m

// 或者度分秒格式
纬度: 39°54'15.12" N
经度: 116°24'26.64" E

2. 局部坐标系(ENU)——飞手视角的“左右前后”

WGS84虽然全球通用,但做局部航迹规划时用起来太麻烦。你想想,要在经纬度上算两点距离,得用大圆距离公式,计算量不小。

这时候ENU坐标系就派上用场了。ENU是East-North-Up的缩写,分别对应东、北、天三个方向。它是个直角坐标系,计算起来特别方便。

ENU坐标系的特点:

  • 原点:通常选在起飞点或地面站位置
  • X轴:指向东(East)
  • Y轴:指向北(North)
  • Z轴:指向天(Up)

我个人习惯在起飞前,先把WGS84坐标转成ENU。这样后续的路径点、障碍物位置,全都在一个直角坐标系里,加减乘除随便用。

💡 转换小技巧: 用geographiclib库或者proj库做转换。我一般用Python的pyproj,几行代码搞定。
import pyproj

# 定义坐标系
wgs84 = pyproj.Proj(proj='latlong', datum='WGS84')
enu = pyproj.Proj(proj='geocent', datum='WGS84')

# 转换函数(简化版)
def wgs84_to_enu(lat, lon, alt, lat0, lon0, alt0):
    # 这里省略了详细的转换矩阵计算
    # 实际项目中用pyproj的Transformer类
    pass

3. 栅格地图——把空间切成小方块

栅格地图,说白了就是把三维空间切成一个个小立方体。每个格子要么是“可通行”,要么是“障碍物”。

为什么用栅格地图?

  • 结构简单,容易理解
  • 路径搜索算法(A*、Dijkstra)直接支持
  • 内存占用可控

但栅格地图有个问题:分辨率。分辨率高了,内存爆炸;分辨率低了,障碍物细节丢失。我建议根据无人机尺寸和飞行环境来定:

应用场景 推荐分辨率 说明
城市巡检 0.5m - 1m 建筑物大,细节要求不高
室内飞行 0.1m - 0.2m 空间小,障碍物多
山区测绘 2m - 5m 地形起伏大,但障碍物少
📌 我的经验: 别把整个地图都存成高分辨率。用分层栅格——远处用粗分辨率,近处用细分辨率。这样既省内存,又保证精度。

4. 八叉树地图——聪明人的栅格

八叉树地图,英文叫OctoMap。它解决了栅格地图的一个大问题:空间利用率。

你想想,一个空旷的飞行区域,大部分格子都是空的。用栅格地图,你得把每个空格子都存下来。八叉树就不一样了——它只记录有障碍物或者不确定的区域。

八叉树的核心思想:

  • 把空间递归分成8个子立方体
  • 如果一个子立方体全是空的,就不再细分
  • 如果一个子立方体有障碍物,继续细分到最大分辨率

我记得有一次做森林环境下的航迹规划,用栅格地图存了2GB数据。换成八叉树后,直接降到200MB。效果立竿见影。

// 八叉树节点结构(伪代码)
struct OctreeNode {
    bool is_leaf;           // 是否是叶子节点
    bool is_occupied;       // 是否被占据
    float occupancy_prob;   // 占据概率
    OctreeNode* children[8]; // 8个子节点
};
⚠️ 注意: 八叉树虽然省内存,但查询速度比栅格慢。因为要递归遍历。实时性要求高的场景,建议用栅格+八叉树的混合方案。

5. 高程地图(DEM)——地形的数字孪生

DEM,Digital Elevation Model,数字高程模型。说白了,就是一张记录了地面海拔高度的栅格图。

DEM的数据来源:

  • 卫星遥感(SRTM、ASTER GDEM)
  • 激光雷达(LiDAR)点云
  • 无人机倾斜摄影

做航迹规划时,DEM特别重要。尤其是低空飞行,你得知道前面有没有山包、有没有陡坡。

DEM在航迹规划中的用法:

  1. 加载DEM数据,得到每个栅格点的海拔
  2. 设定安全飞行高度(比如高于地面50m)
  3. 生成“可飞行曲面”——就是DEM加上安全高度
  4. 在这个曲面上方规划路径
💡 避坑指南: 我曾经直接用SRTM的30m分辨率DEM做规划,结果遇到一个10m宽的峡谷,DEM根本没显示出来。后来我学乖了——先用DEM做粗规划,再用实时传感器做精调。

知识体系总览

下面这张图,是我自己梳理的坐标系与空间建模知识框架。你可以把它当作本章的“地图”:

坐标系与空间建模知识体系 坐标系 WGS84(全球) ENU(局部) 空间建模 栅格地图 八叉树地图 高程数据(DEM) 航迹规划应用:坐标转换 → 空间建模 → 路径搜索 WGS84↔ENU转换 分辨率与精度权衡 实时传感器融合 图:坐标系与空间建模知识体系总览

这张图把本章的核心内容串起来了。你看,坐标系是基础,空间建模是手段,DEM是补充,最终都服务于航迹规划这个目标。

好了,坐标系与空间建模这块,咱们就聊到这儿。记住一句话:坐标系选对,规划不累;空间建好,避障没烦恼。


专注资料整理