Домашний тир на Raspberry

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



    Идеи, как это можно реализовать, витали в голове давно. Вот несколько забракованных:
    — пистолет с фототранзистором + экран монитора. Подсвечивая половину/четверть/одну восьмую/и т.д. экрана, проверяем ответ от фототранзистора и итеративно уточняем часть экрана, в которую направлен пистолет. Идею забраковал из-за низкой частоты обновления мониторов и их инерционности.
    — пистолет с фототранзистором + экран из светодиодных матриц. Уже лучше, можно обновлять изображение на диодной матрице с достаточной частотой. Даже начал спаивать диодные матрицы, но вовремя одумался.
    — пистолет с камерой, несколько лазерных светодиодов, образующих метки на стене, по которым камера определяет свое положение. В принципе идея была не плоха. Однако прикинув, как будет смотреться пистолет с прикрученной к нему вебкамерой, так же от нее отказался.
    Ну и финальная идея — статическая камера, смотрящая на стену и пистолет с лазером. Идея есть, дело за реализацией.
    Купил первый попавшийся детский пистолет(Desert Eagle калибра 50). Выкинул внутренности, обработал напильником и установил в него лазерный диод, кнопку на спусковой крючок и ардуинину nano. Нет, можно конечно поставить туда в место ардуинины конденсатор, так что бы он кнопкой переключался с источника питания на диод и обратно, но это не достаточно гибкий подход. Лазерный диод приклеил на холодную сварку. Пока она застывала, аккуратно корректировал включенный диод, совмещая с прицельной планкой.
    Скрытый текст
    Скрытый текст

    Написал простейший скетч:
    Скрытый текст
    void setup() {
        pinMode(3, OUTPUT);//LED
        pinMode(2, INPUT);//Button to ground
        digitalWrite(2, true);
    }
    
    int t = 10000;
    bool PreButton = false;
    
    void loop() {
        bool Button = !digitalRead(2);
        if (PreButton == false && Button == true && t > 500) t = 0;
        if (t<5) digitalWrite(3, true);
        else digitalWrite(3, false);
        if (t<10000) t++;
        PreButton = Button;
        delay(1);
    }

    Пистолет «стреляет» короткими импульсами по 4мс (подобрал в процессе настройки) с максимальной скорострельностью 2 выстрела в секунду.
    Далее дело за приемной стороной. Купил простейшую вебкамеру. Малинка уже была в закромах. Подключил камеру, направил на стену.
    Скрытый текст

    Далее нужно поставить на малинку необходимые пакеты
    sudo apt-get install libv4l-0 libopencv-dev python-opencv

    Осталось написать питоновский скрипт. Это был мой первый скрипт на питоне, по этому пришлось убить на него почти день.
    Скрытый текст
    #!/usr/bin/python
    
    import sys
    import cv2
    import math
    import subprocess
    
    if __name__ == '__main__':
    
        #target in camera
        CenterX = 426.5
        CenterY = 190.5
        Radius = 40.0
    
        width = 800
        height = 640
        capture = cv2.VideoCapture(0)
        capture.set(3, width);
        capture.set(4, height);
        
        image = cv2.imread("target.jpg", cv2.CV_LOAD_IMAGE_COLOR)
        target_x = float(image.shape[0])*0.5
        target_y = float(image.shape[1])*0.5
        target_Radius = min(target_x,target_y)
        
        target = image.copy()
        cv2.namedWindow("Result", 1)
        cv2.imshow("Result", target)
    
        ShotCount = int();
        Scoore = 0;
        
        while 1:
            if cv2.waitKey(1) >= 0:
                break
            ret,frame = capture.read()
            grey_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            
            ret,grey_image = cv2.threshold(grey_image, 245, 255, cv2.THRESH_BINARY)
            
    #        grey_image = cv2.erode(grey_image, None, iterations = 1)
    #        grey_image = cv2.dilate(grey_image, None, iterations = 1)
    
            (contour, _) = cv2.findContours(grey_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
            
            if contour:
                subprocess.Popen('aplay Shot.wav', shell = True)
                cntr = sorted(contour, key = cv2.contourArea, reverse = True)[0]
                (x,y), radius = cv2.minEnclosingCircle(cntr)
                center = (x, y)
                shot_x = (float(x) - CenterX)/Radius
                shot_y = (float(y) - CenterY)/Radius
                dist = math.sqrt(shot_x*shot_x+shot_y*shot_y)
                shot_x = target_x + shot_x*target_Radius
                shot_y = target_y + shot_y*target_Radius
                Shot = (int(shot_x), int(shot_y))
                cv2.circle(target, Shot, 5, (60,60,255),10)
                cv2.circle(target, Shot, 10, (120,120,120),1)
                cv2.imshow("Result", target)
                #calibrate
                #print (center, dist)
                print ("Shots", ShotCount+1)
                if dist < 1.0:
                    Scoore += 1 - dist
                ShotCount += 1
                if ShotCount > 6:
                    ShotCount = 0;
                    Scoore = Scoore/7.0*100.0
                    print("You Scoore: ", Scoore)
                    Scoore = 0
                    target = image.copy()
                    cv2.waitKey(300)
                    subprocess.Popen('aplay 924.wav', shell = True)
                    cv2.waitKey(1000)
                cv2.waitKey(50)
    
        cv2.destroyAllWindows()

    Немного пояснений. Скрипт делает снимки с камеры и преобразует их в черно-белые. Далее отсекает все что темнее 245. Как показала практика пятно лазерного диода детектируется очень уверенно даже при длине импульса всего пару миллисекунд. Далее находим контур пятна и минимальную окружность, его описывающую. Рисуем попадания на мишени, проигрываем звук. После семи «выстрелов» подсчитываем очки (коих можно набить максимум 100).
    Перед стрельбой нужно откалибровать положение мишени в камере.
    Кстати «мишень»:
    Скрытый текст

    У меня камера стоит в трех метрах от мишени. Раскомментируем строку #print (center, dist), стреляем, пока не попадем точно в центр. Смотрим в логе позицию попадания и прописываем в начало скрипта (CenterX, CenterY). Так же там правим Radius под свой размер мишени.
    Разрешающая способность камеры с трех метров порядка двух миллиметров. Если этого покажется мало, можно просто придвинуть камеру.
    Все, впадаем в детство приступаем к занятиям по огневой подготовке.

    Процесс выглядит так (сори за обшарпанные обои — живу на съемной квартире):



    Исходники к проекту: github.com/DIMOSUS/Laser-shoting

    Не забываем про безопасность — на лазер, как и в телескоп на солнце, можно посмотреть только два раза…
    В будущем хотелось бы установить в пистолет сервомашинку, которая будет дергать груз для симуляции отдачи. Ну и распечатать нормальную мишень.
    Поделиться публикацией
    Похожие публикации
    Никаких подозрительных скриптов, только релевантные баннеры. Не релевантные? Пиши на: adv@tmtm.ru с темой «Полундра»

    Зачем оно вам?
    Реклама
    Комментарии 66
    • +5
      Шикарная идея)

      У меня общий вопрос:
      Вырастает ли скилл стрельбы из реального пистолета при стрельбе из «лазерного»? :) Ведь отдачи нет, вес другой, и пр…
      • +2
        С уверенностью могу сказать, что обратное верно. В любом случае вес можно подогнать, да и вес рук никуда не делся.

        Никогда не забуду как на сборах наш лейтенант лазерный пистолет держал, было ощущение, что он сейчас действительно пальнёт %)
        • +3
          Хм… Лазертаг своими руками? DIY
        • +4
          Стрельба — это целый спектр скилов.
          При стрельбе из лазерного вырастает только один, но достаточно важный — скорость прицеливания.
          • +1
            Ещё правильная работа со спуском. Обычно если спешить, то при нажатии на спусковой крючок мушка уходит влево-вниз (у левшей вправо-вниз). Лазер это покажет.
          • +3
            В данном случае вырастить скилл стрельбы из реального пистолета поможет только доработка механики спуска до ощущений реального прототипа.
            Спуск на разных пистолетах очень разный, как усилие, так и характер хода.

            Поэтому если сможете воспроизвести усилие спуска 1.5-2 кг (как на боевых образцах) и эффект срыва курка с шептала, то с большой вероятностью сможете метко стрелять и из боевого.

            Кстати, теоретически, немного доработав данный прототип, можно получить что-то вроде этого:
            http://www.scatt.ru
            Правда, сей тренажер (по ссылке) будет больше полезен спортсменам-стрелкам, нежели любителям развлекательной стрельбы.

            Автору на заметку ;)
            • 0
              Предлагаю лазерный лук, как у Китнис Эвердин (Голодные игры — 2). На тренировке, кажется.
          • +3
            Мне кажется сервомашинка для симуляции отдачи будет малоэффективна, может быть лучше попробовать соленоид?
            • +1
              Думал над эти, но у соленоида КПД не велик — для компенсации нужна солидная катушка и мощный источник питания.
              • +2
                Возвращаемся к конденсатору… там ведь импульс надо выдать только, что-то вроде ионистора зарядить и дергать катушкой 9-грамовую металлическую болванку.
                Правда, это уже какой-то рельсотрон получается. Думаю, достичь значений реальной отдачи всеравно не получится.
                • 0
                  Очень хороший вариант с конденсатором/ионистром. До реальной отдачи будет далеко, но уже ближе. Я сразу вспомнил о гаусс пушке.
                • +1
                  Как вариант можно добавить вибро порядочного размера, наподобие такого:
                  image
                  С реальными условиями понятно, что не сравнится, но уже какой-никакой, но «фидбэк».
                  • 0
                    Тоже вариант.
                    Но я вот дальше думаю — а что если к рычагу сервомашинки прицепить груз и пружину, которую серво будет натягивать? По выстрелу серво резко дает обратный ход и пружина ему помогает быстро толкнуть груз. После чего серво опять взводится.
                    • 0
                      Резко обратный ход, имхо, серва не сможет даже с пружиной, хотя всё же стоит попробовать.
                      • +2
                        По аналогии с гирбоксом из AEG. Шестеренка на серве имеет пропуск в зубьях и планка с грузом соскакивает и имитирует отдачу.
                        image
                        Можно сделать тоже самое но просто с грузом и рейкой на пружинке и моторчиком (и без пневмоцилиндра и прочего барахла). Понятно что это еретичная механика, но при наличии раздолбанного гирбокса под рукой — вполне можно сделать.
                        • 0
                          • +3
                            А вот с ним переделки уже лишнее. Горохом в коробку в разы веселее пулять чем лазером в мишеньку. :-)
                            Да и не хочу огорчать, но в пистолетах аег поршневая группа частенько в рукояти размещена вертикально. Собственно поэтому я предлагал скорее вариант взять рейку и шестеренку из старого привода у знакомого страйкболиста. Они себе cyma'ы раз в год меняют — вот вам и запчасти были бы.
                            Лучше вот этот раздел посмотрите:http://shop.strike.by/ВНУТРЕННИЙ%20ТЮНИНГ%20И%20ЗАП.%20ЧАСТИ%20ДЛЯ%20РЕМОНТА
                          • 0
                            Давно уже сделал, но что-то забыл показать. Сначала был с отдачей, потом отключил (в офисе звук раздражает окружающих):
                  • 0
                    Мешается закон сохранения импульса. Чтоб была отдача как у настоящего пистолета, надо что-то вперёд посылать с тем же импульсом, как у настоящей пули. Гонять вес туда-сюда недостаточно.
                  • 0
                    А я просто стреляю из страйкбольного пистолета по большой коробке из гофрокартона :)
                    • 0
                      Звук может быть достаточно громкий, особенно в небольшой квартире. Я стрелял из пневматики KWC которая с повторением механики сбора-расбора и передёргиванием затвора, звук при этом в моём коридоре был несколько неприятен.

                      З.Ы. Второй проблемой было то что недооценил силу 4.5 мм медных шариков — штукатурку помял (недостаточная толщина и твёрдость мишени).
                      • +1
                        Подождите, какие медные шарики — это же страйкбол. Но звук да, это есть, впрочем поскольку пострелять хочется лишь иногда, это можно пережить, даже приятный он я бы сказал, можно и музыку включить :) Главное, в очках стрелять — рикошеты бывают неприятные. И животыне домашние пугаются )
                        • 0
                          У меня был не совсем страйкбольный. такой.
                          У меня больше жена пугалась чем животные)
                    • НЛО прилетело и опубликовало эту надпись здесь
                      • +1
                        Не совсем, по нажатию курка — короткий импульс на 4мс.
                        Про магазин — хотел подключить пистолет к ардуинине и наладить полноценную стрельбу, но отложил на вторую итерацию. Хочу еще проектор к этому прикрутить — получится Dendy со стрельбой по уткам :)
                        • НЛО прилетело и опубликовало эту надпись здесь
                          • 0
                            Там есть проверка — счетчик сбросится только если предыдущее состояние кнопки «отпущено», текущее «нажато» и таймер отсчитал 500 мс посое предыдущего выстрела. То есть это гарантирует что сброс произойдет только в момент нажатия и только если прошло полсекунды после прошлого выстрела. По другому условию лазер горит только если таймер меньше 5.
                            • +3
                              Господа, так как тема про стрельбу, просто не могу не указать на то, что курок — это совершенно другая часть пистолета. Нажимая на курок вы не производите выстрел, вы просто взводите пистолет.
                              То, на что вы нажимаете — это спусковой крючок, либо «спуск», либо «гашетка», но никак не курок :)
                        • +3
                          Не знаю достоверно о вашем практическом опыте стрельбы из пистолета, поэтому побуду кэпом, и добавлю, что на точный выстрела влияют, помимо прочего, такие факторы как:

                          — вспышка от выстрела
                          — шум от выстрела
                          — сложная отдача
                          (+ специфика воздействия всех этих трёх факторов одновременно на стрелка)
                          — вес оружия
                          — дистанция до мишени (из-за глубины зрения человека/фокусировки: стрелять по маленькому кружочку в 3-х метрах — не то же самое, что стрелять по большому кружочку на 20 метров)
                          — резкость спуска (и вся сопутствующая механика)
                          — всякие менее значимые вещи вроде уменьшения веса оружия (и подброса при отдаче) из-за изменения количества патронов в магазине во время стрельбы, и т.п.

                          Собственно, цель коммента — показать, что домашний тир некоторые вещи поможет потренировать, но далеко не все, а частично может и навредить (впечатав в моторику неверные привычки)
                          • +4
                            Больше склоняюсь к «навредить». Неверно сформированные привычки стрельбы- адский труд переучивания в будущем.
                            Занимался стрельбой из МЦ до 14-ти лет. До сих пор стреляю хорошо — спасибо тренеру
                            • +1
                              А если перепилить, скажем, ежика под лазерную стрельбу? Огромная тяжеленная дура, пневмоотдача(сложнее некуда)?
                          • 0
                            С Вашего позволения я тоже побуду кэпом и не соглашусь с пунктами «вспышка от выстрела», «шум от выстрела», «сложная отдача».

                            Вылет пули из ствола происходит задолго до отката затвора, при этом «шум от выстрела» и «сложная отдача» если и влияют на что-то, то только на следующий выстрел, и то при том, что Вы стреляете на скорость (дисциплина практической стрельбы), а не на точность.

                            В нормальных условиях в тире Вы всегда стреляете в наушниках, а вспышка от выстрела должна Вами просто игнорироваться как паразитный эффект, т.к. при стрельбе на точность Вы работаете только с прицеливанием и обработкой спуска.
                            Всё остальное волновать стрелка ну никак не должно.
                            • +2
                              Тут вопрос в конечной цели.
                              Спортивная стрельба — это один набор условий.
                              Практическая стрельба(не в смысле спортивной дисциплины, а в прямом значении) — другой набор.

                              Например, довелось отрабатывать упражнения в паре, когда вспышка, звук и летящая гильза напарника становились реально стрессовым фактором.
                              • 0
                                Я полностью с Вами согласен. Когда говорил про зук-вспышку-отдачу, я имел в виду что это влияет именно на последующие выстрелы. Грубо говоря, в момент спуска человек может начать зажмуриваться заранее, или «кивать» стволом вперед, или ещё что делать.
                                У меня так было на первых выстрелах из ружья — из-за неправильной вкладки оно меня сначала неплохо отдубасило в плечо, в результате чего в другой раз, на записи видио заметил, как на «холостом» последнем выстреле я всем корпусом дернулся вперед. Сейчас-то могу отстрелять ящик спортинга без каких-либо проблем, но надо было корректироваться.

                                ЗЫ: инструкторы по стрельбе иногда делают так специально: дают ученику снаряженный магазин, а какой-нибудь патрон вкладывают холостой. И потом смотрят, дергается ли рука/корпус человека в момент выстрела, или нет. Помогает вовремя ту самую ошибку заметить.
                              • +1
                                шум от собственного выстрела это лишнее, а вот шум от стреляющих рядом — этот да, сбивает.
                                Собственный шум появляется уже после того как пуля вышла со ствола поэтому никакая реакция на шум уже не влияет на полет пули, а вот соседний и не вовремя может повлиять.

                                Да, в лазерном пистолете соответственно не учитывается баллистика. ни одна пуля не летит прямо…
                            • 0
                              Отличная реализация. Единственное, что хотелось бы предложить — это играть звук выстрела средствами Ардруино. Латенси между нажатием курка и звуком меньше, плюс «реалистичность» больше. Ну и пистолет утяжелить свинцом. Как вариант — раздербанить старый, расхлябаный, и по этому дешевый, китайский пневмат. Полный массо-габаритный макет + лазер = реалистичные ощущения [шутка про резиновую женщину].

                              И еще, придумать бы крепление лазера с регулировкой. Холодная сварка то оно хорошо, но очень точную настройку лучше вести при помощи какого -нибудь болтика отверткой, так, чтобы до десятой доли градуса. Думаю, это не сложно. В этом случае, практиковаться в стрельбе можно будет и на больших расстояниях, например, в настоящем тире.
                              • +21
                                image
                                • 0
                                  Помните, как он постоянно смеялся, когда мы промазывали? Так и хочется сказать автору статьи: «Давай, отомсти за нас всех этому псу!»
                                  • +3
                                    Я даже слышу этот смех в своей голове.
                                  • 0
                                    Можно добавить в программу:
                                    — выбор любой картинки мишени;
                                    — ветер, дующий с выбранной стороны с постоянной скоростью, чтобы оценить отклонение «пули»;
                                    — различные виды/калибры оружия (для варианта с ветром).
                                    • 0
                                      Да, во временя ЭЛТ — мониторов (пистолет от Денди) было проще.
                                      Развёртка была хардварной + светодиод в пистолете.
                                      • 0
                                        Светодиод?
                                        • +1
                                          Сорри, конечно, фотодиод, или фототранзистор. Не знаю, что там конкретно было.
                                          • 0
                                            Или фоторезистор, да. Что характерно, с экрана не передавался никакой сигнал (по крайней мере в Duck Hunt) и можно было просто «стрелять» в люстру для успешных попаданий.
                                            • 0
                                              На сколько я помню, с экрана передавался сигнал — белый квадратик во время нажатия спускового крючка. Если свет от него пойман, то ты попал. Потому-то в люстру и можно было стрелять.
                                    • +1
                                      Подобные системы давно используются в реальной подготовке правоохранителей: www.lasertools.ru (не сочтите за рекламу).
                                      • +1
                                        Не знал. Ну в любом случае свой велосипед ближе к телу)
                                        • +1
                                          Если вдруг будут лишние деньги — посмотрите в сторону системы СКАТТ. Ну или на них можно посмотреть, чтобы свой клон сделать. :)
                                          Там самая главная фишка — это контроль не только попадания, но и самого процесса выстрела. В итоге можно увидеть как оружие болталось в руках в момент спуска.
                                        • +2
                                          Силовики предпочитают работать с огнестрельным оружием все-таки. Лазер это баловство в основном. Максимум для чего используются лазер — это контроль спуска. А конкретно упражнения выполняются с огнестрельным оружием и «сенсорным» экраном, которые умеет обрабатывать попадание пули. Естественно стреляют не бронебойными, а обычными с малой навеской пороха.
                                        • 0
                                          Я не понял: монитор используется («рисуем попадания на мишени») или нет?
                                          Если используется, то к чему все эти сложности? Ведь можно реализовать аналогично пистолетам от всяких «денди», гоняя по экрану стробы синхронизации (на 60 кадров в секунду ничего глазу заметно не будет).
                                          А если не используется, то можно воткнуть в программу «распознавалку мишени»: она будет искать концентрические круги и вычислять масштаб.

                                          P.S. Для эмуляции отдачи проще всего будет воткнуть внутрь подпружиненный свинцовый штырь, который между выстрелами будет подтягиваться актуатором, а в момент выстрела механически разблокируете трещотку и пружина отбивает груз, что вполне будет подобно реальной отдаче (только значительно слабей).
                                          • 0
                                            Во-первых, хочется покапитанить — arduino.cc/en/Tutorial/Debounce

                                            Во-вторых, раз внутри нашлось место для Наны, положите туда ещё двухдолларовый гироскоп, типа HMC5883L — и фиксируйте, насколько ровно и надёжно вы держите руку непосредственно перед выстрелом.
                                            • +1
                                              Отличный пост!
                                              Гуглим «наставления по стрелковому оружию» — там много полезного про технику стрельбы.
                                              Лазерный стенд тренирует самый главный скилл — умение прицеливаться.
                                              Нужно сделать небольшую доработку — «стреляние» менее мощным импульсом раз 10 в секунду, чтобы стенд мог регистрировать движение ствола при прицеливании. Самый правильный способ прицеливания из любого оружия — рисование горизонтальной восьмерки под центром мишени. Чем меньше и «площе» восьмерка, тем круче стрелок.
                                              Кому интересно — можно сочетать стрельбу и физические нагрузки — 10 выстрелов, 10 отжиманий, 10 выстрелов, 10 приседаний.

                                              • 0
                                                Техника стрельбы, описанная в наставлениях по стрелковому оружию, на данный момент заметно устарела. Нонче гораздо более полезный ресурс — тытрубка, поиск по именам Jerry Miculek, Bob Vogel, Rob Leatham.
                                              • +1
                                                Даже airsoft blowback считаю полезнее, ибо с ним можно поучаствовать в простейших соревнованиях по правилам IPSC (и даже IDPA). Но сама идея что-нибудь спаять/запрограммировать + популяризация стрелкового спорта — это похвально.
                                                • 0
                                                  Это был мой первый скрипт на питоне, по этому пришлось убить на него почти день.
                                                  Для Raspbery есть много языков. Даже бесплатная Wolfram Mathematica с большой библиотекой и доступом к железу :-). Неужели не удалось под себя подобрать?
                                                  • 0
                                                    Если нет желания изобретать велосипед, то есть SiRT и Shoot-Off.
                                                    • 0
                                                      Проект реально хороший.
                                                      Если можно будет ставить на спортивное оружие то будет вообще гуд.

                                                      Установка примерно такая:
                                                      1. в дуло вставляется лазер
                                                      2. момент выстрела определяется по щелчку (так сделано в готовых системах) или по микрику
                                                      • 0
                                                        Мои 5 копеек для автора: если есть желание и у пистолета подвижный затвор, то сделать обновление мишени при его передергивании.

                                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.