глаза

Урок 4. «Зрение» робота. Сенсоры расстояния.

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

Человек конструирует роботов по своему образу и подобию («мозг» и «ноги» робота мы уже рассмотрели и научились ими управлять) –теперь очередь за зрением.

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

Еще раз оценим – готова ли наша миниатюрная микропроцессорная плата AStar 32U4 справится с этой сложной задачей, а мы с Вами потратить годы на изучение и создание матаппарата и программирование с отладкой? Вероятно пока нет.

Как же быть в этом случае? Как нам найти соперника на ринге?

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

Задачей робота является найти на этом ринге соперника и вытолкнуть его с ринга, использовав Самую Хитрую Стратегию в Мире (если робот не быстр и силен) или грубую физическую силу (если робот Самый Сильный и Быстрый).

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

От философских вопросов бытия вернемся к практическим.

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

С учетом того, что размеры ринга меньше метра датчики должны покрывать соответствующие дистанции.

Чаще всего в реальных роботах, побеждающих на соревнованиях, используются ИК датчики Sharp (www.pololu.com ):

ИК датчик Sharp GP2Y0A21SK0F (10см-80см) или визуально похожий на него GP2Y0A41SK0F (4см-30см). Эти датчики расчитывают расстояние до объекта перед ними.

ИК датчики расстояния Sharp GP2Y0D805, GP2Y0D810, GP2Y0D815 на 5, 10 и 15 см соответственно. Эти датчики просто фиксируют, что объект появился не дальше 5, 10, и 15 сантиметров соответственно (без расчета реального расстояния до объекта.

Более современными датчиками являются GP2Y0A60SZ, которые расчитывают расстояние от 10 до 150 сантиметров (два варианта – с подключнием на 5V и 3V соответственно), но эти датчики почти в два раза дороже, недостаточно «близоруки» и чересчур «дальнозорки».

Ультразвуковые сенсоры расстояния это обычно восточные аналоги Parallax PING (HC-SR04, 05 и другие)

Они обычно расчитаны на получение данных на расстоянии 4см-3 метра.

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

Давайте сравним.

ИК датчик для измерения расстояния использует инфракрасный свет – то есть это световой поток, невидимый для человеческого глаза. Свет имеет гораздо меньший чем звуковая волна коэффициент рассеивания в воздухе да и еще на столь малых расстояниях, которые мы рассматриваем. Кроме того, свет распространяется со скоростью света, простите за тавтологию. Со ссылкой на авторитет Альберта Эйнштейна скажу, что это самая высокая скорость в нашем мире.

Таким образом, например датчик GP2Y0A21SK0F имеет возможность примерно за 38-48 милисекунд (смотрим документацию), тратя всего 30mA тока измерить достаточно точное расстояние до робота-соперника.

Ультразвуковой датчик (еще его называют сонар) использует свойство звука распространяться в различных средах (в частности в воздухе) и отражаться от предметов, а по времени, необходимому на преодоление расстояния до предмета и от него, рассчитать расстояние. Но для реального использования сонаров есть несколько «но».

Первое «но» — звуковая волна менее точно сфокусирована по сравнению со световой, второе – скорость звука в воздухе «всего» 331 м/c и поэтому сонар более «медленный» с точки зрения измерений, третье -  сонар более крупный, что увеличиквает робота в размерах а значит повышает шанс его обнаружить, четвертое – сонар обычно требует 2 контакта микропроцессорной платы для управления в отличие от ИК, который обходится одним линком с микропроцессорной платой. Пятое – так как роботы при перемещении качаются, переваливаются, сонар чаще «зацепляет» поверхность ринга и может принимать ее за соперника. Вот поэтому сонары менее часто распространены. Для информации ссылка на документацию.

Итак, мы выбираем для нашего робота ИК датчики Sharp GP2Y0A60SZLF в качестве органов «зрения».

Вопрос – сколько таких датчиков выбирать? — также очень важен.

У человека два глаза. Благодаря этому факту мы имеем стереозрение, позволяющее нам определять расстояние и запас, если один глаз откажет… ;)

Многие говорят что имеют «третий глаз» позволяющий им избегать неприятностей… ;)

На практке сумороботостроители применяют 1-6 датчиков – «глаз» робота. Очень часто – два спереди, и по одному справа и слева. Выбор конструкции всегда за Вами.

Что необходимо обязательно учитывать?

Измерения расстояния одним из наиболее распространенных датчиков GP2Y0A21SK0F (10-80см), занимают примерно 50 милисекунд. Выбранный нами датчик измеряет расстояние примерно за 25 милисекунд. Часто роботостроители измеряют расстояние одним датчиком несколько раз для того, чтобы надежно быть уверенным, что найден противник, а не просто закралась ошибка измерения. Посчитаем, что если робот использует 2 последовательных измерения для датчика, то ему надо примерно 100 милисекунд. Много это или мало? Для сравнения – реальный бой роботов обычно длится 2 секунды. Десять измерений всеми датчиками — глазами….

Еще раз повторимся, что выбор оптимального количества «глаз» всегда за робоспортсменом-конструктором робота. Кроме того, никто не отменял механизмы оптимизации программ – когда вы можете «закрывать» некотоорые глаза на время (не измерять ими расстояния). Например – передние «глаза» надежно «видят» соперника и боковые датчики на время не используются для измерений – в Мире Робота всего один соперник на ринге во время боя, к счастью… J

Мы с Вами выберем 3 датчика – по одному спереди, справа и слева.

Перейдем к вопросу, как измерять расстояние до соперника? Для этого давайте изучим характеристики наших «глаз».

Обращаемся к документации датчика GP2Y0A60SZLF.

Обратите внимение на подчеркнутые красным параметры:

  1. Датчик аналоговый – т.е. мы с Вами можем на аналоговом контакте микропроцессорной платы получить число от 0 до 1024, которое будет характеризовать расстояние по определенной зависимости, которую мы с Вами рассмотрим чуть позже.
  2. Потребление тока датчиком составляет около 33mA – учтем это в нашем бюджете тока.
  3. Напряжение питания – 2.7V до 5.5V (рекомендуемое от 4.5V до 5.5V). Обязательно учтите, что это очень важный параметр для «глаз» Вашего робота. Стабильное напряжение без просадок и пиков – очень важно для точных измерений растояний датчиком. Для примера приведем опыт из человеческого спорта. Предположим спортсмен бежит дистанцию на время. В начале дистанции если он не сильно волнуется, его давление крови и пульс в норме. В конце дистанции обычно его пульс значительно повышен, давление также и обычно глаза «затуманены», угол зрения значительно снижен… Также и у робота – если его «пульс» и «давление» (а это примерные аналоги напряжения и потребляемого тока) мы будем держать в заданном диапазоне, а еще лучше абсолютно стабильными, то и измерения дистанции его «глазами» — датчиками будут абсолютно стабильны.

Давайте изучим зависимость между аналоговыми значениями и дистанцией до измеряемого объекта.

На пятой странице документации сенсора мы видим следующий график зависимости напряжения на аналоговом выходе датчика от расстояния до измеряемого объекта:

Обратите внимение – производитель говорит, что его датчик измеряет расстояние в диапазоне от 10 см до 150 сантиметров.

Кроме того, давайте обратим внимание на график после правой красной черты (после 50 сантиметров) – как мы видим, напряжение на аналоговом выходе будет меняться не слишком значительно при значительном изменении расстояния. Предположим разница в напряжении между измеренным расстоянием в 60 сантиметров и 70 сантиметров составляет менее 100mV.

С учетом рассмотренных особенностей данного сенсора сделаем следующие выводы для реальных условий боя между  минисумороботами с использование данных сенсоров:

1. Надежно измерить расстояние можно в диапазоне от 10 до 50 сантиметров – этого вполне достаточно для боя минисумороботов.

2. Для стабилизации напряжения на датчике расстояния необходимо применять специальные мероприятия (рассмотрим чуть позже в уроке 6).

