Skip to content

Simple line follower robot with ROS (Raspberry Pi + Arduino + WebCam)

Notifications You must be signed in to change notification settings

RomeoMe5/ROS-Line-Follower

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ROSLineFollower

Описание

Ниже описан простой робот для следования по линии с использованием камеры под управлением мета-операционной системы ROS [1]. Робот управляется одноплатном компьютером Raspberry Pi 3. Для управления моторами используется плата Arduino Uno и драйвер мотора L298. Для следовании вдоль черной линии используется пропорциональный регулятор [2].

Аппаратная часть

Подготовка

Для реализации данного проекта требуются следующие компоненты:

  • Одноплатный компьютер Raspberry Pi 3 B+; rasp

  • Плата с микроконтроллером Arduino Uno; ard

  • Веб-камера, подключаемая по USB; cam

  • Электромотор с редуктором и колесом (2 шт); mot

  • Модуль драйвера для 2х электромоторов (L298); hb

  • Карта памяти 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 порт на ПК).

Сборка

Сборка электронных компонентов производится по схеме ниже: sch Перед соединением всех компонентов следует установить все на плтформу. Камера должна быть установлена на высоте 10 - 15 см над уровнем пола, вынесена вперед и направлена почти перпендикулярно полу. Камера должна быть установлена таким образом, чтобы мог быть изменен угол между камерой и полом. Пример установки камеры и других компонентов представлен на рисунках ниже:

res1 res2 res3 res4

Программная часть

Подготовка

Необходимое программное обеспеченье:

  • Операционная система Windows 10 или MacOS 10.14 и выше. Возможно использование ОС Linux;
  • ПО для записи образов диска (Win32 Disk Imager/Etcher/аналогичное);
  • SSH клиент (При использовании ОС Windows -- Putty, MacOS имеет встроенный SSH клиент);
  • Образ ОС Raspbian с установленным ROS и OpenCV. Подробнее об образе написано в [3];
  • Утилита nmap;
  • Arduino IDE.

Установка

Подготовка Raspberry Pi

Так как процесс установки 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, и действуя согласно скриншотам ниже.

ser1 ser2 ser3 ser4

Создайте в домашнем каталоге 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

Загрузите на ваш ПК содержимое репозитория и запустите 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 и перезапускать его. Подробнее этот вопрос будет разобран в принципах работы.

Демонстрация результатов

Ниже приведен пример запуска робота

res

Описание принципа работы

Общее описание

В процессе работы циклически повторяются следующие этапы:

  1. Снятие показаний с камеры;
  2. Определение отклонения центра линии от центра кадра;
  3. Отправка отклонения в пропорциональный регулятор;
  4. Расчет управляющих импульсов для двух моторов;
  5. Отправка управляющих импульсов на Arduino через serial интерфейс;
  6. Отправка управляющих импульсов на дравер моторов.

За выполнение этих этапов отвечают узлы ROS и прошивка Arduino. Этапы 1-3 выполняет модуль camera.py. Этап 4 выполняет модуль control.py. Этап 5 выполняет модуль motors.py. Этап 6 выполняет прошика Arduino. Модули, работающие на Raspberry, используют инструмент обмена данными Topics-Massages ROS [11]. Данные о требуемой скорости моторов передаются чере serial порт в Arduino. Для корректного приема перед каждым новым сообщением помещается число 256, при появлении которого Arduino готов обновлять значения скоростей мотора. Структурная схема представлена на риунке ниже: struct

Определение центра линии

Определение линии производится с помощью библиотеки OpenCV. Изображение снимается с камеры и его размер уменьшается для дальнейшей обработки. После уменьшения цветовая палитра изображения преобразуется в палитру серого и накладывается фильтр Гаусса [12]. Производится наложение маски, для разделения всех пикселей на 2 категории: черную и белую (после чего цвета инвертируются для дальнейшего нахождения центра). Для белой категории производится поиск контура, а для самого большого контура находятся центральные моменты. С их помощью расчитывается положение центра линии [13]. Этот метод был подробнее описан в [14].

Пропорциональный регулятор

Пропорциональный регулятор -- алгоритм управления с отрицательной обратной связью. П-регулятор является составной частью более распространенного ПИД-регулятора [2]. Выходной сигнал регулятора пропорционален входному. В случае двуколесного робота, следующего вдоль линии, входным сигналом является отклоение центра линии X(t) на изображении с камеры от центра кадра X*. Данное отклоение умножается на коэффициент пропорциональности Kp, результат умножения применяется в качестве управляющего воздействия на моторы. При нулевом управляющем воздействии оба мотора должны двигаться с постоянной скоростью, таким образом на оба мотора по умолчанию отправляется некторая скорость S. При отклонении линии в одну сторону скорость первого мотора должна увеличиваться, а другого уменьшаться, при отклонении линии в другую сторону происходит обратное. Таким образом, управляющее воздействие в одном случае должно иметь положительное значение, а в другом - отрицательное и скорость первого мотора должна формироваться, как сумма базовой скорости и кправляющего воздействия, а в другом -- как разность. Диаграмма, описывающая работу регулятора представлена на рисунке ниже:
p

Полезные ссылки

  1. Курс обучающих статей о ROS
  2. Статья посвященная ПИД-регулятору
  3. Готовый образ системы для Raspberry Pi
  4. Инструкция, как узнать ip-адрес Raspberry
  5. Инструкция по настройке локалей
  6. Инструкция по разадче интернета через кабель в Windows 10
  7. Инструкция по разадче интернета через кабель в MacOS
  8. Инструкция по настройке точки доступа на raspberry
  9. Инструкция, посвященная созданию пакетов ROS
  10. Инструкция, посвященная созданию нестандартных сообщений ROS
  11. Статья, посвященная обмену информацией между узлами ROS
  12. Разматие Гаусса
  13. Моменты изображения
  14. Статья, посвященная определению центра линии на изображении

Releases

No releases published

Packages

No packages published