В продаже, есть большое количество, дешёвых, датчиков – дальномеров, в их числе ультразвуковые и инфракрасные. Все эти устройства работают хорошо, но из – за значительного веса, не подходят для летающих роботов. Миниатюрный робот вертолет, например, может нести около 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 |
Компоненты
Для сборки дальномера требуется не так много деталей. Для соединения лазерной указки и камеры я вырезал раму – основание из картона.
Собранный дальномер выглядит следующим образом:
Программное обеспечение
Я написал программу обработчик на двух языках: 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.