В продолжение темы OpenCV , робот следящий и едущий за цветным объектом.
Для создания программы робота, который будет ехать за желтым шаром, вам понадобится камера, способная обнаруживать желтый цвет, и двигатели, управляемые платой L298N.
Пример программы на Python для робота, который едет за желтым шаром, может выглядеть следующим образом:
import cv2 import numpy as np import RPi.GPIO as GPIO import time # Настройки камеры cap = cv2.VideoCapture(0) cap.set(3, 640) # Ширина кадра cap.set(4, 480) # Высота кадра # Настройки портов управления двигателями ENA = 18 IN1 = 23 IN2 = 24 ENB = 25 IN3 = 17 IN4 = 27 # Настройки GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(ENA, GPIO.OUT) GPIO.setup(IN1, GPIO.OUT) GPIO.setup(IN2, GPIO.OUT) GPIO.setup(ENB, GPIO.OUT) GPIO.setup(IN3, GPIO.OUT) GPIO.setup(IN4, GPIO.OUT) # Функции для управления двигателями def set_speed(speed): GPIO.output(ENA, GPIO.HIGH) GPIO.output(ENB, GPIO.HIGH) pwm1.ChangeDutyCycle(speed) pwm2.ChangeDutyCycle(speed) def set_left_motor_direction(direction): if direction == 'forward': GPIO.output(IN1, GPIO.HIGH) GPIO.output(IN2, GPIO.LOW) elif direction == 'backward': GPIO.output(IN1, GPIO.LOW) GPIO.output(IN2, GPIO.HIGH) def set_right_motor_direction(direction): if direction == 'forward': GPIO.output(IN3, GPIO.HIGH) GPIO.output(IN4, GPIO.LOW) elif direction == 'backward': GPIO.output(IN3, GPIO.LOW) GPIO.output(IN4, GPIO.HIGH) # Настройки шим-сигналов для управления скоростью двигателей pwm1 = GPIO.PWM(ENA, 100) pwm1.start(0) pwm2 = GPIO.PWM(ENB, 100) pwm2.start(0) # Задаем целевой цвет yellow_lower = np.array([20, 100, 100], dtype=np.uint8) yellow_upper = np.array([30, 255, 255], dtype=np.uint8) # Запускаем основной цикл программы while True: # Считываем кадр с камеры ret, frame = cap.read() # Преобразуем кадр в цветовое пространство HSV hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # Выделяем желтый цвет mask = cv2.inRange(hsv, yellow_lower, yellow_upper) # Находим контуры объектов на изображении contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # Ищем контур желтого шара с максимальной площадью
max_area = 0 best_contour = None for contour in contours: area = cv2.contourArea(contour) if area > max_area: max_area = area best_contour = contour # Если найден контур желтого шара if best_contour is not None: # Находим центр контура M = cv2.moments(best_contour) cx = int(M['m10'] / M['m00']) cy = int(M['m01'] / M['m00']) # Если центр находится слева от центра изображения, поворачиваем влево if cx < 320: set_left_motor_direction('backward') set_right_motor_direction('forward') # Если центр находится справа от центра изображения, поворачиваем вправо else: set_left_motor_direction('forward') set_right_motor_direction('backward') # Устанавливаем скорость двигателей в зависимости от расстояния до центра изображения speed = max(0, min(100, 60 + abs(cx - 320))) set_speed(speed) # Если желтый шар не найден, останавливаемся else: set_speed(0) # Отображаем изображение с контурами на экране cv2.drawContours(frame, contours, -1, (0, 255, 0), 3) cv2.imshow('frame', frame) # Ждем нажатия клавиши "q" для выхода из программы if cv2.waitKey(1) == ord('q'): break # Останавливаем двигатели и освобождаем ресурсы set_speed(0) pwm1.stop() pwm2.stop() GPIO.cleanup() cap.release() cv2.destroyAllWindows(
)
Эта программа использует библиотеку OpenCV для обработки изображений с камеры, а также библиотеку RPi.GPIO для управления двигателями через плату L298N. Робот использует камеру, чтобы находить желтый цвет на изображении и следовать за ним. Если желтый цвет не обнаруживается, робот останавливается.