Questo articolo tratterà un progetto di esempio che visualizza un dashboard che riporta lo stato delle comunicazioni da robot a robot utilizzando VEXlink e anche lo stato a Jetson. Il progetto ai_demo è ospitato sul nostro Github . Questo progetto demo raccoglie i dati dal processore Jetson tramite connessione seriale USB. Una volta ricevuti, i dati vengono visualizzati sullo schermo del V5 Brain e trasmessi anche a un robot V5 partner collegato tramite VEXlink.

Nota: questo progetto richiede l'ultima versione dell'estensione VS Code per V5. Scarica qui l'estensione VS Code per V5 .


Comunicazioni cerebrali da NVIDIA Jetson Nano a VEX V5

Il processore Jetson contiene un'applicazione che raccoglie i seguenti dati dal software VEX AI:

Due diagrammi di campo che mostrano la posizione, l'orientamento e gli assi cartesiani del robot per il tracciamento della posizione.

Dati sulla posizione del robot:

  • Posizione X,Y del robot in metri dal centro del campo.
  • Azimut (direzione), elevazione (inclinazione), rotazione (rollio) del robot, tutti in radianti.

Dati di rilevamento oggetti (tre tipi):

Visuale della telecamera con gli oggetti di gioco rilevati etichettati per colore, coordinate di posizione e distanza.

Rilevamento immagini (tipo uno):

  • Questi dati rappresentano un oggetto rilevato dalla fotocamera Intel VEX AI.
  • Questi dati descrivono l'oggetto con riferimento all'immagine della telecamera.
  • I valori per X, Y, larghezza e altezza sono espressi in pixel. I valori dei pixel si riferiscono all'angolo in alto a sinistra della casella di rilevamento dell'immagine e dell'oggetto. La risoluzione dell'immagine è 640x480.

 

Diagramma del campo che mostra gli assi cartesiani X e Y e la posizione di riferimento di X0 e Y0 al centro del campo.

Rilevamento mappa (tipo due):

  • Questi dati rappresentano la posizione dell'oggetto sul campo nello stesso sistema di coordinate del sensore GPS, riportato in metri.
  • Ogni oggetto contiene anche la posizione dell'oggetto rispetto al centro del campo. I valori per X e Y sono in unità di metri dal centro del campo nel rispettivo asse. Il valore di Z è metri dalle tessere del campo (altezza).

Oggetto di rilevamento (tipo tre):

Frammento di codice C++ che definisce le strutture dati per gli oggetti rilevati, tra cui classificazione, posizione e coordinate di immagine e mappa.

  • Questo incapsula tutte le informazioni sugli oggetti rilevati.
  • Ogni oggetto contiene un valore che rappresenta la classificazione dell'oggetto rilevato. (ID classe: 0 = GreenTriball, 1 = RedTriBall, 2 = BlueTriBall)
  • Ogni oggetto contiene anche una probabilità che rappresenta la fiducia dell'IA VEX nel rilevamento. Questo avviene dopo un filtro nel model.py che rimuove i rilevamenti di bassa probabilità.
  • Inoltre, la profondità dell'oggetto viene segnalata in metri dalla VEX AI Intel Camera.
  • Il rilevamento dell'immagine e il rilevamento della mappa sono associati a ciascun oggetto per rappresentare le coordinate dell'oggetto sull'immagine e nel mondo reale.

Una ripartizione del programma ai_demo:

Main.cpp

Frammento di codice C++ che mostra gli include standard di un progetto VEX e la configurazione di inizializzazione.

Lo standard include per i progetti VEX:

// crea un'istanza della classe jetson per ricevere la posizione e altri
// dati dal Jetson nano
//
ai::jetson jetson_comms;

Dichiara un'istanza della classe Jetson. Questa classe viene utilizzata per inviare richieste di dati a Jetson e per ricevere dati tramite la connessione seriale USB.

#define MANAGER_ROBOT 1

Frammento di codice C++ che mostra la configurazione dei ruoli del robot manager e worker utilizzando un'istruzione define che recita #define MANAGER_ROBOT 1.

Dichiara un'istanza della classe robot_link. Questo oggetto verrà utilizzato per connettere e trasferire dati tra questo robot e un robot partner. Questo stesso progetto può essere scaricato su due robot separati. Un robot avrà bisogno della linea:

//#definisce MANAGER_ROBOT 1

Prima di caricare il codice sul secondo robot, dovrai commentare quella riga:

La classe robot_link configura il VEXlink del robot e gestisce la trasmissione e la ricezione dei dati tra i due robot. Non entreremo nei dettagli in questo articolo su come funziona quella classe. Sarebbe una buona idea capire prima come funziona VEXlink. Per informazioni più dettagliate sull'utilizzo dell'API VEXlink V5, spiega le nuove librerie e come utilizzarle efficacemente per la comunicazione robot-robot.

  • Gestori degli eventi di competizione

    Codice C++ che mostra la logica condizionale che commuta tra routine autonome di isolamento e di interazione.

    Una delle maggiori differenze tra VAIC e VRC è che non esiste un periodo di controllo del conducente. Esistono invece due periodi autonomi, il periodo di isolamento e il periodo di interazione. In questo esempio, sono presenti routine separate per ciascun periodo autonomo. Poiché l'API VEX non supporta due diversi callback, nel programma deve essere presente un flag per determinare quale routine deve essere eseguita. In questo programma di esempio, il "firstAutoFlag" viene utilizzato per richiamare la funzione di isolamento la prima volta che l'autonomo viene abilitato e la funzione di interazione quando l'autonomo viene abilitato per la seconda volta. Una cosa da notare è che se per qualche motivo la partita dovesse essere reimpostata, il programma demo dovrebbe essere riavviato in modo che il primo AutoFlag possa essere reimpostato.

  • Principale()

    Frammento di codice C++ del ciclo principale che gestisce il recupero dei dati dal Jetson, l'elaborazione e la comunicazione con un robot partner.

    Questo è il compito principale di questo progetto. Inizia chiamando vexcodeInit() per impostare correttamente l'ambiente VEXcode. Successivamente, viene dichiarato un oggetto AI_RECORD locale per archiviare i dati che riceviamo da Jetson. Viene inoltre impostata un'attività separata per gestire l'aggiornamento dello schermo con i dati più recenti. Il codice per tale attività è contenuto nel file dashboard.cpp. La richiamata autonoma viene registrata anche per essere gestita quando vengono avviati i periodi autonomi.

    Il ciclo while() principale inizia copiando i dati più recenti dall'oggetto jetson_comms nel nostro oggetto AI_RECORD locale. Quindi trasmette le informazioni sulla posizione del robot all'oggetto collegamento in modo che possano essere trasmesse al nostro robot partner. Una volta terminata l'elaborazione dei dati, richiede altri dati da Jetson e dorme per 66 millisecondi. La frequenza di polling per questi dati è 15Hz. Non c'è motivo di eseguire il polling più velocemente poiché i dati del sistema AI si aggiornano a circa 15Hz.

    Nota: i dati della mappa Jetson devono essere richiesti solo da una singola attività.

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

Last Updated: