Índice:

Tutorial de detecção de objetos do robô Jetson Nano quadrúpede: 4 etapas
Tutorial de detecção de objetos do robô Jetson Nano quadrúpede: 4 etapas

Vídeo: Tutorial de detecção de objetos do robô Jetson Nano quadrúpede: 4 etapas

Vídeo: Tutorial de detecção de objetos do robô Jetson Nano quadrúpede: 4 etapas
Vídeo: Jetson Nano Quadruped Robot Object Detection + Teleoperation 2024, Junho
Anonim
Image
Image

O Nvidia Jetson Nano é um kit de desenvolvedor, que consiste em um SoM (System on Module) e uma placa de portadora de referência. Ele é voltado principalmente para a criação de sistemas embarcados que requerem alto poder de processamento para aplicativos de aprendizado de máquina, visão de máquina e processamento de vídeo. Você pode assistir a uma análise detalhada sobre ele no meu canal no YouTube.

A Nvidia tem tentado tornar o Jetson Nano o mais amigável e fácil de desenvolver projetos possível. Eles até lançaram um pequeno curso sobre como construir seu robô com o Jetson Nano, dias após o lançamento da placa. Você pode encontrar os detalhes sobre esse projeto aqui.

No entanto, eu mesmo tive alguns problemas com o Jetbot como projeto:

1) Não foi EPIC o suficiente para mim. Jetson Nano é uma placa muito interessante com grandes capacidades de processamento e fazer um robô com rodas simples parecia uma coisa muito … nada assombrosa de se fazer.

2) A escolha do hardware. O Jetbot requer alguns hardwares que são caros / podem ser substituídos por outras alternativas - por exemplo, eles usam joystick para teleoperação. Parece divertido, mas eu realmente preciso de um joystick para controlar um robô?

Então, imediatamente após colocar minhas mãos no Jetson Nano, comecei a trabalhar em meu próprio projeto, um Jetspider. A ideia era replicar as demos básicas que o Jetbot tinha, mas com hardware mais comum e aplicável a uma variedade maior de projetos.

Etapa 1: Prepare o seu hardware

Prepare Seu Hardware
Prepare Seu Hardware

Para este projeto eu usei um protótipo inicial do robô quadrúpede Zuri, feito pela Zoobotics. Ele ficou parado no laboratório da nossa empresa por um longo tempo. Eu o equipei com um suporte de madeira cortado a laser para Jetson Nano e um suporte para câmera. Seu design é proprietário, portanto, se você quiser criar algo semelhante para o seu robô Jetson Nano, dê uma olhada no projeto Meped, que é um quadrúpede semelhante com um design de código aberto. Na verdade, como ninguém tinha o código-fonte do microcontrolador do Zuri (Arduino Mega) em nosso laboratório, usei o código do Meped com alguns pequenos ajustes no deslocamento das pernas / pés.

Usei uma webcam compatível com USB Raspberry Pi e um dongle USB Wifi.

O ponto principal é que, como usaremos o Pyserial para comunicação serial entre o microcontrolador e o Jetson Nano, seu sistema pode basicamente usar qualquer tipo de microcontrolador, desde que possa ter interface com o Jetson Nano com cabo serial USB. Se o seu robô usa motores DC e um driver de motor (por exemplo, baseado em L298P), é possível fazer a interface direta do driver do motor com o Jetson Nano GPIO. Mas, infelizmente, para controlar servos você só pode usar outro microcontrolador ou um servo driver I2C dedicado, já que o Jetson Nano não possui hardware GPIO PWM.

Para resumir, você pode usar o tipo de robô com qualquer microcontrolador que pode ser conectado ao Jetson Nano usando um cabo de dados USB. Eu carreguei o código do Arduino Mega para o repositório github para este tutorial e a parte relevante para fazer a interface do Jetson Nano com o Arduino está aqui:

