Оглавление:

Автономный робот Уоллеса - Часть 4 - Добавление ИК-датчиков расстояния и «усилителя»: 6 шагов
Автономный робот Уоллеса - Часть 4 - Добавление ИК-датчиков расстояния и «усилителя»: 6 шагов

Видео: Автономный робот Уоллеса - Часть 4 - Добавление ИК-датчиков расстояния и «усилителя»: 6 шагов

Видео: Автономный робот Уоллеса - Часть 4 - Добавление ИК-датчиков расстояния и «усилителя»: 6 шагов
Видео: Copterhack2019. Лекция 4 - Автономное управление Клевер 4. 2024, Июль
Anonim
Image
Image
Добавить вспомогательную схему (MCP3008)
Добавить вспомогательную схему (MCP3008)

Здравствуйте, сегодня мы начинаем следующий этап улучшения возможностей Уоллеса. В частности, мы пытаемся улучшить его способность обнаруживать и избегать препятствий с помощью инфракрасных датчиков расстояния, а также воспользоваться способностью контроллера мотора Roboclaw отслеживать ток и превращать его в виртуальный (программный) «датчик». Наконец, мы рассмотрим, как перемещаться без SLAM (одновременное определение местоположения и отображение) (пока), поскольку у робота еще нет датчиков IMU (единицы измерения инерции) или ToF (времени полета).

По навигации изначально будет как раз две основные цели:

  1. избегать препятствий
  2. распознавать, когда он где-то застрял и не продвигается. («прогресс» означает, продвинулся ли он на сколько-нибудь значимое расстояние)
  3. Возможная третья цель может заключаться в том, чтобы попытаться выровняться под прямым углом к стене.

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

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

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

Хотя он хорошо себя чувствует на кухне и в коридоре с хорошими твердыми плоскими поверхностями, он полностью слеп при приближении к столовой. Он не может «видеть» ножки стола и стула.

Одним из улучшений может быть отслеживание типичных моторных токов, и если значения скачкообразны, значит, робот во что-то задел. Это хороший «план Б» или даже С. Но он не очень помогает ориентироваться в обеденной зоне.

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

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

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

В дополнение к датчикам, в игру вступил датчик тока, особенно при движении задним ходом, на случай, если он что-то натолкнется.

Наконец, он использует историю последних 100 ходов и некоторый базовый анализ, чтобы ответить на один вопрос:

«Был ли в последнее время реальный прогресс (или он застрял в каком-то повторяющемся танце)?»

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

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

Шаг 1. Добавьте вспомогательную схему (MCP3008)

Добавить вспомогательную схему (MCP3008)
Добавить вспомогательную схему (MCP3008)
Добавить вспомогательную схему (MCP3008)
Добавить вспомогательную схему (MCP3008)
Добавить вспомогательную схему (MCP3008)
Добавить вспомогательную схему (MCP3008)

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

Мы добавим аналого-цифровой преобразователь MCP3008. Есть много онлайн-ресурсов, как подключить этот чип к Raspberry Pi, поэтому я не буду вдаваться в подробности здесь.

По сути, у нас есть выбор. Если версия ИК-датчиков работает при напряжении 3 В, то может и MCP3008, и тогда мы сможем напрямую подключиться к Raspberry.

[ИК-датчик 3 В] - [MCP3008] - [Raspberrry Pi]

В моем случае, однако, я использую в основном 5 В, так что это означает двунаправленный переключатель уровня.

[ИК-датчик 5 В] - [MCP3008] - [Двунаправленная шина от 5 В до 3 В] - [Raspberry Pi]

Примечание. ИК-датчик выводит только один сигнал. Он идет непосредственно на одну из линий входного аналогового сигнала MCP3008. От MCP3008 есть 4 линии данных, которые нам нужно подключить (через двунаправленную шину) к Raspberry Pi.

На данный момент наш робот будет работать, используя всего два ИК-датчика, но мы могли бы легко добавить больше. В MCP3008 восемь аналоговых входных каналов.

Шаг 2: Установите ИК-датчики

Крепление ИК-датчиков
Крепление ИК-датчиков
Крепление ИК-датчиков
Крепление ИК-датчиков
Крепление ИК-датчиков
Крепление ИК-датчиков
Крепление ИК-датчиков
Крепление ИК-датчиков

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

(Обновление: однако это может не иметь значения, поскольку этот датчик, кажется, сбивает с толку внутренним окружающим освещением. Я все еще изучаю эту проблему)

Есть как минимум три способа установить эти датчики на роботе.

  1. Поместите их в фиксированное положение спереди, слегка повернувшись друг к другу.
  2. Поместите их на сервопривод спереди, слегка повернув их друг от друга.
  3. Поместите их в фиксированное положение, спереди, но в крайнем левом и крайнем правом углах, под углом друг к другу.

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

При выборе №1, чем дальше друг от друга расположены датчики, тем больше слепое пятно в центре.

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

  • Мы будем использовать один из каналов связи PWM на Raspberry Pi. (Это можно улучшить, но все же…)
  • Потребление тока сервоприводом может быть значительным.
  • Он добавляет больше к оборудованию и программному обеспечению

Я бы хотел оставить опцию сервопривода на потом при добавлении более важных датчиков, таких как Time-of-Flight (ToF), или, возможно, камеры.

У варианта №2 есть еще одно возможное преимущество, которого нет у двух других вариантов. Эти ИК-датчики могут сбиться с толку в зависимости от освещения. Может случиться так, что робот считывает объект, который находится в непосредственной близости, хотя на самом деле поблизости нет объекта. При выборе № 3, поскольку их поля могут перекрываться, оба датчика могут регистрировать один и тот же объект (под разными углами).

Итак, мы выбираем вариант размещения №3.

Шаг 3: время для тестирования

Image
Image

После того, как мы установили все соединения между Raspberry Pi, АЦП MCP3008 и ИК-датчиками Sharp, пришло время проверить. Просто простой тест, чтобы убедиться, что система работает с новыми датчиками.

Как и в предыдущих инструкциях, я максимально использую библиотеку wiringPi C. Делает вещи проще. Что не очень очевидно при просмотре веб-сайта wiringPi, так это то, что есть прямая поддержка MCP3004 / 3008.

Даже без этого вы можете просто использовать расширение SPI. Но в этом нет необходимости. Если вы внимательно посмотрите на репозиторий Gordon git для wiringPi, вы встретите список поддерживаемых чипов, один из которых предназначен для MCP3004 / 3008.

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

Шаг 4: Виртуальный датчик - AmpSensor

Чем больше разных способов заставить робот получать информацию о внешнем мире, тем лучше.

В настоящее время робот оснащен восемью датчиками акустического гидролокатора HCSR04 (они не рассматриваются в данном руководстве), и теперь у него есть два датчика расстояния Sharp IR. Как уже говорилось ранее, мы можем воспользоваться кое-чем еще: функцией измерения моторных токов Roboclaw.

Мы можем обернуть этот запрос к контроллеру двигателя в класс C ++ и назвать его AmpSensor.

Добавив в программное обеспечение «умных» средств, мы можем отслеживать и регулировать типичное потребление тока при прямом движении (вперед, назад), а также при вращательных движениях (влево, вправо). Как только мы узнаем эти диапазоны ампер, мы можем выбрать критическое значение, чтобы, если AmpSensor получал текущее показание от контроллера мотора, превышающее это значение, мы знали, что моторы, вероятно, остановились, и это обычно указывает на то, что робот ударился. во что-то.

Если мы добавим некоторую гибкость к программному обеспечению (аргументы командной строки и / или ввод с клавиатуры во время работы), то мы сможем увеличить / уменьшить порог «критического тока» в ходе экспериментов, просто позволив роботу двигаться и наталкиваться на объекты, как прямо, так и во время вращения.

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

Шаг 5: Навигация

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

У него нет двигателей с энкодерами, и у него нет IMU (инерциального измерительного блока), поэтому трудно определить, действительно ли он движется или вращается, и на сколько.

Хотя можно получить какое-то указание расстояния с помощью датчиков, которые в настоящее время находятся на роботе, их поле зрения широкое и непредсказуемое. Акустический сонар может некорректно отражать назад; инфракрасное можно спутать с другим освещением или даже с несколькими отражающими поверхностями. Я не уверен, что действительно стоит пытаться отслеживать изменение расстояния в качестве метода, чтобы узнать, движется ли робот, насколько и в каком направлении.

Я намеренно решил НЕ использовать микроконтроллер, такой как Arduino, потому что а) мне не нравится это псевдо-C ++ среда, б) и что слишком много разработки приведет к изнашиванию памяти чтения-записи (?), И что я потребуется хост-компьютер для разработки (?). Или, может быть, мне просто нравится Raspberry Pi.

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

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

Один из подходов, который мы можем использовать, - это отслеживать, какие команды движения были выданы в течение последних X секунд или команд.

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

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

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

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

Я могу придумать два основных (элементарных) способа использования истории движения.

  • для последних X ходов соответствуют ли они образцу Y. Простым примером может быть (и это произошло) «ВПЕРЕД, НАЗАД, ВПЕРЕД, НАЗАД,…..». Итак, есть функция сопоставления, которая возвращает либо ИСТИНА (образец найден), либо ЛОЖЬ (не найден). Если TRUE, в навигационной части программы попробуйте другие последовательности движений.
  • есть ли общее или чистое поступательное движение за последние X ходов. Как определить, что такое реальное движение вперед? Что ж … одно простое сравнение состоит в том, что для последних X ходов "FORWARD" встречается чаще, чем "REVERSE". Но это не обязательно должно быть единственное. Как насчет этого: «ВПРАВО, ВПРАВО, ВЛЕВО, ВПРАВО». В этом случае роботу приходится делать правые повороты, чтобы выйти из угла, или из-за того, что он приближался к стене под углом, что можно рассматривать как реальное продвижение вперед. С другой стороны, «ВЛЕВО, ВПРАВО, ВЛЕВО, ВПРАВО…» нельзя рассматривать как реальный прогресс. Таким образом, если «ВПРАВО» встречается чаще, чем «ЛЕВО», или «ВЛЕВО встречается больше, чем« ВПРАВО », то это может быть реальным прогрессом.

В начале этой инструкции я упомянул, что возможная третья цель может заключаться в выравнивании или выравнивании стены. Однако для этого нам нужно нечто большее, чем «близки ли мы к какому-то объекту». Например, если мы можем получить два направленных вперед акустических датчика (не в центре внимания этой статьи), чтобы давать достаточно хорошие, стабильные ответы относительно расстояния, очевидно, что если один сообщает значение, сильно отличающееся от другого, робот приблизился к стене. под углом и может попытаться маневрировать, чтобы увидеть, приближаются ли эти значения друг к другу (обращены к стене под прямым углом).

Шаг 6: Заключительные мысли, следующий этап…

Надеюсь, эта инструкция дала некоторые идеи.

Добавление дополнительных датчиков дает некоторые преимущества и проблемы.

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

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

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

На данный момент, после проб и ошибок, все оказалось в таком приоритете:

  1. обнаружение усилителя
  2. ИК-зондирование
  3. акустическое зондирование

И я просто снизил чувствительность ИК-датчиков, чтобы они могли обнаруживать только очень близкие объекты (например, неизбежные ножки стула).

До сих пор не было необходимости в каком-либо многопоточном или управляемом прерываниями программном обеспечении, хотя я иногда сталкиваюсь с потерей контроля между Raspberry Pi и контроллером мотора Roboclaw (потеря последовательной связи).

Здесь обычно используется схема аварийного останова (см. Предыдущие инструкции). Однако, поскольку я не хочу (пока) иметь дело с необходимостью перезагружать Roboclaw во время разработки, а робот работает не так быстро, и я присутствую, чтобы контролировать его и выключать, я не подключил E-Stop.

В конце концов, скорее всего, потребуется многопоточность.

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

Спасибо, что зашли так далеко.

Я купил несколько инфракрасных лазерных датчиков ToF (время полета) VL53L1X, так что это, скорее всего, тема следующего руководства вместе с сервоприводом.

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