ロボット工学、人工知能、機械学習の分野は急速に進化しており、近い将来、人類のライフスタイルを変えることは間違いありません。ロボットは、センサーと機械学習処理を通じて現実の世界を理解し、相互作用すると考えられています。画像認識は、ロボットが私たちと同じようにカメラを通して現実の世界を見ることによって物体を理解すると考えられている一般的な方法の1つです。このプロジェクトでは、Raspberry Piの力を利用して、サッカーをするロボットと同じように、ボールを追跡して追跡できるロボットを構築しましょう。
OpenCVは、画像処理に使用される非常に有名なオープンソースツールですが、このチュートリアルでは、物事を単純にするために、ProcessingIDEを使用しています。ARMの処理では、処理用のGPIOライブラリもリリースされているため、RaspberryPiを使用するためにPythonと処理を切り替える必要はありません。かっこいいですね。それでは始めましょう。
必要なハードウェア:
- ラズベリーパイ
- リボンケーブル付きカメラモジュール
- ロボットシャーシ
- ホイール付きギアモーター
- L293Dモータードライバー
- パワーバンクまたはその他のポータブル電源
プログラミング要件:
- Raspberrypiのモニターまたはその他のディスプレイ
- Pi用のキーボードまたはマウス
- ARMソフトウェアの処理
注:プログラミング中は、カメラのビデオを表示できるのはディスプレイをワイヤーでPiに接続する必要があります。
Raspberry Piでの処理の設定:
前に述べたように、Pythonを使用するデフォルトの方法ではなく、処理環境を使用してRaspberryPiをプログラムします。したがって、以下の手順に従ってください。
ステップ1: -Raspberry Piをモニター、キーボード、マウスに接続し、電源を入れます。
ステップ2:- いくつかのものをダウンロードしようとしているので、Piがアクティブなインターネット接続に接続されていることを確認してください。
ステップ3: -Processing ARMをクリックして、RaspberryPi用の処理IDEをダウンロードします。ダウンロードはZIPファイルの形式になります。
ステップ4:-ダウンロードしたら、好みのディレクトリのZIPフォルダにあるファイルを抽出します。デスクトップに抽出しました。
ステップ5:-次に、抽出したフォルダーを開き、processingという名前のファイルをクリックします。以下のようなウィンドウが開きます。
ステップ6:-これは、コードを入力する環境です。Arduinoに精通している人にとっては、ショックを受けないでください。はい、IDEはArduinoに似ており、プログラムも同様です。
ステップ7:-ボールフォロープログラムを機能させるには、2つのライブラリが必要です。インストールするには、[スケッチ] -> [ライブラリのインポート] -> [ライブラリの追加]をクリックするだけです。次のダイアログボックスが開きます。
ステップ8:-左上のテキストボックスを使用してRaspberry Piを検索し、Enterキーを押すと、検索結果は次のようになります。
ステップ9:-「GLVideo」および「HardwareI / O」という名前のライブラリを検索し、[インストール]をクリックしてインストールします。必ず両方のライブラリをインストールしてください。
ステップ10:-インターネットに基づいて、インストールには数分かかります。完了すると、ソフトウェアを処理する準備が整います。
回路図:
このラズベリーパイボールトラッキングプロジェクトの回路図を以下に示します。
ご覧のとおり、回路にはPIカメラ、モータードライバーモジュール、およびRaspberrypiに接続されたモーターのペアが含まれます。回路全体は、モバイルパワーバンク(上記の回路では単4電池で表されています)から電力を供給されます。
Raspberry Piにはピンの詳細が記載されていないため、下の図を使用してピンを確認する必要があります
モーターを駆動するには、 4つのピン(A、B、A、B)が必要です。この4つのピンは、それぞれGPIO14、4、17、および18から接続されています。オレンジと白のワイヤーが一緒になって、1つのモーターの接続を形成します。したがって、2つのモーターに対して2つのそのようなペアがあります。
写真に示すように、モーターはL293Dモータードライバーモジュールに接続されて おり、ドライバーモジュールはパワーバンクから電力を供給され ます。パワーバンクのアースがRaspberryPiのアースに接続されていることを確認してください。そうしないと、接続が機能しません。
これでハードウェア接続が完了しました。処理環境に戻ってプログラミングを開始し、ロボットにボールの追跡方法を教えましょう。
ラズベリーパイボール追跡プログラム:
このプロジェクトの完全な処理プログラムは、このページの最後にあり、直接使用できます。さらにすぐ下で、他の同様のプロジェクトで使用できるように、コードの動作について説明しました。
プログラムのコンセプトは非常に簡単です。プロジェクトの意図はボールを追跡することですが、実際にはそれを行うつもりはありません。色を使用してボールを識別します。私たち全員が知っているように、ビデオは写真の連続フレームに他なりません。そのため、各写真を撮影してピクセルに分割します。次に、各ピクセルの色をボールの色と比較します。一致するものが見つかった場合、ボールが見つかったと言えます。この情報を使用して、画面上のボールの位置(ピクセルの色)を特定することもできます。位置が左端の場合はロボットを右に移動し、位置が右端の場合はロボットを左に移動して、ピクセル位置が常に画面の中央に留まるようにします。ダニエル・シフマンのコンピュータービジョンビデオを見て、鮮明な画像を得ることができます。
いつものように、ダウンロードした2つのライブラリをインポートすることから始めます。これは、次の2行で実行できます。ハードウェアI / Oライブラリは、処理環境から直接PIのGPIOピンにアクセスするために使用され、glvideoライブラリは、RaspberryPiカメラモジュールにアクセスするために使用されます。
インポートprocessing.io。*; インポートgohai.glvideo。*;
セットアップ 関数内で、出力ピンを初期化してモーターを制御し、piカメラからビデオを取得して、サイズ320 * 240のウィンドウにサイズ設定します。
void setup(){size(320、240、P2D); ビデオ=新しいGLCapture(this); video.start(); trackColor = color(255、0、0); GPIO.pinMode(4、GPIO.OUTPUT); GPIO.pinMode(14、GPIO.OUTPUT); GPIO.pinMode(17、GPIO.OUTPUT); GPIO.pinMode(18、GPIO.OUTPUT); }
空のドローは、 プログラムが終了すると、このループ内のコードが長いとして実行される無限ループのようなものです。カメラソースが利用可能な場合は、そこから出てくるビデオを読みます
void draw(){background(0); if(video.available()){video.read(); }}
次に、ビデオフレームをピクセルに分割し始めます。各ピクセルには、赤、緑、青の値があります。これらの値は、変数r1、g1、およびb1に格納されます。
for(int x = 0; x <video.width; x ++){for(int y = 0; y <video.height; y ++){int loc = x + y * video.width; //現在の色とは何ですかcolorcurrentColor = video.pixels; float r1 = red(currentColor); float g1 = green(currentColor); float b1 = blue(currentColor);
最初にボールの色を検出するには、色をクリックする必要があります。クリックすると、ボールの色が trackColour という変数に保存されます。
void mousePressed(){// trackColor変数でマウスがクリックされた場所の色を保存しますintloc = mouseX + mouseY * video.width; trackColor = video.pixels; }
トラックの色と現在の色を取得したら、それらを比較する必要があります。この比較では、dist関数を使用しています。現在の色がトラックの色にどれだけ近いかをチェックします。
float d = dist(r1、g1、b1、r2、g2、b2);
完全一致の場合、distの値はゼロになります。したがって、distの値が指定された値(世界記録)よりも小さい場合は、トラックの色が見つかったと見なされます。次に、そのピクセルの位置を取得し、それを変数に最も近いXと最も近いYに格納して、ボールの位置を見つけます。
if(d <worldRecord){worldRecord = d; closeX = x; closeyY = y; }
また、見つかった色の周りに楕円を描画して、その色が見つかったことを示します。位置の値もコンソールに出力されます。これは、デバッグ中に非常に役立ちます。
if(worldRecord <10){//追跡されたピクセルに円を描くfill(trackColor); strokeWeight(4.0); ストローク(0); ellipse(closestX、closestY、16、16); println(closestX、closestY);
最後に、最も近いXと最も近いYの位置を比較し、色が画面の中央に来るようにモーターを調整できます。以下のコードは、色のX位置が画面の左側にあることがわかったため、ロボットを右に向けるために使用されます(<140)
if(closestX <140){GPIO.digitalWrite(4、GPIO.HIGH); GPIO.digitalWrite(14、GPIO.HIGH); GPIO.digitalWrite(17、GPIO.HIGH); GPIO.digitalWrite(18、GPIO.LOW); delay(10); GPIO.digitalWrite(4、GPIO.HIGH); GPIO.digitalWrite(14、GPIO.HIGH); GPIO.digitalWrite(17、GPIO.HIGH); GPIO.digitalWrite(18、GPIO.HIGH); println( "右折"); }
同様に、XとYの位置を確認して、モーターを必要な方向に制御できます。いつものように、完全なプログラムについてはページの下部を参照できます。
Raspberry Piボール追跡ロボットの動作:
ハードウェアとプログラムの準備ができたら、楽しい時間を過ごしましょう。ボットを地上でテストする前に、すべてが正常に機能していることを確認する必要があります。Piを接続して、処理コードを監視および起動します。小さなウィンドウにビデオフィードが表示されます。次に、ボールをフレーム内に持ってきて、ボールをクリックして、この特定の色を追跡する必要があることをロボットに教えます。次に、ボールを画面上で動かすと、ホイールが回転していることに気付くはずです。
すべてが期待どおりに機能している場合は、ボットを地面に放して、それで遊んでください。 最良の結果を得るには、部屋が均等に照らされていることを確認してください。プロジェクトの完全な動作は、以下のビデオに示されてい ます。あなたがプロジェクトを理解し、似たようなものを作るのを楽しんだことを願っています。何か問題があれば、下のコメントセクションに投稿するか、助けてください。