Cinemática Directa de un Robot SCARA

Share Embed Donate


Short Description

Download Cinemática Directa de un Robot SCARA...

Description

ROBOT SCARA En la siguiente figura se muestra un robot SCARA RRRP, en donde las tres primeras junturas son revolutas y el frame de las herramientas es una juntura prismática. Asignar los frame’s del mecanismo de eslabones y comprobar la tabla de los parámetros Denavit Hartenberg. En la siguiente figura se muestra los frame’s de cada articulación, las cuales son tres revolutas y una prismática.

Figura 01 Asignación de Frame’s en la Mecánica del Robot. En el planteamiento del problema se nos indica que el ROBOT SCARA tiene cuatro parámetros Denavit Hartenberg con 4 DOF, observar que el último parámetro tiene dos articulaciones, en esta solución se considerara cinco parámetros Denavit Hartenberg con sus 4 DOF. Esta consideración se ha dado por un tema de orden en su solución y el cual no altera su propósito. El primer parámetro Denavit Hartenberg se puede considerar como un parámetro fantasma ya que no aporta ninguna articulación.

1

Comprobación de los parámetros Denavit-Hartenbert. i = 1 theta1 d1 a1 alpha1 i =2 theta2 d2 a2 alpha2 i = 3 theta3 d3 a3 alpha3 i = 4 theta4 d4 a4 alpha4 i = 5 theta5 d5 a5 alpha5

Angulo de x0 a x1 medido alrededor de z1 Distancia de x0 a x1 medida a lo largo de z1 Distancia de z0 a z1 medida a lo largo de x1 Angulo de z0 a z1 medido alrededor de x1

Θ1=0 d1=2 a1=0 α1=0

Angulo de x1 a x2 medido alrededor de z2 Distancia de x1 a x2 medida a lo largo de z2 Distancia de z1 a z2 medida a lo largo de x2 Angulo de z1 a z2 medido alrededor de x2

Θ2=q1 d2=0 a2=3 α2=0

Angulo de x2 a x3 medido alrededor de z3 Distancia de x2 a x3 medida a lo largo de z3 Distancia de z2 a z3 medida a lo largo de x3 Angulo de z2 a z3 medido alrededor de x3

Θ3=q2 d3=0 a3=2 α3=0

Angulo de x3 a x4 medido alrededor de z4 Distancia de x3 a x4 medida a lo largo de z4 Distancia de z3 a z4 medida a lo largo de x4 Angulo de z3 a z4 medido alrededor de x4

Θ4=0 d4=2 a4=0 α4=0

Angulo de x4 a x5 medido alrededor de z5 Distancia de x4 a x5 medida a lo largo de z5 Distancia de z4 a z5 medida a lo largo de x5 Angulo de z4 a z5 medido alrededor de x5

Θ5=q3 d5=q4 a5=0 α5=0

Tabla 01 Cálculo de los parámetros Denavit Hartenberg.

Como se dijo anteriormente existen cinco parámetros Denavit Hartenberg, pero si comparamos los cuatro últimos parámetros Denavit Hartenberg con la solución planteada observaremos que la solución se comprueba. Es muy importante seguir el orden en el que se hallan los parámetros Denavit Hartenberg. i 1 2 3 4 5

Θi 0 q1 q2 0 q3

di d1 0 0 -d4 q4

ai 0 a2 a3 0 0

αi 0 0 0 0 0

Tabla 02 Parámetros Denavit Hartenberg

Programación en software MATLAB Cinemática Directa El objetivo es hallar la Cinemática Directa del Robot Scara, esto quiere decir que a partir de las articulaciones q1, q2, q3 y q4 del robot debemos obtener la posición y orientación del efector final. Para ello utilizamos el Algoritmo Denavit Hartenberg y codificamos el mismo en una función en MATLAB con el nombre “denavit”.

2

Como es sabido el Algoritmo Denavit Hartenberg está conformado por una rotación en el eje Z, una translación en el eje Z, una translación en el eje X y una rotación en el eje X. Todos estas rotaciones y translaciones se dan con respecto al eje móvil, por ende sus matrices se deberán pos multiplicar sobre las matrices de transformaciones previas tal y como se muestra a continuación.

