(Robolab)
Алгоритм движения робота по этой траектории часто называют "Танец в круге". Робот должен вытолкнуть из круга все кеглши за наименьшее количество времени, при этом сам он не должен выезжать за пределы круга.
Первый вариант программы на языке Robolab иллюстрирует простейший алгоритм движения в круге с черной границей. Направление движения моторов зависит от показаний датчика освещенности. Значение 5 синего (числового) модификатора означает ожидание уровня освещенности темнее текущего на 5 пунктов.
Второй пример программы несколько сложнее. Теперь изначальное положение кеглей неизвестно. и робот вынужден искать их самостоятельно. Для поиска используется датчик расстояния (сонар), значение на котором должно быть 45 см и менее в момент обнаружения. В этот раз для большей точности моторы вращаются не по времени, а по установленному количеству оборотов в каждую сторону. Для обнаружения черной линии по-прежнему применяется датчик освещенности.
(NXT-G)
На языке NXT-G простой алгоритм для кегельринга может выглядеть следующим образом.
Здесь реализован тот же самый алгоритм, что и в программе на Robolab. Блок движения, стоящий после цикла, работает в течение трех оборотов мотора. Этого вполне достаточно, чтобы робот отъехал от линии для разворота. Последние две команды Motor инициируют поворот робота вокруг своей оси. Внимательно проверьте время поворота! Робот должен повернуться своей фронтальной частью внутррь круга для продолжения поиска оставшихся кеглей. Установить точное время поворота можно опытным путем.
Пример реализации более сложного алгоритма с поиском кеглей.
Параметры команд установлены те же самые, что и в программе на Robolab. Вместо команд ожидания установлены циклы, что снижает эффективность программы в целом, но позволяет лучше разобраться в самом алгоритме, рассматривая несколько вариантов его реализации.
Робот ставится в центре и при старте должен двигаться внутри круга, не выходя за его пределы.
Алгоритм действий "Танец в круге" таков:
- ехать вперед, пока показания датчика не понизятся на 5 пунктов (лучше 10);
- отъехать немного назад (полсекунды);
- развернуться примерно на 120-150 градусов (тоже по времени);
- повторять пункты 1-3 бесконечно.
Параметры, указанные в модификаторах, подберите самостоятельно: степень понижения освещенности на черной линии, время отъезда назад и время поворота.
Вытолкнуть все банки
Несколько пластиковых стаканчиков или пустых жестяных банок расставлены внутри круга, за черной линией на расстоянии 12-15 см от нее - это мусор, от которого необходимо очистить круг за кратчайшее время. Первые попытки запуска робота покажут несколько недостатков:
- стаканчики попадают под колеса, падают и плохо выталкиваются;
- даже вытолкнутые стаканчики остаются частично внитри круга, поскольку, увидев край, робот сразу устремляется назад;
- робот ведет себя как слон в посудной лавке;
- робот делает много движений впустую.
Второй и третий недостатки устраняются программно. Пусть увидев край, тележка еще немного двигается вперед, выталкивая стаканчик, и только после этого объезжает внутрь круга.
Самый надежный способ заехать точно на пределы черной линии - это дождаться значения белого на датчике освещенности. Поэтому время можно заменить на "ожидание белого". Для экономии места стоит сгруппировать команды управления моторами, а также использовать "реверс" при смене направления на работающих моторах.
Теперь стоит поработать над точностью движения, по возможности не теряя скорости.
В зависимости от конструкции робота, при резкой смене направления он может потерять равновесие или просто "встать на дыбы" на передние колеса. Поэтому последние несколько сантиметров можно проехать на торможении по инерции, то есть полностью освободив моторы.
И второе. Точность поворота будет зависеть от того, какие команды подаются на моторы и по какому принцип рассчитываются длительности поворота. К сожалению, таймер - не надежный помощник. По инерции на малых промежутках времени робот может поворачиваться не различные углы.
Мы можем пожертвовать реверсом в последней команде управления моторам В, для того чтобы достичь неторопливого движения обоими моторами. Длительность поворота при этом немного возрастет.
Для точности управления моторами необходимо использовать другой тип команд: с контролируемым вращением. Эти команды находятся в разделе "Advanced Output Control" и позволяют задавать мощность моторов от -100 до 100. В новом примере для компактности разместим все числовые параметры сверху, а модификаторы портов снизу.
Не делать лишних движений
Желание проконтролировать движение робота приводит к необходимости изменить траекторию движения таким образом, чтобы каждый раз, доехав до края, он возвращался в центр круга.
Севомоторы NXT имеют встроенный датчик оборотов, этим непременно надо воспользоваться. Для этого нужно обнулять показания датчика оборотов, когда робот окажется в центре. Отсчет времени невозможно повернуть вспять, чтобы снова придти в нулевую точку, а моторы можно. По замыслу робот проезжает некоторое количество оборотов вперед, после чего следует назад, пока датчик оборотов снова не будет ноль.
В Robolab для этого следует использовать специфический блок, который не обнуляет показания датчиков оборотов при вызове (с буквой А на пиктограмме). Кроме того, в примере добавлены модификаторы "Encoder C" из палитры "NXT Commander" для ясности различия между командами управления мотором и датчиками.
Результат уже значительно лучше, но робот все равно иногда промахивается мимо кеглей. Конечно, ведь он поворачивается вслепую. Надо бы оснастить его зрением. для этого подойдет датчик расстояния. Датчик надо поставить так, чтобы правый (со стороны разъема) датчик был первым по ходу движения. Тогда в процессе вращения больше вероятность, что отраженный сигнал будет уловлен принимающим глазком, идущим следом.
Итак, вращение осуществляется до тех пор, пока на датчик расстояния не поступит сигнал, например, "ближе 45". Т.е. обнаружен объект на расстоянии ближе 45 см. Надо иметь ввиду, что на стаканчики, которые робот вытолкнул за линию, он не должен обращать внимания. Поэтому указанное расстояние не следует делать больше радиуса круга.
В зависимости от конструкции робота, в приведенном алгоритме может быть один недостаток. Вернувшись в центр круга, робот начинает вращение до появления кегли. Однако, в силу неточности ультразвукового датчика, он может среагировать сразу на уже вытолкнутую кеглю. Поэтому имеет смысл, во-первых, выталкивать их подальше за пределы круга, во-вторых, начинать поворот вслепую, а в в-третьих, все действия поначалу выполнять в замедленном темпе.
Комментарии
Оставить комментарий
Робототехника
Термины: Робототехника