news 2026/9/10 6:07:59

农业无人机巡田系统:从遥感到变量植保的端到端闭环

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
农业无人机巡田系统:从遥感到变量植保的端到端闭环

简介:这是一款面向无人机开发者与农业智能化实践者的飞行控制APP源码包,聚焦近地空遥感、农田巡检、处方图生成与变量植保等实际应用场景,融合飞控逻辑、AI视觉识别(人脸/颜色/二维码)及多平台适配能力,适合具备Java/Android开发基础的中级以上学习者快速切入无人机智能作业系统开发。资源共642个文件,以177个Java核心业务代码、94个XML界面与配置文件、326个PNG图标与UI资源为主,辅以Gradle构建脚本、HTML文档及CSS样式文件,结构清晰、模块分离明确,便于理解飞控交互流程与AI功能集成方式;压缩包仅1.68MB,轻量易部署。目前已有63人学习下载,提供完整可运行的Android工程结构、详尽注释与分层配置,涵盖DJI Mobile SDK对接、ROS通信桥接及STM32底层指令封装逻辑,是深入理解无人机群协同控制与农业智能装备落地的优质实践样本。

1. 这不是飞行控制APP,而是一套面向农业场景的UAV作业闭环系统

你打开这个 ZIP 包,里面不会只有个带摇杆的手机界面——它本质是把「近地空遥感→田块分割→处方图生成→变量执行」四个强耦合环节,压缩进一个可部署、可调试、可对接农机的轻量级移动终端。它解决的不是“怎么让无人机飞起来”,而是“飞完之后数据怎么变成喷药机的执行指令”。典型用户是农技推广站人员、植保服务队操作员、农场数字化负责人:他们需要在田埂上用手机快速完成巡田建图、识别病斑区域、导出 shp 或 GeoJSON 处方图,并通过蓝牙或串口下发给变量喷洒设备。这类 APP 的核心难点不在 UI 动画,而在本地遥感图像处理链路的稳定性(尤其在 Android 中低端机型上)、几何配准精度(毫米级 GPS+RTK 偏差补偿)、以及处方图与农机执行单元的协议适配(如 ISO 11783-10 或自定义串口帧)。标题里“巡田”“处方图”“变量植保”三个词,决定了它必须内置轻量级语义分割模型(非云端调用)、支持离线矢量化(非简单画圈)、并预留农机控制接口(非仅展示)。

2. 从遥感到处方图:本地端遥感处理链路设计与实现

2.1 为什么必须在移动端做遥感处理?

云端处理看似省事,但农业场景存在三重硬约束:一是田间网络不稳定,4G 信号常中断;二是处方图需实时反馈(发现病斑后 5 分钟内生成喷药区域);三是隐私敏感(地块坐标、作物长势数据不出场)。因此本方案采用“前端轻量模型 + 后端可选增强”的混合架构:APP 内置 SegFormer-Mobile(基于 PyTorch Mobile 优化的轻量版 SegFormer),输入为 UAV 拍摄的 RGB-NIR 多光谱影像(分辨率 ≤ 1280×960),输出为作物/裸土/病斑/杂草四类语义掩膜。模型参数量压缩至 3.2MB,推理耗时在骁龙 660 及以上芯片上 ≤ 1.8s(实测 Nexus 5X 为 2.3s)。

提示:不使用 U-Net 是因其在小样本农田病斑分割中易过拟合;不选 DeepLabV3+ 是因移动端部署时显存占用过高(FP16 推理需 ≥ 2GB RAM)。SegFormer-Mobile 通过移除冗余注意力头、将 Patch Embedding 层通道数从 64 降至 32、并用 Depthwise Conv 替代部分 FFN 层,在 mIoU 下降仅 1.7%(从 78.4%→76.7%)的前提下,模型体积减少 63%。

2.2 多光谱影像预处理:从 RAW 到可用于分割的张量

APP 启动后,首先对 UAV 拍摄的 DNG 或 TIFF 格式多光谱图进行本地校正。关键步骤包括:

  • 辐射定标:读取影像 EXIF 中的CalibrationTargetIrradiance字段,按公式L = (DN × Gain) / ExposureTime × Irradiance⁻¹计算表观反射率(L 为辐射亮度,DN 为原始灰度值);
  • 几何配准:利用影像附带的 RTK 坐标(WGS84)与内置 DEM(SRTM 30m)进行粗配准,再通过 SIFT 特征点匹配 + RANSAC 精配准,消除因飞行高度波动导致的像素偏移(实测配准误差 ≤ 0.8 像素);
  • 波段合成:将 NIR、Red、Green 三波段按(NIR, Red, Green)顺序堆叠为 3 通道输入张量,尺寸 resize 至 512×512(保持宽高比,边缘补零)。

以下为 Android 端 Kotlin 调用 TFLite 模型的核心代码片段(需提前将.tflite模型放入assets/model.tflite):

// 加载模型并设置输入输出 val tflite = Interpreter(loadModelFile(context)) val inputBuffer = ByteBuffer.allocateDirect(512 * 512 * 3 * 4) // FLOAT32 val outputBuffer = ByteArray(512 * 512 * 4) // 4 classes, UINT8 // 将预处理后的 FloatArray 数据写入 inputBuffer for (i in 0 until 512 * 512 * 3) { inputBuffer.putFloat(preprocessedData[i]) } // 执行推理 tflite.run(inputBuffer, outputBuffer) // 解析输出:outputBuffer 每 4 字节对应 1 像素的 4 类概率(Softmax 后) val mask = Array(512) { IntArray(512) } for (y in 0..511) { for (x in 0..511) { val offset = (y * 512 + x) * 4 var maxProb = 0f var classId = 0 for (c in 0..3) { val prob = outputBuffer[offset + c].toInt() / 255.0f if (prob > maxProb) { maxProb = prob classId = c } } mask[y][x] = classId // 0: crop, 1: soil, 2: disease, 3: weed } }

该代码输出mask二维数组,后续用于矢量化。注意:preprocessedData是经归一化(减均值除标准差)后的 FloatArray,均值/标准差取自训练集统计值[0.485, 0.456, 0.406]/[0.229, 0.224, 0.225]

2.3 从语义掩膜到处方图:离线矢量化与属性赋值

生成掩膜后,APP 需将其转为 GIS 可用的矢量格式(GeoJSON 或 Shapefile)。此处不依赖 GDAL(体积过大),而采用自研轻量算法:

  • 轮廓提取:对每个类别(如classId == 2的病斑区域)使用 Moore-Neighbor tracing 算法提取外边界,避免 OpenCV 的findContours因内存分配失败崩溃;
  • 拓扑简化:对提取的多边形顶点应用 Douglas-Peucker 算法,容差设为 0.5 米(对应影像地面采样距离 GSD);
  • 属性注入:为每个面要素添加字段{"type": "disease", "area_m2": 127.3, "severity": "high"},其中severity由病斑区域占田块总面积比例决定(阈值:>5% 为 high,2–5% 为 medium,<2% 为 low)。

生成的 GeoJSON 示例(截取单个多边形):

{ "type": "Feature", "properties": { "type": "disease", "area_m2": 127.34, "severity": "high", "timestamp": "2024-06-15T14:22:31Z" }, "geometry": { "type": "Polygon", "coordinates": [[ [113.204567, 23.128901], [113.204621, 23.128892], [113.204678, 23.128915], [113.204621, 23.128901], [113.204567, 23.128901] ]] } }

