Лазерный дальномер из web камеры

В продаже, есть большое количество, дешёвых, датчиков – дальномеров, в их числе ультразвуковые и инфракрасные. Все эти устройства работают хорошо, но из – за значительного веса, не подходят для летающих роботов. Миниатюрный робот вертолет, например, может нести около 100г полезной нагрузки. Это даёт возможность использовать, для поиска препятствий и предотвращения столкновений с ними, машинное зрение, используя веб-камеры (или другие миниатюрные, беспроводные камеры с подключением к компьютеру через USB). А ещё лучше, установить две камеры, что обеспечит роботу, стерео зрение, таким образом, благодаря информации о глубине изображения, улучшится обход препятствий. Недостатком этой идеи, является, добавление веса второй камеры.

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

Этот проект основан на статье найденной здесь.

Принцип работы

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

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

Как мы видим из рисунка выше, расстояние (D) может быть рассчитано по формуле:

Конечно, для решения этого уравнения, вы должны знать, h- фиксированное расстояние между лазерной указкой и камерой. Знаменатель высчитывается так:

Соединив два предыдущих уравнения, мы получим:

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

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

Данные калибровки

пикселов от центра

фактический D (см)

103

29

81

45

65

58

55

71

49

90

45

109

41

127

39

159

37

189

35

218

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

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

Зная калибровочные данные, я подсчитал:

Используя калибровочные данные и данные предварительного расчёта, я подсчитал процент ошибки:

Фактические и расчётные данные

пикселов от центра

действительный D (см)

расчётный D (см)

Ошибка(%)

103

29,84

29

2,88

81

41,46

45

-7,87

65

57,55

58

-0,78

55

75,81

71

6,77

49

93,57

90

3,96

45

110,85

109

1,70

41

135,94

127

7,04

39

153,27

159

-3,60

37

175,66

189

-7,06

35

205,70

218

-5,64

Компоненты

Для сборки дальномера требуется не так много деталей. Для соединения лазерной указки и камеры я вырезал раму – основание из картона.

Собранный дальномер выглядит следующим образом:

Программное обеспечение

Я написал программу обработчик на 2-х языках: Visual C + + и Visual Basic. Вы, вероятно, подумаете, что программа на Visual Basic проще, чем на VC + + в плане кода, но во всём есть компромисс. Код на VC + + можно собрать бесплатно (при условии, что у вас есть Visual Studio), в то время как код VB требует приобретение программных пакетов сторонних производителей (в дополнение к Visual Studio).

Visual basic

Написанная мною программа на  Visual Basic доступна в нижней части страницы под именем vb_laser_ranger.zip    

Чтобы этот код работал, необходимо установить на вашем компьютере VideoOCX -компонент ActiveX

Скриншоты из этой программы можно увидеть ниже:

Visual C++

Полный код этого проекта доступен в виде пакета с именем LaserRange.zip в нижней части страницы.  

Обратите внимание, чтобы запустить исполняемый файл, вам необходимо иметь на компьютере qcsdk и qc543 драйвера.

Ниже приведены два примера лазерного дальномера. Обратите внимание, что во втором примере мы видим две лазерные точки. Это «рассеянный свет» вызванный внутренними отражениями в камере. Отражённая в камере точка теряет интенсивность, и не вмешивается в алгоритм определения ярких пикселей на изображении.

Дальнейшая работа

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

В будущем

Я получал большое количество писем от людей, которые пытались дублировать этот дальномер. Пожалуйста, имейте в виду, что этот проект впервые был сделан до 2004 года (старыми методами). Если вы будите повторять эту работу, то лучше использовать для захвата и обработки изображения с камеры, библиотеку компьютерного зрения OpenCV.

Оригинал статьи

Прикрепленные файлы:

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

Ваш адрес email не будет опубликован.