简介这份PPT面向油气行业数字化从业者、无人机巡检方案设计与运维人员系统梳理了无人机在油气管道巡检场景中的整体解决思路。内容从行业背景与政策驱动切入对比人工巡检与电子感应巡检在成本、效率、风险上的痛点进而展开常规巡检与应急巡检两大业务应用。常规巡检部分覆盖区域航空摄影、日常巡检作业、异常目标AI识别、AR管道叠加、空中警示驱离与管线气体泄露探测其中激光甲烷遥测、三桩一碑识别、厘米级二维正射与三维模型重建等细节均有说明应急巡检则涉及人员搜救、通信保障与物资抛投。方案还给出无人机监控指挥云平台、4G/5G公网与卫星便携终端组网、长输管道巡检全流程管理等落地内容。资源为1个pptx文件压缩包约50.03MB共19页结构按背景概述、解决方案、产品介绍组织适合快速了解技术选型与方案框架。目前已有35人学习。1. 无人机油气管道巡检方案从19页PPT到可落地的技术拆解油气管道巡检这活儿十年前靠人扛着设备翻山越岭五年前靠直升机烧油转场现在越来越多的甲方在招标文件里直接写“具备无人机自动巡检能力”。一份19页的PPT方案看起来只是汇报材料但背后要回答的问题很硬用什么机型、挂什么载荷、飞什么航线、数据怎么回传、AI怎么识别、报告怎么出。这套东西不是买台无人机就能跑通的它涉及飞行平台、任务载荷、地面站、数据链路、缺陷识别算法和巡检管理平台六个层面的咬合。我做过几个油气田的管道巡检项目从长输管线到集输管网都碰过踩过的坑比飞过的架次还多。这篇笔记就把这套方案拆开讲清楚每一层怎么选、怎么配、怎么调让新手能照着搭出最小可用系统也让熟手看到参数边界和翻车点。2. 飞行平台与载荷选型为什么多旋翼双光吊舱是油气巡检的默认答案油气管道巡检的场景差异很大长输管线动辄几百公里集输管网则在站场周边密集分布。选飞行平台之前先要把任务拆成三类日常巡线、泄漏排查、应急响应。日常巡线要求续航长、航线规划自动化程度高泄漏排查要求载荷能同时捕捉可见光细节和热红外异常应急响应要求快速部署、实时图传。这三类任务叠加多旋翼加双光吊舱就成了最稳妥的起步配置。2.1 固定翼、多旋翼、复合翼在管道场景下的取舍逻辑固定翼的优势是续航和速度适合长输管线的大范围普查但它起降需要跑道或弹射架在山区和站场周边部署很麻烦。多旋翼的优势是垂直起降、悬停精度高能贴着管道飞适合站场、阀室、穿跨越段的精细巡检。复合翼试图兼顾两者但结构复杂、维护成本高在油气场景里实际使用率并不高。我一般会建议客户按管道类型分两套配置长输干线用固定翼做月度普查站场和人口密集段用多旋翼做周度精细巡检。如果预算只够一套那就选多旋翼因为油气巡检的核心痛点是泄漏和第三方施工破坏这两类问题都需要低空悬停确认固定翼飞太高看不清。平台类型典型续航巡航速度起降条件适用场景多旋翼40-55 min0-15 m/s垂直起降站场、阀室、穿跨越、应急固定翼90-180 min18-25 m/s跑道/弹射长输干线普查复合翼60-120 min15-22 m/s垂直起降中等距离混合任务2.2 双光吊舱的参数怎么调可见光与热红外的协同逻辑油气泄漏在可见光下往往不明显但热红外能捕捉到温度异常。甲烷泄漏时气体膨胀吸热会在热像图上形成低温条带液体泄漏则可能因为蒸发吸热或化学反应放热形成温差。双光吊舱的核心价值就是同一时刻、同一视角下获取两种数据后期融合判断。可见光相机的选型看三个参数像素、变焦倍率、快门速度。管道巡检建议至少2000万像素30倍光学变焦快门速度不低于1/1000秒否则飞行震动会导致画面模糊。热红外相机的选型看分辨率和热灵敏度640×512分辨率是起步NETD噪声等效温差要低于50mK否则小温差泄漏根本看不出来。# 吊舱参数配置示例以某主流吊舱SDK为例 # 可见光通道 camera_visible: resolution: 1920x1080 zoom: 30x shutter_speed: 1/1000 iso: auto focus_mode: auto # 热红外通道 camera_thermal: resolution: 640x512 netd: 40mK temperature_range: -20°C ~ 150°C palette: ironbow emissivity: 0.95 # 云台稳定 gimbal: stabilization: 3-axis pitch_range: -90° ~ 30° yaw_range: -180° ~ 180°这段配置里发射率emissivity设0.95是针对管道防腐层和土壤表面的通用值如果管道裸露金属表面发射率要调到0.1-0.3否则测温偏差会超过10°C。热像图的调色板选铁红ironbow是因为人眼对红黄渐变最敏感容易发现异常热点。云台的俯仰范围要能到-90°否则无法垂直向下拍摄管道正上方。2.3 地面站与数据链路图传距离和抗干扰的平衡点油气管道经常穿越无人区图传距离是硬指标。但图传距离不是越远越好距离越远带宽越低图像压缩越狠细节丢失越严重。我一般建议按任务半径选链路半径5公里以内用2.4G/5.8G双频图传半径5-15公里用4G/5G公网图传半径超过15公里用卫星链路或中继无人机。抗干扰是另一个坑。油气站场附近有大量金属储罐和高压设备电磁环境复杂。2.4G频段在站场内容易被压制5.8G稍好但绕射能力差。实际作业时我会把图传频段设成自动跳频同时准备有线备份——无人机降落后用网线直连吊舱导出数据避免图传丢包导致关键帧缺失。注意图传距离标称值和实际值差距很大标称15公里的链路在山区可能只有3公里。选型时要求供应商提供实测报告或者自己租一台在目标管道上试飞。3. 航线规划与自动巡检把管道坐标变成可执行的飞行任务航线规划是无人机巡检里最容易被低估的环节。很多人以为把管道坐标导入地面站生成一条沿线航线就完事了实际飞起来才发现管道有拐弯、有高低起伏、有交叉跨越简单的沿线飞行要么撞山要么漏拍要么电池不够用。油气管道巡检的航线规划要解决三个问题如何贴合管道走向、如何保证拍摄重叠率、如何分段管理电池。3.1 管道中心线提取与航线生成的最小步骤管道中心线数据通常来自两个渠道设计院的竣工测量数据或者巡检人员手持GPS沿管道走一遍采集的轨迹。前者精度高但可能不全后者精度差但覆盖全。我一般会两者结合用竣工数据做骨架用手持轨迹做补充。拿到中心线坐标后需要做三件事坐标转换、缓冲区生成、航线点抽稀。坐标转换是把管道坐标从CGCS2000转到WGS84因为大多数无人机飞控用WGS84。缓冲区生成是在管道两侧各扩一定距离形成巡检带一般站场段扩50米长输段扩100米。航线点抽稀是按飞行速度 and 拍照间隔计算航点间距避免航点过密导致飞控频繁加减速。import numpy as np from pyproj import Transformer # 坐标转换CGCS2000 - WGS84 transformer Transformer.from_crs(EPSG:4490, EPSG:4326, always_xyTrue) def convert_coords(cgcs_points): wgs_points [] for x, y in cgcs_points: lon, lat transformer.transform(x, y) wgs_points.append((lon, lat)) return wgs_points # 生成缓冲区航线 def generate_buffer_route(centerline, buffer_distance, flight_altitude): centerline: 管道中心线坐标列表 [(lon, lat), ...] buffer_distance: 缓冲区距离米 flight_altitude: 飞行高度米 route_points [] for i in range(len(centerline) - 1): p1 np.array(centerline[i]) p2 np.array(centerline[i 1]) # 计算垂直方向偏移 direction p2 - p1 perpendicular np.array([-direction[1], direction[0]]) perpendicular perpendicular / np.linalg.norm(perpendicular) # 左右两侧各生成一个航点 left_point p1 perpendicular * buffer_distance right_point p1 - perpendicular * buffer_distance route_points.append({ left: (left_point[0], left_point[1], flight_altitude), right: (right_point[0], right_point[1], flight_altitude) }) return route_points # 航点抽稀按拍照间隔计算 def simplify_waypoints(route_points, flight_speed, photo_interval): flight_speed: 飞行速度m/s photo_interval: 拍照间隔秒 distance_between_photos flight_speed * photo_interval simplified [] accumulated_distance 0 for i in range(1, len(route_points)): p1 np.array(route_points[i-1][left][:2]) p2 np.array(route_points[i][left][:2]) segment_distance np.linalg.norm(p2 - p1) accumulated_distance segment_distance if accumulated_distance distance_between_photos: simplified.append(route_points[i]) accumulated_distance 0 return simplified这段代码的核心逻辑是先做坐标转换再沿管道中心线生成左右两条平行航线最后按拍照间隔抽稀航点。缓冲区距离设50米还是100米取决于相机视场角和飞行高度。假设相机视场角为60°飞行高度120米地面覆盖宽度约为138米那么单侧缓冲区设70米就能保证管道在画面中央。拍照间隔一般设2秒飞行速度设8m/s这样相邻照片的地面距离约16米重叠率能到70%以上。3.2 重叠率、飞行高度与地面分辨率的三元约束航空摄影里有个经典公式地面分辨率GSD 飞行高度 × 传感器像元尺寸 / 镜头焦距。油气管道巡检要求能看清管道防腐层破损、阀门锈蚀、第三方施工机械GSD一般要求优于3厘米。假设相机像元尺寸为2.4微米镜头焦距为8毫米那么飞行高度 GSD × 焦距 / 像元尺寸 0.03 × 8 / 0.0024 100米。也就是说飞行高度不能超过100米否则看不清细节。但飞行高度越低单张照片覆盖范围越小航线越长电池越不够用。这就形成一个三元约束GSD决定飞行高度上限电池决定飞行时间上限重叠率决定航点密度。实际规划时我会先按GSD要求定飞行高度再按电池续航定单架次任务长度最后按重叠率要求定拍照间隔。参数典型值约束来源调整方向飞行高度80-120 mGSD ≤ 3 cm降低高度提升分辨率飞行速度6-10 m/s图传带宽与快门速度降速提升重叠率拍照间隔1.5-3 s重叠率 ≥ 60%缩短间隔提升重叠率单架次航程8-15 km电池续航增加电池或分段3.3 分段飞行与电池管理一次任务飞不完怎么办长输管道动辄几十公里单架次肯定飞不完。分段飞行的策略有两种按距离分段和按电池分段。按距离分段是每隔10公里设一个起降点优点是航线规整缺点是起降点可能没路没电。按电池分段是飞到电量剩30%就返航换电池后从断点继续优点是灵活缺点是断点定位容易出错。我一般用按电池分段但会在地面站里设置“断点续飞”功能。具体做法是每次起飞前记录当前航点序号降落后把序号写入配置文件下次起飞时从该序号继续。这个功能大多数地面站软件都支持但需要提前在航线文件里给每个航点编号。{ mission_id: pipeline_20240612, segments: [ { segment_id: 1, start_waypoint: 0, end_waypoint: 120, estimated_distance: 9600, estimated_battery: 65 }, { segment_id: 2, start_waypoint: 121, end_waypoint: 245, estimated_distance: 9920, estimated_battery: 68 } ], resume_from: 121 }这个JSON文件里resume_from字段就是断点续飞的依据。每次降落后地面站自动更新这个字段。下次起飞前飞控读取该字段从对应航点开始执行。注意estimated_battery要留20%余量因为逆风、爬升、悬停都会额外耗电。提示分段飞行时每段的首尾航点要设成“悬停拍照”模式而不是“飞越拍照”否则段与段之间的照片可能漏拍。4. 数据回传与AI识别从海量照片里捞出真正的管道缺陷无人机巡检产生的数据量很大一次10公里的任务按2秒拍照间隔、8m/s飞行速度算大约产生2250张可见光照片和2250张热红外照片。这些照片如果全靠人工看一个人得看一整天。AI识别的价值就是把人工从重复劳动里解放出来但AI不是万能的它需要好的数据、合适的模型和持续的调优。4.1 边端回传与云端回传的带宽账数据回传有两条路边端回传和云端回传。边端回传是在无人机或地面站上跑轻量级模型只把疑似缺陷的照片传回云端优点是省带宽缺点是边端算力有限模型精度打折。云端回传是把所有照片传回云端在云端跑大模型优点是精度高缺点是带宽压力大。我一般建议混合方案边端跑一个轻量级检测模型把疑似缺陷的照片标记出来优先回传其余照片在任务结束后批量回传。这样既能保证实时性又能控制带宽成本。边端模型可以用YOLOv8n或MobileNet-SSD参数量控制在5M以内推理速度在Jetson Orin NX上能到30FPS以上。# 边端轻量级缺陷检测示例YOLOv8n from ultralytics import YOLO import cv2 # 加载模型 model YOLO(yolov8n_pipeline.pt) # 推理 def detect_defects(image_path, conf_threshold0.5): img cv2.imread(image_path) results model(img, confconf_threshold) defects [] for r in results: boxes r.boxes for box in boxes: cls int(box.cls[0]) conf float(box.conf[0]) xyxy box.xyxy[0].tolist() defects.append({ class: model.names[cls], confidence: conf, bbox: xyxy }) return defects # 只回传有缺陷的照片 def should_upload(defects, min_confidence0.6): for d in defects: if d[confidence] min_confidence: return True return False这段代码里conf_threshold设0.5是召回率和准确率的平衡点。设太高会漏检设太低会误报。实际调优时我会先用一批标注好的管道缺陷照片做测试画出PR曲线找到F1分数最高的阈值。min_confidence设0.6是回传门槛低于0.6的疑似缺陷先存在本地任务结束后人工复核。4.2 管道缺陷检测模型的训练数据从哪来AI模型的效果取决于训练数据。管道缺陷检测的训练数据有三个来源历史巡检照片、公开数据集、合成数据。历史巡检照片最真实但标注成本高而且缺陷样本不均衡——大部分照片是正常管道缺陷照片可能只占1%。公开数据集里油气管道相关的很少需要从电力巡检、铁路巡检的数据集里迁移。合成数据是用3D建模或GAN生成的缺陷图像优点是标注自动缺点是真实感不足。我一般会按7:2:1的比例混合三种数据70%历史照片20%公开数据集迁移10%合成数据。历史照片里正常样本和缺陷样本的比例控制在3:1左右不要完全均衡因为实际场景里正常样本就是多数。标注时缺陷框要贴着缺陷边缘不要留太多背景否则模型会学到无关特征。数据来源占比优点缺点历史巡检照片70%真实、场景匹配标注成本高、样本不均衡公开数据集迁移20%标注现成、量大场景差异大合成数据10%标注自动、可控真实感不足4.3 误报率压不下去时先检查这五个参数AI识别最头疼的是误报。管道表面的锈迹、水渍、阴影、焊缝、补丁都可能被模型当成缺陷。误报率压不下去时不要急着换模型先检查五个参数置信度阈值、IOU阈值、输入分辨率、数据增强策略、类别定义。置信度阈值设太低模型会把模棱两可的目标也报出来。IOU阈值设太高重叠的缺陷框会被合并成一个。输入分辨率设太低小缺陷看不清。数据增强策略里如果用了过多的旋转和裁剪模型会学到不存在的缺陷形态。类别定义太细比如把“锈蚀”分成“表面锈蚀”和“深层锈蚀”模型分不清就会乱报。# 误报排查清单 def debug_false_positives(model, test_images, conf_range[0.3, 0.5, 0.7], iou_range[0.4, 0.5, 0.6]): results [] for conf in conf_range: for iou in iou_range: tp, fp, fn 0, 0, 0 for img, gt in test_images: preds model(img, confconf, iouiou) # 统计TP/FP/FN # ... precision tp / (tp fp) if (tp fp) 0 else 0 recall tp / (tp fn) if (tp fn) 0 else 0 f1 2 * precision * recall / (precision recall) if (precision recall) 0 else 0 results.append({ conf: conf, iou: iou, precision: precision, recall: recall, f1: f1 }) return results这个排查脚本会遍历不同的置信度和IOU组合输出精确率、召回率和F1分数。找到F1最高的组合后再针对误报样本做可视化分析看模型到底在关注什么区域。如果模型关注的是背景而不是缺陷本身说明数据增强或类别定义有问题。5. 避坑与常见问题无人机油气巡检翻车实录5.1 磁罗盘受干扰导致航线偏移现象无人机在站场附近起飞后航线整体偏移原本应该沿管道飞的航线飞到了管道旁边50米外。原因站场有大量金属储罐和高压设备磁罗盘受干扰航向角计算错误。多旋翼在GPS信号好的时候靠GPS导航但航向角还是依赖磁罗盘。磁罗盘偏了航线就偏了。解决起飞前做磁罗盘校准校准点远离金属物体至少10米。如果站场无法避开金属改用RTK定位RTK的航向角不依赖磁罗盘靠双天线相位差计算。另外航线规划时把飞行高度提高到80米以上减少地面金属对磁罗盘的影响。5.2 热红外测温偏差超过10°C现象热红外图像上显示的管道温度是45°C但手持测温枪测出来是35°C差了10°C。原因发射率设置错误。管道防腐层通常是聚乙烯或环氧粉末发射率在0.92-0.95之间。如果设成了0.8测温就会偏高。另外如果管道表面有积水或油污发射率会变化测温也会偏。解决根据管道表面材质设置发射率。防腐层设0.95裸露金属设0.2-0.3积水表面设0.96。如果无法确定材质用接触式测温枪现场比对反推发射率。热像仪的测温范围也要设对-20°C到150°C是通用范围如果管道输送的是高温介质要设到-20°C到500°C。5.3 图传丢包导致关键帧缺失现象任务结束后检查照片发现某一段管道的照片全是模糊的或者干脆没有照片。原因图传丢包。无人机飞远后图传带宽下降地面站接收到的照片不完整。如果地面站设置的是“实时回传”丢包的照片不会重传就永久丢失了。解决把地面站设置成“先存后传”。无人机上的存储卡先保存原始照片任务结束后批量导出。图传只用于实时监控不用于数据存档。如果必须实时回传开启重传机制地面站收到不完整照片后请求无人机重发。另外图传频段设成自动跳频避开干扰。5.4 电池低温掉电导致提前返航现象冬天在北方巡检电池显示还剩40%无人机突然触发低电量返航降落后电池显示只剩5%。原因锂电池低温性能差。0°C以下电池内阻增大可用容量下降。飞控读到的电压是负载电压不是开路电压负载一撤电压就掉下去了。解决冬天作业时电池预热到20°C以上再起飞。飞行中把低电量返航阈值从30%调到40%留更多余量。如果任务紧急用双电池并联或者换用低温电池。降落后不要立刻充电等电池回到室温再充否则会损伤电池。5.5 AI模型把焊缝当成裂纹现象AI识别结果里管道焊缝位置频繁报“裂纹”缺陷人工复核发现全是误报。原因焊缝的纹理和裂纹相似都是线状特征。训练数据里如果焊缝样本少模型就会把焊缝当成裂纹。解决在训练数据里加入焊缝样本标注为“正常焊缝”类别。如果焊缝和裂纹确实难分调整类别定义把“裂纹”改成“线性缺陷”让模型先学会区分线性缺陷和正常纹理再在后期人工细分。另外输入分辨率提高到4K焊缝的鱼鳞纹和裂纹的锯齿纹在4K下区别更明显。6. 从单机巡检到机巢组网把方案变成可复制的运营能力单机巡检能解决一个站场、一段管道的问题但油气公司的需求往往是几十个站场、上千公里管道。这时候就要考虑机巢组网。机巢是无人机的自动起降平台内置充电桩、气象站、图传中继无人机可以自动起飞、自动降落、自动换电池。一个机巢覆盖半径5-8公里几十个机巢就能覆盖整条管道。机巢组网的核心不是硬件是调度算法。每架无人机负责哪个区段、什么时候起飞、遇到冲突怎么避让、电量不够去哪换电池这些都需要一个调度系统来管。我一般会用“分区轮巡动态插单”的策略每个机巢负责固定区段按计划轮巡如果某个区段有应急任务调度系统动态插入任务调整其他无人机的航线。# 机巢调度简化示例 import heapq from datetime import datetime, timedelta class NestScheduler: def __init__(self, nests, drones): self.nests nests # 机巢列表 self.drones drones # 无人机列表 self.task_queue [] # 任务队列 def add_task(self, task): # 按优先级入队 heapq.heappush(self.task_queue, (task[priority], task)) def schedule(self): while self.task_queue: priority, task heapq.heappop(self.task_queue) # 找最近的可用机巢 best_nest None min_distance float(inf) for nest in self.nests: if nest[available] and nest[battery] 80: distance self.calc_distance(nest[position], task[position]) if distance min_distance: min_distance distance best_nest nest if best_nest: # 分配任务 best_nest[available] False best_nest[current_task] task task[assigned_nest] best_nest[id] task[estimated_start] datetime.now() timedelta(minutes5) else: # 没有可用机巢重新入队 heapq.heappush(self.task_queue, (priority 1, task)) def calc_distance(self, pos1, pos2): # 简化距离计算 return ((pos1[0]-pos2[0])**2 (pos1[1]-pos2[1])**2) ** 0.5这个调度器里priority越小优先级越高应急任务设0日常巡检设10。battery 80是机巢可用条件低于80%说明机巢正在充电不能接新任务。estimated_start是预估起飞时间给地面人员留出准备时间。实际部署时还要考虑气象条件——风速超过10m/s、能见度低于2公里、有降水时调度器要自动暂停任务。验证机巢组网效果的方法很简单跑一周的模拟任务统计任务完成率、平均响应时间、机巢利用率。任务完成率低于90%说明机巢数量不够或调度算法有问题。平均响应时间超过15分钟说明机巢分布太稀疏。机巢利用率低于30%说明机巢太多可以合并。我自己的习惯是每部署一个新机巢先跑一周的单机任务确认航线、图传、电池都正常再接入组网。组网后前两周每天人工检查调度日志看有没有任务冲突或机巢过载。等系统稳定了再逐步减少人工干预。这套东西没有后悔药前期偷懒后期就得用更多人力去补。希望帮到你。本文还有配套的精品资源点击获取