Como eu fiz um traje de captura de movimento
Prefácio
Na minha pequena cidade, estou empenhado em resolver problemas técnicos não triviais. Então, desta vez, os organizadores de um show, no qual a ginasta deveria se apresentar com seu programa, decidiram adicionar um "destaque" à sua performance. Nomeadamente, exibir a silhueta de uma ginasta nas telas, que repetia seus movimentos e de alguma forma interagia com outros efeitos, para que tudo fosse interativo. Não foi possível resolver o problema "testa". O Kinect claramente não conseguiu lidar com sua tarefa e não foi capaz de capturar os movimentos de uma pessoa a pelo menos 10 metros dele, também no escuro. Por isso, foi decidido fazer algo "próprio". Olhando para o futuro, direi que o desempenho não ocorreu, mas fiquei tão empolgado com a ideia de continuar meus experimentos como um projeto separado, que mais tarde foi chamadoimpulso .Introdução
Comecei a prototipar o futuro dispositivo assim que recebi os componentes necessários. Ou seja:- O Arduino UNO é um conhecido designer de controladores, que permite desenvolver um protótipo em pouco tempo.
- HC-06 - módulo bluetooth, servirá como um meio de comunicação sem fio. O módulo é muito simples, possui uma interface UART.
- MPU-6050 - os únicos sensores de inércia disponíveis para mim naquele momento. Eu comprei imediatamente 2 para verificar como eles funcionam em pares, porque no futuro é necessário usar até 15 sensores em um sistema. Este sensor combina um acelerômetro e um giroscópio, além de um sensor de temperatura para ajustar a saída.
Tendo recebido tudo desta lista, eu já estava ansioso para ver o mpu em ação. No fórum oficial do Arduino, havia vários exemplos de uso desses sensores e eu usei um deles. Para conectar os sensores, são utilizados 5 pinos (contatos):- VCC, GND - tudo está claro, poder e terra. Vale a pena notar que a tensão de trabalho do sensor é de 3,3v, mas em 5v ela se sente bem. Consumo de energia inferior a 0,05Ah
- SCL, SDA - na verdade, os pinos através dos quais há uma "comunicação" com o sensor. Esses pinos são responsáveis pela interface i2c. Essa interface implementa a alternância entre dispositivos no mesmo barramento, ou seja, o barramento é a rua e as casas nele são os dispositivos.
- PIN INT para interrupções. Assim que os dados no sensor estiverem prontos, o controlador principal os interrompe.
No entanto, este exemplo exibia apenas valores "brutos" do acelerômetro no terminal, e o código foi escrito para converter em ângulos familiares, e então o Kalman Filter foi implementado, e tudo isso já ocupava cerca de 70% dos recursos do Arduino UNO. No entanto, já havia valores bastante suaves dos ângulos chegando ao terminal, o dispositivo era bastante rápido no espaço, embora apenas alguns minutos, após os quais o buffer FIFO estava cheio. Mas funcionou!
Estabilizar!
Gradualmente, a alegria do sensor em funcionamento foi ofuscada pela duração de todo o sistema. Por mais que eu não tenha lutado com o buffer FIFO, ele transbordou. Vale a pena notar que naquela época havia pouca informação sobre esses sensores e sistemas geralmente semelhantes, e isso tinha que ser coletado literalmente pouco a pouco. Tendo decidido que o problema está na implementação da interface i2c, comecei a pesquisar nessa direção e encontrei a biblioteca de usuários I2Cdev, projetada para substituir a biblioteca de fios padrão do arduino. Uma surpresa agradável foram os exemplos aninhados de uso dessa biblioteca em conjunto com o mpu-6050. Depois de reconstruir o projeto nesta biblioteca, também recebi dados brutos e os converti em cantos com meu código, mas não houve mais estouros. Esta foi uma pequena vitória. Mais tarde, enquanto estudava o interior da biblioteca, encontrei muitas coisas úteis. Então por exemploagora usando dados de ambos os sensores - e o acelerômetro e o giroscópio. O fato é que o acelerômetro permite determinar os ângulos de inclinação exatos do dispositivo apenas em repouso até que forças externas atuem nele, e o giroscópio é projetado para compensar essas mesmas forças. O uso de dados de ambos os sensores tornou-se óbvio, e aqui um filtro complementar encontrou aplicação. No entanto, houve um problema de desvio zero, mas mais tarde.!
E novamente um recife. Desta vez, o problema que veio antes de mim era usar o segundo sensor mpu-6050. Eu já fiz uma analogia da interface i2c neste artigo, onde o ônibus é a rua e os dispositivos estão em casa. Imagine que um pacote de dados que deve alcançar um dispositivo específico seja um carteiro. O carteiro precisa de duas coisas - o pacote e o endereço, e cada casa tem seu próprio endereço exclusivo, e os dispositivos devem ter seus próprios endereços. O problema está precisamente no endereço do sensor mpu-6050, é um para todos esses sensores - 0x68. Este endereço é piscado no controlador do sensor na fábrica, mas não é possível encontrar o firmware e alterar o endereço de cada sensor. Fóruns estrangeiros deram uma solução: conectando sensores um após o outro, uma perna do primeiro sensor se conecta ao pino AD0 do segundo,e fica disponível em 0x69, mas esse método envolve o uso de não mais de 2 mpu e eu o deixei cair imediatamente.A solução foram transistores. A idéia era colocar um par de transistores nos pinos i2c na frente de cada sensor e abri-los alternadamente. O algoritmo é simples - é necessário ler os dados do 5º sensor, fechar todos os portões, exceto o 5º (ou abri-lo, se necessário) e ler, e, em seguida, obter os dados da mesma forma. O resultado pode ser visto na primeira foto deste artigo e é bastante viável. De maneira semelhante, eu consegui conectar 4 sensores, isso não afetou a estabilidade da melhor maneira e, quando fiquei sem transistores, decidi usar microcircuitos mais compactos e estáveis.A única foto sobrevivente dessa fase (peço desculpas pela qualidade):
Controlador de portão
Um dispositivo que combina esses microcircuitos e permite que você se comunique com muitos sensores mpu, chamei de controlador de porta. Foi-me ajudado por um bom amigo que já tinha experiência com gravuras, mas eu precisava de uma qualidade que minhas tentativas anteriores de gravura não tinham. Devido às muitas trilhas que se cruzam, era necessária uma placa de duas camadas, mas uma de vários níveis também se encaixava como protótipo. O resultado deste trabalho foi um quadro tão incomum:Agora resta verificar o dispositivo em ação. Após conectar 10 sensores ao mesmo tempo, exatamente as mesmas mensagens agradáveis sobre uma inicialização bem-sucedida apareceram no monitor - o dispositivo está funcionando!
Gimble Lock, Quaternions, visualização
Fechadura Gimble, na fechadura com dobradiças russas ou armações dobráveis - um fenômeno desagradável no campo dos giroscópios e, em alguns casos, orientação no espaço. Sem uma longa explicação sobre esse fenômeno (há bons vídeos explicativos e visuais sobre este tópico), apenas direi que essa trava articulada não permite que o sensor gire 360 graus. Os eixos XZ (desvios do plano horizontal) são limitados em cerca de -45 a 45 graus, e não estão definidos corretamente além desses limites. Tendo estudado esse tópico com mais detalhes, verificou-se que a solução está embaixo do meu nariz. O MPU-6050 são sensores de seis eixos e possuem dmp a bordo. O Dmp (Digital Motion Processor) faz tudo o que escrevi no código principal para piscar o controlador principal por tanto tempo e até filtra os valores. Além disso, o dmp pode gerar dados na forma de quaternions,que permite ignorar o bloqueio da dobradiça, além de reduzir o tamanho dos pacotes encaminhados. Nesse ponto, meu conhecimento dos quaternions continuou; antes eu trabalhei com eles no Unity3D e tive uma idéia. Em termos simples, um quaternion é um sistema de números (4 números) que descreve a rotação de algo no espaço. Apenas lembrando do Unity, tentei retratar algo assim:
Controlador
O Arduino e o controlador do portão se justificaram, mas seu uso na versão final não foi intencional. É hora de tornar o controlador específico e adaptado para uma tarefa específica. Naquela época, eu praticamente modifiquei o firmware para o futuro controlador, configurei o dmp da maneira ideal, o que me permitiu recusar o uso de interrupções. Assim, cada sensor foi conectado por quatro pinos, e não cinco, como antes. Além disso, não havia necessidade de dois dos seis chips no controlador de porta. Todas essas melhorias levaram ao fato de que a placa para o futuro dispositivo foi projetada em duas direções, e não foi necessário mais "over-the-top".
Habitação
O dispositivo assumiu gradualmente sua forma final e o próximo passo foi tornar o caso lógico. A solução óbvia é solicitar ou recorrer aos serviços de impressão 3D. Mas tudo isso é simples e desinteressante, por isso compramos nossa própria impressora 3D para várias coisas. Na ausência de instruções, eles o montaram em um nível intuitivo, mas tudo deu certo. Em geral, a montagem, a configuração e a preparação para impressão merecem um artigo separado, mas não se trata disso. Usando todo o material de teste, tudo o que restou foi esperar até o plástico ABS chegar.Para a simulação, o programa 123D-Design foi selecionado. O programa é intuitivo e qualquer pessoa que tenha pelo menos um pouco de experiência em editores de gráficos 3D o dominará rapidamente.
Depois imprimi todos os casos, conectei os sensores ao controlador por meio de fios finos de 4 pinos, fiz montagens para os sensores, montei tudo e comprei um traje pronto, autônomo e vestível. Para o primeiro protótipo é bastante adequado.


De software
Devido a algumas circunstâncias, adiei o Unity3D "para mais tarde", os prazos estavam se esgotando e eu tive que escrever rapidamente um programa para visualização. Trabalho com o mecanismo gráfico Xors3D há muito tempo (talvez alguém saiba disso) e, dessa vez, não me decepcionou. No entanto, depois que ele valeu a pena, eu não retornei à Unity, mas continuei a desenvolver o ambiente visual para o traje nesse mecanismo específico.
Lista de recursos atuais:- Visualização - o programa exibe o modelo de uma pessoa, que em tempo real repete todos os movimentos de uma pessoa em um terno
- Calibração automática - Permite calibrar instantaneamente seu traje a qualquer momento
- Posicionamento - o modelo também se move no espaço como uma pessoa, pode agachar-se, caminhar etc.
- Gravação / Reprodução - Todos os movimentos podem ser gravados e reproduzidos.
- Modo de visualização em primeira pessoa - é fornecida a saída de imagem para oculus rift e outros capacetes de realidade virtual.
- Interatividade - uma pessoa vestindo um terno pode afetar o mundo virtual. Chutar bolas, abrir portas, torcer um carrossel, etc. (mecanismo físico)
Conclusão
No momento, o projeto possui um protótipo totalmente funcional, autônomo, vestível e sem fio e todo o software necessário. Demorou 8 meses para desenvolver esse traje (2 dos quais descansei, um total de 6), mas para mim essa é uma era inteira. Durante o projeto, desenvolvi minhas habilidades, tentei e fiz muito do que tinha pouco conhecimento antes, consegui ganhar um pouco.Quando comecei, havia apenas um interesse em "como isso funciona?" e a existência de tais fantasias que eu ainda não conhecia. No entanto, durante o período de desenvolvimento, pelo menos três desses projetos chegaram a sites de crowdfunding, e eu queria, de alguma forma, desenvolver impulso como um projeto comercial, mas é extremamente difícil me expressar quando estou no Território Trans-Baikal. Agora, não há motivação suficiente para me sentar para um segundo protótipo, já sem fio e baseado em sensores de 9 eixos, então provavelmente este projeto continuará sendo para mim apenas uma experiência enorme e útil. Neste artigo, queria resumir todo o trabalho realizado, embora ele não seja exibido aqui e 20% dele. Nem todo mundo estará interessado em toneladas de código e horas de solda, impressão 3D, muita tentativa e erro, muito material usado, mas tentarei responder a essas perguntas nos comentários.Source: https://habr.com/ru/post/pt392353/
All Articles