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:
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):
- 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.
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):
- 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
Lo standard include per i progetti VEX:
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
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, questo documento spiega le nuove librerie e come utilizzarle in modo efficace per la comunicazione tra robot.
-
Gestori degli eventi di competizione
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()
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à.