Теперь перейдем к скетчу.

Итак, сигнал мы получаем аналоговый, поэтому будем применять функцию analogRead(pin);

Эта функция конвертирует напряжение от 0V до 5V на контакте (pin) в числовое значение от 0 до 1023 или примерно 0.0049V на единицу. Таким образом если сенсор измерит расстояние 50 сантиметров до соперника, то на аналоговом выводе сенсора, соединенном с контактом микропроцессорной платы, появится напряжение (смотрим по рисунку) 1.0V. А функция analogRead(номер контакта) вернет нам значение 1/0.0049 ~ 204.

Для подключения 3-х сенсоров расстояния будем использовать аналоговые контакты микропроцессорной платы A0, A1(они помечены на самой плате) и аналоговый порт A8(он находится на контакте 8 микропроцесссорной платы AStar32U4).

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

//объявляем переменные, содержащие значения //аналоговых портов

int front_eye = A0;

int left_eye = A1;

int right_eye = A8;

 

void setup(){

//инициализируем терминальный вывод

Serial.begin(9600);

}

 

 

 

void loop(){

//выводим данные о значениях расстояний в окно

//терминала в одну строку

Serial.print(«front_distance = «);

Serial.print(analogRead(front_eye));

Serial.print(» left_distance = «);

Serial.print(analogRead(left_eye));

Serial.print(» right_distance = «);

Serial.println(analogRead(right_eye));

//немного задерживаем вывод данных, чтобы было //удобнее смотреть

delay(500);

}

 

Какие новые функции мы видим в данном скетче?

Функции работы с портом, к которому подключена микропроцессорная плата.

Serial.begin(“скорость порта”); — инициализация порта для обмена данными между микропроцессорной платой и компьютером.

Serial.print(“что-то”); — вывод в этот порт данных какой-то строки, заключенной в кавычках или значения функции analogRead(номер контакта).

Serial.println(“что-то”); — вывод строки с переходом на новую строку.

Загружаем скетч в микропроцессорную плату, затем, не отключаем кабель от платы, открываем окно терминала:

Затем в окне терминала мы видим результат работы скетча:

Для человека не очень удобно переводить полученное значение  в вольты, а затем лезть каждый раз документацию и сопоставлять вольты с расстоянием – роботу же все равно и проще составить таблицу соответствия расстояния измеренному значению функцией analogRead().

Таблица для датчика GP2Y0A60SZLF и плоской поверхности, напечатанной на 3D принтере из ABC пластика.

Аналоговое значение

Расстояние (см)

790

5

816

6

793

7

748

8

701

9

640

10

546

12

464

15

380

20

355

25

333

30

 

 

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

Еще одно замечание по таблице – датчик GP2Y0A60SZLF расчитан для измерения расстояния от 10 до 150 см. Мы с Вами попробовали измерить меньшие расстояния, и это получилось – отметим, что на расстоянии 5 см и 7 см  показания датчика примерно равны. Значит эффективно померить расстояние можно примерно до 6 см.

Почему нам лучше не переводить аналоговое значение в расстояние? Во время боя все ресурсы робота надо направлять только для достижения победы и потеря времени для перевода значения функции analogRead() в расстояние в сантиметрах может вам вылиться в поражение от соперника, который оптимизирует вычислительные ресурсы. Более подробно о путях совершенствования спортивного искусства поговорим на 9 уроке.

 

 

 

 

Вопросы для самопроверки:

  1. Инфракрасный свет против ультразвука – поразмышляйте сами – что оптимальнее  использовать для «зрения» робота.
  2. Возвращаемое значение функции analogRead(pin); — расскажите подробнее о связи между значением этой функции, напряжением и расстоянием в сантиметрах.
  3. Подумайте, какие еще технологии, которые могут заменить «глаза» сумороботу Вы можете предложить использовать?
  4. Какие решения можно применить для того, чтобы спрятаться от «зрения» соперника в пределах правил боев роботов Robotchallenge.org?*

Aboutadmin