Роботы без роботов.Движение

Материал из ВИКИ ПРОСТОРОБОТ
Перейти к: навигация, поиск

Движение робота[править]

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

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

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


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

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

Откройте редактор.

Scratch.png Для Scratch v 1.4, удалите текущий персонаж (правой кнопкой мыши на нем - удалить) и выберите Рисовать новый объект. New image.png

Scratch.png Для версии 2.x удалите также и потом нажмите на кисточку New image scratch2.png

Snap.png Для Snap также удалите объект, а затем нажмите на кисточку New image Snap.png

Наш робот будет круглый, поэтому нарисуйте что-то похожее на закрашенный круг.

RoundRobot.png

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

Движение робота2.png


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

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

Scratch.png Файл:Код1.png Snap.png Файл:Code1 snap.png

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

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

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


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


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

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

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

Поправьте спрайт робота, чтобы он стал выглядеть так

v1.4 (Спрайт - Костюмы - Редактировать): v2.x (Спрайт - Костюмы): (Спрайт - Костюмы - клик правой кнопкой - Редактировать):


Вопрос

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

Вы можете заметить, что робот стоит как нам, повернувшись вправо. Все спрайты в Scratch и Snap! изначально имеют такое направление (направление 90 или "вправо"), которое затем вы можете изменить "кирпичиком" ; . Текущую ориентацию можно увидеть: v1.4 - В меню спрайта или вывести на экран, отметив в разделе Движение кирпичик [ ] Направление. Направления обозначены цифрами как: 90 - "вправо", 0 - "вверх, -90 - "влево", 180 - "вниз". v 2.x - нажав на белую i в рамке спрайта (или выбрав по клику правой кнопки мыши Info - Вывести на экран, отметив в разделе Движение кирпичик [ ] Направление. Направления обозначены цифрами как: 90 - "вправо", 0 - "вверх, -90 - "влево", 180 - "вниз". Давайте видоизменим предыдущую программу задав по нажатию клавиш влево и вправо поворот робота. Для этого надо будет использовать блок , . При повороте робота обычно не используют понятия "влево" и "вправо", а говорят, что Робот должен повернуться "по часовой стрелке" или "против часовой"

Вопрос

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

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


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


Важный факт

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


Задание

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


Задание

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


Задание

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


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


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


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

Важный факт

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


Задание

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



Задание

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

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


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

Вопрос

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

Если робот едет слишком быстро, уменьшите значение шага и случайной величины к примеру до 5 (а случайную величину от 1 до 2) или добавить в цикл после "кирпичика" Идти, передвинуть на задержку - "кирпичик" ), в 0.2-0.5 секунд.

Вопрос

Как влияет изменение величины шага и задержки на управляемость Роботом?