Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Управляемость (точность отработки алгоритма)

Робототехника с пеленок/Органы чувств

Движение робота

Когда вы говорите кому то, куда ему двигаться, вы отдаете команду. Эта команда может привязана к какому то ориентиру, чтобы Исполнитель команды мог понять, что от него хотят. Например ориентиром (или его еще называют маяком) можете быть вы - к примеру вы даете команду вашему приятелю "иди ко мне". Также маяком может быть какой то предмет: "Иди до того стола". Или команда может быть привязана к какой либо системе координат.

Встав лицом к Исполнителю, вы сами будете для него маяком и он сможет выполнять команды относительно вас - вперед (от вас), назад (к вам), влево и вправо. Или, если это экран, Исполнитель сможет двигаться вверх, вниз, влево или вправо, считая маяками стороны экрана. Что же выбрать? Так как мы имеем дело с роботом, то на местности мы имеем дело с привязкой к поверхности и сторонам света, поэтому считаем что на экране перед нами вид на Робота сверху и он должен передвигаться относительно вас. Вы находитесь за пределами экрана, внизу. То есть отдав команду "вперед" (от вас), робот на экране будет двигаться вверх, "вниз" - к вам.

Задание:
Нарисуйте, куда будет двигаться робот по командам "влево" и "вправо"

[править] Движение в абсолютных координатах

Откройте Scratch, удалите текущий персонаж (правой кнопкой мыши на нем - удалить) и выберите Рисовать новый объект . Наш робот будет круглый, поэтому нарисуйте что-то похожее на закрашенный круг.

Теперь нужно составить программу, управляющую роботом. Если вы посмотрите раздел Движение, то не обнаружите параметров "вперед, назад, влево, вправо", так как управление программным роботом (как вы уже наверное знаете) идет по системе координат. В нашем случае движение вперед будет означать увеличение координаты Y, назад - ее уменьшение. Вправо увеличивает координату X, а влево - уменьшает ее. Центр экрана будет иметь координаты X=0, Y=0.

Важные вещи:
Нащ робот теперь двигается в абсолютных координатах и может быть установлен и перемещен в любую точку, заданную этими координатами. В реальной жизни так работают к примеру роботы-манипуляторы сборочных производств

Задайте следующий код:

При старте программы робот устанавливается в исходную точку (координату 0,0).

При нажатии срелки вверх робот переместится вперед (то есть увелит координату Y).

Важные вещи:
Наш робот теперь имеет собственный набор команд - "вперед", "назад", "влево", "вправо"

Задание:
Доработайте программу, чтобы робот перемещался по нажатию стрелок вниз, вправо или влево

[править] Ориентация (Относительные координаты)

Попросите друга побыть Роботом. Пускай он встанет спиной к вам, а затем выпонит ваши команды "вперед, назад, влево, вправо". Вы заметили, что его ориентация относительно вас не изменилась?

Теперь скомандуйте другу "повернись направо". Вы видите, что он стал к вам боком. Теперь дайте команду "вперед". Ваш друг, изображая робота, только что переместился туда, куда ранее вы могли переместить Робота командой "влево". То есть робот сменил свое расположение в пространстве (ориентацию) и теперь старые команды вызывают перемещение в другом направлении.

В реальной жизни Роботы также обычно ориентированы - они не могут просто переместитьс влево или вправо, не поменяв свою ориентацию в пространстве.

Файл:Движение робота3.png

Поправьте спрайт робота, чтобы он стал выглядеть так (Спрайт - Костюмы - Редактировать):

Вопрос:
Как теперь ориентирован робот относительно вас?

Вы можете заметить, что робот стоит как нам, повернувшись вправо. Все спрайты в Scratch изначально имеют такое направление (направление 90 или "вправо"), которое затем вы можете изменить "кирпичиком" .

Текущую ориентацию можно увидеть в меню спрайта

или вывести на экран, отметив в разделе Движение кирпичик [ ] Направление. Направления обозначены цифрами как: 90 - "вправо", 0 - "вверх, -90 - "влево", 180 - "вниз".

Давайте видоизменим предыдущую программу задав по нажатию клавиш влево и вправо поворот робота. Для этого надо будет использовать блок . При поворте робота обычно не используют понятия "влево" и "вправо", а говорят, что Робот должен повернуться "по часовой стрелке" или "против часовой"

Вопрос:
Куда повернется робот при повороте "по часовой стрелке"? Влево или вправо?

Измените в предыдущей программе блоки управления стрелками следующим образом:

Теперь запустите программу. Вы увидите, что при нажатии на стрелки влево или вправо робот поворачивается на 90 градусов. Но если нажать вверх или вниз, то он начинает смещаться, а не двигаться по направлению стрелки. Это происходит из-за того, что мы смешали системы координат. У нас теперь нет привязки к конкретным значениям и точки отсчета, поэтому необходимо использовать команды вида "вперед" или "назад", указав какое значение для перемещения.

Измените блоки управления стрелками "вверх" и "вниз", используя конструкцию . Это заставит робота переместится в заданном направлении на указанное число шагов (в случае Scratch это число пикселей на экране). Вперед будет задаваться положительным числом (+), а назад - отрицательным. У вас должна в итоге получиться следующая программа:

Важные вещи:
Робот может обойтись без заднего хода. Если его конструкция позоляет ему поворачиваться на месте, как у нашего идеального компьютерного Робота, то достаточно выполнить поворот на 180 градусов и робот поедет в обратную сторону. Также робот может поворачивать не только на 90 градусов.

Задание:
Поэкспериментируйте с углами поворота. Замените 90 градусов на 45, 30, 15, 5 и посмотрите, что получится.

Задание:
Поменяйте начальное направление. Поставьте робота в направление "вверх" и посмотрите, как изменяется управление им.

Задание:
Измените величину шага. Выясните, как влияет эта величина на скорость движения робота.

Управляемость (точность отработки алгоритма)

Наш робот уже может управляться с клавиатуры и вы можете "гонять" его по экрану. Если вы выполнили предыдущие задания, то знаете как сделать робота более управляемым - то есть заставить его поворачиваться на больший или меньший угол, изменять скорость его движения а также задавать начальную ориентацию.

Но реальный робот имеет увы худшую управляемость (по крайней мере наш учебный робот, которого мы сможем запрограммировать в дальнейшем). Что это означает?

Реальный робот не может повернутся на точный угол (плюс-минус определенное количество градусов), не может переместиться на точное количество шагов и возможны задержки и пропуски наших команд из-за проблем при передаче данных к Роботу.

Даже установив так называемую "обратную связь" - то есть специальные устройства, которые смогут сказать, что робот сделал действие с какой то точностью - мы все равно будем иметь какую то погрешность, а также стоимость самого робота начнет расти.

Во многих случаях точность робота по отработке команд алгоритма не так важна, как скорость реакции на события и отработку команд извне. Давайте посмотрим, как влияет неточность отработки команд алгоритмя на нашего компьютерного робота. Для этого мы в каждую команду добавим случайную составляющую. Наша программа примет следующий вид:


Блоки поворота на случайную величину при движении вперед и назад нужны, потому что реальный робот при движении вперед обычно откланяется в ту или иную сторону из-за погрешности работы двигателей.

Вы можете отследить текущее перемещение робота с помощью "пера" в Scratch. Для этого добавьте следующий блок:

Теперь по нажатию клавиши "Пробел" робот будет оставлять за собой "след".

Важные вещи:
В код начальной инициализации после задания направления не забудьте добавить "кирпичик" Шаблон:Меню. Также вы можете установить начальные координаты робота, отличные от (0,0).

Задание:
Нарисуйте роботу дорогу, похожую на изображенной на рисунке, и загрузите ее в качестве фона Сцены. Попросите ваших друзей или одноклассников проехать по данной дороге, а также потренируйтесь сами управлять "почти" реальным роботом.

600px

Задание:
Поэкспериментируйте c величинами случайных чисел. Чем больше данное число, тем хуже работает робот. Что произойдет, если величина случайного числа будет больше самой величины действия?

А теперь сделаем так, чтобы при нажатии стрелки "вверх" робот начинал двигаться вперед, а при нажатии "вниз" останавливался. Для этого нужно заметь код алгоритмя по нажатию этих стрелок на такой единый блок:

Что он делает? При нажатии на флажок запуска начинается работа бесконечного цикла и идет проверка условия Если нажата стрелка вверх. Как только оно выполнено, начинает выполняться условие Повторять до, которое будет выполняться в цикле, пока не будет нажата стрелка "вниз". Внутри цикла условия помещен код движения вперед с погрешностью.

Вопрос:
Когда управляемость роботом лучше - при использовании прерывистого или непрерывного движения? Что менее утомительно для управляющего роботом? Какой способ управления вы бы предпочли?

Если робот едет слишком быстро, уменьшите значение шага и случайной величины к примеру до 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...