Робот обхода препятствий: датчик, сканирование и поворот
Робот сам обнаруживает препятствия, сканирует свободные направления и поворачивает к ним; его компоненты и контур сначала изучаются и настраиваются в симуляторе.
Робот для обхода препятствий — естественный следующий проект после робота, следующего по линии. Робот, следующий по линии, следует: он отслеживает нарисованную для него линию. Этот робот принимает решения: без траектории и карты он исследует пространство вокруг и выбирает, куда ехать. Именно это отличие — реакция на мир вместо следования по нему — впервые даёт почувствовать автономность, и при этом система остаётся достаточно простой для полного понимания.
Основа — короткий повторяющийся контур: обнаружение–сканирование–решение–поворот. Ультразвуковой датчик HC-SR04 посылает сигнал вперёд и по времени эха оценивает расстояние; когда впереди оказывается объект ближе безопасного порога, робот останавливается, поворачивает датчик влево и вправо с помощью сервопривода SG90 и поворачивает к самому открытому азимуту. Этот порог не случаен: он задаёт безопасное расстояние, рассчитанное из текущей скорости, задержки в контуре обнаружения–решения–исполнения, тормозного пути (который растёт пропорционально квадрату скорости), радиуса робота и запаса; все эти составляющие видны на кривой тормозного пути в симуляторе.
Вы добавляете компоненты, необходимые мобильному роботу, и изучаете назначение каждого: Arduino Uno с простой логикой 5 V, ультразвуковой датчик и его слепую зону (минимальное расстояние, ниже которого он не может выдать результат), сервопривод, который даёт лучу вторую точку обзора, H-мост L298N, переключающий ток двигателей, который не могут обеспечить логические выводы, два редукторных двигателя TT, где редуктор обменивает скорость на полезный момент, шасси 2WD с опорным роликом для дифференциального управления и аккумулятор, который должен питать двигатели и логику по разным шинам. Дерево проекта также проведёт вас через два плана обучения — управление двигателями и реактивную навигацию, — поэтому знакомые по роботу, следующему по линии, идеи PWM, одометрии и фильтрации вернутся здесь в контексте навигации.
Затем — до затрат и риска ошибки подключения — настройте поведение обхода в браузерном симуляторе, пока робот не начнёт уверенно обходить загромождённое пространство. Рабочая область там двумерная, с мгновенными лучами без шума; настоящий ультразвуковой луч расходится примерно на 15°, перекрывается корпусом самого робота и искажается мягкими или наклонными поверхностями. Поэтому при работе на оборудовании нужно фильтровать показания, добавить медианный фильтр и короткую задержку после поворота сервопривода, и только затем доверять измерению расстояния. Выбор безопасного тормозного пути и правила выбора свободного направления в симуляторе устраняет большую часть догадок до первого движения робота.
И только после этого подключите настоящего робота — сигналы trigger и echo подключите к соответствующим цифровым выводам, питание — к правильному напряжению, сигнал сервопривода — к выводу с поддержкой PWM, PWM и направление двигателей — к драйверу, аккумулятор двигателей — только к выводу VM драйвера, все «земли» соединены вместе — и дайте ему перемещаться по полу с коробками или стульями. Те же принципы обнаружения и фильтрации прямо ведут к роботу Micromouse для прохождения лабиринта, если позже понадобится построение карты, или к навигации ROS 2, если добавить Raspberry Pi.
Пройдите дерево проекта сверху вниз. Каждый узел открывается после выполнения его предварительных требований, а прогресс сохраняется на этом устройстве, поэтому робот можно собрать за выходные, не потеряв место.
Перечень компонентов
| Компонент | Кол-во | Примерная стоимость | Примечания |
|---|---|---|---|
| Arduino Uno | 1 | $5–8 | Логика 5 V здесь действительно полезна — сигнал echo датчика HC-SR04 имеет уровень 5 V |
| HC-SR04 | 1 | $2 | VL53L0X хорош как второй датчик, но не как замена |
| Сервопривод SG90 | 1 | $2 | Для сканирующей головы. MG90S, если он будет работать часами |
| L298N | 1 | $2–4 | Или TB6612FNG, который расходует намного меньше энергии аккумулятора |
| Редукторный двигатель TT | 2 | $4 | |
| Шасси 2WD | 1 | $6–10 | |
| Аккумулятор | 1 | $6 | 6×AA NiMH или 2×18650 |
| Концевые выключатели | 2 | $1 | Добавьте их. См. ниже |
Итого: примерно $30–40.
Два концевых выключателя — лучшие сорок центов в роботе, и именно их чаще всего не добавляют при сборке. У любого дальномерного датчика есть поверхности, которых он не видит: сонар не замечает шторы и стены под крутым углом, — поэтому робот без датчиков касания будет толкать штору, пока что-нибудь не поддастся. Два выключателя за изогнутым бампером превращают «обычно избегает препятствий» в «никогда не застревает на том, чего не смог увидеть».
Как всё соединено
| Откуда | Куда | Примечание |
|---|---|---|
HC-SR04 VCC, GND |
5 V, GND | ~15 mA с выбросами во время сигнала |
HC-SR04 Trig |
D9 | Любой цифровой вывод |
HC-SR04 Echo |
D10 | Выход 5 V — подходит для Uno, но на плате 3.3 V нужен делитель |
| Сигнал сервопривода | D6 | Библиотека Servo использует Timer 1, который также управляет PWM на D9/D10 |
| Питание сервопривода | Отдельные 5 V, общая «земля» | 650 mA при блокировке — нельзя использовать вывод 5 V Arduino |
Драйвер ENA, ENB |
D5, D3 | Выводы с поддержкой PWM. Снимите перемычки включения L298N |
Драйвер IN1–IN4 |
D8, D7, D4, D2 | |
| Концевые выключатели | D11, D12, INPUT_PULLUP |
COM на «землю», NO на вывод |
+ аккумулятора |
VM драйвера / +12V |
Никогда не Arduino |
| Все «земли» | В одной точке | Arduino, драйвер, источник питания сервопривода, минус аккумулятора |
Следите за конфликтом таймеров: библиотека Servo перехватывает Timer 1, который на
Uno управляет PWM на выводах 9 и 10. Подайте PWM двигателей на 3, 5, 6 или 11, а
сервопривод — на любой другой вывод, и проблема не возникнет. Если включить двигатель
на выводе 9, управление его скоростью молча перестанет работать сразу после подключения
сервопривода.
Тормозной путь, рассчитанный, а не прикинутый на глаз
Порог остановки — важнейшее число в этом проекте, и оно не случайно. Это сумма четырёх расстояний:
stop_distance = (v x t_latency) + (v^2 / (2 x a_brake)) + robot_radius + margin
| Слагаемое | Откуда берётся | Типичное значение |
|---|---|---|
| Задержка обнаружения и принятия решения | Сигнал (до 25 ms), стабилизация сервопривода, период контура | 60–100 ms |
| Тормозной путь | Квадрат скорости, делённый на удвоенное замедление | Быстро растёт |
| Радиус робота | От передней стороны шасси до центра поворота | 80–100 mm |
| Запас | Потому что конус датчика имеет ширину 15° и может давать недостоверные показания на мягких поверхностях | 50 mm |
Пример расчёта для робота со скоростью 0.3 m/s, задержкой 80 ms и замедлением 1.0 m/s²:
= (0.3 x 0.08) + (0.09 / 2.0) + 0.09 + 0.05
= 0.024 + 0.045 + 0.09 + 0.05 = 0.21 m
Получается около 21 cm. Теперь удвоим скорость до 0.6 m/s:
= 0.048 + 0.18 + 0.09 + 0.05 = 0.37 m
Порог не удвоился — он вырос на 76%, потому что тормозное слагаемое изменяется как квадрат скорости. Именно поэтому робот, который надёжно обходит препятствия со скоростью пешехода, начинает натыкаться на них при ускорении, а исправление состоит в зависимости порога от скорости, а не в одном большом фиксированном значении, которое заставит робот везде вести себя робко.
Сборка по этапам
| № | Этап | Проверка | Успешный результат |
|---|---|---|---|
| 1 | Двигатели работают | Вперёд, назад, разворот в обе стороны на опорах | Все шесть состояний работают; известна мёртвая зона каждого колеса |
| 2 | Расстояние считывается | Направить на стену в 30 cm и выводить значение минуту | Стабильно, с погрешностью в пределах одного-двух сантиметров, без нулей |
| 3 | Работает тайм-аут | Направить на открытый воздух и на потолок | Контур сохраняет частоту — отсутствие echo не должно останавливать робота |
| 4 | Медианный фильтр | Многократно провести рукой через луч | Резкие одиночные показания исчезают; реальное приближение всё ещё регистрируется |
| 5 | Сервопривод сканирует | Задать −60°, 0°, +60° и вывести расстояние для каждого угла | Повторяемое сканирование, между проходами — задержка для стабилизации |
| 6 | Доказана задержка стабилизации | Намеренно убрать задержку | Показания размазываются по углам — теперь этот отказ понятен |
| 7 | Порог остановки | Направить на стену и позволить остановиться | Робот останавливается с рассчитанным запасом, а не случайно |
| 8 | Решение на поворот | Поставить лицом к углу с одной открытой стороной | Робот поворачивает к открытой стороне, а не случайным образом |
| 9 | Гистерезис | Остановиться на пороге | Принимает решение, а не метается между состояниями |
| 10 | Восстановление после касания | Направить на подушку | Сонар её не видит, выключатель ловит касание, робот отезжает и поворачивает |
| 11 | Свободное перемещение | Пять минут в загромождённой комнате | Работает; если всё же застревает, можно назвать состояние |
Этап 10 отличает полноценного робота от демонстрации. Подушка полностью поглощает ультразвуковой импульс, поэтому датчик сообщает о свободном пространстве, и робот на полной скорости въезжает в неё. Без концевого выключателя он затем толкает её, пока двигатели не заблокируются.
Диагностика неисправностей
| Симптом | Вероятная причина | Исправление |
|---|---|---|
| Робот периодически зависает | pulseIn без тайм-аута |
Задайте тайм-аут 25000 µs; отдельно обработайте отсутствие echo |
| Аварийно останавливается в пустой комнате | Тайм-аут трактуется как 0 cm | Тайм-аут означает далеко, а не близко. Возвращайте специальное значение |
| Въезжает в шторы и подушки | Звук поглощается — физика, а не ошибка | Добавьте концевые выключатели |
| Врезается в стены под углом | Сигнал отражается мимо приёмника | То же исправление; дополнительно сканируйте больше углов |
| Уверенно поворачивает в стену | Показание снято до стабилизации сервопривода | После задания угла добавьте 100–200 ms до сигнала |
| Мечется перед препятствиями | Один порог, без гистерезиса | Останавливаться на 20 cm и не возобновлять движение до 30 cm |
| Сервопривод дрожит, плата перезагружается | Ток сервопривода проходит через Arduino | Отдельный источник 5 V для сервопривода, общая «земля» |
| Управление скоростью двигателей перестало работать | Библиотека Servo заняла Timer 1 (выводы 9, 10) |
Перенесите PWM двигателей на 3, 5, 6 или 11 |
| Навсегда застревает в углу | Нет памяти — неотъемлемое свойство реактивной навигации | Добавьте случайную составляющую и выход из состояния застревания |
| При медленном движении избегает хорошо, при быстром натыкается | Фиксированный порог, квадратичное тормозное слагаемое | Сделайте порог зависимым от скорости |
| Сильные отклонения показаний, когда рядом работают два робота | Они слышат сигналы друг друга | Разнесите моменты отправки сигналов |
Куда двигаться дальше
Добавьте движение вдоль стены. Робот, поддерживающий фиксированное расстояние от стены с одной стороны, детерминированно обходит комнату вместо бесцельного движения; это первое поведение, которое начинает выглядеть как план. Изменение кода небольшое, а концептуальное — значительное.
Добавьте второй тип датчика. VL53L0X не работает почти на тех же поверхностях, что и сонар, но практически на противоположных: тёмных матовых и зеркальных, а не мягких и наклонных. Вместе они охватывают гораздо большую часть комнаты, чем каждый по отдельности.
Примите это ограничение и двигайтесь дальше. Реактивному роботу нельзя направить в произвольное место, нельзя гарантировать покрытие пола, и в подковообразной комнате он может бесконечно двигаться по кругу. Это свойства отсутствия карты, а не ошибки. Когда они начинают мешать, робот Micromouse добавляет построение карты и планирование, а робот для покрытия помещения напрямую решает вопрос «я везде побывал?».
Дорожная карта проекта
Путь сборки
Следуйте по дереву технологий от деталей к работающему роботу. Каждый узел открывается, когда выполнены его предварительные условия, а ваш прогресс сохраняется на этом устройстве.
0 / 18 выполнено
Компоненты
- КонтроллерArduino UnoПрощающая 8-битная плата, с которой большинство знакомится с робототехникой.
- ДатчикУльтразвуковой датчик HC-SR04Ультразвуковой импульс в корпусе за два доллара — так робот ощущает препятствия.
- Исполнительный механизмСервопривод SG90Сервопривод массой девять граммов для большинства роботизированных рук, захватов и механизмов поворота.
- ДрайверДрайвер двигателей L298NДвойной H-мост, превращающий слабые логические выводы в мощность для двигателей.
- Исполнительный механизмРедукторный двигатель TT (DC)Жёлтый редукторный двигатель, превращающий голую платформу в движущийся робот.
- ШассиШасси робота 2WDПлатформа, к которой крепятся два двигателя, свободный опорный ролик и вся электроника.
- ПитаниеБатарейный блок питания роботаРазница между работающим роботом и роботом, который постоянно перезагружается.
Руководства на этом пути
- Начальный · 22 минАлгоритм обхода препятствий: восприятие, скан, решение, поворотЦикл «восприятие — сканирование — решение — поворот» для самостоятельного обхода препятствий роботом.
- Начальный · 20 минЧтение датчика HC-SR04: надёжное измерение расстоянияПреобразование импульса и эха в стабильное расстояние в cm с тайм-аутом и медианным фильтром.
- Начальный · 18 минСканирование ультразвукового датчика сервоприводомСканирование HC-SR04 с помощью сервопривода определяет самое свободное направление перед поворотом робота.
- Начальный · 18 min readУправление двигателями постоянного тока с помощью PWM и H-мостаБезопасно подключите коллекторный двигатель постоянного тока и управляйте им с помощью PWM, H-моста и реалистичных пределов тока.
- Средний · 20 min readОдометрия дифференциального привода по энкодерам колёсИнтегрируйте движение левого и правого колёс в позу мобильного робота, затем выявите и откалибруйте дрейф.
Попрактикуйтесь до сборки схемы
Настройте его в интерактивном симуляторе
Путь сборки проходит через лабораторию в браузере. Добейтесь правильного поведения здесь, а затем перенесите настройки на реального робота.
Часто задаваемые вопросы
Как работает робот для обхода препятствий?
Он движется вперёд, пока ультразвуковой датчик измеряет расстояние впереди. Когда впереди оказывается объект ближе заданного порога, робот останавливается, поворачивает датчик влево и вправо с помощью сервопривода, измеряет расстояние в каждом направлении и поворачивает к самому просторному — затем возобновляет движение. Всё это короткий контур обнаружение–сканирование–решение–поворот, выполняемый много раз в секунду.
Какой датчик лучше всего подходит для робота, обходящего препятствия?
Ультразвуковой датчик HC-SR04 — стандартный выбор: он недорогой, простой в подключении и надёжный на расстоянии до нескольких метров. Датчик времени полёта даёт более узкий, быстрый и точный отсчёт, если он необходим, но для первого робота, обходящего препятствия, ультразвуковой датчик обеспечивает оптимальный баланс стоимости и простоты.
Нужно ли покупать компоненты до начала этого проекта?
Нет. Обнаружение и логика обхода работают в браузерном симуляторе, поэтому вы можете понять и настроить поведение до покупки компонентов. Физические Arduino, HC-SR04, сервопривод, драйвер, двигатели, шасси и аккумулятор нужны только для заключительных этапов сборки — подключения и монтажа.
Почему мой робот для обхода препятствий не работает?
Обычно виноваты три фактора: показания с помехами или ложные показания ультразвукового датчика (добавьте медианный фильтр и обеспечьте прямую видимость), чтение датчика до завершения поворота сервопривода (добавьте небольшую задержку для стабилизации) и питание двигателей непосредственно от Arduino, а не через драйвер (напряжение проседает, и плата перезагружается).
Чем это отличается от робота, следующего по линии?
Робот, следующий по линии, движется по заранее проложенной траектории; у робота для обхода препятствий такой траектории нет, и он должен решить, куда ехать. Здесь добавлены сканирующий датчик и полноценный контур принятия решений, поэтому такой робот естественно собрать вторым после робота, следующего по линии.