user

Авторизация

Добро пожаловать!

Регистрация

Undefined666

Технологии

Управляемый компьютерным зрением радиоуправляемый автомобиль

Введение

 Беспилотные автомобили, использующие компьютерное зрение для обнаружения препятствий на пути и навигации по путевым точкам, активно разрабатываются различными компаниями по всему миру. Целью текущего проекта является разработка небольшой установки, в которой учащийся может реализовывать различные алгоритмы и тестировать их итеративно. Этот проект состоит из автомобиля, ИК-канала связи и программного обеспечения для обработки изображений на ноутбуке.

 Игрушечная машинка из двух мотор-редукторов постоянного тока, установленных на перфорированной доске. Автомобиль поворачивает с помощью дифференциального привода и получает сигналы от компьютера с помощью ИК-приемника. Arduino Nano используется для декодирования полученных ИК-сигналов и управления двумя двигателями постоянного тока. ИК-сигналы могут подаваться платой ИК-передатчика, подключенной к ноутбуку или обычному пульту дистанционного управления телевизором.

 Стационарная верхняя камера, установленная с видом на поле сверху вниз, получает изображения, которые передаются на ноутбук с Linux через USB. Ноутбук под управлением python с библиотеками openCV используется для обработки изображений. В текущей версии программа Python определяет местоположение и ориентацию автомобиля (маркер в форме треугольника) относительно цели (маркер пятиугольника) и направляет автомобиль к цели. Эта программа Python может быть обновлена ​​​​с помощью различных продвинутых алгоритмов без серьезной модификации оборудования.

 Ноутбук Linux взаимодействует с радиоуправляемой машиной с помощью ИК-передатчика (ИК-светодиода) и приемника (VS1838). ИК-передатчик выполнен с использованием платы Arduino Uno, установленной на перфорированной плате, подключенной к ноутбуку с помощью USB-кабеля. Игрушечная машина содержит ИК-приемник, также связанный с Arduino Uno, который управляет машиной.

 Автомобиль, показанный на рисунке, имеет два мотор-колеса постоянного тока с редуктором на 9 В, которые питаются от двух последовательно соединенных батарей типа АА на 1,5 В. Питание двигателя подается через транзисторы BC547. BC 547 представляет собой NPN-транзистор общего назначения. Он обычно используется в аудиоусилителях и схемах обработки сигналов. В этом приложении транзистор используется в качестве переключателя нижнего плеча. Положительный провод двигателя всегда подключен к источнику питания +3 В. Минусовая клемма двигателя соединена с землей через транзистор. Только когда транзистор открыт, ток протекает через двигатель. Транзистор имеет выводы коллектора, базы и эмиттера. Коллектор подключается к отрицательной клемме двигателя, а эмиттер подключается к земле. База подключена к сигналу от Arduino через резистор 500 Ом. Транзисторы левого и правого двигателей подключены к цифровым выходным контактам D3 и D5. Резистор предназначен для ограничения протекания тока через базу транзистора. Когда на оба контакта D3 и D5 подается ВЫСОКИЙ уровень, оба транзистора начинают работать, и радиоуправляемая машинка движется вперед. Когда только один из транзисторов находится в состоянии ВЫСОКОГО уровня, автомобиль поворачивается. С этой установкой невозможно повернуть машину задним ходом.

 ИК-приемник VS1838B используется для приема команд от пульта ДУ телевизора (Tata Sky) или передатчика, подключенного к ноутбуку. Он совместим с распространенными форматами данных ИК-пульта дистанционного управления. Входное напряжение от 3В до 5В. Он имеет 3 контакта: Vcc, выход и земля. Питание 5 В для ИК-приемника подается от самого Arduino, обеспечивая общее заземление. Выходной контакт подключен к контакту D10 Arduino. Широко используемая библиотека Arduino «IRremote.h» используется для декодирования полученных ИК-сигналов и преобразования их в целые числа, на которые затем можно воздействовать.

 Готовый автомобиль накрывается белым треугольником из картона так, чтобы треугольная форма была видна верхней камере для определения местоположения и ориентации автомобиля. Приемник VS1838B проходит через треугольник, чтобы он мог принимать сигналы от платы передатчика или пульта дистанционного управления телевизора.

Настройка ИК-приемника и передатчика

 Коды, полученные в последовательном мониторе Arduino Nano автомобиля при нажатии различных кнопок на пульте Tata Sky, приведены в таблице. Эти коды были идентифицированы путем подключения принимающего Arduino Nano к компьютеру с помощью USB-кабеля и регистрации его серийного номера. следить за нажатием различных клавиш на пульте Tata Sky (показано на рисунке).

 Во время работы в автомобиле Arduino Nano постоянно прослушивает эти коды в цикле. В коде Arduino, запрограммированном на автомобиле, кодам левой, правой и передней клавиш пульта Tata Sky были назначены функции, которые заставляют автомобиль поворачивать налево, направо или двигаться прямо вперед соответственно. Код, соответствующий кнопкам с цифрами 1,2,3,4, был назначен для установки разной длительности дифференциального времени движения. Например, нажатие 1, а затем левой клавиши заставляет правый двигатель вращаться в течение 500 миллисекунд, в то время как левый двигатель останавливается. Нажатие 2, а затем левой клавиши заставляет правый двигатель вращаться в течение 1000 миллисекунд, в то время как левый двигатель останавливается. Таким образом можно контролировать степень поворота. Точно так же нажатие красной клавиши и кнопки вперед на пульте заставляет автомобиль двигаться вперед на 2 секунды,

