Mudando o volume da TV com o Kinect

Anos sem posts e agora toda semana sai mais um sobre o Kinect. Nessa nova etapa dos experimentos do Kinect ajudando no controle da casa, fiz o controle de volume da TV através de gestos.

Primeiro o video, depois um pouco de como foi feito:

A ideia da interação com a TV podem ser divididas em 4 etapas:

  • Alterar o volume gradualmente com as mãos (feito!)
  • Alterar os canais com gestos
  • Desligar e ligar a TV apontando para ela por mais de X segundos
  • Fazer os 3 algoritmos funcionarem juntos.

Bom, esse fim de semana briguei com o sisteminha e o kinect para fazer a primeira etapa. Enfrentei varios problemas e vou tentar descreve-los para que, se alguem for pelo mesmo caminho, já saiba o que lhe espera.

Antes, um pouco sobre o que foi feito:

  • Criados na planta de casa o Rack e a TV, para ajudar na visualização e na calibragem do plano do kinect
  • Criado uma região que inicia a manipulação do volume.
  • Gestos de Slider adaptados do Vertical (usado na intensidade da luz) para Horizontal (usado para medir… volume)
  •  Passos:
    • Esqueleto seleciona área de mudança de volume
    • Um evento subindo 1 unidade do volume é lançado para o sistema de automação (que busca o comando do controle do banco de dados, quebra em pacotes, passa via wireless para outro arduino, que monta os pacotes e emite as luzes infravermelhas IR) indicando que a seleção foi efetuada
    • Usuário alinha no eixo Z suas mãos (altura) e pela distancia entre as mãos (distancia XY) o sistema vai gerando eventos para aumentar o diminuir o volume)
    • Usuário desalinha as mãos no eixo Z, passa 1 segundo e a opção para alteração do volume é deselecionada, emitindo um sinal para diminuir o volume em 1 unidade para avisar o usuário.

Basicamente foi isso que foi feito.  Abaixo tem uma figura do software que orquestra todo o esquema, captando o esqueleto na planta de casa. Igual na solução da iluminação, o programa tem que estar ciente de onde estão os dispositivos a serem controlados, no caso a TV, para saber se o usuário esta ou não interagindo com ele.

Estagio inicial de desenvolvimento, alinhando o plano do Kinect e a TV na planta de casa.

Bom, mas dá para perceber pelo video que não ficou muitooooo bom. Eis os porques:

Problemas no Kinect:

  • Distancia muito curta entre o Kinect e a pessoa sentada no sofá (menos de 2 metros). Isso dificultava a detecção de movimentos e gerava movimentos imprecisos.
  • Dada a distancia muito curta, o Kinect só pegava da cintura pra cima, impossibilitando o uso do slider vertical como no exemplo da intensidade da luz (http://wp.me/p1pSXR-2I ).
  • Fazendo o slider horizontal resultou em mais problemas (que possivelmente possam ser ajustados com algumas heuristicas, que eu não estava a fim de fazer): normalmente nossas mãos estão alinhadas no eixo Z (altura), então o programa sempre estava detectando mudanças no Slider. É diferente do slider vertical, onde as mãos tem que ficar alinhadas no plano XY. O ruido na detecção dos movimentos gerado pelo kinect, por estar muito proximo do usuario, gerava leituras imprecisas do slider.

Problemas no Sistema de Automação (quase tão piores que o Kinect):

  • Minha TV panasonic usa uma combinação muito longa de frequências para o IR. O volume +, por exemplo, é um array de 101 inteiros de 2bytes (logo, 202 bytes). O arduino tem pouca memoria (2Kbytes, a versão que estou usando) e pelo que eu percebi não consegue organizar muito bem alocação e desalocação de memoria (deve fragmentar, imagino). Enfim, mandava 3 vezes o comando de volume + e o arduino morria, com erro de memoria. Tive que tunar todo o sistema para economizar memoria. (escovando bit… que nem diz meu amigo Fabio Freire, quem escova bits é pobre! se fosse rico, colocava um ultra processador e pronto!)
  • O sistema de Radio estava configurado para a velocidade de 250Kbps, que aumentava o alcance de comunicação. Porem, com essa velocidade, eu não conseguia mandar mais de 1 comando por segundo, pois para o IR são varios pacotes de dados (inicialmente de 12 a 14 pacotes de 32 bytes) e o arduino não tinha tempo de processar os pacotes antes que os próximos chegassem. Mudei para 1Mbps a velocidade do radio, e o intervalo de tempo caiu para um pouco menos de 1 segundo, mas ainda muito alto.
  • Fui então otimizar os dados, criando uma especie de “compressão de dados” para enviar menos pacotes. Escovei mais ainda os bits  e fiz um jeito um pouco mais eficaz de gravar meus dados, como pode ser visto abaixo. Desse jeito, diminui de 202 bytes para 112 bytes os dados da operação de volume +. Isso proporcionou um intervalo de 200 milissegundos entre cada operação da TV, o que já proporcionava o funcionamento ma o meno do slider do Kinect.

Explicando o jeito diferente de representar dados que, no meu problema (com muitos números menores que 127) gerou um ganho de 50%. Basicamente, o primeiro bit eh usado para falar se o byte representa um inteiro (sem sinal) de um byte ( como só tem 7 bits pro numero, só salva de 0-127) ou em 2bytes (com 15 bytes pro numero, que representa de 0-32767)

1 comentário

Arquivado em Arduino, Automação Doméstica, Desenvolvimento, Eletrônica, Gadget

Uma resposta para “Mudando o volume da TV com o Kinect

  1. Diego (Bozoh)

    Aí sim
    =)

Deixe um comentário