W tym artykule zostanie omówiony przykładowy projekt, który wyświetla pulpit nawigacyjny informujący o stanie komunikacji między robotami za pomocą VEXlink, a także o stanie Jetson. Projekt ai_demo jest hostowany na naszym Github. Ten projekt demonstracyjny zbiera dane z procesora Jetson przez połączenie szeregowe USB. Po otrzymaniu danych są one wyświetlane na ekranie V5 Brain, a także przesyłane do partnerskiego robota V5, który jest połączony przez VEXlink.
Ten projekt wymaga najnowszej wersji VEXcode Pro V5 (wersje 2.0.2 i nowsze). Pobrano VEXcode Pro V5 tutaj.
Komunikacja mózgu Nvidia Jetson Nano z VEX V5
Procesor Jetson zawiera aplikację, która zbiera następujące dane z oprogramowania VEX AI:
Dane o lokalizacji robota:
- Położenie robota X,Y w mm od środka pola.
- Azymut robota (kurs), wysokość (nachylenie), obrót (przechylenie) – wszystko w radianach.
Dane wykrywania obiektów (dwa rodzaje):
- Dane te reprezentują obiekt wykryty przez czujnik obrazu AI.
- Dane zawierają wartość reprezentującą klasyfikację wykrytego obiektu. (Wartości: 0 = czerwona piłka, 1 = niebieska piłka, 2 = bramka)
- Dane te opisują obiekt w odniesieniu do obrazu wideo.
- Wartości X, Y, szerokości i wysokości podane są w pikselach. Wartości pikseli odnoszą się do lewego górnego rogu ekranu wideo. Rozdzielczość obrazu to 320x240.
Informacje o mapie (typ drugi):
- Te dane reprezentują te same dane, co informacje w pudełku, ale dane te pozostaną, jeśli obiekt przestanie być wykrywany.
- Każdy obiekt ma wartość wieku, która zwiększa się dla każdej klatki wideo, w której obiekt nie został wykryty. Tak więc im wyższy numer wieku obiektu, tym dłużej minęło od wykrycia tego obiektu przez system sztucznej inteligencji.
- Każdy obiekt zawiera wartość, która reprezentuje klasyfikację wykrytego obiektu. (Wartości: 0 = czerwona piłka, 1 = niebieska piłka, 2 = bramka)
- Każdy obiekt zawiera również położenie obiektu względem środka pola. Wartości X i Y podane są w milimetrach od środka pola na ich odpowiedniej osi. Wartość Z to milimetry od płytek pola.
Uwaga: te wartości są konwertowane na cale i stopnie w celu dopasowania danych wyświetlanych na pulpicie nawigacyjnym sieci Web. - W programie ai_demo wartości tych obiektów są reprezentowane przez strukturę MAP_RECORD.
Podział programu ai_demo:
-
Główny.cpp
Standard obejmuje dla projektów VEX:
Zadeklaruj instancję klasy Jetson. Ta klasa jest używana do wysyłania żądań danych do Jetson, a także odbierania danych przez połączenie szeregowe USB.
#define MANAGER_ROBOT 1
Zadeklaruj instancję klasy robot_link. Ten obiekt będzie używany do łączenia i przesyłania danych między tym robotem a robotem partnerskim. Ten sam projekt można pobrać do dwóch oddzielnych robotów. Jeden robot będzie potrzebował linii:
//#define MANAGER_ROBOT 1
Zanim wczytasz kod do drugiego robota, musisz zakomentować tę linię:
Klasa robot_link konfiguruje VEXlink robota i obsługuje przesyłanie i odbieranie danych między dwoma robotami. W tym artykule nie będziemy szczegółowo omawiać działania tej klasy. Dobrym pomysłem byłoby najpierw zrozumieć, jak działa VEXlink. Aby uzyskać bardziej szczegółowe informacje na temat korzystania z interfejsu API V5 VEXlink, ten dokument wyjaśnia nowe biblioteki i sposoby ich efektywnego wykorzystania do komunikacja robot-robot.
-
Organizatorzy zawodów konkursowych
Jedną z największych różnic między VAIC i VRC jest brak okresu kontroli sterownika. Zamiast tego istnieją dwa niezależne okresy, okres izolacji i okres interakcji. W tym przykładzie istnieją oddzielne procedury dla każdego niezależnego okresu. Ponieważ API VEX nie obsługuje dwóch różnych wywołań zwrotnych, w programie musi znajdować się flaga, aby określić, która procedura ma zostać wykonana. W tym przykładowym programie „firstAutoFlag” jest używany do wywołania funkcji izolacji, gdy autonomia jest włączona po raz pierwszy, oraz funkcji interakcji, gdy autonomia jest włączona po raz drugi. Należy zauważyć, że jeśli z jakiegoś powodu mecz musi zostać zresetowany, program demonstracyjny musiałby zostać zrestartowany, aby można było zresetować pierwszą AutoFlag.
-
Główny()
To jest główne zadanie tego projektu. Rozpoczyna się od wywołania vexcodeInit() w celu poprawnego skonfigurowania środowiska VEXcode. Następnie deklarowany jest lokalny obiekt MAP_RECORD do przechowywania danych, które otrzymujemy od Jetson. Skonfigurowano również osobne zadanie do obsługi aktualizacji ekranu przy użyciu najbardziej aktualnych danych. Kod tego zadania jest zawarty w pliku dashboard.cpp. Autonomiczne wywołanie zwrotne jest również rejestrowane do obsługi, gdy inicjowane są okresy autonomiczne.
Główna pętla while() rozpoczyna się od skopiowania najnowszych danych z obiektu jetson_comms do naszego lokalnego obiektu MAP_RECORD. Następnie przekazuje informacje o lokalizacji robota do obiektu łącza, aby można je było przesłać do naszego robota partnerskiego. Po zakończeniu przetwarzania danych żąda więcej danych od Jetson i śpi przez 66 milisekund. Częstotliwość odpytywania tych danych wynosi 15 Hz. Nie ma powodu, aby sondować szybciej, ponieważ dane systemu AI aktualizują się z częstotliwością około 15 Hz.
Uwaga: dane mapy Jetson są wymagane tylko przez jedno zadanie.