Статья о дальнейшем улучшении прошлой версии тира geektimes.ru/post/255350
Пользоваться тиром дома быстро наскучило, поэтому, на радость коллегам, он был установлен на работе. Однако после непродолжительной эксплуатации был выявлен ряд недостатков:
- «игрушечность» и непрактичность пистолета
- необходимость кропотливой калибровки
- пропуски выстрелов
- перспективные искажения камеры и вследствие — значительные погрешности
- система подсчета очков без округления
Все это было исправлено в новой версии.
Перво-наперво пистолет был заменен на увесистый и солидный — страйкбольный:
Был удален ствол и установлен лазер.
Вместо arduino была собрана простая схема управления. Так как контакты в пистолете только на замыкание, пришлось изощряться:
Изначально мотор пистолета не отключал — он работал с имитацией отдачи и громким хлопком выстрела. Но, не смотря на бурный восторг стреляющих, от данной опции пришлось отказаться, так как она отвлекала коллег по работе.
Мишени были добавлены маркеры для калибровки:
Алгоритм поиска маркеров сделал простой, но достаточно надежный. Сначала выполняется поиск всех углов на изображении. Затем происходит поиск углов, у которых рядом четыре соседа и проверка, что линии, их соединяющие, образуют угол не менее 45 градусов. По найденным углам мишени однократно строится матрица преобразования из перспективного пространства в пространство абстрактной мишени.
30 кадров в секунду от USB камеры не устраивали, по этому камера была заменена на аппаратную. Заодно, малинка была заменена на Raspberry Pi 2. После этого получилось добиться частоты обновления порядка 80 кадров в секунду, что полностью решило проблему пропусков выстрелов. Так же улучшил алгоритм поиска пятна лазера. Теперь изображение предварительно размывается для усреднения и используется для компенсации разницы яркостей в пределах кадра. Это позволило тиру работать при любом освещении.
Так же программа была переписана с питона на C++. Для ее сборки на малинке требуется собранный OpenCV. Исходники здесь github.com/DIMOSUS/Laser-shoting-2.0
Теперь тир вновь радует коллег. Мой персональный рекорд 92 из 100 с 10 метров.
Комментарии (42)
V_N_P
05.03.2016 14:37Прикрутить бы это пистолет вот к этой игре
.
MOORHUHN…
.
Интересно если координаты лазера передавать по интерфейсу PS2 как положение указателя мышки, возможно такое сделать?
DIMOSUS
05.03.2016 14:38Есть большая проблема — пятно лазера почти не видно на мониторе или телевизоре.
ktod
05.03.2016 15:28А если перед камерой поставить фильтр на длину волны лазера? Конечно, в результате появляются еще проблемы, но все решаемо.
DIMOSUS
05.03.2016 15:29Тогда уж фильтры с круговой поляризацию для камеры и лазера :)
ktod
05.03.2016 16:16А как же oled, плазма и пр? Там то поляризатора нет.
dkv
06.03.2016 04:43Проектор и экран?
DIMOSUS
06.03.2016 11:04Вот это наиболее реалистично. Пятно лазера будет хорошо видно.
dkv
06.03.2016 11:21Хотел ответить, что автор ниже уже отписался по поводу экрана, но… ))) Тогда спрошу иное: Не заметил в статье упоминания разрешения, при котором обеспечивается такая скорость захвата. Насколько в данный момент загружен процессор при обработке 80 fps? Как на Raspberry Pi2 обстоит дело с аппаратным ускорением OpenCV? Помнится, CUDA на Nexus 2012 делала своё дело, хотя это ничуть не спасало ситуацию и выше 20 fps я там ни на одном из сэмплов от NVIDIA не увидел. Сам пока жду отправки и приезда ко мне широкоугольной (G) камеры. Придётся в её случай ещё и геометрию править прежде чем отдавать картинку на дальнейший анализ.
DIMOSUS
06.03.2016 11:47Камера снимает 320х240, при этом на 100% загружается одно ядро. Можно распаралелить обработку на все четыре ядра, но такой необходимости не возникло. В текущем режиме тир работает не выключаясь — маленького радиатора хватает что бы держать температуру на уровне 50'C.
Этот нексус работает на Tegra?dkv
06.03.2016 12:37Да, речь о планшете Nexus 7 2012. Там Tegra. Особо не экспериментировал, но для себя сделал выводы, что про OpenCV в рилтайм на андроиде можно забыть. Вот думу думаю как детектировать скважность и частоту мигания светодиода определенного цвета, беря в расчёт, что такой диод в кадре только один, но само изображение — далеко не белый лист бумаги. При этом бы ещё и обойтись без OpenCV, чтобы не тащить это наследие за собой.
k0ldbl00d
05.03.2016 23:39Для устройств типа "мышь" передаётся не абсолютное положение указателя, а dX и dY. Но можно попробовать вариант USB-HID устройства с абсолютным позиционированием. USB не такое сложное каким может показаться.
schroeder
05.03.2016 14:51OpenCV компилировали сами или нашли где то уже готовое?
DIMOSUS
05.03.2016 14:54Собирал сам, пользовался данной инструкцией http://robertcastle.com/2014/02/installing-opencv-on-a-raspberry-pi/
На удивление собралось без проблем.
Big-Boss
05.03.2016 14:53+1А зачем лазер?
Не проще поставить в пистолет камеру с объективом на десятки миллиметров и в момент "выстрела" захватывать кадр и смотреть, что оказалось по центру изображения захваченного камерой? Причем камере в принципе все равно, рисованное изображение захватывать или картинку с монитора.
На мой взгляд нормальную отдачу получится реализовать только используя усилия нажатия на спусковой крючок. В процессе нажатия пружина с грузом взводится, а достигая момента стрельбы груз освобождается и ударяя в стопор инициирует выстрел. При стандартном для обычного пистолета усилии 1-2 кг. можно взводить существенный по весу груз.DIMOSUS
05.03.2016 14:58Так работают профессиональные тиры. Но в моем случае это неоправданное усложнение конструкции.
Ну а отдача для "отвлечься от работы в офисе" оказалась не нужна.Big-Boss
05.03.2016 15:09А в чем усложнение? Вы же все равно используете камеру?
В вашем случае обрабатывается картинка с лазерной точкой, но думаю тот же алгоритм прекрасно обработает картинку с камеры пистолета с искусственно нарисованной где надо точкой.
Проблему вижу только в габаритах камеры. От телефона камеры маленькие, но как прикрутить к Raspberry с неродным объективом, даже не представляю.DIMOSUS
05.03.2016 15:15+1Усложнение в том, что на пистолет нужно повесить камеру и Raspberry, плюс батарею для питания. Иначе придется пожертвовать мобильностью. К тому же с десяти метров погрешность обычной камеры будет огромна.
Big-Boss
05.03.2016 15:19Это да, пистолет будет на проводе.
Никогда не использовали камеры 22мм. И больше?
С объективом 100-200 мм. можно будет и на сто метров стрелять.DIMOSUS
05.03.2016 15:24+1И как все это будет выглядеть на пистолете? :) Да и шанс повредить или сбить центровку очень высок.
Фокусное расстояние фиксировано, соответственно будет работать под какую-то оптимальную дистанцию. То что работает на 100 метров не будет работать с 10-ти. Добавить новый ствол для стрельбы тоже проблематично. У лазера таких проблем нет.
В общем считаю, что лазер куда практичнее и удобнее.
AllexIn
05.03.2016 16:52+1А можно пример такого профессионального тира?
Просто я сам 6 лет проработал в конторе делающей профессиональные тиры…
И огнестрелы делали, и пневматику и мягую и жесткую, лазер делали… Об использовании камеры в пистолете даже речи никогда не было…
Это вообще не моя область. Я программист. Поэтому интересуюсь не с точки зрения: вот мы так не делали, значит вы не правы. А именно с точки зрения: посмотреть на примеры и попробовать разобраться, а почему наши то так не делали...
Big-Boss
05.03.2016 15:35Сразу гуглятся такие http://www.0kopeek.ru/Shpionskie-gadzhety#Mikrokamery
но наверное не подойдут. Как их прикручивать к стороннему оборудования даже не знаю.
Размер достаточно мал, но и с объективом придется колхозить.
У вас диапазон работы примерно 10 метров. Если настроить фокус на 10 метров, то приемлемо будет работать в диапазоне 8-12 метров.DIMOSUS
05.03.2016 15:40Ну это уже если понадобится сделать профессиональное решение. А моего для офиса хватает с избытком и усложнять смысла пока нет.
pbw
05.03.2016 23:03Лазерный тир хорош именно для развлекательной стрельбы.
Может быть, у автора появится интерес сделать третью версию, и возможно,
эти несколько ссылок пригодятся впоследствии.
Проект «HomeLess bullet free shooting».
Мишени на экранах, конструктивы оружия. Исходники на гитхабе.
Проект «shootoff». Примерно то же самое. Исходники на гитхабе.
Проект «Shooting-Range».
Проект заброшен, второй версии так и не появилось. О начале проекта можно
прочитать тут (с 6-ой страницы и далее). Исходников нет.
Саму прогу брать здесь. Там же есть видео работы.
Установка, опыт использования: здесь.
Несколько попыток создать рабочий лазерный тир: здесь.pbw
05.03.2016 23:38+1Прошу прощения. Видимо, я не могу вставлять ссылки. Т.ч. тот же текст, но со ссылками.
Проект "HomeLess bullet free shooting"
http://homeless-eng.webnode.com/
Мишени на экранах, конструктивы оружия. Исходники на гитхабе.
Проект "shootoff"
http://shootoffapp.com/
Примерно то же самое. Исходники на гитхабе.
Проект "Shooting-Range".
Проект заброшен, второй версии так и не появилось. О начале проекта можно прочитать
тут (с 6-ой страницы и далее):
http://forum.guns.ru/forummessage/16/518822-6.html
Исходников нет. Саму прогу брать здесь:
http://www.soft-collection.com/#SoftCollection%20Shooting-Range
Там же есть видео работы.
Установка, настройка:
http://lasers.org.ru/forum/threads/%D0%9B%D0%B0%D0%B7%D0%B5%D1%80%D0%BD%D1%8B%D0%B9-%D1%82%D0%B8%D1%80.712/page-4#post-112341
Несколько попыток создать рабочий лазерный тир:
http://lasers.org.ru/forum/threads/%D0%9B%D0%B0%D0%B7%D0%B5%D1%80%D0%BD%D1%8B%D0%B9-%D1%82%D0%B8%D1%80.712/DIMOSUS
05.03.2016 23:51Оптимальным вариантом развития сейчас вижу замену экрана TV на проектор. Тогда действительно можно будет без проблем стрелять в экран.
auct
06.03.2016 12:56Проектор работает без проблем.
Для использования ТВ, на его экран можно повесить полупрозрачную матовую пленку. Лазерную точку будет видно. Яркость и контрастность ТВ-картинки еще надо задавить.
auct
06.03.2016 13:15По поводу лазерного импульса. По схеме DIMOSUS-а лазер "пыхает" от конденсатора, и сильную яркость он дает на очень маленькое время. Поэтому вам нужно поднимать частоту кадров на камере.
В "профессиональных" (коммерческих) лазерных стволах время задается микросемами жестко от 50 до 100мс. Это позволяет засекать точку камерой даже на 15кадрах/сек.DIMOSUS
06.03.2016 13:19С длинным импульсом появляется проблема шлейфов в место точек, когда ствол ведет в руках.
pbw
06.03.2016 17:52Поэтому системы с ИК-излучателями на мишени, и камерой на оружии,
отслеживают непрерывный трек точки попадания. Выстрел — это обрыв
трека, дальнейшие перемещения игнорируются.
ИК-лазер на пистолеты не ставят, так как вес, фокусировка, питание, прочее.
Может быть, для снижения частоты кадров камеры подойдет следующая идея:
Выстрел — это пачка коротких импульсов, общей длительностью 50...100мс.
Начальные несколько импульсов "остаются" в первом кадре, остальные — в
следующих кадрах. Начальные импульсы расцениваются как выстрел.
Так как тир не для спорта, а развлекательный, то точности достаточно для
фиксации результата.
Чтобы не было паразитных (кольцевых) засветок вокруг точки, перед лазером
поставить поляризационный фильтр, вырезанный из старых очков с полароидом.
Яркость точки ощутимо уменьшится, поэтому мощность лазера придется увеличить.
Для этой идеи как раз кстати предыдущая реализация автора: пистолет с ардуиной
нано + ключевой транзистор для лазера.
Конденсаторная схема очень быстро съедает батарейку. Это не имеет значения,
если в оружии установлен аккумулятор. Но делают излучатели и на 3-х
вольтовых литиевых батареях, батарейки надо покупать.
Для батарейного питания ставят простейшую схему на 3-х вольтовом
КМОП-таймере NE555. Нет дребезга контактов, кнопку можно ставить на замыкание/размыкание, длительность импульса регулируется.DIMOSUS
06.03.2016 18:04Не понимаю — зачем снижать частоту камеры, если аппаратная часть реализации без проблем обеспечивает 80 кадров в секунду? С такой частотой у меня без сбоев регистрируются импульсы порядка 5мс.
Дребезг контактов иногда случается, но совершенно не мешает — так как после детектирования выстрела идет 500мс игнорирования импульсов.
А круги засветки легко отфильтровываются программно, так как значительно тусклее основного пятна.pbw
06.03.2016 18:15Вы разработчик, вы делаете так, как вам удобнее. Я ничего не советую, лишь
предполагаю, что могло бы пригодиться в далеком будущем. Вдруг у вас
появится желание снова вернуться к обычной веб-камере. Или, к примеру,
заменить малинку телефоном с камерой:)
Pafnutyi
06.03.2016 18:07Как бы переделать эту штуку для нескольких мишеней? Тренировка быстрого переноса сектора стрельбы и тд.
Нашёл вот такую поделку, автор не отвечает на почту, может кто видел подобные системы
schroeder
Как вы получаете картинку из родной расберевской камеры и преобразуете ее в Mat из opencv?
DIMOSUS
Камера подхватывается OpenCV как обычная. Соответственно ни чего придумывать не пришлось:
schroeder
интересно. Полгода назад пробовал так же, ничего не получалось. Правда я использовал Java API, но разницы быть не должно.
DIMOSUS
Возможно от версии зависит? Я не стал использовать третью, взял 2.4.12