Mostrando entradas con la etiqueta C#. Mostrar todas las entradas
Mostrando entradas con la etiqueta C#. Mostrar todas las entradas

miércoles, 27 de mayo de 2015

Proyecto Kinect: uso de Model-View-ViewModel (MVVM)

Model-View-ViewModel (MVVM) es un patrón de diseño de aplicaciones para desacoplar código de interfaz de usuario y código que no sea de interfaz de usuario. Con MVVM, es definida la interfaz de usuario de forma declarativa (mediante lenguaje XAML) y se usa el marcado de enlace de datos para vincularla a otras capas que contengan datos y comandos de usuario. La infraestructura de enlace de datos proporciona un acoplamiento débil que mantiene sincronizados la interfaz de usuario y los datos vinculados.

El patrón MVVM organiza el código de tal manera que es posible cambiar partes individuales sin que los cambios afecten a las demás partes. Esto presenta numerosas ventajas de cara al uso del patrón:
  • Acelera el proceso de desarrollo.
  • Simplifica las pruebas unitarias.
  •  Mejora la estabilidad y rendimiento de la aplicación.
  •  Reduce los riesgos del proyecto.
Cuando se hace uso del patrón MVVM, una aplicación se divide en las siguientes capas:
  • La capa de modelo (Model) es la responsable de todos los datos de la aplicación y de la lógica de negocios relacionada. Esta capa es completamente independiente de las capas de vista y modelo de vista. Habitualmente hay un solo modelo por aplicación.
  •  La capa de vista (View) define la interfaz de usuario que utiliza marcado declarativo (XAML). El marcado de enlace de datos (Data Binding) define la conexión entre los componentes específicos de la interfaz de usuario y diversos miembros del modelo de vista.
  •  La capa de modelo de vista (ViewModel) proporciona los destinos de enlace de datos para la vista. Expone los datos del modelo de tal forma que sea fácil usar Bindings en la vista.
En este proyecto se hace un guiño a este patrón MVVM. El uso que se hace de él es proporcionar un enlace de datos, que vaya desde la interfaz de la aplicación (View) al modelo de datos (Model) hospedado en el servidor web, pasando por el modelo-vista (ViewModel) capaz de enlazar los datos y actualizarlos cuando en la vista o en el modelo se produzcan cambios. El esquema del patrón seguido es como indica el siguiente esquema:

Esquema de relaciones en el patrón MVVM

Un ejemplo reducido de la infraestructura en tres capas del patrón MVVM que aplicamos para nuestra aplicación es como sigue:

1. - En nuestra aplicación se hace uso de un servidor web que tiene hospedado el modelo de datos. En él se definen los contratos del modelo, lo cual define las propiedades que se van a enviar. En la siguiente imagen se muestra el código reducido del modelo:

Código C# de parte del modelo de la entidad Paciente

2. - En la aplicación cliente se debe hospedar el modelo-vista. Un ejemplo reducido de él es como se muestra en la siguiente imagen:

Código C# de parte del modelo-vista de la entidad Paciente

Como ya dijimos, el modelo-vista aparte de enlazar datos también los actualiza. Es por ello que se puede ver cómo se implementa la interfaz INotifyPropertyChanged, siendo la encargada de lanzar el evento PropertyChanged cada vez que el valor de alguna propiedad cambia. En la siguiente imagen se detalla el evento mencionado:

Código C# del evento PropertyChanged
3. - En la interfaz se define la vista, siendo esta detallada con código XAML. Siguiendo el ejemplo reducido de nuestra aplicación, puede verse un enlace de datos en la siguiente imagen:

Código XAML con Binding
Como se puede ver en la vista, la propiedad Text de los TextBlock es bindeada (Binding) con las propiedades UsuarioPaciente y ContrasenaPaciente del modelo-vista. 

La forma en que el patrón MVVM ayuda a WPF a enlazar los datos con suma facilidad es lo que le hace ser una gran elección para su utilización en el desarrollo de proyectos como este.

Con este post finalizo los posts relacionados con las tecnologías y entornos utilizados y aplicados al proyecto Kinect.

¡Saludos!

Álvaro Alcolea

jueves, 30 de abril de 2015

Proyecto Kinect: Guardado y manejo de esqueletos

Como se comentó en el post anterior, el seguimiento del esqueleto es una de las características estrella del sensor Kinect. A través de la función Skeleton Tracking nos permite obtener la situación de un esqueleto completo, haciendo uso de un algoritmo que logra identificar partes del cuerpo de las personas que se encuentran en el campo de visión del sensor.

El Skeleton Tracking ofrece toda la información del esqueleto en forma de un conjunto de puntos o articulaciones (Joints). En la siguiente imagen se pueden observar las 20 articulaciones distintas que Kinect puede detectar y nos permite manejar:

Esqueleto que muestra las 20 articulaciones capturadas por el sensor Kinect

El SDK de Kinect permite obtener los puntos y la posición en el espacio de las 20 articulaciones de una forma sencilla. Cada vez que el sensor detecta un esqueleto lanza el evento SkeletonFrameReady, éste a su vez, haciendo uso del objeto SkeletonFrame, captura los datos del Skeleton (esqueleto detectado).

Para nuestro sistema a desarrollar se requiere la detección de aquellos esqueletos que generen datos, es por ello que en el evento SkeletonFrameReady se comprueba la propiedad TrackingState, la cual verifica si el estado del esqueleto es el esperado. Dicha propiedad puede tener los siguientes valores: NotTracked (No se detecta esqueleto), PositionOnly (Se detecta esqueleto pero no de forma completa), Tracked (Se detecta esqueleto completamente).

Realizado lo anterior, se puede proceder a la obtención de los puntos que conforman el esqueleto detectado. Lo haremos haciendo uso del tipo enumerado JoinType.[nombreArticulación], el cual nos permite acceder de una forma fácil a cada punto. Puede verse un ejemplo en la primera línea de la siguiente imagen:

Código C# para obtener las coordenadas (x,y,z) de una articulación

Nuestro objetivo aquí, es obtener los datos de la posición de cada articulación, es por ello que tenemos que ir un poco más allá y utilizar el tipo SkeletonPoint ofrecido por el SDK de Kinect. Podemos ver un ejemplo en la segunda línea de código de la imagen anterior.

Finalmente, una vez hemos obtenido la posición de la articulación, el objetivo final es conseguir su guardado en la base de datos. Para ello se utilizarán tres variables: una variable X, una Y, y otra Z que hacen referencia al punto en el espacio que tiene la articulación con respecto a la posición del sensor. Esto facilitaría la tarea de almacenar las articulaciones en, por ejemplo, nuestra base de datos. Siguiendo con el ejemplo, a partir de la tercera línea de código de la imagen anterior se puede ver claramente.

Para terminar este post, recordar que el código en lenguaje C# de la imagen anterior está relacionado con el modelo creado para almacenar los datos recogidos por el sensor Kinect. Se comentarán en siguientes post las tecnologías relacionadas para crear un bloque completo de todo el sistema, en el que todas las partes se relacionen, ya que, además, se tendrá una interfaz gráfica por un lado, por otro, datos recogidos por el sensor a almacenar en el modelo de base de datos, servicios web, etc.

En el siguiente post, seguiré hablando de la detección de esqueletos. 

¡Un saludo!

Álvaro Alcolea