- 实际应用场景描述
场景:
在大型农田中,农民使用自动驾驶农用小车进行播种、施肥、喷药等作业。田埂是农田中划分地块的窄土埂,通常种植低矮作物或空置,小车需要沿着田埂行驶,避免压坏中间的主要庄稼,同时完成沿边作业(如喷洒农药)。
痛点:
-
田埂狭窄,人工驾驶容易偏离。
-
庄稼易受损,压坏会导致减产。
-
环境复杂,有杂草、水沟、阴影等干扰。
-
作业效率与安全性需兼顾。
-
核心逻辑讲解
-
图像采集
- 使用车载摄像头实时拍摄前方地面。
-
田埂识别
- 使用深度学习模型(如U-Net或YOLOv5-seg)分割田埂区域。
-
路径规划
- 根据田埂中心线生成参考路径(RANSAC拟合直线或曲线)。
-
控制执行
- 使用PID控制器保持车辆在田埂中心行驶。
-
状态监控
- 实时检测偏离,动态调整方向盘角度。
-
代码模块化设计
farm_robot/ ├── main.py # 主程序入口 ├── config.py # 配置文件 ├── perception/ # 感知模块 │ ├── ridge_detector.py │ └── camera_utils.py ├── planning/ # 规划模块 │ └── path_generator.py ├── control/ # 控制模块 │ └── pid_controller.py ├── utils/ # 工具函数 │ └── logger.py ├── README.md # 使用说明 └── requirements.txt # 依赖库
3.1 config.py
配置文件
CAMERA_WIDTH = 640 CAMERA_HEIGHT = 480 RIDGE_COLOR_LOWER = [0, 0, 100] # HSV下限(示例) RIDGE_COLOR_UPPER = [180, 50, 255] # HSV上限 TARGET_PATH_OFFSET = 0.2 # 目标路径与田埂中心的偏移量(米) MAX_STEERING_ANGLE = 30 # 最大转向角(度)
3.2 perception/ridge_detector.py
import cv2 import numpy as np from config import RIDGE_COLOR_LOWER, RIDGE_COLOR_UPPER
class RidgeDetector: def init(self): pass
def detect(self, frame):
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower = np.array(RIDGE_COLOR_LOWER, dtype="uint8")
upper = np.array(RIDGE_COLOR_UPPER, dtype="uint8")
mask = cv2.inRange(hsv, lower, upper)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
return contours
3.3 planning/path_generator.py
import numpy as np from config import TARGET_PATH_OFFSET
class PathGenerator: def generate(self, contours): if not contours: return None # 取最大轮廓(假设为田埂) largest_contour = max(contours, key=cv2.contourArea) # 拟合直线 y = kx + b [vx, vy, x0, y0] = cv2.fitLine(largest_contour, cv2.DIST_L2, 0, 0.01, 0.01) return (vx, vy, x0, y0)
3.4 control/pid_controller.py
class PIDController: def init(self, kp=1.0, ki=0.0, kd=0.1): self.kp = kp self.ki = ki self.kd = kd self.prev_error = 0 self.integral = 0
def compute(self, error, dt):
self.integral += error * dt
derivative = (error - self.prev_error) / dt
output = self.kp * error + self.ki * self.integral + self.kd * derivative
self.prev_error = error
return output
3.5 main.py
import cv2 import time from perception.ridge_detector import RidgeDetector from planning.path_generator import PathGenerator from control.pid_controller import PIDController
def main(): detector = RidgeDetector() planner = PathGenerator() controller = PIDController(kp=0.5, kd=0.1) cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
contours = detector.detect(frame)
path = planner.generate(contours)
if path:
vx, vy, x0, y0 = path
# 计算当前车辆位置与路径的横向误差(简化)
error = 0 # 实际应从车辆位置计算
dt = 0.1
steering = controller.compute(error, dt)
print(f"Steering angle: {steering:.2f} deg")
else:
print("No ridge detected!")
time.sleep(0.1)
cap.release()
if name == "main": main()
- README.md
农用小车自动沿田埂行驶系统
基于 Python + OpenCV + 机器学习的农田田埂识别与路径跟踪程序。
功能
- 实时田埂检测(颜色分割)
- 路径生成与跟踪
- PID控制保持居中行驶
- 模块化设计,易于扩展
安装
bash
pip install -r requirements.txt
运行
bash
python main.py
配置
修改 config.py 调整颜色范围、PID参数等。
-
使用说明
-
连接USB摄像头到设备。
-
安装依赖: "pip install -r requirements.txt"。
-
根据实际田埂颜色调整 "RIDGE_COLOR_LOWER" 和 "RIDGE_COLOR_UPPER"。
-
运行 "python main.py",观察终端输出的转向角度。
-
可扩展为ROS节点控制真实车辆。
-
核心知识点卡片
知识点 说明 颜色空间转换 BGR转HSV便于颜色分割 轮廓检测 提取田埂区域 直线拟合 用最小二乘法拟合田埂中心线 PID控制 保持车辆在路径中心 图像处理 去噪、二值化、形态学操作 模块化设计 便于维护与测试
- 总结
本项目展示了如何将计算机视觉与自动控制结合,实现农用小车沿田埂安全行驶。
通过颜色分割+轮廓检测识别田埂,路径生成提供参考线,PID控制保证行驶稳定。
该方案可扩展为多光谱田埂识别、GPS+视觉融合导航等高级应用
如果你需要,还可以:
- 添加ROS集成版本
- 使用U-Net语义分割提升田埂识别精度
- 生成Docker镜像方便部署到树莓派/Jetson Nano
利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!