Esto nos dará una matriz de transformación homogénea MTH, como tenemos cuatro parámetros Denavit Hartenberg y un parámetro fantasma obtendremos cinco MTH’S. Es muy importante respetar el orden en el que se da función “denavit”, ya que de esto depende nuestra Cinemática Directa. Demostración del Algorimo Denavit Hartenberg en MATLAB. clear all; close all; clc %-----------------------------------------------------------------------% DEMOSTRACION DEL ALGORITMO DENAVIT HARTENBERG %-----------------------------------------------------------------------% simbolización de las variables. %-----------------------------------------------------------------------syms theta d a alpha % MTH con rotacion alrededor del eje Z rotz = [cos(theta) -sin(theta) 0 0 sin(theta) cos(theta) 0 0 0 0 1 0 0 0 0 1]; % MTH con translacion a lo largo del eje Z pz = [1 0 0 0 0 1 0 0 0 0 1 d 0 0 0 1]; % MTH con translacion a lo largo del eje X px = [1 0 0 a 0 1 0 0 0 0 1 0 0 0 0 1]; % MTH con rotacion alrededor del eje X rotx = [1 0 0 0 0 cos(alpha) -sin(alpha) 0 0 sin(alpha) cos(alpha) 0 0 0 0 1]; % Pos multiplicacion de MTH’S denavit=rotz*pz*px*rotx; % denavit = % % [ cos(theta), -cos(alpha)*sin(theta), sin(alpha)*sin(theta), a*cos(theta)] % [ sin(theta), cos(alpha)*cos(theta), -sin(alpha)*cos(theta), a*sin(theta)] % [ 0, sin(alpha), cos(alpha), d] % [ 0, 0, 0, 1]

Ahora haremos de este algoritmo una función en MATLAB como se menciono anteriormente.

3

%-------------------------------------------------------------------------% FUNCION DENAVIT HARTENBERG %-------------------------------------------------------------------------function dh = denavit(theta,d,a,alpha) dh = [cos(theta) -cos(alpha)*sin(theta) sin(alpha)*sin(theta) a*cos(theta) sin(theta) cos(alpha)*cos(theta) -sin(alpha)*cos(theta) a*sin(theta) 0 sin(alpha) cos(alpha) d 0 0 0 1];

Esta función será llamada para obtener los MTH’S relativas a cada eslabón de nuestro Robot Scara, como tenemos cinco parámetros Denavit Hartenber entonces tendremos 5 MTH’S. Para realizar nuestros plot’s en MATLAB o como en cualquier otro software de cálculo matemático es necesario que cada coordenada en el espacio deba estar referenciado al eje fijo, por lo tanto debemos obtener MTH’S con respecto al Frame Fijo y no respecto al Frame Moviles (referenciados a cada eslabón). Del problema tenemos los siguiente MTH’S

Figura 02 MTH’S respecto a los MTH’S Móviles.

4

Como podemos apreciar en la figura 02 las flechas de amarillo nos hace referencia que el MTH posterior esta referenciado al anterior (relativo a cada eslabón). No está de más decir que estos cinco MTH’S son el resultado de haber llamado cinco veces a la función “denavit”. Ahora multiplicando continuamente uno a uno los MTH’S obtendremos:

Donde: Los MTH’S obtenidos son los que se utilizaran para plotear los Frame’s del robot en MATLAB con la Toolbox “frame”.

Figura 03 MTH’S respecto al MTH Fijo. Como podemos apreciar en la figura 03, las flechas de amarillo nos hace referencia que los MTH’S esta referenciado al Frame Fijo. Ahora para hallar las coordenadas de cada punto del extremo de los eslabones relativos al Frame Fijo, se hallara de la siguiente manera.

5

Sabemos que el MTH aportan la siguiente información:

Figura 04 Información del MTH. Entonces extraeremos la eslabón (Frame Móvil)

columna

cuatro

de

cada

MTH

relativa

a

cada

Figura 05 Coordenadas de cada punto del extremo de los eslabones del robot con respecto a las Coordenadas Móviles.

6

Nuestro objetivo es hallar los puntos de las Coordenadas móviles, , pero con respecto al Frame Fijo, , ahora para poder encontrarlas multiplicaremos los siguientes MTH’S y sus respectivas coordenadas de cada punto del extremo del robot:

