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


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


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


image

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


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


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


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


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

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


image

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


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


image

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


Электроника


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


image

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


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


image

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


image

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


image

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


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


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


image

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


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


image

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


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


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

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


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


image

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


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

Вид сверху:

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


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


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

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


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


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


image

Габаритные размеры получившегося дальномера:
Размер основания: 88x110 мм.
Общая высота дальномера: 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:


image

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


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


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


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


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


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


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

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


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


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

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


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


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



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



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

Поделиться с друзьями
-->

Комментарии (43)


  1. radiolok
    23.05.2016 11:18
    +2

    Спасибо за интересную статью!
    А на GitHub или в виде ссылок можно увидеть еще некоторое количество ПО но уже на стороне компьютера? Насколько вижу, данные передаются на основной компьютер по Wi-Fi — как в виде ROS-кода выглядит ваша связка(и какой материал может быть полезен тому, кто о ROS только слышал и хочет потыкать)?

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

    Как вы рулили роботом на видео? Он сам ориентировался или вы его с пульта?

    Занятный момент с зеркалом кстати вышел — с этим можно как-то бороться? а то робот в стену въедет :)


    1. iliasam
      23.05.2016 11:36
      +1

      А на GitHub или в виде ссылок можно увидеть еще некоторое количество ПО но уже на стороне компьютера?

      Надо будет вечером выложить ROS-драйвер на github, хотя он не сильно отличается от кода для Neato.
      Щеточный узел — покупался на aliexpress, по запросу «slip ring» там выдается куча различных вариаций.
      Как вы рулили роботом на видео? Он сам ориентировался или вы его с пульта?

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

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


      1. serafims
        23.05.2016 11:45

        Ниже зеркала по идее плинтус… можно ниже сделать линии сканирования.


        1. iliasam
          23.05.2016 11:54

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


          1. soshnikov
            23.05.2016 13:40

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


            1. iliasam
              23.05.2016 14:15

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


  1. FDsagizi
    23.05.2016 11:22
    +1

    Вот это я понимаю понедельник)) Спасибо!


  1. Chingiss
    23.05.2016 12:05

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


    1. iliasam
      23.05.2016 12:20

      Мне не было нужно сканировать пространство в 3D, так что этот вопрос не прорабатывался. Очевидно, что если нужно 3D сканирование, то нужно некий сервопривод ставить, и поворачивать основание дальномера.


      1. radiolok
        24.05.2016 00:22

        Пф, сервопривод… Тут у чувака все без сервоприводов работает :)

        К слову, очень завораживающее видео и облака точек километрового размера…


        1. iliasam
          24.05.2016 00:42

          Там TOF дальномер с очень большой скоростью сканирования, и IMU для определения положения. И, конечно, без помощи человека не работает.


  1. mikkab
    23.05.2016 12:41

    Круто! на сколько помогают светофильтры при работе на улице? почему мощность лазера 3.5 мВт, а не больше?


    1. iliasam
      23.05.2016 12:44

      Я не использовал светофильтры, но они должны кардинально улучшать работу дальномера.
      Мощность лазера 3.5 мВт выбрана такой, так это более-менее безопасно (с учетом, что лазер постоянно вращается).


      1. mikkab
        23.05.2016 13:01

        с учетом того что система вращается, наверняка можно было и побольше взять. те же 5мВ вписываются в class 1 без проблем.
        Какой вес вращающейся конструкции? не думали использовать 2 зеркала — отдельно на лазер и приемник? механически сложнее конечно, но подвижных деталей было бы меньше.
        Теоретически, какова может быть максимальная скорость если поставить другую линейку и избавляться от АЦП.


        1. iliasam
          23.05.2016 14:22

          Здесь пишут:

          Если лазер невидимый, то он не может иметь класс 2 или 3a. Скорее всего, он класса 3b.
          Если лазер видимый мощностью до 1 милливатта, то он класса 2.
          Если лазер видимый мощностью от 1 до 5 милливатт, то он класса 3a.

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


          1. mikkab
            23.05.2016 14:30

            ну да, с классами я промахнуся


  1. Ghost_nsk
    23.05.2016 12:50

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


    1. iliasam
      23.05.2016 14:27

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


  1. artemonster
    23.05.2016 13:55

    торт. мммммм…


  1. Hellitron
    23.05.2016 14:21
    +1

    Я этот дальномер первый раз на «Робокрафте» и увидел. И именно по мотивам вашей статьи мы сделали 3D сканер (ссылка на статью на хабре), так что вам от меня большое спасибо!)


  1. mironsv
    23.05.2016 17:49

    Отличный результат! Мы так же работаем над созданием дальномера. Приходите к нам — напечатаем узлы на 3D-принтере по себестоимости и поделимся своими разработками.


    1. mikkab
      23.05.2016 23:26

      поподробнее можно?


  1. jar_ohty
    23.05.2016 20:28

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


    1. iliasam
      23.05.2016 22:18
      +1

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


      1. jar_ohty
        23.05.2016 23:53

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


  1. MaxAlekseev
    23.05.2016 23:27

    Ищите возможность печати на 3D принтере, на али есть вполне годные варианты за 200$… возможности возрастают на порядок.


    1. iliasam
      23.05.2016 23:37

      У меня весь дальномер меньше 50$ стоит. На самом деле, в Москве и Подмосковье есть фирмы, которые относительно дешево могут напечатать деталь. В то время, когда я делал пластмассовые детали, у меня были определенные сомнения в качестве деталей, напечатанных на 3D принтере, хотя сейчас я решил, что точности большинства принтеров должно хватать.


      1. MaxAlekseev
        24.05.2016 00:00

        Я по себе скажу, аппетит приходит во время еды… при этом печать детали итеративна, напечатал, примерил, выкинул, поправил чертеж, напечатал снова и так пока не выйдет то, что хочу. При заказе на стороне (это тоже проходил) — это невозможно, довольствуюсь тем что напечататли, сейчас же по приходу в лабораторию после чайника включаю 3D принтер! Работает он практически каждый день. Корпуса, нестандартный крепеж (а он весь нестандартный), колеса, втулки, панели, шестеренки… скажу так ваше замечательное устройство благодаря 3D притеру выглядело бы иначе. Даже недорогой вариант с али — это огромный качественный шаг в DIY проектах.


      1. NetBUG
        26.05.2016 14:03

        Кстати, RPLidar сделали таки вращающуюся призму, датчик у них неподвижен (чип, встроенный в плату). Но у них механика такая, что длина пути луча постоянна вне зависимости от положения головы. Лазер крутится вместе с головой.
        И да, у них энкодер с одним полюсом, они вычисляют ускорение-замедление по нескольким импульсам и равномерно делят.


        1. iliasam
          26.05.2016 14:20

          Подскажите, откуда взята эта информация?


          1. NetBUG
            26.05.2016 15:38

            Из результатов тыкания сабжа.


            1. iliasam
              26.05.2016 16:24

              Это что за модель RPlidar? A2 что-ли? Но и она выглядит как обычный триангуляционный дальномер (и вроде как еще не продается).
              RPlidar A1 я сам разбирал — там все то же, что и у меня в статье.
              То, о чем бы рассказываете, больше напоминает какой-то фазовый или импульсный дальномер.


  1. MaxAlekseev
    23.05.2016 23:54

    del


  1. Krey
    24.05.2016 03:44

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


    1. iliasam
      24.05.2016 08:13

      Что значит «активный энкодер»? Работающий на отражение?

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

      Если комната одна и без мебели, то может можно и диодами обойтись. А если комнат несколько, и они соединены коридорами, и стоит мебель, то углов получается очень много — смотрите на карту в статье. Все эти светодиоды нужно как-то запитывать, и модулировать их сигнал.
      Данные от трех камер нужно еще как-то отправить на компьютер (по USB что-ли?), потом обработать (обработка изображений — не самый быстрый процесс). Если камеры «копеечные», что у них могут быть проблемы с FPS, особенно в темноте.
      Кроме того, такая система позиционирования никак не позволяет обнаруживать и объезжать препятствия.


  1. igorp1024
    24.05.2016 12:44
    -2

    Глянул на карту квартиры. Уж очень похоже на что-то вроде этого.
    image


  1. MrRIP
    25.05.2016 17:59

    Вопрос на засыпку — а если в роли линейки взять «сканерную» линию с реальными 1280 «дпи»? Там и линейка поболе будет(база измерения больше). Или есть проблемы с пользованием таких «линеек»?


    1. iliasam
      25.05.2016 18:04
      +1

      Базовое расстояние определяется самой конструкцией дальномера — можно маленькую сделать, а можно большую.
      1280 DPI — это соответствует пикселю со стороной 20 мкм. У ELIS-1024 ширина пикселя — 7 мкм, а размер пикселя в данном случае важнее их количества.
      У уже упоминал сканерные линейки в статье — из за их габаритов объектив тоже должен быть большим.


      1. MrRIP
        25.05.2016 18:29

        Объектив можно взять из того-же сканера(там он в виде плоской линзы сделан). А по размерам пикселя — брать не CPI, а CCD — там чип размерами чуть больше вашей линейки ;) суммарное кол-во пикселей в среднем от 4800 до почти 30 тысяч(это у крутых ЦЦД с реальными оптическими 1200дпи) — там размер пикселя почти 3мкм(2.6-2.8 и менее). Один минус сканерных линеек — они медленные…


  1. lim
    26.05.2016 23:54

    Попробуйте вместо ELIS-1024 использовать TCD1201D — это тоже CCD, 2048 пикселей, стоит меньше 4$ (вот тут например)


    1. iliasam
      27.05.2016 00:28

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

      тоже CCD

      ELIS-1024 — не CCD, а CMOS. CCD сложно управлять, им часто нужны повышенные напряжения для работы.


      1. lim
        27.05.2016 03:22

        Зато дешево и сердито :) Во всяком случае я их брал как раз для дальномера, как сделаю — напишу. Просто за 18$ можно уже и камеру взять, и на той же Pi вычислять расстояния.


        1. iliasam
          27.05.2016 08:14

          Только с камерой скорость работы будет просто никакая. У камеры хорошо если 60 FPS есть, а линейка делает 2100 снимков в секунду.