Оглавление:

Rpibot - Об обучении робототехнике: 9 шагов
Rpibot - Об обучении робототехнике: 9 шагов

Видео: Rpibot - Об обучении робототехнике: 9 шагов

Видео: Rpibot - Об обучении робототехнике: 9 шагов
Видео: Робототехника 2.0: объединение искусственного интеллекта и RPA 2024, Июль
Anonim
Rpibot - Об обучении робототехнике
Rpibot - Об обучении робототехнике

Я инженер встраиваемого программного обеспечения в немецкой автомобильной компании. Я начал этот проект как обучающую платформу для встраиваемых систем. Проект был досрочно отменен, но мне он так понравился, что я продолжил в свободное время. Это результат …

У меня были следующие требования:

  • Простое оборудование (основное внимание уделяется программному обеспечению)
  • Дешевое оборудование (около 100 €)
  • Расширяемый (некоторые параметры уже включены в описание)
  • Напряжение питания для всех компонентов от одного источника 5В (powerbank)

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

Это не учебник для начинающих. Вам потребуются базовые знания о:

  • Программирование (Python)
  • Базовая электроника (для соединения модулей под нужным напряжением)
  • Базовая теория управления (ПИД)

В конце концов, вы, вероятно, столкнетесь с проблемами, как и я. Проявив немного любопытства и выдержки, вы пройдете проект и решите задачи. Мой код максимально прост, а важные строки кода прокомментированы, чтобы давать подсказки.

Полный исходный код и файлы доступны здесь:

Запасы:

Механика

  • 1x фанерная доска (размер А4, толщина 4 мм)
  • 3x M4 x 80 Винт и гайка
  • 2x мотор-редуктора с вторичным выходным валом для энкодера. Колеса.
  • 1x свободное колесо

1x Крепление для камеры с панорамированием и наклоном (опционально)

Электроника

  • 1x Raspberry Pi Zero с заголовком и камерой
  • 1x сервоуправление PCA 9685
  • 2x колесо оптического кодировщика и схема
  • 1x женские перемычки
  • 1x USB внешний аккумулятор
  • 1x драйвер двойного двигателя DRV8833
  • 2x Micro сервопривода SG90 для панорамирования и наклона камеры (опционально)
  • 1x MPU9250 IMU (опционально)
  • 1x ультразвуковой датчик расстояния HC-SR04 (опция)
  • 1x перфорированная плата и паяльная проволока, разъемы,…

Шаг 1. Соберите корпус

Постройте шасси
Постройте шасси
Постройте шасси
Постройте шасси
Постройте шасси
Постройте шасси

Я плохой конструктор по механике. Также цель проекта - не проводить слишком много времени в шасси. В любом случае я определил следующие требования:

  • Дешевые материалы
  • Быстрая сборка и разборка
  • Возможность расширения (например, место для дополнительных датчиков)
  • Легкие материалы для экономии энергии для электроники

Легкое и дешевое шасси можно сделать из фанеры. Легко обрабатывается лобзиком и ручной дрелью. Вы можете склеить небольшие деревянные детали, чтобы создать держатели для датчиков и двигателей.

Подумайте о замене неисправных компонентов или об электрической отладке. Основные части следует закрепить винтами, чтобы их можно было заменить. Пистолет для горячего клея может быть простым, но, вероятно, не лучшим способом построить шасси… Мне потребовалось много времени, чтобы подумать о простой концепции, позволяющей легко разбирать детали. 3D-печать - хорошая альтернатива, но она может быть довольно дорогой или трудоемкой.

Свободное колесо, наконец, стало очень легким и простым в установке. Все альтернативы были тяжелыми или полными трения (я попробовал пару из них, прежде чем нашел последний). Мне нужно было только вырезать деревянную распорку, чтобы выровнять хвостовое свободное колесо после установки основных колес.

Свойства колеса (для программных расчетов)

Окружность: 21,5 см Импульсы: 20 импульсов / оборот Разрешение: 1075 см (в конечном итоге 1 импульс составляет около 1 см, что легко для программных расчетов)

Шаг 2: Электроника и проводка

Электроника и проводка
Электроника и проводка
Электроника и проводка
Электроника и проводка
Электроника и проводка
Электроника и проводка

В проекте используются разные модули, как показано на схеме.

