Содержание
Одним из часто встречающихся видов соревнований является соревнование “Движение робота вдоль черной линии”. В последнее время активно развивается робототехника, открывается множество кружков. Как следствие проводится множество соревнований и конкурсов по робототехнике различного уровня. Это направление называется соревновательная робототехника.
Это соревнование проводится в разных номинациях и категориях. Есть движение по широкой линии (5 см), по узкой линии (1,5 см), включают в движение по линии участки с прерывистой линией. Часто еще используется объезд роботом препятствий (например объезд кирпича) или преодоление препятствий (например, качающийся мост). После преодоления препятствий робот должен вернуться на линию и успешно финишировать.
Так как сейчас есть много типов робототехнических конструкторов, то соревнования также разделяют по категориям. Т.е. движение по линии Lego EV3, отдельно движение по линии Arduino и т.д. Побеждает робот, преодолевший дистанцию за минимальное время не потеряв трассу.
Есть несколько основных алгоритмов движения робота вдоль черной линии с использованием различных типов регуляторов:
Можно использовать эти алгоритмы с применением одного, двух, трех и даже четырех датчиков цвета. Количество применяемых датчиков зависит от сложности соревнований и каждый раз подбирается индивидуально..
Робот EV3 не обладает зрением и может воспринимать информацию о линии при помощи датчика цвета EV3.
Робот и человек по разному видят черную линию. У человека границы черного и белого четко различимы. Робот же видит размытую картину границы черного и белого. Для того, чтобы более точно определить линию, датчик робота должен быть расположен на границе черной линии и белого поля посередине.
При этом высота расположения датчика над линией должна быть около 1 см. Но это рекомендуемая высота. На соревнованиях встречаются различные варианты расположения датчика и подбираются они участниками индивидуально.
Для того, чтобы применить указанные алгоритмы нужно откалибровать датчик цвета на реальном поле. Есть два способа калибровки:
Датчик работает в режиме отраженного света. Суть метода состоит в том, что мы находим пороговое значение белого и черного цвета.
На практике нужно измерить значение белого цвета, затем черного цвета, суммировать их и разделить на два. Т.е. если обозначить пороговое значение буквой C, значение белого цвета буквой A и значение черного цвета буквой B, то формула будет выглядеть следующим образом:
С = ( A + B ) / 2
Измерить значение белого и черного цвета можно просто поочередно расположив датчик над белой и черной линией и записать значения.
В ручном режиме делается это просто, при помощи меню, расположенном на экране блока Lego EV3. Для этого нужно на экране блока EV3 зайти в третью вкладку и открыть первое приложение из пяти. Это приложение называется представление порта.
Здесь можно быстро посмотреть к какому порту присоединены датчики или сервомоторы. При помощи кнопок управления микроконтроллером EV3 нужно перейти к любому из занятых портов, и тогда можно посмотреть текущие показания, которые в данный момент получены с сенсоров или сервомоторов.
Чтобы посмотреть или изменить текущие настройки для установленных сервомоторов и сенсоров нужно нажать центральную кнопку. Нажатие кнопки «Назад» возвращает нас в основное окно приложений.
Для примера установлю датчик цвета в порт под номером 3 и сниму показания на белом поле.
На экране блока EV3 отобразилось показание в 43 условных единицы. Таким же образом определяем показания датчика на черной линии. Например показания будут 3 условных единицы. Подставляем эти значения в формулу.
С = ( A + B ) / 2 = (43 + 3) / 2 = 46 / 2 = 23
В результате получаем пороговое значение 23 условных единицы.
Таким же точно образом измеряем пороговое значение (его еще называют значение серого) при автоматической калибровке, но на этот раз значение записывается в переменную. Назовем переменную, например, porog. В среде программирования Lego EV3 пишем программу для калибровки.
В первой части программы нужно расположить датчик над белым фоном. Датчик касания расположен в 1 порту. В программе используется блок ожидания действия с датчиком касания. В данном случае установлен параметр “щелчок” — цифра 2 в нижней части блока ожидания. Т.е. нужно нажать и отпустить кнопку датчика.
После этого датчик цвета в режиме отраженного света измеряет значение белого цвета и значение записывается в переменную A.
Во второй части программы нужно расположить датчик над черной линией и также нажать на кнопку датчика касания. Значения черного цвета записываются в переменную B.
В третьей части программы мы считываем значения датчиков из переменной A и B и передаем их значения в блок математики, который находится в режиме “Дополнения”. В этом блоке происходит вычисление по формуле С = ( A + B ) / 2 ирезультат вычисления записывается в переменную С.
Теперь значение переменной С можно использовать в качестве порогового значения серого для дальнейшего использования в алгоритмах движения по линии.
Фрагмент соревнований по робототехнике «Движение по тонкой линии». Также это соревнование называют «Тонкий Триал». Этот очень быстрый робот в номинации роботов Arduino является победителем региональных соревнований.
По условиям соревнований робот Arduino должен совершить объезд кирпича и преодолеть качающийся мост. После преодоления препятствий робот должен вернуться на линию и финишировать не сойдя с трассы. Тонкий триал есть и в категории Lego EV3 роботов.
Главная → Робототехника → Лего
Схемы роботов (12)
Схемы роботов лего Lego mindstorms для соревнований. Инструкции по сборке роботов ev3 и nxt
Движение и повороты EV3 Линейный алгоритм. Программирование движения вперед, назад, повороты робота EV3. |
Циклические алгоритмы Ev3. |
Программирование кегельринга для ev3 Программа для EV3 для соревнований кегельринг. |
Условные алгоритмы. Переключатели в Ev3 Программирование условий для Ev3. Переключатели |
Сумо лего Соревнование сумо лего. Программа для Сумо ev3 |
Движение по черной линии Ev3 Программа для движения робота Ev3 вдоль черной линии. Логические операции Ev3. |
Переменные в lego Ev3 Использование перменных в Lego Ev3 калибровка датчиков. Как задать и использовать переменные в Ev3. |
Собственные блоки ev3 Собственные блоки ev3 |
Программа для прохождения лабиринта Ev3 Использование собственных блоков для написания программы для Ev3 прохождения лабиринта |
Движение по черной линии с одним датчиком Алгоритм и программа для движения робота ev3 по черной линии с одним датчиком |
Движение робота по черной линии до перекрестка Движение робота ev3 по черной линии до перекрестка |
Блок Математика в ev3 Блок Математика в ev3 математические операции в программах lego ev3 вывод информации на экран блока ev3 |
Линейный регулятор ev3 для движения по черной линии Алгоритм линейного регулятора для движения по черной линии. Программа для Ev3 движения по черной линии с помощью линейного регулятора |
Пропорциональный регулятор ev3 с двумя датчиками Алгоритм линейного пропорционального регулятора с двумя датчиками для робота ev3 при движении по черной линии |
Простой способ научиться создавать собственного робота, следящего за линией, с помощью ПИД-регулятора без каких-либо математических выражений, которые вы найдете в большинстве учебных пособий. Код включен!
Первое, о чем вы подумали после того, как распаковали свой LEGO Mindstorms, это построить первого робота, и сразу после этого вы хотели бы заставить его двигаться по линиям, не так ли?
Слежение за линией — одна из наиболее распространенных проблем промышленных роботов и одно из самых полезных приложений, поскольку оно позволяет роботу перемещаться из одной точки в другую для выполнения задач.
Есть несколько способов создания следящего за линией, один из которых я вам объясню, это использование датчика освещенности. Как вы знаете, наборы Mindstorms и EV3 поставляются с небольшим датчиком освещенности, который способен считывать отраженный свет, помимо видения цветов. В этом уроке я объясню, как выполнять следование по линии с помощью всего одного датчика. Чем больше у вас датчиков, тем лучше и быстрее робот сможет следовать за ним.
Итак, первым делом соберите себе маленького робота, похожего на Track3r, либо с колесами, либо с гусеницами. Вы можете скачать инструкции, предоставленные LEGO. Это простая конструкция.
Или создайте его на основе одной из моделей LEGO Education…
Что бы вы ни строили, просто старайтесь, чтобы расстояние между колесами было минимальным… потому что чем больше расстояние, тем труднее роботу повторять повороты на линии.
Хорошо, готовы? Время кодировать. Позвольте мне объяснить, как мы приходим к «лучшему» решению, с помощью ряда промежуточных шагов, которые помогут вам лучше понять его.
Хорошо, робот готов. Но прежде чем приступить к кодированию, нам нужна линия, по которой будет двигаться робот. Если у вас есть Mindstorms NXT 2.0, у него есть коврик с большой линией в виде эллипса, который отлично подходит для этих задач.
Но если ты не будешь так же, как я. Я использовал черную ленту и пальцем приклеил ее к полу, создавая непрерывный путь, по которому будет следовать робот. Вам не нужен замкнутый контур (хотя это хорошая идея) .
Мой пол сделан из мрамора, который иногда бывает белым и коричневым, и даже с этим он работает. Так что это может сработать и на вашем, если только у него не будет еще меньше контраста, чем у меня.
Очень важно сначала понять проблему следования за строкой. Итак, опишем проблему.
У нас есть толстая черная линия на белой поверхности, и мы хотим, чтобы наш робот двигался по этой линии как можно быстрее. Верно? Ну, первое, что нам нужно понять, это то, что мы не хотим следовать линии (wtf?!)…
Нет, серьезно, мы идем не по линии, а по ее границе в так называемом левостороннем подходе.
Мы хотим следовать линии, где 50% белого и 50% черного.
Итак, следующий шаг — определить, что здесь черное, а что белое. Надеюсь, у вас есть четкое представление об этих двух цветах, но, к сожалению, у вашего робота их нет. Поэтому лучшее, что вы можете сделать, прежде чем начинать что-либо еще, — это откалибровать робота.
Хорошо, как вы знаете, датчик цвета также может работать как датчик освещенности, поэтому мы выбираем режим измерения отраженного света и собираемся сохранить в двух переменных белый и черный цвета.
Значение отраженного света — это просто число от 0 до 100, обозначающее количество света, получаемого сенсором.
Таким образом, псевдокод будет
. функция КАЛИБРОВКА напечатать "БЕЛЫЙ?" Подождите, пока датчик касания изменится белый = считывание датчика освещенности напечатать "ЧЕРНЫЙ?" Подождите, пока датчик касания изменится черный = считывание датчика освещенности выполненная функция
Вы поняли? Мы добавляем сенсорный датчик к нашему роботу для записи значения освещенности, вы также можете сделать это с помощью кнопок Brick, как вам удобнее.
Вот код EV3, который я использовал для него
Итак, идея состоит в том, что вы кладете его на белую поверхность, нажимаете сенсорный датчик, кладете его теперь на черную поверхность и снова нажимаете сенсорный сенсор, теперь у нас есть белые и черные показания и можно приступать к работе.
Я делаю это каждый раз, когда запускаю робота, но вы можете спокойно игнорировать это, пока условия освещения остаются стабильными.
Хорошо, у нас есть робот, у нас есть данные калибровки… давайте перейдем к коду. Маааааааааааааааа! Плохой!
Давайте сначала подумаем, что мы будем делать. Давайте начнем с самого простого способа (и, возможно, худшего) следования за строкой.
Ставим робота на линию, получаем показания если ниже середины (черно-белое) двигаемся в одну сторону а если выше то двигаемся в другую сторону. Простой? Умный?
Давайте еще раз посмотрим на псевдокод
программа СЛЕДОВАНИЕ ЗА ЛИНИЕЙ белый = 0, черный = 0 КАЛИБРОВАТЬ() середина = (белый - черный) / 2 + черный повторить значение = чтение датчика освещенности if value
Идея довольно проста: сделать так, чтобы одно колесо вращалось быстрее другого. Вот как это работает.
Вот программа EV3
(Вы можете скачать все исходники внизу страницы)
Работает? Ну… да… в какой-то момент. Если угол достаточно ступенчатый, робот его пропустит, и, как вы можете видеть, он пропускает прямую и начинает колебаться вокруг нее.
Почему? Поскольку у нас есть только два состояния, то робот либо поворачивает налево, либо поворачивает направо. Что мы можем сделать? Точно… добавьте дополнительное состояние, чтобы оно шло прямо. Итак, у нас есть левое, прямое и правое… поэтому, если мы хотим улучшить его еще больше, мы могли бы добавить еще больше состояний, крайний левый, левый, немного левее, прямо, немного правее, правее, крайний правый и так далее. …
Так почему бы не сделать поворот пропорциональным ошибке, разнице между средней точкой и прочитанным значением.
Нравится ли вам математика? Я не. У меня есть глубокое понимание их, но я действительно не могу выдержать сложный способ объяснения простых вещей… поэтому позвольте мне объяснить вам P-контроллер без каких-либо математических обозначений.
Если вы будете следовать рассуждениям о контроллере включения / выключения с несколькими состояниями, вы можете в конечном итоге подумать о контроллере с бесконечными состояниями, каждое из которых имеет значение, пропорциональное ошибке, разнице между тем, где мы хотим, чтобы робот был и где это на самом деле.
Если вы хотите, чтобы что-то было пропорционально количеству, вы просто умножаете оба коэффициента, так что у нас есть
сколько повернуть = Kp * (средняя точка - показания датчика освещенности)
Где K — константа, помогающая нам настроить P-регулятор. Чем больше Kp, тем выше будет поворот при возникновении ошибки, но если Kp слишком велик, вы можете обнаружить, что робот чрезмерно реагирует и что он неуправляем.
На этом видео вы можете посмотреть, что происходит, когда вы меняете значение Kp с 0 на 10.
Итак, начните с 1.
Итак, наш P-контроллер будет похож на этот псевдокод
программа СЛЕДОВАНИЕ ЗА ЛИНИЕЙ белый = 0, черный = 0 КАЛИБРОВАТЬ() середина = (белый - черный) / 2 + черный кп=1; повторить значение = чтение датчика освещенности коррекция = kp * (средняя точка - значение) Поверните двигатели B+C путем коррекции сделано повторить готовая программа
Если вы не используете модуль EV3, просто переместите один мотор на значение + коррекция, а другой мотор на значение — коррекция.
(Вы можете скачать все исходные коды внизу страницы)
Начните с Kp=1 и запустите своего робота. Если робот не может выполнять повороты на линии, увеличьте Kp, если, с другой стороны, ваш робот резко поворачивает на линии, уменьшите значение Kp. Чем больше эффект, тем больше нужно изменить Kp. Просто продолжайте играть…
П-регулятор имеет две проблемы, которые можно «легко» решить с помощью полного ПИД-регулятора: во-первых, он будет колебаться после корректировки, а во-вторых, есть небольшая ошибка, которая является прямой результат P-контроллера.
Итак, давайте посмотрим на полный ПИД-регулятор.
ПИД-регулятор — это, по сути, П-регулятор с двумя другими компонентами: интегральной частью и производной частью.
Не бойся. Позвольте мне объяснить общую идею, и мы перейдем к псевдокоду.
Это именно та часть, которую мы только что видели выше.
Идея целочисленной части заключается в том, что ошибка должна стремиться к нулю в течение определенного периода времени. Я избегаю очень уродливого математического выражения, объясняющего это… но имейте в виду, что, поскольку вы работаете внутри цикла, мы можем написать
интеграл = интеграл + ошибка
Таким образом, после ряда взаимодействий мы хотим, чтобы это было равно нулю . Почему? Поскольку мы хотим исправить ошибку, единственный способ, чтобы робот оказался точно посередине между черным и белым, состоит в том, что эта часть ПИД-регулятора также равна нулю.
Таким образом, наш контроллер будет похож на
контроллер = kp * ошибка + ki * интеграл
Как вы можете себе представить, единственный способ обнулить целую часть — это отменить ошибку, применив другую отрицательную ошибку. Таким образом, робот будет двигаться из одной стороны в другую от средней точки, чтобы отменить ошибку и оказаться точно в средней точке.
Заключительной частью ПИД-регулятора является производная часть. Если мы можем думать о интегральной части как о памяти контролера, то производная часть подобна экономисту, который смотрит в будущее и пытается угадать его, основываясь на прошлых ошибках.
Итак, если мы знаем последнюю ошибку и знаем фактическую ошибку, мы можем вычислить, какой будет следующая ошибка. Таким образом, производная часть ПИД-регулятора поможет контроллеру быстрее исправить ошибку.
Одна из проблем производной части заключается в том, что она очень чувствительна к шуму в сигнале контроллера (наш детектор света), поэтому, если сигнал зашумлен, она может не оценить правильную ошибку. И да, датчик освещенности довольно шумный 🙂
Итоговый ПИД-регулятор такой…
ошибка = середина - значение Turn = kp * ошибка + ki * интеграл + kd * производная
Итак, это псевдокод для этого ПИД-регулятора
программа СЛЕДОВАНИЕ ЗА ЛИНИЕЙ белый = 0, черный = 0 КАЛИБРОВАТЬ() середина = (белый - черный) / 2 + черный кр = 1, ки = 1, кд = 1 последняя ошибка=0 повторить значение = чтение датчика освещенности ошибка = середина - значение интеграл = ошибка + интеграл производная = ошибка - последняя ошибка поправка = kp * ошибка + ki * интеграл + kd * производная Поверните двигатели B+C путем коррекции последняя ошибка = ошибка сделано повторить готовая программа
Ну, я не буду настоящим ботаником, если не покажу вам безумное математическое описание.
Насколько хорошо это работает?
Разочарован? Продолжайте читать…
Итак, вот код EV3 для ПИД-регулятора.
А вот и файл EV3…
[sociallocker]
Загрузите исходный код контроллера включения/выключения EV3, P-контроллера и PDI-контроллера.
Исходный код EV3 для контроллера PDI
Этот исходный код доступен для вас бесплатно по Стандартной общественной лицензии GNU 3, которую вы можете прочитать здесь. По сути, вы можете свободно копировать, изменять, распространять его, если вы уважаете эти свободы в отношении изменений, которые вы внесли сами.
[/sociallocker]
Хорошо, понятно? Теперь возникает большая проблема… каковы наилучшие значения для kp, ki и kd?
Ну… опять же, я сохраню вам все его математическое представление. Итак, после прочтения Википедии и прочтения о различных подходах, я думаю, что тот, который лучше всего подходит для наших задач, это эвристический подход.
Итак, копирование из Википедии: «Если система должна оставаться в сети, один из методов настройки состоит в том, чтобы сначала установить значения K_i и K_d на ноль. это значение для отклика типа «затухание амплитуды на четверть». Затем увеличивайте K_i до тех пор, пока любое смещение не будет скорректировано за достаточное время для процесса. Однако слишком большое значение K_i вызовет нестабильность. Наконец, увеличьте K_d, если требуется, до тех пор, пока контур не станет приемлемо быстрым для достижения своего эталонного значения после возмущения нагрузки
Однако слишком большое значение K_d вызовет чрезмерную реакцию и перерегулирование. Быстрая настройка контура ПИД-регулятора обычно слегка зашкаливает, чтобы быстрее достичь заданного значения; тем не менее, некоторые системы не допускают перерегулирования, и в этом случае требуется замкнутая система с избыточным демпфированием, для которой потребуется установка K_p, значительно меньшая, чем половина значения K_p, которое вызывало колебания».
Понятно? , я здесь, чтобы помочь вам.
Просто установите Kd и Ki на 0. Установите Kp на 1 и запустите робота. Он следует по линии плавно? Нет, попробуйте уменьшить его наполовину? Может ли он по-прежнему следовать по линии? Нет, увеличьте его немного… продолжайте изменять, пока робот не будет двигаться по прямой линии без колебаний.0005
Затем немного увеличьте Ki и проверьте, стало ли оно более плавным? Да, увеличить еще немного… работает ли он хуже… так что немного меньше…
Наконец, установите Kd на 1 и проверьте, как быстро робот теперь следует по линии? Слишком нестабильно, уменьшите…
Повторяйте, пока не будете довольны.
Одного видео более чем достаточно, чтобы увидеть это 🙂
Вот и все, ребята.
Надеюсь, вам понравилось обучение так же, как и мне. Не пропустите мой пост о самобалансирующемся роботе, который я построил с помощью гироскопа, который я только что получил от LEGO. Знаете ли вы, что я веду канал на Youtube с почти ежедневными обзорами LEGO и HOWTO? Пожалуйста, подпишитесь на The Technic Gear LEGO Reviews
Download Mindstorms EV3 PID Controller.
[sociallocker]
Исходный код EV3 для ПИД-регулятора
Этот исходный код доступен бесплатно в соответствии с Стандартной общественной лицензией GNU 3, которую вы можете прочитать здесь. По сути, вы можете свободно копировать, изменять, распространять его, если вы уважаете эти свободы в отношении изменений, которые вы внесли сами.
[/sociallocker]
спросил
Изменено 6 лет назад
Просмотрено 4к раз
Я хотел проверить, смогу ли я управлять своим роботом с помощью ПК, и хотел узнать, есть ли способ сделать это. Я уже искал контроллер для ПК и ничего не нашел.
Ваш EV3 позволяет отправлять роботу прямые команды с ПК. Он предлагает три протокола связи: USB (требуется провод), Bluetooth и Wi-Fi (требуется ключ). Вы можете запускать программы, управлять моторами, считывать данные с датчиков, воспроизводить звук, менять цвета светодиодов, имитировать нажатия кнопок и так далее. Для передачи файлов следует использовать системные команды, которые имеют другую структуру.
Коммуникация не зависит от языка программирования, учитываются отправленные и полученные данные. Если ваш любимый язык программирования поддерживает протокол связи, вы можете его использовать. Вам не нужно начинать с нуля, существует код на разных языках программирования.
Подробную информацию о прямых командах вы найдете в этом блоге: EV3DirectCommands
Посмотрите этот проект на GitHub https://github.com/BrianPeek/legoev3 Он использует библиотеки .