В этой статье я хочу рассказать про свой проект импульсного (TOF) Open Source лидара — о том как я его делал, и каких результатов удалось добиться.
Немного теории
Лазерные дальномеры по принципу работы можно разделить на три основные типа:
- Триангуляционные. Дальномеры этого типа определяют расстояние, используя законы геометрии. Дальномер измеряет угол между лучом лазера и отраженным лучом света, попавшим на фотоприемник, и из величины этого угла и расстояния между лазером и фотоприемником вычисляет текущее расстояние до объекта.
У этих дальномеров есть преимущества:
— Наиболее простые среди всех остальных дальномеров.
— Могут измерять расстояния с высокой точностью на близких дистанциях.
— Могут измерять расстояния с достаточно высокой скоростью — до 10 кГц.
Но есть и недостатки:
— Точность измерения расстояния значительно падает с ростом расстояния.
— Лазер должен быть включен достаточно долго (фотоприемники имеют ограниченную чувствительность), поэтому его мощность нужно ограничивать для безопасности.
— Чем меньше габариты дальномера, тем хуже точность измерения расстояния.
Именно такие дальномеры используются в роботах-пылесосах, так же к ним относятся довольно популярные в любительской робототехнике дальномеры RPLIDAR. Стоят они обычно 100-400$.
Про дальномеры такого типа я подробно писал в своих статьях: Самодельный сканирующий лазерный дальномер и Реверс-инжиниринг лазерного датчика расстояния
- Фазовые. В этих дальномерах свет лазера модулируется высокочастотным сигналом. Задержка во время распространения луча в его «полете» до объекта и обратно приводит к появлению фазового сдвига между сигналом, который используется для управления лазером, и который принимается от объекта.
У этих дальномеров есть преимущества:
— Высокая точность измерения расстояния (единицы миллиметров и меньше). Может падать при уменьшении отношения сигнал/шум.
— Можно сделать малогабаритное устройство.
Но есть и недостатки:
— Лазер работает постоянно, поэтому приходится ограничивать его мощность. Это приводит к тому, что на больших расстояниях принимаемый сигнал оказывается довольно низким, что сказывается на точности дальномера.
— Электроника такого дальномера относительно сложная.
— Сложно получить высокую скорость измерений.
Дальномеры такого типа используются в промышленности, геодезии. Лазерные рулетки в большинстве своем используют как раз фазовый метод измерения расстояния. Достаточно известный в робототехнике лидар «Hokuyo URG-04LX» тоже является фазовым.
Специализированные 3D-сенсоры (range imaging camera) тоже часто используют этот метод.
Про дальномеры такого типа я подробно писал в своих статьях: Самодельный фазовый лазерный дальномер и Как работает лазерная рулетка: реверс-инжиниринг
- Импульсные. Также их называют «времяпролетные», Time-Of-Flight (TOF). Они используют «классический», наиболее известный большинству метод измерения расстояния — дальномер измеряет время «полета» вспышки света до объекта и обратно. Несмотря на кажущуюся простоту метода, из-за высокой скорости света довольно сложно сделать дальномер, способный точно измерять расстояние.
У этих дальномеров есть преимущества:
— Лазер используется в импульсном режиме, что позволяет формировать импульсы сверхбольшой мощности (более МВт). За счет этого можно измерять очень большие расстояния (даже до Луны).
— Можно сделать малогабаритное устройство. Датчики вроде VL53L0X используют именно этот метод.
— Можно получить очень высокую скорость измерений — 100 кГц и более.
Но есть и недостатки:
— Сложно измерить расстояние с высокой точностью (< ±0.5 м).
— Электроника такого дальномера относительно сложная.
Дальномеры такого типа активно используют военные, они используются в геодезии, дистанционном зондировании Земли, промышленности, автономных автомобилях, их устанавливают на беспилотники — т.е. они встречаются везде, где требуется измерение больших расстояний.
Я с подобным дальномером сталкивался в процессе реверс-инжиниринга: Реверс-инжиниринг лазерного сканера Leuze RS4
Однако реверс-инжиниринг готового устройства это одно, а вот изготовление своего дальномера — совершенно другое.
Устройство импульсного лазерного дальномера
Ключевые компоненты лазерного дальномера это электроника и оптика. Если дальномер сканирующий (2D/3D), то к ним обычно добавляется и механика.
Вот так выглядит структурная схема моего дальномера:
Основные узлы электроники такого дальномера:
- Узел импульсного лазера. Содержит сам лазер и электронику, управляющую им. Главное требование к этому узлу — возможность сформировать максимально мощный импульс света с максимально крутым передним фронтом. Чем мощнее импульс — тем больше отношение сигнал/шум принимаемого сигнала, а чем круче фронт — тем выше точность измерения расстояния.
- Узел фотоприемника. Содержит фотоприемник, принимающий отраженный от объекта сигнал; электронику для его питания, усилитель сигнала и компаратор, выделяющий полезный сигнал среди помех. Главные требования здесь — возможность максимально усилить принятый сигнал, не добавляя в него слишком много помех и не ухудшить крутизну переднего фронта импульса.
- Узел измерения времени. Здесь происходит особая «магия» — высокоточное измерение времени «полета» светового импульса. Расстояние 1 м до объекта и обратно свет проходит за 6.6 нс — микроскопически малое время! Чтобы получить разрешение 1 см, требуется измерять время полета с дискретностью 66 пс.
Если попытаться использовать традиционный метод измерения времени — подсчитывать импульсы от некого генератора частоты во время «полета», то выходит, что для получения разрешения 1 см требуется частота генератора > 15 ГГц! Понятно, что изготовить генератор и счетчик, способные работать с такой частотой, очень сложно.
Поэтому для измерения настолько малых интервалов времени были разработаны специальные микросхемы TDC (Time-to-digital converter). Эти микросхемы могут использовать различные методы измерения времени, но наиболее распространенный — использование линий задержки. На Хабре есть хорошая статья, описывающая принцип работы TDC: Преобразователи Time-To-Digital (TDC): что это такое и как они реализованы в FPGA
- Микроконтроллер (MCU). Он отвечает за формирование лазерных импульсов в заданные моменты времени, считывает данные из TDC, вычисляет расстояние до объекта, вычисляет необходимые коррекции, управляет некоторыми аналоговыми параметрами схемы, отправляет данные на компьютер.
Оптику дальномера можно разделить на два узла — объектив лазера и объектив фотоприемника.
Лазерные диоды, используемые в дальномерах, имеют довольно широкую диаграмму направленности (т.е. они светят не узким лучом, а расходящимся пучком). Для того, чтобы получить узкий пучок, как раз и используются объективы различных типов.
Объектив фотоприемника предназначен для того, чтобы принять рассеянный свет от объекта, и сфокусировать его в точку — чувствительную область фотоприемника. Про то, какие объективы я использовал в своем дальномере, я расскажу далее.
Практика
Как видно, в лазерном дальномере много деталей и узлов, совершенно непривычных для радиолюбительской практики, поэтому я постараюсь подробно описать их выбор и принцип работы.
Пойдем по пунктам.
Узел импульсного лазера
В последнее время в продаже появились относительно дешевые и достаточно мощные импульсные лазерные диоды OSRAM "SPL PL90_3". Выглядят они вот так:
Работают на длине волны 905 нм, и выдают в импульсе мощность до 75 Вт. Сразу замечу, что эти диоды абсолютно невозможно использовать в режиме постоянного свечения (CW). Для того, чтобы получить такую мощность, нужно пропустить через диод довольно большой ток — 30А!
Для управления лазером была использована такая схема (она достаточно стандартная):
Лазерный диод здесь обозначен D4. Узел управления лазером работает достаточно просто. Изначально транзистор Q2 закрыт, лазер не светит, конденсатор С17 заряжается через резистор R18 до напряжения Vlaser. Фактически, в этом конденсаторе запасается вся энергия, которая будет использована для излучения лазера. Она не так уж и велика — при напряжении 16В и емкости конденсатора 20 нФ запасенная в нем энергия будет составлять 2,5 мкДж.
В заданный момент на драйвер транзистора DA6 поступает импульс, он усиливает этот импульс, транзистор Q2 резко открывается и лазер начинает излучать свет, забирая при этом энергию из конденсатора. Длительность световой вспышки лазера ограничена именно емкостью конденсатора. Если бы все компоненты были бы идеальными, то в таком случае максимальный ток через лазер мог бы быть очень большим, но в реальности он сильно ограничивается индуктивностями элементов.
Полезная особенность такой схемотехники — даже если транзистор выйдет из строя и в нем возникнет короткое замыкание — ток через лазерный диод будет ограничен резистором R18, и не будет превышать и 0.1 А. Генерация излучения в лазере начинается при токе 0.5 А, так что такая неисправность не станет опасной для зрения.
Резистор R19 используется для контроля за током лазера. К нему подключен миниатюрный высокочастотный разъем U.FL, через который можно подключить осциллограф и наблюдать за формой тока, протекающего через лазер. Вот пример такой осциллограммы при Vlaser=15V
:
Видно, что импульс тока длится около 25 нс, колебания тока во время импульса связаны с резонансными явлениями. Максимальное значение напряжения в данном случае соответствует максимальному току около 15А.
При помощи достаточно скоростного APD-фотоприемника с усилителем я получил вот такую осциллограмму, показывающую форму сигнала лазера (канал 2, сигнал инвертирован):
Видно, что длительность переднего фронта лазера — около 10нс.
Регулируя напряжение Vlaser, можно регулировать максимальный ток лазера. Специально для формирования этого напряжения на микросхеме DA1 сделан узел DC-DC преобразователя, выходное напряжение которого можно регулировать с микроконтроллера.
Для того, чтобы уведомить микросхему TDC о том, что лазер включился, сделан специальный узел на микросхеме DA5. Эта микросхема — высокоскоростной компаратор, срабатывающий, когда ток через лазер достигает определенного значения.
Узел фотоприемника
В настоящее время в лазерных дальномерах в качестве фотоприемников чаще всего используют лавинные фотодиоды (avalanche photodiode — APD). В отличие от обычных фотодиодов, они обладают собственным усилением фототока, за счет чего их чувствительность возрастает. С точки зрения схемотехники это очень полезно, так как в случае больших расстояний фототок обычного фотодиода усилить очень сложно — он теряется на уровне шумов усилителя. Долгое время APD были довольно дороги (> 100$) и труднодоступны, но сейчас ситуация поменялась.
К примеру, на Digikey фотодиод MTAPD-07-013 стоит в розницу 24$. В последней версии дальномера я использовал именно его. На Aliexpress можно найти еще боле дешевые AD500-8 за 10-15$. Цена эта несколько странная, так как на Mouser они продаются более чем за 100$. Тем не менее, в первой версии дальномера я использовал именно такой фотодиод, и он проявил себя достаточно хорошо. Оба вышеупомянутых фотодиода имеют диаметр чувствительной площадки 0.5 мм. На aliexpress можно найти в продаже фотодиоды AD230-8 за 24$, но они имеют площадку диаметром 0.2 мм. Это позволяет уменьшить емкость фотодиода, но усложняет юстировку оптики.
Важная особенность лавинных фотодиодов — их усиление зависит от величины напряжения обратного смещения и от температуры корпуса. Вот пример такой зависимости, взятой из datasheet на фотодиод AD500-8 TO:
Видно, что усиление начинает значительно расти при напряжении, большем 70В. При приближении к 90В чувствительность усиления фотодиода к напряжению значительно увеличивается. С ростом усиления также повышается и уровня шумов.
Если продолжить увеличивать напряжение, то наступает лавинный пробой фотодиода — ток через него значительно увеличивается, причем он становится сильно зашумленным, пропадает реакция на свет. При этом фотодиод не выходит из строя (если совсем уж не поднимать ток).
Для того, чтобы сформировать достаточно высокое напряжение смещения фотодиода, я использую в своей конструкции DC-DC преобразователь, ШИМ сигнал для которого формирует микроконтроллер. Этот преобразователь включает в себя компоненты Q1, L5, D1, C10. Для измерения напряжения используется резисторный делитель на R8/R9. Обратная связь по напряжению реализована в микроконтроллере. Частота ШИМ — 100 кГц.
Я пробовал организовать синхронное управление формированием ШИМ и запуском лазера, так как предполагал, что небольшие колебания напряжения будут ухудшать точность измерений, но не заметил никакой разницы между синхронным и несинхронным режимом. Судя по всему, RC-фильтр R10-C11 достаточно хорошо справляется со своей задачей.
Теперь стоит перейти к усилителю сигнала фотодиода. Традиционно в качестве таких усилителей используют трансимпедансные усилители (TIA). Такой усилитель получает на вход ток, а на выход выдает пропорциональное ему напряжение. В простейшем случае он представляет собой операционный усилитель с единственным резистором обратной связи:
Подробнее про TIA можно почитать, например, здесь.
Для изготовления импульсного дальномера необходимо использовать TIA с большой полосой пропускания сигнала и малой входной емкостью. Доступных микросхем не так уж и много, примерами могут быть MAX3658, MAX40658, OPA858. В своем лидаре я использовал MAX3658.
Эта микросхема разработана специально для использования с фотодиодами, имеет усиление 18000, и полосу пропускания — 580MHz. Кроме того, микросхема содержит встроенный фильтр, отсекающий низкие частоты (DC Cancellation Circuit).
Недостаток микросхемы — довольно специфическое построение ее выходного каскада:
Здесь реализован не Push-Pull выход, а Open Collector + сильная подтяжка выходов в питанию, как в (Current Mode Logic — CML).
Для того, чтобы повысить напряжение на одном из своих выходов, микросхеме нужно закрыть один из транзисторов, т.е. повышение напряжения всегда происходит через резисторы подтяжки. Это может приводить к ухудшению временных характеристик сигнала.
У микросхемы есть еще один недостаток — она не содержит защиты от статического напряжения на своем входе.
Внимание! Микросхема MAX3658 очень сильно боится статического напряжения! Устанавливать ее нужно максимально осторожно. В своем лидаре я поставил во входную цепь микросхемы защитный диод D6, его желательно установить на плату до установки TIA.
К сожалению, у меня в процессе экспериментов вышли из строя штуки 4 этих микросхем, судя по всему, именно из-за статического электричества. Ни с одной другой из микросхем я подобного никогда не встречал.
В результате у меня получилась такая схема узла фотоприемника:
Разъем J1 используется для того, чтобы смотреть форму сигнала на выходе TIA.
Конденсаторы C12, C13 подключены к следующему узлу — узлу измерения времени.
Узел измерения времени
Благодаря использованию готовой микросхемы TDC этот узел достаточно прост. Выбор дешевых микросхем тоже невелик. Есть TDC7200, есть TDC-GP21/22, остальные микросхемы обычно дороги и достать их трудно. В своем лидаре я использовал TDC-GP21.
Эта микросхема предназначена для использования в ультразвуковых счетчиках потока жидкости, но ее можно использовать и в TOF дальномерах. Дискретность измерения времени (BIN) этой микросхемы составляет ~90 пс. Управление TDC с микроконтроллера производится по SPI.
TDC имеет два отдельных канала измерения времени (линии STOP1/2), на которые я в своей схеме завел сигналы с двух компараторов — упомянутого выше компаратора лазера и компаратора сигнала TIA. Также этот TDC может выдавать на свои линии "FIRE" сигнал для управления ультразвуковым излучателем, его удобно использовать для управления лазером. В таком случае по команде микроконтроллера TDC отправляет на узел лазера сигнал на включение и сразу же начинает измерять время (линия TDC "START" соединена внутри TDC с линией "FIRE"). У микросхемы есть ограничение на минимальное время между сигналами "START" и "STOP" — 3.5 нс, но в реальной схемотехнике задержка между отправкой сигнала "START" и появлением тока через лазер значительно больше этого времени. За счет этого измерение малых расстояний не является проблемой.
TDC-GP21 может фиксировать время сразу нескольких подряд идущих событий. С одной стороны, в импульсном лазерном этот режим можно было бы использовать для измерения расстояния до нескольких подряд идущих объектов (к примеру, для измерения расстояния сквозь стекло или ветки дерева), но я не стал реализовывать этот режим. Вместо этого я настроил канал STOP2 на детектирование как положительного, так и отрицательного фронта сигнала с компаратора TIA. Таким образом, за счет регистрации времени обоих фронтов принятого импульса, появилась возможность измерять длительность импульса. Это достаточно важная информация, о которой я расскажу далее.
После того, как будет принят отраженный от объекта сигнал, можно считать из TDC данные. Замечу, что эта микросхема имеет механизм первичной обработки принятых сигналов (ALU), который невозможно обойти, т.е. "сырые" данные получить из микросхемы нельзя. Каждый раз перед считыванием информации нужно указать TDC, какой вариант вычисления нужно производить, подождать, и только потом считывать информацию.
Вычитание времени STOP2 — STOP1 дает искомое "время полета", но при этом в него входят различные задержки, возникающие в узлах схемы. Для получения информации о ширине импульса приходится перенастраивать TDC.
С выхода TIA выходит аналоговый сигнал довольно малой амплитуды (<200 мВ), а TDC требуется цифровой сигнал. Для преобразования одного сигнала в другой используется компаратор, построенный на микросхеме DA4 — ADCMP600. Эта микросхема имеет следующие параметры:
Propagation Delay (Задержка распространения): 3.5 нс
Overdrive Dispersion: 1.2 нс
Common-Mode Dispersion: 200 пс
Нельзя сказать, что компаратор очень быстрый, но для измерения расстояния с точностью несколько сантиметров он подходит. Более быстрые компараторы обычно имеют уже не TTL/CMOS выход, а какой-нибудь LVPECL, который проблематично завести на выбранный TDC.
Так как сигнал на выходе TIA дифференциальный, и при этом хочется иметь возможность настраивать порог срабатывания компаратора, то пришлось сделать схему, показанную ниже:
Порог срабатывания компаратора определяется напряжением, поступающем с микроконтроллера по линии "COMP_DAC". Это напряжение определяет величину падения напряжения на резисторе R15. При отсутствии сигнала на выходе TIA, именно эта разность напряжений поступает на вход компаратора. Следует заметить, что резистор подключен к компаратору так, что разность напряжений на входах компаратора оказывается отрицательной, так что он выдает 0 на своем выходе. При появлении сигнала на выходе TIA, этот сигнал проходит сквозь конденсаторы C12, C13, напряжение на R15 меняет полярность, и в момент перехода напряжения через 0 компаратор переключается в 1.
Оставшаяся электроника
Микроконтроллер (MCU). Для управления лидаром я использовал микроконтроллер STM32F303CBT6. В описываемом лидаре микроконтроллер выполняет следующие функции:
Управляет напряжением лазера, используя встроенный ЦАП.
Измеряет напряжение APD.
Управляет напряжением APD, формируя ШИМ с нужным коэффициентом заполнения.
Устанавливает напряжение порога срабатывания компаратора, используя встроенный ЦАП.
Управляет работой TDC (инициализация, запуск измерения, считывание данных).
Получает данные с энкодера зеркала.
Управляет мотором зеркала (подробнее про энкодер и мотор — ниже).
Обеспечивает связь с компьютером — изменение настроек лидара по командам с компьютера, отправка данных на компьютер.
Производит коррекцию данных, полученных из TDC и пересчитывает их в расстояние.
Сохраняет и считывает настройки из Flash-памяти.
Коррекцию данных я опишу более подробно. Процесс преобразования аналогового сигнала в цифровой, происходящий в компараторе, всегда обладает некой неоднозначностью во времени: при одном и том же пороге срабатывания компаратора в зависимости от амплитуды сигнала, момент времени переключения компаратора будет отличаться:
Эту проблему можно решить, используя программную коррекцию результатов измерения времени полета в зависимости от амплитуды. В реальности измерить амплитуду настолько быстрых и малых сигналов достаточно сложно. Кроме того, микросхема TIA имеет довольно низкий порог насыщения — при слишком большом уровне входного фототока амплитуда сигнала на ее выходе перестает меняться. Как оказалось, значительно проще измерить длительность импульса средствами TDC (об этом я писал выше), и использовать для коррекции сигнала именно этот параметр. Методику вычисления коррекции я опишу далее.
Я написал два варианта управляющей программы для микроконтроллера. Один из из них, более простой, можно использовать только в несканирующем режиме. В этом варианте прошивке лазер постоянно "вспыхивает" с частотой 1000 Гц, так что этот режим удобно использовать для тестирования электроники и юстировки.
Второй вариант прошивки — основной, поддерживает 2D сканирование пространства.
Узел управления мотором. Для вращения сканирующего зеркала я использовал бесколлекторный мотор (BLDC), который требует специального метода управления. В качестве управляющей микросхемы я использовал DRV11873, которая достаточна распространена и не требует большого числа дополнительных элементов. Управление скоростью вращения мотора происходит при помощи ШИМ сигнала, подаваемого на вход микросхемы с MCU. Схемотехника этого узла взята из datasheet на микросхему и ничем не примечательна. Есть, правда, у выбранной связки мотор + драйвер недостаток — при включении мотор неконтролируемо разгоняется до большой скорости. Насколько я понимаю, это связано с методом обнаружения back-EMF в DRV11873.
В результате получается вот такая окончательная схема лидара:
Трассировка печатной платы лидара не так уж и проста, с учетом того, что на плате соседствуют токи более 15А в узле лазера и микроамперы фототока в узле фотодиода. Плату я решил делать четырехслойную, так как только так можно организовать качественные земляные полигоны — в случае четырехслойной платы один из внутренних слоев используется только для для земляных полигонов. Как видно из схемы, я разделил все земли лидара на три вида — земля узла лазера (LGND), земля узла мотора (MGND), главный земляной полигон (GND). Земли соединяются только в нескольких точках.
Для уменьшения индуктивности в цепи лазера важно расположить максимально близко друг к другу лазер D4, транзистор Q2, R19, C17 — фактически, в момент включения лазера, ток через эти компоненты замыкается.
Также важно установить фотодиод максимально близко к входу TIA.
Конечно, важно соблюдать целую кучу остальных правил трассировки аналоговых и цифровых цепей. Однако я не являюсь профессиональным разработчиком печатных плат, так что не могу гарантировать, что плата разведена по всем правилам.
Вот так выглядит собранная плата (со стороны оптических компонентов):
И с другой стороны (со стороны микроконтроллера):
Оптические компоненты
Могу предположить, что у многих людей, не знакомых с оптоэлектроникой, на этом этапе могут возникнуть проблемы, связанные с недостатком знаний в этой области. В реальности, в случае такого простого дальномера, как у меня, все достаточно просто. В первую очередь стоит рассказать про объектив лазера.
Как я уже упоминал, объектив лазера предназначен для того, чтобы получить узкий пучок света от лазерного диода. Лазер можно условно принять за точечный источник света, так что для того, чтобы получить от него узкий пучок, достаточно использовать одиночную собирающую (положительную) линзу:
Изображение взято с сайта thorlabs.de
Достаточно удобно использовать в качестве объектива стандартный объектив M12 — они широко используются в камерах видеонаблюдения. Для таких объективов выпускаются и продаются стандартизированные держатели, которые прикручиваются к печатной плате.
Излучающая площадка лазерного диода представляет собой прямоугольник, в случае диода "SPL PL90_3" он имеет размеры 200 X 10 μm. Это приводит к тому, что пучок лазерного излучения тоже будет прямоугольной формы. Как видно, излучающая площадка имеет достаточно большую протяженность, что приводит к тому, что излучение на выходе объектива все равно имеет определенную расходимость. Из-за этого с ростом расстояния растет и размер пятна света, падающего на объекты. Фактически, именно величина угла расходимости излучения лазера определяет угловое разрешение лидара (количество измерений на один оборот).
Кроме размеров излучающей площадки, на величину угла расходимости влияет и фокусное расстояние объектива. Чем оно больше — тем меньше расходимость излучения:
Если использовать объектив с фокусным расстоянием 12 мм, то угол расходимости излучения будет около 1 градуса; у объектива с фокусным расстоянием 25 мм угол будет уже ~0.45 градуса. Мне удалось найти на Aliexpress достаточно подходящий объектив:
Его параметры: 25 мм; M12*0,5; 1/3; F2.0.
Этот объектив достаточно короткий, так что для того, чтобы соединить его с держателем, я использовал дополнительную покупную деталь: переходник-удлинитель (M12 Extension Adapter).
Вот так выглядит пятно лазера на расстоянии около 1.8м (слева):
Справа для сравнения — пятно от лазерной рулетки диаметром около 4 мм. Видно, что пятно от лидара примерно в 2.5 больше, так что его ширина около 10 мм.
Важно, что объективы лидара должны быть установлены максимально близко друг к другу. Если расстояние между ними увеличить, то на малых расстояниях лидар просто перестанет принимать отраженное излучение — оно не будет попадать на фотоприемник. Это требование создает ограничение на размеры объективов. В моей конструкции диаметр объектива лазера не может превышать 20 мм.
Также я экспериментировал с самодельным объективом, сделанным из одиночной линзы, взятой из фотоаппарата, и пластиковой оправы объектива M12 от web-камеры:
Использованная линза пропускает ИК излучение, так что объектив достаточно неплохо работал, но из-за короткого фокусного расстояния (около 13 мм) излучение после него имело слишком большую расходимость.
Теперь стоит рассказать про объектив фотоприемника. Наиболее важный его параметр в случае лазерного дальномера — диаметр входного зрачка. Чем больше этот параметр — тем больше отраженного света попадет на фотодиод и тем больше будет отношение сигнал-шум. Это значит, что объектив должен иметь максимально большой диаметр. Именно поэтому я решил использовать стандартный объектив с креплением типа CS-mount. Для таких объективов также есть держатели, прикручивающиеся к плате.
В этом лидаре я использовал покупной объектив с параметрами 25mm; F1.2; CS 1/2.5". Видно, что у объектива большая светосила, при этом он имеет достаточно большое фокусное расстояние — 25 мм, так что диаметр входного зрачка получается достаточно большим. По расчету получается, что диаметр входного зрачка должен быть около 20 мм, однако, судя по всему, в реальности он ближе в 14 мм.
Также я пробовал использовать самодельный объектив, используя линзу диаметром 25 мм и часть от ненужного CS-объектива. Этот объектив действительно оказался лучше по энергетике (сигнал с фотодиода был заметно выше), но он ловил переотражения от сканирующего зеркала, так что он не очень подошел мне.
В случае, если предполагается использование лидара в условиях сильной световой засветки (особенно на улице), то между фотодиодом и объективом должен быть установлен интерференционный светофильтр, рассчитанный на длину волны 905 нм. Чаще всего они круглые, так что такой светофильтр можно приклеить к выходному отверстию объектива.
Я не стал использовать светофильтр — при комнатном освещении лидар может работать и без него.
Замечу, что как в случае лазера, так и в случае фотоприемника объектив работает на одной длине волны, так что проблема хроматических аберраций не возникает. Также при использовании APD с достаточно большой площадкой (0.5 мм) нет каких-то серьезных требований к параметрам объектива. Это значит, что в подобном дальномере можно использовать однолинзовые объективы.
В результате получившийся лазерный дальномер имеет такой вид:
Как и многие другие оптико-электронные устройства, этот дальномер требует проведения юстировки — выставления объектива лазера в оптимальное положение. Для того, чтобы была возможность перемещать объектив лазера, отверстия под его держатель в плате сделаны больше, чем диаметров винтов. Сама юстировка заключается в поиске такого положения держателя объектива, в котором амплитуда принимаемого с фотодиода сигнала максимальна. Вот так это изменение выглядит на осциллографе:
Довольно хорошо заметен переход усилителя в режим насыщения. Об амплитуде фототока при этом можно судить по длине импульса.
Теперь следует добавить механику, чтобы сделать лазерный дальномер сканирующим.
Механика
Если не обсуждать твердотельные (solid-state) лидары, то можно выделить два метода 2D сканирования пространства — сканирование можно производить, вращая весь дальномер целиком, или вращать зеркало, наклонное на 45 градусов относительно оптических осей лидара.
Плюсы первого метода:
- Не требуется достаточно крупное зеркало, которое сложно изготовить
- Нет потерь на зеркале и проблем с переотражениями от него
- Если сканирование идет в горизонтальной плоскости, то высоту лидара можно сделать маленькой
- Нет проблем сделать сканирование на все 360 градусов
Недостатки:
- Нужно как-то передавать на вращающуюся электронику питание и передавать данные. То есть нужно использовать либо скользящие контакты, ибо индуктивную+оптическую связь
- Тяжелую вращающуюся конструкцию сложно балансировать
- Нужна некая механика, чтобы вращать тяжелую конструкцию
- Нужен относительно мощный мотор
- Проблематично отлаживать вращающуюся электронику
Именно такой метод сканирования используется в лидарах пылесосов и PRLIDAR.
Плюсы использования сканирования зеркалом:
- Зеркало и его держатель можно сделать достаточно легкими, так что нет больших проблем с балансировкой на больших оборотах
- Легкое зеркало можно закрепить прямо на валу бесколлектрного мотора
- Вращается только зеркало, так что нет необходимости в передаче электричества сквозь вращающиеся элементы
Недостатки:
- Зеркало нужно как-то закрепить напротив объективов лидара, и крепление будет закрывать часть «обзора». Даже если использовать в качестве крепления прозрачную трубку-корпус всего дальномера, то к мотору зеркала и энкодеру все равно нужно подвести провода, и они будут перекрывать луч
- Зеркало дает потери света и переотражения
- Большая высота дальномера
Так как я хотел сделать именно лидар с высокой скоростью сканирования (не менее 15 оборотов/сек), я решил использовать сканирующее зеркало.
Важное требование к зеркалу — оно должно иметь внешнее отражающее покрытие (то есть покрытие должно быть на передней поверхности зеркала).
Если для сканирования использовать обычное прямоугольное зеркало, то его края не будут никак использоваться — свет туда попадать не будет. Идеальная форма такого зеркала — эллипс, так как в проекции он дает окружность. Именно с таким зеркалом я уже сталкивался в готовом лидаре. Изготовить зеркало такой формы сложно, так что часто в лидарах используют восьмиугольное зеркало. Я пробовал изготовить такое зеркало самостоятельно, но только сломал несколько зеркал-заготовок из-за отсутствия опыта резки стекла малых размеров. Зато мне удалось найти на Aliexpress компанию, которая по моим чертежам изготовила четыре зеркала за 15$.
К сожалению, заказанное зеркало имеет недостаток — оно ослабляет сигнал практически в 2 раза. Насколько я поникаю, это связано с тем, что зеркало покрыто алюминием, также оно может иметь некое защитное покрытие. Это может приводить к падению коэффициента отражения до 0.7 на длине волны 905 нм, что как раз дает коэффициент отражения ~0.5 с учетом того, что луч проходит зеркало дважды.
Для длины волны 905 нм лучше подходят зеркала с серебряным или золотым покрытием, но они обычно стоят дороже. Подробнее про покрытия зеркал можно почитать здесь.
Зеркало нужно как-то вращать. Просто закрепить его валу коллекторного мотора нельзя — большинство таких моторов рассчитаны на слишком высокие обороты. Использовать редуктор не хотелось — слишком большое усложнение конструкции и лишний шум.
Идеальным решением было бы использование бесколлекторного мотора со встроенной электроникой (как в компьютерных вентиляторах), но, к сожалению, подходящий мотор мне найти не удалось. У меня были мысли использовать мотор и вентилятора, но в маленьких вентиляторах моторы вращались слишком быстро даже при низком напряжении, а моторы из больших вентиляторов не подходили по габаритам.
Поэтому я решил использовать покупной бесколлекторный мотор (BLDC). Я специально нашел на Aliexpress маленький плоский Outrunner-мотор, имеющий вал, на который можно закрепить диск энкодера:
Чтобы закрепить зеркало на моторе, была напечатана специальная деталь — держатель зеркала. В этом держателе было сделано специальное углубление для мотора, а само зеркало было приклеено к держателю. Вот так он выглядит:
Для того, чтобы микроконтроллер мог определить, куда направлено зеркало, я установил на вал мотора простейший оптический энкодер. Диск для энкодера я взял из старой мышки, он имел 65 прорезей и хорошо стыковался с валом мотора. Одну из прорезей энкодера я заклеил — она используется как начало отсчета, то есть индикация нулевого угла:
Оптопару я использовал из старого принтера. Сигнал с нее заведен на компаратор, встроенный в MCU. Вот так выглядит сигнал с фототранзистора оптопары в момент пересечения начала отсчета:
В результате, получившийся лидар выглядит вот так:
На фотографии можно заметить белую пластмассовую пластинку, закрепленную вертикально напротив зеркала. Эта пластинка ("Reference Plate") используется для автоматической калибровки дальномера. В прошивке указано расстояние до этой пластинки в миллиметрах, так что производя измерения расстояния до нее, можно вычислить смещение нуля в результатах, возвращаемых TDC.
Безопасность
В этом дальномере я использовал достаточно мощный лазер, работающий на длине волны 905 нм. Это излучение абсолютно невидимо глазом, но способно повредить сетчатку, так что оно представляет достаточно большую опасность для зрения.
Внимание! Использование прошивки микроконтроллера для несканирующего режима особенно опасно, так в этом режиме лазер работает постоянно с частотой 1 кГц, и постоянно направлен в одну точку. Я измерял среднюю оптическую мощность на выходе объектива лазера специализированным измерителем мощности — она составляла 0.35 мВт (при напряжении питания узла лазера 16В). Даже такая мощность может быть опасна, так так излучение не видно! Любые работы с дальномером в этом режиме нужно производить в защитных очках!
В сканирующем режиме из-за увеличения частоты импульсов средняя мощность излучения может доходить до 4.4 мВт, но благодаря тому, что луч постоянно перемещается, он не так опасен для зрения. В программе MCU имеются специальные проверки скорости мотора, так что лазер отключается, если скорость слишком большая или маленькая.
Управление дальномером
Для настройки и управления дальномером я написал для ПК две утилиты.
Первая из них используется для настройки и тестирования дальномера в несканирующем режиме. Здесь можно настроить параметры работы лазера и фотоприемника, но главное — посмотреть данные с TDC:
Эта программа отправляет на дальномер команду на проведение 100 измерений, которые заносятся в память MCU и затем отправляются на ПК и анализируются. Результаты анализа выводятся в окно в центре программы, кроме того, на их основе строится гистограмма, показывающая разброс результатов измерения времени полета (колонка START).
Для сбора данных, используемых для калибровки, в утилите есть возможность сохранять величины средних значений по серии из 100 измерений в файл. Процесс калибровки состоит из следующих пунктов:
- Запускается запись данных.
- Плавно регулируется амплитуда сигнала, расстояние при этом должно быть неизменным. Для того, чтобы регулировать амплитуду, я перекрывал объектив фотодиода непрозрачной пластинкой. Уровень амплитуды косвенно контролируется по значению длительности импульса (WIDTH)
- Собрав достаточное количество точек, нужно остановить запись, и перейти на вкладку калибровки (Calibration). Здесь происходит обработка записанных данных. Выглядят они вот так:
По горизонтальной оси на этом графике — значение длительности импульса в BIN, по вертикальной оси — относительное изменение времени полета. Также на этой вкладке производится приближение экспоненциальной функции к собранным данным. Полученная функция показана на графике красной кривой. В результате приближения находятся два коэффициента, характеризующие эту функцию. Их следует записать в память MCU.
Кроме того, используя эту утилиту, можно контролировать работу мотора лидара.
Следующая утилита используется для проверки работы лидара в основном его режиме — сканирующем. Главное здесь — отображение сканов с лидара:
Видно, что часть пространства (внизу изображения) не сканируется. В этой зоне находятся стойки, на которых держится сканирующая механика и пластинка для калибровки. Величину этой зоны нужно задавать вручную.
Также в утилите можно настраивать некоторые параметры лидара и производить простой анализ качества измерения расстояния до выбранного угла. В том числе по получаемым данным можно построить гистограмму (опять же для одного угла):
По горизонтальной оси здесь — сантиметры. В проекте на Гитхабе выложены аналогичные измерения для других расстояний.
Результаты
Получившийся лидар имеет такие характеристики:
- Скорость сканирования: 15 оборотов/сек. Эта скорость ограничена частично программой MCU (ее нужно дополнительно оптимизировать), уровнем вибрации (зеркало не очень хорошо сбалансировано) и соображениями безопасности — чем выше скорость сканирования, тем выше средняя энергия, попадающая в определенную точку пространства.
- Точность измерений. Один BIN TDC равен ~13 мм. Уровень шума измерения расстояния сильно зависит от расстояния, типа поверхности, угла падения луча лазера на поверхность.
В примеру, на светло-серой стене на расстоянии 10 м максимальный разброс значений по 20 сканам составлял 3 см (0.3%), на расстоянии 20 м — 13 см, на 25 м — 17 см, на 30 м — 30 см (1%).
Однако и на близких расстояниях получить уровень шума меньше 2 см практически невозможно. - Минимальное измеряемое расстояние: 5 см, максимальное ~25м (белая поверхность объекта)
- Частота измерений: 11 кГц
- Угловое разрешение: 0.5 градуса
- Диапазон сканируемых углов: 230 градусов. Он может быть расширен, если переделать механику лидара
- Потребление: 0.1 А на 5 В (0.5 Вт). Пусковой ток может доходить до 0.8 А
- Размер: 50x50x120 мм
Проблемы существующей конструкции лидара и не реализованная функциональность
Наиболее важная проблема, которая пока никак не решена в моем лидаре — компенсация чувствительности электроники лидара к температуре. Наиболее к температуре чувствителен APD, у которого коэффициент усиления достаточно сильно уменьшается с ростом температуры. Изменение температуры в диапазоне 0-40 градусов приводит к изменению усиления в несколько раз. Наиболее правильно было бы измерять температуры APD, и подстраивать подаваемое на него напряжение. Для измерения температуры в схеме даже есть специальный терморезистор (NTC), но подстройку напряжения не стал реализовывать в прошивке — это достаточно сложно, так как нужно исследовать поведение APD во всем нужном диапазоне температур.
Еще одна нереализованная вещь — калибровка TDC. Все экземпляры TDC имеют немного различающееся время задержки между элементами (BIN). Кроме того, это время также зависит от температуры. Сама микросхема TDC имеет специальный механизм калибровки, но я не стал реализовывать его в прошивке — для ее упрощения. Сейчас величина BIN жестко задается в коде MCU.
Из-за достаточно большой расходимости луча расстояние до узких объектов (например, ножек стульев) может измеряться неправильно, так как в луч попадает несколько объектов подряд. Эта же проблема проявляется и при резком переходе луча с одного расстояния на другое. На скане это выглядит как несколько ложных точек между правильными измерениями.
Версия платы "PCB_project_v4", рассчитанная на APD MTAPD-07-13, имеет сильную чувствительность к излучению расположенной рядом Wi-Fi антенны. Это выражается в том, что во время работы Wi-Fi данные лидара становятся сильно зашумленными (точность измерения падает в разы). Насколько я понял, сигнал наводится на вход усилителя фотодиода. Попытки экранировать плату особо не помогли, пробовал даже помещать плату в металлическую банку без крышки. Наводка пропадает, только если полностью экранировать конструкцию, что в случае лидара невозможно.
Помогает лишь установка антенны за нерабочей частью лидара и установка между ними специальной металлической пластинки-экрана.
В предыдущей версии платы, рассчитанной на использование APD AD500-8 этот эффект выражен значительно слабее. Платы несколько различаются разводкой, в старой плате усилитель установлен на нижней стороне платы, а фотодиод имеет металлический корпус, что может улучшать ситуацию.
Код MCU недостаточно оптимизирован. Можно заметно улучшить обработку данных от энкодера, реализовать связь с TDC по SPI используя прерывания, а не polling, как это сделано сейчас. Все эти доработки требуют времени, а его всегда не хватает.
Механика сканирующего механизма — не самая удачная (но максимально простая). Во время вращения зеркало немного вибрирует из-за недостаточно хорошей балансировки. Сколько я не пытался, я так и не смог полностью устранить вибрацию.
Из-за переотражений на зеркале не удается использовать объектив фотоприемника большого диаметра.
Стоимость компонентов
Цена, $ | Примечания | |
---|---|---|
PCB | 13 | Цена за 10 штук |
Лазерный диод | 12 | SPL PL90_3 |
APD | 10/24 | AD500-8/MTAPD-07-013 |
Микросхемы | ~30 | Все микросхемы (TIA, TDC, MCU, Mosfet ...) |
Остальные компоненты | ~7 | |
Оптика | ||
Объектив APD | 9 | CS mount, 25mm |
Держатель объектива | 2 | CS mount |
Объектив лазера | 7 | M12, 25mm |
Держатель и переходник объектива | 5 | M12 |
Сканирующее зеркало | 12 | Цена за 4 штуки |
Механика | ||
Стойки | 3 | Шестигранные стойки, цена за 20 штук |
BLDC мотор | 2 | |
Дополнительные детали | 2 | |
- | ||
Итого | 114 |
Более подробный BOM с ссылками на магазины находится в проекте Github.
Общая стоимость компонентов без доставки получается около 114$ (при использовании APD AD500-8). Важно отметить, что некоторые компоненты (например PCB и зеркала) продавались партией по несколько штук, и в общую стоимость включена именно стоимость партии. Довольно дорогой вышла оптика с ее держателями — 23$. Если использовать одиночные линзы и самодельные держатели, то возможно, можно уменьшить стоимость оптики в несколько раз.
Практическое применение лидара
Я решил проверить работу получившегося лидара, установив его на многострадальный пылесос Roomba (я ставлю на него самодельные лидары с 2012 года). Лидар подключен к компьютеру Orange Pi PC, на котором запущен ROS с работающим SLAM. Выглядит это вот так:
Для того, чтобы передавать в ROS данные от лидара, я написал для него специальный узел. Пример данных, выдаваемых лидаром:
Длина клетки на изображении — 1 метр. На нижнем изображении дальномер "сморит" сквозь коридор сложной формы.
В результате работы SLAM получается вот такая карта:
В центре квартиры находится зеркальный шкаф; я частично закрыл его зеркальную поверхность перед запуском сканирования пластиковыми панелями, но они оказались слишком низкими, так что в некоторое моменты времени луч все равно попадал на зеркальную поверхность.
Вот такая карта получается, если запустить SLAM в достаточно большом помещении:
Сканирование этого помещения сильно осложнялось большим количеством блестящих стульев и темными стенами.
Видео про лидар:
Аналогичные проекты
Таких проектов не очень много. В первую очередь, следует упомянуть проект Open Source лидара Unruly. К сожалению, на данный момент этот проект заморожен или остановлен — информации о его состоянии нет. Фактически, главное что выложено в этом проекте — схема лидара и информация о его характеристиках. Не буду скрывать, некоторые части схемы я взял именно из этого проекта.
Также здесь стоить упомянуть Reference Design от TI: TIDA-00663. Это довольно подробный открытый проект, но у него есть недостаток — конструкция платы просто не предназначена для присоединения к ней оптики. Так что результатов тестирования с реальной оптикой в документации просто нет. Кроме того, в этом проекте использован обычный PIN-фотодиод, а не APD.
UPD 02/2021: Мне попался вот такой довольно интересный документ от ON Semiconductor: UM70015. Там в качестве фотоприемника используется SiPM, TIA вообще нет. В качестве TDC используется ПЛИС.
С другими аналогичными проектами (т.е. достаточно простыми, без использования FPGA и скоростных АЦП), я сожалению, не знаком. На просторах интернета нередко можно найти различные студенческие работы, но часто в них просто не приводятся параметры получившегося устройства, либо в них используются труднодоступные/дорогие компоненты. О наличии в открытом доступе прошивки и Geber-файлах говорить в таких случаях обычно не приходится.
Репозиторий проекта на Github: https://github.com/iliasam/OpenTOFLidar
Он содержит файлы проекта печатной платы, Gerber-файлы, подробный BOM к плате, BOM на весь проект с указанием ссылок для приобретения компонентов, некоторую информацию по механическим деталям, исходные коды прошивок, тестовые утилиты для ПК с исходными кодами, драйвер для ROS.