Робот едущий за цветным объектом

В продолжение темы 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. Робот использует камеру, чтобы находить желтый цвет на изображении и следовать за ним. Если желтый цвет не обнаруживается, робот останавливается.

Оставьте комментарий