Figura 06 Coordenadas de cada punto del extremo de los eslabones con respecto a las Frame Fijo. Gracias a los MTH’S con respecto al Frame Fijo y a los puntos de las coordenadas de los extremos de cada eslabón de nuestro robot, también con respecto al Frame Fijo, podremos realizar su ploteo tanto de los Frame Móviles como de las coordenadas de cada extremo del robot en MATLAB.

7

Con lo descrito anteriormente estamos listos para realizar la cinemática directa en MATLAB tal como sigue: clear all; close all; clc; %-------------------------------------------------------------------------% PARAMETROS DEL ROBOT SCARA RRRP %-------------------------------------------------------------------------d=[2 0 0 2 0]; de los eslabones a lo largo del eje Z a=[0 3 2 0 0]; % distancias de los eslabones a lo largo del eje X %-------------------------------------------------------------------------% ARTICULACIONES %-------------------------------------------------------------------------% R R R P q=[pi/4 pi/6 -pi/2 -2]; % home position %-------------------------------------------------------------------------% PARAMETROS DENAVIT-HARTENBERT %-------------------------------------------------------------------------% theta d a alpha T=[ 0 d(1) 0 0 q(1) 0 a(2) 0 q(2) 0 a(3) 0 0 -d(4) 0 0 q(3) q(4) 0 0]; %-------------------------------------------------------------------------% CALCULO DE LOS MTH CON RESPECTO AL FRAME MOVIL (relativo a los eslabones) %-------------------------------------------------------------------------% theta d a alpha T01=denavit(T(1,1),T(1,2),T(1,3),T(1,4)); T12=denavit(T(2,1),T(2,2),T(2,3),T(2,4)); T23=denavit(T(3,1),T(3,2),T(3,3),T(3,4)); T34=denavit(T(4,1),T(4,2),T(4,3),T(4,4)); T45=denavit(T(5,1),T(5,2),T(5,3),T(5,4)); %-------------------------------------------------------------------------% MTH MOVIL RELATIVO AL FRAME FIJO %-------------------------------------------------------------------------T00=eye(4); T01=T00*T01; % extremo "1" referenciado al eje fijo XYZ (coincidente) T02=T01*T12; % extremo "2" referenciado al eje fijo XYZ T03=T02*T23; % extremo "3" referenciado al eje fijo XYZ T04=T03*T34; % extremo "4" referenciado al eje fijo XYZ T05=T04*T45; % extremo "5" referenciado al eje fijo XYZ %-------------------------------------------------------------------------% VECTOR DE TRANSLACION RELATIVO AL FRAME FIJO %-------------------------------------------------------------------------P1=T00*T01(:,4); P2=T01*T12(:,4); P3=T02*T23(:,4); P4=T03*T34(:,4); P5=T04*T45(:,4); %-------------------------------------------------------------------------% PLOT'S DEL ROBOT SCARA CON SUS RESPECTIVO FRAME’S %-------------------------------------------------------------------------figure title('ROBOT SCARA') frame(T00,'k',.5) hold on plot3([0 P1(1)],[0 P1(2)],[0 P1(3)],'r','linewidth',3)

8

frame(T01,'b',.5) hold on plot3([P1(1) P2(1)],[P1(2) P2(2)],[P1(3) P2(3)],'r','linewidth',3) frame(T02,'b',.5) hold on plot3([P2(1) P3(1)],[P2(2) P3(2)],[P2(3) P3(3)],'r','linewidth',3) frame(T03,'m',.5) hold on plot3([P3(1) P4(1)],[P3(2) P4(2)],[P3(3) P4(3)],'r','linewidth',3) frame(T04,'b',.5) hold on plot3([P4(1) P5(1)],[P4(2) P5(2)],[P4(3) P5(3)],'r','linewidth',3) frame(T05,'g',.5) axis([-1 5 -1 5 -3 3]) grid view(121,44) rotate3d

Los MTH’S relativos al Frame Fijo son: T00 =

T03 =

1

0

0

0

0.2588

-0.9659

0

2.6390

0

1

0

0

0.9659

0.2588

0

4.0532

0

0

1

0

0

0

1.0000

2.0000

0

0

0

1

0

0

0

1.0000

T01 =

T04 =

1

0

0

0

0.2588

-0.9659

0

2.6390

0

1

0

0

0.9659

0.2588

0

4.0532

0

0

1

2

0

0

1.0000

0

