Giter VIP home page Giter VIP logo

ros-line-follower's Introduction

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. Статья, посвященная определению центра линии на изображении

ros-line-follower's People

Contributors

haiot4105 avatar

Stargazers

 avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.