De VEX AI-robot coderen

Dit artikel behandelt een voorbeeldproject dat een dashboard weergeeft dat de status voor robot-naar-robotcommunicatie meldt met behulp van VEXlink en ook de status aan de Jetson. Het ai_demo-project wordt gehost op onze Github. Dit demoproject verzamelt gegevens van de Jetson-processor via een seriële USB-verbinding. Zodra de gegevens zijn ontvangen, worden deze weergegeven op het scherm van de V5 Brain en ook verzonden naar een partner V5-robot die is verbonden via VEXlink.

Dit project vereist de nieuwste versie van VEXcode Pro V5 (versie 2.0.2 en hoger). VEXcode Pro V5 hiergedownload.

VEXcode-Pro-V5-icon.png


Nvidia Jetson Nano naar VEX V5 Brain Communications

De Jetson-processor bevat een applicatie die de volgende gegevens uit de VEX AI-software verzamelt:

Screen_Shot_2021-02-05_at_3.30.04_PM.png

Gegevens robotlocatie:

  • X,Y-locatie van de robot in mm vanaf het midden van het veld.
  • Azimut van de robot (richting), hoogte (pitch), rotatie (rol) allemaal in radialen.

Objectdetectiegegevens (twee soorten):

image4.png

Doosinformatie (type één):
  • Deze gegevens vertegenwoordigen een gedetecteerd object door de AI-beeldsensor.
  • De gegevens bevatten een waarde die de classificatie van het gedetecteerde object vertegenwoordigt. (Waarden: 0 = rode bal, 1 = blauwe bal, 2 = doelpunt)
  • Deze gegevens beschrijven het object aan de hand van het videobeeld.
  • Waarden voor X, Y, breedte en hoogte zijn in de eenheden van pixels. De pixelwaarden hebben betrekking op de linkerbovenhoek van het videoscherm. Beeldresolutie is 320x240.

afbeelding2.png

afbeelding6.png

Kaartinformatie (type twee):

  • Deze gegevens vertegenwoordigen dezelfde gegevens als de doosinformatie, maar deze gegevens blijven behouden als het object niet meer wordt gedetecteerd.
  • Elk object heeft een leeftijdswaarde die wordt verhoogd voor elk videoframe dat het object niet wordt gedetecteerd. Dus hoe hoger het leeftijdsgetal voor een object, hoe langer het geleden is dat het AI-systeem dat object heeft gedetecteerd.
  • Elk object bevat een waarde die de classificatie van het gedetecteerde object vertegenwoordigt. (Waarden: 0 = rode bal, 1 = blauwe bal, 2 = doelpunt)
  • Elk object bevat ook de locatie van het object ten opzichte van het midden van het veld. Waarden voor X en Y zijn in millimeters vanaf het midden van het veld op hun respectieve as. De waarde van Z is millimeter vanaf de veldtegels.

    Opmerking: deze waarden worden geconverteerd naar inches en graden om overeen te komen met de gegevens die op het webdashboard worden weergegeven.
  • In het programma ai_demo worden de waarden voor deze objecten weergegeven door de MAP_RECORD-structuur.

Een overzicht van het ai_demo-programma:

        • Hoofd.cpp

          afbeelding5.png

          Standaard omvat voor VEX projecten:

          afbeelding7.png

          Declareer een instantie van de Jetson-klasse. Deze klasse wordt gebruikt om gegevensverzoeken naar de Jetson te verzenden en om gegevens te ontvangen via de seriële USB-verbinding.

          #define MANAGER_ROBOT 1

          Definieer_manager_robot_1.png

          Declareer een instantie van de klasse robot_link. Dit object wordt gebruikt om gegevens te verbinden en over te dragen tussen deze robot en een partnerrobot. Ditzelfde project kan worden gedownload naar twee afzonderlijke robots. Eén robot heeft de volgende regel nodig:

          //#define MANAGER_ROBOT 1

          Voordat je de code op de tweede robot laadt, moet je die regel uitschrijven:

De klasse robot_link stelt de VEXlink van de robot in en zorgt voor het verzenden en ontvangen van gegevens tussen de twee robots. We gaan in dit artikel niet in detail in op hoe die klasse werkt. Het zou een goed idee zijn om eerst te begrijpen hoe de VEXlink werkt. Voor meer gedetailleerde informatie over het gebruik van de V5 VEXlink API, , legt dit document de nieuwe bibliotheken uit en hoe ze effectief kunnen worden gebruikt voor robot-naar-robot communicatie.

  • Competitie Event handlers

    firstAutoFlag.png

    Een van de grootste verschillen tussen VAIC en VRC is dat er geen bestuurderscontroleperiode is. In plaats daarvan zijn er twee autonome perioden, de isolatieperiode en de interactieperiode. In dit voorbeeld zijn er aparte routines voor elke autonome periode. Omdat de VEX API geen twee verschillende callbacks ondersteunt, moet er een vlag in het programma zijn om te bepalen welke routine moet worden uitgevoerd. In dit voorbeeldprogramma wordt de "firstAutoFlag" gebruikt om de isolatiefunctie aan te roepen wanneer autonoom voor de eerste keer wordt ingeschakeld, en de interactiefunctie wanneer autonoom voor de tweede keer wordt ingeschakeld. Een ding om op te merken is dat als om wat voor reden dan ook de wedstrijd moet worden gereset, het demoprogramma opnieuw moet worden gestart zodat de eerste AutoFlag kan worden gereset.

  • Hoofd()

    afbeelding3.png

    Dit is de hoofdtaak van dit project. Het begint met het aanroepen van vexcodeInit() om de VEXcode-omgeving correct in te stellen. Vervolgens wordt een lokaal MAP_RECORD-object gedeclareerd om de gegevens op te slaan die we van de Jetson ontvangen. Er is ook een aparte taak ingesteld om het scherm met de meest actuele gegevens bij te werken. De code voor die taak staat in het bestand dashboard.cpp. Het autonoom terugbellen wordt ook geregistreerd om af te handelen wanneer de autonome periodes ingaan.

    De belangrijkste while()-lus begint met het kopiëren van de nieuwste gegevens van het jetson_comms-object naar ons lokale MAP_RECORD-object. Vervolgens geeft het de locatie-informatie van de robot door aan het link-object, zodat het kan worden verzonden naar onze partnerrobot. Zodra het klaar is met het verwerken van de gegevens, vraagt het meer gegevens op bij de Jetson en slaapt het 66 milliseconden. De pollingsnelheid voor deze gegevens is 15 Hz. Er is geen reden om sneller te pollen, aangezien de gegevens van het AI-systeem worden bijgewerkt met ongeveer 15 Hz.

    Opmerking: de Jetson-kaartgegevens hoeven slechts door één enkele taak te worden aangevraagd.