Тир на Raspberry, версия 2.0

0d885f50e06846ffb1dd335e6bb87d9c.jpg
Статья о дальнейшем улучшении прошлой версии тира geektimes.ru/post/255350
Пользоваться тиром дома быстро наскучило, поэтому, на радость коллегам, он был установлен на работе. Однако после непродолжительной эксплуатации был выявлен ряд недостатков:

  • «игрушечность» и непрактичность пистолета
  • необходимость кропотливой калибровки
  • пропуски выстрелов
  • перспективные искажения камеры и вследствие — значительные погрешности
  • система подсчета очков без округления


Все это было исправлено в новой версии.
Перво-наперво пистолет был заменен на увесистый и солидный — страйкбольный:
0e7f83167b45487ebdeb45b95607c1db.jpg

Был удален ствол и установлен лазер.
8c0b653048fc4ebdb78d9d31d72d64cf.jpg

Вместо arduino была собрана простая схема управления. Так как контакты в пистолете только на замыкание, пришлось изощряться:
2f5e7615a31e4466b5c463f3b83ee6e0.png

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

Мишени были добавлены маркеры для калибровки:

Изображение кликабельно
7918ece539bf45dbb9726d0887ac0634.png


Алгоритм поиска маркеров сделал простой, но достаточно надежный. Сначала выполняется поиск всех углов на изображении. Затем происходит поиск углов, у которых рядом четыре соседа и проверка, что линии, их соединяющие, образуют угол не менее 45 градусов. По найденным углам мишени однократно строится матрица преобразования из перспективного пространства в пространство абстрактной мишени.
04d6ef1a64684f6b82f4693e31c6c76c.jpg

30 кадров в секунду от USB камеры не устраивали, по этому камера была заменена на аппаратную. Заодно, малинка была заменена на Raspberry Pi 2. После этого получилось добиться частоты обновления порядка 80 кадров в секунду, что полностью решило проблему пропусков выстрелов. Так же улучшил алгоритм поиска пятна лазера. Теперь изображение предварительно размывается для усреднения и используется для компенсации разницы яркостей в пределах кадра. Это позволило тиру работать при любом освещении.
0112108b4cdd483e8804bc8fb368e2ae.jpg

Так же программа была переписана с питона на C++. Для ее сборки на малинке требуется собранный OpenCV. Исходники здесь github.com/DIMOSUS/Laser-shoting-2.0
Теперь тир вновь радует коллег. Мой персональный рекорд 92 из 100 с 10 метров.
9dd0d4ccbce54ffa9b099edecf7b5ad6.jpg

© Geektimes