(495)240-8280ПН-СБ с 12:00 до 20:00
We speak English

Урок 5.2. От стены до стены

В рамках данного урока вы научитесь использовать ультразвуковой локатор робота-вездехода TI-Innovator Rover, чтобы он мог объезжать препятствия.

Вы научитесь:

  • Считывать расстояние от робота-вездехода Rover до объекта перед ним
  • Разворачивать робот, если расстояние до препятствия слишком маленькое, и продолжать движение

Примечание для учителя: В этом проекте учащиеся продолжат изучать робота-вездехода Rover. Напомним, что калькулятор TI-Nspire CX II-Т работает гораздо быстрее вездехода. В уроке, когда вы работали с LED индикатором, вы делали так, чтобы калькулятор TI-Nspire CX II-Т ждал, пока робот Rover завершит команду поворота или движения вперед, и только потом приступал к обработке следующей инструкции в коде.
Та же самая проблема будет рассмотрена в этом уроке, но ошибки здесь допускать категорически не желательно. В этом проекте робот Rover будет выполнять команды движения, поворота и остановки. Добавление пауз в работе программы (в нужных местах) может решить проблему несинхронной работы вездехода и калькулятора.

Когда робот Rover движется вперед, ваша программа должна использовать ультразвуковой локатор для обнаружения препятствий. А при приближении к ним заставлять вездеход ехать в другом направлении. В рамках данного проекта ваш робот Rover будет перемещаться только между двумя противоположными стенами.

Примечание для учителя: В этом проекте вместо стен можно использовать две толстые книги в твердом переплете. Но в таком случае вам нужно расположить эти книги строго перпендикулярно роботу Rover как в вертикальной, так и горизонтальной плоскости. Иначе вездеход просто не "увидит" препятствие, потому что издаваемый им звук (не слышимый человеком) не будет должным образом отражаться (создавать эхо) и достигать непосредственно самого датчика.

1. Начните работу с создания новой программы Python, используя шаблон работы с роботом Rover Coding.

Чтобы робот Rover двигался вперед, вставьте выражение:

rv.forward (100)

Все верно, он будет перемещаться на расстояние 10 метров (или примерно 39 футов), но на его пути встретится препятствие.

2. Теперь нужно сделать так, чтобы робот Rover считывал расстояние перед собой до ближайшего объекта:

dist = rv.ranger_measurement()

Если до препятствия еще далеко, робот Rover должен продолжать двигаться вперед. Но как только препятствие приблизится, нужно дать команду вездеходу развернуться. На каком именно расстоянии до стены робот должен развернуться - решать вам.

Примечание для учителя: Для разворота роботу Rover требуется примерно 20 см.

3. Добавьте в программу цикл с оператором while, чтобы заново отслеживать расстояние до препятствия, которое должно находиться далеко от робота:

while dist > ? :

(замените знак вопроса (?) небольшим числом)

dist = rv.ranger_measurement()

Теперь вам нужно остановить робота Rover, когда цикл закончится.

rv.stop()

Функцию rv.stop() можно найти в меню: menu > TI Rover > Drive.

Протестируйте свою программу. Поставьте робота Rover напротив стены или препятствия (на расстоянии до 12 метров) и запустите программу. Вездеход Rover должен остановиться перед стеной и не врезаться в нее.

Примечание для учителя: На этапе тестирования в качестве препятствия можно использовать ладонь.
Функция rv.stop() немедленно останавливает робота Rover и стирает все команды движения вперед в очереди.

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

4. Когда робот Rover встретит препятствие, он должен развернуться. То есть сначала он остановится, а затем программа должна подать ему команду развернулся. Вам поможет следующее выражение:

rv.left(180) или rv.right(180)

5. После того, как робот выполнит разворот, ему нужно двигаться вперед (forward) в противоположном направлении, пока пользователь не нажмет на кнопку. Не забудьте, что при движении вездехода Rover нажать на кнопку esc может быть неудобно.

Вставьте следующее выражение в начале вашего кода:

while get_key() != "esc":

Отредактируйте выражение так, чтобы программу можно было остановить нажатием на любую кнопку:

while get_key() == "":

(знак == означает "равняется", знак "" означает "ничего")

Структурируйте все функции под выражением с оператором while, чтобы программа их видела как часть блокаоператора while. Самый простой способ структурировать группу выражений - это выбрать их всех с помощью комбинации shift+стрелка вниз и нажать tab.

Примечание для учителя: В данной части программы у некоторых могут возникнуть проблемы с написанием кода. После завершения команды поворота влево left(180), процесс обработки команд немедленно переходит снова к верхней части цикла. При этом робот Rover все еще будет находиться близко к стене. Он не будет двигаться, потому что программа работает быстрее, чем вездеход выполняет инструкции. Однако вы услышите, как работают моторы робота. Это как раз и говорит об ошибке выполнения программы. С точки зрения логики весь код написан правильно, но на деле результат получается не такой, какой вы хотели.

6. Теперь запустите программу. Робот Rover приближается к стене, останавливается и разворачивается (если ему хватает места). Хотя нет, что-то не так. Робот застрял!

Разворот занимает у робота Rover 1-2 секунды, но ваша программа не ждет его, она продолжает работать и немедленно переходит к обработке верхней части цикла, посылает вездеходу команду двигаться вперед. Но робот все еще "видит" перед собой стену и поэтому стоит на месте. Он просто не понимает, что ему делать, так как все команды обрушились на него разом. Вы услышите, как работают моторчики, но сам вездеход Rover не двигается. Все происходит настолько быстро, что у робота Rover буквально "голова идет кругом". Команды не выполняются... так не должно быть!

7. Нажмите любую кнопку, чтобы завершить работу программы.

Моторы робота Rover могут все еще работать, а сам он зависает. В таком случае вы просто можете отсоединить его от калькулятора, нажать на кнопку отключения, затем снова подсоединить и включить.

Чтобы устранить эту проблему в программе нужно сделать так, чтобы калькулятор TI-Nspire CX II-Т приостановил обработку команд и подождал, пока робот Rover завершит свой разворот. Для этого добавьте следующее выражение:

rv.wait_until_done()

Его необходимо поместить под выражением rv.left(180).

Снова запустите программу. Теперь ваш робот Rover будет послушно перемещаться между двумя противоположными стенами.

Для разворота роботу Rover требуется примерно 20 см. Задняя часть вездехода Rover длиннее передней. При такой разнице выражение while dist > 0.2: отлично справляется с вычислениями в данном случае.