1. 地形感知基础:数字高程模型(DEM)原理、点云数据获取与处理、地形特征提取方法
各位同行,咱们开始第一讲。做复杂地形航线规划,第一步不是打开飞控软件,而是先搞懂脚下的地到底长什么样。我见过太多新手上来就画航线,结果飞机一头撞上山脊——说白了,就是没把地形当回事。
这一章,咱们把地形感知的底子打牢。我会从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年,做矿山边坡监测。那时候设备贵,一平方公里数据要飞好几天。现在便宜多了,消费级无人机挂个激光雷达,一天能干完。
点云获取的三种主流方式
- 机载LiDAR:激光扫描,精度最高(厘米级),能穿透植被。适合森林覆盖区、陡峭山体。缺点:设备贵,数据处理复杂。
- 摄影测量(SfM):用照片重建三维。成本低,带纹理信息。适合裸露地表、建筑区域。缺点:植被区域效果差,对光照敏感。
- 地面激光扫描(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米。这个策略帮我避开了至少三次撞山事故。
山脊线提取——航线规划的“红线”
山脊线是地形特征提取的重中之重。为什么?因为无人机沿山脊飞行时,一旦遇到下沉气流或侧风,很容易撞山。
提取山脊线,我常用水文分析的反向操作:
- 对DEM做填洼处理(避免伪洼地影响流向)
- 计算流向和流量累积
- 提取流量累积为0的区域(即分水岭)
- 对结果做骨架化处理,得到山脊线
嗯,这里要注意:填洼的阈值很关键。设太大,真实山脊会被抹平;设太小,伪山脊太多。我一般设5-10米,根据DEM分辨率调整。
地形特征的可视化表达
光有数据不够,还得让航线规划人员一眼看懂。我习惯把地形特征叠加显示:
- 坡度图用色带:绿色(安全)→黄色(警戒)→红色(危险)
- 山脊线用白色粗线叠加在DEM上
- 危险区域用半透明红色多边形标出
这样做出来的图,飞手一看就知道哪里不能去。我记得有一次给甲方汇报,他们技术负责人看了图说:“这比我们之前用的等高线图清楚一百倍。”
1.4 本章小结
好了,第一讲的内容就这些。总结几个关键点:
- DEM是地形数字化的基础,选对分辨率和数据源比什么都重要
- 点云处理要耐心,滤波参数必须根据地形特点单独调,别偷懒
- 地形特征提取是航线规划的“眼睛”,坡度、山脊线、粗糙度这三个特征,我每次必做
- 工具只是手段,真正值钱的是你对地形的理解和判断力