roboforum.ru

Технический форум по робототехнике.

МикроЛайнТрейсер

Re: МикроЛайнТрейсер

Сообщение Radist » 23 сен 2010, 07:06

Оживил датчики, отладил код ПД регулятора. Программа и датчики работают отлично, слабым местом по прежнему остается тележка - робот маленький, на неровностях пола бывает колеса проскальзывают. Ну это недостатки конструкции. Сейчас коэффициенты подбираю. Я помню рекомендацию, что сперва подбираем пропорциональный коэффициент. Он должен быть таким, чтоб держаться на линии. Максимальный коэффициент - такой, который вырождает пропорциональный регулятор в двухпозиционный. При этом линия не теряется. Ну а потом и дифференциальную составляющую подбираем, постепенно уменьшая пропорциональную. А вот что мне в алгоритме не нравится, так это когда робот теряет линию. Сейчас сделано так: робот знает с какой стороны была линия, одно колесо тормозит полностью. Может у меня пока не те коэффициенты, но сейчас он возвращается на линию, пересекает ее, потом опять возвращается - не выравнивается пока. И еще одна проблема - на ровном участке робот разгоняется и вылетает за линию по инерции. Скорость большая. А на меньшей скорости он тянет плохо. Может кроме шима нужен еще один низкочастотный шим? Как бы модулирующий. Чтоб на моторы мощность шла побольше, но при этом не давать ему далеко уехать?
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: МикроЛайнТрейсер

Сообщение Radist » 24 сен 2010, 21:39

Модулирующий шим - это зло. Моторчики гудят, но не крутят. В общем не получилось у меня пока сделать чтоб робот плавно ездил по линии. Кое-как ездит, а эстетическое чувство страдает. Движитель типа "вал к резиновому колесу" - для тех, кто в механике собаку съел. А у меня то нормально едет, то проскальзывает, то клинится. Уже с датчиками и регулятором полностью разобрался - осталось тележку нормальную сделать. Моторчики с редукторами уже заказал, пока дойдут, пока соберу новую тележку - пройдет какое-то время. Проект этот добить я все-таки хочу.
Ну и вопросик в конце поста: нужен ли реверс? Он позволяет более круто поворачивать, но он же одновременно приводит к динамическому удару по редуктору/мотору. Плюс усложнение схемы. Стоит или нет? И от чего зависит принятие такого решения? Догадываюсь, что от скорости, но может еще от чего-то?
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: МикроЛайнТрейсер

Сообщение Michael_K » 25 сен 2010, 00:10

от моментов на колесах (читай мощности движков и коэффциенту редуктора).
Мощный движок и большое отношение редуктора - колесо и без реверса как вкопанное встанет.
Слабый движок, небольшой редуктор - он и с реверсом еще метр будет катиться.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: МикроЛайнТрейсер

Сообщение Radist » 11 окт 2010, 06:20

Собрал новую тележку, поставил на нее аккумуляторы помощнее. За время существования темы бот в размерах увеличился раза в 4 :D . Когда ходовая надежна (сейчас мотор/редукторы) - то все получается сразу. С первым же коэффициентом П проехал трассу. Обратил внимание на следующий факт: шим имеет порог снизу. Он равен такому значению, при котором бот может крутиться на одном колесе. Иначе при потери линии он на нее назад не вернется. Второй моторчик здорово помогает боту двигаться. Казалось бы это очевидно, но бывает что об этом забываешь. Сейчас у меня начинается самый интересный этап - подбор коэффициентов и максимизация скорости.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: МикроЛайнТрейсер

Сообщение Radist » 11 окт 2010, 21:31

