简介:这份文档面向石油管线巡检从业者、无人机应用技术人员及测绘相关专业师生,系统梳理了无人机在管线巡检场景中的整体解决方案,帮助读者理解如何用航摄手段替代传统人工巡检、提升效率与安全性。资源包共1个doc文件,约13.77MB,内容以图文方案形式呈现,涵盖无人机航摄简介、航测原理与系统构成、低空飞行限制少、自身性能与成本优势、作业流程等基础模块,并重点介绍华测无人机石油管线巡检方案,包括车载地面终端、任务机加空中中继机、任务机加地面固定中继、任务机加多点地面固定中继等多种组网模式,以及航飞作业标准、主要技术指标、结构图、产品介绍与地面导控、数据处理软件功能。目前已有117人学习下载,适合需要了解管线巡检无人机选型、组网与作业规范的读者参考借鉴。
1. 无人机石油管线巡检:从“人走车巡”到“飞一遍就出报告”到底怎么落地
石油管线巡检这件事,干过的人都知道苦。管线动辄几百公里,穿戈壁、翻丘陵、跨农田,传统方式要么靠人徒步带望远镜,要么靠车沿伴行路慢慢开。一条百公里管线,两个人一组跑一趟少说三天,遇到雨季道路翻浆、山区无路可走,只能干瞪眼。更麻烦的是,人眼在颠簸车上判断第三方施工、打孔盗油、管体裸露,漏检率并不低,回头出了事再倒查,谁也说不清是没看到还是没记录。
无人机巡检要解决的就是这个:把“沿管线走一遍并留下可复查的影像证据”这件事,从体力活变成数据活。它适合三类人——手里有管线资产、想降本增效的运维负责人;负责具体飞行的飞手和数据处理工程师;以及想把巡检业务做成标准化服务的团队。但“买台无人机飞一圈”和“形成一套能交差的巡检方案”之间,隔着空域、航线、载荷、数据、报告五道坎。这篇就按一线做法,把这条链路拆开讲清楚,让你看完能判断自己该从哪一步入手、参数怎么定、哪里最容易翻车。
2. 方案选型:机型、载荷与巡检模式怎么定
2.1 先分清你要的是“看得见”还是“看得清”
管线巡检的需求不是单一的。常见的有四类:一是管线走向和周边环境普查,看有没有占压、违建、滑坡;二是管体本体检查,看防腐层破损、管体裸露、支墩位移;三是第三方施工监控,看有没有挖掘机在管线附近动土;四是泄漏排查,看地表油污、植被异常。这四类对分辨率的要求差得很远。
普查类,地面分辨率(GSD)做到 5~10 厘米就够了,飞高 120 米配 1 英寸底相机基本能满足。管体本体检查要看清防腐层裂纹,GSD 得压到 1~2 厘米,这意味着飞高要降到 30~50 米,或者换长焦镜头。第三方施工监控反而对分辨率要求不高,但对时效性要求高,最好是能定时自动飞。泄漏排查最玄学,可见光未必看得出来,往往要上热红外或者多光谱。
我一般建议新手先从普查类入手,把航线、数据、报告流程跑通,再逐步加码到本体检查。一上来就追求 1 厘米 GSD,数据量和飞行时间会让你怀疑人生。
2.2 机型选择:多旋翼还是固定翼
这是选型第一个岔路口。多旋翼能悬停、能低速精细飞行、起降场地要求低,适合管体检查和复杂地形;固定翼续航长、速度快,适合长距离管线普查。但固定翼不能悬停,转弯半径大,沿管线飞的时候容易偏航,对航线规划要求高。
| 对比项 | 多旋翼 | 固定翼 |
|---|---|---|
| 续航 | 30~55 分钟 | 90~180 分钟 |
| 巡航速度 | 5~15 m/s | 15~25 m/s |
| 起降条件 | 小空地即可 | 需要跑道或弹射 |
| 悬停能力 | 有 | 无 |
| 适合任务 | 管体检查、定点核查 | 长距离普查 |
| 单架次覆盖 | 5~15 公里 | 30~80 公里 |
实际项目中,很多团队是“固定翼普查 + 多旋翼复核”组合。固定翼先飞一遍找出疑似点,多旋翼再到疑似点低空细看。这个组合在长输管线上比较实用,但需要两套设备和两拨人,成本要算清楚。
2.3 载荷配置:可见光、热红外、激光雷达怎么搭
可见光是最基础的,现在主流方案是 1 英寸 CMOS 或者 M4/3 画幅相机,配合三轴云台。如果要做管体三维重建,需要五向倾斜摄影,这对云台和相机同步要求高。
热红外在泄漏排查和夜间巡检里有不可替代的作用。地表油污和周围土壤的温差在热红外图像里会呈现明显异常,但要注意飞行时间——正午地表温差小,热红外效果差,一般选清晨或傍晚飞。热红外的分辨率通常比可见光低不少,所以飞高要相应降低。
激光雷达主要用于管线走廊的三维建模和植被穿透,能拿到管线周边的地形点云,用于分析管体埋深变化和周边施工。但激光雷达贵、重、数据处理复杂,不是所有项目都需要。我一般建议:如果只是看管线走向和地表情况,可见光加热红外够了;如果要做管体形变分析或者走廊三维建模,再考虑激光雷达。
2.4 巡检模式:手动、自动航线还是自主巡检
手动飞行只适合应急核查,不可能用于日常巡检,因为一致性太差,今天飞的和明天飞的没法对比。
自动航线是主流做法。用航线规划软件沿管线生成航点,设定飞行高度、速度、拍照间隔,飞机自动执行。关键是航点要沿管线走向布设,转弯处要加密航点,否则飞机切角会偏离管线。我一般会在管线拐点前后各加一个航点,确保飞机贴着管线飞。
自主巡检是进阶玩法,需要无人机具备视觉感知和避障能力,能自动识别管线并跟踪飞行。这个方向目前还在发展中,对飞控和算法要求高,适合有研发能力的团队。常见做法是用 YOLO 系列做管线目标检测,再结合 PID 控制做航线修正。但实际管线场景里,管线本身在可见光图像里并不总是清晰可见(被植被覆盖、被土掩埋),所以纯视觉跟踪的鲁棒性是个问题。
3. 航线规划与飞行参数:把“飞得稳”变成“拍得清”
3.1 沿管线自动航线的生成逻辑
航线规划的核心是把管线的地理坐标转成无人机能执行的航点序列。管线数据通常是 GIS 里的线要素,格式可能是 Shapefile 或 GeoJSON。你需要把它转成航点,再导入航线规划软件。
下面是一个用 Python 把管线坐标转成航点并生成 KML 的示例,KML 可以导入主流航线规划工具:
import simplekml import geopandas as gpd from shapely.geometry import LineString # 读取管线矢量数据,假设是 WGS84 坐标系 pipeline = gpd.read_file("pipeline.shp") # 如果坐标系不是 WGS84,先转换 if pipeline.crs != "EPSG:4326": pipeline = pipeline.to_crs("EPSG:4326") # 取第一条管线 line = pipeline.geometry.iloc[0] # 按固定间隔插值生成航点,间隔单位是度,约等于米除以111000 # 这里按50米间隔生成 interval_deg = 50 / 111000 num_points = int(line.length / interval_deg) points = [line.interpolate(i / num_points, normalized=True) for i in range(num_points + 1)] # 生成KML kml = simplekml.Kml() for i, pt in enumerate(points): kml.newpoint(name=f"WP{i:04d}", coords=[(pt.x, pt.y)]) kml.save("pipeline_waypoints.kml") print(f"生成航点数量: {len(points)}")这段代码的逻辑是:先把管线数据统一到 WGS84 坐标系,然后按固定距离间隔在管线上插值取点。interval_deg是度单位的间隔,50 米除以 111000 是粗略换算,实际项目中应该用 pyproj 做精确的投影转换。航点命名用四位数字,方便后续排序和对照。
参数说明:间隔 50 米是一个经验值,对应飞行速度 10 m/s 时每 5 秒一个航点。如果飞得慢或者要拍得更密,可以缩到 20~30 米。但航点太密会导致航线文件过大,部分飞控处理起来会卡。
3.2 飞行高度、速度与重叠率的关系
这三个参数是绑在一起的。飞行高度决定 GSD,GSD 决定你能不能看清目标;飞行速度决定相邻两张照片的基线,基线加上拍照间隔决定航向重叠率;重叠率不够,后期拼图会出空洞。
常用公式:GSD = 飞行高度 × 传感器像元尺寸 / 镜头焦距。以 1 英寸 CMOS、像元 2.4 微米、焦距 8.8 毫米为例,飞高 100 米时 GSD 约 2.7 厘米。这个分辨率看管线走向够了,看防腐层裂纹不够。
航向重叠率一般要求 70% 以上,旁向重叠率 60% 以上。如果是单条管线巡检,旁向重叠主要靠航线间距控制。沿管线飞的时候,如果只飞一条航线,旁向覆盖宽度就是相机幅宽,管线两侧各覆盖一半。如果要做走廊三维建模,需要飞多条平行航线,航线间距按幅宽的 40% 来设。
| 飞行高度 | GSD(1英寸底) | 单张覆盖宽度 | 建议飞行速度 | 拍照间隔 |
|---|---|---|---|---|
| 50 m | 1.4 cm | 约 60 m | 5 m/s | 2 s |
| 80 m | 2.2 cm | 约 96 m | 8 m/s | 2 s |
| 120 m | 3.3 cm | 约 144 m | 10 m/s | 2 s |
| 150 m | 4.1 cm | 约 180 m | 12 m/s | 2 s |
注意:拍照间隔 2 秒是常见值,但实际要看相机写入速度。如果间隔太短,相机来不及存,会出现漏拍。飞之前一定要在地面测试连拍,确认存储卡写入速度跟得上。
3.3 起降平台与地面站的选择
起降平台在管线巡检里经常被忽视,但实际影响很大。管线沿线未必有平整空地,戈壁滩上碎石多,农田里土软,普通起降容易翻。常见做法是带一块折叠起降垫,或者用车顶平台。如果要做常态化自动巡检,可以考虑固定式起降平台,配合自动机库实现无人值守。但自动机库成本高,适合高频次巡检场景,低频次项目没必要上。
地面站方面,主流飞控都支持地面站软件规划航线。如果要做超视距飞行,需要配图传和数传链路。管线巡检经常遇到信号遮挡,比如管线穿过山体或城市建筑群,图传容易断。我一般会建议在航线规划时避开信号盲区,或者用中继方式解决。但中继方案涉及设备和空域问题,要提前评估。
3.4 空域与合规:飞之前必须确认的事
这一块不展开讲法规细节,但必须提醒:管线巡检经常跨区域,不同地区的空域管理要求不一样。飞之前要确认飞行区域是否在管控范围内,是否需要报备。另外,管线本身可能涉及敏感设施,飞行前要和管线管理方确认哪些区域可以飞、哪些不能拍。这些事不提前做,飞到一半被叫停,损失的是整个架次的时间。
4. 数据采集与处理:从原始影像到可交差的巡检报告
4.1 影像采集的现场检查清单
飞完不是就完了,现场必须做数据检查,否则回去发现漏拍,再回来补飞成本翻倍。我一般会检查这几项:影像数量是否和航点数量匹配、有没有明显模糊或过曝、POS 数据是否正常记录、存储卡剩余空间是否够下一架次。
POS 数据是后期拼图和定位的关键。如果无人机没有 RTK,POS 精度可能只有几米,后期拼图会有偏差。有 RTK 的话,POS 精度能到厘米级,但要注意 RTK 基站架设和信号固定情况。如果 RTK 没固定,POS 数据质量会下降,后期需要靠影像匹配来纠正。
4.2 正射影像拼接与管线叠加
影像拼接常用 Pix4D、Metashape 或者国内的一些软件。流程是:导入影像和 POS 数据、做空中三角测量、生成密集点云、生成正射影像。如果管线有 GIS 数据,可以把管线矢量叠加到正射影像上,直观看到管线走向和周边情况。
下面是一个用 GDAL 把管线矢量叠加到正射影像并输出的示例:
from osgeo import gdal, ogr, osr # 打开正射影像 ortho = gdal.Open("ortho.tif") geotransform = ortho.GetGeoTransform() projection = ortho.GetProjection() # 打开管线矢量 pipeline_ds = ogr.Open("pipeline.shp") pipeline_layer = pipeline_ds.GetLayer() # 创建输出影像,这里简单示意,实际叠加需要栅格化矢量 # 用gdal.RasterizeLayer把管线烧录到影像上 driver = gdal.GetDriverByName("GTiff") output = driver.Create("ortho_with_pipeline.tif", ortho.RasterXSize, ortho.RasterYSize, 3, gdal.GDT_Byte) output.SetGeoTransform(geotransform) output.SetProjection(projection) # 把管线烧录为红色线 gdal.RasterizeLayer(output, [1], pipeline_layer, burn_values=[255]) output.FlushCache() print("叠加完成")这段代码的核心是gdal.RasterizeLayer,把矢量管线烧录到栅格影像上。实际项目中,你可能需要把管线烧录到单独的波段或者用透明叠加,这里只是示意。参数burn_values=[255]表示烧录到第一个波段的值为 255,也就是红色通道满值。
4.3 疑似点提取与人工复核
自动提取疑似点常用两种思路:一种是基于影像分类,把管体裸露、施工机械、油污等目标检测出来;另一种是基于变化检测,对比历史影像找出变化区域。前者需要训练样本,后者需要历史数据。
我一般建议先用变化检测做初筛,因为管线巡检的核心需求是“发现变化”,而不是“识别所有目标”。变化检测可以用简单的影像差值,也可以用深度学习。如果管线沿线有历史正射影像,做差值就能找出变化区域,再人工复核。这个方法比直接训练目标检测模型快得多,而且不需要大量标注数据。
人工复核是必须的。自动提取的疑似点里,很多是光影变化、植被生长、云影等误报。复核时对照原始影像和正射影像,确认是否真的有问题。复核结果要记录坐标、类型、严重程度,形成巡检报告。
4.4 巡检报告的结构与交付
巡检报告一般包括:巡检范围和时间、飞行参数、影像成果清单、疑似点列表和截图、结论和建议。疑似点列表是核心,每个点要有坐标、类型(占压、施工、裸露、泄漏等)、严重程度、现场照片。
报告格式可以是 PDF 加 GIS 数据包。GIS 数据包方便管线管理方把疑似点导入自己的系统。如果对方有在线地图平台,也可以把疑似点发布成地图服务。
5. 避坑与排查:管线巡检里最容易翻车的五件事
5.1 航线偏离管线,飞完发现拍的是隔壁农田
现象:回放航线轨迹,发现飞机在管线拐弯处切角,偏离管线几十米,拐弯段的管线没拍到。
原因:航点布设时拐弯处没有加密,飞机自动抄近路。多旋翼在航点之间是直线飞行,拐弯处如果只有两个航点,飞机就会走直线切角。
解决:在管线每个拐点前后各加一个航点,让飞机提前转向。或者用样条曲线插值生成平滑航线,但要注意样条曲线可能让飞机偏离管线更远。我一般用加密航点的方法,简单可靠。
5.2 图传断连,飞机失联后不知道飞哪去了
现象:飞行中图传画面卡住,遥控器失去信号,飞机进入失控保护后不知道飞到哪里。
原因:管线穿越山区或城市,信号遮挡严重。或者图传和遥控器天线方向不对,信号衰减快。
解决:飞行前用地图工具检查航线沿线地形,避开明显遮挡区域。如果必须穿越,提前设置好失控保护行为(返航或悬停),并确认返航高度高于沿线最高障碍物。另外,记录飞机最后已知位置,失联后可以按最后位置搜索。无人机丢失定位经纬度这个事,靠的是飞控日志和最后图传坐标,所以飞行前确认日志记录功能正常。
5.3 影像漏拍,拼接后出现空洞
现象:正射影像上有明显的空洞区域,对应位置没有影像覆盖。
原因:拍照间隔设置太短,相机写入速度跟不上,导致漏拍。或者存储卡速度不够,写入卡顿。
解决:飞行前在地面测试连拍,确认相机能按设定间隔稳定拍照。存储卡选高速卡,不要用杂牌。如果还是漏拍,把拍照间隔调长,或者降低飞行速度。
5.4 热红外图像温差不够,泄漏点看不出来
现象:热红外影像上地表温度均匀,没有明显异常。
原因:飞行时间不对,正午地表温差小。或者热红外相机没有做温度校准,图像只是相对温度。
解决:选清晨或傍晚飞行,地表温差最大。热红外相机飞行前要做黑体校准,确保温度读数准确。如果只是看相对温差,也要确认相机增益设置合适,避免图像过曝或过暗。
5.5 POS 数据精度差,拼图错位
现象:正射影像上地物错位,管线叠加后对不上。
原因:无人机没有 RTK,POS 精度只有几米。或者 RTK 没有固定,POS 数据质量差。
解决:如果项目要求高精度,用带 RTK 的无人机,并确保飞行时 RTK 固定。如果没有 RTK,靠影像匹配做空三,但需要足够的重叠率和地面控制点。地面控制点可以用明显标志物,飞前布设,飞后测量坐标。
6. 进阶技巧:用变化检测把巡检效率再提一档
前面讲的流程跑通后,你会发现最耗时的不是飞行,而是人工看影像找问题。一个架次几百张照片,两个人看一天也看不完。变化检测是提效的关键。
我的做法是:把同一段管线不同时期的正射影像做配准,然后做差值或者用 SSIM 做结构相似性对比,找出变化区域。变化区域再叠加管线矢量,筛选出管线两侧一定范围内的变化,排除远处无关变化。这样人工只需要复核变化区域,工作量能降一个数量级。
下面是一个用 OpenCV 做影像差值并提取变化区域的示例:
import cv2 import numpy as np # 读取两期正射影像,确保已经配准 img1 = cv2.imread("ortho_202401.tif") img2 = cv2.imread("ortho_202406.tif") # 转灰度 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 计算差值 diff = cv2.absdiff(gray1, gray2) # 阈值化,阈值需要根据实际影像调整 _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY) # 形态学操作去噪 kernel = np.ones((5, 5), np.uint8) thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) # 找轮廓 contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 过滤小面积轮廓 min_area = 100 # 最小面积阈值,根据GSD换算 changes = [] for cnt in contours: area = cv2.contourArea(cnt) if area > min_area: x, y, w, h = cv2.boundingRect(cnt) changes.append((x, y, w, h, area)) print(f"检测到变化区域数量: {len(changes)}") for c in changes: print(f"位置: ({c[0]}, {c[1]}), 大小: {c[2]}x{c[3]}, 面积: {c[4]}")这段代码的逻辑是:两期影像转灰度后做差值,阈值化得到变化区域,形态学操作去噪,然后找轮廓并过滤小面积区域。参数30是差值阈值,需要根据影像的辐射差异调整。如果两期影像光照条件不同,差值会很大,需要先做辐射归一化。min_area是最小变化面积,根据 GSD 换算成实际面积,比如 GSD 3 厘米时,100 像素约等于 0.09 平方米,可以过滤掉大部分噪声。
变化检测的结果还需要和管线矢量做空间叠加,只保留管线两侧一定范围内的变化。这个可以用 GIS 工具做缓冲区分析,也可以用 Python 的 shapely 做。
最后说一个我自己的习惯:每次巡检完,不管多累,当天必须把数据备份两份,一份放本地,一份放移动硬盘。第二天再开始处理。因为存储卡出问题、电脑崩溃这种事,我见过太多次,没有后悔药可吃。巡检数据是外业成果,丢了就得重新飞,成本不是一点半点。希望帮到你。
本文还有配套的精品资源,点击获取