Índice:

Veículo autônomo: 7 etapas (com fotos)
Veículo autônomo: 7 etapas (com fotos)

Vídeo: Veículo autônomo: 7 etapas (com fotos)

Vídeo: Veículo autônomo: 7 etapas (com fotos)
Vídeo: 3 vezes que o Tesla evitou acidentes! #shorts #tesla #elonmusk #carrotesla #justosseguros 2024, Novembro
Anonim
Veículo Autônomo
Veículo Autônomo
Veículo Autônomo
Veículo Autônomo

Este projeto é um robô de navegação autônoma que tenta alcançar sua posição final evitando obstáculos em seu caminho. O robô será equipado com um sensor LiDAR que será usado para detectar objetos ao seu redor. Conforme os objetos são detectados e o robô se move, um mapa em tempo real é atualizado. O mapa será usado para salvar a localização dos obstáculos que foram identificados. Dessa forma, o robô não tentará novamente um caminho com falha para a posição de gol. Em vez disso, tentará caminhos que não têm obstáculos ou caminhos que ainda não foram verificados quanto a obstáculos.

O robô se moverá por duas rodas acionadas por motor DC e duas rodas de rodízio. Os motores serão fixados na parte inferior de uma plataforma circular. Os motores serão controlados por dois drivers de motor. Os drivers do motor receberão comandos PWM do processador Zynq. Todos os codificadores em cada motor podem ser usados para rastrear a posição e a orientação dos veículos. Todo o sistema será alimentado por uma bateria LiPo.

Etapa 1: montagem do veículo

Montagem do veículo
Montagem do veículo
Montagem do veículo
Montagem do veículo
Montagem do veículo
Montagem do veículo
Montagem do veículo
Montagem do veículo

O robô é movido por dois motores acoplados às rodas laterais e, adicionalmente, é suportado por duas rodas giratórias, uma na frente e outra atrás. A plataforma e os suportes do motor foram feitos de chapa de alumínio. Um cubo do motor foi comprado para prender as rodas ao motor. No entanto, um acoplador intermediário personalizado precisava ser feito porque o padrão de orifícios do cubo era diferente do padrão de orifícios da roda.

O motor selecionado foi um motor Port Escap 12V DC com codificadores integrados. Este motor pode ser adquirido no ebay por um preço bastante razoável (ver Lista de Materiais). Pesquise as palavras-chave “12V Escap 16 Coreless Gear DC Motor with Encoders” no ebay para encontrar o motor. Normalmente, há uma boa quantidade de vendedores para escolher. As especificações e pinagens dos motores são mostradas nos diagramas abaixo.

A montagem do robô começou com um modelo CAD do chassi. O modelo abaixo mostra a vista superior do perfil de forma 2D projetado para o chassi.

Sugere-se que o chassi seja projetado como um perfil 2D para que possa ser facilmente fabricado. Cortamos uma folha de alumínio de 12”X12” no formato do chassi usando um cortador de jato de água. A plataforma do chassi também pode ser cortada com uma serra de fita.

Etapa 2: montagem de motores

Motores de montagem
Motores de montagem
Motores de montagem
Motores de montagem

A próxima etapa é fazer os suportes do motor. É sugerido que os suportes do motor sejam feitos de chapa de alumínio de 90 graus. Usando esta peça, o motor pode ser fixado em cantilever em uma face da folha de metal usando os dois

Os furos M2 do motor e a outra face podem ser aparafusados na plataforma. Os orifícios devem ser perfurados no suporte do motor para que os parafusos possam ser usados para fixar o motor no suporte do motor e o suporte do motor na plataforma. O suporte do motor pode ser visto na figura acima.

Em seguida, o cubo do motor Pololu (consulte a lista de materiais) é colocado no eixo do motor e apertado com o parafuso de ajuste e a chave Allen fornecidos. O padrão de orifícios do cubo do motor Pololu não corresponde ao padrão de orifícios da roda VEX, portanto, um acoplador intermediário personalizado deve ser feito. Sugere-se que a sucata de chapa de alumínio usada para fazer a plataforma do chassi seja usada para fazer o acoplador. O padrão de orifícios e as dimensões deste par são mostrados na figura abaixo. O diâmetro externo e a forma (não precisa ser um círculo) do acoplador de alumínio personalizado não importam, desde que todos os furos se encaixem na peça.

Etapa 3: Criando Desenho de Bloco Vivado

Criando Vivado Block Design
Criando Vivado Block Design
Criando Vivado Block Design
Criando Vivado Block Design

- Comece criando um novo projeto Vivado e selecione o Zybo Zynq 7000 Z010 como o dispositivo de destino.

- Em seguida, clique em criar novo design de bloco e adicione o IP Zynq. Clique duas vezes no IP do Zynq e importe as configurações XPS fornecidas para o Zynq. Em seguida, habilite UART0 com MIO 10..11 na guia MIO configurations, e também certifique-se de que Timer 0 e Watchdog timer estejam habilitados.

- Adicione dois AXI GPIOS ao design do bloco. Para GPIO 0, ative o canal duplo e defina ambos para todas as saídas. Defina a largura do GPIO para o canal 1 em 4 bits e para o canal 2 em 12 bits, esses canais serão usados para definir a direção do motor e enviar a quantidade de tiques que o codificador mede para o processador. Para GPIO 1, defina apenas um canal para todas as entradas com uma largura de canal de 4 bits. Isso será usado para receber dados dos codificadores. Torne todas as portas GPIO externas.

- Em seguida, adicione dois temporizadores AXI. Torne as portas pwm0 em ambos os temporizadores externas. Esses serão os pwms que controlam a velocidade de rotação dos motores.

- Por fim, execute a automação de bloco e automação de conexão. Verifique se o design do bloco que você possui corresponde ao fornecido.

Etapa 4: comunicação com o LiDAR

Este LiDAR usa um protocolo SCIP 2.0 para se comunicar por meio de UART, o arquivo anexado descreve todo o protocolo.

Para nos comunicarmos com o LiDAR, usaremos o UART0. O LiDAR retorna 682 pontos de dados, cada um representando a distância de um objeto naquele ângulo. O LiDAR faz a varredura no sentido anti-horário de -30 graus a 210 graus com um passo de 0,351 graus.

- Toda a comunicação com o LiDAR é feita com caracteres ASCI, consulte o protocolo SCIP para o formato usado. Começamos enviando o comando QT para ligar o LiDAR. Em seguida, enviamos o comando GS várias vezes solicitando 18 pontos de dados de cada vez para se encaixar no UARTS de 64 bytes FIFO. Os dados retornados do LiDAR são então analisados e armazenados no array global SCANdata.

- Cada ponto de dados armazenado é 2 bytes de dados codificados. Passar esses dados para o decodificador retornará uma distância em milímetros.

No arquivo main_av.c você encontrará as seguintes funções para se comunicar com o LiDAR

sendLIDARcmd (comando)

- Isso enviará a string de entrada para o LiDAR por meio do UART0

recvLIDARdata ()

- Receberá dados após o envio de um comando para o LiDAR e armazenará os dados no RECBuffer

requestDistanceData ()

- Esta função enviará uma série de comandos para recuperar todos os 682 pontos de dados. Depois que cada conjunto de 18 pontos de dados é recebido, parseLIDARinput () é chamado para analisar os dados e armazenar incrementalmente os pontos de dados em SCANdata.

Etapa 5: Preencher a grade com obstáculos

Preenchendo grade com obstáculos
Preenchendo grade com obstáculos
Preenchendo grade com obstáculos
Preenchendo grade com obstáculos

O GRID armazenado é uma matriz 2D com cada valor de índice representando um local. Os dados armazenados em cada índice são 0 ou 1, Nenhum obstáculo e obstáculo, respectivamente. A distância quadrada em milímetros que cada índice representa pode ser alterada com a definição GRID_SCALE no arquivo vehicle.h. O tamanho da matriz 2D também pode ser variado para permitir que o veículo varra uma área maior, modificando a definição GRID_SIZE.

Depois que um novo conjunto de dados de distância é varrido do LiDAR, updateGrid () é chamado. Isso irá iterar por meio de cada ponto de dados armazenado na matriz SCANdata para determinar quais índices na grade têm obstáculos. Usando a orientação atual do veículo, podemos determinar o ângulo que corresponde a cada ponto de dados. Para determinar onde está um obstáculo, basta multiplicar a distância correspondente por cos / sin do ângulo. Adicionar esses dois valores às posições xey atuais dos veículos retornará o índice na grade do obstáculo. Dividir a distância retornada por esta operação pelo GRID_SCALE nos permitirá variar o quão grande é a distância quadrada de cada índice.

As imagens acima mostram o ambiente atual dos veículos e a grade resultante.

Etapa 6: comunicação com motores

Para se comunicar com os motores, começamos inicializando os GPIOs para controlar a direção em que o motor gira. Em seguida, escrever diretamente para o endereço base dos PWMs no temporizador AXI nos permite definir coisas como o período e o ciclo de trabalho que controlam diretamente o velocidade em que o motor gira.

Etapa 7: Planejamento do Caminho

Para ser implementado em um futuro próximo.

Usando a grade e a funcionalidade do motor descritas anteriormente, é muito fácil implementar algoritmos como A *. Conforme o veículo se move, ele continuará a examinar a área circundante e determinar se o caminho em que está ainda é válido

Recomendado: