lunes, 20 de julio de 2015

Método de los seis sombreros de Edward de Bono

Se trata de una metodología de pensamiento creada para generar ideas e innovación, el método trata, por tanto, de representar seis formas diferentes de pensar promoviendo de esa manera el intercambio de ideas.

Diseñado por Edward De Bono en los años 80, como sicólogo y experto en el tema del pensamiento, incorporó el pensamiento crítico en la metodología, pero limitándolo para que no fuera el pensamiento que dominara.

El método plantea la existencia de seis sombreros metafóricos que los involucrados pueden ponerse y quitarse para llevar a cabo el pensamiento referente al sombrero que lleve puesto en ese momento.

Pensamientos asociados a cada uno de los seis sombreros
  • Blanco: basado en hechos y números, está diseñado para ser práctico y funcionar de manera similar a los computadores. Ofrece solamente hechos, nunca opiniones.
  • Rojo: reacciona visceralmente, reconoce que los sentimientos forman parte del proceso de pensamiento y nos facilita expresar emociones e intuiciones, no requiriendo que se defiendan ni se justifiquen.
  • Negro: es la lógica aplicada a identificar problemas, defectos o barreras. Indica cuidado y precaución y es la línea que generalmente usamos. Con este sombrero se pueden identificar las dificultades que vienen en el futuro y prevenirlas con el tiempo adecuado.
  • Amarillo: tiene que ver con la lógica positiva. Por qué algo va a funcionar y por qué ofrecerá beneficios. Provee lo contrario al negro, busca identificar beneficios y armonía.
  • Verde: es el sombrero de la creatividad, alternativas, propuestas, lo que es interesante, estímulos y cambios. Cuando se habla con este sombrero puesto surgen las alternativas y soluciones posibles para los problemas o conflictos anticipados por el sombrero negro.
  • Azul: este sombrero es frío e indica autoridad. Proporciona un rol permanente para el líder del grupo. Con este sombrero se puede ser el facilitador, el responsable de definir el objetivo, establecer el enfoque y asegurar de que las reglas sean cumplidas.

Resumen de pensamientos de los seis sombreros

Ventajas y beneficios
  • Permite la expresión de sentimientos sin tener que justificarlos. 
  • Proporciona una comunicación directa sin preocuparse por ofender a alguien. Es mucho más fácil pedir a alguien que se quite el sombrero negro, que pedirle que deje de ser negativo.
  • Permite que todos los participantes sean capaces de utilizar cada uno de los sombreros en vez de quedarse limitados a un solo tipo de pensamiento.
  • Separa el ego del rendimiento a la hora de pensar.
  • Fomenta el pensamiento paralelo.
  • Proporciona un método práctico de pensar en grupo.
  • Permite analizar un problema desde todos los puntos de vista.
  • Se escapa de los argumentos en pros y contras que usualmente surgen al discutir algo.
  • Y hace que las reuniones sean mucho más productivas.

Señalar que empresas como IBM, British Airways, Polaroid, Pepsicola, PwC, etc. aplican esta metodología en su forma de generar nuevas ideas y de avanzar hacia nuevos modelos de negocio o de productos.

Aquí termino con este post, que personalmente me ha parecido muy interesante por su enfoque hacia la búsqueda de la innovación.

¡Saludos!

martes, 16 de junio de 2015

Gestión de equipos de trabajo: los llamados "equipos de alto rendimiento"

En estos momentos me veo involucrado en el reto de conseguir la certificación asociada en gestión de proyectos ofrecida por PMI (Project Management Institute). Por sus siglas en inglés, CAPM (Certified associate in Project Management), está dedicada a ofrecer las buenas prácticas necesarias para dirigir un proyecto de gran envergadura. Sin embargo, a parte de la inmensa y completa información que brinda la guía del PMBOOK ofrecida por PMI, he sentido la curiosidad en uno de los grandes puntos a conseguir en el ámbito de la gestión de proyectos. Ese punto es el que trata de formar un equipo de trabajo que alcance un alto rendimiento en el desempeño de sus objetivos.

"Buceando" por Internet se pueden encontrar soluciones y consejos de todo tipo, aquí expongo un compendio de todo ello y lo que para mí es lo más útil para cumplir el objetivo.

En varias fuentes, el hecho de conseguir formar un equipo de trabajo me ha derivado a la aplicación del mismo modelo, el llamado modelo de Drexler/Sibbet. Se trata de un modelo que define las fases o etapas por las que se debe pasar para conseguir llevar a nuestro equipo de trabajo a la consecución de un alto rendimiento.

Antes de explicar el modelo con sus diferentes fases, conviene destacar qué es lo que aporta a los miembros del equipo y, además, cómo funciona.
  • El modelo hace que el funcionamiento, en cuanto a mecánicas de trabajo en equipo, sea más eficiente y consiga mejores resultados en el negocio.
  • Los autores del modelo, consiguieron plasmar en un mapa las etapas que podría seguir un equipo de alto rendimiento. Si bien es cierto que, dentro de cada una de estas etapas puede haber muchas variaciones para su aplicación en equipos reales.
  • Cada etapa del modelo está relacionada con la anterior, por lo que se puede decir que un equipo que aborda con éxito las etapas anteriores estará mejor preparado para las siguientes etapas.
  • Otro punto a destacar, es la utilización de indicadores que se encargan de verificar o medir si los problemas del equipo han sido superados o no.
  • Para denotar si una etapa ha sido superada con éxito se indica como Resuelta y, en caso contrario, como No resuelta.
  • Por último, decir que se trata de un modelo con gran dinamismo y que el equipo de trabajo puede seguir varias rutas o caminos hasta conseguir el objetivo.
Las etapas del modelo son:
  1. Orientación: se establece el propósito inicial para el equipo de trabajo.
  2. Confianza: los miembros del equipo necesitan conocerse, entenderse, es decir, lo que se llama el nivel de química interpersonal con el que se establece la calidad del equipo humano.
  3. Marcar objetivos: se aclaran los objetivos, suposiciones básicas y visión, dando prioridad a lo importante.
  4. Compromiso: se da por terminada la fase de creación del equipo, además, se toman las decisiones acerca de la utilización de recursos, personal, aceptación de roles, etc.
  5. Implementación: se planifica el trabajo a realizar por el equipo, se decide quién lo hace, qué se hace, cuándo lo hace y dónde lo hace.
  6. Alto desempeño: en esta etapa el equipo puede ser capaz de responder a diferentes situaciones de manera dinámica y poder cambiar objetivos. Aquí se considera que el equipo puede superar las expectativas.
  7. Renovación: Finalmente, como ya se sabe, un equipo de trabajo es dinámico, sus miembros cambian, se cansan, en muchos casos se preguntan si conviene continuar o si, por el contrario, es mejor empezar una nueva andadura.

Modelo de Drexler/Sibbet
Para aplicar el modelo, en muchas fuentes se recomienda hacerse la pregunta "¿qué debo cambiar para ser mejor en la empresa, aportar valor y contribuir al rendimiento de la misma?". Lo que se recomienda es realizar un plan de acción y ofrecer el asesoramiento y seguimiento individualizado para aquellos que sean los líderes del equipo y dar, además, la posibilidad de repetir su aplicación en todos los niveles de la empresa.

Desde mi punto de vista, ya para ir terminando con este post, mucha gente cree que el éxito se esconde allá donde hay talento y gran habilidad individual, sin embargo, la conclusión final que se puede extraer es que el éxito va a estar más relacionado con la actitud con la que el equipo trabaje que con las habilidades individuales de cada miembro.


¡Un saludo a todos!

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

domingo, 24 de mayo de 2015

Proyecto Kinect: uso de Windows Presentation Foundation (WPF)

Windows Presentation Foundation (WPF) es un marco de trabajo de interfaz de usuario que permite crear aplicaciones cliente enriquecidas e interactivas. Esta plataforma de desarrollo WPF admite un amplio conjunto de características de desarrollo de aplicaciones, que incluye un modelo de aplicaciones, recursos, controles, gráficos, diseño, enlace de datos, documentos y seguridad. Es un subconjunto de .NET Framework, además hace uso del lenguaje XAML.

La ventaja específica que XAML ofrece a WPF es que XAML es un lenguaje completamente declarativo. En un lenguaje de programación declarativa, el desarrollador (o diseñador) describe el comportamiento y la integración de los componentes sin utilizar programación procedural. La utilización de XAML para desarrollar interfaces de usuario permite, también, la separación entre modelo y vista, lo que se considera un buen principio de arquitectura. En XAML, los elementos y atributos mapean las clases y propiedades en el API subyacente.

Entre las características más importantes de WPF:
  • Ofrece un conjunto de servicios de datos para permitir a los desarrolladores de aplicaciones enlazar y manipular los datos dentro de las aplicaciones.
  • Admite consultas LINQ, como se detalló en el post sobre LINQ to Entities.
  • Proporciona plantillas de datos para controlar la presentación de los datos.
  • Proporciona un conjunto de controles integrados, que contiene elementos como botones, menús, listas, etc.
  • Separación lógica entre un control y su apariencia.
  • Proporciona un sistema integrado para la creación de interfaces de usuario con elementos multimedia comunes, como imágenes vectoriales y de mapa de bits, audio y vídeo.
  • Soporta la mayoría de formatos de imagen más comunes: BMP, JPEG, PNG, GIF, iconos, etc.
  • Admite por defecto los formatos de vídeo WMV, MPEG y algunos archivos AVI.
El uso de WPF en el proyecto viene motivado por las ventajas que suponen todas las características que ofrece, además de la gran adecuación y estabilidad que añade con respecto a las demás tecnologías utilizadas. El hecho de ser un subconjunto de .NET Framework nos asegura la compatibilidad, por ejemplo, con WCF, Entity Framework y la SDK de Kinect.

En el siguiente post hablaré del patrón de diseño Model-View-ViewModel (MVVM).

¡Saludos!

Álvaro Alcolea

jueves, 21 de mayo de 2015

Proyecto Kinect: uso de Windows Communication Foundation (WCF)

WCF es un conjunto de librerías que provee Microsoft en el framework .NET para la construcción de aplicaciones orientadas a servicios.

Su objetivo básico es el de unificar las comunicaciones. No importa que nuestra aplicación distribuida se comunique a través de TCP en unos servicios, en otros en SOAP y en otros en REST, WCF da soporte a los anteriores protocolos, permitiendo que el código de la aplicación desarrollada sea independiente del protocolo que se vaya a utilizar.

WCF consigue dicha independencia realizando una separación entre operaciones y datos. Establece un contrato a través de una interfaz, y ésta a su vez será implementada por una clase.

El servicio se compone a grandes rasgos de:
  • Contrato de servicio (ServiceContract): expone una operación que nuestro servicio web es capaz de ejecutar. Se corresponde con una interfaz.
  • Contrato de operación (OperationContract): expone el método que va a ser incluido en el ServiceContract y que será ofrecido al exterior para su uso por parte de los clientes.
  • Contrato de datos (DataContract): implementa un tipo de dato que el servicio web será capaz de manejar. Generalmente, será el tipo de dato que manejará el contrato de servicio.
  • Datos de miembro (DataMember): es el atributo que será enviado al cliente como parte del DataContract. No se enviarán los atributos que no tengan esta anotación.
  • Implementación del servicio: implementará la interfaz correspondiente al contrato de servicio, haciendo uso del contrato de datos para intercambiar la información.
Un ejemplo de las partes en que se compone WCF viene expuesto en el siguiente esquema:

Esquema de relaciones entre los componentes de WCF
En el esquema anterior se puede ver el contrato de servicio (ServiceContract) que contiene la interfaz (IServiceContract) con todos los contratos de operación (OperationContract). Dicha interfaz es implementada, y a su vez, hace uso del contrato de datos (DataContract). En el ejemplo, el tipo de dato es Paciente que es enviado para uso de las OperationContract.

El uso de WCF en este proyecto y no de otra tecnología de servicios se debe a la facilidad e independencia con la que trabaja a la hora de realizar el despliegue de servicios web. Dicho lo cual en el esquema anterior es posible ver con un simple golpe de vista las relaciones existentes entre los componentes de WCF.

En el siguiente post hablaré de Windows Presentation Foundation (WPF).

¡Saludos!

Álvaro Alcolea

miércoles, 13 de mayo de 2015

Proyecto Kinect: uso de LINQ to Entities

LINQ to Entities proporciona la capacidad de realizar consultas integradas en Language-Integrated Queries (LINQ) permitiendo escribir consultas contra el modelo conceptual de Entity Framework mediante los lenguajes Visual Basic o Visual C#. Las consultas con EF se representan mediante consultas de árboles de comandos, que se ejecutan en el contexto del objeto. LINQ to Entities convierte las consultas de LINQ en consultas de árboles de comandos, ejecuta las consultas en EF y devuelve objetos que se pueden usar tanto en EF como en LINQ.

Una operación de consulta de LINQ consta de tres acciones: obtener el origen o los orígenes de datos, crear la consulta y ejecutar la consulta.

En la consulta se especifica exactamente la información que se desea recuperar del origen de datos. Una consulta también puede especificar cómo se debe ordenar, agrupar y conformar esa información antes de que se devuelva. En LINQ, una consulta se almacena en una variable. Esta variable de consulta no realiza ninguna acción y no devuelve datos; solamente almacena la información de la consulta. Tras crear una consulta debe ejecutarla para recuperar los datos.

Las consultas de LINQ to Entities se pueden formular en dos sintaxis diferentes:
  • Sintaxis de expresiones de consulta.
  • Sintaxis de consultas basadas en métodos.
La sintaxis de expresiones de consulta consta de un conjunto de cláusulas escritas en una sintaxis declarativa similar a Transact-SQL. Al usar la sintaxis de consulta, se pueden realizar operaciones complejas de filtrado, clasificación, ordenación y agrupación en orígenes de datos con una cantidad mínima de código. En la siguiente imagen, se muestra un método que realiza una consulta completa, incluyendo el uso de un origen de datos, la definición de la expresión de consulta y la ejecución de la consulta por medio de una instrucción foreach:

Código C# con ejemplo de sintaxis de expresiones de consulta
La sintaxis de consultas basadas en métodos no son más que una secuencia de llamadas directas a los métodos de operador de LINQ, como son Where, Select, GroupBy, OrderBy, Join, Max, etc., a las que además se le deben pasar como parámetros expresiones lambda. En la siguiente imagen se puede ver un ejemplo de consulta utilizando expresiones Lambda.

Código C# con ejemplo de sintaxis de consultas basadas en métodos
En comparación, los dos tipos de sintaxis de LINQ son bastante simples, sin embargo para realizar las consultas en el proyecto se ha decidido utilizar la sintaxis de expresiones de consulta estándar, ya que no es necesario crear expresiones Lambda que podrían tornarse complejas cuando la consulta requiera de una mayor elaboración.

En el siguiente post, hablaremos de las librerías para la construcción de aplicaciones orientadas a servicios, Windows Communication Foundation (WCF).

¡Saludos!

Álvaro Alcolea

domingo, 10 de mayo de 2015

Proyecto Kinect: uso de ADO.NET Entity Framework (EF)

ADO.NET Entity Framework es un framework ORM (Object-Relational Model) para la plataforma .NET. Consiste en un conjunto de APIs de acceso a datos. La primera versión fue incluida con .NET Framework 3.5 Service Pack 1 y Visual Studio 2008 Service Pack 1, realizada el 11 de agosto de 2008. Esta primera versión fue muy criticada. Seguidamente se lanzaron otras cuatro versiones hasta llegar a las versiones 5 y 6, corrigiéndose las críticas y problemas de versiones anteriores.

En este proyecto se hará uso de la versión 5.0 que es actualmente la versión estable, a diferencia de la versión 6.0 Alpha 2 que está en desarrollo.

Entity Framework nos ayudara a crear nuestro modelo conceptual y resolver nuestras necesidades de persistencia.

Actualmente permite elegir entre tres enfoques diferentes de creación del modelo conceptual:
  • Database First: El modelo conceptual se crea a partir de una base de datos existente.

Desarrollo del enfoque DataBase First
  • Code First: nuevo a partir de la versión 4.1 de EF. Permite mapear nuestras clases POCO (Plain Old CLR Object) a la base de datos usando convención, Data Annotations o Fluent API.
  • Model First: Este será el enfoque que utilizaremos para nuestro sistema. La idea aquí es crear primero el modelo conceptual y a partir de este generar la base de datos.
Desarrollo del enfoque Model First

La elección de Entity Framework en este proyecto viene motivada por las facilidades que permite a la hora de trabajar con objetos y propiedades específicos del dominio, sin tener que preocuparse por las tablas y columnas de la base de datos donde se almacenan los datos. 

EF además permite trabajar con un mayor nivel de abstracción cuando se trata con datos, pueden crearse y mantenerse aplicaciones orientadas a datos con menos código que en aplicaciones tradicionales. Al ser un componente de .NET Framework, las aplicaciones que hacen uso de EF pueden ser ejecutadas en cualquier equipo en el que esté instalado .NET Framework a partir de la versión 3.5 SP1. También y no menos importante EF 5.0 es completamente compatible con las demás tecnologías y lenguajes utilizados en el proyecto.

Entity Framework además, acepta consultas de tipo LINQ contra el modelo conceptual creado, en el siguiente post se tratará de explicar.

¡Saludos!

Álvaro Alcolea

miércoles, 6 de mayo de 2015

Proyecto Kinect: reconocimiento de comandos de voz

Con la ayuda del conjunto de micrófonos que incorpora Kinect y la API de reconocimiento de voz de Windows podemos reconocer la voz humana. Gracias a ello, es posible construir una serie de comandos de voz que controlen ciertas funcionalidades concretas de la aplicación.

La elección de esta tecnología que incluye Kinect viene motivada por el hecho de que a la hora de la realización de una terapia o a la hora de realizar el guardado de tareas de postura, se requeriría de otra persona para realizar dichas acciones en el sistema. Por todo ello, se considera la implementación de diversos comandos de voz que ayuden al usuario a realizar las acciones por sí mismo y sin necesidad de terceras personas.

La utilización del reconocimiento de voz en este proyecto a nivel de implementación se ha realizado usando la solución que permite el SDK oficial de Kinect. Usando la clase VoiceCommander se consigue el reconocimiento de palabras en el idioma castellano para la realización de determinadas funciones. Un ejemplo de aplicación en este proyecto puede verse a continuación.

Lo primero de todo es inicializar el objeto de la clase VoiceCommander, al que se le pueden pasar como parámetros una serie de palabras que serán los comandos de voz a detectar. Un ejemplo de código es el de la siguiente ilustración. En ella se detalla el comando de voz “realizar” utilizado para generar la función de realización de tarea postura por el paciente y su evento de detección.

Código C# de inicialización del comando de voz para la realización de tarea postura
En la siguiente ilustración se puede ver la implementación del método lanzado por el evento de detección de comandos de voz. En él se puede ver que para el caso de que el dispositivo Kinect detecte la palabra “realizar”, ejecutará el método SavePostura(skeletons).

Código C# del método lanzado por el evento de detección de voz
Hasta aquí llega este post, en sucesivos posts seguiré hablando de los frameworks utilizados para la creación y manejo de servicios web y de base de datos.

Álvaro Alcolea

domingo, 3 de mayo de 2015

Proyecto Kinect: Comparación de esqueletos

Se puede obtener una solución a la comparación entre articulaciones de distintos esqueletos, de la forma en que realizamos el guardado de las mismas en el punto anterior.

Teniendo guardado los puntos de las articulaciones de dos esqueletos, se podría realizar una comparación de los ángulos que forman entre sí. La utilización de esta técnica de comparación viene motivada por el hecho de que, por ejemplo, existen personas con diferente altura, es decir, diferente tamaño de esqueleto. Por tanto, otra técnica como, por ejemplo, la de diferenciar los puntos de las articulaciones, nos daría muchos problemas en la comparación. Dicho lo cual, se decide utilizar la técnica de cálculo de la amplitud o ángulo de las articulaciones del esqueleto. Esas amplitudes son comparadas para buscar las similitudes con las amplitudes de otros esqueletos.

Observando el esqueleto de la siguiente ilustración podemos observar los ángulos que serán calculados para realizar la comparación entre posturas, concretamente, para la parte del miembro superior.
Esquema con los ángulos a calcular

Fijándonos en un ángulo concreto su cálculo se realizará llamando al método devAnguloEntrePuntos, que devuelve el ángulo calculado y recibe como parámetros las coordenadas (x, y, z) de los tres Joints o puntos de unión. En la siguiente imagen se muestra el ángulo formado por las tres articulaciones (Joints).
Esquema del ángulo calculado a partir de tres articulaciones
El método en código C# es el siguiente:

Código C# para el cálculo del ángulo
El método devAnguloEntrePuntos hace uso de otro método para calcular el vector normal producido por las coordenadas de los tres Joints. El método para calcularlo es el siguiente:

Código C# para el cálculo del vector normal
Finalizando con este post, una vez que se ha realizado el cálculo de los ángulos de las articulaciones de dos posturas distintas (en nuestro sistema se habla de dos posturas una para el paciente, y otra, para el fisioterapeuta) se realiza la diferencia entre ambos ángulos. En la siguiente figura se puede ver el código necesario para realizar la diferencia entre el ángulo de la muñeca derecha del esqueleto del fisioterapeuta y del paciente.
Diferencia entre el ángulo del fisioterapeuta y del paciente
En el siguiente post, hablaré del reconocimiento de comandos de voz con Microsoft Kinect.

Un saludo!

Á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

jueves, 9 de abril de 2015

Proyecto Kinect: Tecnologías aplicadas (SDK Oficial Kinect)

Para la implementación del sistema se requerían diversas tecnologías y entornos de desarrollo. En este post y siguientes, se describen tales tecnologías y su aplicación en el sistema

La última SDK oficial de Kinect lanzada por Microsoft fue publicada el 17 de Septiembre de 2013. Se denomina Kinect for Windows SDK en su versión 1.8. Con anterioridad, Microsoft lanzó otras cuatro versiones comerciales, la primera de ellas lanzada el 1 de Febrero de 2012.

El SDK de Kinect brinda una serie de bibliotecas y herramientas que ayudan a los desarrolladores a utilizar todas las funcionalidades del dispositivo Kinect. Este dispositivo en conjunción con sus bibliotecas interactúa con la aplicación como muestra la siguiente imagen:

Interacción entre software y hardware de Kinect con la aplicación

El SDK de Kinect, por tanto, funciona como una interfaz entre el dispositivo Kinect y la aplicación desarrollada. Cuando es necesario acceder al sensor, la aplicación envía una llamada a la API y ésta a los drivers.

Los drivers instalados para los diferentes sensores que incorpora Kinect se asientan con los componentes de los drivers de los dispositivos del sistema Windows, pudiéndose comunicarse entre sí. Los drivers ayudan a transmitir los datos de video y audio de los sensores y devolverlos a la aplicación. Estos drivers, por ejemplo, ayudan a detectar el conjunto de micrófonos que incluye Kinect como un dispositivo de audio predeterminado y también a ayudarle a interactuar con el motor de reconocimiento de voz de Windows por defecto.

Para entender la funcionalidad de las diferentes APIs y conocer su uso,  es bueno tener una visión clara de la manera en que trabajan. Se pueden clasificar las bibliotecas del SDK de Kinect en las dos categorías siguientes:
  • Aquellas que controlan y acceden a los sensores de visión de Kinect.
  • Aquellas que acceden a los micrófonos y el control del audio.
La primera categoría hace referencia a los sensores de captura del flujo de color, flujo de datos infrarrojos, y flujo de profundidad, también el control de la inicialización del sensor y el seguimiento de los esqueletos humanos. Un conjunto de APIs en esta categoría se comunica directamente con el hardware del sensor, mientras que unas pocas APIs de procesamiento se aplican a los datos que se capturan desde el sensor.

Por otro lado, las APIs de audio controlan el conjunto de micrófonos Kinect y ayudan a capturar el flujo de audio a partir de los sensores, el control del origen del sonido que permite el reconocimiento de voz. En la siguiente imagen se muestra una clasificación de alto nivel basada en el tipo de trabajo que realiza la API:
Clasificación del SDK de Kinect (Imagen: Libro "Kinect for Windows SDK Programming Guide". autor Abhijit Jana)
También se define la API SDK como Natural User Interfaces (NUI), que recupera los datos del sensor de profundidad y cámara a color y captura el flujo de datos de audio. Hay varias APIs que se escriben en la parte superior de las API NUI, tales como, aquellas para la recuperación de la información del sensor, simplemente mediante la lectura de los detalles del sensor y para el seguimiento de esqueletos humanos, siempre basado en el flujo de datos de profundidad devuelto desde el sensor.

La arquitectura que nos ofrece este SDK de Kinect se puede ver en la siguiente imagen:

Arquitectura SDK de Kinect (Imagen: Libro Kinect "Kinect for Windows SDK Programming Guide". autor Abhijit Jana)
Puntos clave detallados:
  1. Hardware: se compone de los componentes hardware, como son el sensor Kinect y el hub USB a través del cual el sensor se conecta al PC.
  2. Drivers: se compone de todos los drivers que necesita Windows para que el sensor funcione correctamente. Son instalados como parte del proceso de instalación del SDK de Kinect.
  3. Componentes de video y audio: permiten el acceso a los recursos del dispositivo. Como son el seguimiento del esqueleto, datos de profundidad e imagen capturada de la cámara.
  4. DirectX Media Object (DMO): para usar con aplicaciones como DirectShow o Media Foundation. Necesario para el funcionamiento del conjunto de micrófonos.
  5. Speech APIs: proveen el acceso al audio, y las APIs necesarias de Windows 8 para el reconocimiento de voz.
En cuanto a las funcionalidades y características del SDK de Kinect  que son de utilidad para el TFG realizado se tienen las siguientes:
  • Captura y procesamiento del flujo de datos de imágenes en color: captura imágenes a través de la cámara a color y permite obtener lo que ocurre en tiempo real.
  • Procesamiento del flujo de datos de la imagen de profundidad: captura imágenes, pero, sin embargo, son realizadas en escala de grises siendo capaz de detectar la profundidad de un cuerpo.
  • Seguimiento del esqueleto humano y los movimientos articulares: es una de las características más importantes del sensor Kinect, ya que es capaz de detectar 20 articulaciones de 2 esqueletos diferentes situados delante del sensor.
  • Activación del reconocimiento de voz: Kinect utiliza la tecnología de reconocimiento de voz a través de su conjunto de micrófonos que lleva consigo y permite localizar el origen del sonido.
  • Ajuste del ángulo del sensor Kinect: el sensor permite ser orientado hacia arriba o hacia abajo a través de la aplicación desarrollada.

Tras este paseo por las características y funcionalidades más importantes del SDK de Kinect, en siguientes posts os adentraré en los algoritmos y funcionalidades que he considerado aplicar en el TFG.


Álvaro Alcolea

martes, 7 de abril de 2015

Proyecto Kinect: Arquitectura considerada para el sistema

La arquitectura propuesta para llevar a cabo la finalidad de la aplicación se basa en el patrón Model-View-ViewModel, en el uso de servicios web, en la consideración de dos aplicaciones cliente y del dispositivo Kinect en ambos clientes. Por un lado, el sistema estaría compuesto por un cliente que únicamente utilizaría el rol administrador o fisioterapeuta, y por otra parte, existiría otro cliente que utilizaría el rol usuario o paciente. Siendo esas dos aplicaciones cliente diferentes en su funcionalidad y presentación. En cualquier caso, el cometido de ambos tipos de cliente consiste en realizar consultas a una base de datos distribuida a través de servicios web.

Arquitectura hardware del sistema

En siguientes posts, detallaré las tecnologías utilizadas y los casos concretos más importantes.


Álvaro Alcolea

jueves, 19 de febrero de 2015

Proyecto Kinect: Metodología de diseño centrado en el uso

A continuación se detalla, en qué consiste la metodología de diseño centrado en el uso, el por qué de su elección y los diferentes modelos a realizar para conseguir la elaboración final del sistema.

La metodología de diseño centrado en el uso propone un proceso sistemático basado en modelos abstractos para diseñar un sistema de la forma más sencilla posible, siendo éste compatible con todas las tareas que los usuarios necesitan llevar a cabo.

La elección de esta metodología viene motivada a que la aplicación gira en torno a diferentes usuarios objetivo que necesitan llevar a cabo diferentes tipos de uso de la aplicación. Esta metodología, por tanto, está enfocada y considera especialmente el uso que el usuario hace o hará de la aplicación, es por ello que se trata de la metodología idónea para llevar a cabo el desarrollo de este proyecto y facilitar un producto software con garantías de éxito y aceptación.

El diseño centrado en el uso descansa en la elaboración de tres modelos abstractos estrechamente relacionados que se siguen en este TFG. Estos modelos son: modelo de roles, modelo de tareas y un modelo de contenidos.
  • El modelo de roles captura las características más destacadas de los papeles que desempeñan los usuarios en relación con el sistema.
  • El modelo de tareas representa la estructura del trabajo o los pasos que los usuarios necesitan llevar a cabo en relación con el sistema.
  • El modelo de contenidos representa los contenidos y la organización de la interfaz de usuario, necesarios para apoyar las tareas identificadas en el modelo de tareas.
Proceso basado en modelos abstractos en el diseño centrado en el uso



Conceptualmente, una derivación sencilla y directa une el diseño final a los casos de uso que apoyan los roles de usuario. Cada pantalla, formulario u otra interacción corresponden a un prototipo abstracto que apoya un grupo de casos de uso interrelacionados.


Este post, pese a que es teórico, lo creo muy importante en la ayuda que supone para la realización del proyecto. Se trata de aplicar y seguir una metodología que aporta las pautas y relaciones necesarias para que todo encaje de la mejor manera en el proyecto.

Nota: todos los modelos realizados para el diseño del sistema los puedo compartir previa solicitud en forma de comentario en este mismo blog.


Álvaro Alcolea

martes, 3 de febrero de 2015

Proyecto Kinect: Entorno de captura y gestión de movimientos utilizando Kinect

Se trata de mi trabajo fin de grado (TFG) realizado entre Febrero y Julio del año 2014. Fue desarrollado con el objetivo de elaborar un entorno que facilitase la definición de terapias ligadas al ámbito de la rehabilitación física, utilizando el sensor Kinect como dispositivo que controle la ejecución de los ejercicios por parte de un paciente. Que además, permita almacenar, consultar, modificar y eliminar movimientos corporales y otros datos de interés utilizando la tecnología de Kinect y una serie de herramientas que ayuden a la gestión de los datos empleados. Los movimientos almacenados en la aplicación podrán ser, más tarde, comparados con otros movimientos similares identificando similitudes y diferencias. 



En este blog voy a añadir los estudios y trabajos llevados a cabo para la consecución final del proyecto. Publicaré en siguientes posts la gran mayoría de detalles y conocimientos sobre el manejo de todos los aspectos y tecnologías utilizadas.

Álvaro Alcolea

martes, 13 de enero de 2015

Business Model Canvas (Modelo canvas)

El modelo CANVAS, se basa en ofrecer un lienzo en el que se describa la lógica de un modelo de negocio. Trata de mostrar como la empresa crea, entrega y captura valor para la misma.

Se está asentando como una buena herramienta de gestión estratégica, además de ser la preferida por empresas ya establecidas y start-ups.

Está compuesto por 9 bloques o cuadros que se asemejan a las áreas necesarias para el desarrollo de una empresa:

- Clientes:

Son el bloque por el que tiene sentido todo lo que hace una empresa. Debemos analizar hacia qué clientes se quiere vender una propuesta de valor, hacia qué segmento de la clientela dirigirse y cuales son sus necesidades.

Este bloque se atiende haciendo las siguientes preguntas:
  • ¿A quién nos dirigimos?
  • ¿Qué clientes son prioritarios?

- Propuesta de valor:

El valor del producto ofrecido a los clientes se encuentra en dar respuestas a las necesidades de los mismos, y también, en cómo se dan soluciones a través de los productos de la empresa. Se trata de la razón y el motivo por el que los clientes eligen una empresa para realizar sus compras.

Las preguntas que deben hacerse son:
  • ¿Qué problemas se solucionan?
  • ¿Qué valor entregamos a los clientes?
  • ¿Qué necesidades se satisfacen?

- Relación con los clientes:

El diseño de este bloque es importante debido a que la imagen de marca y la percepción que tienen los clientes es algo imprescindible.

Nos debemos preguntar:
  • ¿Qué tipo de relación esperan los clientes que se establezcan y se mantengan con ellos?

- Canal de distribución:

Planificar la forma en que se va a entregar la propuesta de valor al cliente, y además, saber como se va a interactuar con ellos.

La pregunta importante sería:
  • ¿A través de qué canales la empresa contactará y atenderá a los clientes?

- Ingresos: 

Se buscará implantar una estructura de ingresos sólida, que ayude a amortizar la propuesta de valor de la empresa.

Las preguntas más importantes que nos deberíamos hacer son;
  • ¿Qué valor estarían dispuestos a pagar los clientes por los servicios de la empresa?
  • ¿Mediante qué formas de pago?
  • ¿Qué márgenes obtiene la empresa?

- Actividades clave:

Algo muy importante es planificar las actividades de una forma estratégica para conseguir entregar la propuesta de valor a los clientes.

Las preguntas clave son:
  • ¿Qué actividades son consideradas esenciales para el modelo de negocio?
  • ¿Cómo se llevarán a cabo?

- Recursos clave:

Para llevar a ejecución las anteriores actividades se requieren recursos materiales, humanos o financieros.

La pregunta en este bloque es:
  • ¿Qué recursos importantes requiere el modelo de negocio?

- Alianzas:

Para el éxito se necesitará recurrir a aliados que ayuden a potenciar la propuesta de valor, ofreciendo solidez y eficacia en el modelo de negocio.

Preguntas importantes de este bloque:
  • ¿Qué alianzas se consideran necesarias?
  • ¿Cómo podrán los partners ayudar a enriquecer el modelo de negocio?

- Estructura de costes:

En este bloque se deben calcular los costes de inversión y, por supuesto, la rentabilidad de la empresa aprovechando los beneficios en un tiempo reducido. El objetivo de este bloque consiste en ofrecer el máximo valor a al clientes al mínimo coste.

Una pregunta sería:
  • ¿Qué estructura de costes tiene nuestro modelo de negocio?

Para terminar con este post destacar que gracias al Modelo Canvas es posible tener una visión global de la idea del negocio que se persigue, a la vez que se diferencian de forma clara las conexiones entre los diferentes bloques.


¡Saludos y Feliz año 2015!