简介:这份文档面向光伏电站运维人员、无人机选型与检测认证从业者,以及关注新能源智能巡检的技术人员,围绕无人机在光伏场景中的飞行性能与巡检规范展开系统梳理。内容涵盖无人机系统构成与飞行质量控制、200W/m²至1000W/m²辐照度范围内的可见光与红外成像要求、按L1至L4电站类型与U1至U4装机容量划分的差异化功能指标,以及自检、全自主航迹规划、避障、自动返航、定点悬停、断点续航等11项功能,并给出坐标偏移不大于1.5m、返航偏差±1.5m等可量化验证方法。资源包内含1个docx文档,约14KB,结构紧凑,便于随时查阅与引用。目前已有134人学习。读者可借此快速掌握无人机巡检的性能判定依据与测试思路,为设备选型、功能验收和电站运维方案设计提供参考。
1. 一块 30MW 屋顶电站,为什么巡检要靠无人机重排一遍
一个 30MW 的屋顶分布式电站,组件铺在七八个厂房上,斜坡、女儿墙、通风管交错。两个人拿手持红外热像仪走一遍,光上下屋面就是大半天,回到办公室还要按厂房逐张对图。换成无人机按固定航线飞,同样的覆盖面能压到两三个小时,每帧图像还带着经纬度和相对高度,后期可以直接落到组件编号上。
光伏电站用无人机飞行性能及巡检要求,本质是两件事被绑在一起:无人机在风大、辐照强、地物高差明显的电站场景里,飞得稳不稳、够不够久、定位准不准;以及为了拿到能判定缺陷的图像,航线怎么铺、参数怎么设、什么天气条件下必须停飞。前者划出作业边界,后者决定数据能不能用,缺一样,最后的报告都只是一本好看的图册。
这套内容对着电站运维、第三方检测机构的作业人员,也对着刚接手无人机资产、要把巡检流程写进作业指导书的技术负责人。
2. 光伏电站巡检无人机的飞行性能怎么定:从组件尺寸反推机型指标
电站场景对飞行性能的要求,不是从参数表倒着看出来的,而是从「要看清什么」往前推。检测对象的尺寸很明确:一块常规组件约 2.3 m × 1.1 m,内部由 60 或 72 片电池片拼成,单片尺寸在 15 cm 量级,热斑、隐裂、二极管失效往往就发生在单片甚至半片范围内。这个物理尺度决定了对地分辨率的下限,再由分辨率反推飞行高度,由飞行高度和任务量反推续航、抗风和载荷。顺序一旦颠倒,很容易买回来一台参数漂亮、实际一天飞不完一个方阵的机器。
2.1 从组件尺寸反推 GSD、飞行高度与航带间距
对地分辨率 GSD 的算法很简单:GSD 等于像元尺寸乘以飞行高度,再除以镜头焦距。反过来,已知想达到的 GSD,飞行高度就是 GSD 乘焦距再除以像元尺寸。可见光相机要识别玻璃破裂、鸟粪遮挡、组件缺失,GSD 控制在 1.5 cm/px 左右就够用;红外要能分辨单个电池片的温升,GSD 一般压在 5 cm/px 以内,再大热斑就只剩两三个像素,形状特征全丢了。
| 载荷 | 像元尺寸 | 镜头焦距 | 目标 GSD | 推荐飞行高度 | 单幅覆盖宽度 |
|---|---|---|---|---|---|
| 可见光 1/2.3 英寸 CMOS,4000×3000 | 1.55 μm | 4.5 mm | 1.5 cm/px | 约 45 m | 60 m |
| 红外 640×512 探测器 | 12 μm | 13 mm | 4.6 cm/px | 约 50 m | 约 29 m |
| 红外 640×512 探测器 | 12 μm | 13 mm | 9.2 cm/px | 约 100 m | 约 59 m |
航带间距由覆盖宽度和重叠率决定,公式是幅宽乘以一减重叠率。红外幅宽 29.4 m、重叠率取 30%,间距就是 20.6 m;可见光幅宽 60 m、重叠率取 70%,间距 18 m。双光同飞时取两者的小值,也就是 18~20 m,宁可多飞两条航带,也不要让红外图像出现拼接缝。航向方向的拍照间隔同理,可见光单幅纵向覆盖 45 m、航向重叠 70%,每 13.5 m 触一次快门。
# 单架次可覆盖面积估算:双光吊舱,巡检速度 6 m/s speed = 6.0 # m/s 巡检巡航速度,红外建议 3~7 m/s,过快会拖影 endurance = 32 * 60 # s 标称续航,双光吊舱挂载后按实际测得的分钟数填 reserve = 0.35 # 预留比例:起飞爬升、返航、末端盘旋 turn_penalty = 0.12 # 航带两端减速转向的额外损耗 strip_gap = 20.0 # m 相邻航带间距,由红外幅宽和重叠率算出 turn_count = 8 # 单次起降覆盖的航带条数,受地块形状限制 work_s = endurance * (1 - reserve - turn_penalty) total_len = speed * work_s area = total_len * strip_gap print(f"有效作业 {work_s/60:.1f} min,航程 {total_len:.0f} m,覆盖 {area/10000:.2f} 万 m²")这段代码估的是「一块电池能扫多少平方米」。reserve和turn_penalty是两个最容易被拍脑袋填错的参数:前者按最远航点距离和返航速度单独核算,一般在 30%~40%;后者在长条形地块上可以降到 8%,在碎片化厂房屋顶上要提到 15% 以上。strip_gap必须用红外那一侧的数值,用可见光的 60 m 幅宽去乘,会直接漏掉一半组件。
2.2 抗风等级、悬停精度、爬升率:判断能不能飞的三个硬指标
电站多数建在开阔地带,屋面和山地电站的阵风是常态。厂商标称的最大抗风等级通常指「能飞回来」,不等于「能拍清楚」,作业风速上限要按图像质量重新定:一般要求作业时风速不超过 8 m/s,起降阶段不超过 6 m/s,阵风要留出 2 m/s 余量。超过这个值,云台自稳会持续吃掉电机余量,红外图像的背景温度也会因为组件表面气流散热而漂移。
| 指标 | 电站场景常见要求 | 不达标会发生什么 |
|---|---|---|
| 作业风速 | ≤8 m/s,阵风 ≤10 m/s | 航迹偏移、图像拖影、重叠率失真 |
| 悬停精度 | RTK 模式水平 ±0.1 m | 航带间距不均,出现漏检条带 |
| 爬升/下降率 | ≥5 m/s | 屋顶高差大的电站转场慢,续航被吃掉 |
| 带载续航 | 实际作业 ≥20 min | 一个方阵要分多次起降,拼接工作量翻倍 |
| 防护等级 | IP43 以上 | 晨间露水、雨后残水进入机身 |
| 工作温度 | -10~40 ℃ | 夏季午后电池放电能力下降,续航缩水 |
悬停精度这一项常被低估。没有 RTK 的机型靠视觉定位,水平误差在 ±0.3 m 上下,飞到 100 m 高度时航带间距会忽宽忽窄,重叠率低于设定值的那几条航带就是漏检区。RTK 固定解状态下的 ±0.1 m 不只是好看,它让「按固定间距铺航带」这件事在工程上成立,也让后期把热斑坐标映射到组件编号成为可能。
2.3 双光吊舱与单红外:载荷重量怎么吃掉续航
常见的两种配置是双光吊舱(可见光加红外共用一套云台,视场基本对齐)和单红外挂载加一次单独的可见光飞行。双光的优势是一次飞行拿到两套数据,像素级对齐,热斑定位直接借可见光底图;代价是吊舱重量普遍在 800 g 到 1 kg,带载续航比空载少三成左右。分开飞两次,数据量翻倍不说,两次飞行的太阳高度角、云况、组件温度都不一样,红外图像的背景温度对不上,量化分析就没法做。
我一般会按「可见光 4000 万像素级加红外 640×512、总重不超过 1 kg、带载续航实测不低于 25 min」这条线来选。红外分辨率再往下掉到 320×256,在 50 m 高度就只剩 2 cm 级 GSD 的优势,但像元数少了一半,单幅覆盖宽度腰斩,航带数量直接翻倍,得不偿失。
3. 光伏电站无人机巡检航线规划与作业参数设置
航线规划的目标不是画得好看,而是让每一块组件在红外图像里都落到同一个温标基准上。这要求飞行高度稳定、航带方向与组件排布方向一致、相邻航带的成像时间尽量接近。组件阵列通常是规则的矩形,航带方向沿着组件长边飞,能减少云台转向次数,也让组串编号的连续性更容易保持。
3.1 航带方向、重叠率与飞行高度的联合确定
航带方向先定,再定重叠率,最后才反推高度。方向用正射底图量取组件长边的方位角,把航线整体旋转到这个角度,机头方向与航带方向一致,云台保持正下视。
重叠率分两类:旁向重叠决定相邻航带能不能拼上,红外取 30% 即可,因为热斑是点状特征,不需要密集拼接;航向重叠决定同一条航带上前后两张图有没有断层,可见光取 65%~75%,红外取 40%~50%。重叠率不是越高越好,旁向重叠提到 60%,航带数量增加近一倍,续航直接不够用。
注意:重叠率必须按「实际 GSD 下的幅宽」来算,不能拿厂商给的传感器分辨率直接乘。带畸变的广角镜头边缘部分会被裁掉,实际有效幅宽通常比理论值小 5%~10%。
3.2 用 Python 生成往复式航带航点并导出 CSV
大多数航线规划 App 都能手绘航带,但地块形状复杂、要按固定间距严格铺开时,脚本生成更可控。下面这段代码生成本地米制坐标下的往复式(牛耕式)航点,再按纬度换算成经纬度,导出成 CSV,各家的 App 和航线转换工具基本都认这个格式。
import csv, math def plan_grid(origin_lat, origin_lon, strip_len, gap, rows, alt, speed=6.0): """往复式航带航点:奇偶行反向,减少空飞段""" lat_per_m = 1 / 111320.0 # 纬度 1° 约 111320 m lon_per_m = 1 / (111320.0 * math.cos(math.radians(origin_lat))) wp, idx = [], 1 for r in range(rows): y = r * gap # 沿航带正交方向的偏移 xs = [0, strip_len] if r % 2 == 0 else [strip_len, 0] for x in xs: wp.append({ "index": idx, "lat": round(origin_lat + y * lat_per_m, 8), "lon": round(origin_lon + x * lon_per_m, 8), "alt": alt, "speed": speed, "gimbal_pitch": -90, # 正下视 "action": "takePhoto" if r % 2 == 0 else "none", }) idx += 1 return wp wps = plan_grid(30.1234, 120.5678, strip_len=200, gap=20, rows=8, alt=50) with open("route.csv", "w", newline="", encoding="utf-8") as f: w = csv.DictWriter(f, fieldnames=list(wps[0].keys())) w.writeheader() w.writerows(wps) print(len(wps), "个航点已写入 route.csv")strip_len是单条航带的长度,按地块实际尺寸填,不要硬凑成整数;gap是上一节算出的航带间距;rows是航带条数,乘以间距就是覆盖宽度。action字段只是占位,实际拍照节奏建议用 App 里的「等距触发」,按 13.5 m 的间隔自动拍,比在每个航点手动触发稳定得多。导出的经纬度是相对起飞点的偏移,导入时需要把origin_lat、origin_lon换成实测的起飞点坐标,并确认坐标系是 WGS84 还是 CGCS2000,两套坐标系直接混用会带来几十米级的整体平移。
3.3 红外测温参数的设置:发射率、量程与快门校正
红外图像要能定量比较,三个参数必须在起飞前固定死。发射率按被测表面来设,光伏组件表面是钢化玻璃,常见取值在 0.85 到 0.95 之间,具体值要跟后期分析保持一致,中途改动会导致同一份报告里的温差不可比。测温量程建议手动固定,夏季组件表面能到 70 ℃ 以上,量程设成 -20~150 ℃ 比较稳妥;用自动量程的话,画面里出现一块高温区域就会整体重新拉伸,背景温度跟着跳,逐张对比就失效了。
调色板只影响目视效果,不影响数据。铁红和彩虹调色板看着直观,但做量化分析必须保留原始辐射数据,也就是红外相机输出的 16 位 TIFF 或者带测温信息的 R-JPEG,不能用手机截屏或伪彩图去算温差。快门校正(非均匀性校正)按厂商建议周期开启,一般每 1~2 分钟自动执行一次;校正瞬间画面会短暂冻结,航线规划时要避开在关键位置触发。
| 参数 | 建议设置 | 说明 |
|---|---|---|
| 发射率 | 0.85~0.95,全程一致 | 与后期分析软件保持一致 |
| 测温量程 | 手动,-20~150 ℃ | 避免自动量程跳变 |
| 调色板 | 铁红或彩虹 | 仅用于目视,量化用原始数据 |
| 快门校正 | 每 1~2 min 自动 | 校正期间画面冻结,避开关键点 |
| 帧率 | ≥9 Hz | 6 m/s 巡航下避免运动拖影 |
4. 光伏电站无人机巡检数据采集与红外热斑识别落地
数据采集这一段,决定了后面所有分析的上限。飞行参数再漂亮,如果作业时的辐照度不够、云况不稳,热斑温差不出来,识别算法再强也没用。采集和识别要放在一起设计:知道识别算法需要什么,才知道现场该卡哪些条件。
4.1 开工门槛:辐照度、风速、云况的量化判断
辐照度是最关键的门槛。热斑的温升来自被遮挡电池片的功率损耗,辐照度低于 400 W/m² 时,热斑与正常组件的温差可能只有几开尔文,容易被噪声淹没。常见做法是选在正午前后三小时作业,用便携辐照度计在现场实测,读数低于阈值就等。
| 作业条件 | 建议阈值 | 越界后的后果 |
|---|---|---|
| 太阳辐照度 | ≥400 W/m² | 热斑温差不足,系统性漏判 |
| 环境风速 | ≤8 m/s,阵风 ≤10 m/s | 航迹偏移、红外图像拖影 |
| 云况 | 无遮挡或稳定晴空 | 背景温度漂移,相邻图不可比 |
| 组件表面与环境温差 | ≥15 K | 温升特征弱,分级失真 |
| RTK 状态 | 固定解 | 航带间距不均,定位失准 |
飞行前的检查项要固定成清单:RTK 是否固定解、指南针是否校准、返航高度是否设为场内最高障碍物加 30 m、电池温度与电量、存储卡剩余空间、云台自检结果。返航高度这一项在屋顶电站尤其容易出事,厂房屋面之间高度差十几米很常见,按起飞点高度设的返航高度会直接撞上更高的厂房。
4.2 用 OpenCV 做红外图像热斑初筛
红外图像的热斑在灰度上表现为局部高值。与其逐张目视,不如用「大核中值滤波估计背景,再取差值」的方式做初筛,逻辑简单、参数少、对批量数据友好。
import cv2 import numpy as np img = cv2.imread("ir_001.png", cv2.IMREAD_UNCHANGED) if img.dtype != np.uint8: # 16 位辐射数据先线性拉伸到 8 位 img = cv2.normalize(img, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8) bg = cv2.medianBlur(img, 61) # 大核中值估计组件区域背景温度 diff = cv2.subtract(img, bg) # 只保留高于背景的部分 _, mask = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY) # 25 灰阶约为 10 K 温差 mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, np.ones((3, 3), np.uint8)) cnts, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in cnts: if cv2.contourArea(c) < 6: # 过滤单像素噪点 continue x, y, w, h = cv2.boundingRect(c) peak = img[y:y+h, x:x+w].max() print(f"疑似热斑 bbox=({x},{y},{w},{h}) 面积={cv2.contourArea(c):.0f}px 峰值灰度={peak}")中值滤波核取 61 像素,是按「热斑尺寸远小于滤波核」这个前提定的,核越大背景估计越平滑,但太大会把成片的二极管失效区域也当成背景抹掉。阈值 25 灰阶不是通用值,它取决于相机的温标映射关系,必须先用几处已知温度的点做一次线性标定,再换成温差阈值。contourArea下限 6 像素是经验值,低于这个面积的连通域多半是传感器噪声或者镜面反射。这套初筛只做「疑似」,最终判定还是要回到原始辐射数据和人工复核。
4.3 巡检成果字段与缺陷分级怎么定
一份能进工单系统的巡检成果,至少要包含:组件编号或组串编号、缺陷类型、红外峰值温度与环境温度、温差、缺陷像素面积换算的实际尺寸、对应的可见光截图、经纬度与航带编号、拍摄时间与辐照度。缺了辐照度和拍摄时间,后面没法复盘,因为同一块组件在不同辐照度下温差完全不一样。
分级常被引用的思路来自光伏电站红外检测导则(如 IEC TS 62446-3 这一类文件):温差小于 5 K 视为正常波动;5~20 K 之间列为需复检;超过 20 K 列为严重缺陷,建议停机检查。分级只解决排序问题,具体处置还要结合缺陷形态——整串半片温度偏高,多半是旁路二极管失效;单点高温且形状规则,多为遮挡或单片失效;成片均匀偏高的,要排查组串接线和汇流箱。
5. 巡检精度验证与飞行安全边界的两处进阶技巧
前面几章把流程跑通了,剩下的风险集中在两处:一是电量估算靠感觉,返航时才发现逆风吃电厉害;二是热斑定位到底准不准,没人验证过。这两件事都有比较硬的量化做法。
5.1 返航电量阈值按风况动态校核
厂商给的「低电量返航」百分比是按无风巡航功率定的,逆风时功率系数能到 1.2 甚至 1.4。起飞前按最远航点的距离和当场风速算一遍阈值,比沿用默认值可靠得多。
# 返航电量阈值校核:按最远航点距离和风况估算 pack_wh = 90.0 # Wh 电池总能量(双光吊舱挂载时的实测值) cruise_w = 780.0 # W 无风巡航功率,按机型实测填写 speed = 6.0 # m/s 返航速度 dist = 900.0 # m 当前距返航点的水平距离 wind = 1.25 # 逆风功率系数:4~6 级风取 1.2~1.4 reserve = 0.15 # 落地前要求保留的电量比例 rth_s = dist / speed rth_wh = cruise_w * wind * rth_s / 3600 threshold = rth_wh / pack_wh + reserve print(f"返航耗时 {rth_s:.0f} s,需 {rth_wh:.1f} Wh,返航触发电量设为 {threshold*100:.0f}%")算出来的阈值作为航线级的固定值写进作业单,而不是等飞机自己判断。pack_wh一定要用挂载后的健康电池实测容量,标称容量和循环过几百次之后的实际容量能差 15% 以上。顺风返航可以把wind降到 0.9,但别低于reserve的保护线。
5.2 双航线复核验证热斑定位精度
定位精度不验证,缺陷坐标就没法直接派工单。做法是抽 5% 的航带,反向重飞一次(航带方向旋转 180°,或者换一个高度重飞),把同一热斑在两次飞行中的像素坐标换算成实际偏移量。
import numpy as np gsd = 0.046 # m/px 红外 GSD p1 = np.array([2140, 1180]) # 首飞中的热斑像素坐标 p2 = np.array([2147, 1176]) # 复核航线中的同一热斑坐标 offset = (p2 - p1) * gsd print(f"dx={offset[0]:.2f} m, dy={offset[1]:.2f} m, 合成偏差 {np.linalg.norm(offset):.2f} m")合成偏差在 0.5 m 以内,说明坐标可以直接映射到组件级别;超过 1.5 m,就要回头查 RTK 是否固定解、云台俯仰角有没有漂、两次飞行的航向角是否一致。复核同时还能统计漏检:人工用手持热像仪抽查 20 个算法标出的疑似点,记录误报数量,再随机抽 30 块外观正常的组件做反查,两次结果合起来才是这套流程真实的检出率。
本文还有配套的精品资源,点击获取