Технический форум по робототехнике.
Radist » 21 авг 2010, 15:51
Ну вот наконец-то есть продвижка в деле лайнтрейса. Собрал тележку, колеса - колесики прокрутки мышиные, моторчики уже помощнее, прижим валов нормальный. Тестовые пуски показали отличную скорость - около 1 м/с, разворот на 360 градусов на одном колесе около секунды. Нарисовал примерную трассу на А1, меньше зачетной (1-34). Перед пуском у меня производится калибровка датчиков. В общем вплотную подошел к разработке алгоритма. Первый алгоритм был простейший (нетерпелось посмотреть, как робот пройдет пробную трассу) - каждой комбинации датчиков сопоставляется комбинация шимов для моторов. Плохой алгоритм - робот с трудом проходит трассу. У меня сигналы от трех датчиков заведены на ацп, время получения информации от всех датчиков около 330 мкс. И хотя робот за это время проезжает мало - то ли он не успевает получить информацию, то ли инерция не позволяет. В общем это больше пост-отчет, буду писать сюда о своих дальнейших успехах/неудачах.
Michael_K » 21 авг 2010, 16:18
наверняка просто из-за инерции. метр в секунду - это много...
имхо, проще начинать с надежного захвата линии, а уже потом скорость поднимать.
Radist » 21 авг 2010, 22:09
Пробую сейчас алгоритм с одним датчиком. Датчики от ведущих колес расположены недалеко (робот маленький), даже на малой скорости датчик по дуге перемещается очень быстро. Приходится искусственно ограничивать скорость. Сейчас она 10 см/с, это значит трасса 1-34 за 30 секунд. Позорище.
Добавлено спустя 26 минут 5 секунд:
Вернулся к предыдущему алгоритму - зря его ругал, нашел ошибку в коде (когда копипастил - не сменил одно число на другое), а это была переменная, которая говорила с какой стороны линия находится. Сделал круг гораздо быстрее - и тут сел аккумулятор. Технологический перерывчик.
Добавлено спустя 1 час 16 минут:
Зарядил аккумулятор и узнал еще одну очевидную вещь - при разном напряжении питания моторчики крутят по разному. На свежем аккумуляторе у меня опять стал улетать с трассы. А ставить стабилизатор в моем случае не выгодно: моторчики на 3В, аккумулятор полностью заряжен 4.2 В, разряженный 3 В.
boez » 21 авг 2010, 23:52
Чего за аккумулятор? Литий? 3 вольта быстро его убьет, ниже 3.5 не разряжай.
Radist » 22 авг 2010, 00:00
он самый. увлекаюсь - не до вольтметра. У меня запасной есть
Radist » 23 авг 2010, 12:40
Попробовал реализовать ПД алгоритм, но пока не получается. В целом я его понимаю, но реализовать пока не могу - целиком со всеми деталями он пока не влезает в мой мозг. Пока что написал программу по другому алгоритму (проверять буду после работы). Суть алгоритма в следующем:
- если робот находится на центре линии - он разгоняется до определенного максимума
- если робот начал съезжать с линии - он начинает тормозить обоими колесами (вычитая заранее заданные числа, для каждого колеса свое, но не ниже заранее заданного предела)
- если робот съехал с линии еще сильнее - он теряет скорость еще быстрее (другие коэффициенты)
- если робот потерял линию, он знает с какой стороны она осталась и будет крутиться на колесе, в надежде поймать линию.
- если робот возвращается на линию - эти коэффициенты начинают прибавляться, происходит разгон до максимума.
Для настройки задействовано 14 коэффициентов. Вроде мысль здравая - на повороте снижать скорость, проходить поворот на пониженной, а потом снова увеличивать скорость.
Radist » 23 авг 2010, 20:40
Пробные заезды показали, что алгоритм в целом работает. Но из-за больших коэффициентов робот сильно крутит башкой, а значит все время проводит в поворотах при небольшой скорости. Буду уменьшать шаг (много меньше 1), сейчас у меня за цикл происходит изменение на 1 за 330 мкс, то есть алгоритм выродился в однодатчиковый. Но по крайней мере перестал терять линию.
ЗЫ. Стартовая полоска на трассе вносит юмор. При переезде через нее робот делает пируэт - оборот вокруг оси и едет дальше. Иногда может развернуться и поехать в другую сторону. Ну это мы со временем поправим.
Radist » 25 авг 2010, 08:44
Возня с коэффициентами позволила немного улучшить результат (стало 15 секунд вместо 18), но робот едет "змейкой". Сейчас думаю сделать мат. модель робота (она будет зависеть от сцепления колес с поверхностью и от напряжения питания, но за питанием я могу следить сам, а полигон для гонок будет всегда один и тот же). Для получения мат модели нужно узнать скорости при разных шимах, а также радиусы поворотов и угловые скорости для разных шимов (при условии что второе колесо стоит).
Michael_K » 25 авг 2010, 11:47
чтобы робот не вихлялся, однозначно нужен ПИД,
то есть вводить дифференциальную составляющую.
Последний раз редактировалось
Michael_K 25 авг 2010, 13:56, всего редактировалось 1 раз.
Radist » 25 авг 2010, 12:40
Это то понятно, просто сам я еще не могу до конца продумать алгоритм, не вмещается он мне пока в мозг, а поучиться у кого - так не могу найти в инете ничего про ПИД лайнтрейсера. Классический ПИД для печки мне понятен - я с этим по работе много сталкивался. А тут....
Поначалу я думал чтобы управляющим воздействием была бы разность шимов левого и правого колес (тогда интегральная составляющая не нужна), сейчас уже сомневаюсь. Думаю что для каждого колеса надо ПИДом рассчитывать свой шим. С пропорциональной составляющей все понятно, умножаем на отклонение и все. С интегральной уже не все понятно - ну будем суммировать отклонения от центра и делить на время интегрирования. Этот процесс очень медленный, а ситуация на трассе меняется очень быстро. Может и не нужна интегральная составляющая? И уж совсем непонятно что делать с производной. Я думаю, что надо вести учет времени между событиями изменения отклонения.
Я со временем собираюсь опробовать разные алгоритмы, надеюсь что дойду и до ПИДа. А сейчас практический вопрос, касаемый мат модели. Мотор начинает крутить колесо не с нулевого шима - это очевидно. Робот с танковым поворотом может развернуться на одном колесе - это минимальный радиус разворота. А вот как получить другие радиусы разворота? По идее разный шим на колеса - вот и большие радиусы. Но из-за того, что шим работает не с нуля - получается что робот может ездить не по всем возможным радиусам, больше минимального?
Michael_K » 25 авг 2010, 13:15
на входе - отклонение линии от центра.
на выходе разность ШИМ-ов
интегральная - не нужна.
дифференциальная - чтобы предсказывать.
На времена забить - все равно коэффициенты подбирать будете.
после расчета разности ШИМ-ов по ПИДу можно скорректировать ее в соответствии с кривизной движков.
скорее всего просто смещение прокатит...
не нужно сильно бояться, что один движок "перекручивает"...
отрегулированный ПИД найдет точку стабилизации
(даже если она будет не строго по центру).
Добавлено спустя 2 минуты 55 секунд:
про радиусы - что-то у вас не клеится.
Шим-то "работает" не с нуля, но скорость-то "работает" с нуля!
Добавлено спустя 3 минуты 48 секунд:
вообще построение модели - дело гиблое на практике.
Прежде всего потому, что параметризовать вы ее нормально не сможете.
Ну то есть как вы, например, собираетесь измерить момент инерции движка с колесом,
или зависимости момента от шима и скорости? Чисто теоретическая модель возможна, только она вам слабо поможет в выборе коэффициентов...
Radist » 25 авг 2010, 14:34
Спасибо за ответ. Но вопросы еще остались.
Все еще не понимаю как прикрутить дифференциальную составляющую. Знаю про нее, что это производная отклонений (ошибки, рассогласования). Производную умножить на коэффициент я смогу, вопрос в том как получить эту производную. Грубо говоря, производная - это отношение отклонения ко времени (d/dt), в нашем случае это конечная разность. Отсюда мое предположение о подсчете времени. Если забить на время - как посчитать дифференциальную составляющую?
Дальше: вот мы получили разность шимов $30. А сколько должно быть на каждом колесе? Пар подходящих значений очень много.
Шим не с нуля, а скорость с нуля - у меня не получилось подобрать такой шим, чтобы скорость была черепашьей. Он гудит, но не крутит. А когда хватает силы сдвинуться - скорость уже не близкая к нулю.
А насчет модели: согласен, там все сложно. Ну получу я данные, а что с ними делать потом. Я думал по простому: нахожу шим, при котором вписываюсь в повороты без виляний, как только схожу с линии - включаю поворот, пока снова на линию не вернусь. Может быть я откажусь от этой идеи, особенно если дойдет как дифференциальную составляющую считать.
Michael_K » 25 авг 2010, 15:06
1. Вычесть старое отклонение из нового...
то есть у вас в ПИДе должен был бы быть компонент dX/dT * Kd = dX * (Kd/dT).
Какая вам разница что подбирать Kd или (Kd/dT)? Поэтому время можно выкинуть.
2. Ну скорость-то тоже как-то задать надо. Он вам и стоя на месте может линию "ловить"
3. Это просто из-за разницы трения покоя и трения качения. Фактически график скорости от момента имеет гистерезис между нулем и моментом страгивания.
Подбирать коэффициенты достаточно просто.
1 - подбираете П, так чтобы линию не терял.
2 - добавляете Д потихоньку (и немного уменьшаете П), так чтобы рысканья снизить (ну и чтоб линию по прежнему не терял)
3 - потихоньку поднимаете скорость, корректируя коэффициенты... При необходимости можно уменьшить Д, приподнять П и первые шаги еще раз повторить...
Как-то так... итерационно. А считать здесь сложно - зависимости неизвестные и нелинейные.
В нормально настроенном ПИД рысканья должны быстро затухать... Если он вообще не рыскает, а плавно выходит на линию - это обычно значит, что скорость можно немножко поднять.
Radist » 25 авг 2010, 18:03
Еще раз огромное спасибо, эти крупицы знаний для меня бесценны.
Хочется уточнить один момент, перед тем как начну программить. Опять про дифференциальную составляющую. Для меня физический смысл производной - это тангенс угла наклона касательной к графику. А тангенс - отношение противолежащего катета к прилежащему. Противолежащий катет - наше отклонение, у меня оно 0 - на линии, 1 и 2 - две степени отклонения, 3 - потеря линии. Прилежащий катет - это время. Если отклонения сменяют друг друга быстро - тангенс больше, если медленно - тангенс меньше. Хотя чувствую, что лезу в дебри. Конечные разности (цифровые аналоги производных) считают как разность между отсчетами. Пока писал - сам все понял
. Сам себя запутал.
Теперь наступило прояснение в голове, основной алгоритм я понял, приступаю к реализации.
Radist » 29 авг 2010, 00:46
Программу я написал, ошибок конечно много выловил. Но в целом ПД регулятор работает. Но только на низкой скорости, и вихляние все равно очень сильное. Коэффициенты я несколько дней подбирал, проверил много пар чисел, выбрал самую лучшую пару, но все равно не фонтан. Я грешу на малое количество датчиков, у меня всего 3, а у прототипа их было 6. У меня что: 1,2 и потеря линии. И в другую сторону тоже самое. Есть еще одна идея. У меня расстояние между датчиками 15 мм, ширина линии 20 мм. Значит 1 мы имеем при сдвиге 5 мм, 2 - при сдвиге 10 мм, 3 - при сдвиге 25 мм. Так может вместо чисел 1,2,3 использовать числа 1,2,5?
ЗЫ. Пока с вихляниями ездит на шиме 40 из 256