Робо-состязания: базовые навыки по программированию роботов Следы NiNoXT в Галактике / 30.09.2012 Когда учащиеся проходят некоторый базовый курс обучения, то встает вопрос, что изучать дальше, какие навыки будут необходимы для участия команд в робо-состязаниях. В ходе Летнего Робототехнического лагеря - 2012, вырисовалась примерная схема, как можно, шаг за шагом, готовить команды, на каких задачах их можно тренировать.Итак, ниже представлен план, по которому происходила тренировка команд в лагере. Данный план может быть легко адаптирован под нужды учебного процесса в кружке или урока информатики. Причем он достаточно универсальный - не опирается на какой-то отдельный язык программирования - задания в нем могут быть выполнены, как на NXT-G, так на Robolab, а также и на RobotC, LabView и NXC. Простейший релейный регулятор для движения вдоль линии. Начать решать задачу можно издалека - сначала реализовать линейный алгоритм: двигаться вперед с поворотом влево до белого, затем с поворотом вправо до черного. Линейный алгоритм можно легко преобразовать в разветвленный алгоритм - в котором условие срабатывания будет все то же - численное обозначение границы черного и белого. Оптимизация движения рывками - вводим дополнительное условие в алгоритм из предыдущего пункта, когда тележка может двигаться исключительно прямо. В итоге, имеем алгоритм, состоящий из трех веток. Теперь без практической реализации обсуждаем, что можно вводить и дальнейшую оптимизацию - 5 веток, 7 и т.д. В каждой из веток угол поворота робота (энергия, подаваемая на моторы) будет свой. Т.е. мы показываем, что показания на датчике освещенности непосредственно влияют на мощность, подаваемую на каждый мотор. На графике объясняется, что значение мощности прямопропорционально показанию датчика: мотор А: чем больше освещенность, тем больше мощность; мотор B: чем больше освещенность, тем меньше мощность. Благодаря предыдущему пункту появляется видение, что должна быть формула, по которой можно было бы рассчитывать мощность на моторе. Прежде чем перейти к пропорциональному регулятору, нужно ввести и объяснить понятие "ошибка" - отклонение от среднего, ожидаемого показания на датчике. Следовательно, нужно рассказать, что является "средним" показанием, как его вычислить в случае откалиброванного, а затем и неоткалиброванного датчика. Теперь можно вводить понятие коэффициента пропорционального регулятора, как он зависит от "среднего" показания, как вычислить коэффициент, зная максимальные/минимальные показания датчика и максимальную/минимальную необходимую скорость. Мощность мотора А = Средняя мощность + Ошибка * Коэффициент Мощность мотора B = Средняя мощность - Ошибка * Коэффициент Отдельно обсуждаем требования, которым должна удовлетворять конструкция тележки для правильной работы формул выше: между датчиком и точками соприкосновения колес с полем должен быть равносторонний треугольник; датчик должен располагаться на оси симметрии робота. Некоторые роботы не будут успевать среагировать выезд за линию - советуем снизить скорость. Если есть время, то на практике, иначе - теоретически, знакомимся с ПИД регулятором (пропорционально-интегрально-дифференциальный). Из каких частей он состоит: П (пропорциональный) - основное воздействие на тележку - старается минимизировать ошибку, уменьшить отклонение от границы. И (интегральный) - ошибка суммируется, тем самым, если тележка долго находится только на одной стороне от границы, накопленная сумма влияет на поведение пропорциональной части регулятора - усиливая его, заставляя тележку быстрее возвращаться к середине. Д (дифференциальный) - ошибка сравнивается с предыдущей (вычитается). Т.е. если ошибка меняет знак (датчик переезжает по другую сторону границы), дифференциальная компонента пытается уменьшить величину колебания в обратную сторону. Улучшаем поведение робота, вводя еще один датчик для определения линии. Теперь линия как бы зажимается между двумя датчиками. Ошибка теперь вычисляется не от средней (границы линии), а как разница между показаниями двух датчиков. Смысл в том, что если оба датчика на белой поверхности - их показания равны, и разница (ошибка) - ноль. Но если один из датчиков наехал на линию, разница становится не нулевой. Объяснение на схеме: если робот не двигается вдоль линии поменять датчики местами в формуле вычисления разницы. Теоретическая часть: обсуждаем, где еще можно применить регуляторы: езда вдоль стенки по датчику расстояния, по датчику освещенности; сегвей на датчике освещенности; сегвей на датчике-гироскопе; синхронизация моторов - ошибка вычисляется по разности угловых скоростей; движение мотора к определенной позиции - ошибка - разность между текущим положением и требуемым; как вырожденный случай предыдущего пункта - мотор удерживает нужную позицию: например, не опускается под тяжестью груза. Учимся определять пересечение линии с помощью одного датчика. Делаем их подсчет. Задача робота - остановиться после N-го перекрестка. линейный алгоритм: едем до черного, затем до белого, увеличиваем счетчик; разветвленный алгоритм вводит понятие флага состояния - едем - тележка сейчас по перекрестку или съехала с него. Объединяем два алгоритма - движение по линии и определение/подсчет перекрестков. Для сокращения программы в средах NXT-G/RobotC/NXC вводим понятие функции (MyBlock). На схеме пояснить, как считать линии с помощью двух датчиков. Задача для робота - на трассе есть несколько перекрестков и только два из них связаны между собой, образуя "короткую дорогу" - роботу нужно повернуть на этом перекрестке. 10. Отрабатываем изменение поведения робота: в любой момент на трассе из предыдущего пункта появляется препятствие - робот должен остановиться и ждать "исчезания" препятствия. Продолжаем предыдущую тему: рядом с траекторией наклеены цветовые метки, влияющие на поведение робота: ему нужно остановиться, уменьшить скорость в два раза, увеличить скорость в два раза. Отдельный цикл занятий: робот должен продолжать двигаться по траектории, даже если в определенный момент поле стало инверсным, т.е. белая линия по черному полю. В управлении роботом в этот момент должны поменяться местами знаки (+ и -), в формулах вычисления мощности: На обычном поле: Мощность мотора А = Средняя мощность + Ошибка * Коэффициент Мощность мотора B = Средняя мощность - Ошибка * Коэффициент На инвертированном поле: Мощность мотора А = Средняя мощность - Ошибка * Коэффициент Мощность мотора B = Средняя мощность + Ошибка * Коэффициент Предполагаемая длительность курса по данному плану 16-20 академических часов в зависимости от подготовки группы. обучение программирование робототехника