Python + Raspberry Pi + Pixhawk e quadrocopter. Ou como não fazer robôs

Olá Habr!

Meu nome é Aleksey, há 7 anos sou desenvolvedor líder de soluções de Smart TV em uma grande empresa de desenvolvimento personalizado de Izhevsk. Todos os anos realizamos um concurso de decorações de ano novo e, a cada vez, não decoramos nada, mas cortamos todo tipo de coisas tecnológicas. Dessa vez, eles cruzaram o drone e o aplicativo Smart TV. E o que veio disso - leia abaixo.

A ideia era bastante viável. Eles queriam fazer um quadrocóptero na forma de trenó do Papai Noel, que entregaria presentes para os funcionários no escritório com a música. Ao mesmo tempo, ele teve que navegar no espaço com a ajuda da análise ArUco-tags, interagindo com aplicativos de TV (“soprando” fumaça de canos com parafusos de trabalho, esgotando animais para encontrar / ver o quadrocóptero).

E pelos três meses. Claro, não tivemos tempo.

Embora em momentos diferentes até sete pessoas tenham trabalhado no projeto, o resultado estava longe de ser o ideal. Em geral, aprendemos apenas como iniciar um helicóptero e escrevemos aplicativos para TVs. Configure a interação do quadrocopter com as TVs. Mas as primeiras coisas primeiro.



Não me lembro em cuja cabeça doente (certamente não na minha, mas isso não é exato) surgiu a idéia de lançar um bombardeiro quadrocopter no escritório. A tarefa é nova e não é fácil, mas não encontramos nada além da nossa força. Sim, vasculhamos a Internet com o objetivo de encontrar uma biblioteca para controlar o controlador de helicóptero. Sim, foi necessário transferir a imagem de fluxo da webcam para o cliente e analisá-la no servidor. Sim, era necessário fazer um portão de bombas. Sim, você geralmente deve escrever um shell que colete tudo isso por si só. E daí? Já fizemos tudo isso (exceto para controlar o controlador). Portanto, o projeto recebeu uma luz verde.

Dispositivo


Cada erro evolutivo de um helicóptero zumbindo acima de sua cabeça, em princípio, consiste em um conjunto de mecanismos e esquemas. Isto é:

  1. controlador
  2. motores de hélice
  3. bateria
  4. controlador de velocidade (ESC),
  5. antena de telemetria
  6. Módulo GPS e bússola,
  7. a câmera

Os dois últimos pontos são opcionais. O diagrama de circuito do amigo da aeronave pode ser visto aqui:



Este bem é colocado no caso. No entanto, o corpo decidiu fazer o seu próprio. Porque:

  • -se com bigode
  • precisava de um casco exatamente na forma de um trenó,
  • já era indecentemente caro.

Controlador




A parte mais importante de qualquer larva de helicóptero. Possui acelerômetros em três eixos, firmware de software, entradas para instalação de equipamentos periféricos e conexão de motores e uma saída para controle. Sem ele, nenhum drone voará no ar. A peça é tão importante que é montada em uma plataforma especial de absorção de choque para reduzir os efeitos das vibrações e cargas de choque. Algo assim:



Escolhemos um controlador relativamente importante. “Relativamente”, porque então eu olhei mais de perto os monstros oferecidos para tios sérios ... No entanto, o controlador possui GPS, bússola, piloto automático, todos os tipos de outros bons pães, suporta até 8 motores.

A rigor, esses controladores destinam-se não apenas a uma fraternidade verticalmente crescente. Eles podem ser instalados em qualquer plataforma móvel, desde helicópteros, aeronaves, terminando com carros e barcos. Vários casos de uso. Mas estávamos um pouco distraídos.

Motores




Existem muitos desses amigos. Redondo, quadrado, curvas, oblíquo, grande, pequeno, caro e barato. A principal diferença: consumo máximo de energia, força atual e o número de rotações por segundo. Idealmente, o trenó deveria ter conseguido levantar uma lata de cerveja (0,5 kg). Tendo estimado o peso total da estrutura, calculamos a força de elevação necessária aproximada e levamos motores potentes de alta qualidade. Como se viu depois, eles nunca funcionaram com capacidade total. Mas melhor é mais do que menos ...

Bateria




A única fonte de energia através da qual um kamikaze potencial permanecerá no ar. Durante a operação, vários pontos interessantes foram descobertos.

Primeiro, o zumbido da tecnologia consome energia de graça. A lata é desembarcada no momento e demora muito para carregar.

Em segundo lugar, ele não apenas come, mas também sabe como deixar uma cobrança "em reserva". A idéia é boa, porque quando a tensão limite é atingida, o carro interrompe o voo e faz uma aterrissagem suave, mas isso se expressa no fato de que a lata “aterrissou” ainda mais rápido.

Controlador de velocidade




Um chip pequeno, sem o qual os motores simplesmente não funcionam. Projetado para distribuição de tensão dos bancos ao motor. Uma coisa muito importante, geralmente vem com um motor adquirido.

Antena de telemetria


"

Em essência, o equipamento periférico, no entanto, sem ele, não será possível controlar o ramo sem saída do desenvolvimento de objetos voadores. Além disso, a telemetria é usada não apenas para controle, mas também para transmitir o sinal de vídeo da câmera; portanto, geralmente existem duas antenas. A propósito, a telemetria é realizada enviando e transmitindo sinais para uma lista de canais. Eles também podem ser controlados programaticamente, mas isso não é recomendado categoricamente, porque é assim que abandonamos o piloto automático com fio e escrevemos o nosso. No joelho. E substâncias e paus. Na última noite. Como amamos.

Módulo GPS




A principal e quase a única maneira de posicionar um destruidor de nervos voadores no espaço. Normalmente, o módulo GPS também contém uma bússola. Para que nada o influencie no vôo, o módulo é colocado em uma barra especial para que nada o influencie. Nós o usamos apenas para o bem da bússola, porque na sala o GPS não é muito bom em capturar. Suporta outros sistemas de posicionamento.

Como qualquer GPS que se preze, pode cometer erros. O erro varia de vários metros a vários continentes. Mas, em geral, um dispositivo necessário na rua para missões à distância.

Camera




Aquilo para o qual tudo é feito. A tempestade de aeroportos ingleses não pode apenas conversar sob uma câmera. O controlador pode estabilizar, controlá-lo remotamente e fornecer configurações e ferramentas muito detalhadas para seu gerenciamento. Mas não usamos tudo. Outra hora.

Gerência


Todos os trabalhos de engenharia da sapiens usando controladores são essencialmente controlados por um programa: Mission Planer. Parece algo como isto:



Leia mais sobre isso aqui .

Apresenta a mais ampla gama de recursos e configurações. Há um planejamento de tarefas de voo, posicionamento geográfico, controle manual, várias configurações e calibração de equipamentos.

Regra número 1: use apenas o que você precisa


Sim, o programa é necessário e útil. Em princípio. Mas não para a nossa tarefa, porque o divisor de ar deve ser controlado de forma programática, e perdemos muito tempo para lidar com esse agendador.

O controle manual em si pode ser feito do jeito que seu coração deseja. Existem configurações para o controle remoto, para o joystick. Você pode exibir o controle no mouse e teclado. O principal requisito é calibrar o painel de controle. Bem, gerencie manualmente. Como somos desenvolvedores preguiçosos, não queremos gerenciar manualmente. Eu queria que a aeronave voasse sozinha.

Controle de programa


Na Internet, eles encontraram apenas essa biblioteca, projetada para o controle programático da semelhança de uma aeronave. E está escrito (drum roll) em python. Em geral, para as versões 2.x, mas também no Python 3.5, funcionava de maneira bastante estável. A biblioteca possui funcionalidade rica e documentação relativamente boa. Mas antes de começar a escrever seu código de drone de controle mega, primeiro você precisa ... Sim, você precisa se conectar ao controlador.

O microcomputador Raspberry Pi foi usado como o componente do software de controle, no qual o servidor da web foi implantado na estrutura aiohttp.

O esquema e as instruções para conectar as "framboesas" e o controlador podem ser encontrados aqui .

Esquematicamente, fica assim:



O método de conexão é este. O controlador e as framboesas são conectados por fios de acordo com o esquema especificado. Dessa maneira, o sinal de rádio enviado e recebido pelo controlador é emulado. Em framboesas, você precisa executar um servidor proxy, que se agarra ao controlador e transfere dados dele. A conexão pode ser feita via telemetria ou via USB. Eles usam portas COM diferentes. A figura mostra o método por telemetria.

Regra número 2: documentação incompleta. Muitas vezes, não escreva as coisas mais óbvias.


Por exemplo, para conectar-se do python ao controlador, você deve especificar o endereço e a porta: connectionString = '127.0.0.1:14540'

Porém, esse endereço e porta também devem ser especificados na linha de inicialização do servidor proxy. Aqui:

mavproxy.py —master=/dev/ttyAMA0 —baudrate 921600 —aircraft MyCopter 

Sim, isso é óbvio, mas nunca óbvio. E gastamos muito tempo para descobrir isso.

No entanto, mesmo depois de iniciar o proxy com a linha correta e depois de conectar-se com sucesso ao drone python, o milagre da técnica hostil não quis começar. Ou seja, recebemos dados do helicóptero, nós os vemos, mas a futura ameaça celestial da humanidade se recusa a executar comandos. No último momento, descobriu-se que os dados para conexão com o drone precisavam de muito mais. Condicionalmente, ele deve começar a enviar dados para a telemetria conectada; caso contrário, ele simplesmente não os conectou e ficou satisfeito.

Daí a regra número 3: use USB


Sim, a documentação era muito menor, mas a estabilidade da conexão seria definitivamente maior. Porque eu não precisaria usar alfinetes de framboesa.

Voo de teste




E de repente descobriu-se que:

  1. o helicóptero não voa sem problemas
  2. erros de sua telemetria ± medidor ou mais,
  3. Para um voo, tarefas como: subir de 10 a 20 metros, voar 100 metros para o norte, etc.

Deixe-me lembrá-lo que este design, criado sob a influência de helicópteros do filme "Avatar", foi lançado dentro das paredes do escritório, onde há muitos equipamentos de escritório, luminárias, ventilação e decoração pendurados no teto. Bem, também há funcionários. Em geral, rapidamente ficou claro que um vôo interno sério seria carregado com 160 cabeças decepadas.

Regra número 4: use condições normais de teste


Se um tanque voador tiver um tamanho de 50 por 60 cm, sua presença no ar em um espaço fechado levará inevitavelmente a danos a ele ou a pessoas próximas. Uma área de teste ideal seria uma sala do tamanho de uma academia.

Visão computacional


Um portal separado para o inferno era a tarefa da visão por computador. A idéia é ler as tags ArUco, cada uma com uma posição registrada no plano da sala e em relação à qual o helicóptero determina sua posição no espaço, bem como a posição relativa ao ponto atual da rota.

Exemplo de etiqueta:



Para implementação, foi utilizada a biblioteca openCV . É usado para reconhecer em geral tudo o que é, em particular: rostos de pessoas, objetos, números de carros e nossas marcas. Instalar a biblioteca no sistema operacional raspberry - Rasbian - se tornou um pesadelo, com o qual quatro pessoas lutaram alternadamente. No entanto, resolvemos com sucesso, e agora a máquina "aprendeu" a reconhecer marcas no fluxo de vídeo da webcam. Mas, novamente, não houve tempo suficiente para configurar tudo. Por exemplo, a partir de duas ou mais tags, a biblioteca retornou os números reconhecidos de todas as tags e os dados apenas para um. Porque Há um grande mistério ...

A regra é importante: aloque tempo suficiente para refinar a solução


Outros sentidos


Para que o mutante das asas de Ícaro não grude nos obstáculos que surgem repentinamente, eles queriam usar sensores de distância. Eles deveriam estar em todos os lados do carro e tiveram que sinalizar a aproximação de um obstáculo, como resultado do qual o helicóptero deveria parar, dar um “passo para o lado” e continuar avançando ao longo da rota.

Não tivemos tempo para executar essa funcionalidade.

Rotas


Conversamos muito sobre as rotas de vôo do helicóptero. E que tipo de animais são eles? Eu direi imediatamente que essa funcionalidade foi implementada pela primeira e na íntegra, mas ... não foi útil.

As rotas de movimento são um gráfico conectado com vértices, cada um com sua coordenada tridimensional no espaço da sala. Por conseguinte, o helicóptero deve seguir do ponto de partida até o ponto de chegada, no último realizar a missão de vôo. Segue movendo do vértice atual para o próximo. Como para cada vértice conhecemos suas coordenadas, e no helicóptero sabemos sua localização (bússola) e posição (marcas), então descobrir para onde voar é uma questão puramente técnica. A tarefa de encontrar o caminho entre o ponto inicial e o final é resolvida por uma função recursiva. Rotas, arestas e picos são armazenados em um banco de dados implantado em framboesas.

A última regra: faça apenas o que você precisa implementar


Pilha tecnológica


Copter: Raspberry Pi , Rasbian , OpenCV , Python 3.5 , aiohttp , DroneKit , RPi.GPIO , SQLite .

Servidor com dinâmica para TV: node.js , Express , socket.io .

Aplicativos de TV: JavaScript ES6 , webpack 2 , Canvas .

Repositório com código de helicóptero aqui . Para estrelas - vantagens no karma.

Algumas palavras para esclarecer os termos (peço que você considere as classificações subjetivas).

  • Raspberry Pi. Microcomputador completo com pinos e saídas disponíveis para uma câmera especial e tela sensível ao toque. É nele que está localizado o código de controle, servidor web, biblioteca openCV. De fato, um helicóptero é um servidor voador.
  • Raspbian Sistema operacional Linux para framboesas. Existem vários deles e, em geral, você pode colocar qualquer um, mas é melhor colocar outros especialmente projetados, caso contrário, pode haver problemas com a interação com equipamentos de computador, com os mesmos pinos, por exemplo. Existe até uma versão adaptada do Windows 10.
  • OpenCV. Biblioteca para reconhecer elementos em um fluxo de vídeo. Também sabe como transmitir o fluxo de vídeo, usado no projeto para emitir imagens para o cliente. (sim, o helicóptero tem seu próprio cliente da web)
  • Python 3.5. Python 3.5 Não 2. *.
  • Aiohttp. Estrutura de servidor da Web assíncrona escrita em python. Por alguma razão, ele gostou mais do Django . Mas há uma escolha.
  • DroneKit. Biblioteca para conectar ao controlador de helicóptero a partir do programa. Funcionalidade muito rica, juntamente com documentação relativamente boa. Na ausência de análogos - uma ferramenta brilhante.
  • RPi.GPIO. Biblioteca Python para interagir com pinos de framboesa. Permite ativar e desativar os pinos, ouvir seus valores. Não é possível transmitir valores diferentes de 0 ou 1-ts. Ou eu não encontrei.
  • SQLite DBMS + DB + lenha combinados em um arquivo. Ideal para projetos de treinamento e não vendas, se você não precisar implantar algo com muita carga. Conveniente para fazer alterações.
  • Node.js. JavaScript do lado do servidor
  • Express Estrutura do servidor da Web escrita em node.js. Muito confortável e minimalista.
  • Socket.io. Biblioteca de servidor e cliente para implementar o protocolo webSocket. A principal vantagem é a estabilidade do trabalho e a ampla funcionalidade fornecida.

Conclusões


Na formulação original, a tarefa é viável, embora exija muito mais tempo e esforço. Devido ao fato de que os métodos de controle de piloto automático e helicóptero estão um pouco menos do que totalmente vinculados ao GPS, eles devem ser abandonados na direção de comandos diretos para os canais de controle. Isso requer a necessidade de escrever o piloto automático, que é a tarefa que está sendo resolvida. E então - para testar, testar e testar.

Pessoalmente, eu estava interessado. E eu vou fazer o bombardeiro automático de presente de qualquer maneira. E para todos os interessados, talvez, eu deixo

A única regra é: defina metas altas e difíceis e vá até elas!


Boa sorte a todos!

Source: https://habr.com/ru/post/pt438496/


All Articles