if (Serial.available ()) {switch (Serial.read ()) {

{

caso 1':

frente();

pausa;

caso '2':

de volta();

pausa;

caso '3':

Vire à direita();

pausa;

caso '4':

Vire à esquerda();

pausa;

Verificamos se há dados disponíveis e, em caso afirmativo, passamos para a estrutura de controle da caixa de comutação. Preste atenção, que os dados da série vêm como caracteres, observe as aspas simples ao redor dos números 1, 2, 3, 4.

Etapa 2: Instale os pacotes necessários

Felizmente para nós, a imagem do sistema Jetson Nano padrão vem com muitas coisas pré-instaladas (como OpenCV, TensorRT, etc), então só precisamos instalar alguns outros pacotes para fazer o código funcionar e habilitar o SSH.

Vamos começar habilitando o SSH caso você queira fazer todo o resto do trabalho remotamente.

atualização do apt sudo

sudo apt install servidor openssh

O servidor SSH será iniciado automaticamente.

Para se conectar à sua máquina Ubuntu pela LAN, você só precisa inserir o seguinte comando:

ssh username @ ip_address

Se você tiver uma máquina Windows, precisará instalar o cliente SSH, por exemplo Putty.

Vamos começar instalando o Python Package Manager (pip) e o Pillow para manipulação de imagens.

sudo apt install python3-pip python3-pil

Em seguida, instalaremos o repositório Jetbot, já que estamos contando com algumas partes de sua estrutura para realizar a detecção de objetos.

sudo apt install python3-smbus python-pyserial

git clone

cd jetbot

sudo apt-get install cmake

sudo python3 setup.py install

Finalmente clone meu repositório Github para este projeto em sua pasta pessoal e instale o Flask e alguns outros pacotes para o controle remoto do robô usando o servidor web.

git clone

CD

sudo pip3 install -r requisitos-opencv

Baixe o modelo pré-treinado SSD (Single Shot Detector) deste link e coloque-o na pasta jetspider_demos.

Agora estamos prontos para ir!

Etapa 3: execute o código

Execute o código
Execute o código

Fiz duas demos para Jetspider, a primeira é uma teleopração simples, muito semelhante à que fiz antes para o rover Banana Pi e a segunda usa TensorRT para detecção de objetos e envia os comandos de movimento pela conexão serial para o microcontrolador.

Uma vez que a maior parte do código de teleopração é descrito em meu outro tutorial (eu só fiz alguns pequenos ajustes, reavaliando a transmissão de vídeo) aqui vou me concentrar na parte de Detecção de Objeto.

O script principal para o objeto seguinte é object_following.py em jetspider_object_following, para teleoperação é spider_teleop.py em jetspider_teleoperation.

O script que segue o objeto começa importando os módulos necessários e declarando variáveis e instâncias de classe. Em seguida, iniciamos o servidor da web Flask com esta linha

app.run (host = '0.0.0.0', threaded = True)

Assim que abrirmos o endereço 0.0.0.0 (localhost) em nosso navegador ou o endereço Jetson Nano na rede (pode verificar com o comando ifconfig), esta função será executada

índice def ():

Ele renderiza o modelo de página da web que temos na pasta de modelos. O template possui a fonte de vídeo embutida nele, então assim que terminar o carregamento, def video_feed (): será executado, que retorna um objeto Response que é inicializado com a função do gerador.

O segredo para implementar atualizações no local (atualização de imagem na página da web para nosso fluxo de vídeo) é usar uma resposta multiparte. As respostas multipartes consistem em um cabeçalho que inclui um dos tipos de conteúdo multipartes, seguido pelas partes, separadas por um marcador de limite e cada uma com seu próprio tipo de conteúdo específico.

Em def gen (): function implementamos a função geradora em um loop infinito que captura a imagem, a envia para def execute (img): function, gerando uma imagem a ser enviada para a página da web em seguida.

def execute (img): a função é onde toda a mágica acontece, ela pega uma imagem, a redimensiona com OpenCV e a passa para a instância de classe "modelo" do Jetbot ObjectDetector. Ele retorna retorna a lista de detecções e usamos OpenCV para desenhar retângulos azuis ao redor deles e escrever anotações com a classe do objeto detectado. Depois disso, verificamos se há um objeto de nosso interesse detectadomatching_detections = [d for d nas detecções [0] if d ['label'] == 53]

Você pode alterar esse número (53) para outro número do conjunto de dados CoCo se quiser que seu robô siga outros objetos, 53 é uma maçã. A lista inteira está no arquivo categories.py.

Por fim, se nenhum objeto for detectado por 5 segundos, transmitimos o caractere "5" para que o robô pare no serial. Se o objeto for encontrado, calculamos a que distância ele está do centro da imagem e agimos de acordo (se estiver perto do centro, siga em frente (caractere "1" na série), se estiver à esquerda, vá para a esquerda, etc). Você pode brincar com esses valores para determinar o melhor para sua configuração particular!

Etapa 4: considerações finais

Pensamentos finais
Pensamentos finais

Esta é a essência da demo ObjectFollowing, se você quiser saber mais sobre o streaming de vídeo do Flask webserver, pode dar uma olhada neste ótimo tutorial de Miguel Grinberg.

Você também pode dar uma olhada no bloco de notas Nvidia Jetbot Object Detection aqui.

Espero que minhas implementações de demos do Jetbot ajudem a construir seu robô usando o framework Jetbot. Não implementei a demonstração para evitar obstáculos, pois acho que a escolha do modelo não produzirá bons resultados para evitar obstáculos.

Adicione-me ao LinkedId se tiver alguma dúvida e inscreva-se no meu canal no YouTube para ser notificado sobre projetos mais interessantes envolvendo aprendizado de máquina e robótica.

Recomendado: