Больше полугода прошло. Были всякие еще соревнования, но про них много писать было нечего. Были впервые соревнования в городе Вентспилс, в Вентспилсском университете прикладных наук. Вообще-т помещения для таких мероприятий не ососбо приспособлены. Фактически тусовались в коридорах. Вот идут соревнования по folkrace, а трасса для следования по линии за кадром правее:

Мне не повезло. В этой группе был единственный участник (поэтому в зачет результаты не шли и приза не было), так как переться в такую даль не многим хотелось.
Хотел испытать новенькие шины, что был купивши, но разочаровался - ничуть не лучше моих силиконовых, но пыль собирают гораздо быстрее, от чего их эффективность пропадает. Ну и когда откатался, мы пошли гулять по приморскому парку - там куча якорей, правда, в основном, адмиралтейские и Холла. Не был бы март, а какой сентябрь, можно было бы в море поплёскаться.
Потом был Даугавпилс, который ничего нового не принёс - как обычно, первое место. А затем в мае финал, где сдал позицию, был только вторым на такой трассе:

Как и предсказывал, даугавпилсский коллега, хоть и плёлся в хвосте, но постоянно наступал на пятки - теперь он вырвался вперёд. И первое соревнование уже этого сезона подтвердило - результат остался таким же.
Ну тут сам виноват - проволынил. Решил, что после чемпионата надо строить новый робот и я его построил. Кинематически выглядит как старый, только на BGM240 модуле. Фактически, соотвествует моему роботу на гусеничном ходу. Единственное отличие - построение сенсора линии, об этом писал два сообщения назад. Питание сенсоров сделал 5 вольт, сопротивление нагрузки 10 килоом. Но, кажется, надо было бы поставить еще меньше... и на этом роботов забросил. Надо было бы еще заняться роботом для лабиринта, но я весной не выдержал и, наконец, купил себе каяк. Всегда мечтал о байдарке, но с ней проблема где держать, как транспортировать. А тут начал смотреть, есть каяк, что я могу просто засунуть в салон своей маленькой машинки. Правда, тогда для пассажиров мест уже больше нет. И вместо дрессировки роботов всё лето учился на этом каяке делать эскимосский переворот.
В сентябре меня, конечно, совесть начала грызть, что надо бы готовиться к соревнованиям в Таллине Robotex. Были разработаны и изготовлены новые платы. Всё практически как у старого робота, только с нюансами. В первую очередь мне нужно было выровнять зад. Решил отказаться от плавных поворотов при поиске - пусть будет медленно, но уверенно. Робот доходит до узла, поворачивается на месте и если сзади оказывается стена, делает откат назад, так, чтобы прижимаясь задом к стенке, выровняться соосно коридору, ну и позиция тоже становится гарантированно известной. У предыдущего робота не мог этого сделать из-за торчащего разъёма USB - притопил. Сенсоры сделал на основе осрамовсих светодиодов SFH4545 и даю в них ток 100ма. Это чтобы внешнюю засветку надёжнее перебить. Можно было и больше, но поскромничал. Ну и сенсоры монтировал не на отдельной плате, а сразу же на этой. Опять же, в качестве контроллера - BGM240, так что эти три робота имеют один и тот же "движок". Единственное отличие в этом роботе от предыдущего, отказался от i2c памяти, а поставил SPI EEPROM.