Raspberry Pi Zero - это главный контроллер. Он считывает показания датчиков и управляет двигателями с помощью сигнала ШИМ. Он подключен к удаленному ПК по Wi-Fi.

DRV8833 - двухмоторный H-мост. Он обеспечивает достаточный ток для двигателей (чего Raspberry Pi не может, поскольку выходы могут выдавать только несколько мА).

Оптический кодировщик выдает сигнал квадратной формы каждый раз, когда свет проходит через колеса кодировщика. Мы будем использовать аппаратные прерывания Raspberry Pi для получения информации каждый раз, когда сигнал переключается.

PCA9695 - это плата сервоуправления. Он обменивается данными по последовательной шине I2C. Эта плата обеспечивает сигналы ШИМ и напряжение питания, которые управляют сервоприводами панорамирования и наклона кулачка.

MPU9265 - это 3-осевой датчик ускорения, 3-осевой угловой скорости вращения и 3-осевой датчик магнитного потока. Мы будем использовать его в основном для определения направления по компасу.

Все модули соединены друг с другом перемычкой. Макетная плата действует как диспетчер и обеспечивает напряжения питания (5 В и 3,3 В) и заземления. Все подключения описаны в таблице подключений (см. Приложение). Подключение 5 В к входу 3,3 В, вероятно, приведет к выходу из строя вашего чипа. Будьте осторожны и дважды проверьте всю вашу проводку перед подачей питания (здесь особенно следует учитывать энкодер). Перед подключением всех плат следует измерить основные напряжения питания на плате диспетчеризации с помощью мультиметра. Модули крепились к шасси нейлоновыми винтами. Также здесь я был счастлив, что их починили, но также можно было снять в случае неисправности.

Единственная пайка была, наконец, двигателями, макетной платой и разъемами. Если честно, мне нравятся перемычки, но они могут привести к потере связи. В некоторых ситуациях некоторые программные средства мониторинга могут помочь вам в анализе подключений.

Шаг 3. Программная инфраструктура

Программная инфраструктура
Программная инфраструктура
Программная инфраструктура
Программная инфраструктура

После достижения механики мы создадим некоторую программную инфраструктуру для комфортных условий разработки.

Git

Это бесплатная система контроля версий с открытым исходным кодом. Он используется для управления большими проектами как Linux, но также может быть легко использован для небольших проектов (см. Github и Bitbucket).

Изменения в проекте можно отслеживать локально, а также отправлять на удаленный сервер для совместного использования программного обеспечения с сообществом.

Основные используемые команды:

git clone https://github.com/makerobotics/RPIbot.git [Получите исходный код и конфигурацию git]

git pull origin master [получить последнюю информацию из удаленного репозитория]

git status [получить статус локального репозитория. Были ли изменены какие-либо файлы?] Git log [получить список коммитов] git add. [добавить все измененные файлы на сцену для рассмотрения при следующей фиксации] git commit -m "комментарий для фиксации" [зафиксировать изменения в локальном репозитории] git push origin master [отправить все коммиты в удаленный репозиторий]

логирование

Python предоставляет некоторые встроенные функции ведения журнала. Структура программного обеспечения должна уже определять всю структуру ведения журналов, прежде чем начинать дальнейшую разработку.

Регистратор может быть настроен для ведения журнала в определенном формате в терминале или в файле журнала. В нашем примере регистратор настраивается классом веб-сервера, но мы также можем сделать это самостоятельно. Здесь мы устанавливаем только уровень ведения журнала DEBUG:

logger = logging.getLogger (_ имя_)

logger.setLevel (ведение журнала. DEBUG)

Измерение и построение графиков

Чтобы анализировать сигналы с течением времени, лучше всего нанести их на график. Поскольку у Raspberry Pi есть только консольный терминал, мы будем отслеживать данные в CSV-файле, разделенном точкой с запятой, и строить его с удаленного ПК.

Файл трассировки, разделенный точкой с запятой, создается нашим основным кодом Python и должен иметь такие заголовки:

отметка времени; yawCorr; encoderR; I_L; odoDistance; ax; encoderL; I_R; yaw; eSpeedR; eSpeedL; pwmL; speedL; CycleTimeControl; wz; pwmR; speedR; Iyaw; hdg; m_y; m_x; eYaw; cycleTimeSense;

