Зрение как свойство глаз различать предметы и мозга распознавать это различие и заставить по разному реагировать наши органы движения в зависимости от того, тигра мы увидели или кошку – важнейшее приобретение эволюции организмов (по Дарвину) или божественной сущности (религиозный подход), проявляющейся в человеке.
Человек конструирует роботов по своему образу и подобию («мозг» и «ноги» робота мы уже рассмотрели и научились ими управлять) –теперь очередь за зрением.
Безусловно, когда мы говорим о зрении, в качестве сенсора(датчика, органа) зрения, человек подразумевает камеру, передающую изображение. Для обработки роботом полученного с камеры изображения сейчас существует достаточно много специализированных решений и программных библиотек. Но для практической реализации этих решений требуются значительные вычислительные ресурсы и математический аппарат, реализованный в программных средствах.
Еще раз оценим – готова ли наша миниатюрная микропроцессорная плата 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.
Обратите внимение на подчеркнутые красным параметры:
- Датчик аналоговый – т.е. мы с Вами можем на аналоговом контакте микропроцессорной платы получить число от 0 до 1024, которое будет характеризовать расстояние по определенной зависимости, которую мы с Вами рассмотрим чуть позже.
- Потребление тока датчиком составляет около 33mA – учтем это в нашем бюджете тока.
- Напряжение питания – 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 уроке.
Вопросы для самопроверки:
- Инфракрасный свет против ультразвука – поразмышляйте сами – что оптимальнее использовать для «зрения» робота.
- Возвращаемое значение функции analogRead(pin); — расскажите подробнее о связи между значением этой функции, напряжением и расстоянием в сантиметрах.
- Подумайте, какие еще технологии, которые могут заменить «глаза» сумороботу Вы можете предложить использовать?
- Какие решения можно применить для того, чтобы спрятаться от «зрения» соперника в пределах правил боев роботов Robotchallenge.org?*