Статья о дальнейшем улучшении прошлой версии тира 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)


  1. schroeder
    05.03.2016 14:28

    Как вы получаете картинку из родной расберевской камеры и преобразуете ее в Mat из opencv?


    1. DIMOSUS
      05.03.2016 14:35

      Камера подхватывается OpenCV как обычная. Соответственно ни чего придумывать не пришлось:

      VideoCapture cap(0);
      if(!cap.isOpened())
      {
              cout << "Camera Error" << endl;
          return;
      }
      Mat frame;
      cap >> frame;


      1. schroeder
        05.03.2016 14:41

        интересно. Полгода назад пробовал так же, ничего не получалось. Правда я использовал Java API, но разницы быть не должно.


        1. DIMOSUS
          05.03.2016 14:52

          Возможно от версии зависит? Я не стал использовать третью, взял 2.4.12


  1. V_N_P
    05.03.2016 14:37

    Прикрутить бы это пистолет вот к этой игре
    .

    MOORHUHN…

    image
    .
    Интересно если координаты лазера передавать по интерфейсу PS2 как положение указателя мышки, возможно такое сделать?


    1. DIMOSUS
      05.03.2016 14:38

      Есть большая проблема — пятно лазера почти не видно на мониторе или телевизоре.


      1. ktod
        05.03.2016 15:28

        А если перед камерой поставить фильтр на длину волны лазера? Конечно, в результате появляются еще проблемы, но все решаемо.


        1. DIMOSUS
          05.03.2016 15:29

          Тогда уж фильтры с круговой поляризацию для камеры и лазера :)


          1. ktod
            05.03.2016 16:16

            А как же oled, плазма и пр? Там то поляризатора нет.


            1. dkv
              06.03.2016 04:43

              Проектор и экран?


              1. DIMOSUS
                06.03.2016 11:04

                Вот это наиболее реалистично. Пятно лазера будет хорошо видно.


                1. dkv
                  06.03.2016 11:21

                  Хотел ответить, что автор ниже уже отписался по поводу экрана, но… ))) Тогда спрошу иное: Не заметил в статье упоминания разрешения, при котором обеспечивается такая скорость захвата. Насколько в данный момент загружен процессор при обработке 80 fps? Как на Raspberry Pi2 обстоит дело с аппаратным ускорением OpenCV? Помнится, CUDA на Nexus 2012 делала своё дело, хотя это ничуть не спасало ситуацию и выше 20 fps я там ни на одном из сэмплов от NVIDIA не увидел. Сам пока жду отправки и приезда ко мне широкоугольной (G) камеры. Придётся в её случай ещё и геометрию править прежде чем отдавать картинку на дальнейший анализ.


                  1. DIMOSUS
                    06.03.2016 11:47

                    Камера снимает 320х240, при этом на 100% загружается одно ядро. Можно распаралелить обработку на все четыре ядра, но такой необходимости не возникло. В текущем режиме тир работает не выключаясь — маленького радиатора хватает что бы держать температуру на уровне 50'C.
                    Этот нексус работает на Tegra?


                    1. dkv
                      06.03.2016 12:37

                      Да, речь о планшете Nexus 7 2012. Там Tegra. Особо не экспериментировал, но для себя сделал выводы, что про OpenCV в рилтайм на андроиде можно забыть. Вот думу думаю как детектировать скважность и частоту мигания светодиода определенного цвета, беря в расчёт, что такой диод в кадре только один, но само изображение — далеко не белый лист бумаги. При этом бы ещё и обойтись без OpenCV, чтобы не тащить это наследие за собой.


    1. k0ldbl00d
      05.03.2016 23:39

      Для устройств типа "мышь" передаётся не абсолютное положение указателя, а dX и dY. Но можно попробовать вариант USB-HID устройства с абсолютным позиционированием. USB не такое сложное каким может показаться.


  1. schroeder
    05.03.2016 14:51

    OpenCV компилировали сами или нашли где то уже готовое?


    1. DIMOSUS
      05.03.2016 14:54

      Собирал сам, пользовался данной инструкцией http://robertcastle.com/2014/02/installing-opencv-on-a-raspberry-pi/
      На удивление собралось без проблем.


      1. schroeder
        05.03.2016 14:58

        да, я так же собирал. Какая у вас версия OpenCV?


        1. DIMOSUS
          05.03.2016 15:00

          2.4.12, не рискнул связываться с третьей.


  1. Big-Boss
    05.03.2016 14:53
    +1

    А зачем лазер?
    Не проще поставить в пистолет камеру с объективом на десятки миллиметров и в момент "выстрела" захватывать кадр и смотреть, что оказалось по центру изображения захваченного камерой? Причем камере в принципе все равно, рисованное изображение захватывать или картинку с монитора.

    На мой взгляд нормальную отдачу получится реализовать только используя усилия нажатия на спусковой крючок. В процессе нажатия пружина с грузом взводится, а достигая момента стрельбы груз освобождается и ударяя в стопор инициирует выстрел. При стандартном для обычного пистолета усилии 1-2 кг. можно взводить существенный по весу груз.


    1. DIMOSUS
      05.03.2016 14:58

      Так работают профессиональные тиры. Но в моем случае это неоправданное усложнение конструкции.
      Ну а отдача для "отвлечься от работы в офисе" оказалась не нужна.


      1. Big-Boss
        05.03.2016 15:09

        А в чем усложнение? Вы же все равно используете камеру?
        В вашем случае обрабатывается картинка с лазерной точкой, но думаю тот же алгоритм прекрасно обработает картинку с камеры пистолета с искусственно нарисованной где надо точкой.
        Проблему вижу только в габаритах камеры. От телефона камеры маленькие, но как прикрутить к Raspberry с неродным объективом, даже не представляю.


        1. DIMOSUS
          05.03.2016 15:15
          +1

          Усложнение в том, что на пистолет нужно повесить камеру и Raspberry, плюс батарею для питания. Иначе придется пожертвовать мобильностью. К тому же с десяти метров погрешность обычной камеры будет огромна.


          1. Big-Boss
            05.03.2016 15:19

            Это да, пистолет будет на проводе.
            Никогда не использовали камеры 22мм. И больше?
            С объективом 100-200 мм. можно будет и на сто метров стрелять.


            1. DIMOSUS
              05.03.2016 15:24
              +1

              И как все это будет выглядеть на пистолете? :) Да и шанс повредить или сбить центровку очень высок.
              Фокусное расстояние фиксировано, соответственно будет работать под какую-то оптимальную дистанцию. То что работает на 100 метров не будет работать с 10-ти. Добавить новый ствол для стрельбы тоже проблематично. У лазера таких проблем нет.
              В общем считаю, что лазер куда практичнее и удобнее.


              1. BOOTor
                05.03.2016 16:39
                +1

                Снайперку собирайте ;)


      1. AllexIn
        05.03.2016 16:52
        +1

        А можно пример такого профессионального тира?
        Просто я сам 6 лет проработал в конторе делающей профессиональные тиры…
        И огнестрелы делали, и пневматику и мягую и жесткую, лазер делали… Об использовании камеры в пистолете даже речи никогда не было…
        Это вообще не моя область. Я программист. Поэтому интересуюсь не с точки зрения: вот мы так не делали, значит вы не правы. А именно с точки зрения: посмотреть на примеры и попробовать разобраться, а почему наши то так не делали...


        1. DIMOSUS
          05.03.2016 16:58

          1. AllexIn
            05.03.2016 16:59

            Странно. Я всегда думал что у них ИК лазер.


            1. DIMOSUS
              05.03.2016 17:03

              Он у них называется "оптический сенсор". В аксессуарах для него есть диафрагма, для стрельбы в солнечную погоду. Не думаю что лазеру это может понадобится. Хотя конечно могу ошибаться.


  1. Big-Boss
    05.03.2016 15:35

    Сразу гуглятся такие http://www.0kopeek.ru/Shpionskie-gadzhety#Mikrokamery
    но наверное не подойдут. Как их прикручивать к стороннему оборудования даже не знаю.
    Размер достаточно мал, но и с объективом придется колхозить.

    У вас диапазон работы примерно 10 метров. Если настроить фокус на 10 метров, то приемлемо будет работать в диапазоне 8-12 метров.


    1. DIMOSUS
      05.03.2016 15:40

      Ну это уже если понадобится сделать профессиональное решение. А моего для офиса хватает с избытком и усложнять смысла пока нет.


  1. pbw
    05.03.2016 23:03

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

    Проект «HomeLess bullet free shooting».
    Мишени на экранах, конструктивы оружия. Исходники на гитхабе.

    Проект «shootoff». Примерно то же самое. Исходники на гитхабе.

    Проект «Shooting-Range».
    Проект заброшен, второй версии так и не появилось. О начале проекта можно
    прочитать тут (с 6-ой страницы и далее). Исходников нет.
    Саму прогу брать здесь. Там же есть видео работы.
    Установка, опыт использования: здесь.

    Несколько попыток создать рабочий лазерный тир: здесь.


    1. 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/


      1. DIMOSUS
        05.03.2016 23:51

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


        1. auct
          06.03.2016 12:56

          Проектор работает без проблем.
          Для использования ТВ, на его экран можно повесить полупрозрачную матовую пленку. Лазерную точку будет видно. Яркость и контрастность ТВ-картинки еще надо задавить.


  1. auct
    06.03.2016 13:15

    По поводу лазерного импульса. По схеме DIMOSUS-а лазер "пыхает" от конденсатора, и сильную яркость он дает на очень маленькое время. Поэтому вам нужно поднимать частоту кадров на камере.
    В "профессиональных" (коммерческих) лазерных стволах время задается микросемами жестко от 50 до 100мс. Это позволяет засекать точку камерой даже на 15кадрах/сек.


    1. DIMOSUS
      06.03.2016 13:19

      С длинным импульсом появляется проблема шлейфов в место точек, когда ствол ведет в руках.


      1. pbw
        06.03.2016 17:52

        Поэтому системы с ИК-излучателями на мишени, и камерой на оружии,
        отслеживают непрерывный трек точки попадания. Выстрел — это обрыв
        трека, дальнейшие перемещения игнорируются.
        ИК-лазер на пистолеты не ставят, так как вес, фокусировка, питание, прочее.

        Может быть, для снижения частоты кадров камеры подойдет следующая идея:
        Выстрел — это пачка коротких импульсов, общей длительностью 50...100мс.
        Начальные несколько импульсов "остаются" в первом кадре, остальные — в
        следующих кадрах. Начальные импульсы расцениваются как выстрел.
        Так как тир не для спорта, а развлекательный, то точности достаточно для
        фиксации результата.
        Чтобы не было паразитных (кольцевых) засветок вокруг точки, перед лазером
        поставить поляризационный фильтр, вырезанный из старых очков с полароидом.
        Яркость точки ощутимо уменьшится, поэтому мощность лазера придется увеличить.
        Для этой идеи как раз кстати предыдущая реализация автора: пистолет с ардуиной
        нано + ключевой транзистор для лазера.

        Конденсаторная схема очень быстро съедает батарейку. Это не имеет значения,
        если в оружии установлен аккумулятор. Но делают излучатели и на 3-х
        вольтовых литиевых батареях, батарейки надо покупать.
        Для батарейного питания ставят простейшую схему на 3-х вольтовом
        КМОП-таймере NE555. Нет дребезга контактов, кнопку можно ставить на замыкание/размыкание, длительность импульса регулируется.


        1. DIMOSUS
          06.03.2016 18:04

          Не понимаю — зачем снижать частоту камеры, если аппаратная часть реализации без проблем обеспечивает 80 кадров в секунду? С такой частотой у меня без сбоев регистрируются импульсы порядка 5мс.
          Дребезг контактов иногда случается, но совершенно не мешает — так как после детектирования выстрела идет 500мс игнорирования импульсов.
          А круги засветки легко отфильтровываются программно, так как значительно тусклее основного пятна.


          1. pbw
            06.03.2016 18:15

            Вы разработчик, вы делаете так, как вам удобнее. Я ничего не советую, лишь
            предполагаю, что могло бы пригодиться в далеком будущем. Вдруг у вас
            появится желание снова вернуться к обычной веб-камере. Или, к примеру,
            заменить малинку телефоном с камерой:)


  1. Pafnutyi
    06.03.2016 18:07

    Как бы переделать эту штуку для нескольких мишеней? Тренировка быстрого переноса сектора стрельбы и тд.
    Нашёл вот такую поделку, автор не отвечает на почту, может кто видел подобные системы