Управляемость (точность отработки алгоритма)
Робототехника с пеленок/Органы чувств Движение робота Когда вы говорите кому то, куда ему двигаться, вы отдаете команду. Эта команда может привязана к какому то ориентиру, чтобы Исполнитель команды мог понять, что от него хотят. Например ориентиром (или его еще называют маяком) можете быть вы - к примеру вы даете команду вашему приятелю "иди ко мне". Также маяком может быть какой то предмет: "Иди до того стола". Или команда может быть привязана к какой либо системе координат. Встав лицом к Исполнителю, вы сами будете для него маяком и он сможет выполнять команды относительно вас - вперед (от вас), назад (к вам), влево и вправо. Или, если это экран, Исполнитель сможет двигаться вверх, вниз, влево или вправо, считая маяками стороны экрана. Что же выбрать? Так как мы имеем дело с роботом, то на местности мы имеем дело с привязкой к поверхности и сторонам света, поэтому считаем что на экране перед нами вид на Робота сверху и он должен передвигаться относительно вас. Вы находитесь за пределами экрана, внизу. То есть отдав команду "вперед" (от вас), робот на экране будет двигаться вверх, "вниз" - к вам. Задание: [править] Движение в абсолютных координатах Откройте Scratch, удалите текущий персонаж (правой кнопкой мыши на нем - удалить) и выберите Рисовать новый объект . Наш робот будет круглый, поэтому нарисуйте что-то похожее на закрашенный круг. Теперь нужно составить программу, управляющую роботом. Если вы посмотрите раздел Движение, то не обнаружите параметров "вперед, назад, влево, вправо", так как управление программным роботом (как вы уже наверное знаете) идет по системе координат. В нашем случае движение вперед будет означать увеличение координаты Y, назад - ее уменьшение. Вправо увеличивает координату X, а влево - уменьшает ее. Центр экрана будет иметь координаты X=0, Y=0.
Важные вещи: Задайте следующий код: При старте программы робот устанавливается в исходную точку (координату 0,0). При нажатии срелки вверх робот переместится вперед (то есть увелит координату Y). Важные вещи: Задание: [править] Ориентация (Относительные координаты) Попросите друга побыть Роботом. Пускай он встанет спиной к вам, а затем выпонит ваши команды "вперед, назад, влево, вправо". Вы заметили, что его ориентация относительно вас не изменилась? Теперь скомандуйте другу "повернись направо". Вы видите, что он стал к вам боком. Теперь дайте команду "вперед". Ваш друг, изображая робота, только что переместился туда, куда ранее вы могли переместить Робота командой "влево". То есть робот сменил свое расположение в пространстве (ориентацию) и теперь старые команды вызывают перемещение в другом направлении. В реальной жизни Роботы также обычно ориентированы - они не могут просто переместитьс влево или вправо, не поменяв свою ориентацию в пространстве. Файл:Движение робота3.png Поправьте спрайт робота, чтобы он стал выглядеть так (Спрайт - Костюмы - Редактировать): Вопрос: Вы можете заметить, что робот стоит как нам, повернувшись вправо. Все спрайты в Scratch изначально имеют такое направление (направление 90 или "вправо"), которое затем вы можете изменить "кирпичиком" .
Текущую ориентацию можно увидеть в меню спрайта или вывести на экран, отметив в разделе Движение кирпичик [ ] Направление. Направления обозначены цифрами как: 90 - "вправо", 0 - "вверх, -90 - "влево", 180 - "вниз". Давайте видоизменим предыдущую программу задав по нажатию клавиш влево и вправо поворот робота. Для этого надо будет использовать блок . При поворте робота обычно не используют понятия "влево" и "вправо", а говорят, что Робот должен повернуться "по часовой стрелке" или "против часовой" Вопрос: Измените в предыдущей программе блоки управления стрелками следующим образом: Теперь запустите программу. Вы увидите, что при нажатии на стрелки влево или вправо робот поворачивается на 90 градусов. Но если нажать вверх или вниз, то он начинает смещаться, а не двигаться по направлению стрелки. Это происходит из-за того, что мы смешали системы координат. У нас теперь нет привязки к конкретным значениям и точки отсчета, поэтому необходимо использовать команды вида "вперед" или "назад", указав какое значение для перемещения. Измените блоки управления стрелками "вверх" и "вниз", используя конструкцию . Это заставит робота переместится в заданном направлении на указанное число шагов (в случае Scratch это число пикселей на экране). Вперед будет задаваться положительным числом (+), а назад - отрицательным. У вас должна в итоге получиться следующая программа: Важные вещи: Задание: Задание:
Задание: Управляемость (точность отработки алгоритма) Наш робот уже может управляться с клавиатуры и вы можете "гонять" его по экрану. Если вы выполнили предыдущие задания, то знаете как сделать робота более управляемым - то есть заставить его поворачиваться на больший или меньший угол, изменять скорость его движения а также задавать начальную ориентацию. Но реальный робот имеет увы худшую управляемость (по крайней мере наш учебный робот, которого мы сможем запрограммировать в дальнейшем). Что это означает? Реальный робот не может повернутся на точный угол (плюс-минус определенное количество градусов), не может переместиться на точное количество шагов и возможны задержки и пропуски наших команд из-за проблем при передаче данных к Роботу. Даже установив так называемую "обратную связь" - то есть специальные устройства, которые смогут сказать, что робот сделал действие с какой то точностью - мы все равно будем иметь какую то погрешность, а также стоимость самого робота начнет расти. Во многих случаях точность робота по отработке команд алгоритма не так важна, как скорость реакции на события и отработку команд извне. Давайте посмотрим, как влияет неточность отработки команд алгоритмя на нашего компьютерного робота. Для этого мы в каждую команду добавим случайную составляющую. Наша программа примет следующий вид:
Вы можете отследить текущее перемещение робота с помощью "пера" в Scratch. Для этого добавьте следующий блок: Теперь по нажатию клавиши "Пробел" робот будет оставлять за собой "след". Важные вещи:
Задание: 600px Задание: А теперь сделаем так, чтобы при нажатии стрелки "вверх" робот начинал двигаться вперед, а при нажатии "вниз" останавливался. Для этого нужно заметь код алгоритмя по нажатию этих стрелок на такой единый блок: Что он делает? При нажатии на флажок запуска начинается работа бесконечного цикла и идет проверка условия Если нажата стрелка вверх. Как только оно выполнено, начинает выполняться условие Повторять до, которое будет выполняться в цикле, пока не будет нажата стрелка "вниз". Внутри цикла условия помещен код движения вперед с погрешностью. Вопрос: Если робот едет слишком быстро, уменьшите значение шага и случайной величины к примеру до 5 (а случайную величину от 1 до 2) или добавить в цикл после "кирпичика" Идти задержку ("кирпичик" ) в 0.2-0.5 секунд. Вопрос: Важные вещи: Галерея с примерами расположена по адресу: http://scratch.mit.edu/galleries/view/157855 Органы осязания робота Наш робот уже может передвигаться, но он слеп и не может понять, что перед ним. Поэтому он может врезаться в стены, натыкаться на окружающие его предметы. Также робот не обладает органами, с помощью которых его можно направлять в нужном направлении. Давайте исправим это положение попробуем поработать с датчиками-сенсорами из комплекта. Ой, стенка! Самый простой датчик — это контактный. Он представляет собой микропереключатель с усиком и колесиком на его конце. При столкновении с препятствием происходит замыкание контакта, которое можно отследить из Scratch. В комплекте вы можете найти два таких датчика (мы будем назвать их «фишками»). Установите один из них в средний разъем. Нажав на контакт, найдите какой аналоговый выход соответствует этому разъму — его значени будет 100 (или близко к нему) и не будет плавать. Отожмите кнопку — значение должно стать равным нулю. Если это не произошло, достаньте и поставьте назад фишку датчика, проверив не загрязнены ли контакты на плате и магниты.
Важные вещи: Запишите, какие разъемы соответствуют каким аналоговых входам. Это упростит дальнейшее программирование, так как нумерация постоянна для вашей модели платы Arduino Предположим, что мы имеем установленный датчик касания посередине робота, за который отвечает аналоговый разъем 2. Напишем программу, реализующую следующий алгоритм: 1. Программа запускается и ждет нажатия клавиши. 2. По нажатию клавиши «вверх» робот начинает непрерывно двигаться. 3. При возникновении препятствия перед роботом, он должен отъехать назад и остановиться. Теперь давайте научим робота опеределять, с какой стороны находится препятствие. Для этого будем использовать два датчика касания - справа и слева. Скорее всего (так как в зависимости от модели вашей платы Arduino датчики нумеруются по кругу) это будет Analog1 для левого (по ходу движения) сенсора и Analog3 для правого. Алгоритм работы будет следующий: 1. По нажатию клавиши "стрелка вверх" мы начинаем движение вперед; 2. Если обнаруживаем касание левого датчика, то останавливаемся; 3. Проверяем, не сработал ли одновременнот правый датчик. Если нет, то откатываемся назад на шаг, и делаем поворот вправо; 4. Если сработал правый датчик, то откатываемся на шаг назад и делаем поворот в заданную сторону (обычно вправо); 5. Если сработал правый датчик, то действуем аналогично, только делаем поворот влево, а для двух датчиков копируем код. Пример движения робота по данному алгоритму показан на следующем рисунке: Теперь напишем код: Файл:Roboplatforma cod5.png Продолжение кода Файл:Roboplatforma cod5.1.png Вопрос: Задание: Вопрос: [править] На свет! Теперь давайте научим робота видеть. Конечно же мощности и возможностей Робоплатформы не хватит на полноценное компьютерное зрение, но сделать глаза, реагирующие на уровень освещенности нам под силу. Для этого используем датчики освещенности (сенсоры света) из комплекта поставки. Они выглядят вот так: Файл:Roboplatforma svet1.png Проверьте их работу. Для этого установите датчик в какой нибудь разъем и посмотрите соответствующий вывод аналогового входа. Значение сенсора должно лежать в пределах 40-60 единиц. Закройте его пальцем - значение должно упасть. Посветите фонариком или направьте на источник яркого света - значение должно увеличиться. Иначе проверьте контакты. Мы напишем простейшую программу, когда наш робот будет ползти на свет. Алгоритм будет следующим: 1. При старте программы робот переходит в цикл ожидания и проверяет уровень освещенности; 2. Как только уровень освещенности превышает заданный порог, робот включает мотор и двигается вперед; Код программы будет таким: Файл:Roboplatforma cod6.png Задание: А теперь установим роботу два глаза в правый и левый разъемы (аналогично датчикам касания). Теперь сделаем так, чтобы робот двигался самостоятельно в сторону источника света, следя за ним. Алгоритм в данном случае будет сложнее. 1. При нажатии стрелки вверх робот должен перейти в цикл ожидания источника света. 2. При появлении сигнала на одном из датчиков, робот должен определить направление своего движения. Для этого необходимо сравнить сигналы между собой. 3. Если левый датчик освещен больше, чем правый, то нужно повернутьсч на шаг влево. 4. Если правый датчик освещен больше, чем левый, то на шаг вправо. 5. Если освещение равномерное, то двигаться вперед. Файл:Roboplatforma cod7.png На самом деле в реальности мы столкнемся еще с одной проблемой: сигнал с датчиков, даже если источник света будет расположен посередине между ними, может быть различным и робот будет крутиться вправо-влево, но не двигаться. Чтобы избежать этого, необходимо ввести порог разности сигналов, при которой будет считаться, что она существует. Обычно порог задают в пределах 3-5 единиц и определяют его как разницу сигналов с сенсоров. Теперь код будет выглядеть так: Файл:Roboplatforma cod8.png Как видите, теперь к условию большего уровня освещения добавляется проверка на превышения порога разности. Если этого не происходит, то робот двигается вперед. Обратите внимание, что если Analog1 показывает больше Analog3 на 7 единиц (величину легко определить, посветив на стоящего робота посередине), то порог разницы будет при Analog1 > Analog3 будет вычисляться как Analog1 - (Analog3 + 7)и (Analog3 + 7) - Analog1для учета данной погрешности. Задание: Задание: Задание: [править] Совмещаем сенсоры А теперь давайте совместим изученные датчики. Ниже приведены задания, которые можно реализовать, используя ранее написанный код. Задание: Задание: Задание: Вопрос: Вопрос: Вопрос:
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|