Codificación del robot VEX AI

Este artículo cubrirá un proyecto de ejemplo que muestra un tablero que informa el estado de las comunicaciones de robot a robot mediante VEXlink y también el estado del Jetson. El proyecto ai_demo está alojado en nuestro Github. Este proyecto de demostración recopila datos del procesador Jetson a través de una conexión en serie USB. Una vez que se reciben los datos, se muestran en la pantalla del V5 Brain y también se transmiten a un robot V5 asociado que está conectado a través de VEXlink.

Este proyecto requiere la última versión de VEXcode Pro V5 (versiones 2.0.2 y posteriores). Descargado VEXcode Pro V5 aquí.

VEXcode-Pro-V5-icon.png


Nvidia Jetson Nano a VEX V5 Brain Communications

El procesador Jetson contiene una aplicación que recopila los siguientes datos del software VEX AI:

Screen_Shot_2021-02-05_at_3.30.04_PM.png

Datos de ubicación del robot:

  • Ubicación X, Y del robot en mm desde el centro del campo.
  • Azimut (rumbo), elevación (inclinación), rotación (balanceo) del robot, todo en radianes.

Datos de detección de objetos (dos tipos):

image4.png

Información de la casilla (tipo uno):
  • Estos datos representan un objeto detectado por el sensor de imagen AI.
  • Los datos contienen un valor que representa la clasificación del objeto detectado. (Valores: 0 = Bola roja, 1 = Bola azul, 2 = Gol)
  • Estos datos describen el objeto con referencia a la imagen de video.
  • Los valores de X, Y, ancho y alto están en unidades de píxeles. Los valores de píxeles se refieren a la esquina superior izquierda de la pantalla de video. La resolución de la imagen es 320x240.

image2.png

image6.png

Información del mapa (tipo dos):

  • Estos datos representan los mismos datos que la información de la caja, pero estos datos persistirán si el objeto deja de ser detectado.
  • Cada objeto tiene un valor de edad que se incrementa por cada fotograma de video que el objeto no es detectado. Entonces, cuanto mayor es el número de edad de un objeto, más tiempo ha pasado desde que el sistema de inteligencia artificial lo detectó.
  • Cada objeto contiene un valor que representa la clasificación del objeto detectado. (Valores: 0 = Bola roja, 1 = Bola azul, 2 = Gol)
  • Cada objeto también contiene la ubicación del objeto en relación con el centro del campo. Los valores para X e Y están en unidades de milímetros desde el centro del campo en sus respectivos ejes. El valor de Z es milímetros de los mosaicos de campo.

    Nota: estos valores se convierten a pulgadas y grados para que coincidan con los datos que se muestran en el panel web.
  • En el programa ai_demo, los valores de estos objetos están representados por la estructura MAP_RECORD.

Un desglose del programa ai_demo:

        • Main.cpp

          image5.png

          El estándar incluye para proyectos VEX:

          image7.png

          Declare una instancia de la clase Jetson. Esta clase se utiliza para enviar solicitudes de datos al Jetson, así como para recibir datos a través de la conexión en serie USB.

          #define MANAGER_ROBOT 1

          Define_manager_robot_1.png

          Declare una instancia de la clase robot_link. Este objeto se utilizará para conectar y transferir datos entre este robot y un robot asociado. Este mismo proyecto se puede descargar a dos robots separados. Un robot necesitará tener la línea:

          // # define MANAGER_ROBOT 1

          Antes de cargar el código en el segundo robot, deberá comentar esa línea:

La clase robot_link configura el VEXlink del robot y maneja la transmisión y recepción de datos entre los dos robots. No vamos a entrar en detalles en este artículo sobre cómo funciona esa clase. Sería una buena idea comprender primero cómo funciona VEXlink. Para obtener información más detallada sobre el uso de la API de VEXlink V5, este documento explica las nuevas bibliotecas y cómo usarlas de manera efectiva para comunicación robot a robot.

  • Controladores de eventos de competencia

    firstAutoFlag.png

    Una de las mayores diferencias entre VAIC y VRC es que no hay un período de control del conductor. En cambio, hay dos períodos autónomos, el período de aislamiento y el período de interacción. En este ejemplo, hay rutinas separadas para cada período autónomo. Debido a que la API de VEX no admite dos devoluciones de llamada diferentes, debe haber una bandera en el programa para determinar qué rutina se ejecutará. En este programa de ejemplo, el "firstAutoFlag" se utiliza para llamar a la función de aislamiento la primera vez que se habilita el autónomo, y la función de interacción cuando se habilita el autónomo por segunda vez. Una cosa a tener en cuenta es que si por alguna razón es necesario reiniciar la coincidencia, será necesario reiniciar el programa de demostración para que se pueda reiniciar el primer AutoFlag.

  • Principal()

    image3.png

    Esta es la tarea principal de este proyecto. Comienza llamando a vexcodeInit () para configurar correctamente el entorno de VEXcode. A continuación, se declara un objeto MAP_RECORD local para almacenar los datos que recibimos del Jetson. También se configura una tarea separada para manejar la actualización de la pantalla con los datos más actuales. El código para esa tarea está contenido en el archivo dashboard.cpp. La devolución de llamada autónoma también se registra para manejar cuando se inician los períodos autónomos.

    El bucle principal while () comienza copiando los últimos datos del objeto jetson_comms en nuestro objeto MAP_RECORD local. Luego pasa la información de ubicación del robot al objeto de enlace para que pueda ser transmitida a nuestro robot asociado. Una vez que termina de procesar los datos, solicita más datos del Jetson y duerme durante 66 milisegundos. La tasa de sondeo de estos datos es de 15 Hz. No hay razón para sondear más rápido, ya que los datos del sistema de IA se actualizan a aproximadamente 15 Hz.

    Nota: los datos del mapa de Jetson solo deben ser solicitados por una sola tarea.