Самодельный дальномер: Самодельный сканирующий лазерный дальномер / Хабр

Содержание

Самодельный сканирующий лазерный дальномер / Хабр


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


Зачем нужен сканирующий дальномер?

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


Но для домашних экспериментов в робототехнике такие сканеры мало подходят — цена на них начинаются от 1000$.
На помощь приходят дальномеры, использующие триангуляционный принцип измерения расстояния. Дальномер такого типа впервые появился в роботах-пылесосах Neato:


Довольно быстро любители расшифровали протокол этого дальномера, и начали использовать его в своих проектах. Сами дальномеры в качестве запчастей появились на ebay в небольших количествах по цене около 100$. Через несколько лет китайская компания смогла выпустить сканирующий дальномер RPLIDAR, который поставлялся как полноценный прибор, а не запчасть. Только цена этих дальномеров оказалась достаточно высокой — 400$.


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

Как только я узнал о дальномерах Neato, мне захотелось собрать самому аналогичный. В конце концов, мне это удалось, и процесс сборки я описал на Робофоруме.

Первая версия дальномера:

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


Устройство сканирующего триангуляционного лазерного дальномера

Принцип измерения расстояния до объекта основан на измерении угла между лазерным лучом, попадающим на объект, и объективом дальномера. Зная расстояние лазер-объектив (h) и измеренный угол, можно вычислить расстояние до объекта — чем меньше угол, тем больше расстояние.
Принцип хорошо иллюстрирует картинка из статьи:


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

Тут может возникнуть вопрос — зачем нужно вращать оптику и электронику, ведь можно установить вращающееся зеркало? Проблема в том, что точность дальномера зависит от расстояния между объективом и лазером (базового расстояния), так что оно должно быть достаточно большим. Соответственно, для кругового сканирования понадобится зеркало диаметром, большим базового расстояния. Дальномер с таким зеркалом получается достаточно громоздким.
Сканирующая головка дальномера при помощи подшипника закрепляется на неподвижном основании. На нем же закрепляется двигатель, вращающий головку. Также в состав дальномера должен входить энкодер, предназначенный для получения информации о положении головки.
Как видно, дальномеры Neato, RPLIDAR и мои самодельные сделаны именно по этой схеме.

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

Во второй версии дальномера первые две проблемы я решил, использовав части старого HDD — сам диск использовался как основание сканирующей головки, а двигатель, на котором он закреплен, уже содержал качественные подшипники. В то же время, при этом возникла третья проблема — электрические линии можно было провести только через небольшое отверстие в оси двигателя. Мне удалось сделать самодельный щеточный узел на 3 линии, закрепленный в этом отверстии, но получившаяся конструкция получилась шумной и ненадежной. При этом возникла еще одна проблема — линии, чтобы пробросить сигнал энкодера, не было, и датчик энкодера в такой конструкции должен быть установлен на головке, а диск энкодера с метками — на неподвижном основании. Диск энкодера получился не жестким, и это часто вызывало проблемы.
Фотография второй версии дальномера:


Еще один недостаток получившегося дальномера — низкая скорость сканирования и сильное падение точности на расстояниях больше 3м.
Именно эти недостатки я решил устранить в третьей версии дальномера.


Электроника

В принципе, электронная часть триангуляционного дальномера достаточно проста и содержит всего два ключевых компонента -светочувствительную линейку и микроконтроллер. Если с выбором контроллера проблем нет, то с линейкой все значительно сложнее. Светочувствительная линейка, используемая в подобном дальномере, должна одновременно иметь достаточно высокую световую чувствительность, позволять считывать сигнал с высокой скоростью и иметь маленькие габариты. Различные CCD линейки, применяемые в бытовых сканерах, обычно довольно длинные. Линейки, используемые в сканерах штрихкодов — тоже не самые короткие и быстрые.

В первой и второй версии дальномера я использовал линейки TSL1401 и ее аналог iC-LF1401. Эти линейки хорошо подходят по размеру, они дешевые, но содержат всего 128 пикселей. Для точного измерения расстояния до 3 метров этого мало, и спасает только возможность субпискельного анализа изображения.
В третьей версии дальномера я решил использовать линейку ELIS-1024:


Однако купить ее оказалось непросто. У основных поставщиков электроники этих линеек просто нет.
Первая линейка, которую я смог купить на Taobao, оказалась нерабочей. Второю я купил на Aliexpress (за 18$), она оказалась рабочей. Обе линейки выглядели паянными — обе имели облуженные контакты и, судя по маркировке, были изготовлены в 2007 году. Причем даже на фотографиях у большинства китайских продавцов линейки именно такие. Похоже, что действительно новую линейку ELIS-1024 можно купить только напрямую у производителя.

Светочувствительная линейка ELIS-1024, как следует из названия, содержит 1024 пикселя. Она имеет аналоговый выход, и достаточно просто управляется.
Еще более хорошими характеристиками обладает линейка DLIS-2K. При сходных размерах, она содержит 2048 пикселей и имеет цифровой выход. Насколько мне известно, именно она используется в дальномере Neato, и возможно, в RPLIDAR. Однако, найти ее в свободной продаже очень сложно, даже в китайских магазинах она появляется не часто и дорого стоит — более 50$.

Так как я решил использовать линейку с аналоговым выходом сигнала, то микроконтроллер дальномера должен содержать достаточно быстрый АЦП.

Поэтому я решил использовать серию контроллеров — STM32F303, которые, при относительно небольшой стоимости, имеют несколько быстрых АЦП, способных работать одновременно.
В результате у меня получилась такая схема:

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

Плату разводил двухстороннюю, сделать такую плату в домашних условиях качественно довольно сложно, так что заказал изготовление плат в Китае (пришлось заказать сразу 10 штук):


В этом дальномере я использовал дешевый объектив с резьбой M12, имеющий фокусное расстояние 16мм. Объектив закреплен на печатной плате при помощи готового держателя объектива (такие используются в различных камерах).
Лазер в данном дальномере — инфракрасный (780 нм) лазерный модуль, мощностью 3.5 мВт.
Изначально я предполагал, что излучение лазера нужно будет модулировать, но позже оказалось, что с используемой линейкой в этом нет смысла, и поэтому сейчас лазер включен постоянно.
Для проверки работоспособности электроники была собрана вот такая конструкция, имитирующая сканирующую головку дальномера:


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

Для анализа сигнала, формируемого линейкой, были написаны тестовые программы для микроконтроллера и ПК.
Пример вида сигнала с линейки (объект на расстоянии 3 м).


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


Механическая часть

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

Уже после того, как я изготовил детали, стало понятно, что изготовить детали на 3D принтере было бы проще, они могли выйти тверже, и возможно, можно было бы сделать одну деталь вместо двух. Доступа к 3D принтеру у меня нет, так что пришлось бы заказывать изготовление детали в какой-либо компании.
Фото одной из деталей сканирующей головки дальномера:


Эта деталь является основой головки. Она состоит из втулки, на которую позже надевается подшипник, и диска. Диск предназначен для крепления второй детали башни, кроме того, на него снизу наклеивается диск энкодера.
Втулка и диск содержат сквозное отверстие, в которое вставляется покупной щеточный узел на 6 линий — его видно на фотографии. Именно те провода, что видны на фотографии, могут вращаться относительно корпуса этого узла. Для повышения стабильности работы для передачи сигналов GND и UART TX используется 2 пары линий щеток. Оставшиеся 2 линии используются для передачи напряжения питания и сигнала энкодера.

Силиконовая форма для отливки этой детали:


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

Для крепления сканирующей головки к основанию дальномера используется шариковый подшипник. Я использовал дешевый китайский подшипник 6806ZZ. Честно говоря, качество подшипника мне не понравилось — ось его внутренней втулки могла отклонятся относительно оси внешней на небольшой угол, из-за чего головка дальномера тоже немного наклоняется. Крепление подшипника к детали с диском и основанию будет показано ниже.

Основание я сделал из прозрачного оргстекла толщиной 5 мм. К основанию крепится подшипник, датчик энкодера, двигатель дальномера и маленькая печатная плата. Само основание устанавливается на любую подходящую поверхность при помощи стоек.
Вот так выглядит основание дальномера снизу:

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

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


Сигнал от оптопары через щетки передается на вход компаратора микроконтроллера. В качестве источника опорного напряжения для компаратора выступает ЦАП микроконтроллера.
Для того, чтобы дальномер мог определить положение нулевого угла, на диск энкодера нанесена длинная риска, отмечающая нулевое положение головки (она видна справа на фотографии выше).

Вот так выглядит собранный дальномер:

Вид сверху:

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

Собранный дальномер нужно отюстировать — установить лазер в такое положение, чтобы отраженный от объектов свет попадал на фотоприемную линейку. Обе пластмассовые детали содержат соосные отверстия, располагающиеся под пазом лазера. В отверстия вворачиваются регулировочные винты, упирающиеся в корпус лазера. Поворачивая эти винты, можно изменять наклон лазера.
Наблюдая в программе на компьютере форму и амплитуду принятого сигнала и изменяя наклон лазера, нужно добиться максимальной амплитуды сигнала.
Также триангуляционные дальномеры требуют проведения калибровки, о чем я писал ранее:


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

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

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

Эволюция самодельных дальномеров:


Габаритные размеры получившегося дальномера:
Размер основания: 88×110 мм.
Общая высота дальномера: 65 мм (может быть уменьшена до 55 при уменьшении высоты стоек).
Диаметр сканирующей головки: 80 мм (как у mini-CD диска).

Как и у любого другого триангуляционного дальномера, точность измерения расстояния этого дальномера резко падает с ростом расстояния.
При измерениях расстояния до объекта с коэффициентом отражения около 0. 7 у меня получились примерно такие точностные характеристики:


Расстояние Разброс
1 м <1 см
2 м 2 см
5 м 7 см

Стоимость изготовления дальномера:


DIY, $ Опт., $
Основание
Пластина основания 1,00 0,50
Двигатель 0,00 1,00
Подшипник 1,50 1,00
Щеточный узел 7,50 5,00
Крепежные детали 0,00 2,00
Сканирующая головка
Контроллер STM32F303CBT6 5,00 4,00
Фотоприемная линейка 18,00 12,00
Остальная электроника 4,00 3,00
Плата 1,50 0,50
Объектив 2,00 1,50
Держатель объектива 1,00 0,50
Лазер 1,00 0,80
Пластиковые детали 3,00 2,00
Крепежные детали 0,00 1,00
Сборка 0,00 20,00
Итого: 45,50 54,80

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


Программная часть дальномера

Перед написанием программы нужно рассчитать тактовую частоту, на которой будет работать фотоприемная линейка.
В старых версиях дальномера частота сканирования была ограничена 3 Гц, в новом дальномере я решил сделать ее выше — 6Гц (это учитывалось при выборе линейки). Дальномер делает 360 измерений на один оборот, так что при указанной скорости он должен быть способен производить 2160 измерений в секунду, то есть одно измерение должно занимать менее 460 мкс. Каждое измерение состоит из двух этапов — экспозиция (накопление света линейкой) и считывание данных с линейки. Чем быстрее будет произведено считывание сигнала, тем длиннее может быть время экспозиции, а значит, и тем больше будет амплитуда сигнала. При тактовой частоте линейки 8 МГц время считывания 1024 пикселей будет составлять 128 мкс, при 6 МГц — 170 мкс.

При тактовой частоте микроконтроллера серии STM32F303 в 72 МГц максимальная частота выборок АЦП — 6 MSPS (при разрядности преобразования 10 бит). Так как я хотел проверить работу дальномера при тактовой частоте линейки 8 МГц, я решил использовать режим работы АЦП, в котором два АЦП работают одновременно (Dual ADC mode — Interleaved mode). В этом режиме по сигналу от внешнего источника начала запускается ADC1, а затем, через настраиваемое время, ADC2:


Как видно из диаграммы, суммарная частота выборок АЦП в два раза выше, чем частота триггера (в данном случае это сигнал от таймера TIM1).
При этом TIM1 также должен формировать сигнал тактовой частоты для фотоприемной линейки, синхронный с выборками АЦП.
Чтобы получить с одного таймера два сигнала с частотами, различающимися в два раза, можно переключить один из каналов таймера в режим TIM_OCMode_Toggle, а второй канал должен формировать обычный ШИМ сигнал.

Структурная схема программы дальномера:

Ключевой частью программы является именно захват данных с линейки и управление ей. Как видно из схемы, этот процесс идет на аппаратном уровне, за счет совместной работы TIM1, ADC1/2 и DMA. Для того, чтобы время экспозиции линейки было постоянным, используется таймер TIM17, работающий в режиме Single Pulse.

Таймер TIM3 генерирует прерывания при срабатывании компаратора, соединенного с энкодером. За счет этого рассчитывается период вращения сканирующей головки дальномера и ее положение. По полученному периоду вращения рассчитывается период таймера TIM16 таким образом, чтобы он формировал прерывания при повороте головки на 1 градус. Именно эти прерывания служат для запуска экспозиции линейки.

После того, как DMA передаст все 1024 значения, захваченные ADC, в память контроллера, программа начинает анализ эти данных: сначала производится поиск положения максимума сигнала с точностью до пикселя, затем, при помощи алгоритма поиска центра тяжести — с более высокой точностью (0.1 пикселя). Полученное значение сохраняется в массив результатов. После того, как сканирующая головка сделает полный оборот, в момент прохождения нуля этот массив предаются в модуль UART при помощи еще одного канала DMA.


Использование дальномера

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

Однако дальномер делался не для того, чтобы просто лежать на столе — он был установлен на старый пылесос Roomba 400 вместо дальномера второй версии:

Также на роботе установлен компьютер Orange Pi PC, предназначенный для управления роботом и связи с ним.
Как оказалось, из-за большой просадки напряжения на линейном источнике питания двигателя дальномера, для работы на скорости 6 об/сек дальномеру требуется питающее напряжение 6В. Поэтому Orange Pi и дальномер питаются от отдельных DC-DC преобразователей.

Для управления роботом и анализа данных от дальномера я использую ROS.
Данные от дальномера обрабатываются специальным ROS-драйвером (основанном на драйвере дальномера Neato), который получает по UART данные от дальномера, пересчитывает их в расстояния до объектов (используя данные калибровки) и публикует их в стандартном формате ROS.
Вот так выглядит полученная информация в rviz (программа для визуализации данных ROS), робот установлен на полу:

Длина стороны клетки — 1 метр.

После того, как данные попали в ROS, их можно обрабатывать, используя уже готовые пакеты программ. Для того, чтобы построить карту квартиры, я использовал hector_slam. Для справки: SLAM — метод одновременного построения карты местности и определения положения робота на ней.
Пример получившейся карты квартиры (форма несколько необычна, потому что дальномер «видит» мебель, а не стены, и не все комнаты показаны):

ROS позволяет объединять несколько программ («узлов» в терминологии ROS), работающих на разных компьютерах, в единую систему. Благодаря этому, на Orange Pi можно запускать только ROS-драйверы Roomba и дальномера, а анализ данных и управление роботом вести с другого компьютера. При этом эксперименты показали, что hector_slam нормально работает и на Orange Pi, приемлемо загружая процессор, так что вполне реально организовать полностью автономную работу робота.

Система SLAM благодаря данным от дальномера позволяет роботу определять свое положение в пространстве. Используя данные о положении робота и построенную карту, можно организовать навигационную систему, позволяющую «направить» робота в указанную точку на карте. ROS содержит в себе пакет программ для решения этой задачи, но, к сожалению, я так и не смог заставить его качественно работать.

Видео работы дальномера:


Более подробное видео построения карты при помощи hector_slam:


Исходные коды программы контроллера

P. S. Также у меня есть проект более простого лидара.

Дальномер лазерный: изготовление своими руками

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

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

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

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

Основные причины для монтажа лазерного дальномера

Схема работы лазерного дальномера.

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

  • лазерный дальномер;
  • ультразвуковой дальномер.

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

Лазерный дальномер, сделанный своими руками, состоит из нескольких частей:

  • плата;
  • микроконтроллер;
  • усилитель лазерного сигнала;
  • лазер;
  • фотоприемник;
  • фильтр.

В основном излучение лазера возникает при помощи синусоидального сигнала.

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

Вернуться к оглавлению

Сборка: практические рекомендации

Структурная схема импульсного лазерного дальномера.

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

Для такого лазерного устройства берется самый простой усилитель мощности. Он состоит из одной микросхемы 74HC04, которая собрана из шести инверторов. Подача тока ограничивается специальными резисторами. Однако умельцы могут заменить резисторы более надежными деталями.

Пусконаладочная плата становится источником 5-вольтового напряжения. Таким образом усилитель получает питание. Чтобы убрать наводки сигнала на другую часть электрической схемы, усилительный корпус делается стальным, каждый провод экранируется.

В качестве лазера выступает привод, установленный в DVD-приставках. Такое устройство имеет вполне достаточную мощность для функционирования на частоте, достигающей 10 МГц.

В состав приемника входит:

  • фотодиод;
  • усилитель.

В состав усилителя входит полевой транзистор, специальная микросхема. Когда увеличивается расстояние, происходит падение освещенности фотодиода. Поэтому необходимо иметь мощное усиление. Собираемая схема позволяет достичь 4000 единиц.

Когда увеличивается частота, начинают уменьшаться сигналы фотодиода. Усилитель подобной конструкции является главной и сильно уязвимой частью. Его настройка требует очень высокой точности. Желательно отрегулировать коэффициент усиления таким образом, чтобы получать максимальные значения. Самым простым способом будет подача на транзистор 3 В. Можно установить обыкновенную батарейку.

Чтобы приемник начал работать, необходимо подать 12 В. Для этого устанавливается специальный блок питания.

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

Описанная выше система позволит создать самодельный лазерный дальномер в бытовых условиях.

Фотограф превращает камеру Game Boy в элегантный «дальномер». среди моих любимых. Невероятно, насколько творчески люди могут работать с простой 2-битной цифровой камерой: снимать астрофотографии, макросъемку, гоночные автомобили, портреты… Даже превращая ее в веб-камеру.

Фотограф Кристофер Грейвс создал еще один вдохновляющий проект с помощью камеры Game Boy. Он превратил его в Камера M (или M1), элегантная и элегантная камера в стиле дальномера. Он любезно поделился некоторыми фотографиями своей сборки с DIYP, а также подробностями того, как он ее создал.

Рекламные объявления

Для этой сборки Кристофер использовал Game Boy Pocket и Game Boy Camera. Он использовал оригинальные кнопки Game Boy для управления, хотя они не от Game Boy Pocket, который он использовал для создания Camera M . Вместо этого он добавил кнопки из Nintendo Game Boy Advance SP.

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

Рекламные объявления

Он также перечисляет характеристики и функции этой камеры, и вот что она предлагает, помимо элегантного внешнего вида и супер-lo-fi изображений:

  • Полностью индивидуальный корпус и форм-фактор
  • Высококачественная кожзаменитель камеры покрытие
  • Индивидуальные печатные платы
  • Верхняя кнопка «затвора» A
  • Переработанный выключатель питания
  • Крепление объектива CS/C (на фото с варифокальным объективом CCTV 5–50 мм)
  • IPS-дисплей с подсветкой и 4-кратным целочисленным масштабированием (слегка больше оригинала)
  • Башмак для установки дополнительных аксессуаров
  • Крепежный винт 1/4 дюйма для штатива и других монтажных решений
  • Проушины для ремешка
  • Фиксатор порта Game Boy Link для печати, торговли и т. д. Кнопки в стиле Clicky GBA SP
  • Аккумулятор емкостью 1800 мА·ч, которого хватает примерно на 8 часов работы при полной зарядке
  • Порт зарядки USB type-c
  • Сохраняется доступ к оригинальному слоту тележки для OEM-камеры и других тележек

Не забудьте подписаться на Кристофера в Instagram и Twitter. И если вы хотите, чтобы Camera M увидела свет, вы можете сделать это здесь.

Рекламы

Рекламы

Рубрики: Gear С тегами: DIY, Game Boy camera, gameboy, дальномер

О Дуне Джуджич

Дуня Джуджич — талантливая художница из Сербии. Имея 15-летний опыт работы фотографом, она специализируется на запечатлении красоты природы, путешествий и изобразительного искусства. В дополнение к своей фотографии Дуня также выражает свое творчество через письмо, вышивку и изготовление ювелирных изделий.

Самодельный сканирующий лазерный дальномер / Хабр


Зачем нужно расстояние сканирования?

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


Довольно быстро любители расшифровали протокол этого дальномера, и стали использовать его в своих проектах. Сами дальномеры в качестве запчастей появились на ebay небольшими партиями по цене около 100 долларов. Через несколько лет китайская компания смогла выпустить сканирующий дальномер RPLIDAR, который поставлялся в виде комплектного прибора, а не запчасти. Только цена этих дальномеров была достаточно высока — 400 долларов.


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

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

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


Устройство для сканирующего триангуляционного лазерного дальномера

Принцип измерения расстояния до объекта основан на измерении угла между лазерным лучом, падающим на объект, и линзой дальномера. Зная расстояние лазер-линза (h) и измеренный угол, можно рассчитать расстояние до объекта — чем меньше угол, тем больше расстояние.
Принцип хорошо иллюстрирует картинка из статьи:


Таким образом, ключевыми оптическими компонентами такого дальномера являются лазер, объектив и фотоприемная планка.
Поскольку дальномер сканирующий, то все эти детали, а также управляющая электроника смонтированы на вращающейся головке.
Может возникнуть вопрос — зачем поворачивать оптику и электронику, ведь можно установить вращающееся зеркало? Проблема в том, что точность дальномера зависит от расстояния между объективом и лазером (базовое расстояние), поэтому оно должно быть довольно большим. Соответственно, для кругового сканирования понадобится зеркало диаметром больше базового расстояния. Дальномер с таким зеркалом довольно громоздкий.
Сканирующая головка дальномера с помощью подшипника закреплена на неподвижном основании. Также фиксирует двигатель, вращая головку. Также в состав дальномера следует включить энкодер, предназначенный для получения информации о положении головы.
Как видите, по этой схеме сделаны дальномеры Neato, RPLIDAR и мои самоделки.

Самое сложное в самодельном дальномере — изготовление механической части. Именно ее работа вызывала у меня больше всего нареканий в ранних версиях дальномера. Сложность заключается в изготовлении сканирующей головки, которая должна быть прочно закреплена на подшипнике, вращаться без биений и при этом не должна каким-либо образом передавать электрические сигналы.
Во второй версии дальномера первые две проблемы я решил за счет использования частей старого HDD — сам диск использовался как основа сканирующей головки, а двигатель, на котором он был закреплен, уже содержал качественные подшипники. В то же время возникла третья проблема — электрические провода можно было провести только через небольшое отверстие в оси двигателя. Удалось сделать самодельный щеточный узел на 3 строчки, закрепленный в этом отверстии, но получившаяся конструкция была шумной и ненадежной. В данном случае возникла другая проблема — не было линии для проброса сигнала энкодера, и датчик энкодера в данной конструкции должен быть установлен на головке, а диск энкодера с метками на неподвижном основании. Диск энкодера не был жестким, и это часто вызывало проблемы.
Фото второй версии дальномера:


Еще одним недостатком получившегося дальномера является низкая скорость сканирования и резкое падение точности на дистанциях более 3м.
Эти недостатки я решил устранить в третьей версии дальномера.


Электроника

В принципе, электронная часть триангуляционного дальномера достаточно проста и содержит всего два ключевых компонента — светочувствительную линейку и микроконтроллер. Если с выбором контроллера проблем нет, то с линейкой все гораздо сложнее. Светочувствительная линейка, используемая в таком дальномере, должна одновременно обладать достаточно высокой светочувствительностью, позволять считывать сигнал с высокой скоростью и иметь небольшие размеры. Различные линейки ПЗС, используемые в домашних сканерах, обычно довольно длинные. Линейки, используемые в сканерах штрих-кода, тоже не самые короткие и быстрые.
В первой и второй версии дальномера я использовал линейку TSL1401 и ее аналог iC-LF1401. Эти линейки хорошо подходят по размеру, они дешевые, но содержат всего 128 пикселей. Для точного измерения расстояний до 3 метров этого недостаточно, и спасает только возможность анализа субизображения.
В третьем варианте дальномера я решил использовать линейку ЭЛИС-1024:


Однако купить ее было непросто. У основных поставщиков электроники этих линеек просто нет.
Первая линия, которую я смог купить на Таобао, оказалась нерабочей. Второй купил на Алиэкспресс (за 18$), он оказался рабочим. Обе линейки выглядели припаянными — обе имели заглаженные контакты и, судя по маркировке, 2007 года выпуска. И даже на фотографиях у большинства китайских продавцов линейки именно такие. Похоже, действительно новую линейку ЭЛИС-1024 можно купить только напрямую у производителя.
Светочувствительная линейка ЭЛИС-1024, как следует из названия, содержит 1024 пикселя. Он имеет аналоговый выход и достаточно просто управляется.
Линейка ДЛИС-2К имеет еще лучшие характеристики. При аналогичных размерах он содержит 2048 пикселей и имеет цифровой выход. Насколько мне известно, он используется в дальномере Neato, а возможно и в RPLIDAR. Однако найти его в свободной продаже очень сложно, даже в китайских магазинах он появляется не часто и стоит дорого — более 50 долларов.

Так как я решил использовать линейку с аналоговым выходом сигнала, микроконтроллер дальномера должен содержать достаточно быстрый АЦП. Поэтому я решил использовать серию контроллеров — STM32F303, которые при относительно небольшой стоимости имеют несколько быстрых АЦП, способных работать одновременно.
В итоге у меня получилась следующая схема: Сигнал с линейки (вывод 10) имеет достаточно высокий уровень постоянной составляющей, и его приходится отфильтровывать с помощью разделительного конденсатора. Далее сигнал нужно усилить — для этого используется операционный усилитель AD8061. Далеко расположенные объекты дают довольно слабый сигнал, поэтому пришлось установить усиление на 100.

Как выяснилось в результате экспериментов, даже при отсутствии сигнала на выходе выбранного ОУ, для почему-то всегда присутствует напряжение около 1,5В, что мешает обработке результатов и ухудшает точность измерения амплитуды сигнала. Чтобы избавиться от этого смещения, пришлось подать дополнительное напряжение на инвертирующий вход ОУ.

Сделал двухстороннюю доску, в домашних условиях сделать такую ​​доску достаточно сложно, поэтому заказал производство плат в Китае (пришлось заказывать сразу 10 штук):


В этом дальномере я использовал дешевую линзу с резьбой М12 с фокусным расстоянием 16 мм. Объектив крепится на печатной плате с помощью готового объективодержателя (такие используются в различных фотоаппаратах).
Лазер в данном дальномере представляет собой инфракрасный (780 нм) лазерный модуль мощностью 3,5 мВт.
Изначально я предполагал, что излучение лазера нужно будет модулировать, но позже выяснилось, что пользоваться используемой линейкой нет смысла, и поэтому лазер теперь включен постоянно.
Для проверки работоспособности электроники была собрана такая конструкция, имитирующая сканирующую головку дальномера:


Уже в таком виде можно было проверить точность измерения дальности, которую может обеспечить дальномер.
Для анализа сигнала, формируемого линейкой, были написаны тестовые программы для микроконтроллера и ПК.
Пример вида сигнала с линейки (объект на расстоянии 3 м).


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


Механическая часть

После того, как электроника была отлажена, пришло время сделать механическую часть.
В этот раз я не стал заморачиваться с механикой HDD, а решил сделать механические части из жидкого пластика, залитого в силиконовую форму. Эта технология подробно описана в Интернете, в том числе на Giktatimes.
Уже после того, как я сделал детали, стало понятно, что детали на 3D-принтере делать будет проще, они могут выйти тяжелее, и, возможно, получится сделать одну деталь вместо двух. У меня нет доступа к 3D-принтеру, поэтому пришлось бы заказывать изготовление деталей в любой компании.
Фото одной из частей сканирующей головки дальномера:


Эта деталь является основой головки. Он состоит из втулки, на которую потом одевается подшипник, и диска. Диск предназначен для крепления второй части башни, кроме того, к нему снизу приклеен диск энкодера.
Втулка и диск имеют сквозное отверстие, в которое вставляется щеточный узел на 6 рядов — видно на фото. Именно провода, которые видны на фотографии, могут вращаться относительно корпуса этого узла. Для повышения стабильности работы используются 2 пары щеточных линий для передачи сигналов GND и UART TX. Оставшиеся 2 линии используются для передачи напряжения питания и сигнала энкодера.

Силиконовая форма для отливки этой детали:


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

Шариковый подшипник используется для крепления сканирующей головки к основанию дальномера. Я использовал дешевый китайский подшипник 6806ZZ. Честно говоря, качество подшипника мне не понравилось — ось его внутренней втулки могла отклоняться относительно внешней оси на небольшой угол, из-за чего головка дальномера тоже немного наклоняется. Установите подшипник на часть с диском, и основание будет показано ниже.

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

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

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


Сигнал с оптрона через щетку передается на вход компаратора микроконтроллера. В качестве источника опорного напряжения для компаратора используется ЦАП микроконтроллера.
Для того, чтобы дальномер определял положение нулевого угла, на диске энкодера нанесена длинная рискка, которая отмечает нулевое положение головки (она видна справа на фото выше).

Вот собранный дальномер: Вид сверху: разъем сзади дальномера служит для прошивки микроконтроллера. Для балансировки сканирующей головки на ее передней части установлена ​​большая гайка — она практически полностью исключает вибрацию при вращении головки.

Собранный дальномер необходимо устюстировать — установить лазер в такое положение, чтобы отраженный от предметов свет попадал на линию фотоприемника. Обе пластмассовые детали содержат коаксиальные отверстия, расположенные под лазерной канавкой. В отверстия вкручиваются регулировочные винты, упирающиеся в корпус лазера. Поворачивая эти винты, вы можете изменить наклон лазера.
Наблюдая за формой и амплитудой принимаемого сигнала в компьютерной программе и изменяя наклон лазера, нужно добиться максимальной амплитуды сигнала.
Также триангуляционные дальномеры требуют калибровки, как я уже писал ранее :


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

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

Получившийся дальномер имеет существенный недостаток — из-за отсутствия модуляции лазерного излучения он некорректно работает при любом сильном освещении. Обычное комнатное освещение (даже при использовании мощной люстры) не влияет на работу дальномера, но расстояние до поверхностей, непосредственно освещенных Солнцем, дальномер измеряет некорректно. Для решения этой проблемы в состав дальномера необходимо включить интерференционный фильтр, пропускающий свет только определенной длины волны — в данном случае 780 нм.

Эволюция самодельных дальномеров:


Габаритные размеры получившегося дальномера:
Размер основания: 88х110 мм.
Общая высота дальномера: 65 мм (может быть уменьшена до 55 при уменьшении высоты стоек).
Диаметр сканирующей головки: 80 мм (как мини-CD).

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


Distance Scatter
1m <1 cm
2 m 2 cm
5 m 7 cm

The cost of manufacturing range finder:


DIY, $ Opt., $
Base
Base plate 1.00 0.50
Engine 0.00 1.00
Bearing 1.50 1. 00
Brush knot 7.50 5.00
Fasteners 0.00 2.00
Scan head
STM32F303CBT6 controller 5.00 4.00
Photo-receiver ruler 18.00 12.00
The rest of the electronics 4.00 3.00
Pay 1.50 0.50
Lens 2.00 1.50
Lens holder 1.00 0.50
Laser 1.00 0.80
Plastic parts 3.00 2.00
Fasteners 0.00 1.00
Assembly 0.00 20.00
Total: 45. 50 54.80

In the first column — how much the range finder обошлась мне, во вторую — сколько это могло бы стоить в промышленном производстве (оценка очень приблизительная).


Программное обеспечение для дальномера

Перед написанием программы необходимо рассчитать тактовую частоту, на которой будет работать линейка фотоприемников.
В старых версиях дальномера частота развертки была ограничена 3Гц, в новом дальномере решил сделать выше — 6Гц (это учитывалось при выборе линейки). Дальномер делает 360 измерений за один оборот, так что при указанной скорости он должен иметь возможность производить 2160 измерений в секунду, то есть одно измерение должно занимать менее 460 мкс. Каждое измерение состоит из двух этапов – экспозиции (накопления света линейкой) и считывания данных с линейки. Чем быстрее считывается сигнал, тем больше может быть время экспозиции, а значит, больше амплитуда сигнала. При тактовой частоте 8 МГц время чтения 1024 пикселей составит 128 мкс, при 6 МГц — 170 мкс.

При тактовой частоте микроконтроллера серии STM32F303 72 МГц максимальная частота дискретизации АЦП составляет 6 MSPS (при разрядности 10 бит). Так как я хотел проверить работу дальномера на тактовой частоте 8МГц, то решил использовать режим работы АЦП, при котором два АЦП работают одновременно (Dual ADC mode — Interleaved mode). В этом режиме АЦП1 запускается после сигнала от внешнего источника, а затем, через настраиваемое время, АЦП2:


Как видно из диаграммы, суммарная частота отсчетов АЦП в два раза превышает частоту запуска (в данном случае это сигнал с таймера TIM1).
При этом TIM1 также должен генерировать тактовый сигнал для линии фотоприемника, синхронный с отсчетами АЦП.
Для того, чтобы получить два сигнала от одного таймера с частотами, отличающимися в два раза, можно один из каналов таймера перевести в режим TIM_OCMode_Toggle, а второй канал должен формировать обычный сигнал ШИМ.

Блок-схема программы дальномера:

Ключевой частью программы является сбор данных с линейки и управление ими. Как видно из схемы, этот процесс идет на аппаратном уровне, за счет совместной работы TIM1, ADC1/2 и DMA. Чтобы время экспозиции линейки было постоянным, используется таймер TIM17, работающий в режиме Single Pulse.

Таймер TIM3 генерирует прерывания при срабатывании компаратора, подключенного к энкодеру. За счет этого рассчитывается период вращения сканирующей головки дальномера и ее положение. По полученному периоду вращения рассчитывается период таймера TIM16 таким образом, что он формирует прерывания при повороте головы на 1 градус. Эти прерывания используются для запуска экспозиции линейки.

После того, как DMA передаст в память контроллера все 1024 значения, захваченные АЦП, программа начинает анализировать эти данные: сначала ищется максимальное положение сигнала до пикселя, затем, используя центр алгоритм гравитационного поиска с более высокой точностью (0,1 пикселя). Полученное значение сохраняется в массиве результатов. После того, как сканирующая головка сделает полный оборот, в момент прохождения нуля, этот массив передается в модуль UART по другому каналу DMA.


Использование дальномера

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

Однако дальномер создан не для того, чтобы просто лежать на столе — он был установлен на старый пылесос Roomba 400 вместо дальномера вторая версия: Компьютер Orange Pi PC предназначен для управления роботом и связи с ним. Как оказалось, из-за большого падения напряжения на линейном источнике питания двигателя дальномера для работы дальномера со скоростью 6 оборотов в секунду требуется напряжение питания 6В. Поэтому Orange Pi и дальномер питаются от отдельных DC-DC преобразователей.

Я использую ROS для управления роботом и анализа данных с дальномера.
Данные с дальномера обрабатываются специальным драйвером ROS (на основе драйвера дальномера Neato), который получает данные от дальномера по UART, пересчитывает их в расстояния до объектов (используя калибровочные данные) и публикует в стандартном ROS формат.
Вот информация, полученная в rviz (программа визуализации данных ROS), робот установлен на полу:

Длина стороны ячейки 1 метр.

После того, как данные попали в ROS, их можно обрабатывать с помощью готовых пакетов программ. Чтобы построить карту квартиры, я использовал hector_slam. Для справки: SLAM — метод одновременного построения карты местности и определения положения робота на ней.
Пример полученной карты квартиры (форма несколько необычна, т.к. дальномер «видит» мебель, а не стены, и показаны не все комнаты):

РОС позволяет объединить несколько программ («узлов» в терминологии ROS), работающие на разных компьютерах в единую систему. Благодаря этому на Orange Pi можно запускать только ROS-драйвера Roomba и дальномера, а анализировать данные и управлять роботом с другого компьютера. При этом эксперименты показали, что hector_slam нормально работает на Orange Pi, приемлемо нагружая процессор, поэтому организовать полностью автономную работу робота вполне реально.

Самодельный дальномер: Самодельный сканирующий лазерный дальномер / Хабр

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх