AGV دنبالکننده خط با OpenCV چیست؟ (مبتدی)
در کارخانههای مدرن، AGVها (رباتهای حملونقل خودکار) معمولاً یک خط رنگی روی کف را دنبال میکنند — یک نوار زرد یا سفید که مسیر حرکت را مشخص میکند. این روش سادهتر و ارزانتر از GPS یا LiDAR است.
OpenCV یک کتابخانه پردازش تصویر متنباز است که روی Raspberry Pi اجرا میشود. دوربین Pi Camera تصویر کف را میگیرد، OpenCV خط را شناسایی میکند، و یک کنترلر PID موتورها را تنظیم میکند تا ربات روی خط بماند.
محصولی که میسازید
یک AGV دنبالکننده خط با Pi Camera و OpenCV با سرعت ۰.۵m/s.
- هزینه: ۲ تا ۳ میلیون تومان
- سرعت: ۰.۳-۰.۵ m/s
- دقت: ±۱cm از مرکز خط
کد Python — Line Following با OpenCV
import cv2
import numpy as np
import RPi.GPIO as GPIO
import time
# تنظیم موتور L298N
IN1,IN2,IN3,IN4=17,18,27,22
ENA,ENB=12,13 # PWM
GPIO.setmode(GPIO.BCM)
for p in [IN1,IN2,IN3,IN4,ENA,ENB]: GPIO.setup(p,GPIO.OUT)
pwmA = GPIO.PWM(ENA,100); pwmB = GPIO.PWM(ENB,100)
pwmA.start(0); pwmB.start(0)
def setMotors(l,r):
l = max(-100, min(100, l))
r = max(-100, min(100, r))
GPIO.output(IN1, l>0); GPIO.output(IN2, l<0)
GPIO.output(IN3, r>0); GPIO.output(IN4, r<0)
pwmA.ChangeDutyCycle(abs(l)); pwmB.ChangeDutyCycle(abs(r))
cap = cv2.VideoCapture(0)
cap.set(3,320); cap.set(4,240)
Kp,Ki,Kd = 0.5, 0.001, 0.1
integral = prev_error = 0
while True:
ret, frame = cap.read()
roi = frame[180:240, :] # فقط ۶۰ پیکسل پایین
gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 80, 255, cv2.THRESH_BINARY_INV)
M = cv2.moments(binary)
if M["m00"] > 0:
cx = int(M["m10"] / M["m00"])
error = cx - 160 # انحراف از مرکز
integral += error
derivative = error - prev_error
correction = Kp*error + Ki*integral + Kd*derivative
prev_error = error
setMotors(int(60-correction), int(60+correction))
else:
setMotors(0,0) # خط پیدا نشد
چکلیست تنظیم PID
| مشکل | تنظیم |
|---|---|
| ربات تند چرخ میزند | Kp را کاهش دهید |
| ربات از خط خارج میشود | Kp را افزایش دهید |
| لرزش در مسیر مستقیم | Kd را افزایش دهید |
| در پیچ خارج میشود | Ki را کمی افزایش دهید |