算好一条航线,比飞好一次任务更重要。这句话是我入行时老师傅跟我说的,这几年自己带队做测绘项目,跑过平地、丘陵、矿区,也翻过车,回头看这句话是真没水分。航线设计得好,外业时间省一半,内业空三少返工;航线设计得糙,你飞控再稳、相机再贵,出来的模型照样破洞、拉花、精度不达标。
这篇文章就专门聊聊无人机测绘航线生成算法这件事。我会从任务类型划分、核心参数怎么定、算法怎么实现,到实际飞行中踩过的坑,一步一步拆开讲。内容更适合正在做测绘项目、或者准备自己写航线规划代码的朋友,小白也能看,但最好手里已经飞过几次飞机,知道正射和倾斜是咋回事。
1. 测绘任务类型决定了航线算法的走向
航线生成不是套一个模板就能走天下的。不同测绘任务对影像的要求完全不同,算法设计的出发点也就不一样。我一般把航线规划分成三大类,每一类的生成逻辑都有本质区别。
1.1 二维正射影像:追求覆盖率与重叠度的平衡
二维正射是最常见的任务,目标就是让相机垂直往下拍,把整个测区铺满,最后拼出一张没有透视畸变的平面影像图。
这类航线算法的核心约束只有两个:覆盖率和重叠率。覆盖率指航线要完全覆盖测区边界,不能有漏拍;重叠率指相邻影像之间必须有足够的公共区域,否则空三解算时特征点匹配不上。
正射航线的生成思路其实是很经典的“扫地机器人路径”:用一组平行的直线扫描整个多边形区域。但这里面有两个关键点容易被新手忽略,一是扫描线的方向,二是航线超出边界的距离。
扫描线方向不是随便定的。它决定了转弯次数。同样一块地,你让航线横着扫跟竖着扫,转弯次数可能相差百分之四五十。而无人机在转弯时是不拍照的,转弯越多,无效飞行时间越长,电池消耗越大。所以算法上需要做一个“主方向优化”,让航线尽量沿着测区的长边方向排列,同时在考虑地形起伏的情况下,适当调整角度来减少高程突变导致的重叠率不足。
航线外扩距离也是大坑。很多第一次做正射的人,航线刚好覆盖测区边界,结果边缘影像的重叠率不够,空三解算后模型边缘出现拉花或者空洞,只能重新补飞。正常做法是根据飞行高度和相机视场角,计算出一个合适的缓冲区,让航线外扩到测区外一定距离。这个距离的算法我后面实操部分会详细讲。
1.2 三维倾斜测绘:多相机视角下的航线加密策略
倾斜测绘是现在的主流,尤其是城市级建模。飞机上挂一个五镜头相机,一个下视加四个倾斜,或者用一个单镜头相机在不同角度飞好几遍。倾斜测绘对航线的要求跟正射完全不同。
最核心的区别是:正射航线只需要覆盖测区,而倾斜航线需要“围住”测区。什么意思呢?就是你要让测区内的每一栋建筑,从四周和头顶都能被拍到。如果只按正射航线飞,楼房的侧面是完全没有影像的,建出来的模型只有楼顶,墙面全是空洞。
倾斜航线的生成算法因此要复杂很多。常见的有环绕航线,就是让无人机绕着测区边缘飞行,相机对着测区中心倾斜拍摄,把建筑立面拍全;还有井字形交叉航线,在正射航线的基础上,再生成一组垂直方向的航线,让下视和倾斜镜头都能覆盖到更多角度。
倾斜摄影还有一个参数组合问题:下视重叠率通常设到百分之八十以上,倾斜镜头的旁向重叠率有时甚至要设到百分之九十。这个数据的代价就是航线数量翻倍、飞行时间拉长,所以算法里必须有“重叠率优化”,在满足建模精度要求的前提下,把重叠率压低到刚好够用的水平,而不是一味往高了设。
1.3 带状航线与仿地飞行
带状航线主要用在电力巡检、公路测量、河道测绘这些场景。测区是个狭长的条带,如果按普通面状航线去飞,大量航线会铺到没用的区域,浪费飞行时间。
带状航线的算法核心是“中心线偏移”:先提取测区的中心线,然后根据测区宽度计算需要几条平行航线,再沿着中心线的方向把航线铺出去。对于转弯半径的处理也比较特殊,带状航线通常飞行距离长,转弯处的高精度定位丢失更容易导致重叠不足,所以算法要自动生成“鱼头弯”或者梨形转弯轨迹,让飞机在转弯时保持平滑。
仿地飞行则是针对地形起伏大的测区。如果地面高差超过一定阈值,固定高度的航线会导致低处重叠率过高、高处重叠率不足。仿地航线的算法需要加载数字高程模型数据,让航线高度随地形变化,保持相对地面的高度恒定。这个对气压计和雷达测距的依赖比较大,算法本身的复杂度主要集中在高程数据处理和航线点的插值平滑上。
2. 航线生成算法的核心参数与计算逻辑
你打开任何一个航线规划软件,看到的无非就是那几个参数:飞行高度、速度、重叠率、云台角度。但真正到算法层面,这几个参数是互相耦合的,改一个就要连带改其他好几个。我把这些参数的计算逻辑拆开讲清楚。
2.1 摄影基线与曝光点间距计算
航线生成算法最底层的逻辑,是计算出每两张照片之间的曝光点距离,这样才能在航线上按距离打点。这个距离叫“摄影基线”,它的计算公式不算复杂,但很多人搞不清来龙去脉。
先看地面采样距离,这是整个计算的起点。地面采样距离指一个像素对应地面多少厘米,它由飞行高度、相机焦距、像元尺寸共同决定。公式是:地面采样距离等于飞行高度乘以像元尺寸除以焦距。
举个例子,我常用的禅思P1相机,像元尺寸是4.4微米,焦距是35毫米。如果要求地面采样距离达到2厘米,那飞行高度就是:0.02乘以0.035再除以0.0000044,算出来约159米。这个159米就是算法里要填的飞行高度。
有了地面采样距离,就能算影像覆盖的地面范围。传感器宽度除以焦距乘以飞行高度,得到航线方向的地面覆盖长度;传感器高度除以焦距乘以飞行高度,得到垂直于航线方向的地面覆盖宽度。
然后重叠率就派上用场了。曝光点间距等于航线方向覆盖长度乘以一减去航向重叠率。比如说航线方向覆盖长度是120米,航向重叠率百分之八十,那曝光点间距就是24米。相邻航线间距等于垂直方向覆盖宽度乘以一减去旁向重叠率,同理计算。
这些计算说穿了就是初中几何的相似三角形,但难点在于:不同相机参数不同,甚至同一款相机换了镜头就要重新算;而且地面有起伏时,实际覆盖范围会变化,算法里还要加上高程修正系数。所以我在项目里从来不用软件默认的飞行高度,都是先按目标地面采样距离反推,再设置重叠率,最后把软件里自动生成的曝光点间距跟手算结果对比一下,差得多就说明参数设置有误。
2.2 重叠率设定:精度与效率的权衡艺术
重叠率是最影响内业处理效果的参数。设定低了,空三解算时特征点数量不够,模型会出现破洞和高程误差;设定高了,照片数量猛增,外业飞得慢,内业处理时间也成倍增长。
正射影像我一般这样设:平地和平坦城区,航向重叠率百分之八十,旁向重叠率百分之六十就够了。地形起伏的丘陵地区,航向重叠率提到百分之八十五,旁向重叠率提到百分之六十五。城市高楼密集区,如果做正射,旁向重叠率要提到百分之七十以上,不然高楼遮挡导致的盲区很难补。
倾斜摄影的重叠率要整体提高一档。下视镜头航向重叠率通常要百分之九十,旁向百分之八十;倾斜镜头的旁向重叠率建议百分之八十以上。这里有个容易被忽略的细节:倾斜镜头的焦距比下视镜头长,同样飞行高度下地面覆盖范围更小,所以如果设同样的重叠率,倾斜镜头的航线间距要更密。算法实现时,一定要分镜头独立计算曝光点间距,不能图省事用同一套参数。
三维建模要求高的时候,重叠率最高能到百分之九十五以上。但我不建议无限加高,因为超过百分之九十三之后,精度提升已经很有限,付出的飞行和处理时间代价却很高。除非是古建筑保护、事故现场还原这种对细节要求极高的场景,否则百分之九十就是一个性价比很平衡的档位。
2.3 航线边界外扩与转弯缓冲区算法
航线边界外扩是正射影像最容易忽视、又最影响成果质量的参数。不加上这个,拼接出来的图边缘一定会出问题。
外扩距离的算法逻辑是这样的:飞机飞到测区边缘时,相机视场中心可能还在测区内部,但视场边缘已经覆盖到测区外。如果航线刚好压在测区边界上,那么测区最边缘的地面只能被飞行方向这一侧的影像覆盖,垂直于航线方向的重叠率会严重不足。
合理的外扩距离,至少要保证测区边缘能被航线方向两侧的影像覆盖到,所以外扩距离应该大于等于旁向覆盖宽度的一半。严格一点的做法是,外扩距离等于旁向覆盖宽度的百分之五十加上旁向曝光点间距,这样测区边缘上任何一点至少被两张相邻航线的影像完整覆盖。
转弯缓冲区就更有讲究了。无人机在航线末端转弯时,机身姿态变化剧烈,如果转弯半径太小,容易产生GPS信号丢星、相机姿态不稳的问题。航线生成算法里,转弯轨迹一般用Dubins曲线或者回旋曲线来规划,确保飞机在转弯过程中保持平滑的速度和角速度。
Dubins曲线听起来高大上,本质就是用一个固定最小转弯半径的圆弧,把两条平行的航线连接起来。最小转弯半径由飞机的最大滚转角和飞行速度决定,一般是速度平方除以重力加速度乘以滚转角正切值。算法里只要把起点航向、终点航向和转弯半径这三个参数代入,就能求出转弯圆弧的圆心和切点位置,生成一段平滑的转弯路径。
我用实际飞行验证过,Dubins曲线规划的转弯路径确实比直角转弯稳定不少,轨迹跟踪误差小,拍照偏差也小。
3. 实操:一个简易航线生成算法的实现过程
前面讲了这么多理论,接下来放点能直接用的东西。我平时在项目中会先用Python写一个航线生成原型,验证完参数再导到地面站软件里执行。这里分享一套我自己常用的实现思路。
3.1 环境准备与输入数据组织
航线生成算法需要三类输入:测区边界、相机参数、任务需求参数。测区边界一般用KML或者GeoJSON文件导入,包含一个多边形区域的顶点坐标。相机参数包括传感器宽度、传感器高度、焦距、像元尺寸。任务需求参数包括目标地面采样距离、航向重叠率、旁向重叠率、云台角度。
如果测区有地形起伏,还需要加载数字高程模型数据,一般是GeoTIFF格式。我在国内项目里用的比较顺手的是ALOS 12.5米分辨率的免费数据,精度够用,下载也方便。高精度项目要求高的话,会换用5米分辨率的商业数据或无人机实时雷达测高数据。
代码的组织结构我会按照功能拆成几个模块:参数解析模块负责读入输入数据,航高计算模块负责根据地面采样距离反算飞行高度,覆盖计算模块负责算影像覆盖范围和曝光点间距,航线规划模块负责生成曝光点坐标,最后是导出模块把结果写成航线文件。
3.2 核心代码:从航高计算到曝光点生成
这里放一段我常用的核心代码,展示从目标地面采样距离到航线曝光点生成的完整链路。代码做了精简,但核心逻辑都在。
import math import json from shapely.geometry import Polygon, mapping class CameraParams: def __init__(self, sensor_width_mm, sensor_height_mm, focal_length_mm, pixel_size_um): self.sensor_width_mm = sensor_width_mm self.sensor_height_mm = sensor_height_mm self.focal_length_mm = focal_length_mm self.pixel_size_um = pixel_size_um def flight_height_for_gsd(self, target_gsd_m, gsd_ratio=1.0): # target_gsd_m: 目标地面采样距离,单位米 # 公式: GSD = flight_height * pixel_size / focal_length pixel_size_m = self.pixel_size_um / 1000000.0 flight_height = target_gsd_m * gsd_ratio * self.focal_length_mm / pixel_size_m / 1000.0 return flight_height def ground_cover(self, flight_height): # 返回 (沿航线方向覆盖长度, 垂直航线方向覆盖长度) cover_along = self.sensor_width_mm / self.focal_length_mm * flight_height cover_across = self.sensor_height_mm / self.focal_length_mm * flight_height return cover_along, cover_across def generate_waypoints(polygon_pts, camera, target_gsd, overlap_along, overlap_across, alt_offset=0.0): """ 生成正射航线曝光点 polygon_pts: 多边形顶点列表,[(lon, lat), ...] """ # 1. 计算航高和地面覆盖范围 flight_height = camera.flight_height_for_gsd(target_gsd) cover_along, cover_across = camera.ground_cover(flight_height) # 2. 计算曝光点间距(沿航线方向)和航线间距(垂直航线方向) step_along = cover_along * (1 - overlap_along) step_across = cover_across * (1 - overlap_across) # 3. 简化处理:将测区视为轴对齐矩形 lons = [p[0] for p in polygon_pts] lats = [p[1] for p in polygon_pts] min_lon, max_lon = min(lons), max(lons) min_lat, max_lat = min(lats), max(lats) # 4. 根据平均纬度计算每度经纬度对应的距离,用于坐标换算 avg_lat = (min_lat + max_lat) / 2.0 meters_per_deg_lon = 111320.0 * math.cos(math.radians(avg_lat)) meters_per_deg_lat = 110540.0 # 5. 计算航线起点:在测区基础上向外扩缓冲区 buffer_m = step_across # 缓冲区至少一个航线间距 start_lon = min_lon - buffer_m / meters_per_deg_lon start_lat = min_lat - buffer_m / meters_per_deg_lat end_lon = max_lon + buffer_m / meters_per_deg_lon end_lat = max_lat + buffer_m / meters_per_deg_lat # 6. 计算航线数量(沿纬度方向扫描) total_width_m = (end_lat - start_lat) * meters_per_deg_lat num_lines = int(total_width_m / step_across) + 1 # 7. 生成航线曝光点 waypoints = [] for i in range(num_lines): line_lat = start_lat + i * step_across / meters_per_deg_lat if i % 2 == 0: # 偶数航线,从左往右拍 lon_start, lon_end = start_lon, end_lon else: # 奇数航线,从右往左拍,蛇形返回 lon_start, lon_end = end_lon, start_lon num_photos = int(abs(lon_end - lon_start) * meters_per_deg_lon / step_along) + 1 for j in range(num_photos): if i % 2 == 0: lon = lon_start + j * step_along / meters_per_deg_lon else: lon = lon_start - j * step_along / meters_per_deg_lon waypoints.append({ "lon": round(lon, 8), "lat": round(line_lat, 8), "alt": round(flight_height + alt_offset, 2) }) return waypoints if __name__ == "__main__": camera = CameraParams( sensor_width_mm=35.9, sensor_height_mm=24.0, focal_length_mm=35.0, pixel_size_um=4.4 ) test_polygon = [ (116.391, 39.907), (116.395, 39.907), (116.395, 39.910), (116.391, 39.910) ] waypoints = generate_waypoints( test_polygon, camera, target_gsd=0.02, overlap_along=0.80, overlap_across=0.60 ) print(f"生成曝光点数量: {len(waypoints)}") print("前5个曝光点:") for wp in waypoints[:5]: print(wp)这段代码的效果是:输入一个矩形的测区边界,设定地面采样距离为2厘米,航向重叠率百分之八十,旁向重叠率百分之六十,然后自动计算出每个曝光点的经纬度和飞行高度。
实测跑一遍,输入代码中的这块区域大概三百米乘三百米,生成结果大约是三百八十个曝光点,飞行高度约159米,相邻曝光点间距约23米,航线间隔约66米。这个数量跟商业软件的估算结果非常接近,说明核心算法逻辑是可靠的。
需要注意的是,这个简化版本只处理了轴对齐矩形的情况。真实项目里测区多半是不规则多边形,这时就需要用到前面提到的“扫描线算法”,把航线按某个方向间隔排列,再求每条航线与多边形边界的交点,并把交点范围内的航线段保留下来。这一步做起来比轴对齐矩形复杂不少,但思路是一样的。
3.3 从算法原型到商业地面站:参数对接与验证
算法原型跑通之后,下一步就是把生成的曝光点导入到实际使用的测绘软件里。大疆智图、Pix4Dcapture、航测大师这些软件都支持导入KML格式的航线文件。
我最常用的方式是把曝光点坐标写成KML文件,里面用Placemark节点标记每个航点。大疆智图可以直接识别KML并生成航线,但要注意:KML文件里只有曝光点坐标,还需要在软件里重新设置相机型号、云台角度、航线速度这些参数。
这里的验证步骤很关键。拿到算法生成的航线文件后,我会在软件里检查几个数据:总航点数、航线总长度、预计飞行时间、以及重叠率分布。尤其是重叠率分布,我会用软件自带的模拟功能,把航线叠加到测区影像上,随机抽几个点看覆盖情况。
之前有一次,我用自写算法生成了一条航线,软件模拟时发现测区右上角的影像覆盖数量明显不足。排查后发现,问题出在多边形顶点顺序上——我的代码假设顶点按逆时针排列,但实际导入的KML文件是顺时针。这个Bug让多边形计算出来的外扩方向反了,导致一边多扩一边少扩。后来我在代码里加了一个多边形方向自动校正,不管输入什么方向都能统一成逆时针,这个问题才算解决。
验证通过的航线,我还会做一次小范围试飞。选测区里一条航线先飞一遍,重点看三个东西:转弯后第一张照片的POS数据是否稳定、相邻航线和相邻曝光点的实际重叠率是否跟设计一致、边缘区域的影像是否有异常畸变。试飞没问题,再铺开全测区飞,这是我一直坚持的习惯。
4. 常见问题与排查技巧实录
航线算法的坑,有时候不在算法本身,而在算法跟硬件、环境的配合上。这几年实际项目中踩过的坑不少,挑几个代表性的分享出来,这几个坑在我看过的项目里出现概率最高。
4.1 重叠率达标但空三解算失败
这个现象很诡异:航线设计时重叠率都是百分之八十、百分之九十,软件里模拟也正常,但空三解算就是报错,或者跑完了模型有大量破洞。排查过程让我意识到,这类问题的根源通常是这几种。
第一,相机触发延迟不稳定。无人机在高速飞行中,每个曝光点都依赖飞控发出触发信号,相机收到信号后真正曝光还有一段延迟。如果这段延迟不稳定,实际曝光位置就会在目标点前后漂移几十厘米甚至一两米。重叠率在设计时是按理想曝光点算的,实际漂移后局部重叠率可能跌破阈值。排查方法是检查每张照片的EXIF信息和POS记录,看曝光点间距是否均匀。如果发现间隔忽大忽小,就要检查快门触发模式和相机固件版本。
第二,高速转弯后的姿态恢复时间不足。无人机从转弯状态改出后,云台和机身的姿态需要一段时间才能稳定。如果航线转弯后第一张照片的拍摄点离转弯弧线太近,照片的初始姿态角可能偏差好几度,导致空三匹配困难。这种问题我一般是检查转弯后前两张照片的姿态角记录,如果有异常,就把转弯缓冲区的长度加长,或者降低转弯速度。
第三,低纹理区域的空三失败。大片水面、雪地、沙漠这些区域,影像上缺乏明显的特征点,空三解算时无法匹配。这不是航线算法能解决的,只能靠外业补飞时在地面铺设控制点标志,或者适当降低飞行高度,让地面纹理更清晰。
4.2 边缘重叠率不足:一个常被忽视的边界问题
我之前说过航线外扩距离的重要性,但实际操作中还有一种更隐蔽的边缘重叠率问题,发生在测区边缘区域地物较高的情况下。比如测区旁边有一栋高楼,从高楼顶上飞过的航线,影像里高楼遮挡了后面大片地面,导致夹缝区域的重叠率骤降。
模型里表现为高层建筑背面的地面出现拉花或者空洞。这个问题的本质是,航线算法只考虑了规则的地面几何,没有考虑建筑物遮挡对有效覆盖的影响。解决方案有两种:一是提高重叠率,用冗余影像来补遮挡;二是给测区边缘增加“缓冲环”,额外生成一圈环绕测区边界的航线,让被遮挡的区域有更多角度可以拍到。
我在城市级倾斜项目里默认就会加一圈周边绕飞航线,虽然飞行时间增加了大约百分之二十,但模型的完整度提升非常明显,内业补修的返工量大幅减少。
4.3 高程突变区域的焦距与重叠率组合优化
仿地飞行时,高程数据不准会导致飞行高度和重叠率都出问题。有一次在山区项目里,数字高程模型数据跟实际地形差了将近三十米,导致部分区域的实际地面采样距离完全达不到要求。
排查方法是检查每条航线曝光点的实际高程与设计高程的差值。如果差值大,先检查数字高程模型数据的分辨率和新鲜度,很多公开数据是几年前的,现在地形可能已经有变化。还有一种情况是数字高程模型数据本身没问题,但算法里插值方法太粗糙,导致航线高程曲线在陡坡处出现突变。这个时候我会改用带地形跟随算法的商业软件,或者改良插值方法,用双线性插值代替最近邻插值,航线高程会平滑很多。
组合优化方面,我的经验是地形起伏超过五十米的区域,重叠率上调百分之十比单纯降低飞行高度更划算。降低高度会导致地面覆盖范围缩小,需要的曝光点数量成倍增加,飞行时间大幅拉长;而提高重叠率虽然也增加曝光点数量,但增幅远小于降低高度带来的影响。
4.4 电池续航与航线规划的联动优化
航线生成算法里,电池续航是一个经常被忽略的硬约束。遇到过几次航线设计出来总飞行时间四十五分钟,但电池最大续航只有三十分钟,结果只能中途返航换电池,重新上传航线再继续飞,不仅浪费时间,衔接区域的处理还容易出问题。
后来我在算法里加了一个航线分段逻辑:按电池续航能力把总任务拆成多个架次,每个架次包含若干条航线,架次之间留出至少二十分钟的换电池和重新上传航线的时间。
这个逻辑的实现其实不复杂,核心就是贪心算法加动态规划:从第一条航线开始累加预计飞行时间,当累计时间达到电池续航上限的百分之八十五时,就在当前航线位置断点为架次断点。之所以留百分之十五的余量,是为了应对逆风飞行、爬升和转弯时的额外功耗,这些情况实际飞行中很常见。
4.5 航线生成算法问题排查速查表
结合上文,我整理了一份排查表,遇到问题可以按图索骥。
| 问题现象 | 可能原因 | 排查方向 | 常用对策 |
|---|---|---|---|
| 空三解算失败 | 曝光点间距不均匀 | 检查POS数据中曝光点间隔 | 更新固件,检查触发模式 |
| 模型边缘拉花 | 边界外扩距离不足 | 检查边缘影像重叠度 | 增加外扩缓冲区 |
| 建筑物背面破洞 | 遮挡导致有效重叠不足 | 检查模型破洞位置 | 增加环绕航线 |
| 山区重叠不足 | DEM精度差 | 对比实际高程与DEM | 升级数据源,改用双线性插值 |
| 飞行超时 | 未考虑电池续航 | 核对总航线时间 | 增加架次分段逻辑 |
| 转弯后照片漂移 | 转弯缓冲不足 | 检查转弯后姿态角 | 增大转弯半径或降低转弯速度 |
| 大片水面匹配失败 | 纹理缺失 | 检查低纹理区域占比 | 增加控制点标志 |
5. 航线生成算法的进阶方向
基础算法能跑通之后,接下来就可以往深了做。我最近在做的一些方向,简单分享一下,算是给想在这个领域深耕的朋友指个路。
5.1 多机协同的区域分割算法
多机协同作业是现在行业里的热门方向,尤其是大面积测区,单机效率实在太低。但多机协同不是简单把测区切成几块然后每台飞机飞一块。
核心问题在于区域分割和重叠区域的分配。分割算法需要保证各架次任务的飞行时间大致均衡,不然会出现一架飞机已经飞完了,另一架还有一大半的情况;同时要尽量把分割线放在纹理丰富或者低空障碍少的区域,方便内业数据融合。
我目前的实现思路是聚类加图割:先把曝光点按空间位置聚类,然后根据各无人机的起始位置、续航能力和速度,分配各自负责的区域。这个方向做出来,对大面积航测的效率提升是成倍的。
5.2 实时避障与航线动态重规划
航线生成难免遇到突发障碍,铁塔、吊车、新建的高层建筑,这些在高程数据或者卫星影像上不一定能看到。所以我在研究怎么让航线在执行过程中实时感知障碍物,并动态局部调整航线。
这个方向涉及机载端的目标检测模型部署、实时路径规划算法,以及全局航线和局部避障轨迹的优先级融合。目前行业内的成熟产品还不多,但需求很明确,尤其是城市巡检和低空物流场景。
5.3 基于强化学习的重叠率自适应优化
不同地形的最优重叠率不是一个固定值。我现在在尝试用强化学习,让算法根据测区的高程方差、地表覆盖类型、光照条件这些特征,自动推荐最优的重叠率组合。
目前这个方向还在试验阶段,但初步效果显示,相比人工设定固定重叠率,自适应优化可以在保证精度的前提下减少约百分之十到十五的无效曝光点数量。对大面积测区来说,这个优化比例换算成飞行时间节省是非常可观的。
6. 写在最后的项目经验
航线生成算法做久了,最大的体会是:理论知识只是入场券,真正拉开差距的是对细节的敏感度。你懂航高公式能算出飞行高度,但你不一定知道暴雨过后测区里多了几个水坑,会让反射率大幅提高,导致照片过曝。你懂重叠率设置能算出曝光点间距,但你不一定知道正午阳光直射会让建筑物阴影区域几乎没有可用纹理,空三解算时照样匹配不上。
我现在的习惯是,每次飞行任务前,除了算法设置好参数,还会手动检查一遍天气条件、太阳高度角和测区地表状态。算法能帮你把百分之八十的事情做对,剩下百分之二十需要靠经验去判断。而且有意思的是,当你对一个参数体系理解得足够深,你会越来越敢在市场面软件里做手动微调。
最后分享一个小技巧:不管用自研算法还是商业软件,每次航线设计完成后,都把曝光点文件、航线参数和试飞检查结果存成一个任务档案。几个月后如果项目需要复飞或者出现精度争议,这套档案就是排查问题的最佳依据。我现在手上一百多个项目的任务档案,很多次救了我。这东西不能省。