Причём, на борт поставил "первую попавшуюся" современную микросхему от ST m95p32. Судя по названию, 32 Мбит, т.е. 4МБ. Интересной она оказалась в том, что при использовании команды записи страницы "0x02", память предварительно стирать не нужно. Правда, время записи страницы при этом до 2.5мс, но зато страница 512 байт, а не 256, как у "простых" микросхем. Ну, если хочется писать побыстрее, то есть режим записи "0x0a". Причем, если при этом включить режим буферизации, можно заполнять следующую страницу, пока пишется предыдущая. В общем, эта микросхема даёт такие возможности, что можно каждый фрейм записывать по 512 байт (правда, память при этом закончится за 16 секунд). Но, как слышал в одном из докладов в MINOS, один из разработчиков говорил, что его робот пишет в журнал по 60 байт каждый фрейм. Но это будущие возможности. Пока работа с этой памятью идёт по-старому. Потому как за основу взят код от робота на гусеницах, а там журнал сначала пишется в ОЗУ, а только затем перекидывается в FRAM (здесь в EEPROM).
Сборка, зато оказалась весёлой. Если у linefollower робота модуль BGM240 припаялся сразу и без проблем (как и драйвера моторов DRV8838), то тут перепаивал несколько раз. После первого запуска проверил коммуникацию (rx/tx -> CH330 -> USB) - работает. Проверяю контроль напряжения батареи - нет контакта. Отпаял, припаял. Коммуникация работает, батарея работает, переключатель программ - нет. Отпаял-припаял. Коммуникация работает, батарея работает, переключатель программ - работает. Запускаю моторы - кртутят, но всегда в разные сторононы - ага, короткое замыкание сигналов направления вращения. Снова отпаиваем, убираем всё олово, лудим по-новой и припаиваем. Наконец-то всё работает.
Этому роботу решил для поиска сделать алгоритм Люка-Тремо как у робота для лабиринта из линий. Подумалось, что робот у меня медленный и на найденном
кратчайшем маршруте преимущества иметь не будет. Надо искать
оптимальный маршрут. Написал и начал тестировать на маленьком домашнем лабиринтике (всего 30 клеточек). Но всплыла проблема: по алгоритму робот должен вернуться к старту, а он у меня останавливался в одном месте, даже не изучив лабиринт до конца. Пришлось выяснять в чем дело. Сделал вывод толпы данных в текстовый журнал (информация, что идёт из контроллера в USB параллельно пишется в microSD карточку в OpenLog модуле). Потому как надо было выяснить, чтобы этот баг не всплыл на соревновании. На соревновании баг не вспллыл бы, потому как причиной остановки было то, что когда робот находил последнюю стену, которая закрывает лабиринтик от финиша, находящегося в центре, стоимость всех клеток внутри становится MAX_COST (255) и функция выбора доступной клетки с минимальной стоимостью не могла вернуть доступную, а возвращала значение по умолчанию - назад. Пришлось сделать workaround.
Правда, когда занимался с этой проблемой, заметил, что мои 30 клеток робот изучает порядка 50 секунд. Вопрос, а сколько будет нужно времени, чтобы изучить полный лабиринт? И понял, что, скорее всего не успею уложиться в 300 секунд. Но если в этот раз робот сможет хотя бы добраться до финиша - уже будет не плохо. Но скорость робота при поиске поднял до 45 см/с. Еще из вопросов был, какие параметры менять на соревнованиях. Решил, что при поиске буду уменьшать число поворотов перед необходимостью выравнивания. Потому как ввёл параметр, что робот не на каждом повороте будет пытаться прижиматься задом к стенке, а через заданное число. Но когда робот оказывается в тупике - счетчик принудительно сбрасывется, так что в тупике выравнивание происходит всегда. Для начала установил число 4. Но если робот будет сбиваться, то можно это число уменьшить в 2 раза: 2, 1, 0. Это выбирается тем, какой рукой запускать робота - правой или левой. Если перед стартом поставить руку перед правыми сенсорами, то работают параметры из EEPROM, если левыми - происходит модификация. По убиранию руки - старт через полсекунды.
Вот в таком виде и поехал на соревнования. В этом году решил ехать на поезде, так как наконец-то было организовано железнодорожное сообщение Вильнюс - Рига - Таллин. Билеты продавал эстонский оператор Elron. Конечно ехал с пересадками. Суммарно 3 поезда. До Риги на местном, с Риги до Валги был литовский и с Валги до Таллина на эстонском. Но пересадки были быстрыми - между поездами всего 20 минут. Так что в 10 утра выехал, а около шести вечера был в Таллине. Немного обиделся на организаторов. В прошлые годы был доступен бесплатный билет на городской общественный транспорт. Насчет четверга точно не помню, а то что он еще действовал в воскресенье - помню. Соревнования проходят пятницу-субботу. В этот раз бесплатный билет был только на эти два дня. Но так как гостиницу взял где-то на полпути между станцией и UnibetArena, где проходили соревнования, то обошелся без их автобусов. 3.5 км я могу протопать ножками без проблем.
В день соревнований, тоже всё шло иначе. Когда пришел, лабиринт был закрыт, но с началом регистрации его открыли и даже разрешили с ним потренироваться. Конечно, сразу на судей наехал, что стартовая клетка не имеет внешней стенки, а это против
правил. Пустил по лабиринту, робот неторопливо дополз до финиша и потом где-то заблудился. Пошел посмотреть лог-файл. Оказалось, робот не видел некоторые стены. Оказалось, что если робот немного смещен от осевой линии - противоположную стену перестаёт видеть. Пришлось уменьшить порог детектирования стен с 70 до 40 (значение 100 - возвращают сенсоры когда робот стоит ровно между двух стен).

Вот как в этот раз выглядел лабиринт. Старт в дальнем левом углу. Когда начались соревнования, пошел выступать первым. Поставил робота на старт. И пустил. Судьи хотели чтобы я его запустил на раз-два-три... хм, не представляю как это сделать. Ну ладно, робот дошел до финиша и без остановки начал исследовать финишную зону. Вроде, робот уже был на 4 клетке финиша, когда одна судья другой сказала, что "время!". Может они думали, что робот радостно остановится на первой клетке финиша? Но в правилах такого требования не было и робот без остановки продолжил изучение лабиринта. Спустя некоторое время, ошибки накопились и робот таки въехал в стену. Пришлось его взять и хотел запустить в лабиринт снова, но судьи начали меня вопрошать, что я действительно желаю делать "second try?". Говорю, какой секондтрай, если пять минут первой попытки еще не кончились? Перед соревнованиями выяснилось, что тут даются 2 или три пятиминутных попытки и уговорились на числе 3. Они мне начали тыкать в правила соревнований, я хотел им показать... но время то идёт! моё время, кстати. Короче плюнул и ушел. Результат хоть какой-то есть и на том спасибо. Пошел выяснять где робот ошибся и почему.
Оказалось, что робот не увидел (вернее даже снял ранее установленную) фронтальную стену. Т.е. получалось, что в момент детектирования стены робот не был еще в той позиции откуда надо было бы смотреть стены. Ну для улучшения ситуации решил понизить скорость поиска до 35см/с и сделать чаще выравнивание. Тем временем пришла судья и сказала, что моя претензия была правильной, что действительно, надо использовать 2 секундомера, один для 5 минут и один для измерения времени прохода и что этот результат засчитывают, но попытка не считается. Т.е. я могу иметь еще 3 попытки.
Ну я этим щедрым предложением не воспользовался. На второй попытке я что-то накосячил. Запустил робота на поиск и вижу, что что-то робот ходит не туда. Поэтому, когда оставалось две минуты его прервал. Полностью сбросил память и запустил снова. Робот шел вполне адекватно, но закончить поиск не смог - время вышло. Пришлось его остановить и идти смотреть что там было. Не понимаю как это вышло, но в первый заход не произошло транспонирование лабиринта. Уже писал, что в этих соревнованиях лабиринт "не правильный". В стандартных старт всегда из левого нижнего угла на север. А тут можно рассматривать по разному - или из правого нижнего угла на север, или и нижнего левого на восток. В моём роботе используется второй вариант. И направление север или восток определяется по первой отсутствующей боковой стене: если справа, то на север, если слева то на восток. Так вот в лог-файле нет информации о транспонировании:
Спойлер
Код: Выделить всё
5.256 Start LucTremaux explore
13.958 Right front sensor detected
14.458 Location: 0x00, Heading: North
14.458 Move forward +180mm, Adjustment: -47.0
14.908 Sensing walls: ---- ----- Right
14.908 Update Map Error! Code 08
14.910 LucTremaux unavailable mask 0x06
14.910 Next Move: straight SkipLevel 1 lucTremaux
14.910 Location: 0x10, Heading: North
В нормальной ситуации должны были быть такие строчки:
Код: Выделить всё
3.792 Start LucTremaux explore
11.482 Left front sensor detected
11.482 TurnCount set to 1
11.982 Location: 0x00, Heading: North
11.983 Move forward +180mm, Adjustment: -47.0
12.434 Maze Transposed
12.434 Sensing walls: ---- ----- Right
12.436 LucTremaux unavailable mask 0x06
12.436 Next Move: straight SkipLevel 1 lucTremaux
12.436 Location: 0x01, Heading: East
Зато открыв лог-файл второго заезда и дав поиск ключевого слова "error", его не нашел. Значит все данные консистентные. Вывел на экран как в памяти выглядит лабиринт и мне показалось, что лабиринт изучен достаточно, чтобы проложить боле-менее оптимальный маршрут. Попробовал и да, маршрут есть. Вот я нарисовал синим траекторию поиска, а зелёным цветом оптимальный маршрут: (ещё добавил как выглядел бы полный лабиринт)

Пошел спросить судью должен ли я между попытками очищать память робота, судья сказала, что не нужно, поэтому третью попытку я сразу начал с быстрых проходов. Сначала установил режим прохода с поворотами на месте, это значит, что робот идёт, останавливается, поворачивает на месте и опять идёт прямо. Тут у меня ничего не получилось. На трассе между клетками 0x17 и 0x18 (первый ряд и 7-8 клетки) был стык на котором моего робота подкидывало, из-за чего терялась правильная позиция и робот в конце останавливался не в центре клетки, а со смещением и после поворота на месте въезжал в стену. Сделал три попытки - безрезультатно. Ну да, поленился и не успел сделать коррекцию позиции робота. От безысходности включил другой режим - с плавными поворотами. И тут была приятная неожиданность - робот прошел маршрут до финиша. Попытался манипулированием запуска через левый сенсор повысить максимальную скорость (каждая итерация увеличивала макс.скорость на 0.3 м/с) - но результат не изменился. Поэтому после трёх попыток я решил, что лучшего результата не получу и больше попыток не делал. Т.е. получается, что на этих 5 клеточках прямого хода робот не набирал заданную скорость в 1.5 м/с. (дома посчитал, что до этой скорости разогнался, если было бы 6 клеточек). Надо было всё же менять ускорение, а не скорость. Опять же, анализируя полученные данные, если бы наращивал ускорение, то при максимальной скорости 2 м/с, подняв ускорение до 6 м/с² проход трассы был бы 14 секунд. Но выше 9 м/с² ускорение поднимать нельзя - робот начинает задирать нос. Почему с плавными поворотами робот прошел, а с поворотами на месте - нет? Потому что через "стык" робот проходил на скорости всего 25 см/с, так как там был конец плавного поворота, а плавный поворот у меня выполнялся именно с такой скоростью. А при повороте на месте, после поворота робот начинал разгоняться с ускорением 2 м/с² и за 90мм (расстояние от центра клетки до края, где был стык) набирал скорость уже 60см/с и продолжал ускоряться. Есть разница.
Вообще то, эти стыки не только мне крови попортили. На фото видно, что с одной стороны даже бетонный блок поставили, чтобы придавить края так, чтобы роботы могли пройти ступеньку, которая там возникала. Конечно, поглядывал на другие роботы. Но несмотря на то что были роботы с турбинами, адекватно робот двигался только у одного человека. Когда я слышал, что он с кем-то разговаривал, мне показалось, что говорит по-польски. Так потом и оказалось. У него было два робота которые заняли первые два места, а мне досталось третье. Информационная система как-то странно не работала, показывала "Evaluation Copy" и только ранг участников. Польский робот (или роботы - сначала я не понял), никак не могли пройти один из стыков. Ступенька на стыке была больше просвета у робота. В результате его робот быстрый проход был вынужден идти по тому маршруту, по которому проходил поиск. Но и в таком режиме его робот меня опережал. А во время одной из следующих попыток удалось взять карту оптимального маршрута, ну тогда результат был около 4 секунд. Куда мне со своими 20.
Результаты стали доступны через неделю и... похоже, что кроме наших роботов до финиша больше никто не добрался.