E ai filhotes, tudo bem?

Continuando com nossos artigos sobre Kinect, dessa vez vai ser algo rápido e simples, só para me dar um tempo para preparar o post sobre o esqueleto do Kinect.

Tutorial

Nível: Básico

Objetivo: Mover o Kinect para cima e para baixo

Vídeo:  Sendo criado…

O motor

O Kinect possui um motor em sua base que cuida da sua inclinação (ou tilt em inglês) que pode ser acessado pela sua aplicação. Com isso você pode sempre checar se o Kinect está detectando toda a perna das pessoas por exemplo, tanto que todos os jogos de Kinect usam esse motor no começo do jogo para regular a inclinação de forma a detectar o máximo possível.

Se a Microsoft tivesse aceitado minha sugestão, o motor seria assim.

O motor de inclinação se encontra na base do Kinect. E é bastante frágil.

E ele é de extrema importância para você, amigo desenvolvedor, que quer fazer uma aplicação para o Kinect, pelo simples fato que nem sempre o Kinect do usuário está na posição certa (pode não estar pegando suas pernas ou a cabeça, etc..).

“Tudo bem, mas que tipo de conta maluca e programação de alto nível temos que fazer para movimentar ele? “

Ai que está a parte mais simples, basta  alterar o valor da propriedade ElevationAngle!

ElevationAngle

A classe KinectSensor (que representa nosso sensor) tem uma propriedade chamada ElevationAngle que é um inteiro representando a inclinação do Kinect com valores entre -27 e +27!

É importante ressaltar que o ângulo mostrado, é relativo a gravidade e não é fixo a base, isso quer dizer que se o Kinect tiver preso na parede a posição 1 será diferente do 1 dele em cima da mesa.

Agora vamos ao nosso exemplo:

Exemplo

Vamos criar um WPF que irá alterar a elevação do nosso Kinect. Vamos ter um slider (para aumentar ou diminuir o angulo de elevação) com um valor entre -27 e +27 , um textbox (que mostrará o angulo selecionado)  e um botão (para confirmar a mudança de elevação). A tela vai ficar mais ou menos assim:

Tela tá mais sem graça que as minhas piadas.

O nosso XAML ficará assim:

    <Grid>
        <Slider Height="23" HorizontalAlignment="Left" Margin="149,113,0,0" Minimum="-27" Maximum="27" Name="slider1" VerticalAlignment="Top" Width="100" ValueChanged="slider1_ValueChanged" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="269,113,0,0" Name="txtValor" VerticalAlignment="Top" Text="0" Width="57" />
        <Button Content="Salvar" Height="23" HorizontalAlignment="Left" Margin="379,246,0,0" Name="btnSalvar" VerticalAlignment="Top" Width="75" Click="btnSalvar_Click" />
    </Grid>

E agora vamos ao nosso código (que é muito simples):

	// Nosso Sensor
        KinectSensor sensor;

        public MainWindow()
        {
            InitializeComponent();

            if (KinectSensor.KinectSensors.Count > 0)
            {
                // Pega o Sensor atual
                sensor = KinectSensor.KinectSensors[0];
  		// Da um Start no sensor
                sensor.Start();
		}

        }

        /// <summary>
        /// Sempre que alterar o valor do slider adiciona o valor ao textbox
        /// </summary>       
        private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            // Joga o valor do slide no textbox
            txtValor.Text = ((int)slider1.Value).ToString();
        }

        /// <summary>
        /// Salva a elevação
        /// </summary>       
        private void btnSalvar_Click(object sender, RoutedEventArgs e)
        {
            // Altera a elevação
            sensor.ElevationAngle = Convert.ToInt32(slider1.Value);
        }

E pronto! Simples né? Mas cuidado!

Você deve mexer com a elevação do Kinect quanto menos possível, o motor não foi feito para ser usado com frequência. Além disso o próprio SDK impõe 2 restrições:

  •  Não pode alterar a elevação mais de uma vez por segundo.
  • Depois de 15 movimentações seguidas você deve dar pelo menos 20 segundos de “descanso” para o sensor.

Caso você extrapole esses limites uma exceção será gerada.

 

Por hoje é só!  Já estou preparando o post dos esqueletos e o videozinho desse artigo. Desculpem pela demora, não vai acontecer de novo. =/

Abraços,

[EDITADO]

Segue a coleção completa de artigos (até agora):

  1. Camera RGB
  2. Camera de Profundidade
  3. Inclinação
  4. Detectando Esqueletos