0

0

0

1

0

0

0

1.0000

0.2588

0

2.6390

T02 =

T05 =

0.7071

-0.7071

0

2.1213

0.9659

0.7071

0.7071

0

2.1213

-0.2588

0.9659

0

4.0532

0

0

1.0000

2.0000

0

0

1.0000

-2.0000

0

0

0

1.0000

0

0

0

1.0000

9

ROBOT SCARA

Z Y

X Z

Y Z

X

3

Y

X

2

Z

Y X

Z

Y X

Eje Z

1 0 -1

-1

-2

Z

-3 -1

X

0 Y

1 2

0 1

3

2 3

4 4 5

Eje X

5

Eje Y

Plot 01 Mecanismo de Eslabones del Robot Scara. Los Frame de color azul representan las articulaciones de rotación y el de color verde representa la articulación prismática. Cinemática Inversa El objetivo es hallar la Cinemática Inversa del Robot Scara, esto quiere decir que a partir de la posición y orientación de cada extremo de nuestro Robot encontremos las articulación q1, q2, q3 y q4. Esto se realizara a partir de nuestros MTH’S ya que estos posee la información requerida. Previamente observaremos con más detenimiento la información que posee nuestros MTH’S.

[

]

Matriz de transformación Homogénea La matriz “n o a” lleva la información de la orientación de un punto en el espacio XYZ representado por sus respectivos vectores unitarios de cada eje, “eje X”, “eje Y” y del “eje Z”.

10

Ahora extraeremos los tres primeros elementos de la primera columna

[

]

Ahora extraeremos los tres primeros elementos de la segunda columna

[

]

Ahora extraeremos los tres primeros elementos de la tercera columna

[

]

El MTH en función del vector “n o a” quedaría representado:

[

]

Ahora pasaremos a plotearlo su posición y orientación en el espacio XYZ, tal y como sigue:

Figura 07 Representación del Vector Unitario “n o a” en el Espacio XYZ. Este vector unitario “n o a” nos dará la información de la orientación de cada Frame en el espacio, pero este vector unitario “n o a” tendrá que ser extraído exclusivamente de los MTH’S relativos al Frame Fijo.

11

Ahora de la Figura 03 y 06 podemos representar los MTH’S de cada Frame relativo a Frame Fijo en función de sus vectores unitarios “n o a”, así como también de sus posiciones:

[

]

[

]

[

]

[

]

[

]

Como sabemos nuestro Robot Scara está compuesto por un RRRP entonces tendremos que hallar tres articulaciones de rotación (q1, q2 y q3) y una articulación prismática (q4). Obtención de las articulaciones de rotación. Articulación q1

Figura 08 Superposición de los MTH´S M01 y M02. De la figura 08 aplicamos ley de cosenos.

12

Articulación q2

Figura 09 Superposición de los MTH´S M02 y M03. De la figura 09 aplicamos ley de cosenos.

Articulación q3

Figura 10 Superposición de los MTH´S M03 y M04. De la figura 10 aplicamos ley de cosenos.

13

Obtención de la articulación prismática. Articulación q4

Figura 11 Translación del Frame M04 a M05. De la figura 11 aplicamos una simple resta de vectores.

Con lo descrito anteriormente estamos listos para realizar la cinemática inversa en MATLAB tal como sigue: % CINEMATICA INVERSA A PARTIR DE MTH's %-------------------------------------------------------------------------% Articulacion q1 %-------------------------------------------------------------------------sq1 = dot(T02(1:3,1),T01(1:3,2)); cq1 = dot(T02(1:3,2),T01(1:3,2)); q1 = (atan2(sq1,cq1))*180/pi; %-------------------------------------------------------------------------% Articulacion q2 %-------------------------------------------------------------------------sq2 = dot(T03(1:3,1),T02(1:3,2)); cq2 = dot(T03(1:3,2),T02(1:3,2)); q2 = (atan2(sq2,cq2))*180/pi; %-------------------------------------------------------------------------% Articulacion q3 %-------------------------------------------------------------------------sq3 = dot(T05(1:3,1),T04(1:3,2)); cq3 = dot(T05(1:3,1),T04(1:3,1)); q3 = (atan2(sq3,cq3))*180/pi; %-------------------------------------------------------------------------% Articulacion q4 %-------------------------------------------------------------------------q4 = T05(3,4)-T04(3,4); q = [q1 q2 q3 q4];