Сегодня подбирал коэффициенты и увеличивал скорость. Сейчас результаты такие (у меня тестовая трасса, сделанная из кусков трассы 1-34, длиной 185 см): моя тестовая трасса - 4,7 сек. Если пересчитать в трассу 1-34, то время получается 7,6 сек, что дает 8 место в общем зачете. Пора приступить к изготовлению трассы и съемке видео. Но вот с подбором коэффициентов у меня не все гладко. На глаз сложно заметить, стал ли бот лучше вписываться в трассу или нет. Меняю эти коэффициенты, а на глаз все по старому и время прохождения не меняется. И еще один нюанс: участок трассы, состоящий из прямых участков под углом друг к другу. На углу бот несколько пролетает поворот, потом снова на трассу возвращается. Это следствие инерции и коэффициенты тут не помогут?

ЗЫ. Сейчас шим с0 из максимально возможного ff.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: МикроЛайнТрейсер

Сообщение Radist » 12 окт 2010, 22:59

Сегодня удалось немного поднять скорость, до с8 (пробовал на d0 - слишком быстро ездит). Подобрал коэффициенты, при которых бот ездит достаточно плавно. Но есть один нюанс, который мне не нравится. Бот на радиусах не теряет линию, держится за нее и все идет плавно. А вот на участке, где одна прямая идет под углом к другой прямой, бот проскакивает поворот, теряет линию, делает маневр "поиск линии" (крутится на одном колесе), находит ее, но происходит перерегулирование (пара достаточно больших уходов от линии), затем все приходит в норму. Почему проскакивает понятно - линия уходит слишком быстро, снижал скорость - проскакивание пропадало. А вот как сделать плавный возврат на линию? Этот кусок кода уже не имеет отношения к ПД регулятору, это как бы аварийный режим. Как люди делают в подобных случаях?
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: МикроЛайнТрейсер

Сообщение Michael_K » 12 окт 2010, 23:30

Попробуйте вынести датчик вперед, тогда он ее будет терять точно так же, но находить быстрее :)

Добавлено спустя 8 минут 22 секунды:
может быть еще поднять частоту опроса датчика? (или как у вас прога организована)

Добавлено спустя 6 минут 44 секунды:
можно активнее снижать скорость при поворотах (когда линия начинает уходить),
(то есть ввести еще и зависимость среднего шима на моторах, скажем, от "D-составляющей")

Ну и в качестве "читерства" - последовательность поворотов на конкретной трассе известна - можно смещать середину датчика в нужную сторону заранее :) (А если еще и по временам прикинуть -вообще самолет будет :)))

Кстати, без шуток, такие конкурсы есть - в зачет идет лучшее время из трех кругов. Первый круг робот едет аккуратно, запоминая трассу, а потом давит на газ, предсказывая повороты.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: МикроЛайнТрейсер

Сообщение Radist » 13 окт 2010, 10:36

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

Увеличить скорость опроса датчиков тоже пробовал, более чем в 2 раза - на глаз разницы никакой.

Теперь про активное снижение мощности на поворотах. Приходила такая мысль. Но может я немного не так делал. Я делал возврат на линию более медленным (это когда бот на одном колесе кружит). По идее должно помочь, но на взгляд мало что изменилось, а время прохождения трассы увеличилось в процентном отношении прилично.

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

На трассе есть засечка старта - это можно и нужно использовать для позиционирования бота, это его точка отсчета. Вот мы пускаем пробный круг, с известной наксимальной скоростью. Одновременно робот включил у себя таймер. С датчика приходит информация о положении линии, робот распределяет шимы по колесам, таймер считает. То есть мы знаем когда какой шим нужен. Шим с отклонением датчика связан формулой, так что писать в логи можно только отклонение датчика. Прикинем наши возможности. Мозг - тини25, Озу 128 байт. Негусто. Длина трека 300 см, выделим 100 байт - через каждые 3 см пишем в память. Хотя не знаю что лучше писать - отклонение датчика или сразу шим. По идее лучше сразу шим. Первая проблема - как узнать что робот проехал 3 см? После записи логов пора действовать. Скорость увеличили (точнее увеличили ограничитель максимального шима, причем скорость возросла не прямопропорционально увеличению шима). Узнать насколько она возросла - вторая проблема. Теперь через каждые 3 см пути (проблема номер один встретилась нам второй раз) надо включать заранее определенный шим (при этом регулятор должен работать, чтобы вести бота по линии и не работать чтобы дать боту на линию взобраться, а это уже изобретательская задача и проблема номер три). Вроде бы все. Если в моих рассуждениях нет ошибки, то достаточно решить три проблемы.

