この記事では、VEXlink を使用したロボット間の通信のステータスと Jetson へのステータスをレポートするダッシュボードを表示するサンプル プロジェクトについて説明します。 ai_demo プロジェクトはホストされています。 このデモ プロジェクトは、USB シリアル接続を介して Jetson プロセッサからデータを収集します。 データを受信すると、V5 Brain の画面に表示され、VEXlink 経由で接続されているパートナー V5 ロボットにも送信されます。
注: このプロジェクトには、最新バージョンの VS Code Extension for V5 が必要です。 ここから V5 の VS Code 拡張機能をダウンロードします。
NVIDIA Jetson Nano から VEX V5 へのブレイン コミュニケーション
Jetson プロセッサには、VEX AI ソフトウェアから次のデータを収集するアプリケーションが含まれています。
ロボットの位置データ:
- フィールドの中心からのロボットの X、Y 位置 (メートル単位)。
- ロボットの方位角 (ヘディング)、仰角 (ピッチ)、回転 (ロール) はすべてラジアン単位で表示されます。
物体検出データ(3種類):
- このデータは、VEX AI Intel カメラによって検出されたオブジェクトを表します。
- このデータは、カメラ画像を参照してオブジェクトを記述します。
- X、Y、幅、高さの値はピクセル単位です。 ピクセル値は、画像の左上隅とオブジェクト検出ボックスを基準にしています。 画像の解像度は640x480です。
マップ検出 (タイプ 2):
- このデータは、フィールド上のオブジェクトの位置を GPS センサーと同じ座標系で表し、メートル単位で報告されます。
- 各オブジェクトには、フィールドの中心を基準としたオブジェクトの位置も含まれます。 X と Y の値は、それぞれの軸のフィールドの中心からのメートル単位です。 Z の値は、フィールド タイルからのメートル (高さ) です。
検出オブジェクト (タイプ 3):
- これにより、検出されたオブジェクトに関するすべての情報がカプセル化されます。
- 各オブジェクトには、検出されたオブジェクトの分類を表す値が含まれています。 (クラス ID: 0 = GreenTriball、1 = RedTriBall、2 = BlueTriBall)
- 各オブジェクトには、VEX AI の検出の信頼度を表す確率も含まれています。 これは、確率の低い検出を削除する model.py 内のフィルターの後です。
- さらに、VEX AI Intel カメラからオブジェクトの深さがメートル単位で報告されます。
- 画像検出と地図検出は各オブジェクトに付加され、画像上および現実世界のオブジェクトの座標を表します。
ai_demo プログラムの内訳:
Main.cpp
VEX プロジェクトには次のものが標準で含まれています。
Jetson クラスのインスタンスを宣言します。 このクラスは、Jetson にデータのリクエストを送信したり、USB シリアル接続を介してデータを受信したりするために使用されます。
#define マネージャー_ロボット 1
robot_link クラスのインスタンスを宣言します。 このオブジェクトは、このロボットとパートナー ロボットの間で接続し、データを転送するために使用されます。 この同じプロジェクトを 2 つの別々のロボットにダウンロードできます。 1 台のロボットには次の行が必要です。
//#Manager_ROBOT 1 を定義します
コードを 2 番目のロボットにロードする前に、その行をコメント アウトする必要があります。
robot_link クラスは、ロボットの VEXlink を設定し、2 台のロボット間のデータの送受信を処理します。 この記事では、そのクラスがどのように機能するかについては詳しく説明しません。 まず VEXlink がどのように機能するかを理解することをお勧めします。 V5 VEXlink API の使用に関する詳細については、このドキュメント 新しいライブラリと、それらをロボット間通信に効果的に使用する方法について説明します。
-
競技イベントハンドラー
VAIC と VRC の最大の違いの 1 つは、ドライバー制御期間がないことです。 代わりに、隔離期間と交流期間という 2 つの自律的な期間があります。 この例では、自律期間ごとに個別のルーチンが存在します。 VEX API は 2 つの異なるコールバックをサポートしていないため、どのルーチンを実行するかを決定するためのフラグがプログラム内に存在する必要があります。 このプログラム例では、「firstAutoFlag」を使用して、初めて Autonomous が有効になったときに Isolation 関数を呼び出し、Autonomous が 2 回目に有効になったときにインタラクション関数を呼び出します。 注意すべき点の 1 つは、何らかの理由で一致をリセットする必要がある場合、firstAutoFlag をリセットできるようにデモ プログラムを再起動する必要があることです。
-
主要()
これがこのプロジェクトの主なタスクです。 まず、vexcodeInit() を呼び出して VEXcode 環境を正しく設定します。 次に、Jetson から受信したデータを保存するローカル AI_RECORD オブジェクトが宣言されます。 最新のデータによる画面の更新を処理する別のタスクも設定されます。 そのタスクのコードは、dashboard.cpp ファイルに含まれています。 自律期間が開始されたときに処理するために、自律コールバックも登録されます。
メインの while() ループは、jetson_comms オブジェクトからローカル AI_RECORD オブジェクトに最新データをコピーすることから始まります。 次に、ロボットの位置情報をリンク オブジェクトに渡し、パートナー ロボットに送信できるようにします。 データの処理が完了すると、Jetson にさらにデータを要求し、66 ミリ秒間スリープします。 このデータのポーリング レートは 15Hz です。 AI システムのデータは約 15 Hz で更新されるため、これ以上高速にポーリングする理由はありません。
注: Jetson マップ データは単一のタスクによってのみ要求される必要があります。