В продаже, есть большое количество, дешёвых, датчиков – дальномеров, в их числе ультразвуковые и инфракрасные. Все эти устройства работают хорошо, но из – за значительного веса, не подходят для летающих роботов. Миниатюрный робот вертолет, например, может нести около 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.
Прикрепленные файлы:
- LaserRange.zip (2006 Кб)
- tripodDlg.cpp (15 Кб)
- Коды программ.rar (31 Кб)