Региональный этап Робофеста проходил
в Нижнем Новгороде 19 января 2017. Мы (команда клуба изобретательства и робототехники ДОСААФ и Межвузовской ассоциации Центр внедрения технологий - Макар Кряжев и Виктор Герасимов) заявились на номинацию «Hello, Robot! Arduino: шорт трек».
ДОСААФ:
Робототехника - шаг в будущее!,
вкРГ:
ДОСААФ открыл для нижегородцев мотосекцию и кинологический центр (вторая часть заметки)
Смысл задания - проехать по линии, плюс несколько дополнительных ограничений:
- на трассе есть перекрестки - их нужно проезжать прямо,
- в одном месте трассы установлено препятствие - небольшая рампа, типа горка,
- робот не должен врезаться в другого робота, который проходит трассу одновременно с ним.
Алгоритм проезда через перекрестки и остановку перед препятствием отладили на занятиях, за ночь перед походом вставил свежие батарейки и убедился, что все работает.
Click to view
Казалось бы, осталось только добраться до мероприятия, откалибровать датчики (с ними всегда главный затык - они работают по-разному при разном освещении), проехать трек и пойти отдыхать.
Но кое-что пошло не так. С первых тренировочных заездов машинка начала вести себя, как тот лось, который «я всё пью, пью, а мне всё хуже и хуже». Буквально на каждой попытке она ехала все медленнее и медленнее. Хуже того, начинали глючить датчики линии, это влияло не только скорость - машинка начинала уходить с трассы в случайных местах или начинать поворот там, где не нужно.
Самый удачный заезд, когда удалось протащиться большую часть трассы и перекрестки, но сил на горку уже не хватило:
Click to view
Очевидно, дохли батарейки, причем сильно быстрее, чем от них ожидалось (мультиметр показывал уже что-то в районе 5В на отсеке из 4х батареек). Причина, судя по всему, была в датчике расстояния (сонаре), который прикручивали в последнюю очередь, т.к. он выполнял второстепенные вспомогательные действия - команда на старт (можно обойтись и без нее) и проверка на столкновение на перекрестках (как выяснилось, довольно редкая ситуция, без учета которой можно вполне обойтись). Проверку расстояния проводили довольно часто - просто в каждом цикле (несколько десятков или может даже пару сотен раз в секунду). Для логики алгоритма это не принципиально, а для физики устройства, как выяснилось, нюанс решающий.
По-хорошему, нужно будет немного переписать алгоритм так, чтобы проверка расстояния производилась не на каждом цикле, а не чаще определенного периода (раз или два раза в секунда - более, чем достаточно). Мы же сонар решили просто отключить. Но было уже поздно - батарейки разрядились довольно сильно, а свежие запасные в достаточном количестве мы не взяли (зачем, если и так все зарядили в ночь перед выступлением?).
К счастью, в запасе оказался еще один отсек тоже с наполовину разряженными батарейками. Один лишний провод (благодаря макеточной части отсеков, хе-хе) и два полудохлых отсека на 4-5В превратились в один мега-источник питания на 8-9В.
Машинка начала летать, как угорелая.
Click to view
Если бы она доехала до рампы, скорее всего взлетела бы с нее, как с трамплина. Но доехать до рампы ей было не суждено. Из-под воды показалась вторая часть айсберга - часть алгоритма, которая отвечала за проезд перекрестков.
В теории определить перекресток довольно просто - если и левый и правый датчик видят линию, значит мы на перекрестке, значит нужно ехать прямо. На практике получается немного не так - т.к. скорость опроса датчиков линии довольно высока, на перекрестке всегда получается ситуация, когда один датчик уже заехал на линию, а второй еще не успел. Но для алгоритма это триггер к другой ситуации - мы доехали до поворота, значит нужно повернуть. Короче, нам нужно как-то отличать первую стадию заезда на перекресток от обычного поворота. Выбранное решение - при определении линии на одном из датчиков дать машинке еще немного проехать вперед и выполнить проверку еще раз: если линия появилась под вторым датчиком, значит мы на перекрестке, если не появилась - поворот.
И вот в этом месте с проездом "немного вперед" и заложена мина. Это "немного" должно быть таким, чтобы дать возможность второму датчику добраться до линии перекрестка (если это он), при этом не выехать за пределы линии, иначе мы улетим с поворота. Заезжать глубоко в середину линии тоже не желательно, иначе на каждом повороте нам еще придется возвращаться немного назад, чтобы не сходить с трассы, - о плавном движении можно забыть. Короче, вот эта вот часть алгоритма напрямую и очень тонко зависит от текущей скорости машинки, внутренние задержки подбираются строго под нее.
Ну и дальше очевидно, что исходный алгоритм мы отлаживали (в том числе подбирали эти задержки) для машинки, которая гоняла от батареек на 6 Вольт с одной скоростью, на источнике 8-9В скорость уже совсем другая - нужны другие задержки, иначем машинка будет тупить на перекрестках или вылетать за трассу на поворотах.
В имеющееся между стартами время мы попытались перенастроить задержки так, чтобы они работали на новом скоростном режиме, но в словиях нервической и суетливой обстановки успех был переменным.
Относительно успешный тренировочный заезд:
Click to view
Дополнительную пикантность процессу отладки добавляет такой нюанс, что от запуска к запуску батарейки все равно разряжаются, скорость постепенно падает, старые значения задержек, которые подходили на предыдущем запуске, на новом запуске уже так хорошо не подходят.
Без стабилизатора напряжения (или, как вариант, акселерометра) задача не имеет правильного решения. На плате Ардуино (в нашем случае - ChipKIT Uno32) есть стабилизатор напряжения 5В, но это уже слишком мало для моторов - машинка опять едет слишком медленно, нужно хотя бы 6В.
В итоге заезд в 1й половине финала (кстати, всего в финал вышло 4 команды - наша в том числе) выглядел следующим образом:
Click to view
Машинка соперницы вылетела с трассы практически сразу, наша доехала до поворота!
Вторая половина финала пролетела не так быстро:
Click to view
Парни (соперники из второй половины финала) оба молодцы, в итоге они
заняли 1е и 2е места - дисциплина «Hello, Robot! Arduino: шорт трек». Как потом выяснилось, нашей команде место не присудили (вполне справедливо), хотя в турнирной таблице мы действительно были на 3м месте.
По результатам мероприятия провели специальное занятие, на котором рассмотрели все прилетевшие косяки и составили план исправлений.
Выявленные проблемы:
1. Частый опрос сонара - расход батареек
2. Горка
- Слабые батареи - не хватает сил въехать
- Слетело колесо в бок
- На самой вершине датчики оказываются далеко от поверхности, теоретически могут вернуть некорректное значение, нужно это учесть в алгоритме.
3. Полный заряд - максимальная скорость
- пролетаем повороты
- необходимо менять значения задержек
4. Неудобно менять батарейки
5. Часто отлетают задние колеса
7. Слабые датчики (питание)
8. Маленькая скорость (питание)
Решения (номера пунктов не связаны с проблемами):
1. Эффективное использование заряда (на уровне алгоритма):
- плавно набирать скорость
- опрашивать сонар не так часто
2. Переработка системы питания
- 4 батарейки -> 6 батареек
- батарейки -> аккумуляторы
3. Варианты аккумуляторов
- Аккумуляторы-батарейки: 1.3В, нужно 6В, x4аккума=5.2В (не едем), x6аккума=7.8В (едем)
- аккумуляторы LiPo (нет контроля разряда)
- аккумуляторы LiPo в форм-факторе большой пальчиковой батарейки (встроенный контроль разряда)
4. Стабилизатор напряжения (желательно, с регулировкой)
5. Стопорная втулка на задней оси - необходима более плотная фиксация на оси
- вложенная гайка
- вариант со стягивающей муфтой
6. Замена батареек - доработка конструкции
- люк с крышкой внизу
- выдвижной отсек с фиксацией на один винт (предпочтительный)
Фотки