ラズベリーのホーム射撃場

こんにちはHabr。

私は小火器と射撃が大好きです。 しかし、自宅ではこれは悪い趣味です。 いいえ、もちろん、あなたはトラウマを買ってアパートをなぞることができますが、私は家がそれを感謝しないと思います。 これに我慢したくなかったので、私は自分自身の中程度に安全なホームシューティングレンジを実装することにしました。 興味があれば-猫へようこそ。







これを実現する方法についてのアイデアは、長い間私の頭の中にありました。 拒否されたものをいくつか次に示します。

-フォトトランジスター+モニター画面を備えた銃。 半分/四分の一/八分の一などの強調表示 画面で、フォトトランジスタからの応答を確認し、銃が向けられる画面の部分を繰り返し指定します。 モニターのリフレッシュレートが低く、慣性が強いため、このアイデアを拒否しました。

-フォトトランジスター付き銃+ LEDマトリックスのスクリーン。 ダイオードアレイの画像を十分な頻度で更新できます。 ダイオードアレイのはんだ付けも始めましたが、やがて気が変わりました。

-カメラ付きの銃、壁にマークを形成する複数のレーザーLEDにより、カメラがその位置を決定します。 原則として、アイデアは悪くありませんでした。 しかし、ウェブカメラをねじ込んだピストルがどのように見えるかを予測して、彼はそれも拒否しました。

さて、最後のアイデアは、壁とレーザー銃を見ている静的カメラです。 アイデアがあります、それは実装次第です。

私は最初の子銃(デザートイーグルキャリバー50)を買いました。 中身を捨て、ファイルで処理し、レーザーダイオード、トリガーボタン、ナノアルジニンをインストールしました。 いいえ、もちろん、アルドゥイニンの代わりにコンデンサを入れて、ボタンを電源からダイオードに切り替え、元に戻すこともできますが、これは柔軟なアプローチではありません。 レーザーダイオードは冷間溶接に接着されています。 凍結しながら、彼はダイオードを慎重に調整し、それを照準バーと組み合わせました。

非表示のテキスト




非表示のテキスト






最も簡単なスケッチを書いた:

非表示のテキスト
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ミリ秒の短いパルス(セットアップ中にピックアップ)で1秒あたり2ショットの最大速度で「発射」します。

次に、受信者次第です。 最も簡単なウェブカメラを購入しました。 Malinkaはすでにビンに入っていました。 カメラを接続し、壁に向けました。

非表示のテキスト






次に、必要なパッケージをラズベリーに入れる必要があります

 sudo apt-get install libv4l-0 libopencv-dev python-opencv
      
      





Pythonスクリプトを記述することは残っています。 これは私の最初のpythonスクリプトであったため、ほぼ1日間彼を殺さなければなりませんでした。

非表示のテキスト
 #!/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より暗いすべてのものを遮断します。実践が示しているように、レーザーダイオードのスポットは、わずか数ミリ秒のパルス長でも非常に自信を持って検出されます。 次に、スポットの輪郭と、それを表す最小円を見つけます。 ターゲットヒットを描画し、サウンドを再生します。 7回の「ショット」の後、ポイントをカウントします(最大100ポイントを獲得できます)。

撮影する前に、カメラ内のターゲットの位置を調整する必要があります。

ところで、「ターゲット」:

非表示のテキスト






私のカメラはターゲットから3メートルです。 行#print(center、dist)のコメントを外し、正確に中央に達するまで撃ちます。 ログのヒット位置を見て、スクリプトの先頭(CenterX、CenterY)に書き込みます。 そこでは、ターゲットサイズに合うように半径もルールします。

3メートルからのカメラの解像度は約2ミリメートルです。 これで十分でない場合は、カメラをスライドさせるだけで済みます。

それだけです、私たちは幼少期に入り、火災訓練の授業始めます。



プロセスは次のようになります(不規則な壁紙のゴミ-私は賃貸アパートに住んでいます):







プロジェクトのソース: github.com/DIMOSUS/Laser-shoting



安全性を忘れないでください-太陽の下で望遠鏡のようにレーザーを見ることができるのは2回だけです...

将来、銃にサーボを取り付けて、反動をシミュレートするために負荷を引きます。 さて、通常のターゲットを印刷します。



All Articles