1. 课程导入

各位同行,咱们开始第一讲。做复杂地形航线规划,第一步不是打开飞控软件,而是先搞懂脚下的地到底长什么样。我见过太多新手上来就画航线,结果飞机一头撞上山脊——说白了,就是没把地形当回事。

这一章,咱们把地形感知的底子打牢。我会从DEM原理讲起,再聊点云怎么拿、怎么处理,最后说说怎么从这些数据里把地形特征“抠”出来。嗯,都是我在项目里摔过跟头才总结出来的东西。

核心观点:地形感知不是“看地图”,而是把三维地表数字化,让无人机能“读懂”山有多陡、沟有多深。

1.1 数字高程模型(DEM)原理

DEM,说白了就是用一堆数字来描述地表起伏。每个格网存一个高程值,连起来就是地形的“数字骨架”。

我记得2018年在云南做电力巡线项目,甲方给的DEM是90米分辨率的SRTM数据。飞进去才发现,山脊线跟实际差了十几米——差点让飞机撞塔。从那以后,我对DEM分辨率就特别敏感。

DEM的三种常见形式

类型 数据组织方式 典型分辨率 适用场景
规则格网(GRID) 等间距矩阵,每个像元存高程 1m~90m 大范围地形分析、航线预规划
不规则三角网(TIN) 由三角形面片构成,顶点带高程 可变(地形复杂处更密) 精细地形建模、陡坡分析
等高线(Contour) 等值线+高程属性 依等高距而定 传统地图、可视化检查

我个人习惯:做航线规划时,先用GRID做全局分析,再用TIN做局部精细避障。GRID计算快,TIN精度高,两者互补。

DEM数据源怎么选?

你想想看,不同数据源精度差很多。我列个表,方便你对照选型:

数据源 分辨率 覆盖范围 获取成本 我的评价
SRTM 30m/90m 全球 免费 够用,但山区误差大
ASTER GDEM 30m 全球 免费 细节比SRTM好,但有空洞
ALOS World 3D 30m 全球 免费 精度不错,我常用
LiDAR点云衍生 0.5m~5m 局部 高 精度之王,项目首选
无人机摄影测量 0.05m~0.5m 局部 中等 灵活,适合小范围精细作业

我的建议:别迷信高分辨率。如果只是做100公里级别的航线预规划,30m DEM完全够用。只有在最后进近段或复杂地形避障时,才需要上LiDAR级精度。否则数据量太大,处理时间够你喝三杯咖啡。

1.2 点云数据获取与处理

点云,就是一堆三维坐标点。每个点包含X、Y、Z,有的还带颜色或回波强度。说白了,这就是地形的“高精度扫描件”。

我最早接触点云是在2015年,做矿山边坡监测。那时候设备贵,一平方公里数据要飞好几天。现在便宜多了,消费级无人机挂个激光雷达,一天能干完。

点云获取的三种主流方式

  1. 机载LiDAR:激光扫描,精度最高(厘米级),能穿透植被。适合森林覆盖区、陡峭山体。缺点:设备贵,数据处理复杂。
  2. 摄影测量(SfM):用照片重建三维。成本低,带纹理信息。适合裸露地表、建筑区域。缺点:植被区域效果差,对光照敏感。
  3. 地面激光扫描(TLS):架站式扫描,精度毫米级。适合小范围精细建模,比如悬崖面、隧道口。缺点:效率低,大范围不适用。

我个人习惯:大范围山区用机载LiDAR,城市或矿区用摄影测量。两者结合效果最好——先用LiDAR打底,再用照片补纹理。

点云处理的核心流程

拿到点云别急着用。原始数据又乱又脏,必须经过这几步:

步骤 做什么 常用工具 避坑点
1. 去噪 剔除飞点、离群点 CloudCompare, PDAL 阈值别设太狠,容易把真实地形削平
2. 滤波分类 区分地面点、植被点、建筑点 LAStools, PDAL 陡坡区域容易误分类,要手动检查
3. 地面点提取 只保留真实地表点 CSF滤波, 渐进形态学 植被密集区效果差,建议结合多回波信息
4. 插值成DEM 把离散点变成规则格网 ArcGIS, GDAL 插值方法选不对,地形细节全丢
5. 精度验证 用检查点评估误差 RMSE计算, 剖面分析 至少留20%的点做独立验证

我曾经踩过的坑:做某山区风电场项目时,点云滤波参数没调好,把山脊上的岩石全当噪点滤掉了。生成的DEM平得像马路,航线规划出来直接撞山。后来花了三天重新处理——记住,陡坡区域的滤波参数一定要单独调,别用默认值!

点云处理代码示例(PDAL)

这里给一段我常用的PDAL处理流程。嗯,别直接复制,要根据你的数据调参数:

{
  "pipeline": [
    "input.las",
    {
      "type": "filters.outlier",
      "method": "statistical",
      "mean_k": 8,
      "multiplier": 2.5
    },
    {
      "type": "filters.csf",
      "classify": true,
      "cloth_resolution": 0.5,
      "rigidness": 3,
      "iterations": 500
    },
    {
      "type": "filters.range",
      "limits": "Classification[2:2]"
    },
    {
      "type": "writers.gdal",
      "filename": "output_dem.tif",
      "resolution": 1.0,
      "output_type": "idw"
    }
  ]
}

这段代码做了三件事:去噪、CSF地面滤波、只保留地面点、插值成1米分辨率的DEM。我建议你先在小范围测试,参数调好了再跑全量数据。

1.3 地形特征提取方法

有了DEM,下一步就是从中提取出对航线规划有用的地形特征。说白了,就是告诉无人机:哪里是坡、哪里是脊、哪里可能撞。

我做过一个统计:在山区航线规划中,80%的撞山风险集中在坡度大于30°的区域和山脊线两侧200米范围内。所以,地形特征提取不是学术游戏,是保命用的。

核心地形特征

特征 定义 对航线规划的影响 提取方法
坡度(Slope) 地表倾斜程度(度或百分比) 陡坡区域需提高安全高度 DEM差分、Horn算法
坡向(Aspect) 坡面朝向(0-360°) 影响光照、侧风方向 DEM梯度计算
地形起伏度 局部高差(窗口内最大-最小高程) 判断地形破碎程度 移动窗口分析
山脊线/山谷线 地形骨架线 航线应避免沿山脊飞行 水文分析、曲率计算
粗糙度(Roughness) 地表凹凸程度 影响避障传感器性能 局部标准差、曲率

坡度提取——最常用的地形分析

坡度计算其实很简单。对DEM每个像元,用周围3x3窗口算梯度:

# Python示例:用GDAL计算坡度
from osgeo import gdal
import numpy as np

def calculate_slope(dem_path, output_path):
    ds = gdal.Open(dem_path)
    dem = ds.ReadAsArray().astype(float)
    cellsize = ds.GetGeoTransform()[1]
    
    # 3x3窗口的梯度计算(Horn算法)
    dz_dx = (dem[1:-1, 2:] - dem[1:-1, :-2]) / (2 * cellsize)
    dz_dy = (dem[2:, 1:-1] - dem[:-2, 1:-1]) / (2 * cellsize)
    
    slope = np.arctan(np.sqrt(dz_dx**2 + dz_dy**2)) * 180 / np.pi
    
    # 保存结果
    driver = gdal.GetDriverByName('GTiff')
    out_ds = driver.Create(output_path, dem.shape[1]-2, dem.shape[0]-2, 1, gdal.GDT_Float32)
    out_ds.GetRasterBand(1).WriteArray(slope)
    out_ds.SetGeoTransform(ds.GetGeoTransform())
    out_ds.SetProjection(ds.GetProjection())
    out_ds.FlushCache()

我的经验:坡度图出来后,别只看数值。我习惯把坡度分成三级:0-15°(安全区)、15-30°(警戒区)、>30°(危险区)。航线规划时,在危险区自动抬高安全高度10-20米。这个策略帮我避开了至少三次撞山事故。

山脊线提取——航线规划的“红线”

山脊线是地形特征提取的重中之重。为什么?因为无人机沿山脊飞行时,一旦遇到下沉气流或侧风,很容易撞山。

提取山脊线,我常用水文分析的反向操作:

  1. 对DEM做填洼处理(避免伪洼地影响流向)
  2. 计算流向和流量累积
  3. 提取流量累积为0的区域(即分水岭)
  4. 对结果做骨架化处理,得到山脊线

嗯,这里要注意:填洼的阈值很关键。设太大,真实山脊会被抹平;设太小,伪山脊太多。我一般设5-10米,根据DEM分辨率调整。

地形特征的可视化表达

光有数据不够,还得让航线规划人员一眼看懂。我习惯把地形特征叠加显示:

  • 坡度图用色带:绿色(安全)→黄色(警戒)→红色(危险)
  • 山脊线用白色粗线叠加在DEM上
  • 危险区域用半透明红色多边形标出

这样做出来的图,飞手一看就知道哪里不能去。我记得有一次给甲方汇报,他们技术负责人看了图说:“这比我们之前用的等高线图清楚一百倍。”

地形感知与航线规划知识体系 地形数据源 数字高程模型 (DEM) 规则格网 (GRID) 不规则三角网 (TIN) 等高线 (Contour) 或 点云数据 (LiDAR/摄影测量) 点云处理流程:去噪 → 滤波分类 → 地面点提取 → 插值成DEM → 精度验证 地形特征提取:坡度 · 坡向 · 起伏度 · 山脊线 · 粗糙度 复杂地形航线规划 核心逻辑:数据源 → DEM/点云 → 特征提取 → 指导航线规划,环环相扣,缺一不可

1.4 本章小结

好了,第一讲的内容就这些。总结几个关键点:

  • DEM是地形数字化的基础,选对分辨率和数据源比什么都重要
  • 点云处理要耐心,滤波参数必须根据地形特点单独调,别偷懒
  • 地形特征提取是航线规划的“眼睛”,坡度、山脊线、粗糙度这三个特征,我每次必做
  • 工具只是手段,真正值钱的是你对地形的理解和判断力