Первый раз первая проблема решается просто - делаем круг, узнаем общее время прохождения. Вторым кругом пишем логи через 1/100 общего времени. Вторая проблема не решается в точных цифрах, но если понадеяться на то, что регулятор нам поможет, то можно считать что скорось увеличится прямо пропорционально (в первом приближении, потом этим параметром можно будет поиграть). Первая проблема второй раз значит тоже решается в примерных числах - прикидываем, какое время прохождения трассы мы ожидаем, потом если что подкорректируем. А вот третья проблема - это проблема. Хотя и она решается в примерных решениях. Выдаем шим из лога, делаем задержку работе регулятора, потом регулятор вступит в работу. Ясно, что эту задержку придется тоже подбирать. Однако три параметра подбирать, причем они завязаны друг на друга. И еще есть подозрение такое: ну вот чисто теоретически смог я допустим все подобрать - летает как ракета по трассе 1-34. А что будет на другой трассе? Будут ли подобранные значения подходящими? Вроде бы должны, но грызет червяк сомнения.

Вот такие получились рассуждения. Может я опять по своей привычке перемудрил и все гораздо проще? Прошу высказываться :)

Добавлено спустя 3 часа 56 минут 24 секунды:
До меня дошло, почему бот так себя на прямых отрезках ведет. Скорость тут не единственная причина. Когда он датчиком наезжает на угол - у него просто ширина линии растет. А поскольку он вычисляет центр масс линии, он и едет прямо, потому что центр масс смещается незначительно. В нормальном режиме линию видят 2 датчика, очень редко 3 датчика (между датчиками 10 мм). На таком вот хитром повороте сработают 4 датчика. Это и будет сигналом к возврату на линию. К счастью у меня ведется подсчет датчиков над линией - так я узнаю что я улетел с линии. Сегодня же вечером это проверю. Если все так - то работа практически окончена, можно будет приступать к съемкам фото и видео.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: МикроЛайнТрейсер

Сообщение Michael_K » 13 окт 2010, 10:39

Radist писал(а):Теперь про активное снижение мощности на поворотах.


по-моему, начать можно с простого
V = K * ABS(Xтекущая - Xпредыдущая)
V - средняя скорость (вернее ШИМ) движков
К - коэффициент (подобрать)
Xтекущая - Xпредыдущая - скорость смещения линии на датчике (то же, что и D-составляющая ПИДа)

Radist писал(а):управление с предсказанием

Опять же, начать можно с простого.
На первом круге считаем "крутые" повороты (там где, например линия сместилась больше чем на два сантиметра от центра датчика или совсем потерялясь).
Запоминаем их последовательность в терминах "налево", "направо", "налево", "опять налево" и т.п. даже без времен.
На следующем круге, смещаем условный центр датчика в нужную сторону...
то есть робот будет ехать, удерживая линию не посередине датчика, а например на левой половине датчика, если ожидает, что следующий "крутой" поворот будет направо. ПИД работает, как и работал, только со смещением.

Тогда он может быть не потеряет линию (у датчика есть "запас" в нужную сторону)
и попытается пройти поворот (да и всю трассу) по меньшим радиусам.
Фактически нужно "только" изобрести критерий "крутого" поворота, чтобы повторяемость была...
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: МикроЛайнТрейсер

Сообщение Radist » 13 окт 2010, 11:22

V = K * ABS(Xтекущая - Xпредыдущая)
V - средняя скорость (вернее ШИМ) движков
К - коэффициент (подобрать)
Xтекущая - Xпредыдущая - скорость смещения линии на датчике (то же, что и D-составляющая ПИДа)


