ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

施药机器人对行施药系统:从作物行识别到偏差控制的关键技术

施药机器人对行施药系统:从作物行识别到偏差控制的关键技术 简介这份文献聚焦温室施药机器人的自主导航与精准施药系统设计面向农业工程、机器视觉与智能装备领域的研究生、工程师及一线科研人员。资源为完整期刊论文共1个PDF文件压缩包约1.96MB轻量便捷已有109人学习。内容以问题为导向详细阐述基于Kinect摄像机的视觉导航方法通过优化K-means聚类实现H与S分量联合分割结合Canny边缘检测和改进Hough变换提取作物行中心线并用自整定模糊PID控制喷药系统。实验数据显示系统导航偏差不超过5厘米植株叶片正面上中下层覆盖率分别达63.26%、50.89%和75.82%能稳定适应不同光照条件。对研究农业机器人导航、精准施药或聚类算法的读者这份文献提供了完整的设计思路、关键参数与测试结果可作为参考文献或算法验证基准使用。1. 施药机器人对行施药系统一场关于“行”的精准博弈在植保作业里“对行”这个词的分量往往被低估了。很多人以为施药机器人就是“能自己走的喷药机”但真正下过地的都明白药液喷没喷到靶标上、重喷了还是漏喷了全看机具对作物行的跟随精度。传统人工作业靠眼睛和方向盘眼睛瞟一眼垄线手修正一下方向到了机器人这里摄像头要顶替眼睛转向机构要顶替双手但系统连“行在哪”都未必能稳定回答。这篇关于施药机器人对行施药系统的设计与试验的文章核心就是在讲一件事作物行识别、对行偏差控制、以及喷杆/喷头对行的执行——三者之间如何闭环才能让机器人在地里不乱喷。适合正在做农机自动化、植保机器人、或者想从“单纯视觉导航”转向“作业级对行控制”的工程师读尤其是那些已经能用视觉识别出作物行、却被田间实时偏差按在地上摩擦的团队。2. 对行施药系统的构成与核心设计逻辑2.1 系统硬件的三个单元从感知到执行的闭环骨架一个可落地的对行施药系统硬件上至少要拆出三个单元缺一个都谈不上“对行”。第一是感知单元通常是一台彩色工业相机加一个嵌入式平台Jetson Orin NX 或 Nano 级别就够了负责实时输出作物行的位置和角度偏差。第二是决策单元一般以单片机STM32 系列常用或者 PLC 作为核心接收感知层下发的偏差信息结合车轮编码器和 IMU 的数据计算出前轮转角或差速指令。第三是执行单元既包括行走机构的转向电机/液压阀也包括喷杆上每个喷头的独立电磁阀——对行不只是“走对”还得“喷对”。参数上有一个容易被忽略的点感知单元的相机安装高度和角度直接决定了它能把作物行看在多远的距离上。提示相机前视距离建议设定在 0.81.5 米。太近留给转向机构的反应时间不够太远垄间杂草和小地块边界会对行线提取产生严重干扰。整个系统设计试验时常见做法是先在仿真环境里把三个单元的接口调通再装到小车上做室内测试最后才上田间。这个顺序不能乱因为执行单元的响应延迟要提前标定否则你去田间调 PID 时会把延迟误判成超调。2.2 对行偏差的定义横向偏差和航向偏差必须分开算很多初次做对行控制的人会犯一个共同的错误把“图像里的行线斜率和位置”直接当成一种偏差丢给 PID。这样做的结果是地头转弯之后车怎么都拉不直——因为行线角度和横向偏移是两个物理量对转向控制的期望是完全不同的。对行偏差应拆成两个分量偏差类型符号定义控制方式横向偏差e_y车辆中心点与目标作物行中心线的垂直距离决定转向修正的方向和力度航向偏差e_theta车辆当前航向与作物行方向的夹角决定前轮转角的前馈修正量计算时以车辆坐标系为基准设图像识别输出目标行线在车辆坐标系下的斜率为k、截距为b那么航向偏差近似等于夹角的正切值横向偏差则要用相机安装位置做几何换算再乘以一个标定系数。import math # 输入图像坐标系中作物行线的斜率和截距像素单位 # 输出车辆坐标系下的横向偏差和航向偏差 def calc_deviation(k_pixel, b_pixel, focal_length, camera_height, row_offset0.35): # 航向偏差弧度用斜率反正切近似 theta_dev math.atan(k_pixel) # 图像底边中心的像素 x 坐标换算成真实横向距离米 x_image_center focal_length * 0.5 # 假设图像中心即相机光轴中心 lateral_offset_pixel x_image_center - b_pixel lateral_offset_meter lateral_offset_pixel * camera_height / focal_length # 减去相机安装位置相对整机中心的偏移量得到真正的横向偏差 e_y lateral_offset_meter - row_offset return e_y, theta_dev代码中row_offset是相机安装点相对车辆几何中心的侧向距离这是必须提前标定的参数很多团队就是忽略了它导致直线行驶时喷杆始终偏向一边。2.3 喷杆分区的必要性全喷不是对行是偷懒对行施药系统里最容易做“差不多”的部分就是喷杆控制。省钱的做法是一根喷杆上装一排喷头用一个总开关控制车走直了就喷偏了就不喷。但这样做有致命缺陷——喷杆宽度通常大于作物行宽全喷模式在转向修正时会造成大面积重喷。我一般会建议把喷杆按行距分区块每个区块对应一路独立电磁阀。识别系统算出目标行的横向偏差后针对偏差方向和大小动态决定哪些分区开启、哪些分区关闭。偏差在阈值内时全开偏差偏出一侧时关闭偏移侧的边缘分区。否则即使车走的精准药液分布不均匀——这比走偏差更可怕因为你看不到。3. 作物行识别与中心线提取从 YOLO 到骨架线3.1 用目标检测找作物行再用几何方法提中心线作业场景下的作物行识别本质上是个结构化问题。有人直接对整幅图像做语义分割把植物像素全部分出来再用 Hough 变换找直线。这个方案在行距规整的大田里够用但到垄距不匀或苗期行间露土较多的地块分割后的连通域碎片化严重直线提取结果极不稳定。更稳妥的方案是先做目标检测把每一株或每一撮作物作为目标检出来再对检测框的中心点做聚类或直线拟合。检测模型用 YOLOv5s 或 YOLOv8s 即可输入尺寸压到 640×640单帧推理在 Jetson 上可以跑 2530 FPS完全满足对行控制 10 Hz 以上的实时性要求。# 伪代码作物行中心线提取流程 from ultralytics import YOLO import numpy as np model YOLO(yolov8s_crop.pt) frame capture_frame() results model(frame, conf0.45) centers [] for box in results[0].boxes: x1, y1, x2, y2 box.xyxy[0].cpu().numpy() cx (x1 x2) / 2 cy (y1 y2) / 2 centers.append((cx, cy)) centers np.array(centers) # 用最小二乘拟合直线得到对行控制所需的斜率和截距 if len(centers) 2: k, b np.polyfit(centers[:, 0], centers[:, 1], 1) # 下发 k、b 给转向控制模块注意一个细节polyfit使用的是图像坐标x是像素列方向。如果你直接把这个斜率喂给航向 PID会发现车在往一个方向稳定偏移——原因在于图像坐标系和车辆坐标系的轴向定义不一致需要在拟合前先把坐标原点移到图像中心再按相机安装角做一次仿射变换。3.2 垄间噪声的滤除被杂草带偏是最大的坑田间作物行识别最大的敌人不是光照而是杂草。杂草在苗期尤其严重。如果你只按检测框中心点拟直线草和作物混在一起时中心点会发散拟合出来的直线可能在两行之间“随机游走”。常见的处理方式是按图像纵坐标把中心点分成若干水平条带在每个条带内做一维聚类然后再按条带的聚类中心拟合直线。这样做相当于给拟合加了一个“行内连续性”的先验约束能有效抑制离散噪声点。另外一个思路是检测时引入行的语义信息——训练数据里标注“这株作物属于第几行”用带行标签的检测数据集训练出模型后直接按行 ID 分组再做每行的直线拟合。这样做对标注工作量的要求显著增加但精度提升也是质的。对行控制一旦稳定后续系统的调试时间能省出一大截。3.3 行端不整齐场景的特殊处理苗期和成熟期的差异苗期作物叶片尚未封行视觉检测到的中心点大多是茎秆信噪比低成熟期叶片交叠检测框之间几乎连成片聚类失效。这两个极端场景下单一算法策略都不行。我在实际工程里会做双模式切换苗期模式用 RGB 图像的绿色通道减去背景土壤的色度差做阈值分割再提取连通域的外接矩形中心作为作物点。封行模式不做实例检测改用灰度纹理的 Gabor 滤波响应提取行周期的频率特征再用频域峰值得到行间距和行方向。封行模式实现起来比目标检测更稳——因为叶片交叠时“单株检测”的本质假设已经不成立了。这两种模式之间用一个简单的指标切换检测框的平均置信度低于 0.5 时自动切换到纹理模式。4. 对行转向控制策略与参数整定4.1 PID 是底线方案前馈才是精度的关键对行控制用 PID 没有错但闭环反馈天生有滞后。车速 0.8 m/s感知到偏差再打方向执行机构启动到位可能要 300 ms车已经走出去 24 厘米了。所以行内稳定性依赖 PID但动态修正能力必须靠前馈。前馈量的来源是上一帧的航向偏差变化率。说白了转弯时的操作要领是把人的经验翻译成代码——看到前方行线开始偏了先预打方向而不是等偏差变大再修正。工程实现上就是对e_theta做微分再乘一个前馈增益K_ff与 PID 的输出叠加。# 转向控制核心片段伪代码 def steering_control(e_y, e_theta, dt): global e_y_prev, e_theta_prev # PID 横向偏差项 p_term Kp_y * e_y i_term Ki_y * e_y * dt d_term Kd_y * (e_y - e_y_prev) / dt # 航向偏差的前馈偏差变化率决定预打方向 ff_term K_ff * (e_theta - e_theta_prev) / dt e_y_prev e_y e_theta_prev e_theta # 输出为前轮目标转角 steering_angle p_term i_term d_term ff_term return steering_angle参数整定时我一般先只调Kp_y让车在地头的直线段能收敛到 ±5 cm然后加K_ff优化动态响应最后开Kd_y消除横向震荡。Ki_y尽量设小或设为 0——因为积分项在转弯回头时会带来严重的 overshoot。4.2 基于纯追踪模型的几何法实现直线和转弯都适用PID 参数要重新调纯追踪则更接近人的直觉以车辆当前位置为圆心画一个半径L_d的圆找这个圆与目标路径的交点作为前视点然后控制车辆朝前视点转向。L_d前视距离是纯追踪唯一的敏感参数且应当随车速动态变化。低速时L_d取 0.81.0 米保证跟踪精度高速时加大到 1.52.0 米防止震荡。关键实现是计算前轮转角import math def pure_pursuit_steer(current_pos, current_yaw, target_path, L_d): # 在车辆坐标系下计算前视点 dx target_path.x - current_pos.x dy target_path.y - current_pos.y # 转换到车体坐标系 local_x dx * math.cos(-current_yaw) - dy * math.sin(-current_yaw) local_y dx * math.sin(-current_yaw) dy * math.cos(-current_yaw) # 计算曲率并得到前轮转角 if local_x 0: curvature 2.0 * local_y / (L_d * L_d) steering math.atan2(curvature * wheel_base, 1.0) return steering else: return 0.0纯追踪和 PID 的混合方案在田间试验里表现最稳——用纯追踪做路径跟踪用 PID 补偿横向偏差两者输出加权后作为最终转角。纯追踪在行端转弯时若前视点跑到相邻行上要加一个行的横向范围限制。限制范围通常以行距的一半为半径。4.3 转向延迟补偿把执行机构的滞后写进模型很多团队在仿真里把转向执行器当成理想环节一给指令立即到位。真实系统里电动推杆或液压阀从指令到到位一般有 100250 ms 的滞后。这个滞后在低频控制下不影响稳定性但在行端连续弯道中会造成周期性的超调。补偿方法有两种。第一种是史密斯预估器把执行器滞后从闭环外搬出来用模型预估当前时刻的实际转角第二种是直接在控制周期上叠加一个预测步——用目标行线的二次多项式外推前视点在 200 ms 之后的位置再计算控制量。第二种做法实现简单效果直观# 用最近三个控制周期的偏差拟合二次多项式外推前方 0.2 秒的偏差 import numpy as np def predict_error(prev_errors, dt, horizon0.2): t np.arange(len(prev_errors)) * dt coefs np.polyfit(t, prev_errors, 2) return np.polyval(coefs, t[-1] horizon)注意外推阶次不能太高二次多项式已经足够阶数高了噪声会被放大成剧烈抖动。执行后如果发现车有“点头”现象检查一下horizon是否大于实际执行器延迟。5. 田间试验方案设计与偏差评估方法5.1 试验条件怎么定行距、车速和地面坡度施药机器人对行施药系统的试验最忌讳的是直接拉到大田里就测测完不知道数据怎么解读。田间试验必须有明确的条件边界并且要做到可复现。行距一般是 60 cm 或 80 cm 的标准大田行距车速建议分三档测试低速 0.5 m/s、中速 0.8 m/s、高速 1.2 m/s。地面条件也要记录土壤含水率和土壤松紧度会对视觉稳定性造成影响尤其是潮湿的黏土地土壤反光会把作物行的色差吃掉。试验至少要做三个往返每个往返中间要包含一次地头转弯。地头转弯是数据最有价值的片段——直线段的偏差大多是稳定的小幅波动而转弯期间的偏差直接反映了控制算法的鲁棒性。5.2 数据采集与误差指标不是只算一个均值很多论文里只报告“平均横向偏差 ±5 cm”这不够。对行施药系统真正要看的指标有三个最大横向偏差极端情况会不会压苗、横向偏差标准差偏差波动是否平顺、以及重喷/漏喷率药液分布质量。指标计算方法参考阈值平均横向偏差全部采样点的e_y取均值≤ 3 cm最大横向偏差全程e_y的绝对值最大值≤ 8 cm偏差标准差反映行驶平顺性≤ 2 cm重喷率相邻喷幅重叠面积占喷幅总面积之比≤ 10%漏喷率未覆盖面积占目标面积之比≤ 5%数据采集时要注意时间同步。相机的时间戳、转向指令的时间戳、编码器的时间戳要统一到同一个时钟源否则后续算偏差时会有“看起来偏了但实际已经修正”的假象。可以在机器人上同时跑一个 RTK-GNSS 接收机记录厘米级定位轨迹用 RTK 轨迹作为真值与视觉对行的偏差做交叉验证。视觉系统的偏差用角点标定板提前标定好RTK 测出的轨迹偏差才是地面上真正的行驶误差。5.3 试验中常见故障排查从现象反推根因田间试验时遇到问题先不要急着改参数按下面的顺序排查现象直线段偏差稳定但始终偏向一侧。检查相机安装偏移量row_offset是否标定准确。现象地头转弯后追踪严重过冲。把K_ff调为零试一次如果过冲消失说明前馈量过大。现象同一地段两次通过偏差表现完全不同。大概率是光照条件变化导致图像分割结果抖动应该检查检测置信度是否在阈值附近震荡。现象偏差数据呈现周期性波浪周期约等于药罐重心晃动频率。这是机械结构问题不是控制问题需要检查轮胎气压和悬挂刚度。如果图像识别频繁跳变加一层时间维度的滤波对行线斜率做帧间平滑。滑动窗口取 5 帧就够太多帧反而会让转向响应迟钝。6. 对行误差补偿的进阶技巧喷杆独立控制与末端修正6.1 喷杆分区按偏差方向前馈关闭而不是等偏差出现前面提到喷杆分区这里补一个更细的做法分区控制的触发信号不直接用当前时刻的横向偏差而是用前面提到的二次预测模型外推 200 ms 后的偏差值一旦预测偏差超过该分区覆盖范围的边界就提前关闭或打开对应电磁阀。这样做的好处是喷药动作与车辆实际到达位置基本同步不会出现“车已经偏出、喷头还在喷上一行”的错位。分区的开关延迟也要单独标定——电磁阀从收到指令到完全打开大约有 2050 ms把这个延时一并算进预测模型。6.2 行端末尾的喷头选择性关闭地头转弯时如果喷杆保持全开会造成地头区域大面积重喷。在地头检测到行结束时将喷杆最外侧的 12 个分区提前关闭可以减少重喷面积。6.3 用一个最小验证脚本确认全链路延时把整条链路的延时拆开测一遍是最值得做的验证工作# 用 GPIO 同时触发相机硬触发和电磁阀测量从曝光到喷头开启的完整链路延时 python3 timing_test.py --trigger-gpio 17 --camera-capture-time 20ms确保全链路延时不超过 120 ms。超过这个值对行速度超过 1 m/s 时基本无法保证 5 cm 以内的偏差要求。对行施药系统的精度的最终上限往往不在算法而在执行器的响应。目标检测模型可以换成更强的PID 参数可以调到理想但喷杆机械间隙和电磁阀响应时间决定了物理下限。建议在地头试验前先做一轮执行器频率响应测试把每个环节的带宽数据记录在案再回头调控制参数——这比盲目追求算法复杂度有效得多。本文还有配套的精品资源点击获取
返回列表