Las articulaciones ingresadas en la cinemática directa son: q = 45.0000

30.0000

-90.0000

-2.0000

14

Programación en software LABVIEW La programación en el entorno grafico de LABVIEW va hacer simplemente una traducción del código hecho en MATLAB, el cual consistirá de: CINEMÁTICA DIRECTA Primeramente para la cinemática directa es necesario crear una función con el Algoritmo Denavit Hartenberg. SUBVIEW DENAVIT HARTENBERG Análogo a MATLAB se creara un SUBVIEW con el Algoritmo Denavit Hartenberg llamado ”D-H.vi”. Este subview recibe los PARÁMETROS DENAVIT HARTENBEG en un ARRAY 1D con cuatro elementos y nos devolverá una matriz cuadrada de 4x4 que representa la MATRIZ DE TRANSFORMACION HOMOGENEA. Para la creación de este subview se utilizo las siguientes herramientas, INDEX ARRAY, BUILD ARRAY, CONVERTS ARRAY TO MATRIX, COSINE, SINE y un subview que convierta valores de sexagesimales a radianes con el nombre “seg_rad.vi”.

Figura 12 Subview Denavit Hartenberg.

15

Ahora con la subview ya creado se puede empezar a construir la cinemática directa. Comenzaremos creando un WHILE LOOP con su respectivo STOP, para ahorrarle recursos a LABVIEW, y un STACKED SEQUENCE STRUCTURE con cuatro FRAME para tener un orden en la programación. En el “FRAME 0”: Aquí ingresaremos los valores de las articulaciones y las dimensiones de cada eslabón que estructura nuestro robot y todas estas, formaran un ARRAY 2D de 4x4 llamado “Parámetros Denavit-Hartenberg”. Cada uno de estos parámetros ingresara al subview “D-H.view” y obtendremos los MTH’S relativos al Frame Móvil (referenciado a cada eslabón). Para la programación se utilizo REPLACE ARRAY SUBSET, INDEX ARRAY y D-H.view.

Figura 13 Frame 0 del Stacked Sequence Structure. En el “FRAME 1”: Aquí obtendremos los MTH’S referenciados VARIABLES LOCALES y PRODUCTO DE MATRICES

al

Frame

Fijo.

Se

utilizo

Figura 14 Frame 1 del Stacked Sequence Structure.

16

En el “FRAME 2”: Aquí obtendremos las coordenadas de los puntos de los extremos del ROBOT SCARA referenciados al Frame Fijo. Se utilizo VARIABLES LOCALES, GET MATRIX ELEMENTS y PRODUCTO DE MATRICES.

Figura 15 Frame 2 del Stacked Sequence Structure. En el “FRAME 3”: Aquí se recibirá las coordenadas de los puntos de los extremos del ROBOT SCARA referenciados al Frame Fijo y se ordenaran convenientemente las coordenadas para plotearlas. Se utilizo BUILD MATRIX en modo APPEND by columns, TRANSPOSE MATRIX, GET SUBMATRIX, GET MATRIX ELEMENTS, CONVERTS MATRIX TO ARRAY, RESHAPE ARRAY y NI_3DGRAPH.LVLIB: 3D CURVE.VI.

Figura 16 Frame 3 del Stacked Sequence Structure.

17

El ploteo en labview se aprecia seguidamente:

Figura 17 Ploteo del Robot Scara. CINEMÁTICA INVERSA Se creara un SUBVIEW ”Cinematica_Inversa”.

de

cinemática

inversa

con

el

nombre

SUBVIEW CINEMATICA INVERSA Este subview recibe las cinco MATRICES DE TRANSFORMACION HOMOGENEA, relativa al Frame Fijo, y nos retorna una ARRAY 1D con cuatro elementos, que representa las ARTICULACIONES “q”. Para la creación de este subview se utilizo las siguientes herramientas, ARRAY SUBSET, INDEX ARRAY, MULTIPLICADOR DE MATRICES, ATAN2, BUILD ARRAY y un subview que convierta valores de radianes a sexagesimales con el nombre “rad_sex.vi”.

18

Figura 18 Subview Cinemática Inversa. Una vez creado el subview “Cinemática_Inversa” lo incorporamos en el FRAME 1 tal y como se puede apreciar en la siguiente figura.

Figura 19 Actual Frame 1 del Stacked Sequence Structure. El trabajo realizado por este subview se puede apreciar con la comparación de las variables articulares ingresadas y con el ARRAY “Articulaciones q”.

19

Figura 20 Ploteo del Robot Scara con Cinemática Inversa. Ahora en LABVIEW crearemos un subview para graficar los Frame’s de cada extremo del Robot Scara. CREACIÓN DEL SUBVIEW FRAME’S La creación de frame’s para cada extremo de nuestro Robot se hará mediante la ubicación de puntos a lo largo de cada eje del vector “n o a” para su respectivo MTH. Este MTH tiene que ser obligatoriamente con respecto al Frame Fijo, por condiciones de ploteo mencionados en casos anteriores. Entonces respecto al punto de color rojo “M01”, ubicamos un primer punto de color morado a lo largo del vector “y1” a una distancia “b”, luego ubicamos un segundo punto en la misma dirección a una distancia “2b” y finalmente ubicamos un tercer punto en la misma dirección a una distancia “3b”. Las posiciones de los puntos de color morado con respecto al Frame Fijo se hallan seguidamente como:

Las posiciones halladas están referenciadas al Frame Fijo asi que con estos puntos podemos plotear, y como dependen del MTH M01, cuando este varié también variaran las posiciones p1, p2 y p3, graficándose como si fuera un frame para la dirección y1.

20

Figura 21 Puntos a lo largo del vector unitario eje y1. Esto mismo podemos generalizarlo para más punto y para cada uno de los ejes restantes (eje X y eje Z). SUBVIEW GENERACION DE PUNTOS Con las indicaciones anteriormente expuestas creamos un subview con el nombre “generación de puntos”, que ingresándole un MTH (referenciado al Frame Fijo), el eje que deseamos plotear (eje x, eje y, eje z), la cantidad de puntos y el paso o la distancia entre punto y punto, nos retorne una matriz de tantos “nx ny nz” como puntos hallamos ingresado (Matrix de nx3). Para la creación de este subview se utilizo las siguientes herramientas: FOR LOOP, CASE STRUCTURE, INSERT INTO ARRAY, MULTIPLICADOR DE MATRICES, ARRAY SUBSET y REPLACE ARRAY SUBSET.

Figura 22 Subview Generación de Puntos.

21

SUBVIEW FRAME’S Se crea un subview con el nombre “frame’s” al cual se le ingresa el MTH (referenciado al Frame Fijo), los ejes que se van a plotear (“eje x, eje y, eje z”), unos 10 puntos y un paso de 0.1, para retornarnos tres ARRAY 2D con tantos vectores “n o a” (“nx ny nz” “ox oy oz” “ax ay az”) como puntos se hayan ingresado. Finalmente obtendremos el ploteo de un frame muy similar al proporcionado por MATLAB (frame). Para la creación de este subview se utilizo el subview anteriormente creado “generación de puntos”.

Figura 23 Subview Frame’s. SUBVIEW FRAME’S TOTALES Se crea un subview con el nombre “frame’s totales” al cual se los seis MTH’s (referenciado al Frame Fijo), para retornarnos 1D “nx”, “ny” y “nz”, tres ARRAY 1D “ox”, “oy” y “oz” y otros 1D “ax”, “ay” y “az”. Finalmente obtendremos el ploteo de frame’s del Robot Scara.

le ingresa tres ARRAY tres ARRAY todos los

Para la creación de este subview se utilizo el subview anteriormente creado “frame’s”, BUILD ARRAY en modo concaténate inputs e INDEX ARRAY.

22

Figura 24 Subview Frame’s Totales. Finalmente incorporaremos este último subview en el FRAME 1 del STACKED SEQUENCE STRUCTURE.

Figura 25 Actual Frame 1 del Stacked Sequence Structure.

23

También en el FRAME 3 del STACKED SEQUENCE STRUCTURE agregamos NI_3DGRAPH.LVLIB: 3D CURVE.VI más para el grafico de cada eje xyz.

tres

Figura 26 Actual Frame 3 del Stacked Sequence Structure. Y el ploteo de nuestro Robot Scara final se muestra:

Figura 26 Ploteo del Robot Scara con sus respectivos frame’s.

24

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF