Соберите робота для лабиринта из ленты с памятью LSRB
Робот самостоятельно исследует лабиринт из линий, запоминает каждый встреченный перекрёсток, а затем без единого неверного поворота проходит кратчайший маршрут от старта до финиша.
Робот, следующий по линии, следует за линией. Робот для прохождения лабиринта принимает решения. Именно это и есть весь переход, который делает этот проект, и он больше, чем кажется: робот перестаёт быть контуром управления с колёсами и становится системой, которая исследует незнакомую среду, запоминает найденное и действует на основе этой памяти.
Хитрость в том, что ничего из этого не заменяет робота, следующего по линии, — все эти функции располагаются поверх него. Ниже тот же массив датчиков отражения и тот же контур ПИД-регулятора удерживают робота по центру ленты, ничего не зная о лабиринтах. Над ними тонкий слой принятия решений отслеживает моменты, когда линия разветвляется, определяет тип перекрёстка, выбирает направление и записывает один символ. Именно такое разделение делает проект реализуемым, и это же двухуровневое разделение используют настоящие роботы повсеместно.
Поэтому порядок сборки здесь важнее обычного. Сначала добейтесь действительно стабильного движения по линии — настройте его в симуляторе, затем на большом овале из реальной ленты — и только после этого добавляйте перекрёстки. Нарушение этой дисциплины приведёт к тому, что каждая механическая проблема, каждый дрейф калибровки и каждое колесо, смещённое на 2 mm, проявятся под видом ошибки решения лабиринта.
Следуйте по дереву технологий сверху вниз. Каждый узел открывается после выполнения его предварительных требований, а прогресс сохраняется на этом устройстве, поэтому робота можно собрать за выходные, не потеряв место.
Список компонентов
| Компонент | Кол-во | Примерная стоимость | Примечания |
|---|---|---|---|
| Arduino Nano | 1 | $5 | A0–A7 даёт восемь аналоговых каналов; шести каналов Uno недостаточно |
| массив датчиков отражения IR, 8 каналов | 1 | $8–12 | Восемь, и аналоговый. Для обнаружения перекрёстков нужны крайние датчики |
| TB6612FNG | 1 | $3 | Здесь это оправдано: падение напряжения ~2 V на L298N мешает точным движениям на низкой скорости |
| редукторный двигатель TT | 2 | $4 | Версии с энкодером настоятельно рекомендуются для повторяемых поворотов |
| шасси 2WD | 1 | $6–10 | |
| батарейный блок | 1 | $6 | 2×18650, защищённый держатель |
| Матовый чёрный скотч, 19 mm | 1 рулон | $3 | И большая светлая поверхность или доска, на которой можно разложить лабиринт |
Итого: примерно $35–45. 8-канальный массив — единственная деталь, на которой не стоит экономить, и причина вполне конкретна: робот обнаруживает левую ветвь, замечая, что крайние левые датчики стали тёмными, пока центр всё ещё находится на линии. Массив, который лишь немного шире ленты, физически не может этого увидеть, поэтому обнаружение перекрёстков превращается в догадки, как бы хорош ни был код.
Почему массив должен быть шире линии
left branch array (8 channels, ~60 mm wide)
────────────────┐ [ x x x . . . . . ] outer left dark -> a branch
│
════════════════╪═══════ [ . . . x x . . . ] centre still on the line
│
Ориентировочное правило: ширина массива должна быть как минимум в три раза больше ширины ленты. Для ленты 19 mm это около 60 mm, и именно такую ширину обеспечивает 8-канальный массив с шагом 8 mm между датчиками. Если массив уже, робот не сможет отличить «линия резко повернула» от «линия разветвилась», а это ключевое решение, на котором держится весь проект.
Соберите проект по этапам
Здесь порядок сборки важнее, чем в любом другом проекте на сайте. Робот для прохождения лабиринта — это робот, следующий по линии, с добавленным слоем принятия решений, и каждая механическая неисправность или ошибка калибровки в роботе, следующем по линии, снова проявится под видом ошибки решения лабиринта.
| # | Этап | Проверка | Успешный результат выглядит так |
|---|---|---|---|
| 1 | Движение по линии работает | Десять кругов по большому простому овалу | Ноль потерь. Не «в основном», а ноль |
| 2 | Повторяемость поворотов | Подать команду на поворот на 90° десять раз, измерить | В пределах ±3°, и повторяемо |
| 3 | Перекрёсток замечен | Медленно проехать по T-образному перекрёстку, вывести показания массива | Крайние датчики темнеют раньше центральных |
| 4 | Перекрёсток классифицирован | Медленно проехать по каждому типу перекрёстка | Все варианты: влево / вправо / T / перекрестие / тупик названы правильно |
| 5 | Один поворот выполнен | Встретить левую ветвь, повернуть налево и продолжить движение | Робот снова находит линию и продолжает |
| 6 | Путь записан | Проехать короткий лабиринт, вывести строку | Последовательность вроде LSRB, совпадающая с наблюдаемой |
| 7 | Упрощение LSRB | Передать записанный путь упростителю | LBL превращается в S, и каждое правило срабатывает правильно |
| 8 | Второй проход | Пройти упрощённый путь | Достигает цели без неверных поворотов и исследования |
| 9 | Полный лабиринт | Лабиринт с несколькими тупиками | Исследует, упрощает, затем проходит кратчайший маршрут |
Этап 1 не подлежит обсуждению. «В основном следует за линией» превращается в «иногда придумывает перекрёсток», и вы проведёте вечер, отлаживая упрощение пути из-за неисправности, которая на самом деле заключается в колесе, смещённом на 2 mm.
Этап 2 пропускают чаще всего. Робот для прохождения лабиринта выполняет сотни поворотов за один проход, а поворот, который постоянно не добирает 5°, накапливает ошибку, пока робот полностью не сходит с линии. Именно здесь проявляется люфт редуктора — ошибка, меняющая знак в зависимости от направления, имеет механическую природу, а не связана с настройкой.
Двухуровневое разделение в коде
Стоит явно показать разделение, которое делает этот проект реализуемым:
┌─────────────────────────────────────┐
decision │ classify junction -> choose turn │ runs only at junctions
layer │ record a character -> simplify │ knows nothing about PWM
└──────────────────┬──────────────────┘
│ "turn left" / "keep going"
┌──────────────────▼──────────────────┐
following │ read array -> position -> PID │ runs every loop, ~200 Hz
layer │ -> left and right wheel speeds │ knows nothing about mazes
└─────────────────────────────────────┘
Нижний слой никогда не узнаёт, что такое лабиринт. Верхний слой никогда не управляет двигателем напрямую. Когда что-то идёт не так, эта граница подсказывает, в какой половине искать причину; если вы не можете сказать, к какой половине относится ошибка, слои разделены неправильно.
Как выглядит хороший результат
| Показатель | Типичное значение |
|---|---|
| Скорость исследования | 0.15–0.25 m/s — достаточно медленно, чтобы надёжно классифицировать перекрёстки |
| Скорость обратного прохода | 0.3–0.5 m/s — принимать решения больше не нужно, поэтому можно двигаться быстрее |
| Точность классификации перекрёстков | 100%. Меньше — и записанный путь будет неверным |
| Повторяемость поворотов | ±3° |
| Упрощение пути | Путь исследования из 30 символов обычно сокращается до 8–12 |
Точность распознавания перекрёстков действительно работает по принципу «всё или ничего», и это удивляет людей. Один неверно распознанный перекрёсток портит записанную строку, упроститель затем создаёт правдоподобный, но неверный путь, а обратный проход уверенно упирается в стену. Частичного успеха нет — поэтому этап исследования проходит медленно, а время экономится на обратном проходе.
Устранение неполадок
| Симптом | Вероятная причина | Исправление |
|---|---|---|
| Видит перекрёстки, которых нет | Кривой поворот считывается как ветвь | Расширьте массив; потребуйте, чтобы крайние датчики оставались тёмными на минимальном расстоянии |
| Пропускает перекрёстки | Слишком быстрое движение или слишком узкий массив | Замедлите этап исследования; проверьте, что ширина массива ≥3× ширины ленты |
| Повороты нестабильны | Люфт или отсутствие энкодеров | Всегда подходите к повороту одинаково; измерьте люфт |
| В записанном пути есть лишние символы | Перекрёсток обнаружен дважды | Добавьте паузу после перекрёстка перед поиском следующего |
| Упрощение создаёт неверный путь | Правило применено в неправильном порядке | Сначала отдельно проверьте LBL→S, LBR→B, SBL→R и подобные правила |
| Обратный проход неудачен на первом повороте | Путь записан относительно неверного направления | Строка — это последовательность относительных поворотов — проверьте соглашение |
| Работает на одном лабиринте, но не на другом | Интервалы между перекрёстками слишком малы для паузы | Уменьшите паузу или замедлите движение ещё сильнее |
| Теряет линию после поворота | Поворот проходит за новую линию | Поворачивайте до повторного обнаружения линии центральными датчиками, а не на фиксированный угол |
| Смещение усиливается по мере движения | Просадка батареи, изменение эффективных коэффициентов | Замкните контур скорости с помощью энкодеров |
Куда двигаться дальше
Добавьте энкодеры и выполняйте поворот по расстоянию, а не по времени. Повороты по времени — главный источник ненадёжности первого робота для прохождения лабиринта, поскольку требуемое время меняется в зависимости от напряжения батареи и поверхности. Повороты по энкодерам от этого не зависят.
Перейдите к лабиринту со стенами — робот для прохождения лабиринта — который заменяет ленту стенами, а правило LSRB — алгоритмом заливки. Это действительно более крупный шаг: LSRB — эвристика движения вдоль стен, которая находит один путь, а flood fill вычисляет кратчайший и перепланирует маршрут по мере обнаружения новых стен.
Оптимизируйте обратный проход. Когда путь известен, решения больше не нужны, поэтому робот может разгоняться на прямых и замедляться только перед поворотами. Профиль движения для известного маршрута — именно здесь появляются значительные сокращения времени, часто вдвое.
Дорожная карта проекта
Путь сборки
Следуйте по дереву технологий от деталей к работающему роботу. Каждый узел открывается, когда выполнены его предварительные условия, а ваш прогресс сохраняется на этом устройстве.
0 / 21 выполнено
Компоненты
- КонтроллерArduino UnoПрощающая 8-битная плата, с которой большинство знакомится с робототехникой.
- ДатчикМассив ИК-датчиков отражения (IR)Ряд инфракрасных «глаз», который сообщает роботу, где находится линия.
- ДрайверДрайвер двигателей TB6612FNGMOSFET H-мост, сохраняющий то напряжение, за которое вы действительно заплатили.
- Исполнительный механизмРедукторный двигатель TT (DC)Жёлтый редукторный двигатель, превращающий голую платформу в движущийся робот.
- ШассиШасси робота 2WDПлатформа, к которой крепятся два двигателя, свободный опорный ролик и вся электроника.
- ПитаниеБатарейный блок питания роботаРазница между работающим роботом и роботом, который постоянно перезагружается.
Руководства на этом пути
- Начальный · 20 min readРобот, следующий по линии: от датчиков к ПИД-управлениюИК-датчики, взвешенная ошибка и ПИД-регулятор: как робот следует за линией без рывков.
- Начальный · 20 минМассив инфракрасных датчиков для робота, следующего по линииПреобразование ряда инфракрасных датчиков в единую плавную позицию линии, по которой можно управлять роботом.
- Начальный · 18 мин чтенияКак настроить ПИД-регулятор (PID): практическое руководствоПрактический порядок настройки коэффициентов P, I и D без угадывания — и способ проверить каждый шаг в реальном времени.
- Средний · 14 min readОбнаружение развилок линейного лабиринта ИК-массивомКлассифицируйте Т-развилки, перекрёстки, повороты, тупики и финиш по данным ИК-массива, разрешая неоднозначные случаи.
- Средний · 15 мин чтенияУпрощение пути LSRB для роботов в линейном лабиринтеЗаписывайте повороты как L, S, R и B, затем сворачивайте каждый обход тупика в оптимальный маршрут.
Попрактикуйтесь до сборки схемы
Настройте его в интерактивном симуляторе
Путь сборки проходит через лабораторию в браузере. Добейтесь правильного поведения здесь, а затем перенесите настройки на реального робота.
Часто задаваемые вопросы
Как сделать робота для прохождения лабиринта на Arduino?
Начните с рабочего робота, следующего по линии: массива датчиков отражения, контура ПИД-регулятора и драйвера двигателей. Затем добавьте поверх него слой принятия решений, который замечает перекрёстки, выбирает ветвь по правилу левой руки и записывает каждый поворот одним из четырёх символов — L, S, R или B. Когда робот достигает финиша, правила подстановки удаляют из этой строки все обходы тупиков, а второй проход следует по упрощённому маршруту. Этот путь сборки охватывает всю цепочку, а слой слежения вы сначала настраиваете в браузерном симуляторе.
Что такое алгоритм LSRB в роботе, следующем по линии?
LSRB означает «влево, прямо, вправо, назад» (Left, Straight, Right, Back) — четыре действия, которые робот может выполнить на перекрёстке. Робот записывает по одному символу на каждый перекрёсток во время исследования, а каждая B отмечает тупик, из которого пришлось развернуться. Шесть правил подстановки заменяют каждое трёхсимвольное окно, центрированное на B, единственным поворотом, который дал бы тот же результат, полностью удаляя обход. Повторяйте, пока не останется B, и получите кратчайший маршрут.
Чем линейный лабиринт отличается от лабиринта со стенами?
Линейный лабиринт — это чёрная лента на светлой поверхности, которую считывает направленный вниз массив датчиков отражения; лабиринт со стенами — формат Micromouse — имеет физические стены, считываемые датчиками расстояния. Считывание совершенно разное, но слой над ним одинаков: исследование для построения знаний, затем прохождение лучшего маршрута. Линейный лабиринт значительно дешевле, поэтому его обычно используют в школьных и университетских соревнованиях.
Нужно ли покупать детали перед началом проекта?
Нет. Слой движения по линии, его коэффициенты ПИД-регулятора и поведение «сначала исследуй, затем оптимизируй» работают в браузерных симуляторах, поэтому можно разобраться в роботе целиком до затрат. Только последние четыре шага — подключение, калибровка, этап исследования и повторный проход — требуют физических Arduino, массива датчиков, драйвера, двигателей, шасси и батареи.
Почему мой робот для лабиринта поворачивает не на тех перекрёстках?
Почти всегда потому, что он решает слишком рано. Мгновенный рисунок показаний датчиков не может отличить T-образный перекрёсток от перекрестия — в обоих случаях вся матрица показывает чёрное. Робот должен записать, какие ветви появились, проехать вперёд примерно на длину робота и прочитать снова, чтобы выяснить, продолжалась ли линия прямо. Решение по первому показанию — самая распространённая причина уверенных неверных поворотов.
Работает ли LSRB в любом лабиринте?
Только в идеальном лабиринте — без циклов, где любые две точки соединяет ровно один путь. Лабиринты из ленты почти всегда именно такие. Если в лабиринте есть цикл, правило левой руки может бесконечно кружить, и тупиков, которые правила могли бы свернуть, нет; тогда нужна настоящая карта и поиск по графу, например flood fill.