Практическое занятие 4. Объезд с выбором направления поворота

Курс «Основы робототехники. Продвинутый уровень». Занятие 5. Бот, проходящий лабиринт

Добавим боту возможность объезжать препятствия. Для этого используем ультразвуковой датчик расстояния HC-SR04

Примечание: рекомендуется взять распечатку Занятия 9. Цифровые датчики с информацией об применяемом датчике

Практическое занятие 1. Установка и тестирование

Установите датчик расстояния на бота, использовав держатель. Подключите контакты датчика к Arduino (VCC – к 5V Практическое занятие 4. Объезд с выбором направления поворота). Протестируйте датчик, загрузив в контроллер программку Файл / Примеры / Ultrasonic / Ultrasonic2serial, исправив по мере надобности номера контактов.

Практическое занятие 2. Остановка у стенки

Запрограммируем бота на езду вперед и остановку у препятствия. Скопируйте в программку разработанные в домашнем задании функции: forward, backward, left, right с передачей значения, сколько времени работать моторам. Если Практическое занятие 4. Объезд с выбором направления поворота таких функций нет в наличии, шаблон функции дан в конце прошедшего занятия

float distance; int min_distance = 20; // переменные, setup и опрос датчика расстояния в переменную distance if (distance > min_distance) { // если расстояние впереди больше данного forward (50); // едем вперед } else { // по другому, если расстояние впереди меньше данного stop_motors (); // тормозим } // функции Практическое занятие 4. Объезд с выбором направления поворота

Примечание: вероятна ситуация, когда на датчик не приходит ответный сигнал, в данном случае distance может приравняться к нулю. Чтоб избежать неправильного поведения бота в данном случае, можно после опроса датчика добавить строчку if (distance = 0) { distance = 2000; }

Практическое занятие 3. Объезд препятствия

Реализуйте последующий метод:

1. Ехать вперед до того времени, пока дистанция до Практическое занятие 4. Объезд с выбором направления поворота препятствия впереди не будет меньше данной (аналогично прошлой программке)

2. Если дистанция меньше – тормознуть, отъехать вспять, повернуть на определенный угол

3. Возвратиться к пт 1

Практическое занятие 4. Случайный объезд

Вероятны ситуации, к примеру, лабиринты, которые в случае езды бота повдоль одной стенки являются непролазными. Обычным решением препядствия является добавление элемента случайности Практическое занятие 4. Объезд с выбором направления поворота в движения бота. Добавьте в предшествующую программку при обнаружении препятствия случайное направление поворота, используя логическую (boolean) переменную povorot для хранения направления

boolean povorot = false; … if (distance > min_distance){ // если расстояние впереди больше данного forward (50); // едем вперед } else { // если расстояние впереди меньше данного stop_motors (); // тормозим delay(100); backward (200); // едем вспять if Практическое занятие 4. Объезд с выбором направления поворота (random(0, 2) == 0) {povorot = false;} // кидаем монетку на направление поворота 0 - false, else {povorot = true;} // 1 - true if (povorot == false){ // если выпал 0 left (turn_time); // едем влево } else { // если выпала 1 right (turn_time); // едем вправо } }

Также можно добавить и случайное время поворота (в данных границах), соответственно, будет случайным угол поворота:

turn_time = random (min, max+1)

Практическое Практическое занятие 4. Объезд с выбором направления поворота занятие 4. Объезд с выбором направления поворота

Попробуем ускорить движение бота по объезду препятствия, убрав отъезд вспять и добавив осмысленный выбор направления объезда препятствия. К примеру, при подъезжании бота к стенке под углом (см. набросок справа) имеет смысл избрать соответственное направление поворота, обеспечивающее малое время поворота.

Метод работы в Практическое занятие 4. Объезд с выбором направления поворота данном случае:

1. Ехать вперед до того времени, пока дистанция до препятствия впереди не будет меньше данной (аналогично прошлой программке)

2. Сохранить измеренную дистанцию, случаем избрать направление поворота

3. Повернуть на маленькое расстояние

4. Измерить расстояние впереди

5. Сопоставить измеренное расстояние с сохраненным сначала. Если расстояние стало меньше - направление выбрано некорректно и его нужно поменять

6. Продолжать повороты Практическое занятие 4. Объезд с выбором направления поворота до того времени, пока расстояние впереди не станет больше данного

Приведен код для данного метода, его необходимо проверить, провести подбор характеристик (speed, turn_time и т.д.) для решения задачки рационального прохождения лабиринта (за малое время) и показать работу. Значение turn_time в коде маленькое (порядка 50 мс), потому что для отворачивания от Практическое занятие 4. Объезд с выбором направления поворота препятствия производится несколько маленьких поворотов, а не один большой

distance = ultrasonic.Ranging(CM); if (distance > min_distance){ // если расстояние впереди больше данного forward (50); // едем вперед } else { // если расстояние впереди меньше данного if (random(0, 2) == 0) {povorot = false;} // кидаем монетку на направление поворота 0 - false, else {povorot = true;} // 1 - true // поворачиваем до того Практическое занятие 4. Объезд с выбором направления поворота времени, пока расстояние впереди не станет допустимым, при всем этом проводим проверку, верно ли мы повернули while (ultrasonic.Ranging(CM) < min_distance){ if (povorot == false){ // если выпал 0 left (turn_time); // едем влево } else { // если выпала 1 right (turn_time); // едем вправо } // если дистанция впереди стала меньше начальной – поворот производится в неверном направлении, меняем Практическое занятие 4. Объезд с выбором направления поворота направление на обратное if (ultrasonic.Ranging(CM) < distance) {povorot = !povorot;} } }

Примечание 1: сохраните к для себя получившийся код программки, он будет применен на соревновании по прохождению лабиринта на аттестационном занятии 8

Примечание 2: на теоретическом уровне, при определенной конфигурации препятствия, может быть, что в обоих направлениях поворотов расстояние впереди станет меньше, чем Практическое занятие 4. Объезд с выбором направления поворота было до поворота. В данном случае бот будет дергаться вправо-влево нескончаемо. Чтоб избежать этого, можно добавить счетчик смены направлений и при превышении счетчика дать команду боту выполнить, к примеру, поворот на случайный большой угол.


praktikoorientirovannoe-zadanie-6.html
praktikum-dlya-rukovoditelya-ohrana-truda.html
praktikum-dlya-studentov-pedagogicheskih-vuzov-voronezh-2007.html