Ниже описан простой робот для следования по линии с использованием камеры под управлением мета-операционной системы ROS [1]. Робот управляется одноплатном компьютером Raspberry Pi 3. Для управления моторами используется плата Arduino Uno и драйвер мотора L298. Для следовании вдоль черной линии используется пропорциональный регулятор [2].
Для реализации данного проекта требуются следующие компоненты:
-
Карта памяти MicroSD 16 Гб или больше;
-
Кабель USB Type A -- USB Type B для соеденения Arduino и Raspberry Pi;
-
Батарейный отсек на 4 элемента АА;
-
Электрический аккумулятор с возможностью подключения устройств по USB с рабочим напряжением 5 В и током до 2А (подойдут многие современные повербанки)
-
Провод для подключения питания для Raspberry (например USB Type A -- Micro USB Type B);
-
Провода для макетных плат для подключения Arduino к драйверу моторов;
-
Платформа для установки компонентов;
-
Провод Ethernet для подключения Raspberry к вашему ПК (необходим Ethernet порт на ПК).
Сборка электронных компонентов производится по схеме ниже: Перед соединением всех компонентов следует установить все на плтформу. Камера должна быть установлена на высоте 10 - 15 см над уровнем пола, вынесена вперед и направлена почти перпендикулярно полу. Камера должна быть установлена таким образом, чтобы мог быть изменен угол между камерой и полом. Пример установки камеры и других компонентов представлен на рисунках ниже:
Необходимое программное обеспеченье:
- Операционная система Windows 10 или MacOS 10.14 и выше. Возможно использование ОС Linux;
- ПО для записи образов диска (Win32 Disk Imager/Etcher/аналогичное);
- SSH клиент (При использовании ОС Windows -- Putty, MacOS имеет встроенный SSH клиент);
- Образ ОС Raspbian с установленным ROS и OpenCV. Подробнее об образе написано в [3];
- Утилита nmap;
- Arduino IDE.
Так как процесс установки ROS и OpenCV на чистый образ Raspbian включает множество процедур, в том числе сборку отдельных зависимостей из исходных программных кодов, вместо этого используется готовый образ операционной системы с заранее установленными необходимыми программными пакетами [3]. Используя Win32 Disk Imager или Etcher
запишите образ системы на MicroSD карту. Установите карту в Raspberry Pi, подключите питание и подключите raspberry к ПК используя ethernet-кабель. Для подключения по SSH необходимо определить IP-адресс платы, это возможно сделать с использованием утилиты nmap согласно инструкции: [4]. Подключение производится с использованием клинта SSH.
Логин: pi
Пароль: rosbots!
При использовании клиента в командной строке подключение производится следующей командой (где raspberry_ip -- ip-адрес платы):
ssh pi@*raspberry_ip*
После чего потребуется ввести пароль. При возникновении ошибок с локалью воспользуйтесь следующей инструкцией: [5].
Настройте доступ rasberry к интрнету через ethernet (Windows: [6], MacOS [7]) и точку доступа (без доступа к интернету) [8]. Включите работу serial порта, запустив команду sudo raspi-config
, и действуя согласно скриншотам ниже.
Создайте в домашнем каталоге raspberry новую директорию с именем line_follower
и перейдите в нее.
mkdir line_follower
cd line_follower
Склонируйте содержимое репозитория в эту директорию и перейдите в новую директорию
git clone *repo_address*/ROSLineFollower.git
Проверьте, что система ROS запущена, используя команду roscore
. Если ROS запущен, то появится соответствующее сообщение. Создайте новый пакет ROS c названием line_follower (Подробнее об этом [9]).
roscreate-pkg line_follower std_msgs rospy
Сообщим ROS о существовании нового пакета. Это необходимо делать при каждом новом подключении к Raspberry по SSH, либо добавить соответствующую команду в файл ~/.bashrc
.
export ROS_PACKAGE_PATH=~/line_follwer:$ROS_PACKAGE_PATH
Проверьте, что новый пакет был добавлен. Заппустите команду rospack profile
. Должны отобразиться все инициализированные в системе пакеты, в том числе line_follower
.
Перейдите в новый каталог и скопируйте все нужные файлы из репозитория. Сделайте файлы python исполняемыми.
cd line_follower
cp -avr ~/ROSLineFollower/nodes ./
cp -avr ~/ROSLineFollower/msg ./
chmod +x nodes/*
Измените CMakeLists.txt таким образом, чтобы были сгенерированы кастомные сообщения для ROS. Откройте текстовый редактор nano и раскоментируйте строку rosbuild_genmsg()
. Подробнее о создании своих сообщений ROS в [10].
nano CMakeLists.txt
Запустим сборку пакета.
rosmake
После этого шага перейдите к настройке Arduino.
Загрузите на ваш ПК содержимое репозитория и запустите Arduino IDE. Подключите Arduino к ПК, откройте папку репозитория arduino и загрузите проект serial_motors
в Arduino IDE. Настройте подключение Arduino к Arduino IDE (меню Инструменты -> Плата и Инструменты -> Порт). Загрузите прошивку на плату. Для проверки работы прошивки подключите моторы к Arduino согласно схеме выше, запустите монитор порта и отправьте команду 256 100 100
. Оба мотора должны будут начать вращаться в одном направлении. После загрузки прошивки подсоедените Arduino к Raspberry с использованием кабеля USB и убедитесь в готовности конструкции (подключение камеры, питания и т.д.)
Отключите Raspberry от ethernet и подключитесь к Wi-f, который раздает плата. Используя ip-адрес, настроенный при создании точки доступа, подключитесь по SSH к плате, создав 3 различных подключения. Проверьте что ваш пакет ROS настроен, запустив команду rospack profile
. Если пакет не отображается в списке, то запустите команду и проверьте снова.
export ROS_PACKAGE_PATH=~/line_follwer:$ROS_PACKAGE_PATH
Повторите этот пункт во всех сессиях подключения к плате. Запустите следующие команды в 3х различных сессиях подключения (каждая команда в своей сессии).
rosrun line_follower camera.py
rosrun line_follower control.py
rosrun line_follower motor.py
В каждой сессии должны начать появляться переодические сообщения. Моторы робота должны начать вращаться. Если поставить робота на линию, то он долже начать следовать вдоль нее. В случае, если робот следует вдоль линии, но делает это нестабильно, то необходимо менять значение переменной kp в файле nodes/control.py и перезапускать его. Подробнее этот вопрос будет разобран в принципах работы.
Ниже приведен пример запуска робота
В процессе работы циклически повторяются следующие этапы:
- Снятие показаний с камеры;
- Определение отклонения центра линии от центра кадра;
- Отправка отклонения в пропорциональный регулятор;
- Расчет управляющих импульсов для двух моторов;
- Отправка управляющих импульсов на Arduino через serial интерфейс;
- Отправка управляющих импульсов на дравер моторов.
За выполнение этих этапов отвечают узлы ROS и прошивка Arduino. Этапы 1-3 выполняет модуль camera.py. Этап 4 выполняет модуль control.py. Этап 5 выполняет модуль motors.py. Этап 6 выполняет прошика Arduino. Модули, работающие на Raspberry, используют инструмент обмена данными Topics-Massages ROS [11]. Данные о требуемой скорости моторов передаются чере serial порт в Arduino. Для корректного приема перед каждым новым сообщением помещается число 256, при появлении которого Arduino готов обновлять значения скоростей мотора. Структурная схема представлена на риунке ниже:
Определение линии производится с помощью библиотеки OpenCV. Изображение снимается с камеры и его размер уменьшается для дальнейшей обработки. После уменьшения цветовая палитра изображения преобразуется в палитру серого и накладывается фильтр Гаусса [12]. Производится наложение маски, для разделения всех пикселей на 2 категории: черную и белую (после чего цвета инвертируются для дальнейшего нахождения центра). Для белой категории производится поиск контура, а для самого большого контура находятся центральные моменты. С их помощью расчитывается положение центра линии [13]. Этот метод был подробнее описан в [14].
Пропорциональный регулятор -- алгоритм управления с отрицательной обратной связью. П-регулятор является составной частью более распространенного ПИД-регулятора [2]. Выходной сигнал регулятора пропорционален входному. В случае двуколесного робота, следующего вдоль линии, входным сигналом является отклоение центра линии X(t) на изображении с камеры от центра кадра X*. Данное отклоение умножается на коэффициент пропорциональности Kp, результат умножения применяется в качестве управляющего воздействия на моторы. При нулевом управляющем воздействии оба мотора должны двигаться с постоянной скоростью, таким образом на оба мотора по умолчанию отправляется некторая скорость S. При отклонении линии в одну сторону скорость первого мотора должна увеличиваться, а другого уменьшаться, при отклонении линии в другую сторону происходит обратное. Таким образом, управляющее воздействие в одном случае должно иметь положительное значение, а в другом - отрицательное и скорость первого мотора должна формироваться, как сумма базовой скорости и кправляющего воздействия, а в другом -- как разность. Диаграмма, описывающая работу регулятора представлена на рисунке ниже:
- Курс обучающих статей о ROS
- Статья посвященная ПИД-регулятору
- Готовый образ системы для Raspberry Pi
- Инструкция, как узнать ip-адрес Raspberry
- Инструкция по настройке локалей
- Инструкция по разадче интернета через кабель в Windows 10
- Инструкция по разадче интернета через кабель в MacOS
- Инструкция по настройке точки доступа на raspberry
- Инструкция, посвященная созданию пакетов ROS
- Инструкция, посвященная созданию нестандартных сообщений ROS
- Статья, посвященная обмену информацией между узлами ROS
- Разматие Гаусса
- Моменты изображения
- Статья, посвященная определению центра линии на изображении