📖 目录
- 一、业务痛点分析
- 1. 纯自动化方案落地难
- 2. 纯人工绘制工作量大
- 3. 多类型建筑适配问题
- 二、整体技术路线
- 三、关键模块详细设计
- 3.1 大模型实例分割模块
- 3.2 轮廓智能预处理模块
- 核心代码(几何清洗:去孔洞 / 保角点平滑 / 凹凸识别)
- 3.3 立面Zig-Zag航线规划算法
- 核心代码(弧长参数化 → 柱面展开 → 竖向往复扫描 → 逆映射+法线偏移)
- 3.4 最终效果图
- 3.5 人机协同交互设计(本方案核心创新点)
- 四、适用场景与边界
- 五、方案优势总结
摘要
在建筑无人机立面巡检场景,传统全自动航线方案(如3DGS重建+占用网格自动规划)技术上可实现,但落地痛点突出:复杂异形建筑、外立面凹凸构件、现场遮挡会导致自动规划航线频繁失效;一线巡检人员习惯基于二维影像人工勾勒轮廓的交互模式,全自动方案学习成本高,自动输出结果仍需大量手工编辑。
本文提出一套大模型辅助的半自动化立面Zig-Zag巡检航线方案。核心思想不是完全替代人工,而是将「轮廓提取、轮廓预处理、立面几何推理」交给大模型与实例分割能力完成,人工负责校验、约束调整与最终航线确认;航线采用立面直上直下竖向Zig-Zag牛耕扫描,兼顾全覆盖巡检需求和业务人员的操作习惯。方案兼容常规粗建模流程,同时支持仅依靠正射影像快速生成航线初稿,提升现场作业效率。
一、业务痛点分析
1. 纯自动化方案落地难
基于3D高斯重建构建占用网格做全自动航线规划,依赖完整三维重建成果。遇到外立面支架、幕墙凹凸、树木遮挡,重建会产生畸变,生成的航线容易出现碰撞风险、漏扫区域。即便算法生成航线,现场工程师几乎都要逐段编辑,自动化产出的初稿可用率偏低。
2. 纯人工绘制工作量大
传统手动工作流:
- 在正射影像上手工打点描绘建筑外轮廓
- 轮廓平滑、剔除多余噪点
- 设置建筑高度拉伸生成立面
- 在立面布设Zig-Zag航线
其中人工勾勒轮廓最耗时,大面积异形建筑打点数量多,轮廓精度受操作人员经验影响。
3. 多类型建筑适配问题
圆形场馆、不规则弧形建筑、组合多边形建筑,人工描边难度更高;单纯固定模板航线无法自适应建筑外边界。
方案定位:AI负责生成高质量轮廓初稿,人做决策与约束校验,人机协同,半自动化输出Zig-Zag立面巡检航线。
二、整体技术路线
整体链路:
影像输入 → 大模型+实例分割提取建筑轮廓 → 大模型轮廓智能预处理 → 轮廓拉伸生成立面几何面 → 立面Zig-Zag航线自动布点 → 人工交互编辑与安全约束校验 → 输出可执行无人机航线各环节说明:
影像输入:航拍正射影像/卫星影像,框选目标建筑区域;也可接入粗建模得到的三维点云作为高度参考。
大模型实例分割:调用大模型驱动的实例分割能力,识别目标建筑,剔除阴影、地面植被、周边附属构筑物,输出建筑二值Mask。
轮廓智能预处理(大模型能力):大模型识别Mask中噪点、空洞,自动平滑轮廓;区分主建筑本体和附属小构件;支持自动拆分多连体建筑,输出标准化GeoJSON矢量轮廓。
- 人工可选操作:轮廓局部微调、删减多余面、补充分割遗漏区域。
立面构建:以二维轮廓为底面,参考粗建模三维成果/人工设定高度,向上拉伸生成封闭竖向立面。立面携带外法线信息,用于后续航线偏移计算。
Zig-Zag航线规划(核心):在立面表面生成竖向直上直下牛耕往复航线。
沿着建筑底面轮廓做弧长参数化,将闭合立面展开为二维矩形平面(横轴=建筑环向弧长,纵轴=建筑高度)
在展开平面布设航线:沿高度方向垂直扫描(直上直下),到达顶部/底部边界后,沿环向前进一个扫描步距,反向垂直扫描;重复该过程,完成整个立面全覆盖。
将平面航点映射回三维空间,沿立面外法线向外偏移固定安全距离,得到建筑外侧巡检航点;航点附带相机朝向,镜头对准建筑立面。
人工交互校验:操作人员可视化检查航线,修改扫描步距、安全距离、局部避让区域,删除危险航点。
导出航线:输出无人机可识别的航点任务文件。
✅航线特点:每一段主航段严格垂直(直上直下),仅在上下端点做环向短步进,不是螺旋,不是斜向,不是横向扫描。完美匹配立面病害全覆盖巡检。
三、关键模块详细设计
3.1 大模型实例分割模块
区别于传统分割模型,采用多模态大模型做前置理解。
- 输入:框选后的影像截图,附带自然语言提示词——“识别图中的主体建筑,不要阴影、树木、地面附属设施,输出建筑边界mask。”
- 能力:
- 理解复杂场景语义,区分建筑本体与阴影,解决传统分割容易把阴影划入建筑轮廓的问题;
- 自动识别多个独立建筑实例,分开输出轮廓;
- 输出Mask转换为GeoJSON矢量,直接导入GIS/航线规划引擎。
3.2 轮廓智能预处理模块
传统分割Mask常带有锯齿、孔洞,人工修复繁琐。由大模型辅助做几何清洗:
过滤微小噪点,消除Mask零散碎块;
轮廓平滑,保留建筑主体拐点,不丢失关键转角;
识别轮廓内凹/外凸,标记高风险区域(后续航线可预留更大安全距离)。
人工干预入口:一键编辑矢量轮廓,增删顶点。
核心代码(几何清洗:去孔洞 / 保角点平滑 / 凹凸识别)
importmathimportnumpyasnpfromshapely.geometryimportPolygon,MultiPolygonfromshapely.opsimportunary_unionfromshapelyimportmake_validdefclean_contour(geom,min_hole_area_m2=5.0):"""去内孔(空洞)与细碎自交,返回干净的单/多多边形。"""ifnotgeom.is_valid:geom=make_valid(geom)parts=geom.geomsifisinstance(geom,MultiPolygon)else[geom]out=[]forpinparts:ifp.is_emptyorp.area<1e-6:continueholes=[hforhinp.interiorsifPolygon(h).area>=min_hole_area_m2]# 丢弃小孔洞out.append(Polygon(p.exterior,holes))returnunary_union(out)defsmooth_contour_preserve_corners(coords,smooth_iter=3,corner_angle_deg=150.0):""" 类Chaikin平滑,但保留关键拐点(转角>阈值不削角)。 coords: (N,2) 环(不含重复闭合点) 返回: (M,2) 平滑后环 """P=np.asarray(coords,dtype=float)protect=np.zeros(len(P),dtype=bool)foriinrange(len(P)):a=P[(i-1)%len(P)];b=P[i];c=P[(i+1)%len(P)]v1,v2=a-b,c-b n1,n2=np.linalg.norm(v1),np.linalg.norm(v2)ifn1<1e-9orn2<1e-9:continueang=math.degrees(math.acos(np.clip(np.dot(v1,v2)/(n1*n2),-1,1)))protect[i]=ang<corner_angle_deg# 尖角保护cur=P.copy()for_inrange(smooth_iter):new=[]n=len(cur)foriinrange(n):ifprotect[i%len(protect)]:new.append(cur[i]);continuep0,p1=cur[i],cur[(i+1)%n]new.append(0.75*p0+0.25*p1)new.append(0.25*p0+0.75*p1)cur=np.array(new)returncurdefclassify_concavity(coords):""" 标记每个顶点的内凹/外凸(假设CCW)。返回 +1 外凸 / -1 内凹。 用于对内凹(高风险)区域预留更大安全距离。 """P=np.asarray(coords,float)n=len(P)sign=np.zeros(n,dtype=int)foriinrange(n):a,b,c=P[(i-1)%n],P[i],P[(i+1)%n]cross=np.cross(b-a,c-b)# CCW下 cross>0 为外凸sign[i]=1ifcross>0else-1returnsign3.3 立面Zig-Zag航线规划算法
- 对底面闭合轮廓做离散采样,计算轮廓弧长,建立弧长-平面坐标映射,将柱面展开为矩形。
- Y轴:建筑高度;X轴:沿建筑外壁的环向弧长。
- 在展开矩形生成扫描路径:
- 起点:矩形左下角;向上直行扫描至矩形顶部;
- 到达顶部,X方向前进一个扫描带宽(步进);
- 向下直行扫描至矩形底部;
- 到达底部,X方向继续步进;循环直至覆盖整个矩形。
- 逆映射回三维:利用弧长反向定位底面位置,高度由Y值确定;利用多边形外法线,向外偏移安全距离,得到航点。
- 相机姿态:每个航点相机视线指向建筑立面,保证影像正对墙面。
算法优势:扫描行是纯竖向直线,照片拍摄方向稳定,后期影像拼接、病害识别更友好。
核心代码(弧长参数化 → 柱面展开 → 竖向往复扫描 → 逆映射+法线偏移)
importmathimportnumpyasnpdefresample_ring(coords,ds):""" 把闭合环按等弧长 ds 重采样。 返回: samples (M,2), cum_s (M,), total_len, normals (M,2)[向外] """P=np.asarray(coords,float)ifnotnp.allclose(P[0],P[-1]):P=np.vstack([P,P[0]])# 闭合成环seg=np.diff(P,axis=0)seg_len=np.linalg.norm(seg,axis=1)cum=np.concatenate([[0.0],np.cumsum(seg_len)])total=cum[-1]s=np.arange(0.0,total,ds)pts=np.empty((len(s),2))fori,siinenumerate(s):k=np.searchsorted(cum,si,side='right')-1k=min(k,len(seg_len)-1)t=(si-cum[k])/max(seg_len[k],1e-9)pts[i]=P[k]+t*seg[k]# 外法线: 单位切向旋转-90°, 指向CCW轮廓外侧tang=np.gradient(pts,axis=0)tang/=(np.linalg.norm(tang,axis=1,keepdims=True)+1e-12)normals=np.column_stack([tang[:,1],-tang[:,0]])# CCW外法线returnpts,s,total,normalsdefplan_facade_zigzag(coords,building_height,scan_step_m=8.0,ascend_step_m=2.0,safe_dist_m=15.0,margin_bottom_m=0.0,margin_top_m=0.0):""" 立面竖向 Zig-Zag 牛耕扫描(核心)。 coords : (N,2) 底面闭合轮廓(CCW) building_height: 立面高度 H (m) scan_step_m : 环向扫描步距(相邻竖向航带间距) ascend_step_m : 同一竖带内上下航点垂直间距 safe_dist_m : 沿外法线向外偏移的安全距离 margin_* : 上下留边 返回: waypoints (K,3) 三维航点, wp_normals (K,2), total_len """pts,s,total_len,normals=resample_ring(coords,ds=scan_step_m)z_lo=margin_bottom_m z_hi=building_height-margin_top_m z_lo,z_hi=min(z_lo,z_hi),max(z_lo,z_hi)waypoints,wp_normals=[],[]# 沿环向逐条"竖带"扫描, 相邻带上下方向交替 => 端点处短步进(牛耕)foridxinrange(len(pts)):base=pts[idx]nor=normals[idx]upward=(idx%2==0)# 偶带向上, 奇带向下z_levels=np.arange(z_lo,z_hi+1e-6,ascend_step_m)ifnotupward:z_levels=z_levels[::-1]forzinz_levels:wp=base+nor*safe_dist_m# 沿外法线外偏移waypoints.append([wp[0],wp[1],z])wp_normals.append(nor)returnnp.asarray(waypoints),np.asarray(wp_normals),total_lendefstep_from_overlap(altitude_agl,fov_deg,overlap=0.7,aspect=1.0):""" 由高度和FOV估算步距(替代拍脑袋取值)。 footprint = 2*altitude*tan(fov/2); step = footprint*(1-overlap) 返回: (行距行向, 列距列向) 单位m """footprint=2*altitude_agl*math.tan(math.radians(fov_deg/2))returnfootprint*(1-overlap),footprint*aspect*(1-overlap)关键点:主航段仅
z变化(带内base、nor固定),严格直上直下;换带仅在上下端点做一次环向scan_step_m平移——不是螺旋、不是斜向、不是横向。
3.4 最终效果图
3.5 人机协同交互设计(本方案核心创新点)
- AI优先输出初稿,人工做约束:AI负责重活(轮廓提取、清洗、生成航线),人工负责业务决策,不用从零打点。
- 分层编辑能力:
- 全局参数调整:统一修改安全距离、扫描重叠率、飞行速度;
- 局部约束:人工绘制禁飞区,AI自动避让,自动裁剪航线。
- 双模式兼容:
- 模式A(快速模式):仅依靠正射影像,大模型分割轮廓,人工输入高度,快速生成航线初稿,适合应急巡检;
- 模式B(高精度模式):结合粗建模三维模型,读取真实建筑高度,自动调整立面起伏,适合高精度检测。
四、适用场景与边界
✅适合:场馆、筒仓、矩形高层建筑等竖向立面为主的建筑外观巡检;定期外立面病害普查、幕墙巡检。
⚠️边界:对于极度复杂悬挑结构、大量交叉遮挡建筑,仍然需要人工重点干预轮廓和航线。
五、方案优势总结
- 贴合一线业务习惯:保留"轮廓→立面→航线"熟悉操作流程,AI只做轮廓自动提取,学习成本低,容易落地;
- 降低工作量:省去人工描轮廓的重复劳动,轮廓初稿秒出,只需要少量修正;
- 航线成像质量更优:竖向直上直下Zig-Zag扫描,相机朝向稳定,立面影像重叠均匀,便于后续AI病害识别;
- 场景兼容性更强:支持有无三维模型两种作业模式,应急巡检和精细巡检都可覆盖;
- 安全可控:人工拥有最终审核权,避免全自动算法在复杂场景下输出危险航线。