Лазерный дальномер из web камеры
В продаже, есть большое количество, дешёвых, датчиков – дальномеров, в их числе ультразвуковые и инфракрасные. Все эти устройства работают хорошо, но из – за значительного веса, не подходят для летающих роботов. Миниатюрный робот вертолет, например, может нести около 100г полезной нагрузки. Это даёт возможность использовать, для поиска препятствий и предотвращения столкновений с ними, машинное зрение, используя веб-камеры (или другие миниатюрные, беспроводные камеры с подключением к компьютеру через USB). А еще лучше, установить две камеры, что обеспечит роботу, стерео зрение, таким образом, благодаря информации о глубине изображения, улучшится обход препятствий. Недостатком этой идеи, является, добавление веса второй камеры.
В этой статье описывается, как маленькая лазерная указка, вместе с одной web камерой, может обеспечить моно машинное зрение, с большим диапазоном информации.
Этот проект основан на статье найденной здесь.
Принцип работы
Смотрите рисунок ниже. Лазерная точка проектируется на возможное препятствие, лежащие в поле зрения камеры, расстояние до этого препятствия может быть легко вычислено. Математика здесь очень простая, обработку данных лучше всего производить в компьютерных приложениях.
Итак, вот как это работает. Лазерный луч проецируется на объект в поле зрения камеры. Этот луч должен быть идеально параллелен оптической оси камеры. Лазерная точка захватывается вместе с остальной сценой. Простой алгоритм ищет на изображении яркие пиксели. Предполагая, что точка лазера является яркой на фоне более тёмной обстановки (я использовал обычную лазерную указку купленную в магазине за доллар), изначально положение точки в кадре не известно. Затем нам нужно рассчитать дальность до объекта, основываясь на том, где вдоль оси Y находится лазерная точка, чем ближе она к центру изображения, тем дальше находится объект.
Как мы видим из рисунка выше, расстояние (D) может быть рассчитано по формуле:
Конечно, для решения этого уравнения, вы должны знать, h- фиксированное расстояние между лазерной указкой и камерой. Знаменатель высчитывается так:
Соединив два предыдущих уравнения, мы получим:
Итак, количество пикселей от центра плоскости изображения до лазерной точки может быть просто рассчитано с картинки. А как насчет других параметров в этом уравнении? Для их получения мы должны выполнить калибровку.
Для калибровки системы, мы будем собирать серию измерений, где нам известно, дальность до цели, а также количество пикселей центра изображения до точки лазера. Эти данные записываем в таблицу ниже:
Источник
Ультразвуковой дальномер
Приветствую всех. Попал мне в руки недавно ультразвуковой датчик, который измеряет расстояние до объекта — US-100. Подобную вещь можно приобрести на торговых интернет площадках. На рынках своего города таких игрушек в продаже не удалось найти. Было решено построить схему на основе такого датчика на распространенном микроконтроллере AVR ATmega8. Назначение устройства состоит в измерении расстояния до объекта, а также измерения температуры. К слову о температуре. Модель US-100 это ультразвуковой датчик с температурной компенсацией. Скорость распространения звуковой (ультразвуковой) волны при разных температурах будет отличаться. Измерение датчика основано на времени прохождения звуковой волны от объекта до приемника датчика. Температурная компенсация, скорее всего не полностью, устранит погрешность вызванную температурой окружающей среды.
При рассмотрении печатной платы, можно сделать заключение об источнике измерения температуры: термометр находится в микросхеме или измерение температуры идет за счет диода, расположенного на краю платы. При измерении температуры диодом используется его P-N переход и связано это с температурным коэффициентом проводимости. С большой уверенностью это второй вариант, так как при работе ниже приведенной схемы при касании пальцами этого диода, температура изменяется. Так что при измерении лучше всего стараться руками не трогать датчик, чтобы получить более точные данные о расстоянии.
Для измерения датчик использует 2 головки, напоминающие большой микрофон или маленький динамик. По сути это и то, и то. Одна из головок излучает ультразвуковую волну, вторая принимает отраженный сигнал ультразвуковой волны. По времени прохождения определяется пройденное расстояние. По видимому ограничение измеряемого расстояния в 4,5 метра обусловлена мощностью излучателя.
Что относительно общения датчика с микроконтроллером, модель US-100 имеет два возможных интерфейса, выбираемые перемычкой на задней стороне платы датчика. Если перемычка стоит выбран интерфейс UART, если перемычка снята, используется интерфейс или режим работы GPIO. В первом случае для общения с микроконтроллером используется либо аппаратные средства микроконтроллера, либо программные. Во втором случае принимать и передавать данные придется только вручную. В схеме устройства задействуем более простой режим работы с использованием UART интерфейса.
Необходимо уточнить нюансы по распиновке и подключению датчика к микроконтроллеру. Обычно при передачи данных по UART линии Rx и Tx подключаются крест накрест — Rx на Tx, а Tx на Rx. Данный ультразвуковой датчик же нужно подключать в соответствии с подписанными контактами на печатной плате Rx на Rx, а Tx на Tx. Китайцы отожгли, согласен. Прежде чем это определилось, пришлось долго мучиться и в конце концов придти к этому. Итак, при работе по UART, для инициализации одного измерения расстояния ультразвуковому датчику US-100 необходимо на вывод Trig/Tx передать значение 0x55, что соответствует символу «U». В ответ датчик передаст два байта информации о расстоянии на вывод Echo/Rx — первый байт — это старшие 8 бит, второй байт — младшие 8 бит. Единицы измерения расстояния — миллиметры. Чтобы два байта перевести в одно значение расстояния, необходимо первый байт умножить на 256 и прибавить второй байт. Необходимо делать таким образом, потому что при переполнении младшего байта, старший байт увеличивается на единицу. Чтобы вывести текущее значение температуры окружающей среды, необходимо передать значение 0x50, что соответствует символу «P». В ответ датчик передаст значение температуры. Фактическое значение температуры будет равно полученному значению от датчика отнять 45.
Параметры ультразвукового датчика US-100:
- напряжение питания — 2,4 — 5,5 вольт постоянного напряжения
- потребляемый ток в режиме ожидания — 2 мА
- рабочая температура — минус 20 — плюс 70 С
- угол обзора — 15 градусов
- интерфейс — GPIO или UART
- измеряемое расстояние — от 2 см до 450 см
- погрешность — плюс минус 3 мм + 1%
Конфигурация UART для датчика: 9600 baud rate, 8 data bits, parity: none, 1 stop bit.
Перейдем к схеме устройства.
Схема ультразвукового дальномера построена на основе микроконтроллера Atmega8 и ультразвуковом датчике US-100. Питание схема берется от линейного стабилизатора напряжения L7805, его можно заменить отечественным аналогом КР142ЕН5А, конденсаторы в обвязке стабилизатора обязательны, хотя может работать и без них. Некоторые стабилизаторы просто не запускаются без конденсаторов. Линейный стабилизатор можно заменить на импульсный, например MC34063 или LM2576, но придется немного изменить схему согласно подключению импульсных стабилизаторов в схеме. Конденсаторы С5-С7 необходимы для обеспечения стабильности работы микроконтроллера и датчика. Номиналы всех конденсаторов можно варьировать в разумных пределах. Резистор R2 необходим для предотвращения самопроизвольного перезапускания микроконтроллера и служит подтяжкой положительного питания на вывод reset. Резистор R1 регулирует контраст LCD-дисплея. В качестве информационной панели был взят жидкокристаллический (ЖК или по другому LCD) экран SC1602, 2 строки по 16 символов на основе контроллера HD44780. Заменить LCD-дисплей можно на любую другую модель на базе контроллера HD44780 с таким же количеством строк и символов в строке или больше. На печатной плате LCD-дисплея есть возможность задействовать подсветку экрана двумя способами — либо при помощи допаивания резистора и перемычки на самой плате экранчика или при помощи специальных выводов, обычно обозначенных как «А» и «К». Анод и катод соответственно. К ним через токоограничительный резистор подключается напряжение питания схемы 5 вольт. В данной схеме задействован первый способ, поэтому на схеме не обозначено. Вместо тактовых кнопок S1 — S5 можно использовать любые другие кнопки. Светодиод LED1 можно использовать любой подходящий по цвету или заменить его на транзистор и управлять какой-либо другой схемой в зависимости от превышения дистанции от датчика. В зависимости от примененного типа транзисторов (P-N-P или N-P-N) при превышении лимита дистанции или расстояния выход будет иметь положительное или отрицательное напряжение, то есть при высоком логическом сигнале микроконтроллера транзистор N-P-N будет открыт, а транзистор P-N-P закрыт. В прошивку микроконтроллера заложен параметр, при котором при превышении обозначенного лимита расстояния на вывод PB0 будет подаваться высокий логический уровень напряжения. В данной схеме светодиод просто сигнализирует о превышении. Данный сигнал дублируется на LCD-дисплее подчеркиванием данный о лимите дистанции. Данный параметр можно регулировать кнопками S1, S2. При нажатии происходит увеличение или уменьшение на 10 мм. Информация о дистанции на дисплей выводится также в миллиметрах. Информация о температуре окружающей среды выводится на дисплей в градусах Цельсия. К статье прилагается два варианта прошивок: 1) непрерывное измерение параметров дистанции и температуры (интервал примерно 0,2 секунды), при этом кнопки S4, S5 не задействуются, 2) при нажатии кнопок S4, S5 происходит однократный запрос к датчику на измерение температуры и расстояния. Видео к статье сделано с прошивкой номер 1. Для программирования микроконтроллера необходимо прошить фьюз биты:
Новичкам рекомендую пользоваться шестнадцатеричными значениями фьюз битов HIGH и LOW, чтобы не напортачить с расстановкой галочек. Скриншот из AVRstudio (есть отличия от дудки, sina prog и других программ для прошивки микроконтроллеров). Если Вы используете программы для прошивки микроконтроллеров AVR, в которых нет ввода параметров фьюзов, то можно воспользоваться фьюз калькуляторами для перевода галочек в шестнадцатеричную форму и наоборот.
Схема была собрана и проверена на макетной плате для Atmega8:
Конструктивно схему можно оформить, например, в виде пистолета с лазерным указателем направления ультразвукового датчика. Единственно ограничено измеряемое расстояния, при превышении которого погрешность резко возрастает. Также ограничение касается положения и размера предмета, до которого измеряется расстояние — расстояние до слишком мелких объектов или объектов находящихся под большим углом будет искажено. Идеальное сочетание достаточно большие предметы, находящиеся перпендикулярно направлению датчика. Погрешность измерений примерно соответствует заявленным производителем. Данное устройство при дальнейшем развитии можно использовать как обнаружитель препятствий, наподобие парктроника в комнатных условиях, так как на улице ультразвуковые головки данного датчика будут забиваться грязью.
Предлагайте свои идеи и варианты применения, наиболее интересные идеи в будущем могут быть реализованы.
К статье прилагаю 2 варианта HEX прошивок для МК, проект в Proteus (версия 7.7, ультразвукового датчика US-100 в базе proteus’а нет, но задействован UART отладчик), а также небольшое видео, демонстрирующее работу схемы.
Источник
Самодельный фазовый лазерный дальномер
В статье я расскажу о том, как я делал лазерный дальномер и о принципе его работы. Сразу отмечу, что конструкция представляет собой макет, и ее нельзя использовать для практического применения. Делалась она только для того, чтобы убедится в том, что фазовый дальномер реально собрать самому.
Теория
Часто приходится встречать мнение, что с помощью лазера расстояние измеряют только путем прямого измерения времени «полета» лазерного импульса от лазера до отражающего объекта и обратно. На самом деле, этот метод (его называют импульсным или времяпролетным, TOF) применяют в основном в тех случаях, когда расстояния до нужного объекта достаточно велики (>100м). Так как скорость света очень велика, то за один импульс лазера достаточно сложно с большой точностью измерить время пролета света, и следовательно, расстояние. Свет проходит 1 метр примерно за 3.3 нс, так что точность измерения времени должна быть наносекундная, хотя точность измерения расстояния при этом все равно будет составлять десятки сантиметров. Для измерения временных интервалов с такой точностью используют ПЛИС и специализированные микросхемы.
Однако существуют и другие лазерные методы изменения расстояния, одним из них является фазовый. В этом методе, в отличие от предыдущего, лазер работает постоянно, но его излучение амплитудно модулируется сигналом определенной частоты (обычно это частоты меньше 500МГц). Отмечу, что длина волны лазера при этом остается неизменной (она находится в пределах 500 — 1100 нм).
Отраженное от объекта излучение принимается фотоприемником, и его фаза сравнивается с фазой опорного сигнала — от лазера. Наличие задержки при распространении волны создает сдвиг фаз, который и измеряется дальномером.
Расстояние определяется по формуле:
Где с — скорость света, f — частота модуляции лазера, фи — фазовый сдвиг.
Эта формула справедлива только в том случае, если расстояние до объекта меньше половины длины волны модулирующего сигнала, которая равна с / 2f.
Если частота модуляции равна 10МГц, то измеряемое расстояние может доходить до 15 метров, и при изменении расстояния от 0 до 15 метров разность фаз будет меняться от 0 до 360 градусов. Изменение сдвига фаз на 1 градус в таком случае соответствует перемещению объекта примерно на 4 см.
При превышении этого расстояния возникает неоднозначность — невозможно определить, сколько периодов волны укладывается в измеряемом расстоянии. Для разрешения неоднозначности частоту модуляции лазера переключают, после чего решают получившуюся систему уравнений.
Самый простой случай — использование двух частот, на низкой приблизительно определяют расстояние до объекта (но максимальное расстояние все равно ограничено), на высокой определяют расстояние с нужной точностью — при одинаковой точности измерения фазового сдвига, при использовании высокой частоты точность измерения расстояния будет заметно выше.
Так как существуют относительно простые способы измерять фазовый сдвиг с высокой точностью, то точность измерения расстояния в таких дальномерах может доходить до 0.5 мм. Именно фазовый принцип используется в дальномерах, требующих большой точности измерения — геодезических дальномерах, лазерных рулетках, сканирующих дальномерах, устанавливаемых на роботах.
Однако у метода есть и недостатки — мощность излучения постоянно работающего лазера заметно меньше, чем у импульсного лазера, что не позволяет использовать фазовые дальномеры для измерения больших расстояний. Кроме того, измерение фазы с нужной точностью может занимать определенное время, что ограничивает быстродействие прибора.
Наиболее важный процесс в таком дальномере — это измерение разности фаз сигналов, которая и определяет точность измерения расстояния. Существуют различные способы измерения разности фаз, как аналоговые, так и цифровые. Аналоговые значительно проще, цифровые дают большую точность. При этом цифровыми методами измерить разность фаз высокочастотных сигналов сложнее — временная задержка между сигналами измеряется наносекундами (эта задержка возникает также, как и в импульсном дальномере).
Для того, чтобы упростить задачу, используют гетеродинное преобразование сигналов — сигналы от фотоприемника и лазера по отдельности смешивают с сигналом близкой частоты, который формируется дополнительным генератором — гетеродином. Частоты модулирующего сигнала и гетеродина различаются на килогерцы или единицы мегагерц. Из полученных сигналов при помощи ФНЧ выделяют сигналы разностной частоты.
Пример структурной схемы дальномера с гетеродином. М — генератор сигнала модуляции лазера, Г — гетеродин.
Разность фаз сигналов в таком преобразовании не изменяется. После этого разность фаз полученных низкочастотных сигналов измерить цифровыми методами значительно проще — можно легко оцифровать сигналы низкоскоростным АЦП, или измерить задержку между сигналами (при понижении частоты она заметно увеличивается) при помощи счетчика. Оба метода достаточно просто реализовать на микроконтроллере.
Есть и другой способ измерения разности фаз — цифровое синхронное детектирование. Если частота модулирующего сигнала не сильно велика (меньше 15 МГц), то такой сигнал можно оцифровать высокоскоростным АЦП, синхронизированным с сигналом модуляции лазера. Из теоремы Котельникова следует, что частота дискретизации при этом должна быть в два раза выше частоты модуляции лазера. Однако, так как оцифровывается узкополосный сигнал (кроме частоты модуляции, других сигналов на входе АЦП нет), то можно использовать метод субдискретизации, благодаря которому частоту дискретизации АЦП можно заметно снизить — до единиц мегагерц. Понятно, что аналоговая часть дальномера при этом упрощается.
Более подробно (с всеми нужными формулами) этот метод рассматривается здесь (на английском) и здесь (на русском).
В первой статье указывается, что если частота дискретизации сигнала (fsp) связана с частотой модуляции (fo) следующим соотношением:
где p — целое число, то процесс вычисления фазы значительно упрощается.
Достаточно взять N выборок сигнала X[i], после чего разность фаз можно вычислить по следующим формулам:
Отмечу, что оба вышеуказанных метода часто применяются вместе — низкочастотные сигналы подаются напрямую на АЦП, высокочастотные переносятся в область более низких частот за счет гетеродинного преобразования, и также подаются на АЦП.
Именно второй вариант фазометра, с использованием частоты модуляции 10МГц я и решил реализовать в своем макете дальномера.
Практика
Структурная схема моего дальномера:
Фактически, вся конструкция состоит из 3 частей — отладочной платы с микроконтроллером, усилителя сигнала лазера с самим лазером, и фотоприемника с усилителем и фильтром.
В вышеописанной теории предполагалось, что излучение лазера модулируется синусоидальным сигналом. Сформировать такой сигнал частотой 10Мгц с использованием контроллера непросто, поэтому в своей конструкции я подаю на лазер меандр частотой 10МГц. После усиления сигнала с фотоприемника от полученного сигнала отсекаются лишние гармоники полосовым LC-фильтром, настроенным на частоту 10МГц, в результате чего на выходе фильтра возникает сигнал, очень близкий к синусоидальному.
Схема аналоговой части (усилителя лазера и приемной части):
Схема была взята из проекта лазерной связи Ronja, описание на русском. В этом проекте как раз реализована передача данных со скоростью 10Mbit, что соответствует выбранной частоте модуляции.
Как видно из схемы — усилитель мощности для лазера простейший, собран на микросхеме 74HC04 (содержит 6 инверторов). Включение микросхемы не совсем корректное, но оно работает. Ток через лазер ограничивается резисторами (тоже не самое лучшее решение). Напряжение питания 5В для усилителя берется с отладочной платы.
Для того, чтобы сигнал с усилителя не наводился на остальную часть схемы, корпус усилителя сделан металлическим, все провода экранированы.
Сам лазер (красного цвета) взят из пишущего DVD-привода, его мощность можно установить достаточно высокой, и он гарантированно будет работать на частоте 10МГц.
Приемник состоит из фотодиода и усилителя, собранного на полевом транзисторе и микросхеме-высокоскоростном усилителе. Так как с увеличением расстояния освещенность фотодиода сильно падает, то усиление должно быть достаточно большим (в этой схеме оно примерно равно 4000). Кроме того, с ростом частоты заметно падает сигнал на выходе фотодиода (сказывается его емкость). Отмечу, что усилитель в данной конструкции — важнейшая и наиболее капризная часть. Как оказалось, его усиления явно не хватает. Изначально я предполагал, что коэффициент усиления можно будет менять (чтобы ослаблять сигнал при его слишком большой величине), используемая схема позволяет это делать, меняя напряжение на втором затворе транзистора. Однако оказалось, что при изменении усиления достаточно сильно изменяется вносимый усилителем сдвиг фаз, что ухудшает точность измерения расстояния, так что пришлось установить коэффициент усиления на максимум, подавая на затвор транзистора напряжение 3В с батарейки.
Приемнику для работы требуется напряжение 12В, так что для его питания приходится использовать отдельный блок питания.
Усилитель очень чувствителен к внешним наводкам, так что он тоже должен быть экранированным. Я взял готовый корпус от нерабочего оптического датчика, и разместил усилитель в нем (белая полоска — фольга для дополнительного экранирования фотодиода):
Отмечу, что наводка сигнала от лазера на приемник довольно сильно ухудшает точность измерения разности фаз, так что нужно контролировать, чтобы такая наводка отсутствовала.
LC-фильтр, используемый в дальномере — взят от приемника. Так как фильтр отсекает постоянную составляющую сигнала, а АЦП отрицательные сигналы не воспринимает, то ее приходится добавлять при помощи резисторного делителя R15, R16. Постоянное напряжение, подаваемое на делитель, берется c отладочной платы (VCC).
Отладочная плата — STM32F4-DISCOVERY. Ее выбрал потому, что для формирования двух достаточно различающихся частот нужен генератор достаточно высокой частоты (PLL STM32F4 может давать частоты больше 100МГц).
В формуле, связывающей частоту модуляции и дискретизации, коэффициент «p» я принял равным 6, так что при частоте модуляции 10МГц частота дискретизации должна быть 1.6МГц.
Для формирования частоты 10МГц используется таймер TIM2, работающий в режиме формирования ШИМ сигнала. При системной частоте 160МГц его период — 16 «тиков».
АЦП получает запросы на запуск от таймера TIM8. Для формирования частоты 1.6МГц его период — 100 «тиков». Все данные от АЦП при помощи DMA сохраняются в массив, размер которого должен быть равен двойке в N степени. Оба таймера, АЦП и DMA запускаются один раз при включении и больше уже не отключаются. Таким образом, так как таймеры тактируются от одного источника, а одному периоду измеряемого сигнала соответствуют четыре выборки данных, получается, что в массив всегда попадет целое число периодов сигнала.
Так как останавливать DMA не желательно (это упрощает управление захватом данных), при заполнении первой половины массива генерируется прерывание. Обнаружив, что половина массива заполнена, контроллер копирует ее содержимое в другой массив (в целях упрощения программы вторая половина основного массива при этом не используется). После этого полученные данные обрабатываются — вычисляется средняя амплитуда и фаза сигнала, проводится пересчет фазового сдвига в расстояние.
Полученные величины выводятся на ЖК индикатор от кассового аппарата, также подключенный к отладочной плате.
Дальномер должен знать где находится начало отсчета. Для его калибровки при включении на «нулевом» расстоянии от дальномера устанавливается объект, после чего на отладочной плате нужно нажать кнопку, при этом измеренное значение дальности записывается в память, после чего это значение будет вычитаться из измеренной дальномером дальности.
Как я уже отмечал выше, реализовать автоматическое управление усилением не удалось. При этом изменение амплитуды принятого сигнала приводит к изменению фазовых сдвигов в усилителе, и следовательно, к дополнительным ошибкам.
Поэтому мне пришлось регулировать освещенность фотодиода при помощи механической заслонки, поворачиваемой сервоприводом — при слишком большой освещенности заслонка перекрывает световой поток. ШИМ сигнал для управления приводом формируется таймером TIM3.
Про оптику. Без нее дальномер невозможен. Ее конструкция хорошо видна на фотографиях ниже. Лазер находится внутри пластиковой трубки, установленной вертикально. В нее вставлена небольшая втулка с зеркальной призмой. Втулку можно поворачивать, поднимать и опускать, перемещая таким образом луч лазера. Так как я догадывался, что усиления не хватит, то для приема сигнала использовал крупную линзу Френеля.
Так так лазер, линза и фотодиод установлены соосно, то на близких расстояниях лазер закрывает от фотодиода собственный луч. Для компенсации этого эффекта я установил вторую линзу (лупа с оправой), хотя полностью эффект не устраняется, поэтому максимальный сигнал наблюдается на расстоянии примерно 50-70 см от лазера.
А вот и фотографии получившейся конструкции:
На индикаторе первое число — амплитуда в единицах АЦП, второе число — расстояние в сантиметрах от края доски.
Видео работы дальномера:
Дальность работы у получившегося дальномера вышла достаточно небольшая: 1,5-2 м в зависимости от коэффициента отражения объекта.
Для того, чтобы увеличить дальность, можно использовать специальный отражатель, на который нужно будет направлять луч лазера.
Для экспериментов я сделал линзовый отражатель, состоящий из линзы, в фокусе которой расположена матовая бумага. Такая конструкция отражает свет в ту же точку, откуда он был выпущен, правда, диаметр луча при этом увеличивается.
Фотография отражателя:
Использование отражателя:
Как видно, расстояние до отражателя — 6.4 метра (в реальности было примерно 6.3). Сигнал при этом возрастает настолько, что его приходится ослаблять, направляя луч лазера на край отражателя.
Точность получившегося дальномера — 1-2 сантиметра, что соответствует точности измерения сдвига фаз — 0,2-0,5 градуса. При этом, для достижения такой точности, данные приходится слишком долго усреднять — на одно измерение уходит 0.5 сек. Возможно, это связано с использованием PLL для формирования сигналов — у него довольно большой джиттер. Хотя я считаю, что для самодельного макета, аналоговая часть которого сделана довольно коряво, в котором присутствуют достаточно длинные провода, даже такая точность — довольно неплохо.
Отмечу, что я не смог найти в Интернете ни одного существующего проекта фазового дальномера (хотя бы со схемой конструкции), что и послужило причиной написать эту статью.
Источник