VEX AI ロボットのコーディング

この記事では、VEXlink を使用したロボット間の通信のステータスと Jetson へのステータスをレポートするダッシュボードを表示するサンプル プロジェクトについて説明します。 ai_demo プロジェクトは、当社の Githubでホストされています。このデモ プロジェクトは、USB シリアル接続を介して Jetson プロセッサからデータを収集します。データを受信すると、V5 Brain の画面に表示され、VEXlink 経由で接続されているパートナー V5 ロボットにも送信されます。

注: このプロジェクトには、最新バージョンの VS Code Extension for V5 が必要です。 V5 用の VS Code 拡張機能をここからダウンロードしてください。


NVIDIA Jetson Nano から VEX V5 へのブレイン コミュニケーション

Jetson プロセッサには、VEX AI ソフトウェアから次のデータを収集するアプリケーションが含まれています。

位置追跡のためのロボットの位置、向き、座標軸を示す2つのフィールド図。

ロボットの位置データ:

  • フィールドの中心からのロボットの X、Y 位置 (メートル単位)。
  • ロボットの方位角 (ヘディング)、仰角 (ピッチ)、回転 (ロール) はすべてラジアン単位で表示されます。

物体検出データ(3種類):

カメラ画面に、検出されたゲームオブジェクトが色、位置座標、距離でラベル付けされている。

画像検出(タイプ1):

  • このデータは、VEX AI Intel カメラによって検出されたオブジェクトを表します。
  • このデータは、カメラ画像を参照してオブジェクトを記述します。
  • X、Y、幅、高さの値はピクセル単位です。ピクセル値は、画像の左上隅とオブジェクト検出ボックスを基準にしています。画像の解像度は640x480です。

 

フィールド図は、X座標軸とY座標軸、およびフィールド中心における基準位置X0 Y0を示しています。

マップ検出 (タイプ 2):

  • このデータは、フィールド上のオブジェクトの位置を GPS センサーと同じ座標系で表し、メートル単位で報告されます。
  • 各オブジェクトには、フィールドの中心を基準としたオブジェクトの位置も含まれます。 X と Y の値は、それぞれの軸のフィールドの中心からのメートル単位です。 Z の値は、フィールド タイルからのメートル (高さ) です。

検出オブジェクト (タイプ 3):

検出されたオブジェクトのデータ構造を定義するC++コードスニペット。分類、位置、画像座標、マップ座標などが含まれます。

  • これにより、検出されたオブジェクトに関するすべての情報がカプセル化されます。
  • 各オブジェクトには、検出されたオブジェクトの分類を表す値が含まれています。(クラス ID: 0 = GreenTriball、1 = RedTriBall、2 = BlueTriBall)
  • 各オブジェクトには、VEX AI の検出の信頼度を表す確率も含まれています。これは、確率の低い検出を削除する model.py 内のフィルターの後です。
  • さらに、VEX AI Intel カメラからオブジェクトの深さがメートル単位で報告されます。
  • 画像検出と地図検出は各オブジェクトに付加され、画像上および現実世界のオブジェクトの座標を表します。

ai_demo プログラムの内訳:

Main.cpp

標準的なVEXプロジェクトのインクルードと初期化設定を示すC++コードスニペット。

VEX プロジェクトには次のものが標準で含まれています。

// Jetson Nanoから位置情報やその他のデータを受信するjetsonクラスのインスタンスを作成します
//
//
ai::jetson jetson_comms;

Jetson クラスのインスタンスを宣言します。このクラスは、Jetson にデータのリクエストを送信したり、USB シリアル接続を介してデータを受信したりするために使用されます。

#define マネージャー_ロボット 1

#define MANAGER_ROBOT 1 という define ステートメントを使用して、マネージャーおよびワーカー ロボットの役割を構成する C++ コード スニペットを示します。

robot_link クラスのインスタンスを宣言します。このオブジェクトは、このロボットとパートナー ロボットの間で接続し、データを転送するために使用されます。この同じプロジェクトを 2 つの別々のロボットにダウンロードできます。 1 台のロボットには次の行が必要です。

//#Manager_ROBOT 1 を定義します

コードを 2 番目のロボットにロードする前に、その行をコメント アウトする必要があります。

robot_link クラスは、ロボットの VEXlink を設定し、2 台のロボット間のデータの送受信を処理します。この記事では、そのクラスがどのように機能するかについては詳しく説明しません。まず VEXlink がどのように機能するかを理解することをお勧めします。 V5 VEXlink API の使用方法に関するより詳細な情報については、このドキュメント ライブラリと、ロボット間の通信にそれらを効果的に使用する方法について説明します。

  • 競技イベントハンドラー

    分離ルーチンと相互作用ルーチンを切り替える条件付きロジックを示すC++コード。

    VAIC と VRC の最大の違いの 1 つは、ドライバー制御期間がないことです。代わりに、隔離期間と交流期間という 2 つの自律的な期間があります。この例では、自律期間ごとに個別のルーチンが存在します。 VEX API は 2 つの異なるコールバックをサポートしていないため、どのルーチンを実行するかを決定するためのフラグがプログラム内に存在する必要があります。このプログラム例では、「firstAutoFlag」を使用して、初めて Autonomous が有効になったときに Isolation 関数を呼び出し、Autonomous が 2 回目に有効になったときにインタラクション関数を呼び出します。注意すべき点の 1 つは、何らかの理由で一致をリセットする必要がある場合、firstAutoFlag をリセットできるようにデモ プログラムを再起動する必要があることです。

  • 主要()

    Jetsonからのデータ取得、処理、およびパートナーロボットとの通信を処理するメインループのC++コードスニペット。

    これがこのプロジェクトの主なタスクです。まず、vexcodeInit() を呼び出して VEXcode 環境を正しく設定します。次に、Jetson から受信したデータを保存するローカル AI_RECORD オブジェクトが宣言されます。最新のデータによる画面の更新を処理する別のタスクも設定されます。そのタスクのコードは、dashboard.cpp ファイルに含まれています。自律期間が開始されたときに処理するために、自律コールバックも登録されます。

    メインの while() ループは、jetson_comms オブジェクトからローカル AI_RECORD オブジェクトに最新データをコピーすることから始まります。次に、ロボットの位置情報をリンク オブジェクトに渡し、パートナー ロボットに送信できるようにします。データの処理が完了すると、Jetson にさらにデータを要求し、66 ミリ秒間スリープします。このデータのポーリング レートは 15Hz です。 AI システムのデータは約 15 Hz で更新されるため、これ以上高速にポーリングする理由はありません。

    注: Jetson マップ データは単一のタスクによってのみ要求される必要があります。

For more information, help, and tips, check out the many resources at VEX Professional Development Plus

Last Updated: