Minokura Robot


自動照準エアガン

sentry gun

友人が画像処理をやっているのを見て、自分でも画像処理で何かやってみたくなりました。何か面白いものができないかなあと考えて思いついたのが目標を自動追尾するエアガンでした。


エアガン

G36C by Tokyo Marui Co., Ltd.

市販のエアガンを購入して使いました。東京マルイの電動ガンBOYSシリーズG36Cです。BOYSシリーズということで10歳以上のパワーの小さいものになっており、まあ18歳以上の本格的なやつよりは安全です。また大きさも一回り小さいですし重量も軽くなっているのでモータで動かすときに有利ということで選びました。


設計

airsoft gun rotated by two motors

4本足の土台があり、その上にラジアルのボールベアリングを置いています。重量物を安定に回転させるにはやはりベアリングが良いでしょう。こんなに大きなのが必要だったかは謎ですが(汗)。その上に回転台が載り、台の両側に支柱が立っています。エアガンを支える支柱はねじれを防ぐため厚いものが必要でした。金属だと加工が大変なため樹脂にしようとお店に行ったら、アクリルしか売ってなかったのでこうなりました。結果的に透明で銃の形が見えるのでよかったかなと思います。支柱に挟まれるようにエアガンが固定されていますが、固定部は簡単な構造にするためベアリングが入っていません。穴空けて軸通してるだけです。エアガンの上にカメラが固定されており、ターゲットを追いかけます。土台の下に横方向に回転させるためのモータが、支柱に縦方向に回転させるためのモータが固定されており、この2つで上下左右あらゆる方向に狙いを定める事ができます。


実際の動作



↓ここから先はおまけの解説です↓

モータの選定

水平方向の回転(方位角)と鉛直方向の回転(仰俯角)の回転に1つずつ、エアガンのトリガーを引くのに1つで合計3つのサーボモータを使用しています。

ここで方位角回転のサーボモータの選定方法について説明します。仰俯角回転についても回転軸がエアガンの重心を通っていればほぼ同様です。

さて目標を追いかけるには素早く動かなくてはなりません。今回は設計値として、止まっている状態から0.1秒で30°くらいは回って欲しいとします。まずエアガンの回転運動は次の式で計算できます。
eq1
ここでTはモータのトルク、Jはエアガン(実際は回転台や支柱も)の慣性モーメント、αは角加速度です。つまりモータのトルクTが大きいほど、加速度αが大きくなるのですばやく回転でき、目標にしっかり追従できることになります。慣性モーメントとは物の回転のしにくさを表し、質量が大きいほど、また直径が大きいほど慣性モーメントは大きくなります。

加速度がαのとき、0.1秒で到達する回転角度θは
eq2
です。これが30°になればいいですから
eq3
すなわち
eq4
となります(ラジアン単位で書いておきます)。

このαの値から必要なトルクTを計算するためにはエアガンの慣性モーメントJを求める必要があります。慣性モーメントを計測するのはなかなか難しいのですが、今回はこちらのページの「二点吊り法による慣性モーメントの測定」を参考にして測定しました。 こうして測定したエアガンの横回転方向の慣性モーメントは
J=0.012Kg m^2
でした。

したがってモータに必要なトルクTは
T=1.26N m
となります。単位換算すると12.9kg・cmとなります。 実際には回転の摩擦などもあるので余裕をとって、トルク:18kg・cm(@4.8V)の666N/2BBMGを選びました。


アルゴリズム

camera view

次にどうやって目標を追尾するかについて説明します。簡単に言えばUSBカメラで青い物を認識し、画像上で青い物が左に動けばエアガンも左に、上に動けばエアガンも上に動くようにプログラムしています。このようにすれば常にエアガンを目標に向けることができます。


画像処理

まず画像処理の部分です。画像処理のプログラムにはMicrosoft Visual C++ 2008 Express Edition とOpenCVという画像処理ライブラリを用いています。OpenCVを使うと簡単に画像処理のプログラムを作成することができます。今回の画像処理は次のような順序で処理を行っています。

image processing

はじめにUSBカメラで撮影した元の画像があります。手前に見えるBB弾ボトルの青いキャップをターゲットにします。

上の画像から色相や彩度などがある一定の範囲に収まる部分抽出して白に、それ以外を黒に分けます。これにより青い領域を抜き出すことができます。

青色を抽出した画像の背景には細かなノイズが見えます。また抜き出したい青い部分にも光の反射などでやはりノイズがあります。この画像に収縮と膨張という処理を施すと、細かいノイズを消すことができ、抜き出したいボトルのキャップ部分をより正確に抽出することができます。

最後に抽出した部分の重心を求めます。これによってターゲットの位置を計算することができます。ターゲットの位置がカメラの中心からずれていたら、その方向にモータを動かす命令を、モータをコントロールする電子回路基板に送ります。


コントロールボード

ロボット制御用にマイコン、モータドライバ、RS232インターフェースなどをまとめた汎用コントロールボードを製作しました。別のページ(←まだ書き中)にまとめる予定です。

制御方法

モータのコントロールには、いわゆるPID制御を用いています。PID制御とはカメラの中心位置とターゲットの位置との誤差を求め、その誤差そのもの、誤差の積分値、誤差の微分値の3つにそれぞれゲインをかけてフィードバックする制御方法です。直感的でチューニングしやすいため現在最も広く用いられている制御方法の一つです。ただしターゲットが動くのでほとんどI制御は入れていません。

PID controller
作品紹介に戻る