Коды различных кнопок на пульте Tata Sky

Кнопка в Tata Sky Remote
Получено целочисленное значение
от 0 до 10 чиселот 12582912 до 2582921
Верно12583003
Левый12583002
Передний12583000
Назад12583001
Синий12583024
Желтый12583023
Зеленый12583022
Красный12583021
Воспроизведение/Пауза12582948

 Плата ИК-передатчика, показанная на рис. 5, представляет собой простую перфорированную плату, содержащую Arduino Uno, управляющую ИК-светодиодом через транзистор BC547, как показано на рисунке ниже. Цифровой выход ШИМ D3 подключен к базе транзистора с использованием тока 500 Ом. ограничительный резистор. Коллектор транзистора соединен со светодиодом, а эмиттер соединен с общей землей. ИК-светодиод подключается к контакту 5V Arduino через токоограничивающий резистор.  

 Команда IRsend() библиотеки «IRremote.h» используется для отправки кодов, соответствующих различным числовым клавишам пульта Tata Sky. Таким образом, ИК-передатчик просто эмулирует пульт Tata Sky. Программа Arduino на Uno, подключенном к ИК-передатчику, контролирует его последовательный порт в цикле. Когда программа Python, выполняющая процедуру обработки изображения, выводит команду вперед/поворот на последовательный порт, Arduino считывает символ из последовательного порта и передает соответствующий ИК-сигнал через ИК-светодиод. Всю обработку изображений и принятие решений по управлению автомобилем выполняет программа Python, которая просто передает команды на Arduino Uno, который затем передает их на Arduino Nano в автомобиле.

Обработка изображений для идентификации цели

 Веб-камера Logitech, установленная на раме, используется для непрерывного получения изображений в цикле. Ноутбук получает изображения с веб-камеры с помощью функции VideoCapture в openCV. Каждое изображение обрабатывается, и перед съемкой следующего изображения дается команда перемещения. Блок-схема всей программы Python показана на рисунке ниже. 

 В качестве первого шага после получения изображения применяется размытие по Гауссу для удаления шума на изображениях. Цветное изображение преобразуется в шкалу серого, и для различения белых и черных областей применяется пороговое значение 210. Все значения пикселей выше 210 обрабатываются как белые, а значения пикселей ниже 210 обрабатываются как черные. Таким образом, шкала серого преобразуется в черно-белое изображение, которое затем передается функции поиска контуров findContours() в openCV. Массив контуров, возвращенный из findContours(), передается в функцию procPolyDP() для извлечения полигонов. Каждый возвращенный многоугольник проверяется на количество сторон. При отсутствии паразитных отражений на черно-белом изображении детектируются пятиугольник, треугольник и 4 прямоугольника. 

 Через центр тяжести треугольника и середину наименьшей стороны треугольника проведена линия. Эта линия считается осью автомобиля. Линия, соединяющая центр тяжести автомобильного треугольника и целевого пятиугольника, рассматривается как линия пути. Для каждого изображения рассчитывается угол между линией пути и осью автомобиля и выдается команда поворота, если угол больше 5 градусов. Команда перемещения вперед выдается, если расстояние между двумя центроидами превышает пороговое значение. Проверка расстояния и угла выполняется для каждого изображения, и процесс повторяется до тех пор, пока и расстояние, и угол не станут меньше порогового значения, после чего считается, что автомобиль достиг цели. Четыре ограничивающих прямоугольника используются для проверки того, находится ли автомобиль в пределах матово-черной области.

 Скачать исходный код

Заключение

 Вся установка была проверена несколько раз путем перемещения целевого маркера в разные места в ограничивающих прямоугольниках и проверки того, достиг ли автомобиль цели. Уход достиг цели в пределах установленного порогового значения в большинстве случаев. Несмотря на использование матового черного фона с контролируемым постоянным освещением, были ложные отражения, которые код недостаточно надежен для учета. Поскольку код Python выполняется на ноутбуке, его можно расширить и сделать более надежным, чтобы он учитывал ложные отражения при определении местоположения цели и текущего местоположения автомобиля. Обычные препятствия в форме многоугольника также могут быть размещены на пути автомобиля, а модуль python может быть улучшен для планирования пути, который позволяет избежать этих препятствий. Аппаратное обеспечение автомобиля можно улучшить, чтобы иметь возможность двигаться назад, используя соответствующий драйвер двигателя постоянного тока. Исходные файлы кода Arduino для передатчика и приемника, а также модульный код Python для обработки изображений и навигации предоставляются вместе с этой статьей, чтобы их можно было улучшить. Видео, демонстрирующее работу автомобиля при ручном управлении, размещено в следующем ролике.

 Видео по работе автомобиля под управлением программы python размещено ниже: