Skip to main content

Solución Reto SDK de Kinect : Desarrolla con Kinect

En el primer reto sobre el SDK de Kinect debíamos crear una interfaz de control para manejar la inclinación del sensor.

Para solucionar este reto necesitamos:

 
Visual Studio. Si ya tienes VS instalado perfecto, pero por si acaso, aquí tienes el enlace de descarga de la versión gratuita express o de la Ultimate Trial.
 

 

SDK de Kinect para Windows. SDK necesario para utilizar las capacidades del sensor Kinect en nuestras aplicaciones. Descárgalo aquí.

Partimos de una estructura base donde inicializamos en el método Loaded la clase Runtime, que nos permite usar las capacidades de las cámaras junto con el motor del sensor. En esta estructura también tenemos el método Closed que lo usamos para finalizar el uso del sensor.

Runtime kinect;

public MainWindow()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainWindow_Loaded);
            Closed += new EventHandler(MainWindow_Closed);
        }

void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            kinect = new Runtime();
            kinect.Initialize( RuntimeOptions.UseColor | RuntimeOptions.UseDepth);
            
        }

void MainWindow_Closed(object sender, EventArgs e)
        {
            kinect.Uninitialize();
        }

Crear la interfaz de control

Lo primero es crear la interfaz con un control para dar valores de inclinación y otro para mandar ese resultado al motor y hacer que se mueva. Por ello crearemos un slider, 2 botones para manejar el slider y un botón para asignar el valor de la inclinación elegida al sensor.

Podemos cambiar el slider con el ratón pero programaremos los botones para que cambien el valor del slider y así poder usar las 2 formas. Con el otro botón, “Set”, asignaremos el valor del slider al ángulo de inclinación.

<Button Content="subir" Height="40" HorizontalAlignment="Left" Margin="790,406,0,0" Name="bt_subir" VerticalAlignment="Top" Width="75" />
<Button Content="Set" Height="40" HorizontalAlignment="Left" Margin="790,453,0,0" Name="bt_set" VerticalAlignment="Top" Width="75" />
<Button Content="bajar" Height="40" HorizontalAlignment="Left" Margin="790,500,0,0" Name="bt_bajar" VerticalAlignment="Top" Width="75" />
<Slider Height="176" HorizontalAlignment="Left" Margin="737,376,0,0" Name="slider1" VerticalAlignment="Top" Width="26" Orientation="Vertical" Maximum="27" Minimum="-27" Interval="1" SmallChange="1" IsSnapToTickEnabled="True" />

Ponemos como valor máximo 27 y como mínimo -27 al slider porque es el rango de inclinación que permite el motor del sensor. También hay que cambiar el valor de los intervalos a 1 y la propiedad IsSnapToTickEnabled a verdadero.

Por último vamos a añadir un TextBlock para mostrar el valor del slider y saber qué inclinación tenemos en el sensor.

<TextBlock Height="48" HorizontalAlignment="Left" Margin="664,436,0,0" Name="textBlock1" Text="" VerticalAlignment="Top" Width="60" FontSize="26" />

Manejar el motor

Añadiremos los eventos click de los 3 botones en el método MainWindow creándose las 3 funciones para capturar esos eventos.

bt_bajar.Click += new RoutedEventHandler(bt_bajar_Click);
bt_subir.Click += new RoutedEventHandler(bt_subir_Click);
bt_set.Click += new RoutedEventHandler(bt_set_Click);

Dentro de las funciones del botón subir y bajar pondremos el código para cambiar el valor del slider.

void bt_subir_Click(object sender, RoutedEventArgs e)
{ slider1.Value++; }
void bt_bajar_Click(object sender, RoutedEventArgs e)
{ slider1.Value--; }

Lo siguiente será añadir al slider el evento ValueChanged en el método MainWindow al igual que hemos hecho con los eventos de los botones.

slider1.ValueChanged += new RoutedPropertyChangedEventHandler<double>(slider1_ValueChanged);
slider1.ValueChanged += new RoutedPropertyChangedEventHandler<double>(slider1_ValueChanged);

En la función que se crea cambiaremos el valor del Texblock para mostrar el valor de inclinación.

void slider1_ValueChanged(object sender,RoutedPropertyChangedEventArgs<double> e)
{ textBlock1.Text = e.NewValue+""; }

Por ultimo tenemos la función del botón “Set”. Utilizaremos la propiedad NiuCamera para controlar el motor del sensor. Cuando presionemos el botón cambiaremos el valor de la posición de la cámara asignando el valor que tenga el slider.

void button1_Click(object sender, RoutedEventArgs e)
{
kinect.NuiCamera.ElevationAngle = (int)slider1.Value;
}

Hay que tener en cuenta que el motor del sensor no está diseñado para realizar movimientos continuos y cambios rápidos. En caso contrario podría fallar el motor no moviéndose o mostrando un mensaje de error.

Microsoft está realizando una encuesta en línea para comprender su opinión del sitio web de. Si decide participar, se le presentará la encuesta en línea cuando abandone el sitio web de.

¿Desea participar?