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 é:
- controlador
- motores de hélice
- bateria
- controlador de velocidade (ESC),
- antena de telemetria
- Módulo GPS e bússola,
- 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:
- o helicóptero não voa sem problemas
- erros de sua telemetria ± medidor ou mais,
- 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!