You are on page 1of 18

ETAPA DE VISIÓN:

Descarga e instalación de software necesarios para la realización del proyecto

Entrar al siguiente link https://www.microsoft.com/en-us/download para la descarga de


los paquetes necesarios para poder utilizar el Kinect los cuales son:

Kinect for Windows SDK 1.8

Kinect Developer Toolkit 1.8

Estos paquetes requieren las siguientes características del ordenador en el cual se


instalaran.

Figura X. Características requeridas por Windows SDK.


Para instalar Kinect para Windows SDK 1.8:

1. Asegúrese de que el sensor Kinect no esté conectado a ninguno de los


puertos USB de la computadora.
2. Desde la ubicación de descarga, haga doble clic en el primer archivo Kinect
for Windows sdk 1.8
3. Una vez que el Kinect para Windows SDK haya completado la instalación
con éxito, instale el siguiente archivo Kinect Developer Toolkit 1.8
4. Asegúrese de que el sensor Kinect esté conectado al concentrador de
alimentación y que el hub de energía esté conectado a una toma de
corriente. Conecte el cable USB desde el hub de alimentación a un puerto
USB 3.0 en su computadora. La instalación del controlador comenzará
automáticamente.

SDK:

Para la etapa de visión lo primero que tuvimos que hacer fue instalar los
controladores del kinect, estos controladores son gratuitos de la página oficial de
Microsoft (KinectSDK y Kinect for Windows Develeoper).

Este software nos permite crear aplicaciones usando la tecnología del kinect,
dentro de este software podemos crear aplicación de seguimiento de esqueleto,
procesamientos de video RGB y profundidad y audio, para esto es necesario
conocer el ambiente de programación Visual Studio 2010, Lenguajes C# o C++.
KINECT

Este dispositivo fue originalmente lanzado por la consola de videojuegos Xbox


360 de Microsoft el cual se utilizaba para interactuar a través de su cuerpo o
mediante su voz sin la necesidad de un control físico.

Kinect funciona bajo un sistema maestro-esclavo, donde el maestro de la


computadora y el esclavo es el kinect. El chip genera y mantiene memoria los
cuadros de imagen de profundidad y color a una velocidad de 30 cuadros por
segundo. El acceso a estos datos es por medio de un puerto USB.

La cámara de profundidad se compone por la infrarroja y el proyector infrarrojo de


luz estructurada, lentes de color, 4 micrófonos, ajuste de sensor con su motor de
inclinación

Campo de visión:

1. Visión horizontal de 57 grados


 Campo de visión vertical de 43 grados
 Rango inclinación física de +- 27 grados.
 Rango de profundidad del sensor: 1,2 – 3.5

2. Data Streams (Flujo de datos)


 320 x 240 a 16 bits de profundidad
 640 x 480 a 32 bits de color @30 fps.
 Audio de 16-bit a 16 kHz

3. Sistema de seguimiento
 Rastrean hasta 6 personas, incluyendo 2 jugadores activos
 Rastrean hasta 20 articulaciones
Para conectar el Kinect al PC, es necesario un cable en forma de Y, un extremo
tiene un adaptador hembra para el kinect es de color naranja y el otro extremo es
un conector USB para el CPU

Figura X. Adaptador Kinect.

Figura X. Estructura interna kinect.


MANUAL DE USUARIO DEL MATLAB

Nota: es importante comprobar que dentro de la interfaz tengamos activado los


toolbox de adquisición de imágenes es importante ya que si no los tuviéramos
activados no podríamos acceder a las funciones que nos provee matlab para
adquisición de imágenes.

Para comprobar que tenemos activados estos toolbox nos dirigimos a la barra de
herramientas de matlab y seleccionamos resources / add-ones / Get Hardware
Support Packages se nos abrirá una pantalla donde seleccionaremos Install from
Internet y comprobamos que tengamos Kinect for Windows Runtime

Tabla X. ToolBox de adquisición de imagen. Observamos que se encuentra activado este paquete para
Matlab 2013b
Instrucciones básicas

 Clc; clear all; close all;

Se borra adquisición de imágenes, datos dentro del workSpace, y borra los


Metadatos (ubicación dónde se guardan todos los datos adquiridos por el Kinect)

 Imagreset;

Resetea el recuadro sobre el cual aparece la imagen.

 imaqhwinfo ('kinect')

Genera información de los dispositivos que se encuentran dentro del kinect y les
otorga un identificador, para el kinect a sensor de color le agrega el ID = 1 y para
profundidad el ID = 2

HwInfo = imaqhwinfo('kinect')

 obj = videoinput(adaptorname,deviceID);

Construye un objeto de entrada vídeo obj, donde deviceID es un valor escalar


numérico que identifica un dispositivo en particular a través de adaptador
especificado, adaptorname. Si no se especifica el deviceID, se utiliza el primer ID
de dispositivo disponible

depthVid = videoinput (‘Kinect’, 2);

 Imaqhwinfo (adaptorname)

Determinar los dispositivos disponibles a través de adaptador especificado.

 Triggerconfig (obj, type)

Configura el valor de la propiedad TriggerType del objeto de entrada vídeo obj al


valor especificado por el vector de caracteres type. Esta lista de caracteres puede
ser (manual, inmediate, hadware). La primera se ejecuta después de la llamar
trigger función, la segunda se ejecuta inmediatamente después de llamar a
star(función), y la tercera es cuando se cumple una condición especifica.

Triggerconfig (depthVid, ‘manual’);


 Obj.FramesPerTrigger = Valor;

Especifique el número de fotogramas que desea adquirir por gatillo usando la


fuente de vídeo seleccionada

depthVid.FramesPerTrigger = 1;

 Obj.TriggerRepeat = Type;

Determina cuantos marcos va a imprimir por cada gatillo funcionando dependiendo


del tipo puede ser un valor real, off y inf el cual hará la tarea de disparos
infinitamente.

depthVid.TriggerRepeat =inf;

 Obj.FrameGrabInterval = valor;

Cuantos cuadros tienen que adquirir para realizar un marco.

depthVid.FrameGrabInterval = 5;

 src = getselectedsource(obj)

Busca todos los objetos de fuente de vídeo asociados con el objeto de entrada
vídeo obj y devuelve el objeto fuente de video, src, que tiene el valor de la
propiedad Selected en 'on'. Se pueden obtener características dependiendo del
obj. Las propiedades del obj fuente de profundidad que controlan las
características de seguimiento esquelético son las propiedades TrackingMode,
SkeletonToTrack y BodyPosture en el VIDEOSOURCE.

Set(getselectedsource(depthVid), ‘TrackingMode’, ‘Skeleton’);


Ingresas en las características de Video fuente, y modifica el seguimiento del
esqueleto TrackingMode a 20 articulaciones (Skeleton = 20; Position = 10)

Dentro de las características de video fuente el BodyPosture Determina cuantas


articulaciones se rastrean. Si 'BodyPosture' se fija en 'Standing', se rastrean veinte
articulaciones. Si está ajustado a 'Seated', entonces se rastrean diez juntas.

 DeployableVideoPlayer

Muestra fotogramas de vídeo. Este reproductor es capaz de mostrar vídeo de alta


definición a velocidades de fotogramas alta.

Viewer = visión.DeployableVideoPlayer();

 Start(obj);

Inicia el registro de video, pero no hay registro de datos, debido a la configuración


previa de seleccionarla manual; en caso de que hubiera sido automática habría
iniciado desde este momento.

Start(depthVid);

 trigger(obj)

Inicia registro de datos para el objeto de entrada vídeo obj. La entrada obj puede
ser un solo objeto de entrada de vídeo o una matriz de objetos de entrada videos.

trigger(depthVid)

 [data, time, metadata] = getdata(Obj)

Devuelve los datos (metadatos) y los almacena en las siguientes variables, el que
más nos interesa es la variable metadata.

[depthMap, ~ , depthMetaData] = getdata(depthVid);


 Dentro de la variable metadata encontramos todas las operaciones que nos
servirán para el control y extracción de valores dentro de la programación
para obtener los ángulos como se puede ver en la Figura X.

Figura X. Metadatos. Observamos todas las variables que nos servirán para el
cálculo de q1, q2, q3

IsPositionTracked Esta es una matriz booleana (1 x 6) de los


valores verdadero / falso para el
seguimiento de la posición de cada uno de
los seis esqueletos. .
IsSkeletonTracked
Esta es una matriz de (1 x 6) de valores
verdadero / falso para el estado
seguimiento de cada uno de los seis
esqueletos.
JointDepthIndices
Si propiedad BodyPosture se establece en
Standing, se trata de una matriz (20 x 2 x
6) de 20 articulaciones en píxeles con
respecto a la imagen de profundidad, para
los seis posibles esqueletos. Si la
propiedad BodyPosture se establece
en Seated, esta sería una matriz (10 x 2 x
6) de 10 articulaciones.

JointImageIndices Si la función BodyPosture se establece


Standing, se trata de una doble matriz de
(20 x 2 x 6) de 20 articulaciones en píxeles
con respecto al color de la imagen, para los
seis posibles esqueletos. Si BodyPosture
se establece en Seated, esta sería una
matriz (10 x 2 x 6) de durante 10
articulaciones.
JointWorldCoordinates Se trata de una doble matriz (20 x 3 x 6)
de 20 s articulaciones, en metros desde el
sensor, para los seis posibles esqueletos,
si el BodyPostures se establece en
Standing. Si se establece en Seated, esta
sería una matriz (10 x 3 x 6) de 10
articulaciones.
PositionDepthIndices Un doble matriz de 2 x 6 de coordenadas X
e Y de cada esqueleto en píxeles con
respecto a la imagen de profundidad.
PositionImageIndices
Un doble matriz de 2 x 6 de coordenadas X
e Y de cada esqueleto en píxeles con
respecto a la imagen de color.

PositionWorldCoordinates A 3 x 6 doble matriz de la X, Y y Z


coordenadas de cada esqueleto en metros
con respecto al sensor.
SkeletonTrackingID
Esta matriz de enteros de 1 x 6 contiene
los ID de seguimiento de los seis
esqueletos. Estos identificadores de
seguimiento de esqueletos específicos
utilizando la SkeletonsToTrack
ID de seguimiento se generan por el Kinect
y cambian desde la adquisición hasta la
adquisición.
Tabla X. Propiedades de los Metadatos. Observamos las propiedades que
podemos extraer que nos servirán para el cálculo de los ángulos

Ingresamos a cada una de estas propiedades de la siguiente manera:

Metadata.propiedad
Calculo de la Cinemática Inversa:

El proceso de cinemática inversa por métodos geométricos es el más adecuado


para robots de pocos grados de libertad. El procedimiento se basa en encontrar
suficientes relaciones geométricas en la que intervengan las coordenadas del
extremo del robot.

Figura X. Robot de 3 grados de libertad. Se usó este ejemplo ya que los brazos
del bioloid son de 3 grados de libertad.

Comenzamos con el cálculo del primer ángulo que pertenece a la articulación 1


(hombro), como se observa en la Figura X es sencillo realizar este cálculo ya que
dicho ángulo está definido en un plano ZY el cual se obtiene inmediatamente
como:

𝑃𝑧
𝑞1 = tan−1
𝑃𝑦

Tomando en cuenta que los ejes Pz y Py serían las coordenadas del efector final

Ahora considerando únicamente los elementos 2 y 3 que están situados en un


plano Figura X.
H

Figura X. Extracción de las articulaciones 2 y 3. Se observa las articulaciones


que nos ayudaran al cálculo de Q1 y Q3 en un plano (Px, X).

Considerando que se conocen las coordenadas del codo podemos obtener el


valor del radio respecto al codo como se muestra a continuación:

𝑟𝑐𝑜𝑑𝑜 = √𝑟𝑑_𝑐𝑦 2 + 𝑟𝑑_𝑐𝑧 2

Dónde:

𝑟𝑑_𝑐𝑦 = 𝐶𝑜𝑜𝑟𝑑𝑒𝑛𝑎𝑑𝑎 𝑑𝑒𝑙 𝑐𝑜𝑑𝑜 𝑒𝑛 𝑒𝑗𝑒 𝑦

𝑟𝑑_𝑐𝑧 = 𝐶𝑜𝑜𝑟𝑑𝑒𝑛𝑎𝑑𝑎 𝑑𝑒𝑙 𝑐𝑜𝑑𝑜 𝑒𝑛 𝑒𝑗𝑒 𝑧

𝑟𝑑_𝑐𝑥 = 𝐶𝑜𝑜𝑟𝑑𝑒𝑛𝑎𝑑𝑎 𝑑𝑒𝑙 𝑐𝑜𝑑𝑜 𝑒𝑛 𝑒𝑗𝑒 𝑥

A continuación se muestra la obtención de ángulo q2 obtención de ángulo:

𝑟𝑐𝑜𝑑𝑜
𝑞2 = tan−1
𝑟𝑑_𝑐𝑥

Para el cálculo del ángulo q3 retomamos la Figura X. y aplicamos el teorema de


cosenos una vez conociendo todas las longitudes necesarias.
El teorema de cosenos seria:

ℎ2 = 𝑙12 + 𝑙22 − (2 ∗ 𝑙1 ∗ 𝑙2 ∗ cos(𝑞3))

Pero para poder aplicar el teorema es necesario conocer el valor de la hipotenusa


que nos hace falta y lo lograríamos con el teorema de Pitágoras.

ℎ = √𝑟𝑚𝑢ñ𝑒𝑐𝑎 2 + 𝑟𝑑_𝑚𝑥 2

𝑟𝑚𝑢ñ𝑒𝑐𝑎 2 = 𝑟𝑑_𝑚𝑦 2 + 𝑟𝑑_𝑚𝑧 2

Dónde:

𝑟𝑑_𝑚𝑦 = 𝐶𝑜𝑜𝑟𝑑𝑒𝑛𝑎𝑑𝑎 𝑑𝑒 𝑙𝑎 𝑚𝑢ñ𝑒𝑐𝑎 𝑒𝑛 𝑒𝑗𝑒 𝑦

𝑟𝑑_𝑚𝑧 = 𝐶𝑜𝑜𝑟𝑑𝑒𝑛𝑎𝑑𝑎 𝑑𝑒 𝑙𝑎 𝑚𝑢ñ𝑒𝑐𝑎 𝑒𝑛 𝑒𝑗𝑒 𝑧

𝑟𝑑_𝑚𝑥 = 𝐶𝑜𝑜𝑟𝑑𝑒𝑛𝑎𝑑𝑎 𝑑𝑒 𝑙𝑎 𝑚𝑢ñ𝑒𝑐𝑎 𝑒𝑛 𝑒𝑗𝑒 𝑥

Despejamos el ángulo q3:

−1
𝑟𝑑_𝑚𝑥 2 + 𝑟𝑑_𝑚𝑦 2 + 𝑟𝑑_𝑚𝑧 2 − 𝑙12 − 𝑙22
𝑞3 = cos ( )
−2 ∗ 𝑙1 ∗ 𝑙2

Todo esto será la base para el cálculo de los ángulos respecto a las coordenadas
arrojadas por el sensor Kinect para las cuales se tuvieron que hacer algunos
cálculos adicionales
Extracción y cálculo de valores

Dentro de Matlab una vez adquiridos los metadatos y conociendo previamente los
cálculos para obtener los ángulos necesarios para mover el Bioloid no dirigimos a
realizar la extracción de los Metadatos que no harán falta y se realiza de la
siguiente manera:

Es importante conocer el identificador para cada uno de los nodos del cuerpo:

Figura X. ID de cada uno de los nodos. Para nuestra aplicación solo ocuparemos
los nodos de los brazos.

Gracias a la función JointWorldCoordinates se obtiene una matriz de 3 X 20 de la


cual podemos extraer los valores en metros respecto del kinect de cada
articulación.
Figura X. Nodos del brazo derecho. Observamos las coordenadas del brazo
derecho que nos servirán para la cinemática inversa

Para la extracción de estos valores es necesario primero almacenarlos en una


variable para poder extraerlos a otra. Dentro del programa almacenamos estos
valores en una variable llamada World

World = depthMetaData.JointWorldCoordinates (:,:,depthMetaData.IsSkeletonTracked);

y después extraemos cada nodo como se muestra a continuación:

cdx = world(10,1);
cdy = world(10,2);
cdz = world(10,3);

mdx = world(11,1);
mdy = world(11,2);
mdz = world(11,3);

hdx = world(9, 1);


hdy = world(9, 2);
hdz = world(9, 3);

Obtenemos los valores en X,Y,Z para cada articulación.


Cálculo de las articulaciones y Ángulos: Para el cálculo de los ángulos es
necesario conocer las longitudes del brazo por lo que se generó un ciclo while
para que la obtención de las coordenadas fuera de manera infinita, de igual
manera se generó un contador para poder realizar el cálculo de las longitudes del
brazo.

Figura X. Cálculo de las longitudes de brazo. Observamos el cálculo de l1 y l2


los cuales son el brazo y antebrazo

Una vez que se obtuvieron las longitudes l1 y l2 obtenemos los ángulos con las
ecuaciones ya calculadas

Figura X. Resultados de Cálculo de los ángulos. Observamos los ángulos q1, q2


y q3 respectivamente.
RELACIÓN DE ÁNGULOS PARA EL BIOLOID.

Para obtener la relación de ángulos utilizamos la fórmula de pendiente de una


recta

𝑦2 − 𝑦1
𝑦 − 𝑦1 = (𝑥 − 𝑥1)
𝑥2 − 𝑥1

Relación de ángulos Bioloid-


Kinect para el ángulo q2:
Para poder obtener una
ecuación es necesario
conocer el valor cada una de
la articulación en su posición
inicial y final y como resultado
obtenemos.

𝑦2 = 517 − (3.5888888 ∗ 𝑥)

Dónde:
𝑦2 = 𝑣𝑎𝑙𝑜𝑟 𝑑𝑒 𝑠𝑎𝑙𝑖𝑑𝑎 𝑑𝑒 𝑄2
𝑥 = á𝑛𝑔𝑢𝑙𝑜 𝑑𝑒 𝑒𝑛𝑡𝑟𝑎𝑑𝑎 𝑞2

Figura X. Posición de brazo horizontal y completamente en


frente
Relación de ángulos Bioloid-
Kinect para el ángulo q1:
Para poder obtener una
ecuación es necesario
conocer el valor cada una de
la articulación en su posición
inicial y final y como resultado
obtenemos.

𝑦1 = 299 + (3.03333 ∗ 𝑥)

Dónde:
𝑦1 = 𝑣𝑎𝑙𝑜𝑟 𝑑𝑒 𝑠𝑎𝑙𝑖𝑑𝑎 𝑑𝑒 𝑄1
𝑥 = á𝑛𝑔𝑢𝑙𝑜 𝑑𝑒 𝑒𝑛𝑡𝑟𝑎𝑑𝑎 𝑞1
Figura X. Valor de la posición del hombro arriba y abajo.

𝑦3 = −211.2857 + (4.5142 ∗ 𝑥)

Dónde:
𝑦3 = 𝑣𝑎𝑙𝑜𝑟 𝑑𝑒 𝑠𝑎𝑙𝑖𝑑𝑎 𝑑𝑒 𝑄3
𝑥 = á𝑛𝑔𝑢𝑙𝑜 𝑑𝑒 𝑒𝑛𝑡𝑟𝑎𝑑𝑎 𝑞3

Figura X. Valor de la posición del codo a 180° y 90°.

You might also like