Demo Day! Veja Um Tangima 4×3 Funcionando!

Na sexta-feira, dia 28-06-2013 realizamos um dia de testes com todos os projetos finais desenvolvidos no período.

Apresentamos o Tangima funcionando de acordo com o software com alguns pinos iluminados e uma matriz de 4 x 3.

Testes de iluminação de um pino:

Testes com usuários:


Tangima funcionando com Kinect


Veja um Tangima 4×3 Funcionando!

Na sexta-feira, dia 28-06-2013 realizamos um dia de testes com todos os projetos finais desenvolvidos no período.

Apresentamos o Tangima funcionando de acordo com o software com alguns pinos iluminados e uma matriz de 4 x 3:

Testes de iluminação de um pino:

Testes com usuários:


Tangima funcionando com Kinect


 

 

Desenvolvimento da interface v.1.0

Uma vez que o Tangima está sendo desenhado para ser um projeto opensource, era importante que a interface fosse de fácil uso e facilmente modificada.
Na lateral direita, adicionamos botões gerados dinamicamente. Para adicionar um novo botão, basta adicionar um novo valor na array.

<>

<>

Na esquerda, a isometria mostra em tempo real os pinos do Tangima. Para movimentar a câmera livremente, basta apertar a tecla “c”.

<>

Esta é apenas a versão 1.0 da interface e será aperfeiçoada conforme realizarmos testes com usuários.

Kinect em Isometria e Aprimoramentos

O próximo passo foi fazer com que a imagem capturada pelo Kinect fosse projetada na matriz de pinos isométricos criados anteriormente.

Basicamente, o que deveríamos fazer aqui era usar a média aritimética da distáncia dos pixels de cada quadrado da matriz, e utilizá-la para definir a altura
de cada pino isométrico.

Porém, alguns ajustes deveriam ser feitos.
Como podem perceber, o scan do kinect apresenta alguns “buracos”, ou “falhas” bem visíveis no retorno de imagem, como podem ver a seguir:

<>

Essas falhas acontecem por alguns motivos. Geralmente são resultado de sombras, reflexos ou por objetos que estão fora da distância de leitura do Kinect.
O Kinect possui uma distância mínima e máxima de leitura. Caso o usuário se aproxime muito da câmera, poderá constatar que chegará um ponto em que o Kinect não conseguirá mais
scanear. O mesmo acontecerá se o usuário se afastar em demasia.

No retorno visual da imagem é possível perceber que essas “falhas” são pontos pretos na imagem. Ou seja, o Kinect as encara como pontos com 0 de distâcia da câmera.
Como estamos fazendo uma média aritimética dos pontos para conseguirmos saber a altura dos pinos do Tangima, estas falhas alteram bastante o resultado.

Portanto, faremos algumas alterações no código do Processing. Antes de realizar a média aritimética e calcular a altura dos pinos do Tangima, nós vamos definir uma distância
máxima e uma distância mínima de leitura. A diferença entre estas duas distâncias nós vamos chamar de “range”. Além disso, vamos definir que todos os pixels que estiverem com
0 de distância da câmera serão encarados como pixels com a distância máxima da câmera (a que acabamos de definir). Faremos o mesmo para os pixels que estiverem com a distância da câmera
maior do que a que acabamos de definir.

No livro “Make Things See”, o autor explica passo-a-passo como “limpar” a imagem do kinect, (página 324)

E seguida, nós vamos fazer uma regra de 3 para converter a média aritimética de cada quadrado para a altura de cada pino isométrico. Vale uma observação aqui. Para que essa conversão seja feita,
precisamos saber qual altura máxima e mínima queremos para os pinos isométricos. Se tivermos um range de leitura do kinect de 3m e um range dos pinos isométricos de apenas 20 pixels,
a imagem ficará praticamente plana. É preciso encotrar uma proporção e equilíbrio entre estes dois valores para que o resultado agrade.

O resultado da imagem do Kinect, com estes aprimoramentos, em isometria, será:

<>

Por fim, vale dizer que, dependendo da velocidade do servo que formos utilizar na construção do Tangima, talvez seja preciso utilizar uma função “delay”. Com isso, reduziremos
a taxa de atualização dos pinos para uma taxa que os servos consigam executar com precisão.

Utilizando o Tangima para representar Músicas Mp3

Uma das aplicações desenvolvidas para o Tangima é a Representação em volume do espectro de onda de uma música mp3. Para isso, utilizando a função FFT da biblioteca Minim.

Para desenvolver esta aplicação, estudamos o exemplo “LinearAverages”, que já vem com a Biblioteca Minim.

O resultado pode ser visto no vídeo (peço desculpas pelo problema no áudio):

(em breve irei editar este post para explicar como foi feito)

Retorno Visual: Isometria no Processing

É de extrema importancia que o usuário do Tangima consiga ter retorno visual no Software do que está sendo projetado nos pinos do dispositivo. Inclusive, para facilitar o desenvolvimento de novas aplicações sem a necessidade de estar com o Tangima conectado ao computador.

Para isso, utilizamos uma simulação virtual do tangima desenvolvida com blocos em visão isométrica.

Utilizar formas em 3 dimensões no Processing não é complicado. Ele possui uma biblioteca chamada P3D, e funções prontas para criar esferas, cubos e outras formas primitivas a partir de coordenadas x, y e z. Além disso, o Processing conta com funções que permitem usar câmeras e posicioná-las em 3 dimensões. Existem diversos tutoriais espalhados pela internet ensinando a utilizar o P3D do Kinect.

Para utilizarmos uma câmera com perspectiva isométrica seguimos o tutorial:

https://forum.processing.org/topic/isometric-projection-in-pgraphicsopengl#25080000001061175

Basicamente o que o tutorial faz é posicionar uma câmera a uma determinada altura do plano xy e rotacioná-la a 45 graus, apontando para o centro do plano xy. Em seguida, utiliza a função ortho para distorcer a visão da câmera, criando uma perspectiva isométrica. Este mesmo plano xy será a base de onde serão construídos os pinos com a função box.

O resultado é algo semelhante a:

<< INSERIR IMAGEM >>

Kinect com matriz modular

No último post, vimos como acessar a imagem capturada pelo Kinect com profundidade, utilizando Processing com a biblioteca OpenNI.

Porém, a imagem capturada pelo Kinect possui muito mais pixels do que o Tangima terá de pinos. Precisamos fazer com que a imagem do Kinect seja reduzida em uma matriz modular de pinos. Ou seja, transformar a imagem de 640 x 480 em uma matriz 1×1, 2×2, 10×10, 50×50, variável de acordo com a quantidade de pinos que teria no Tangima.

A lógica para fazer isso é simples. devemos dividir a imagem na matriz que desejarmos e fazer uma média aritimética da distância de todos os pixels que se encontram dentro de cada módulo desta matriz. Ou seja, se dividirmos a imagem em uma matriz 2 x 2, a distância do primeiro quadrado seria a média aritimética de todos os pixels que estão, em x, entre 0 e 320,  e em y, entre 0 e 240.

<< INSERIR IMAGEM >>

O resultado é algo semelhante a isto:

Ta nascendo

Como pode-se perceber, desenvolvemos a matriz de pinos do Tangima usando uma visão isométrica para conseguirmos ter retorno visual da altura de cada pino. Isso será explicado no próximo post.