Codificando el robot VEX AI

Este artículo cubrirá un proyecto de ejemplo que muestra un panel 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 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.

Nota: este proyecto requiere la última versión de VS Code Extension para V5. Descargue la extensión VS Code para V5 aquí.


Comunicaciones cerebrales NVIDIA Jetson Nano a VEX V5

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

Dos diagramas de campo que muestran la posición, la orientación y los ejes de coordenadas del robot para el seguimiento de la ubicación.

Datos de ubicación del robot:

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

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

Vista de la cámara con los objetos del juego detectados, etiquetados por color, coordenadas de posición y distancia.

Detección de imágenes (tipo uno):

  • Estos datos representan un objeto detectado por la cámara Intel VEX AI.
  • Estos datos describen el objeto con referencia a la imagen de la cámara.
  • Los valores de X, Y, ancho y alto están en unidades de píxeles. Los valores de píxeles hacen referencia a la esquina superior izquierda de la imagen y al cuadro de detección de objetos. La resolución de la imagen es 640x480.

 

Diagrama de campo que muestra los ejes de coordenadas X e Y y la posición de referencia X0 Y0 en el centro del campo.

Detección de mapas (tipo dos):

  • Estos datos representan la ubicación del objeto en el campo en el mismo sistema de coordenadas que el sensor GPS, expresado en metros.
  • Cada objeto también contiene la ubicación del objeto en relación con el centro del campo. Los valores de X e Y están en unidades de metros desde el centro del campo en sus respectivos ejes. El valor de Z está a metros de las losetas de campo (altura).

Objeto de detección (tipo tres):

Fragmento de código C++ que define las estructuras de datos para los objetos detectados, incluyendo la clasificación, la posición y las coordenadas de la imagen y del mapa.

  • Esto encapsula toda la información sobre los objetos detectados.
  • Cada objeto contiene un valor que representa la clasificación del objeto detectado. (ID de clase: 0 = GreenTriball, 1 = RedTriBall, 2 = BlueTriBall)
  • Cada objeto también contiene una probabilidad que representa la confianza de VEX AI en la detección. Esto es después de un filtro en model.py que elimina las detecciones de baja probabilidad.
  • Además, la profundidad del objeto se informa en metros desde la cámara Intel VEX AI.
  • La Detección de Imagen y la Detección de Mapa se adjuntan a cada objeto para representar las coordenadas del objeto en la imagen así como en el mundo real.

Un desglose del programa ai_demo:

principal.cpp

Fragmento de código C++ que muestra las inclusiones estándar de un proyecto VEX y la configuración de inicialización.

El estándar incluye para proyectos VEX:

// crea una instancia de la clase jetson para recibir la ubicación y otros
// datos del Jetson nano
//
ai::jetson jetson_comms;

Declara 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 serie USB.

#definir MANAGER_ROBOT 1

Fragmento de código C++ que muestra la configuración de los roles de robot gerente y trabajador mediante una instrucción define que dice #define MANAGER_ROBOT 1.

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 en dos robots separados. Un robot necesitará tener la línea:

//#definir 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 entender primero cómo funciona VEXlink. Para obtener información más detallada sobre el uso de la API VEXlink V5, documento las nuevas bibliotecas y cómo utilizarlas eficazmente para la comunicación entre robots.

  • Controladores de eventos de competencia

    Código C++ que muestra la lógica condicional que alterna entre rutinas autónomas de aislamiento e interacción.

    Una de las mayores diferencias entre VAIC y VRC es que no existe 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, existen rutinas separadas para cada período autónomo. Debido a que la API VEX no admite dos devoluciones de llamada diferentes, debe haber un indicador en el programa para determinar qué rutina se ejecutará. En este programa de ejemplo, "firstAutoFlag" se utiliza para llamar a la función de aislamiento la primera vez que se habilita la función autónoma y a la función de interacción cuando se habilita la función autónoma por segunda vez. Una cosa a tener en cuenta es que si por alguna razón es necesario restablecer la coincidencia, será necesario reiniciar el programa de demostración para que se pueda restablecer el primer AutoFlag.

  • Principal()

    Fragmento de código C++ del bucle principal que gestiona la recuperación de datos del Jetson, su procesamiento y la comunicación con un robot asociado.

    Esta es la tarea principal de este proyecto. Comienza llamando a vexcodeInit() para configurar correctamente el entorno VEXcode. A continuación, se declara un objeto AI_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 recientes. El código para esa tarea está contenido en el archivo Dashboard.cpp. La devolución de llamada autónoma también está registrada para manejar cuando se inician los períodos autónomos.

    El bucle principal while() comienza copiando los datos más recientes del objeto jetson_comms en nuestro objeto AI_RECORD local. Luego pasa la información de ubicación del robot al objeto de enlace para que pueda transmitirse 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 para 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 Jetson solo deben solicitarse mediante una única tarea.

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

Last Updated: