Este artigo abordará um projeto de exemplo que exibe um painel relatando o status das comunicações entre robôs usando VEXlink e também o status para o Jetson. O projeto ai_demo está hospedado em nosso Github. Este projeto de demonstração coleta dados do processador Jetson via conexão serial USB. Assim que os dados são recebidos, eles são exibidos na tela do V5 Brain e também transmitidos para um robô V5 parceiro que está conectado via VEXlink.
Nota: Este projeto requer a versão mais recente da extensão VS Code para V5. Baixe a extensão do código VS para V5 aqui.
NVIDIA Jetson Nano para comunicações cerebrais VEX V5
O processador Jetson contém um aplicativo que coleta os seguintes dados do software VEX AI:
Dados de localização do robô:
- Localização X,Y do robô em metros do centro do campo.
- Azimute (direção), elevação (inclinação), rotação (rolagem) do robô, tudo em radianos.
Dados de detecção de objetos (três tipos):
- Esses dados representam um objeto detectado pela câmera Intel VEX AI.
- Esses dados descrevem o objeto com referência à imagem da câmera.
- Os valores para X, Y, largura e altura estão em unidades de pixels. Os valores de pixel referem-se ao canto superior esquerdo da caixa de detecção de imagem e objeto. A resolução da imagem é 640x480.
Detecção de mapa (tipo dois):
- Esses dados representam a localização do objeto no campo no mesmo sistema de coordenadas do Sensor GPS, relatado em metros.
- Cada objeto também contém a localização do objeto em relação ao centro do campo. Os valores de X e Y estão em unidades de metros a partir do centro do campo em seus respectivos eixos. O valor de Z está em metros das peças do campo (altura).
Objeto de detecção (tipo três):
- Isso encapsula todas as informações sobre os objetos detectados.
- Cada objeto contém um valor que representa a classificação do objeto detectado. (ID da classe: 0 = GreenTriBall, 1 = RedTriBall, 2 = BlueTriBall)
- Cada objeto também contém uma probabilidade que representa a confiança da VEX AI na detecção. Isso ocorre após um filtro no model.py que remove detecções de baixa probabilidade.
- Além disso, a profundidade do objeto é relatada em metros pela câmera Intel VEX AI.
- A Detecção de Imagem e a Detecção de Mapa são anexadas a cada objeto para representar as coordenadas do objeto na imagem, bem como no mundo real.
Uma análise do programa ai_demo:
Principal.cpp
O padrão inclui para projetos VEX:
Declare uma instância da classe Jetson. Esta classe é usada para enviar solicitações de dados ao Jetson, bem como receber dados através da conexão serial USB.
#define MANAGER_ROBOT 1
Declare uma instância da classe robot_link. Este objeto será usado para conectar e transferir dados entre este robô e um robô parceiro. Este mesmo projeto pode ser baixado para dois robôs separados. Um robô precisará ter a linha:
//#define MANAGER_ROBOT 1
Antes de carregar o código no segundo robô, você precisará comentar essa linha:
A classe robot_link configura o VEXlink do robô e cuida da transmissão e recepção de dados entre os dois robôs. Não entraremos em detalhes neste artigo sobre como essa classe funciona. Seria uma boa ideia entender primeiro como funciona o VEXlink. Para obter informações mais detalhadas sobre o uso da API V5 VEXlink, este documento explica as novas bibliotecas e como usá-las de forma eficaz para comunicação entre robôs.
-
Manipuladores de eventos de competição
Uma das maiores diferenças entre VAIC e VRC é que não há período de controle do motorista. Em vez disso, existem dois períodos autónomos, o período de isolamento e o período de interação. Neste exemplo, existem rotinas separadas para cada período autônomo. Como a API VEX não suporta dois retornos de chamada diferentes, deve haver um sinalizador no programa para determinar qual rotina será executada. Neste programa de exemplo, o “firstAutoFlag” é usado para chamar a função de isolamento na primeira vez que o autônomo é habilitado, e a função de interação quando o autônomo é habilitado pela segunda vez. Uma coisa a notar é que se por algum motivo a partida precisar ser reiniciada, o programa de demonstração precisará ser reiniciado para que o firstAutoFlag possa ser reiniciado.
-
Principal()
Esta é a principal tarefa deste projeto. Ele começa chamando vexcodeInit() para configurar corretamente o ambiente VEXcode. A seguir, um objeto AI_RECORD local é declarado para armazenar os dados que recebemos do Jetson. Uma tarefa separada também é configurada para atualizar a tela com os dados mais atuais. O código dessa tarefa está contido no arquivo dashboard.cpp. O retorno de chamada autônomo também é registrado para tratar quando os períodos autônomos são iniciados.
O loop while() principal começa copiando os dados mais recentes do objeto jetson_comms para nosso objeto AI_RECORD local. Em seguida, ele passa as informações de localização do robô para o objeto de link para que possam ser transmitidas ao nosso robô parceiro. Depois de processar os dados, ele solicita mais dados do Jetson e dorme por 66 milissegundos. A taxa de pesquisa para esses dados é de 15 Hz. Não há razão para pesquisar mais rápido, pois os dados do sistema de IA são atualizados em cerca de 15 Hz.
Nota: os dados do mapa Jetson só precisam ser solicitados por uma única tarefa.