Или я чего-то не понял, или в формуле ошибка. Если я еду по прямой и отклонения одинаково нулевые (или просто одинаковые) - то скорость получается нулевая?
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: МикроЛайнТрейсер

Сообщение Michael_K » 13 окт 2010, 12:18

Ой... :) ну не скорость, конечно, а дельта - на сколько скорость уменьшается :))
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: МикроЛайнТрейсер

Сообщение Radist » 13 окт 2010, 13:06

Тогда это получается D-регулятор. Ничего плохого про него сказать не могу, но не видел чтобы его использовали для лайнтрейса.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: МикроЛайнТрейсер

Сообщение Michael_K » 13 окт 2010, 14:04

У вас же уже есть D-составляющая, просто прикрутить ее еще и к скорости...
Чтобы при резких дерганьях линии, он пытался тормозить и, не спеша, разбираться :)
Может быть так удастся поднять среднюю скорость (за счет прямых или плавных участков)...
А может и нет... :pardon:
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: МикроЛайнТрейсер

Сообщение Radist » 14 окт 2010, 07:00

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

ЗЫ. Я хочу поучаствовать еще в одном оффлайн соревновании, скачал и распечатал трассу, провел пробный забег и...все плохо. У этой трассы радиус поворота раза в 2 меньше. Значит опять сидеть и подбирать коэффициенты. Вот еще одна мысль появилась: если добавить в бота код, который позволит менять максимальную скорость и коэффициенты, а также код, который будет проверять качество прохождения линии, то бот получится самообучаемым. Пока не знаю, сложно это или просто - надо подумать.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: МикроЛайнТрейсер

Сообщение Radist » 14 окт 2010, 11:41

Первая задача является частью второй задачи. Мысли по ней такие.

Для обучения я бы расширил линию старта/финиша, чтобы бот ее не пролетал. Бот стартует несколько раньше старта, потом делает 1 круг и останавливается. При каждом цикле опроса бот суммирует модули отклонений от линии и ведет учет времени в этих циклах опроса. То есть на финиш в еепроме он привозит два числа: накопленный модуль отклонения и число циклов опроса. Мы должны стремиться уменьшить оба этих числа.

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

Поначалу дифференциальная составляющая обнулена, пропорциональная мала. Пуск робота на прямом участке - он едет прямо до поворота, не вписывается в него, теряет линию, останавливается. Несколько пусков - и он уже не теряет линию и делает свой первый круг. Получаем суммарное отклонение и время в циклах. Продолжает увеличивать коэффициент пропорциональности, после финиша сравнивает результат. Если есть улучшение - продолжает рост коэффициента пропорциональности. В какой-то момент станет хуже - робот прошел точку минимума. Он уменьшает коэффициент пропорциональности, увеличивает коэффициент дифференциальный (шаг уменьшения и шаг увеличения тоже задаются заранее). Ну и по прежнему контролирует качество прохождения. Снова добивается минимума. Потом чуть увеличивает скорость (шаг изменения скорости задан заранее). При этом время прохождения уменьшится, а сумма отклонений возрастет. Надо сделать шаг вправо/влево и посмотреть в какую сторону есть смысл двигаться. Двигаться в ту сторону до достижения минимума отклонения/времени прохождения. Потом снова увеличить скорость. В конце концов увеличение скорости приведет к тому, что либо дойдем до конца (100% шим), либо не сможем получить результаты лучше, чем были получены при меньшей скорости. Это критерий конца настройки, бот останавливается и мы считываем из его еепрома максимальную скорость и коэффициенты. Естественно для бота будут две программы: обучение и соревнование. А визуально это будет выглядеть так: робот себе катается, постепенно увеличивая скорость, нарезает круги, потом останавливается - и готово.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Пред.След.

Вернуться в Line Tracer

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5