Самодельный лидар: OpenTOFLidar

    В этой статье я хочу рассказать про свой проект импульсного (TOF) Open Source лидара — о том как я его делал, и каких результатов удалось добиться.
    top-picture


    Немного теории


    Лазерные дальномеры по принципу работы можно разделить на три основные типа:


    1. Триангуляционные. Дальномеры этого типа определяют расстояние, используя законы геометрии. Дальномер измеряет угол между лучом лазера и отраженным лучом света, попавшим на фотоприемник, и из величины этого угла и расстояния между лазером и фотоприемником вычисляет текущее расстояние до объекта.
      У этих дальномеров есть преимущества:
      — Наиболее простые среди всех остальных дальномеров.
      — Могут измерять расстояния с высокой точностью на близких дистанциях.
      — Могут измерять расстояния с достаточно высокой скоростью — до 10 кГц.
      Но есть и недостатки:
      — Точность измерения расстояния значительно падает с ростом расстояния.
      — Лазер должен быть включен достаточно долго (фотоприемники имеют ограниченную чувствительность), поэтому его мощность нужно ограничивать для безопасности.
      — Чем меньше габариты дальномера, тем хуже точность измерения расстояния.

      Именно такие дальномеры используются в роботах-пылесосах, так же к ним относятся довольно популярные в любительской робототехнике дальномеры RPLIDAR. Стоят они обычно 100-400$.

      Про дальномеры такого типа я подробно писал в своих статьях: Самодельный сканирующий лазерный дальномер и Реверс-инжиниринг лазерного датчика расстояния
    2. Фазовые. В этих дальномерах свет лазера модулируется высокочастотным сигналом. Задержка во время распространения луча в его «полете» до объекта и обратно приводит к появлению фазового сдвига между сигналом, который используется для управления лазером, и который принимается от объекта.
      У этих дальномеров есть преимущества:
      — Высокая точность измерения расстояния (единицы миллиметров и меньше). Может падать при уменьшении отношения сигнал/шум.
      — Можно сделать малогабаритное устройство.
      Но есть и недостатки:
      — Лазер работает постоянно, поэтому приходится ограничивать его мощность. Это приводит к тому, что на больших расстояниях принимаемый сигнал оказывается довольно низким, что сказывается на точности дальномера.
      — Электроника такого дальномера относительно сложная.
      — Сложно получить высокую скорость измерений.

      Дальномеры такого типа используются в промышленности, геодезии. Лазерные рулетки в большинстве своем используют как раз фазовый метод измерения расстояния. Достаточно известный в робототехнике лидар «Hokuyo URG-04LX» тоже является фазовым.
      Специализированные 3D-сенсоры (range imaging camera) тоже часто используют этот метод.

      Про дальномеры такого типа я подробно писал в своих статьях: Самодельный фазовый лазерный дальномер и Как работает лазерная рулетка: реверс-инжиниринг
    3. Импульсные. Также их называют «времяпролетные», Time-Of-Flight (TOF). Они используют «классический», наиболее известный большинству метод измерения расстояния — дальномер измеряет время «полета» вспышки света до объекта и обратно. Несмотря на кажущуюся простоту метода, из-за высокой скорости света довольно сложно сделать дальномер, способный точно измерять расстояние.

      У этих дальномеров есть преимущества:
      — Лазер используется в импульсном режиме, что позволяет формировать импульсы сверхбольшой мощности (более МВт). За счет этого можно измерять очень большие расстояния (даже до Луны).
      — Можно сделать малогабаритное устройство. Датчики вроде VL53L0X используют именно этот метод.
      — Можно получить очень высокую скорость измерений — 100 кГц и более.
      Но есть и недостатки:
      — Сложно измерить расстояние с высокой точностью (< ±0.5 м).
      — Электроника такого дальномера относительно сложная.

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

      Я с подобным дальномером сталкивался в процессе реверс-инжиниринга: Реверс-инжиниринг лазерного сканера Leuze RS4
      Однако реверс-инжиниринг готового устройства это одно, а вот изготовление своего дальномера — совершенно другое.

    Устройство импульсного лазерного дальномера


    Ключевые компоненты лазерного дальномера это электроника и оптика. Если дальномер сканирующий (2D/3D), то к ним обычно добавляется и механика.


    Вот так выглядит структурная схема моего дальномера:
    structure
    Основные узлы электроники такого дальномера:


    • Узел импульсного лазера. Содержит сам лазер и электронику, управляющую им. Главное требование к этому узлу — возможность сформировать максимально мощный импульс света с максимально крутым передним фронтом. Чем мощнее импульс — тем больше отношение сигнал/шум принимаемого сигнала, а чем круче фронт — тем выше точность измерения расстояния.
    • Узел фотоприемника. Содержит фотоприемник, принимающий отраженный от объекта сигнал; электронику для его питания, усилитель сигнала и компаратор, выделяющий полезный сигнал среди помех. Главные требования здесь — возможность максимально усилить принятый сигнал, не добавляя в него слишком много помех и не ухудшить крутизну переднего фронта импульса.
    • Узел измерения времени. Здесь происходит особая «магия» — высокоточное измерение времени «полета» светового импульса. Расстояние 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А!
    Для управления лазером была использована такая схема (она достаточно стандартная):
    Schematic-Laser
    Лазерный диод здесь обозначен D4. Узел управления лазером работает достаточно просто. Изначально транзистор Q2 закрыт, лазер не светит, конденсатор С17 заряжается через резистор R18 до напряжения Vlaser. Фактически, в этом конденсаторе запасается вся энергия, которая будет использована для излучения лазера. Она не так уж и велика — при напряжении 16В и емкости конденсатора 20 нФ запасенная в нем энергия будет составлять 2,5 мкДж.
    В заданный момент на драйвер транзистора DA6 поступает импульс, он усиливает этот импульс, транзистор Q2 резко открывается и лазер начинает излучать свет, забирая при этом энергию из конденсатора. Длительность световой вспышки лазера ограничена именно емкостью конденсатора. Если бы все компоненты были бы идеальными, то в таком случае максимальный ток через лазер мог бы быть очень большим, но в реальности он сильно ограничивается индуктивностями элементов.


    Полезная особенность такой схемотехники — даже если транзистор выйдет из строя и в нем возникнет короткое замыкание — ток через лазерный диод будет ограничен резистором R18, и не будет превышать и 0.1 А. Генерация излучения в лазере начинается при токе 0.5 А, так что такая неисправность не станет опасной для зрения.


    Резистор R19 используется для контроля за током лазера. К нему подключен миниатюрный высокочастотный разъем U.FL, через который можно подключить осциллограф и наблюдать за формой тока, протекающего через лазер. Вот пример такой осциллограммы при Vlaser=15V
    TEK00010:
    Видно, что импульс тока длится около 25 нс, колебания тока во время импульса связаны с резонансными явлениями. Максимальное значение напряжения в данном случае соответствует максимальному току около 15А.
    При помощи достаточно скоростного APD-фотоприемника с усилителем я получил вот такую осциллограмму, показывающую форму сигнала лазера (канал 2, сигнал инвертирован):
    Laser-Signal
    Видно, что длительность переднего фронта лазера — около 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:
    apd-voltage
    Видно, что усиление начинает значительно расти при напряжении, большем 70В. При приближении к 90В чувствительность усиления фотодиода к напряжению значительно увеличивается. С ростом усиления также повышается и уровня шумов.
    Если продолжить увеличивать напряжение, то наступает лавинный пробой фотодиода — ток через него значительно увеличивается, причем он становится сильно зашумленным, пропадает реакция на свет. При этом фотодиод не выходит из строя (если совсем уж не поднимать ток).


    Для того, чтобы сформировать достаточно высокое напряжение смещения фотодиода, я использую в своей конструкции DC-DC преобразователь, ШИМ сигнал для которого формирует микроконтроллер. Этот преобразователь включает в себя компоненты Q1, L5, D1, C10. Для измерения напряжения используется резисторный делитель на R8/R9. Обратная связь по напряжению реализована в микроконтроллере. Частота ШИМ — 100 кГц.
    Я пробовал организовать синхронное управление формированием ШИМ и запуском лазера, так как предполагал, что небольшие колебания напряжения будут ухудшать точность измерений, но не заметил никакой разницы между синхронным и несинхронным режимом. Судя по всему, RC-фильтр R10-C11 достаточно хорошо справляется со своей задачей.


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


    image

    Подробнее про TIA можно почитать, например, здесь.


    Для изготовления импульсного дальномера необходимо использовать TIA с большой полосой пропускания сигнала и малой входной емкостью. Доступных микросхем не так уж и много, примерами могут быть MAX3658, MAX40658, OPA858. В своем лидаре я использовал MAX3658.
    Эта микросхема разработана специально для использования с фотодиодами, имеет усиление 18000, и полосу пропускания — 580MHz. Кроме того, микросхема содержит встроенный фильтр, отсекающий низкие частоты (DC Cancellation Circuit).
    Недостаток микросхемы — довольно специфическое построение ее выходного каскада:
    tia
    Здесь реализован не Push-Pull выход, а Open Collector + сильная подтяжка выходов в питанию, как в (Current Mode Logic — CML).
    Для того, чтобы повысить напряжение на одном из своих выходов, микросхеме нужно закрыть один из транзисторов, т.е. повышение напряжения всегда происходит через резисторы подтяжки. Это может приводить к ухудшению временных характеристик сигнала.


    У микросхемы есть еще один недостаток — она не содержит защиты от статического напряжения на своем входе.


    Внимание! Микросхема MAX3658 очень сильно боится статического напряжения! Устанавливать ее нужно максимально осторожно. В своем лидаре я поставил во входную цепь микросхемы защитный диод D6, его желательно установить на плату до установки TIA.

    К сожалению, у меня в процессе экспериментов вышли из строя штуки 4 этих микросхем, судя по всему, именно из-за статического электричества. Ни с одной другой из микросхем я подобного никогда не встречал.


    В результате у меня получилась такая схема узла фотоприемника:
    Schematic-APD-b
    Разъем 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 дифференциальный, и при этом хочется иметь возможность настраивать порог срабатывания компаратора, то пришлось сделать схему, показанную ниже:
    Schematic-TDC
    Порог срабатывания компаратора определяется напряжением, поступающем с микроконтроллера по линии "COMP_DAC". Это напряжение определяет величину падения напряжения на резисторе R15. При отсутствии сигнала на выходе TIA, именно эта разность напряжений поступает на вход компаратора. Следует заметить, что резистор подключен к компаратору так, что разность напряжений на входах компаратора оказывается отрицательной, так что он выдает 0 на своем выходе. При появлении сигнала на выходе TIA, этот сигнал проходит сквозь конденсаторы C12, C13, напряжение на R15 меняет полярность, и в момент перехода напряжения через 0 компаратор переключается в 1.


    Оставшаяся электроника


    Микроконтроллер (MCU). Для управления лидаром я использовал микроконтроллер STM32F303CBT6. В описываемом лидаре микроконтроллер выполняет следующие функции:
    Управляет напряжением лазера, используя встроенный ЦАП.
    Измеряет напряжение APD.
    Управляет напряжением APD, формируя ШИМ с нужным коэффициентом заполнения.
    Устанавливает напряжение порога срабатывания компаратора, используя встроенный ЦАП.
    Управляет работой TDC (инициализация, запуск измерения, считывание данных).
    Получает данные с энкодера зеркала.
    Управляет мотором зеркала (подробнее про энкодер и мотор — ниже).
    Обеспечивает связь с компьютером — изменение настроек лидара по командам с компьютера, отправка данных на компьютер.
    Производит коррекцию данных, полученных из TDC и пересчитывает их в расстояние.
    Сохраняет и считывает настройки из Flash-памяти.


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


    image

    Эту проблему можно решить, используя программную коррекцию результатов измерения времени полета в зависимости от амплитуды. В реальности измерить амплитуду настолько быстрых и малых сигналов достаточно сложно. Кроме того, микросхема TIA имеет довольно низкий порог насыщения — при слишком большом уровне входного фототока амплитуда сигнала на ее выходе перестает меняться. Как оказалось, значительно проще измерить длительность импульса средствами TDC (об этом я писал выше), и использовать для коррекции сигнала именно этот параметр. Методику вычисления коррекции я опишу далее.


    Я написал два варианта управляющей программы для микроконтроллера. Один из из них, более простой, можно использовать только в несканирующем режиме. В этом варианте прошивке лазер постоянно "вспыхивает" с частотой 1000 Гц, так что этот режим удобно использовать для тестирования электроники и юстировки.
    Второй вариант прошивки — основной, поддерживает 2D сканирование пространства.


    Узел управления мотором. Для вращения сканирующего зеркала я использовал бесколлекторный мотор (BLDC), который требует специального метода управления. В качестве управляющей микросхемы я использовал DRV11873, которая достаточна распространена и не требует большого числа дополнительных элементов. Управление скоростью вращения мотора происходит при помощи ШИМ сигнала, подаваемого на вход микросхемы с MCU. Схемотехника этого узла взята из datasheet на микросхему и ничем не примечательна. Есть, правда, у выбранной связки мотор + драйвер недостаток — при включении мотор неконтролируемо разгоняется до большой скорости. Насколько я понимаю, это связано с методом обнаружения back-EMF в DRV11873.


    В результате получается вот такая окончательная схема лидара:
    Schematic-v4b1


    Трассировка печатной платы лидара не так уж и проста, с учетом того, что на плате соседствуют токи более 15А в узле лазера и микроамперы фототока в узле фотодиода. Плату я решил делать четырехслойную, так как только так можно организовать качественные земляные полигоны — в случае четырехслойной платы один из внутренних слоев используется только для для земляных полигонов. Как видно из схемы, я разделил все земли лидара на три вида — земля узла лазера (LGND), земля узла мотора (MGND), главный земляной полигон (GND). Земли соединяются только в нескольких точках.
    Для уменьшения индуктивности в цепи лазера важно расположить максимально близко друг к другу лазер D4, транзистор Q2, R19, C17 — фактически, в момент включения лазера, ток через эти компоненты замыкается.
    Также важно установить фотодиод максимально близко к входу TIA.
    Конечно, важно соблюдать целую кучу остальных правил трассировки аналоговых и цифровых цепей. Однако я не являюсь профессиональным разработчиком печатных плат, так что не могу гарантировать, что плата разведена по всем правилам.


    Вот так выглядит собранная плата (со стороны оптических компонентов):
    PCB-bottom


    И с другой стороны (со стороны микроконтроллера):
    PCB-top


    Оптические компоненты


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


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


    image

    Изображение взято с сайта thorlabs.de
    Достаточно удобно использовать в качестве объектива стандартный объектив M12 — они широко используются в камерах видеонаблюдения. Для таких объективов выпускаются и продаются стандартизированные держатели, которые прикручиваются к печатной плате.


    Излучающая площадка лазерного диода представляет собой прямоугольник, в случае диода "SPL PL90_3" он имеет размеры 200 X 10 μm. Это приводит к тому, что пучок лазерного излучения тоже будет прямоугольной формы. Как видно, излучающая площадка имеет достаточно большую протяженность, что приводит к тому, что излучение на выходе объектива все равно имеет определенную расходимость. Из-за этого с ростом расстояния растет и размер пятна света, падающего на объекты. Фактически, именно величина угла расходимости излучения лазера определяет угловое разрешение лидара (количество измерений на один оборот).


    Кроме размеров излучающей площадки, на величину угла расходимости влияет и фокусное расстояние объектива. Чем оно больше — тем меньше расходимость излучения:
    laser-beam
    Если использовать объектив с фокусным расстоянием 12 мм, то угол расходимости излучения будет около 1 градуса; у объектива с фокусным расстоянием 25 мм угол будет уже ~0.45 градуса. Мне удалось найти на Aliexpress достаточно подходящий объектив:
    laser-lens
    Его параметры: 25 мм; M12*0,5; 1/3; F2.0.
    Этот объектив достаточно короткий, так что для того, чтобы соединить его с держателем, я использовал дополнительную покупную деталь: переходник-удлинитель (M12 Extension Adapter).
    Вот так выглядит пятно лазера на расстоянии около 1.8м (слева):
    25mm-and-tape-2
    Справа для сравнения — пятно от лазерной рулетки диаметром около 4 мм. Видно, что пятно от лидара примерно в 2.5 больше, так что его ширина около 10 мм.


    Важно, что объективы лидара должны быть установлены максимально близко друг к другу. Если расстояние между ними увеличить, то на малых расстояниях лидар просто перестанет принимать отраженное излучение — оно не будет попадать на фотоприемник. Это требование создает ограничение на размеры объективов. В моей конструкции диаметр объектива лазера не может превышать 20 мм.


    Также я экспериментировал с самодельным объективом, сделанным из одиночной линзы, взятой из фотоаппарата, и пластиковой оправы объектива M12 от web-камеры:
    IMG-7400
    Использованная линза пропускает ИК излучение, так что объектив достаточно неплохо работал, но из-за короткого фокусного расстояния (около 13 мм) излучение после него имело слишком большую расходимость.


    Теперь стоит рассказать про объектив фотоприемника. Наиболее важный его параметр в случае лазерного дальномера — диаметр входного зрачка. Чем больше этот параметр — тем больше отраженного света попадет на фотодиод и тем больше будет отношение сигнал-шум. Это значит, что объектив должен иметь максимально большой диаметр. Именно поэтому я решил использовать стандартный объектив с креплением типа CS-mount. Для таких объективов также есть держатели, прикручивающиеся к плате.
    В этом лидаре я использовал покупной объектив с параметрами 25mm; F1.2; CS 1/2.5". Видно, что у объектива большая светосила, при этом он имеет достаточно большое фокусное расстояние — 25 мм, так что диаметр входного зрачка получается достаточно большим. По расчету получается, что диаметр входного зрачка должен быть около 20 мм, однако, судя по всему, в реальности он ближе в 14 мм.
    Также я пробовал использовать самодельный объектив, используя линзу диаметром 25 мм и часть от ненужного CS-объектива. Этот объектив действительно оказался лучше по энергетике (сигнал с фотодиода был заметно выше), но он ловил переотражения от сканирующего зеркала, так что он не очень подошел мне.


    В случае, если предполагается использование лидара в условиях сильной световой засветки (особенно на улице), то между фотодиодом и объективом должен быть установлен интерференционный светофильтр, рассчитанный на длину волны 905 нм. Чаще всего они круглые, так что такой светофильтр можно приклеить к выходному отверстию объектива.
    Я не стал использовать светофильтр — при комнатном освещении лидар может работать и без него.


    Замечу, что как в случае лазера, так и в случае фотоприемника объектив работает на одной длине волны, так что проблема хроматических аберраций не возникает. Также при использовании APD с достаточно большой площадкой (0.5 мм) нет каких-то серьезных требований к параметрам объектива. Это значит, что в подобном дальномере можно использовать однолинзовые объективы.


    В результате получившийся лазерный дальномер имеет такой вид:
    rangefinder


    Как и многие другие оптико-электронные устройства, этот дальномер требует проведения юстировки — выставления объектива лазера в оптимальное положение. Для того, чтобы была возможность перемещать объектив лазера, отверстия под его держатель в плате сделаны больше, чем диаметров винтов. Сама юстировка заключается в поиске такого положения держателя объектива, в котором амплитуда принимаемого с фотодиода сигнала максимальна. Вот так это изменение выглядит на осциллографе:
    GIF-signal
    Довольно хорошо заметен переход усилителя в режим насыщения. Об амплитуде фототока при этом можно судить по длине импульса.


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


    Механика


    Если не обсуждать твердотельные (solid-state) лидары, то можно выделить два метода 2D сканирования пространства — сканирование можно производить, вращая весь дальномер целиком, или вращать зеркало, наклонное на 45 градусов относительно оптических осей лидара.
    Плюсы первого метода:


    • Не требуется достаточно крупное зеркало, которое сложно изготовить
    • Нет потерь на зеркале и проблем с переотражениями от него
    • Если сканирование идет в горизонтальной плоскости, то высоту лидара можно сделать маленькой
    • Нет проблем сделать сканирование на все 360 градусов

    Недостатки:


    • Нужно как-то передавать на вращающуюся электронику питание и передавать данные. То есть нужно использовать либо скользящие контакты, ибо индуктивную+оптическую связь
    • Тяжелую вращающуюся конструкцию сложно балансировать
    • Нужна некая механика, чтобы вращать тяжелую конструкцию
    • Нужен относительно мощный мотор
    • Проблематично отлаживать вращающуюся электронику

    Именно такой метод сканирования используется в лидарах пылесосов и PRLIDAR.


    Плюсы использования сканирования зеркалом:


    • Зеркало и его держатель можно сделать достаточно легкими, так что нет больших проблем с балансировкой на больших оборотах
    • Легкое зеркало можно закрепить прямо на валу бесколлектрного мотора
    • Вращается только зеркало, так что нет необходимости в передаче электричества сквозь вращающиеся элементы

    Недостатки:


    • Зеркало нужно как-то закрепить напротив объективов лидара, и крепление будет закрывать часть «обзора». Даже если использовать в качестве крепления прозрачную трубку-корпус всего дальномера, то к мотору зеркала и энкодеру все равно нужно подвести провода, и они будут перекрывать луч
    • Зеркало дает потери света и переотражения
    • Большая высота дальномера

    Так как я хотел сделать именно лидар с высокой скоростью сканирования (не менее 15 оборотов/сек), я решил использовать сканирующее зеркало.
    Важное требование к зеркалу — оно должно иметь внешнее отражающее покрытие (то есть покрытие должно быть на передней поверхности зеркала).
    Если для сканирования использовать обычное прямоугольное зеркало, то его края не будут никак использоваться — свет туда попадать не будет. Идеальная форма такого зеркала — эллипс, так как в проекции он дает окружность. Именно с таким зеркалом я уже сталкивался в готовом лидаре. Изготовить зеркало такой формы сложно, так что часто в лидарах используют восьмиугольное зеркало. Я пробовал изготовить такое зеркало самостоятельно, но только сломал несколько зеркал-заготовок из-за отсутствия опыта резки стекла малых размеров. Зато мне удалось найти на Aliexpress компанию, которая по моим чертежам изготовила четыре зеркала за 15$.
    К сожалению, заказанное зеркало имеет недостаток — оно ослабляет сигнал практически в 2 раза. Насколько я поникаю, это связано с тем, что зеркало покрыто алюминием, также оно может иметь некое защитное покрытие. Это может приводить к падению коэффициента отражения до 0.7 на длине волны 905 нм, что как раз дает коэффициент отражения ~0.5 с учетом того, что луч проходит зеркало дважды.
    Для длины волны 905 нм лучше подходят зеркала с серебряным или золотым покрытием, но они обычно стоят дороже. Подробнее про покрытия зеркал можно почитать здесь.


    Зеркало нужно как-то вращать. Просто закрепить его валу коллекторного мотора нельзя — большинство таких моторов рассчитаны на слишком высокие обороты. Использовать редуктор не хотелось — слишком большое усложнение конструкции и лишний шум.
    Идеальным решением было бы использование бесколлекторного мотора со встроенной электроникой (как в компьютерных вентиляторах), но, к сожалению, подходящий мотор мне найти не удалось. У меня были мысли использовать мотор и вентилятора, но в маленьких вентиляторах моторы вращались слишком быстро даже при низком напряжении, а моторы из больших вентиляторов не подходили по габаритам.
    Поэтому я решил использовать покупной бесколлекторный мотор (BLDC). Я специально нашел на Aliexpress маленький плоский Outrunner-мотор, имеющий вал, на который можно закрепить диск энкодера:
    motor


    Чтобы закрепить зеркало на моторе, была напечатана специальная деталь — держатель зеркала. В этом держателе было сделано специальное углубление для мотора, а само зеркало было приклеено к держателю. Вот так он выглядит:
    mirror-holder


    Для того, чтобы микроконтроллер мог определить, куда направлено зеркало, я установил на вал мотора простейший оптический энкодер. Диск для энкодера я взял из старой мышки, он имел 65 прорезей и хорошо стыковался с валом мотора. Одну из прорезей энкодера я заклеил — она используется как начало отсчета, то есть индикация нулевого угла:
    encoder
    Оптопару я использовал из старого принтера. Сигнал с нее заведен на компаратор, встроенный в MCU. Вот так выглядит сигнал с фототранзистора оптопары в момент пересечения начала отсчета:
    DSO-encoder


    В результате, получившийся лидар выглядит вот так:
    lidar-photo


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


    Безопасность


    В этом дальномере я использовал достаточно мощный лазер, работающий на длине волны 905 нм. Это излучение абсолютно невидимо глазом, но способно повредить сетчатку, так что оно представляет достаточно большую опасность для зрения.


    Внимание! Использование прошивки микроконтроллера для несканирующего режима особенно опасно, так в этом режиме лазер работает постоянно с частотой 1 кГц, и постоянно направлен в одну точку. Я измерял среднюю оптическую мощность на выходе объектива лазера специализированным измерителем мощности — она составляла 0.35 мВт (при напряжении питания узла лазера 16В). Даже такая мощность может быть опасна, так так излучение не видно! Любые работы с дальномером в этом режиме нужно производить в защитных очках!

    В сканирующем режиме из-за увеличения частоты импульсов средняя мощность излучения может доходить до 4.4 мВт, но благодаря тому, что луч постоянно перемещается, он не так опасен для зрения. В программе MCU имеются специальные проверки скорости мотора, так что лазер отключается, если скорость слишком большая или маленькая.


    Управление дальномером


    Для настройки и управления дальномером я написал для ПК две утилиты.
    Первая из них используется для настройки и тестирования дальномера в несканирующем режиме. Здесь можно настроить параметры работы лазера и фотоприемника, но главное — посмотреть данные с TDC:
    testing-utility-screen
    Эта программа отправляет на дальномер команду на проведение 100 измерений, которые заносятся в память MCU и затем отправляются на ПК и анализируются. Результаты анализа выводятся в окно в центре программы, кроме того, на их основе строится гистограмма, показывающая разброс результатов измерения времени полета (колонка START).


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


    1. Запускается запись данных.
    2. Плавно регулируется амплитуда сигнала, расстояние при этом должно быть неизменным. Для того, чтобы регулировать амплитуду, я перекрывал объектив фотодиода непрозрачной пластинкой. Уровень амплитуды косвенно контролируется по значению длительности импульса (WIDTH)
    3. Собрав достаточное количество точек, нужно остановить запись, и перейти на вкладку калибровки (Calibration). Здесь происходит обработка записанных данных. Выглядят они вот так:
      testing-utility-calib2
      По горизонтальной оси на этом графике — значение длительности импульса в BIN, по вертикальной оси — относительное изменение времени полета. Также на этой вкладке производится приближение экспоненциальной функции к собранным данным. Полученная функция показана на графике красной кривой. В результате приближения находятся два коэффициента, характеризующие эту функцию. Их следует записать в память MCU.

    Кроме того, используя эту утилиту, можно контролировать работу мотора лидара.


    Следующая утилита используется для проверки работы лидара в основном его режиме — сканирующем. Главное здесь — отображение сканов с лидара:
    scanning-utility-screen
    Видно, что часть пространства (внизу изображения) не сканируется. В этой зоне находятся стойки, на которых держится сканирующая механика и пластинка для калибровки. Величину этой зоны нужно задавать вручную.
    Также в утилите можно настраивать некоторые параметры лидара и производить простой анализ качества измерения расстояния до выбранного угла. В том числе по получаемым данным можно построить гистограмму (опять же для одного угла):
    A1-10m
    По горизонтальной оси здесь — сантиметры. В проекте на Гитхабе выложены аналогичные измерения для других расстояний.


    Результаты


    Получившийся лидар имеет такие характеристики:


    • Скорость сканирования: 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, как это сделано сейчас. Все эти доработки требуют времени, а его всегда не хватает.


    Механика сканирующего механизма — не самая удачная (но максимально простая). Во время вращения зеркало немного вибрирует из-за недостаточно хорошей балансировки. Сколько я не пытался, я так и не смог полностью устранить вибрацию.


    Из-за переотражений на зеркале не удается использовать объектив фотоприемника большого диаметра.


    Стоимость компонентов


    Грубо подсчитанный BOM
    Цена, $ Примечания
    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. Выглядит это вот так:
    IMG-7432a


    Для того, чтобы передавать в ROS данные от лидара, я написал для него специальный узел. Пример данных, выдаваемых лидаром:
    ros-rviz-screen
    Длина клетки на изображении — 1 метр. На нижнем изображении дальномер "сморит" сквозь коридор сложной формы.


    В результате работы SLAM получается вот такая карта:
    room-map3a
    В центре квартиры находится зеркальный шкаф; я частично закрыл его зеркальную поверхность перед запуском сканирования пластиковыми панелями, но они оказались слишком низкими, так что в некоторое моменты времени луч все равно попадал на зеркальную поверхность.


    Вот такая карта получается, если запустить SLAM в достаточно большом помещении:
    hector-slam-map-c
    Сканирование этого помещения сильно осложнялось большим количеством блестящих стульев и темными стенами.


    Видео про лидар:



    Аналогичные проекты


    Таких проектов не очень много. В первую очередь, следует упомянуть проект Open Source лидара Unruly. К сожалению, на данный момент этот проект заморожен или остановлен — информации о его состоянии нет. Фактически, главное что выложено в этом проекте — схема лидара и информация о его характеристиках. Не буду скрывать, некоторые части схемы я взял именно из этого проекта.


    Также здесь стоить упомянуть Reference Design от TI: TIDA-00663. Это довольно подробный открытый проект, но у него есть недостаток — конструкция платы просто не предназначена для присоединения к ней оптики. Так что результатов тестирования с реальной оптикой в документации просто нет. Кроме того, в этом проекте использован обычный PIN-фотодиод, а не APD.


    С другими аналогичными проектами (т.е. достаточно простыми, без использования FPGA и скоростных АЦП), я сожалению, не знаком. На просторах интернета нередко можно найти различные студенческие работы, но часто в них просто не приводятся параметры получившегося устройства, либо в них используются труднодоступные/дорогие компоненты. О наличии в открытом доступе прошивки и Geber-файлах говорить в таких случаях обычно не приходится.


    Репозиторий проекта на Github: https://github.com/iliasam/OpenTOFLidar
    Он содержит файлы проекта печатной платы, Gerber-файлы, подробный BOM к плате, BOM на весь проект с указанием ссылок для приобретения компонентов, некоторую информацию по механическим деталям, исходные коды прошивок, тестовые утилиты для ПК с исходными кодами, драйвер для ROS.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 66

      +8
      Илья, титаническая работа! Однозначный зачет )

      1) По мотору — при работе без нагрузки — по идее угол поворота хорошо согласуется с фазой питающего напряжения? Можно ли обойтись без энкодера?

      2) По оптике — при увеличении фокусного расстояния объектива лазерного диода — апертуры объектива перестает хватать, и бОльшая часть излучения промахивается мимо объектива… В этом случае — точно не хватает, там по «быстрой» оси многомодовых лазерных диодов свет обычно под углом градусов 30 расходится, а то и выше… Признак того, что излучение зарезается — пятно квадратной формы, а не длинного прямоугольника 1:10. Можно относительно несложно найти диоды на 808нм с FAC — линзой, которая по второй оси поджимает излучение, и тогда можно использовать коллиматоры небольшой апертуры…

      Так что я бы точно пробовал все завести с одиночной линзу с фокусным расстоянием 25-50мм и диаметром 12.7-25мм, с просветлением на ближний ИК. И в обоих случаях — черный корпус, распечатанный на 3Д принтере, чтобы не было переотражений…
        +3
        Спасибо!

        1. Мотором управляет специальная микросхема-драйвер, положение мотора она определяет по back-emf, и я не уверен, что в таком случае можно действительно точно определить положение ротора мотора. Подозреваю, что из-за неравномерности работы подшипника мотора могут быть ошибки.

        2. Из того что я видел, у линзы лазера было два положения, в которых излучение было максимально сфокусировано, и пятно имело форму линии (вертикальной или горизонтальной). Я установил линзу в промежуточное положение — там размер пятна был наименьшим.

        «Можно относительно несложно найти диоды на 808нм с FAC».
        Насколько сложно их достать, и будут ли они хорошо работать в импульсном режиме?
          0
          По диодам — думаю у меня есть образцы, можно протестировать. c-mount…
          Но по импульсному режиму ты прав, они CW. Может быть и выживут…
            0
            Только у c-mount мощность обычно где-то до 7-10 Вт, а здесь 75 Вт. Здесь бы больше подошло что-нибудь с волоконным выходом, но там цена совсем иная. Ещё как вариант собрать твердотельный лазер, например из той же зеленой мощной лазерной указки, заменить в ней диод накачки на более мощный, и удвоитель на NdYAG:Cr+4 cразу с напыленным на него выходным зеркалом, там и длительность импульса сразу будет 1-5нс, и энергетика неплохая.
            0

            У китайцев были c-mount с FAC, видел и в TO с FAC. Самим приклеить FAC на c-mount та ещё задача, там зазор должен быть где-то 10-50мкм, если не изменяет память. С импульсами 50-250мкс работают без каких либо проблем.

          +1
          Зависимость задержки от амплитуды можно убрать если на компаратор подавать не дифф. выход усилителя напрямую, а сравнивать сигнал с инвертированным сигналом, но задержанным на половину длины импульса. В таком случае момент перехода через ноль от амплитуды сигнала зависеть перестаёт.
          И почему tdc-gp21, а не tdc7200?
            0
            Я слышал про такой метод, но в таком случае требуется каким-то образом делать линию задержки на строго определенную длительность импульса.

            tdc-gp21 показалась мне более доступной, для нее есть в продаже дешевые китайские отладочные платы (ранние варианты дальномера были сделаны именно на такой плате). Плюс размеры микросхемы немного меньше.
              0
              Пара метров коаксиального кабеля.
              Да и импульс ещё укоротить можно.
                0
                Пару метров кабеля в маленький объём не засунуть.
                Импульс укорачивать можно, но до определенного предела.
                  0
                  по фотографии размеры выглядят как 50х50х150мм,
                  0.4м периметр витка вокруг длинной грани, укоротить импульс чтобы 2-3 витками обойтись.
                0
                А в сторону TDC-GP2 не смотрели? Стоит чуть дороже, но и сам производитель рекомендует её для лидаров, на ряду с GP1 и GPX.
                  0
                  TDC-GP2 вроде бы не сильно лучше? Из ее даташита:
                  The BIN size (LSB) is typically 65 ps at 3.3 V and 25 °C ambient temperature. The RMS noise is about 50 ps (0.7 LSB).

                  У TDC-GP21 в Measurement mode 1 BIN size = 90ps, Standard deviation Measurement Mode 1: 45ps.
                  В любом случае, у меня пока больше проблем в схемотехнике — фронты сигнала слишком пологие, так что маскимальное разрешения TDC и так хватает.

                  Я во время реверс-инжиниринга лидара Leuze сталкивался с TDC-GPX.
                  Самая крутая микросхема TDC у AMS: ams.com/tdc-gpx2, но она дорогая — 55$ и у нее неудобный LVDS выход.
                    0
                    >и у нее неудобный LVDS выход.
                    Но управление по SPI, в отличие от параллельного у TDC-GPX.
                    А с пологими фронтами в данном случае почти ничего и не сделать. Ладно бы токи были маленькие. Те же драйверы для электрооптики выдают крутые фронты, но там ток крайне мал, в отличие от напряжения в киловольты.
                      0
                      У приличных дальномеров фронты меньше 1 нс бывают, и длительность импульса по 4 нс и меньше.
                      У меня довольно посредственный драйвер MOSFET, rise time 4 нс. Лучше бы на более быстрый переходить, плюс нужно бороться с паразитными индуктивностями.
                      Вот какие вещи бывают:
                      www.ti.com/tool/TIDA-01573
                      epc-co.com/epc/Products/DemoBoards/EPC9126.aspx
                      epc-co.com/epc/Products/DemoBoards/EPC9144.aspx
                        0
                        У TI интересное решение, спасибо за наводку. А то с субпикосекундными и наносекундными твердотельными лазерами работаю, а что есть уже готовые 1нс драйверы для диодов и не знал.
                        P.S. А не было в планах затермостабилизировать и охладить фотодиод посадив его на Пельтье, по тому принципу, как это сделано в модуле из лидара на который вы ссылку приводили. Правда для близких расстояний это не особо надо, но на 50м уже оправданным будет.
                          0
                          Охлаждать фотодиод не думал — очень уж муторное занятие.
                          Целью проекта было сделать максимально простое устройство, доступное для повторения.
                          Даже относительно дешевые лидары вполне могут измерять и большие расстояния: lightwarelidar.com/pages/product-overview
                            0
                            Охлаждать фотодиод для уменьшения собственных шумов в данном случае действительно излишне, а вот держать его в точке максимального SNR напряжением стоит попробовать. Фотоусиление (M) у него неплохое, но нужно стоять вблизи напряжения лавинного пробоя. Сейчас же (без температурной коррекции) видимо приходится далеко уходить от этой точки теряя усиление.
                0
                По зеркалу: не знаю есть ли особенность именно с зеркалом, но стекло можно ножницами в воде вырезать практически любой формы из заготовки подходящего размера. Просто ножницы (не обязательно сильно острые) и полное погружение стекла в воду.
                  +1
                  Скажите честно — вы пробовали? Это настолько мало предсказуемый процесс, что проще вырезать другими методами… или перепортить сотню заготовок…
                    +3
                    Лично вырезал круглое стекло для фонарика (диаметром сантиметров 5).
                    Приходилось еще углы на одном стекле подрезать — там с рамой куда стекло ставилось были некоторые неприятные особенности.

                    В чем там чудо — пытались даже ученые в каком-то исследовании объяснить. Но вода просто реально делает со стеклом какое-то чудо, оно начинает откалываться мелкими кусочками, почти не отклоняясь от линии заданной ножницами.
                  +1
                  Охрененно! Просто офигительная работа!
                  Расчитываете ли довести свой лидар до 3D? Еще один мотор или зеркало сложной формы?

                  Как-то раз разговаривал со знакомым полу-физиком, он топил за chirp-модуляцию для лидаров. Типа утверждал что можно будет снизить мощность лазера, поднять чуствительность и даже чуть ли не сканировать сплошной линией, а не отдельными точками. К сожалению я далек от этой темы, но представляю себе это как разницу между AM и FM радио. Как вы думаете, реальна ли такая байда? Я могу представить как механически (или правильно сказать оптически) модулировать частоту излучения у светодиода, но как принимать сигнал — не понятно. Да и глупо механически, надо все делать как-то электронно.

                  А вообще было бы интересно получить опытный образец. Может какие-нибудь китайцы заинтересуются и займутся производством?
                    +1
                    3D делать не собираюсь — у меня уже и так есть 3D сканер: habr.com/ru/post/396357

                    Лазерные дальномеры с перестройкой частоты есть, они относятся к классу фазовых, со всеми соответствующими сложностями электроники.
                    И модулировать, и принимать свет высокой частоты не является большой проблемой — даже в современных оптоволоконных сетях частоты выше ГГц. В случае дальномера уровень принимаемых сигналов низкий, что создает сложности.
                    Описание дальномера такого типа я находил здесь: www.kit-e.ru/articles/elcomp/2010_9_78.php
                    0
                    Попробуйте такой вариант измерения расстояния:
                    1.Формирователь импульса с двумя входами запуска (формирует импульс длительностью 10 нс)
                    2. Подаете запускающий импульс на один из входов (с контроллера).
                    3. Лазер формирует импульс, он отражается возвращается на приемник.
                    4. Сигнал с приемника (после аналогового усиления, фильтра, компаратора) поступает на второй вход формирователя.
                    5. Формируется следующий импульс (подается на второй вход формирователя), выполняем +1 к счетчику и GOTO 3

                    При работе такой системы сформируется некоторая частота, пропорциональная расстоянию до отражающего объекта. Шумы по фронтам отдельных импульсов уменьшаются из-за нормальности распределения (примерно как корень из числа накоплений).
                    Измеряем частоту установившихся колебаний (частотомер при большом времени измерения устройство тривиальное — вариантов море). Частота и будет определять расстояние до цели плюс некоторое смещение (задержка приема + задержка передачи), которое нужно измерять периодически (зависит от параметров аппаратуры). Для расстояния до 100 метров ожидаемое время измерения одной точки 10 мкс, что позволяет выполнять развертку в 360 градусов и шагом в 0.1 градуса с числом оборотов 25 Гц.
                    Как автор данного метода (сильно надеюсь — инет не откликается) разрешаю всем пользоваться данным алгоритмом работы лидара.
                    Забыл момент: Точность измерения будет одинаковой для всех расстояний (от 1 мм до 100 метров), в итоге измерение производится одинаковое время, измеряемый интервал всегда равен примерно 10 мкс и его можно измерить даже таймером микроконтроллера точнее 1%.
                      0
                      Насколько я знаю, этот метод называется рециркуляционным: пример сообщения на форуме из 2009 года
                      Ну и древний патент от 1992 года:
                      patentimages.storage.googleapis.com/2a/00/1e/adfc8bdcbd2d0f/US5309212-drawings-page-3.png

                      Главная проблема метода — если частота импульсов будет слишком большая, то мощный лазер перегреется и также он будет опасен для зрения. А низкую частоту не получить, либо городить какие-то линии задержки.
                        0
                        Печаль ((
                        Ну да мы ВЕЛОСИПЕДОВ не боимся ))
                        Кстати почему не используют?
                      +4
                      Спасибо за Вашу статью, работа проделана очень большая.
                      Прочитал на одном дыхании, вынес для себя информацию о существовании специализированных микросхем для УЗ расходомеров, да ещё от такой хорошей компании как AMS. Очень полезно, спасибо ещё раз.
                      Кстати, для BLDC есть такая микросхема, как L6234D. Она стоит, например, в плате управления подвесом камеры Alexmos. Эта микросхема, совместно со специально перемотанными моторами, позволяет вращать мотор на любой угол и с любой скоростью. Моторы применяются с большим числом витков тоненьким проводом, т.е. это не классические аутраннеры, а оооочень меедллеенные аутраннеры =). Вот типа таких.
                        +1
                        Про L6234D я слышал, но это просто силовая микросхема, к ней еще нужен управляющий контроллер, который тоже придется программировать, плюс она достаточно крупная.
                          0
                          Кстати, а можно ли приколхозить для поворота зеркала (в ограниченном секторе) коромысла с магнитной системой от HDD?

                          Или использовать зеркало с мотором от лазерного принтера.
                            +2
                            Зеркало к приводу головок от HDD приделать можно, но этим приводом управлять достаточно сложно. Плюс привод маломощный, а инерционность у достаточно крупного зеркала будет большой.
                            Зеркала от принтера с трудом хватит только на перемещение луча лазера, в таком случае придется использовать широкоугольный объектив, а они обычно не светосильные. Может еще что-то потребуется, вроде цилиндрических линз, тут я точно сказать не могу.
                          0
                          так как нужно исследовать поведение APD во всем нужном диапазоне температур.
                          Исследовать не нужно. Посмотрите в документации на APD должен быть температурный коэффициент с размерностью Вольт/Градус. Выберите себе рабочую точку на кривой «Усиление от Напряжения» (температура там должна быть указана) и пересчитывайте напряжение под текущую температуру.
                            0
                            Хорошо, когда такая зависимость есть. Но чаще всего в даташитах ее не приводят, вот пример: даташит на AD500-8
                            Также я встречал даташиты, где даны зависимости усиления от напряжения для серии температур. Тут-то и спрятана проблема: усиление одновременно зависит и от напряжения, и от температуры, так что одиночным графиком явно не обойтись.
                              +2
                              В указанном даташите в таблице смотрите: Temperature coefficient 0.45 Вольт/Градус Кельвина.
                                0
                                Спасибо, никогда раньше не обращал внимание на этот параметр.
                            0
                            Крутая работа. Скажите, а на любительском уровне реально ли построить лазерный дальномер, которым можно измерить расстояние до Луны? К примеру, имея бюджет 1000 долларов. Интересуюсь чисто из любопытства.

                            И еще вопрос, что у вас за осциллограф?
                            +2
                            Для технического маньяка, способного на коленке собрать лидар, не должно создавать больших трудностей сделать метровое вогнутое зеркало: нужен всего-то метровый таз, подвешенный на веревочках к равномерно вращающемуся моторчику. Заполните таз эпоксидкой и через пару часов вы получите почти идеальную параболическую поверхность. Из за возникающих при отверждении внутренних напряжений процедуру стоит проводить в два этапа: отливка массивного остова и доотливка окончательной поверхности. Остается нанести (например гальванически осадить) немного серебра и отполировать поверхность тряпочкой.
                              0

                              Если бы все было бы так просто, то все астрономы-любители так поступали.

                                +1

                                В биографии известного американского физика Роберта Вуда, как раз описан принцип создания жидкого зеркала из ртути, как раз по тому же принципу что описали выше.
                                Но то был конец 19 века, ртуть ещё и лечили :)

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

                                  Для разглядывания звезд эпоксидное зеркало может и не сгодится, но с помощью него и маленькой линзы увеличить диаметр лазерного луча у вас наверное все-таки получится.
                                  Чтобы сказать точно, надо оптику вспоминать.
                                    +2
                                    Я думаю, что идеальная парабола выйдет только в случае идеальных условий — нужны абсолютное отсутствие вибраций и прецизионная балансировка емкости.
                                    Нужно как-то дегазировать вещество перед заливкой или после нее.
                                    Подозреваю, что даже градиенты температуры застывающей массы могут приводить к неравномерному застыванию — а значит, могут приводить к ухудшению формы.
                                    Есть подозрение, что описанным образом делают не сами зеркала, а заготовки для них, которые потом шлифуют и полируют традиционными методами.
                                0
                                Хорошая работа, кстати в лазерных принтерах я видел развёртку луча тоже с помощью БК мотора но в место зеркала там находился хорошо отполированный шестигранник, это позволяло 6 раз сканировать фото барабан за 1н оборот, может вам стоит тоже использовать такую развёртку.

                                Ещё более интересная развёртка электронная где лазеры объединяются на одной плате и засечёт управления фазой происходит отклонение луча, не знаю достижимо-ли это в домашних условиях но преимущества электронной развёртки очень большие и по скорости сканирования и по «углам наводки».
                                  0

                                  Автор молодец, тут спору нет. Однако, чувства двоякие.


                                  На дворе век кодеров со стековерфлоу, которые тяжелее мышки давно ничего в руки не брали, а сфера микроэлектроники считается чем-то космическим. На рынке труда это или редкие стартапы, или военка, где вот я например.


                                  Статья покрывает почти весь цикл разработки изделия и смотрится внушительно… но с точки зрения того, кто регулярно в этом крутится, всё чудо улетучивается. Обычное очередное изделие, которое, как правило, за месяц (и после ещё полутора на доставку компонентов и изготовление конструктива) превращается из концепта в изделие, которое работает и готово к применению.


                                  Пару китов от техаса или линеаров в 2020 передрать и сделать мощное изделие — ноу проблем эт олл. Жалко, что железная тема считается чудом, ведь на самом деле нет ничего сложного, если, конечно, речь не идёт о реальной аналоговой схемотехнике или высокоскоростных интерфейсах)

                                    +1
                                    А почему же тогда в интернете нет примеров «передирания»?
                                      +1
                                      Осмелюсь предположить, что тупо лень. Далеко не каждый свой успех люди выкладывают в интернет. Вот я, например, не торопясь делаю линукс-машину с RTL SDR, PoE, опционально зарядник с балансиром, IP68 и, быть может, не поленюсь ещё раз сыграть в HDMI-рулетку, вынеся его на плату расширения. Габарит материнской платы не превышает размеры кредитки, за корпус… ну, любая гаинтовская коробка подойдёт, профессиональная деформация на советские или сертифицированные по MIL-STD разъёмы и герметизация корпусов)) С linux from scratch тоже поиграться можно.

                                      Зачем? Да прикола ради. Свой флайтрадар-бокс + некоторое саморазвитие в области платформы, на которой веду одно из изделий. Выливать в оупенсоурс не шибко охота, ибо это ответственность перед коммьюнити как за косяки в платах, так и возможно корявый код. Будут подмывать мысли о коммерции, но считаю, что в моей РБ это так себе тема на данный момент.

                                      Считаю, что таких же жизненных ситуаций по миру вагон и маленький контейнеровоз с тележкой. К тому же многим банально не хватает опыта и смелости сделать своё, что тоже вполне нормально, поэтому они заказывают кит и делают из них самоделки, дорога на Digi-Key открыта всем)

                                      P.S. Дабы не было недопонимания, я реально рад, что есть энтузиасты и что проекты, подобные этому, появляются и существуют.
                                      0
                                      Если кто-нибудь возьмется в качестве хобби делать что-нибудь в сфере, которой до этого не касался, то он потратит довольно много времени, чтобы сначала разобраться в теме, а потом, чтобы реализовать в железе. Причем параметры изделия скорее всего получатся «так себе». Но для человека это будет большой успех.
                                      но с точки зрения того, кто регулярно в этом крутится, всё чудо улетучивается


                                      Те, кто регулярно в данной теме крутятся скорее всего не имеют права разглашать подробности и тем более не будут делать открытых проектов.
                                        +3
                                        Обычное очередное изделие, которое, как правило, за месяц (и после ещё полутора на доставку компонентов и изготовление конструктива) превращается из концепта в изделие, которое работает и готово к применению.

                                        Работает и готово к применению — это немного разные вещи. Как правило в железе после получения результата «работает» начинается долгая фаза индустриализации, включая все сертификационные и прочие испытания на эмс, безопасность и т.д. И это совсем не месяц.

                                        Вот у автора статьи, например, уже есть три потенциальных барьера для «готово к применению»:
                                        — чувствительность к WiFi — которая потенциально приведет к переделке схемы
                                        — безопасность лазера/защита от поражения лазерным лучём — которая может привести к переделке схемы — если сертификатор зарубит эту схему.
                                        — температурная зависимость, которая приведет к новой прошивке и калибровке.

                                        Только эти три проблемы (не считая более мелких), помимо изменения плат, приведут к инвалидации всех уже проведенных тестов и, возможно, изменению прошивки. И месяца там и близко не получится, если решение не найдется быстро. Причем тут уже не концептуальная фаза — придется балансировать также и конечной стоимостью изделия и если она вылезет за разумные пределы, то в принципе можно было бы и не начинать.

                                        Так вот умение сделать все правильно с первого раза, знать и оценивать проблемы, которые нужно устранить в конечном изделии — это и есть чудо.
                                        0
                                        Помимо алюминиевого зеркала, там и на непросветленных поверхностях в объективах по 4% теряется. Поэтому на одиночной линзе и энергетика выше.
                                        А расходимость по быстрой оси можно попробовать скомпенсировать короткофокусной цилиндрической линзой.
                                          +1
                                          Там на линзах действительно много теряется, по 20%.
                                          Одиночная линза фотоприемника, про которую я упоминал в тексте, в первую очередь просто большой диаметр имела — 25 мм, против входного зрачка готового объектива в 14 мм.
                                          +1
                                          Потрясающая работа!!! Моё почтение!

                                          Есть такая мысль, посылать вместо одиночного импульса последовательность Баркера. Прелесть в том, что её автокорреляция даёт максимум в одной точке (при нулевом смещении), что просто идеально для детектирования времени пролёта. Это увеличило бы помехозащищённость или даже позволило бы снизить мощность излучения. Но реализация на порядок сложнее, да и без FPGA никак вообще. Есть много статей про TDC на FPGA, в некоторых умудряются получать разрешение до 10ps. Разумеется там тоже всё PVT- нестабильно (process, voltage, temperature), без калибровки никак.

                                          Представляю это примерно так. Нужно 2 TDC. Один будет ловить импульс исходящий из FPGA (loopback), второй будет ловить тот, что прилетит с фотоприёмника. С помощью автокорреляции по регистрам состояний обоих TDC, находим точное положение импульса loopback и того, что прилетел. Зная точное положение, знаем расстоянием между ними. Нивелируем все прочие фиксированные задержки при прохождении сигнала и получаем время пролёта. Просто… да непросто.
                                            0

                                            При двух TDC точность будет страдать. Поэтому делают один, который измеряет временные отметки с одного счётчика для нескольких событий.
                                            Слать последовательность плохо тем, что потом это не обработать на таких частотах — любая сколько-либо сложная схема приведет к тому, что её невозможно будет откалибровать.
                                            Можно же не один импульс слать, а пачку и потом пропускать через полосовай фильтр и орабатывать. Тем более, что даже выбранная микросхему это умеет.
                                            Более того, зачем FPGA если упомянутая GP22 именно так и работает (только с одиноными импульсами или пачками импульсов) и даёт разрешающую способность до 22 пс.

                                            0
                                            Илья, приветствую. Присоединюсь к поздравлениям, очень круто!
                                            Выложили пост со ссылкой сюда Ros.org в русскую версию форума.
                                            И вопрос, можешь выложить образ на Orange Pi PC, на котором запущен ROS с работающим SLAM?
                                              0
                                              Спасибо за поддержку.
                                              Я глянул, на discourse.ros.org уже написали про этот проект.
                                              У меня на Orange Pi PC очень старая версия и Linux, и ROS — времен 2016 года.
                                              А вот вот этот узел, использованный для навигации, кому-то может быть и интересен: github.com/iliasam/ROS_simple_nav
                                              –1
                                              Очень стрёмная идея делать лидары самостоятельно!
                                              Потому что обязательно найдётся идиот желающий поставить лазер помощнее наплевав на безопасность и свою и случайных прохожих! :(
                                              image
                                                +1
                                                И где же «идиот» найдет импульсный лазер, еще большей мощности, чем у меня?
                                                Лазерный дальномер — вообще сложное устройство, собрать его — это не диод из DVD к батарейке приделать.
                                                  0
                                                  Лазерный дальномер — вообще сложное устройство, собрать его — это не диод из DVD к батарейке приделать.

                                                  И при этом его можно купить всего за 1000 рублей. С корпусом, экранчиком и батарейками, готовый к использованию.

                                                    0
                                                    И что с того, что его можно купить?
                                                    Дешевый дальномер для сканирования приспособить проблематично.
                                                  +1
                                                  Так это последствия от CO2 лазера. В серьезных времяпролетных дальномерах используют твердотельные лазеры либо на Nd:YAG, Nd:YVO4, Yb:YAG и прочее, которые генерируют на 1030-1064нм, там немного другое взаимодействие с глазом будет. Либо Yb,Er:YAG который генерирует на 1535нм и является вообще безопасным для глаз.
                                                  0
                                                  ***
                                                  Фазовые:
                                                  У этих дальномеров есть преимущества:
                                                  — Высокая точность измерения расстояния. Может падать при увеличении отношения сигнал/шум.
                                                  ***
                                                  Если это не опечатка, то интересен механизм такого падения, поясните пожалуйста.

                                                  Да, и самый главный вопрос — а зачем это всё? Есть ли какая-то цель создания дальномеров, или это чисто развлечение?
                                                    0
                                                    Это опечатка была, я ее поправил. Сбазибо за замечание.
                                                    Я дальномеры делаю просто для саморазвития.
                                                    0
                                                    Странные у вас результаты по точности измерения. Я тут потестировал GP-22 и если всё делать правильно (а описание там просто ужасное), то у вас должна была получиться точность ~1 см на расстояниях до десятка (нескольких десятков?) метров. Нужно смотреть в сторону стабильности параметров компаратора или вводить отдельную цепь для периодической калибровки (с выхода усилителя прямо на компаратор).
                                                      0
                                                      На близких расстояниях (2-4м) при хорошем отражении разброс значений составляет 2-3 BIN.
                                                      Ну а с падением амплитуды SNR падает, вот шумы и вылезают.
                                                      Есть большая проблема с крутизной фронта самого лазера — там сейчас 10 нс rise time.
                                                      У использованного TIA есть интересная особенность — в насыщении, которое наступает довольно быстро, фронт становится очень крутым (на гифке статье это видно), что заметно улучшает точность.
                                                        0

                                                        А режим GP22 используете с разрешением 22 пс?

                                                          0
                                                          У меня TDC-GP21.
                                                          Чтобы иметь возможность измерять время для двух каналов: STOP1/STOP2, я не использую режимы повышения разрешения.
                                                          TDC в таком случае можно использовать только в «Measurement mode 1».
                                                      0
                                                      Как вариант можно поставить не одну поверхность для калибровки, а две и решать уравнение a+k*L. При правильной работе с GP22 и с простейшей фильтраций и усреднением должна получиться точность порядка 22 пс и менее сантиметра на десяток метров.
                                                      Единственная засада в том, что вторая поверхность должна быть на расстоянии хотя бы в пять раз большем, чем первая, т.е. нужно несколько зеркал, чтобы уложиться в разумный габарит. Или использовать световод, уж, не знают как он себя на ИК ведёт.
                                                      Вы, кстати, надеюсь при самокалибровке ноля строите именно калибровочную повехность по нескольким точкам с фильтрацией и поиском кратчайшего расстояния? Иначе ноль будет заметно плавать.
                                                        0
                                                        Как я уже написал, все проблемы с точностью связаны с аналоговой частью — фронты слишком затянуты, плюс шумы присутствуют.
                                                        В программе при калибровке измеряется расстояние до одной и той же точки пластинки (для нулевого угла), результат пропускается через экспоненциальный фильтр.

                                                      Only users with full accounts can post comments. Log in, please.