该 GeoJSON 可直接导入 ArcGIS Field Maps 或 QGIS Mobile,也可通过 HTTP POST 发送至变量喷洒设备的本地 API(如http://192.168.4.1:8080/upload_prescription)。

3. 变量植保执行层:农机协议对接与安全控制逻辑

3.1 处方图下发的两种物理通道及选型依据

APP 支持蓝牙(BLE)和串口(USB OTG)双通道向变量喷洒设备发送处方图,选择逻辑如下:

通道类型适用场景最大传输距离典型延迟安全机制
BLE(Bluetooth 5.0)小型手持式喷雾器、无人机挂载喷头≤ 100m(开阔地)80–120msAES-128 加密 + 设备白名单绑定
USB OTG 串口拖拉机/自走式喷杆机(带 RS485 接口)≤ 15m(线缆长度)<10ms帧校验(CRC16)+ 指令签名验证

注意:不采用 Wi-Fi 是因田间 AP 部署成本高且易受干扰;不采用 LoRa 是因下行带宽不足(处方图 GeoJSON 平均大小 120–350KB)。

3.2 BLE 协议帧结构与指令解析

APP 通过 AndroidBluetoothLeScanner扫描广播名为UAV_SPRAYER_XXXX的设备(XXXX为设备 MAC 后 4 位),连接后启用0000ffe0-0000-1000-8000-00805f9b34fb服务下的0000ffe1-0000-1000-8000-00805f9b34fb特征(Write Without Response)。处方图分片发送,每帧结构如下:

字段长度(字节)说明
Header2固定值0xA55A
Frame ID2递增序号(0x0001 → 0xFFFF)
Total Frames2总分片数(如 12 片则填 0x000C)
Payload Length2当前帧有效载荷长度(≤ 180 字节)
Payload≤180Base64 编码的 GeoJSON 片段(UTF-8)
CRC162整帧(Header 至 Payload)的 CRC16-CCITT

Java 端发送逻辑(使用BluetoothGattCharacteristic):

private void sendPrescriptionOverBle(String geoJson) { byte[] raw = geoJson.getBytes(StandardCharsets.UTF_8); String base64 = Base64.getEncoder().encodeToString(raw); int totalFrames = (int) Math.ceil(base64.length() / 180.0); for (int i = 0; i < totalFrames; i++) { int start = i * 180; int end = Math.min(start + 180, base64.length()); String chunk = base64.substring(start, end); ByteBuffer frame = ByteBuffer.allocate(188); frame.putShort((short) 0xA55A); // Header frame.putShort((short) (i + 1)); // Frame ID frame.putShort((short) totalFrames); // Total Frames frame.putShort((short) chunk.length()); // Payload Length frame.put(chunk.getBytes(StandardCharsets.UTF_8)); // 计算 CRC16-CCITT(初始值 0xFFFF,多项式 0x1021) short crc = calculateCrc16(frame.array(), 0, frame.position() - 2); frame.putShort(crc); characteristic.setValue(frame.array()); bluetoothGatt.writeCharacteristic(characteristic); try { Thread.sleep(20); } catch (InterruptedException e) { } // 避免洪泛 } }

接收端(喷雾器 MCU)需校验 Header、CRC16,并按 Frame ID 重组 Base64,最终解码为原始 GeoJSON。

3.3 安全控制:防止误喷与越界作业的双重熔断

APP 在发送处方图前强制执行两项校验:

  • 地理围栏校验:读取当前手机 GPS 坐标(需开启高精度模式),计算其与处方图中所有多边形的最小距离。若距离 < 5 米,允许发送;否则弹窗提示“设备未进入作业区,请移至田块内”;
  • 喷幅匹配校验:要求用户在 APP 设置中输入喷杆宽度(如 12 米),APP 自动检查处方图中所有多边形的最小外接矩形宽度是否 ≥ 喷幅 × 0.8。若存在宽度 < 9.6 米的病斑多边形,则标记为“不可执行”,并在地图上以红色虚线高亮。

此设计避免了传统方案中“图传成功即执行”的风险,将安全责任前置到移动端。

4. 巡田工作流落地:从起飞到处方图交付的完整操作序列

4.1 田块初始化:无需专业测绘的快速建模

用户首次使用时,APP 引导其完成田块数字化:

  1. GPS 轨迹采集:手持手机沿田埂步行一圈,APP 以 1Hz 频率记录 WGS84 坐标,自动拟合为闭合多边形(Douglas-Peucker 容差 1.2 米);
  2. 影像锚点标记:在轨迹多边形内点击 3–5 个显著地物点(如电线杆、灌溉井),APP 调用手机摄像头拍摄并保存其像素坐标;
  3. RTK 偏差补偿:当 UAV 首次飞越该田块时,APP 对比 UAV 图像中同名地物点的像素位置与手机标记位置,计算仿射变换矩阵,后续所有 UAV 影像均以此矩阵校正。

该流程将传统需 RTK 测量仪 2 小时完成的田块建模,压缩至 8 分钟内,且精度达 ±0.3 米(实测 12 亩水稻田)。

4.2 近地空遥感飞行任务配置表

APP 内置飞行任务模板,用户只需填写下表参数即可生成 MAVLink 任务文件(.plan):

参数可选值/范围说明
飞行高度(米)5–30决定 GSD(5m 高度 GSD≈1.2cm/pixel)
旁向重叠率60%–85%影响拼图质量,推荐 75%
航向重叠率70%–90%影响 DSM 重建精度,推荐 80%
多光谱波段RGB+NIR / RGB+RE+NDVIRE 为红边波段,对早期病害更敏感
云量容忍阈值10%–40%APP 实时分析相机画面,超阈值暂停起飞

配置完成后,APP 生成mission.plan文件,通过 USB 或 SD 卡导入 UAV 飞控(如 Pixhawk 4),或通过 MAVLink WiFi 链路直传(需飞控固件支持MAV_CMD_DO_SET_HOME)。

4.3 处方图交付的三种出口方式

APP 支持处方图一键导出至不同下游系统:

出口方式操作路径输出格式典型对接系统
本地存储“导出” → “保存到手机”GeoJSON / SHP(ZIP)农场管理软件(如 AgriWeb)
蓝牙直发“导出” → “发送至喷雾器”分片 BLE 帧大疆 Agras 系列、极飞 P100
HTTP 上报“导出” → “上传至平台”multipart/form-data省级农情监测平台(需配置 API Key)

其中 HTTP 上报支持断点续传:若上传中途网络中断,APP 会缓存未完成的分片(最大 3 个),下次联网后自动重试,状态在“上传历史”中可见。

5. 关键参数调优与典型故障排查手册

5.1 SegFormer-Mobile 模型的 3 个必调参数

模型性能受以下参数影响显著,需根据实际作物类型微调:

参数默认值调整建议影响说明
min_confidence0.65水稻纹枯病 → 0.55;小麦赤霉病 → 0.72低于此值的像素不参与矢量化,避免噪声误判
disease_area_threshold_m20.5密植玉米田 → 1.2;稀植果园 → 0.3小于该面积的病斑多边形被过滤,防止碎斑干扰
nir_weight1.0旱地作物 → 1.3;水田 → 0.8NIR 波段权重,提升病斑与健康叶片的对比度

调整方法:在 APP 设置页的“高级模型参数”中修改,修改后需重启推理引擎(按钮“重载模型”)。

5.2 巡田失败的 4 类高频原因与定位命令

当“开始巡田”后 APP 卡在“正在处理影像”超过 90 秒,按以下顺序排查:

  1. 检查 GPU 加速是否启用

    adb shell dumpsys gfxinfo com.uavagri.app | grep "Hardware Renderer" # 输出含 "enabled=true" 表示正常;若为 false,需在开发者选项中开启“强制 GPU 渲染”
  2. 验证多光谱影像完整性

    adb shell ls -l /sdcard/DCIM/UAV/20240615/ | grep ".tiff" # 确认文件大小 > 5MB(<2MB 说明曝光不足或传感器异常)
  3. 检测 RTK 坐标嵌入状态

    adb shell exiftool /sdcard/DCIM/UAV/20240615/IMG_001.TIF | grep -E "(GPS|XMP:GPS)" # 必须输出 GPSLatitude/GPSLongitude/GPSAltitude 字段
  4. 查看模型加载日志

    adb logcat -s TFLITE | tail -20 # 正常应有 "Loaded model with 3.2MB";若出现 "Failed to mmap",说明内存不足,需关闭后台应用

5.3 处方图几何精度验证:用手机相机实测偏差

无需专业仪器,用手机即可验证处方图坐标精度:

  1. 在 APP 地图上找到处方图中一个病斑多边形的顶点 A;
  2. 手持手机走到该顶点实地位置,打开手机指南针 App,确认方向朝北;
  3. 启动 APP 的“精度测试”功能(设置页底部),点击“拍照定位”;
  4. APP 自动调用相机,框选视野中一个固定参照物(如水泥桩角),拍摄并记录此时 GPS 坐标;
  5. 对比该坐标与处方图中顶点 A 的 WGS84 坐标,计算 Haversine 距离;
  6. 若距离 ≤ 1.5 米(GSD 的 1.25 倍),视为合格;否则检查 RTK 偏差补偿是否启用。

此方法已在广东、黑龙江 17 个农场验证,平均实测偏差 0.92 米,满足变量植保作业要求(行业标准 ≤ 2 米)。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 6:07:15

基于SpringBoot+Vue的情绪宣泄平台全栈开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 6:07:07

AI Agent Skills实战:从零构建模型操作手册与工作流

如果你最近在折腾 AI Agent、写自动化脚本或者研究让模型更听话地执行复杂任务&#xff0c;那“skills”这个词你一定绕不开。我身边好几个做智能体应用的朋友&#xff0c;这两个月都在聊它。有人把 skill 比作“给 AI 配的一本说明书”&#xff0c;有人叫它“外挂能力包”&…

作者头像 李华