1603466959.65;0;0;25;0.0;-0.02685546875;0;25;0;25;25;52;0.0;23;0.221252441406;16;0.0;0;252.069366413;-5.19555664062;-16.0563964844;0;6; 1603466959.71;0;0;50;0.0;0.29150390625;0;50;0;25;25;55;0.0;57;-8.53729248047;53;0.0;0;253.562118111;-5.04602050781;-17.1031494141;0;6; 1603466959.76;0;-1;75;0.0;-0.188232421875;1;75;2;25;25;57;0;52;-24.1851806641;55;0;0;251.433794171;-5.64416503906;-16.8040771484;2;7;

Первый столбец содержит метку времени. Следующие столбцы бесплатны. Сценарий построения вызывается со списком столбцов для построения графика:

удаленный @ pc: ~ / python rpibot_plotter -f trace.csv -p speedL, speedR, pwmL, pwmR

Сценарий сюжета доступен в папке с инструментами:

Плоттер использует mathplotlib в Python. Вы должны скопировать его на свой компьютер.

Для большего удобства сценарий python вызывается сценарием bash (plot.sh), который используется для копирования файла трассировки Raspberry Pi на удаленный компьютер и вызова плоттера с выбором сигнала. Сценарий bash "plot.sh" запрашивает если файл нужно скопировать. Для меня это было удобнее, чем копировать каждый раз вручную. «sshpass» используется для копирования файла с Raspberry Pi на удаленный компьютер через scp. Он может копировать файл без запроса пароля (он передается в качестве параметра).

Наконец открывается окно с графиком, как показано на рисунке.

Удаленное общение

Интерфейс разработки для Raspberry Pi - SSH. Файлы можно редактировать прямо на цели или копировать с помощью scp.

Для управления роботом на Pi работает веб-сервер, обеспечивающий управление через веб-сокеты. Этот интерфейс описан в следующем шаге.

Настройте Raspberry Pi

Файл с описанием настройки Raspberry Pi находится в папке «doc» исходного кода (setup_rpi.txt). Здесь не так много объяснений, но много полезных команд и ссылок.

Шаг 4: Пользовательский интерфейс

Пользовательский интерфейс
Пользовательский интерфейс

Мы используем легкий веб-сервер Tornado для размещения пользовательского интерфейса. Это модуль Python, который мы вызываем при запуске программного обеспечения для управления роботом.

Архитектура программного обеспечения

Пользовательский интерфейс состоит из следующих файлов: gui.html [Описание элементов управления и макета веб-страницы] gui.js [Содержит код javascript для обработки элементов управления и открытия подключения к нашему роботу через веб-сокет] gui.css [Содержит стили элементы управления html. Положение органов управления определяется здесь]

Связь через веб-сокет

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

Веб-сайт связывается с веб-сервером робота через Websockets. Это двунаправленный канал связи, который будет оставаться открытым после установления соединения. Мы отправляем команды робота через Websocket на Raspberry Pi и получаем информацию (скорость, положение, поток камеры) обратно для отображения.

Внешний вид интерфейса

Пользовательский интерфейс имеет ручной ввод команд. Это использовалось в начале для отправки команд роботу. Флажок включает и выключает поток камеры. Два ползунка управляют панорамированием и наклоном камеры. Правая верхняя часть пользовательского интерфейса управляет движением робота. Вы можете контролировать скорость и расстояние до цели. Основная телеметрическая информация отображается на чертеже робота.

Шаг 5: Программирование платформы роботов

Программирование платформы роботов
Программирование платформы роботов
Программирование платформы роботов
Программирование платформы роботов
Программирование платформы роботов
Программирование платформы роботов

Эта часть была основной целью проекта. Я реорганизовал большую часть программного обеспечения, когда представил новое шасси с двигателями постоянного тока. Я использовал Python в качестве языка программирования по разным причинам:

  • Это основной язык Raspberry Pi.
  • Это язык высокого уровня со множеством встроенных функций и расширений.
  • Он объектно-ориентированный, но также может использоваться для последовательного программирования.
  • Не требуется ни компиляции, ни цепочки инструментов. Отредактируйте код и запустите его.

Основная программная архитектура

Программное обеспечение объектно-ориентированное, разделено на несколько объектов. Моя идея заключалась в том, чтобы разделить код на 3 функциональных блока:

Смысл, думать, действовать

Sense.py

Сбор и обработка основного датчика. Данные сохраняются в словаре для использования на следующем этапе.

Control.py

Подкласс срабатывания управляет двигателями и сервоприводами после некоторой абстракции. Главный объект Control обрабатывает команды высокого уровня, а также алгоритмы управления (PID) для двигателя.

rpibot.py

Этот основной объект управляет веб-сервером Tornado и создает экземпляры классов управления и контроля в отдельных потоках.

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

ПИД-регулирование

Первая задача - выяснить, что мы хотим контролировать. Я начал с попытки контролировать позицию, что было очень сложно и мало помогало.

Наконец, мы хотим контролировать скорость каждого колеса, а также направление робота. Для этого мы должны каскадировать две управляющие логики.

Для пошагового увеличения сложности роботом нужно управлять:

разомкнутый контур (с постоянной мощностью)

pwm = K

затем добавьте алгоритм замкнутого цикла

pwm = Kp.speedError + Ki. Integration (speedError)

и, наконец, добавьте управление направлением в качестве последнего шага.

Для управления скоростью я использовал «PI» контроль и «P» только для рыскания. Я вручную выставил параметры, экспериментируя. Вероятно, здесь можно было бы использовать гораздо лучшие параметры. Моей целью была прямая линия, и я почти ее достал. Я создал интерфейс в программном обеспечении для записи некоторых переменных через пользовательский интерфейс. Для установки параметра Kp равным 1.0 требуется следующая команда в пользовательском интерфейсе:

НАБОР; Kp; 1.0

Я мог бы установить параметр P достаточно низким, чтобы избежать перерегулирования. Оставшаяся ошибка корректируется параметром I (интегрированная ошибка).

Мне было сложно понять, как каскадировать оба элемента управления. Решение простое, но я пробовал много других способов раньше … Итак, наконец, я изменил целевую скорость колес, чтобы они поворачивались в том или ином направлении. Непосредственное изменение выходного сигнала регулятора скорости было ошибкой, поскольку регулятор скорости пытался устранить это возмущение.

Используемая схема управления прилагается. Он показывает только левую часть управления роботом.

Шаг 6: калибровка сенсора

Калибровка сенсора
Калибровка сенсора
Калибровка сенсора
Калибровка сенсора
Калибровка сенсора
Калибровка сенсора

Первое, что нужно учесть, это то, что весь IMU должен работать должным образом. Я заказал 3 детали и отправил их обратно, пока у меня не был полностью рабочий датчик. У каждого предыдущего датчика были некоторые части датчика, которые не работали должным образом или не работали вообще. Я использовал несколько примеров сценариев, чтобы проверить основы перед установкой его в робота.

Перед использованием необходимо откалибровать сигналы датчика IMU. Некоторые сигналы датчиков зависят от угла установки и положения.

Калибровка ускорения и скорости вращения

Самая простая калибровка - для продольного ускорения (A_x). В состоянии покоя должно быть около 0 м / с². Если повернуть датчик правильно, можно измерить силу тяжести (около 9,8 м / с²). Чтобы откалибровать a_x, вам просто нужно правильно установить его, а затем определить смещение, чтобы получить 0 м / с² в состоянии покоя. Теперь A_x откалиброван. Вы можете получить смещения для скоростей вращения аналогичным образом в состоянии покоя.

Калибровка магнитометра для компаса

Для датчиков магнитного поля необходима более сложная калибровка. Мы будем использовать m_x и m_y, чтобы получить магнитное поле на горизонтальном уровне. Наличие m_x и m_y даст нам возможность рассчитать направление по компасу.

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

Мы записываем m_x и m_y, пока мы поворачиваем робота вокруг оси z. Мы строим m_x vs m_y на графике XY. Результат в виде многоточия, как показано на картинке. Многоточие должно быть отцентрировано относительно начала координат. Здесь мы рассматриваем максимальное и минимальное значения m_x и m_y, чтобы получить смещения в обоих направлениях. Наконец, мы проверяем калибровку и видим, что многоточие теперь находится в центре.

Калибровка мягкого железа будет означать, что мы изменим картинку с многоточия на круг. Это можно сделать, добавив коэффициент к каждому значению сеньора.

Теперь можно закодировать процедуру тестирования для повторной калибровки или, по крайней мере, для проверки того, что датчики все еще откалиброваны.

Курс компаса

Данные магнитометра теперь будут использоваться для расчета направления по компасу. Для этого мы должны преобразовать сигналы m_x и m_y в угол. Python напрямую предоставляет функцию math.atan2, которая имеет эту цель. Полный расчет определяется в файле mpu9250_i2c.py ("calcHeading (mx, my, mz)").

Шаг 7: альтернативные варианты дизайна

Альтернативные дизайны
Альтернативные дизайны
Альтернативные дизайны
Альтернативные дизайны
Альтернативные дизайны
Альтернативные дизайны

Проект занял много времени, так как дизайн был полностью открытым. Для каждого компонента я сделал несколько прототипов реализации и испытал ограничения системы.

Самой сложной темой был энкодер колеса. Я протестировал 3 разных варианта, прежде чем найти оптический кодировщик, который используется в настоящее время. Я думаю, что прерванные решения тоже очень интересны в таком проекте. Это касается тех частей, где я узнал больше всего.

Сервопривод непрерывного вращения, подключенный к pca 9695

Чтобы избежать дополнительного H-образного моста для двигателя постоянного тока, я сначала начал с сервоприводов с непрерывным вращением. Они управлялись уже существующим сервоприводом pca 9695. Вся механика силовой установки и соответствующая электроника были намного проще. У этой конструкции было два недостатка:

  • Плохой диапазон управления сервоприводами.
  • Отсутствующее место удержания кодировщика

Сервоприводы начинают двигаться с 50% ШИМ и имеют полную скорость около 55%. Это очень плохой диапазон регулирования.

Без держателя кодировщика было очень сложно найти готовый к работе кодировщик. Я протестировал 3 разных энкодера отражения, которые были установлены на шасси. Я приклеил самодельное колесо кодировщика на внешней стороне колеса с черными и белыми участками. Я использовал датчики QTR-1RC, которые требуют большой обработки сигнала, чтобы получить правильный сигнал. Raspberry Pi не мог выполнять такую обработку в реальном времени. Поэтому я решил добавить к роботу NodeMCU D1 mini в качестве контроллера реального времени. Он был подключен к Raspberry Pi через последовательный UART для доставки обработанных данных датчика. NodeMCU также управлял датчиком HC-SR04. Механика была сложной и не очень надежной, последовательная линия получала шум от линии I2C и двигателей, поэтому, наконец, я построил вторую версию шасси с простыми шестеренчатыми двигателями постоянного тока, управляемыми H-образный мост. Эти двигатели имеют вторичный выходной вал для размещения оптического энкодера.

Шаг 8: обработка изображения

Обработка изображений
Обработка изображений
Обработка изображений
Обработка изображений
Обработка изображений
Обработка изображений
Обработка изображений
Обработка изображений

Чтобы улучшить автономное вождение, мы можем произвести некоторую обработку изображений.

Библиотека opencv является для этого справочником. Python может использовать его для быстрого обнаружения препятствий.

Захватываем изображение и применяем некоторые задачи обработки изображения:

Первые испытания были проведены с преобразованиями Кэнни и Собеля. Хитрый может быть хорошим кандидатом, но этого недостаточно. Собел слишком рассудителен (обнаружено слишком много объектов).

Наконец, я сделал свой собственный фильтр для смешивания всех горизонтальных и вертикальных градиентов (обнаружение мебели):

  • Преобразование цветного изображения в изображение с уровнем серого
  • Размытие изображения, чтобы удалить небольшой шум
  • Порог изображения до черно-белого изображения
  • Теперь мы обнаруживаем горизонтальные и вертикальные градиенты, чтобы обнаруживать такие объекты, как стены и мебель.
  • Фильтруем только большие оставшиеся контуры (см. Цветные контуры на картинке)

Теперь мы можем использовать эту новую информацию для обнаружения препятствий…

Шаг 9. Дальнейшие действия…

Следующие шаги…
Следующие шаги…
Следующие шаги…
Следующие шаги…

Теперь у нас есть простая роботизированная платформа с датчиками, исполнительными механизмами и камерой. Моя цель - двигаться автономно и вернуться на станцию без дополнительных датчиков. Для этого мне понадобятся следующие шаги:

  • Сочетание датчиков рысканья и сигналов магнитного курса
  • Обработка изображений камеры (для этого доступен только низкий процессор)
  • Обнаружение столкновений (ультразвуковое расстояние и камера)
  • Построение карты или ориентация

А теперь иди и создай свои собственные задачи или цели …

Рекомендуемые: