Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Prefacio: ........................................................................................................................ 4
4.12 Rotar punto respecto a ejes x e y que pasan por otro punto dado .............. 94
4.12 Rotar punto respecto a ejes dado por dos puntos ......................................... 96
4.13 Calcular robot .................................................................................................. 99
4.14 Obtención de los ejes de las articulaciones .................................................. 100
4.15 Obtención de “eje x”, “eje z” y punto de origen ......................................... 101
4.16 Obtención de “eje y”, normalizazión y dibujado de ejes............................ 106
4.17 Dibujar robot.................................................................................................. 107
4.18 Dibujar elemento eslabón.............................................................................. 108
4.19 Dibujar elemento traslación.......................................................................... 111
4.20 Dibujar elemento rotación ............................................................................ 114
4.21 Dibujar elemento base ................................................................................... 118
4.22 Salvar robot .................................................................................................... 119
4.23 Cargar robot................................................................................................... 119
4.24 Calculo de parámetros DH............................................................................ 120
4.25 Calculo de parámetros di ............................................................................... 123
4.26 Calculo de parámetros ai ............................................................................... 124
4.27 Calculo de parámetros θ i .............................................................................. 126
4.28 Calculo de parámetros α i .............................................................................. 126
4.28 Cinemática directa ......................................................................................... 127
4.29 Cinemática inversa......................................................................................... 129
4.30 Posicionar robot ............................................................................................. 134
4.31 Ayuda .............................................................................................................. 138
4.32 Función auxiliar: Multiplicar vectorialmente vectores simbólicos ........... 138
4.33 Función auxiliar: Redondear a cero los valores de las matrices ............... 138
Prefacio:
FACILIDAD-COMODIDAD-INTEGRACIÓN
- Facilidad: Con un entorno gráfico familiar, con diseño de robots en 3D, con
ventanas, menús desplegables, botones, y demás funciones gráficas que son
familiares a la mayoría de personas.
1.1 Introducción.
La Robótica describe todas las tecnologías asociadas con los robots. Sin
embargo la definición de robot entraña más dificultad, pues existen muchas
definiciones:
Es cierto, como acabamos de observar, que los robots son difíciles de definir. Sin
embargo, no es necesariamente un problema el que no esté todo el mundo de acuerdo
sobre su definición. Quizás, Joseph Engelberg (padre de la robótica industrial) lo
resumió inmejorablemente cuando dijo: "Puede que no se capaz de definirlo, pero sé
cuándo veo uno".
La imagen del robot como una máquina a semejanza del ser humano, subyace en el
hombre desde hace muchos siglos, sin embargo, el robot industrial, que se conoce y
emplea en nuestros días, no surge como consecuencia de la tendencia o afición de
reproducir seres vivientes, sino de la necesidad.
La robótica como ciencia que estudia el robot y su uso se concebiría más tarde,
cuando en 1942 el escritor de origen ruso Isaac Asimov escribió el relato corto
Runaround y la recopilación posterior Yo, Robot. Desde entonces, los robots no sólo
han acaparado la atención de la ciencia ficción sino también la de un creciente número
de investigadores, presentándose como una excelente alternativa para todos aquellos
trabajos que por una u otra causa resultan indeseables para el ser humano.
Los primeros robots industriales fueron los Unimates, desarrollados por George
Devol y Joe Engleberger. Las primeras patentes aparecen en 1946 y pertenecen a
Devol, por sus muy primitivos robots capaces de trasladar maquinaria de un lugar a
otro. También en 1946 aparece la primera computadora: J. Presper Ecker y John
Maulchy construyen el Eniac en la universidad de Pensilvania y la primera máquina
digital de propósito general se desarrolla en el MIT. Más tarde Devol, en 1954, diseña
el primer robot programable y acuña el término “Autómata universal” que
posteriormente recorta a unimation. Ese sería el nombre de la primera compañía de
robótica, fundado por Engleberger, que se considera el padre de la robótica.
Esta definición se queda algo desfasada porque las tareas que puede realizar un
robot son más complejas que las recogidas.
- “Un robot es todo aquel dispositivo mecánico con algún grado de libertad,
destinado a su utilización industrial como manipulador”.
2.1 Introducción
La mayoría de robots tienen los siguientes componentes comunes (ver figura
2.1), aunque la estructura mecánica, eléctrica, y computacional de un robot puede variar
apreciablemente:
Los elementos menores están asociados con la orientación del elemento final, y
junto con los elementos mayores se obtiene el posicionamiento y orientación del
elemento final.
Los otros tres grados de libertad están localizados cerca del punto central de la
herramienta del robot y sirven como “muñeca” para controlar la garra u orientación de
la herramienta. Estos tres grados se denominan giro, elevación y guiñada.
Otra razón para añadir nuevas articulaciones que no añadan grados de libertad
adicionales, es debido a la limitación de rotación de las articulaciones rotativas, que
generalmente no pueden rotar 360º por restricciones mecánicas. Así añadiendo nuevos
grados de movilidad podemos compensar estas limitaciones.
2.4 Articulaciones
Normalmente para el cálculo del espacio del robot se tiene en cuenta el final de
la muñeca y no la herramienta, porque esta no tiene porque ser fija.
2.7 Actuadores
Son los dispositivos que proporcionan la fuerza motriz para las articulaciones de
los robots. Pueden ser de tres tipos según la fuente de energía: Eléctricos, Hidráulicos y
Neumáticos.
Los eléctricos son cada vez más empleados, pues tienen una gran
controlabilidad con un mínimo mantenimiento. Dentro de las diferentes variedades, los
más comunes son los servomotores de corriente continua, los motores paso a paso y los
servomotores de corriente alterna.
2.8 El controlador
· Sensores internos: Son los dispositivos usados para medir la posición, velocidad o
aceleración de las articulaciones del robot y/o del elemento final. Con esta información
tratará más adelante el sistema de control para obtener el movimiento deseado. Pueden
ser de diferentes clases:
V2 (t ) = Vm sin(θ ) sin(ω ac t )
V1 (t ) = Vm cos(θ ) sin(ω ac t )
- Codificadores ópticos: Realizan tareas de determinación de posición con
relativa facilidad y sorprendente precisión, además de no necesitar contacto para
obtener la medida. Pueden ser de 2 tipos:
- Sensores de fuerza y par: Nos indican la fuerza que se está aplicando sobre
un objeto.
- Diseño simple.
- Tamaño pequeño y poco peso.
- Capacidad para agarrar firmemente las piezas.
- Autocentrado
- Una configuración de sujeción habitual.
· Cilindros hidráulicos: Se usan cuando hace falta fuerzas extremadamente altas para
su tamaño, además de muy buenos amortiguamientos y tiempo de respuesta frente a los
circuitos largos. Pero hace falta una bomba hidráulica para cada dispositivo hidráulico
utilizado, además de ser susceptible de fugas.
3.1 Introducción
3.2 Geometría 3D
Empecemos nuestra discusión sobre las tres dimensiones revisando los métodos
de la geometría analítica para definir objetos. El objeto más sencillo es, por supuesto,
un punto. Como en el caso de las dos dimensiones, podemos definir un punto
estableciendo un sistema de coordenadas y listando las coordenadas del punto.
Necesitamos un eje adicional de coordenadas para la tercera dimensión. Podemos
disponer este tercer eje para que forme ángulo recto con los otros dos.
Son necesarias las coordenadas de dos puntos para construir estas ecuaciones
y . Por lo tanto, todavía son necesarios dos puntos para definir
una recta, como cabría esperar. De forma paramétrica, donde cada variable se expresa
en función de un parámetro u:
Esto significa que sólo son necesarias tres constantes para definir un plano. Las
ecuaciones para un plano en particular pueden ser determinadas si conocemos las
coordenadas de tres puntos (que no estén alineados) , y
. Podemos determina la ecuación de la siguiente manera, ya que cada punto
del plano debe satisfacer la ecuación del plano
Tenemos así tres ecuaciones con tres incógnitas que podemos resolver con la
ayuda de un poco de álgebra.
3.4 Traslación
3.5 Rotación
En esta rotación, pensamos en el eje como fijo mientras que algún objeto se
mueve en el espacio. Podemos pensar también que el objeto permanece inmóvil
mientras los ejes se mueven. La diferencia entre uno y otro planteamiento es la
dirección de la rotación. Fijar el eje y girar el objeto en sentido antihorario es lo mismo
que fijar el objeto y mover el eje en sentido horario.
Para hacer una rotación alrededor del eje y, del tal forma que el eje z se
convierte en el x realizamos la siguiente matriz en coordenadas homogéneas
misma son suficientes para definir la recta (ecuación vectorial). El punto de la recta nos
ofrece la información necesaria para la traslación del origen, y la dirección nos informa
de los ángulos de rotación correctos para alinear la recta con el eje z.
Dada la recta:
Si ahora realizamos un giro alrededor del eje x hasta que nuestro eje arbitrario
quede en el plano xz, el segmento proyectado quedará alineado con el eje z. Cuanto vale
el ángulo q ?
y, teniendo en cuenta la figura anterior, es fácil deducir las razones trigonométricas del
ángulo q
Por lo tanto, la matriz de transformación para el giro alrededor del eje x será
Necesitamos realizar ahora un giro de ángulo f alrededor del eje y para que el
segmento quede alineado con el eje z.
Es posible ahora realizar el giro j alrededor del eje escogido. Ya que este eje
está alineado con el eje z, la matriz correspondiente a esta rotación será
4 CAPÍTULO: CINEMÁTICA.
4.1 Introducción.
La cinemática del brazo del robot trata con el estudio analítico de la geometría
del movimiento de un brazo de robot con respecto a un sistema de coordenadas de
referencia fijo sin considerar las fuerzas o momentos que originan el movimiento. Así,
la cinemática se interesa por la descripción analítica del desplazamiento espacial del
robot como una función del tiempo, en particular de las relaciones entre la posición de
las variables de articulación y la posición y orientación del efecto final del brazo del
robot.
Se conoce:
Se conoce:
x= f x (q1 q2 ... qn )
y= f y (q1 q2 ... qn )
z= f z (q1 q2 ... qn )
α= f α (q1 q2 ... qn )
β= f β (q1 q2 ... qn )
γ = f γ (q1 q2 ... qn )
Donde:
q1...n = Son las variables de las articulaciones. Para articulaciones de rotación las
variables son ángulos. Para articulaciones prismáticas las variables son distancias.
x = l1 cos θ1 + l 2 cos(θ1 + θ 2 )
y = l1 senθ1 + l 2 sen(θ1 + θ 2 )
n
A0n = ∏ Aii−1
i =1
Desarrollando la expresión:
⎡cos θ i − senθ i 0 0 ⎤ ⎡1 0 0 0 ⎤ ⎡1 0 0 a i ⎤ ⎡1 0 0 0⎤
⎢ senθ cos θ i 0 0⎥⎥ ⎢⎢0 1 0 0 ⎥⎥ ⎢⎢0 1 ⎥ ⎢
0 0 ⎥ ⎢0 cos α i − senα i 0⎥⎥
Aii−1 =⎢ i
⎢ 0 0 1 0⎥ ⎢0 0 1 d i ⎥ ⎢0 0 1 0 ⎥ ⎢0 senα i cos α i 0⎥
⎢ ⎥⎢ ⎥⎢ ⎥⎢ ⎥
⎣ 0 0 0 1 ⎦ ⎣0 0 0 1 ⎦ ⎣0 0 0 1 ⎦ ⎣0 0 0 1⎦
⎢ 0 senα i cos α i di ⎥
⎢ ⎥
⎣ 0 0 0 1 ⎦
5. Localizar el origen Oi :
6. Establecer X i :
10. Crear una tabla con los parámetros D-H de los eslabones:
Eslabón i θi di ai αi
Donde:
n
T = A = ∏ Aii−1
n
0
i =1
q k = f k ( x, y , z , α , β , γ )
K = 1...n
Donde:
5.1 Introducción
El toolbox de robótica permite al usuario crear y manipular fácilmente tipos de
datos fundamentales para la robótica, como pueden ser las transformaciones
homogéneas, cuaternios y trayectorias. Incluye funciones para la cinemática directa e
inversa, así como la dinámica.
Por ejemplo, para una traslación T = transl(0.5, 0.0, 0.0), una rotación en y T =
roty(pi/2) y una rotación en z T = rotz(pi/2):
TI = T(:,:,i)
Empleando la función FKINE según este último modo, es posible obtener todas
las transformaciones homogéneas correspondientes a una trayectoria dada en el espacio
de variables articulares.
El toolbox incluye una función para resolver la cinemática inversa de los robots,
es la función ikine.
Devuelve los valores de las variables articulares necesarios para que el efector
final del manipulador tenga la posición y orientación dadas por la transformación T. La
solución del problema cinemático inverso no es única en general, y es posible que para
Es posible usar la función para que devuelva las variables articulares correspondientes a
una sola posición y orientación, o bien a una trayectoria de posiciones y orientaciones.
Eso dependerá del formato del parámetro T:
1.1 Introducción.
Durante los estudios universitarios hemos recibido una amplia formación en
robótica, tanto teóricamente como en la práctica, aprendiendo a trabajar
matemáticamente con los robots o a programarlos para que realicen diversas tareas.
- Transformaciones homogéneas
- Cuaternios
- Cinemática
- Dinámica
- Generación de trayectorias
- Gráficas
- Creación de modelos de robots
- Demostraciones
Todas estas funciones nos permiten trabajar con el robot, pero a través de
facilitarle ciertos parámetros. Normalmente trabaja a través de un modelo propio que
crea del robot a partir de la matriz DH que lo define. Esto supone que debemos conocer
dicha matriz para poder realizar ciertos cálculos, lo cual implica ciertos conocimientos
de robótica previos para poder trabajar.
1.2 SICON-BOT.
Hoy en día la robótica se va extendiendo, y cada vez se generaliza más, con lo
cual es conveniente crear ciertas herramientas que permitan acercar a usuarios menos
expertos, como pasó con la informática, que poco a poco se fue convirtiendo en un
tema más generalista y se fueron desarrollando cada vez más unas herramientas más
intuitivas y sencillas.
FACILIDAD-COMODIDAD-INTEGRACIÓN
- Facilidad: Con un entorno gráfico familiar, con diseño de robots en 3D, con
ventanas, menús desplegables, botones, y demás funciones gráficas que son
familiares a la mayoría de personas.
Una vez dibujado el robot, podemos calcular sus ejes y sobre todo su matriz de
Denavit-Hartenberg. Cuando ya tenemos calculada la matriz DH podemos posicionar el
robot en las posiciones deseadas, o calcular su cinemática, tanto directa como inversa.
- Adición de dinámica
- Adición de movimiento en 3D siguiendo trayectorias
- Interacción con otros robots
- Posibilidad de diseñar un entorno de trabajo
- Cambio de plataforma de programación, para lograr una mayor eficacia,
como podría ser el lenguaje de programación C o C++
1.6 Inicialización.
Una vez instalado MATLAB, el toolbox de robótica y SICON-BOT, debemos
iniciar MATLAB,
Con “imread” cargamos una imagen del disco duro en una variable de matlab y
con “subimage” mostramos la imagen en la ventana
Con “uimenu” creamos los menús desplegables y sus opciones, en este ejemplo
creamos el menú desplegable llamado Archivo que contiene las opciones Nuevo
Gráficamente, Salvar Robot, Salvar D-H, Cargar Robot y salir
- Paneles:
Traslación
Rotación
Eslabón
Base
SUBPLOT (m,n,p)
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
Con estos parámetros haremos rotar la figura vertical tantos grados como le
indiquemos alrededor de los ejes “x” y “z” que pasan por el centro de la base del robot.
x y
Para ver el efecto de un giro sobre el eje “z” haremos girar 90º sobre el eje “x” y
45 sobre el eje “z”
Aunque gráficamente será igual girar 90º en el eje “x” o -90º, el robot resultante
será totalmente distinto.
Los elementos se irán colocando uno tras el otro, y el punto inicial de uno se
colocará en el punto inicial del siguiente.
rotación
traslación
eslabón
base
Con estos elementos y sus parámetros podemos dibujar una amplia gama de
robots diferentes.
Botones:
Textos:
Cuadros editables:
Elegimos la posición deseada del elemento y que valor inicial queremos que
aparezca por defecto “0”.
Para poder crear un nuevo robot, tenemos que iniciar el programa desde matlab
escribiendo en el espacio de trabajo “sicon”, con lo que se nos abrirá la ventana de
bienvenida.
4. Una vez que tenemos el elemento totalmente parametrizado, sólo nos queda
indicarle que tipo de elemento es y será añadido automáticamente tomando
como punto inicial el final del elemento anterior o si es el primer elemento,
será colocado en (0,0,0).
Ejemplo:
1.
2.
3.
4.
5. El resultado es:
Así iremos diseñando nuestro robot paso a paso, elemento a elemento, hasta que
tengamos dibujado nuestro robot por completo:
Para calcular el robot, o lo que es lo mismo, obtener los ejes del robot, debemos
ir al menú desplegable “Ejecución” y seleccionar la opción “Calcular robot”.
Una vez calculado los ejes, podemos realizar varias acciones como salvar
nuestro robot, para usarlo en un futuro, calcular sus parámetros de Denavit-Hartenberg
o ver su cinemática directa.
Para salvar el robot es necesario haber calculado sus ejes con anterioridad, y lo
que esto implica, haberlo diseñado. Luego iremos al menú “Archivo” y elegiremos la
opción “Salvar robot”.
Entonces se nos abrirá una ventana donde elegir en que lugar guardar el robot y
con que nombre. Se guardará bajo la extensión “.mat” cuando le demos al botón
guardar.
Entonces se nos abrirá una nueva ventana que contiene los parámetros D-H del
robot representados de forma matricial:
di ai tethai alphai
…
…
…
Con estos tendremos calculados los parámetros D-H de una forma totalmente
automática, con los nombres de las variables que le indicásemos.
Una vez calculado los parámetros D-H, podremos acceder a nuevas opciones del
programa como “Salvar D-H”, “Posicionar Robot” o “Cinemática Inversa”
Para salvar D-H debemos seleccionar la opción “Salvar D-H” del menú
desplegable “Archivo”, elegir donde guardarla y con que nombre.
Para poder ver la cinemática directa del robot debemos ir al menú desplegable
“Ejecución” y seleccionar la opción “Cinemática directa”.
Se nos abrirá una nueva ventana que nos mostrará la cinemática directa del
robot de la siguiente forma:
Así sabremos cual será la posición del extremo del robot a partir del valor de las
variables.
Para poder ver la cinemática inversa del robot debemos ir al menú desplegable
“Ejecución” y seleccionar la opción “Cinemática inversa”.
Una vez pulsemos el botón “calcular” nos aparecerá otra nueva pantalla con un
diseño esquemático del robot en la posición deseada.
Ejemplo:
Para poder ver la cinemática inversa del robot debemos ir al menú desplegable
“Ejecución” y seleccionar la opción “Posicionar robot”.
3.10 Ayuda
Sicon-bot dispone de una pequeña ayuda para aprender a usar el programa.
Dicha ayuda se encuentra en la opción “Ayuda Sicon” del menú desplegable “Ayuda”.
3.10 Herramientas
A la derecha del espacio de trabajo de sicon-bot disponemos de un panel de
herramientas.
- Rotar robot:
- Ver/Ocultar ejes:
Nos permite ocultar los ejes calculados del robot o volver a verlos
cuando deseemos.
- Ver/Ocultar robot:
4.1 Introducción
En resumen:
Conversión
Operación
Conversión
Para ello creamos la ventana principal a través del comando de matlab “figure”
Con este comando y las propiedades que le hemos indicado, se abre una ventana
nueva, que nos devuelve un valor único y representativo que almacenamos en la
variable “hf1” para poder realizar futuras operaciones con la ventana.
Una vez creada la ventana principal, le queremos añadir la imagen del logo del
software de fondo, para ello:
Pero con “uimenu” también podemos crear las opciones que se crearán en el
menú al desplegarse:
Creamos unos paneles para colocar en ellos diferentes elementos y agrupar los
que tienen algo en común. Esta acción la hacemos con el comando uipanel, guardando
su indicador en una variable. Además le indicamos a través de las propiedades
‘BackgroundColor’ y ‘Position’, de que color será y donde estará colocado con respecto
a los límites de la ventana principal, y le damos un nombre con ‘title’:
Lo siguiente será dibujar las figuras de referencia de las que podremos elegir
para añadir a nuestro robot:
Para ello creamos una matriz con las coordenadas de los vértices y otra donde se
le indican las caras de la figura a través de los vértices que la componen. Luego
elegimos el plot donde queremos representar la figura, y ejecutamos el comando
“patch” indicándole la matriz de vértices y la de caras y el color del objeto a través de
la propiedad ‘FaceVertezCData’. También se le indica la manera de colorear el objeto,
en este caso a través de ‘FaceColor’,’flat’, las caras se dibujarán por homogéneas.
Con “Axis xy’ indicamos que los ejes son cartesianos, y con
especificamos el rango que queremos que muestren los ejes.
“camorbit” elige la rotación de la cámara para mostrar el objeto, indicándole la rotación
horizontal y vertical.
Botones de pulsar
Textos
Cuadros editables
Botones de estado
Para añadir un elemento de traslación en nuestro diseño del robot tan sólo
tenemos que parametrizarlo correctamente y pulsar el botón correspondiente. Pero esto
es a nivel de usuario, en la programación es un proceso más complejo que veremos a
continuación.
Analicemos paso por paso la función. Primero elegimos las variables globales
que nos van a ser útiles:
- MR: Es la matriz que contendrá los datos del robot, es decir es nuestro robot
desde el punto de vista matemático.
- Q1: Es un vector que contiene los valores de las diferentes variables de
traslación, según su orden de creación.
- n: Guarda el número de elementos que tiene nuestro robot.
- (x,y,z): Son las coordenadas del punto actual donde se añadirá el siguiente
elemento del robot.
- htextoe: Cuadro editable que contiene el valor de la rotación sobre el eje de
traslación del elemento. (Actualmente “0” por estar deshabilitada).
MR: (1 [2 3 4] [5 6 7] 8)
MR: (tipo de elemento [posición inicial del elemento] [pto. Final] rot. En el eje)
Lo siguiente sería guardar el valor del punto inicial donde dibujar el elemento
en forma simbólica:
El paso siguiente recurre a la llamada de una función que dibuja el robot a partir
del punto inicial y los datos indicados y nos devuelve el nuevo valor inicial para el
próximo elemento a añadir que coincide con el punto final del elemento inicial. Este
dato nos lo devuelve en forma numérica y simbólica:
Luego guardamos el valor de rotación que le indicamos que deseamos que tenga
la representación gráfica del elemento.
Luego guardamos el valor de rotación que le indicamos que deseamos que tenga
la representación gráfica del elemento.
Luego llamamos a una función que nos dibuja el elemento base y nos guarda en
MR el punto final e inicial:
Luego guardamos el valor de rotación que le indicamos que deseamos que tenga
la representación gráfica del elemento.
Luego llamamos a una función que nos dibuja el elemento base y nos guarda en
MR el punto final e inicial:
Luego guardamos el valor de rotación que le indicamos que deseamos que tenga
la representación gráfica del elemento.
Lo segundo sería obtener los ángulos indicados por el usuario, que nos sirven
para posicionar el robot adecuadamente:
A partir del valor del punto inicial, situamos el punto final momentáneamente a
una distancia “L” (anteriormente indicada) en vertical:
Con esto tenemos el elemento situado en vertical y formado por una recta, pero
necesitamos representarlo en 3D, para ello necesitamos obtener 8 vértices, 4 por cada
base.
X8
Pto. final X5
X7
X6
X4
X1
Pto. inicial X3
X2
“Rotar” es una función que rota un punto Pf con respecto a los ejes x e y que
hacemos pasar por otro punto dado Pi. Si hacemos Pi coincidir con el punto inicial del
elemento, éste rotará hasta posicionarse en su posición final.
Ahora rotaremos el punto final en vertical, para obtener el nuevo punto inicial
del siguiente elemento, luego sustituimos los valores simbólicos por los valores
actuales, para tener el valor numérico del nuevo punto inicial:
Ahora que tenemos los vértices posicionados pero de forma simbólica, tenemos
que calcular su valor actual para posicionarlos:
Lo segundo sería obtener los ángulos indicados por el usuario, que nos sirven
para posicionar el robot adecuadamente:
A partir del valor del punto inicial, situamos el punto final coincidente:
Con esto tenemos el elemento situado en vertical y formado por una recta, pero
necesitamos representarlo en 3D, para ello necesitamos obtener 8 vértices, 4 por cada
base.
X8
X5
X7
Pto. final X6
Pto. inicial X4
X1
X3
X2
“Rotar” es una función que rota un punto Pf con respecto a los ejes x e y que
hacemos pasar por otro punto dado Pi. Si hacemos Pi coincidir con el centro de
gravedad del elemento, éste rotará hasta posicionarse en su posición final.
En este caso el punto inicial no variará, por lo que coincidirá con el final.
Ahora que tenemos los vértices posicionados pero de forma simbólica, tenemos
que calcular su valor actual para posicionarlos:
Lo segundo sería obtener los ángulos indicados por el usuario, que nos sirven
para posicionar el robot adecuadamente:
A partir del valor del punto inicial, situamos el punto final momentáneamente a
una distancia “L” (anteriormente indicada) en vertical:
Con esto tenemos el elemento situado en vertical y formado por una recta, pero
necesitamos representarlo en 3D, para ello necesitamos obtener 8 vértices, 4 por cada
base.
X8
Pto. final X5
X7
X6
X4
X1
Pto. inicial X3
X2
“Rotar” es una función que rota un punto Pf con respecto a los ejes x e y que
hacemos pasar por otro punto dado Pi. Si hacemos Pi coincidir con el punto inicial del
elemento, éste rotará hasta posicionarse en su posición final.
Ahora rotaremos el punto final en vertical, para obtener el nuevo punto inicial
del siguiente elemento:
Ahora que tenemos los vértices posicionados pero de forma simbólica, tenemos
que calcular su valor actual para posicionarlos:
Lo segundo sería obtener los ángulos indicados por el usuario, que nos sirven
para posicionar el robot adecuadamente:
A partir del valor del punto inicial, situamos el punto final momentáneamente a
una distancia “L” (anteriormente indicada) en vertical:
Con esto tenemos el elemento situado en vertical y formado por una recta, pero
necesitamos representarlo en 3D, para ello necesitamos obtener 8 vértices, 4 por cada
base.
X8
Pto. final X5
X7
X6
X4
X1
Pto. inicial X3
X2
“Rotar” es una función que rota un punto Pf con respecto a los ejes x e y que
hacemos pasar por otro punto dado Pi. Si hacemos Pi coincidir con el punto inicial del
elemento, éste rotará hasta posicionarse en su posición final.
Ahora rotaremos el punto final en vertical, para obtener el nuevo punto inicial
del siguiente elemento:
Ahora que tenemos los vértices posicionados pero de forma simbólica, tenemos
que calcular su valor actual para posicionarlos:
4.12 Rotar punto respecto a ejes x e y que pasan por otro punto dado
Este procedimiento lo resuelve por completo la función creada para la ocasión:
En esta rotación, pensamos en el eje como fijo mientras que algún objeto se
mueve en el espacio. Podemos pensar también que el objeto permanece inmóvil
mientras los ejes se mueven. La diferencia entre uno y otro planteamiento es la
dirección de la rotación. Fijar el eje y girar el objeto en sentido antihorario es lo mismo
que fijar el objeto y mover el eje en sentido horario.
Para hacer una rotación alrededor del eje y, del tal forma que el eje z se
convierte en el x realizamos la siguiente matriz en coordenadas homogéneas
Dada la recta
Si ahora realizamos un giro alrededor del eje x hasta que nuestro eje arbitrario
quede en el plano xz, el segmento proyectado quedará alineado con el eje z. Cuanto vale
el ángulo q ?
y, teniendo en cuenta la figura anterior, es fácil deducir las razones trigonométricas del
ángulo q
Por lo tanto, la matriz de transformación para el giro alrededor del eje x será
Necesitamos realizar ahora un giro de ángulo f alrededor del eje y para que el
segmento quede alineado con el eje z.
Es posible ahora realizar el giro j alrededor del eje escogido. Ya que este eje
está alineado con el eje z, la matriz correspondiente a esta rotación será:
El primer paso es añadir un falso eslabón al final del último elemento, para
obtener después un eje final:
Una vez que tenemos la matriz MR ya con las variables de traslación y rotación,
pasamos a ejecutar la función “MRtoMRvec”, que es una función que transforma la
matriz con las coordenadas de los eslabones en una matriz con los ejes de las
articulaciones de rotación y traslación y un punto de estos:
Sólo nos falta obtener el “vector y” y dibujar los ejes, lo cual hacemos a través
de la función “Plotejes”:
Luego calcula su eje y un punto de este, si es de rotación resta el punto final del
inicial y obtenemos el eje y cogemos el punto medio del inicial y el final como punto
del eje:
Los vectores directores y los puntos que utilizamos para escribir las ecuaciones
de las rectas nos permiten calcular la posición relativa. Consideremos las matrices A y
B formadas con estos elementos:
cuando el rango de la matriz A es uno, es decir los vectores directores son iguales o
proporcionales, las rectas son paralelas o coincidentes (la misma); serán coincidentes
cuando el rango de B también sea 1 y paralelas cuando el rango de B sea 2.
El punto “P” será el punto del eje que guardamos en la matriz MRvec:
El punto “Q” será el punto del eje siguiente guardado en la matriz MRvec:
El vector “W” será el vector del eje siguiente guardado en la matriz MRvec:
Comparamos el rango, para ello usamos el comando de matlab “rank” que nos
devuelve el rango de una matriz, y comparamos ambos rangos:
Si las rectas se cruzan el vector z será el vector del eje que contiene VRvec, el
punto de origen será el punto del eje actual que contiene MRvec, y el vector x será el
producto vectorial de los vectores del eje actual y el siguiente:
Si las rectas se cortan el vector z será el vector del eje que contiene VRvec, el
punto de origen es el punto de intersección de los dos ejes, que calculamos teniendo en
cuenta las siguientes ecuaciones:
Sólo nos falta el vector x, que será la perpendicular común a los ejes implicados.
El último caso posible es que las rectas sean coincidentes, lo cual resolvemos
dependiendo de varios casos concretos, es decir, pueden existir combinaciones no
contempladas que no se resuelvan correctamente.
Una vez calculados todos los ejes x y el punto donde situarlo, y teniendo
previamente los ejes z de todas las articulaciones, sólo nos queda calcularlos de la
última articulación ficticia. El eje x será la perpendicular común al eje anterior y el
actual, situándolo en el último punto del robot:
El primer paso es crear unos ejes iniciales que serán siempre iguales, y estarán
situados en (0, 0, 0):
Ahora para dibujar los ejes, primero convertimos la matriz simbólica en matriz
numérica con los valores correspondientes a la posición actual:
Por diversas razones podemos necesitar dibujar el robot de nuevo, ya sea porque
lo posicionamos en otra posición, o porque en un momento elegimos que no este visible
y luego queremos que este visible de nuevo. Esta tarea se realiza a través de la función
“dibubot” que a partir de la matriz MR nos dibuja el robot en la posición actual:
lx
ly l1
Con esto tenemos el elemento situado en vertical y formado por una recta, pero
necesitamos representarlo en 3D, para ello necesitamos obtener 8 vértices, 4 por cada
base.
X8
Pto. final X5
X7
X6
X4
X1
Pto. inicial X3
X2
“Rotar” es una función que rota un punto Pf con respecto a los ejes x e y que
hacemos pasar por otro punto dado Pi. Si hacemos Pi coincidir con el punto inicial del
elemento, éste rotará hasta posicionarse en su posición final.
Ahora rotaremos el punto final en vertical, para obtener el nuevo punto inicial
del siguiente elemento:
lx
ly l1
Con esto tenemos el elemento situado en vertical y formado por una recta, pero
necesitamos representarlo en 3D, para ello necesitamos obtener 8 vértices, 4 por cada
base.
X8
Pto. final X5
X7
X6
X4
X1
Pto. inicial X3
X2
“Rotar” es una función que rota un punto Pf con respecto a los ejes x e y que
hacemos pasar por otro punto dado Pi. Si hacemos Pi coincidir con el punto inicial del
elemento, éste rotará hasta posicionarse en su posición final.
Ahora rotaremos el punto final en vertical, para obtener el nuevo punto inicial
del siguiente elemento:
lx
ly l1
Con esto tenemos el elemento situado en vertical y formado por una recta, pero
necesitamos representarlo en 3D, para ello necesitamos obtener 8 vértices, 4 por cada
base.
X8
X5
X7
Pto. final X6
Pto. inicial X4
X1
X3
X2
“Rotar” es una función que rota un punto Pf con respecto a los ejes x e y que
hacemos pasar por otro punto dado Pi. Si hacemos Pi coincidir con el punto inicial del
elemento, éste rotará hasta posicionarse en su posición final.
Ahora rotaremos el punto final en vertical, para obtener el nuevo punto inicial
del siguiente elemento:
Con esto tenemos el elemento situado en vertical y formado por una recta, pero
necesitamos representarlo en 3D, para ello necesitamos obtener 8 vértices, 4 por cada
base.
X8
Pto. final X5
X7
X4
X6
X1
Pto. inicial X3
X2
Una vez indicados donde y con que nombre guardar los datos, procedemos a
salvarlos con la función “save” a la que le indicamos el nombre del archivo a guardar y
las variables a guardar en el archivo que se creará:
Una vez indicados donde y con que nombre se guardaron previamente los datos
del robot, procedemos a cargarlos con la función “load” a la que le indicamos el
nombre del archivo a recuperar:
Luego dibujaremos el robot con la función “dibubot” y sus ejes con la función
“plotejes”:
Lo primero que debemos hacer es calcular los parámetros DH, cuyo cálculo lo
resolveremos en funciones independientes:
Ahora muestro los datos de la siguiente manera, los parámetros “d” los
represento en la primera columna, es decir, dividiendo la pantalla en cuatro divisiones
verticales y sabiendo que la longitud total es 1, “d” se representará en la división que va
de 0 a 0’25. Primero represento el tipo de dato y luego sus valores, por lo que las
divisiones en horizontal son el número de elementos más el nombre del tipo de dato:
a d α θ
… … … …
… … … …
… … … …
… … … …
Ya hemos representado todos los valores, ahora los almacenamos en una matriz
llamada “P_D_H”:
Es el ángulo que forman dos rectas es el ángulo que forman sus vectores directores:
Es el ángulo que forman dos rectas es el ángulo que forman sus vectores directores:
Necesitamos obtener el valor del punto final del robot en función de sus
variables articulares, lo cual obtenemos directamente de la matriz “MR” obteniendo el
punto final del robot, ya que siempre expresamos los puntos en función de las variables.
Luego debemos pasar a numérica la matriz simbólica con los parámetros DH:
Creo una matriz “DH” que contenga a la matriz “P_D_H” más el tipo de
elemento:
Ahora creamos una nueva función a la que se llamará cuando se pulse el botón
calcular, y que nos realizará el cálculo de la cinemática inversa. El cálculo lo
realizamos a través de la función ikine. IKINE calcula la cinemática inversa del
manipulador
Devuelve los valores de las variables articulares necesarios para que el efector
final del manipulador tenga la posición y orientación dadas por la transformación T. La
solución del problema cinemático inverso no es única en general, y es posible que para
una misma orientación y posición deseadas, se obtengan soluciones distintas en función
del vector inicial de variables articulares (Q0) que se le pase a IKINE.
Ahora sustituimos los nombres de las variables por el valor cero en la matriz
“P_D_H” para tenerla en el mismo formato que usa el toolbox de robótica:
Ahora creamos una nueva ventana para introducir los valores articulares con los
que deseamos posicionar el robot, y también daremos la opción de elegir si lo queremos
representar de forma esquemática solamente o también de forma tridimensional:
4.31 Ayuda
Para llamar a la ayuda se hace a través de la función “ayuda”, que abre una
página web (previamente creada con toda la ayuda) en un explorador propio de matlab:
BLOQUE 3: CONCLUSIONES
1 Conclusiones.
El proyecto nació con varios objetivos que según se fue desarrollando fueron
variando.
La mayor parte del peso del proyecto se basa en la parte gráfica del software,
sobre todo en lo que se trata de diseño en tres dimensiones. Otra de las cuestiones a las
que más tiempo se ha dedicado es a la matemática realizada con simbólico. Es decir, lo
difícil fue dibujar el robot según lo indique el usuario y poder posicionarlo o moverlo
porque ello implica una matemática compleja de matrices simbólicas.
2 Desarrollos futuros.
Como hemos dicho este es un proyecto abierto que podrá ser ampliado y
modificado en un futuro.
Pero se pueden hacer muchas más cosas, como la posibilidad de mover el robot
siguiendo trayectorias, o la inclusión de un segundo robot con el que interactuar, o
incluso el diseño de elementos del entorno de trabajo. Quizás para este hecho sea mejor
realizar un cambio en la plataforma de desarrollo y pasar de matlab a algún lenguaje
más eficiente, sobre todo en la parte gráfica.
BLOQUE 4: ANEXOS
function ayuda
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función de ayuda
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
web index.htm
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que dibuja una base, situado entre un punto
inicial y
% otro final. La base dibujada llevará
% el ángulo de giro sobre el eje punto inicial-final
indicados por el usuario:
% [xf yf zf]=base2(xi,yi,zi,xf,yf,zf,ange)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global sp1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Obtenemos datos de altura de la base
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Situamos el punto final a una distancia L en vertical
respecto
% al punto inicial
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
xf=xi;
yf=yi;
zf=zi+l;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con respecto al eje Xi-Xf
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
[x1 y1 z1]=rot(xi,yi,zi,xf,yf,zf,xi-2,yi-2,zi,ange);
[x2 y2 z2]=rot(xi,yi,zi,xf,yf,zf,xi+2,yi-2,zi,ange);
[x3 y3 z3]=rot(xi,yi,zi,xf,yf,zf,xi+2,yi+2,zi,ange);
[x4 y4 z4]=rot(xi,yi,zi,xf,yf,zf,xi-2,yi+2,zi,ange);
[x5 y5 z5]=rot(xi,yi,zi,xf,yf,zf,xi-2,yi-2,zi+l,ange);
[x6 y6 z6]=rot(xi,yi,zi,xf,yf,zf,xi+2,yi-2,zi+l,ange);
[x7 y7 z7]=rot(xi,yi,zi,xf,yf,zf,xi+2,yi+2,zi+l,ange);
[x8 y8 z8]=rot(xi,yi,zi,xf,yf,zf,xi-2,yi+2,zi+l,ange);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibujamos el elemento
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
patch('Vertices',vertices,'Faces',caras,'FaceVertexCData',[0 0
0],'FaceColor','flat');
return
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que dibuja una base, situado en un punto inicial y
% que nos devuelve un punto final. La base dibujada llevará
% los ángulos de inclinación indicados por el usuario:
% [xf yf zf]=base(xi,yi,zi)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global hf1 htextox htextoz htextoz htexto htextoe sp1 sp2 sp3 sp4 sp5
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Obtenemos valor de altura de la base
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
l=str2num(get(htexto,'String'));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Cogemos los valores de los ángulos y los pasamos a
radianes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
angx=-str2num(get(htextox,'String'))*2*pi/360;
angz=-str2num(get(htextoz,'String'))*2*pi/360;
ange=str2num(get(htextoe,'String'))*2*pi/360;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Situamos el punto final a una distancia L en vertical
respecto
% al punto inicial
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
xf=xi;
yf=yi;
zf=zi+l;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con los valores adecuados
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
[x1 y1 z1]=rotar(xi,yi,zi,xi-2,yi-2,zi,angx,angz);
[x2 y2 z2]=rotar(xi,yi,zi,xi+2,yi-2,zi,angx,angz);
[x3 y3 z3]=rotar(xi,yi,zi,xi+2,yi+2,zi,angx,angz);
[x4 y4 z4]=rotar(xi,yi,zi,xi-2,yi+2,zi,angx,angz);
[x5 y5 z5]=rotar(xi,yi,zi,xi-2,yi-2,zi+l,angx,angz);
[x6 y6 z6]=rotar(xi,yi,zi,xi+2,yi-2,zi+l,angx,angz);
[x7 y7 z7]=rotar(xi,yi,zi,xi+2,yi+2,zi+l,angx,angz);
[x8 y8 z8]=rotar(xi,yi,zi,xi-2,yi+2,zi+l,angx,angz);
[xf yf zf]=rotar(xi,yi,zi,xf,yf,zf,angx,angz);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con respecto al eje Xi-Xf
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
[x1 y1 z1]=rot(xi,yi,zi,xf,yf,zf,x1,y1,z1,ange);
[x2 y2 z2]=rot(xi,yi,zi,xf,yf,zf,x2,y2,z2,ange);
[x3 y3 z3]=rot(xi,yi,zi,xf,yf,zf,x3,y3,z3,ange);
[x4 y4 z4]=rot(xi,yi,zi,xf,yf,zf,x4,y4,z4,ange);
[x5 y5 z5]=rot(xi,yi,zi,xf,yf,zf,x5,y5,z5,ange);
[x6 y6 z6]=rot(xi,yi,zi,xf,yf,zf,x6,y6,z6,ange);
[x7 y7 z7]=rot(xi,yi,zi,xf,yf,zf,x7,y7,z7,ange);
[x8 y8 z8]=rot(xi,yi,zi,xf,yf,zf,x8,y8,z8,ange);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibujamos el elemento
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
function ai=calc_ai(MRejes)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% calculamos ai matemáticamente
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
n=size(MRejes,1);
for i=1:n-1
P=MRejes(i,[10 11 12]);
v=MRejes(i,[1 2 3]);
Q=MRejes(i+1,[10 11 12]);
w=MRejes(i+1,[1 2 3]);
q4=simple(P(1)*v(1)+P(2)*v(2)+P(3)*v(3));
k1=Q(1)-P(1);
k2=Q(2)-P(2);
k3=Q(3)-P(3);
mod_v1=sqrt(v(1)^2+v(2)^2+v(3)^2);
A=[v(1)/mod_v1 w(1);v(2)/mod_v1 w(2);v(3)/mod_v1 w(3)];
B=[k1 v(1) w(1);k2 v(2) w(2); k3 v(3) w(3)];
if (rank(A)==1)&(rank(B)==1)
a=cross((Q-P),v);
mod_QP=0;
mod_v=0;
for j=1:3
mod_QP=mod_QP+a(j)^2;
end
for j=1:3
mod_v=mod_v+v(j)^2;
end
mod_QP=sqrt(mod_QP);
mod_v=sqrt(mod_v);
ai(i)=mod_QP/mod_v;
end
if (rank(A)==1)&(rank(B)==2)
a=cross((Q-P),v);
mod_QP=0;
mod_v=0;
for j=1:3
mod_QP=mod_QP+a(j)^2;
end
for j=1:3
mod_v=mod_v+v(j)^2;
end
mod_QP=sqrt(mod_QP);
mod_v=sqrt(mod_v);
ai(i)=mod_QP/mod_v;
end
if (rank(A)==2)&(rank(B)==2)
a=[v(1) w(1) Q(1)-P(1);v(2) w(2) Q(2)-P(2);v(3) w(3) Q(3)-
P(3)];
b=cross(v,w);
mod_QP=0;
mod_v=0;
deta=det(a);
for j=1:3
mod_v=mod_v+b(j)^2;
end
mod_v=sqrt(mod_v);
ai(i)=deta/mod_v;
end
if (rank(A)==2)&(rank(B)==3)
a=cross((Q-P),v);
mod_QP=0;
mod_v=0;
for j=1:3
mod_QP=mod_QP+a(j)^2;
end
for j=1:3
mod_v=mod_v+v(j)^2;
end
mod_QP=sqrt(mod_QP);
mod_v=sqrt(mod_v);
ai(i)=mod_QP/mod_v;
end
end
end
function alphai=calc_alphai(MRejes)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% calcula alphai matemáticamente
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
n=size(MRejes,1);
clear alphai
for i=1:n-1
v=MRejes(i,[1 2 3]);
w=MRejes(i+1,[1 2 3]);
alphai(i)=simple(acos((v(1)*w(1)+v(2)*w(2)+v(3)*w(3))/(sqrt(v(1)^2+v(2
)^2+v(3)^2)*(sqrt(w(1)^2+w(2)^2+w(3)^2)))));
x=cross(v,w);
if (x(1)~=MRejes(i,4))|(x(2)~=MRejes(i,5))|(x(3)~=MRejes(i,6))
alphai(i)=-alphai(i);
end
end
end
function di=calc_di(MRejes)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%Calculo di matemáticamente
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
n=size(MRejes,1);
clear di
for i=2:n
P=MRejes(i-1,[10 11 12]);
v=MRejes(i-1,[4 5 6]);
Q=MRejes(i,[10 11 12]);
w=MRejes(i,[4 5 6]);
q4=simple(P(1)*v(1)+P(2)*v(2)+P(3)*v(3));
k1=Q(1)-P(1);
k2=Q(2)-P(2);
k3=Q(3)-P(3);
mod_v1=sqrt(v(1)^2+v(2)^2+v(3)^2);
A=[v(1)/mod_v1 w(1);v(2)/mod_v1 w(2);v(3)/mod_v1 w(3)];
B=[k1 v(1) w(1);k2 v(2) w(2); k3 v(3) w(3)];
if (rank(A)==1)&(rank(B)==1) %coincidentes
a=cross((Q-P),v);
mod_QP=0;
mod_v=0;
for j=1:3
mod_QP=mod_QP+a(j)^2;
end
for j=1:3
mod_v=mod_v+v(j)^2;
end
mod_QP=sqrt(mod_QP);
mod_v=sqrt(mod_v);
di(i-1)=mod_QP/mod_v;
end
if (rank(A)==1)&(rank(B)==2) %paralelos
a=cross((Q-P),v);
mod_QP=0;
mod_v=0;
for j=1:3
mod_QP=mod_QP+a(j)^2;
end
for j=1:3
mod_v=mod_v+v(j)^2;
end
mod_QP=sqrt(mod_QP);
mod_v=sqrt(mod_v);
di(i-1)=mod_QP/mod_v;
end
if (rank(A)==2)&(rank(B)==2) %se cortan
a=[v(1) w(1) Q(1)-P(1);v(2) w(2) Q(2)-P(2);v(3) w(3) Q(3)-
P(3)];
b=cross(v,w);
mod_QP=0;
mod_v=0;
deta=det(a);
for j=1:3
mod_v=mod_v+b(j)^2;
end
mod_v=sqrt(mod_v);
di(i-1)=deta/mod_v;
end
if (rank(A)==2)&(rank(B)==3) %se cruzan
a=cross((Q-P),v);
mod_QP=0;
mod_v=0;
for j=1:3
mod_QP=mod_QP+a(j)^2;
end
for j=1:3
mod_v=mod_v+v(j)^2;
end
mod_QP=sqrt(mod_QP);
mod_v=sqrt(mod_v);
di(i-1)=mod_QP/mod_v;
end
end
end
function tethai=calc_tethai(MRejes)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Obtenemos el valor de tethai
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
syms Q2_simb2
syms x positive
n=size(MRejes,1); %Nº de ejes del robot
clear tethai
a=0;
for i=2:n
if MRejes(i,13)==1 %Si es de rotación hago cambio de
variable para que el valor de tethai sea solo el nombre de la variable
correspondiente
a=a+1;
tethai(i-1)= Q2_simb(a);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculo cual sería el valor de tethai sin el cambio de
variable,
% por si puedo necesitarlo mas adelante, y lo guardo en
Q2_simb2(a)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
v=MRejes(i-1,[4 5 6]);
w=MRejes(i,[4 5 6]);
Q2_simb2(a)=simple(acos((v(1)*w(1)+v(2)*w(2)+v(3)*w(3))/(sqrt(v(1)^2+v
(2)^2+v(3)^2)*(sqrt(w(1)^2+w(2)^2+w(3)^2)))));
x=cross(v,w);
mod_x=simple(abs(sqrt(x(1)^2+x(2)^2+x(3)^2)));
x=[x(1)/mod_x x(2)/mod_x x(3)/mod_x];
if (x(1)~=MRejes(i,1))|(x(2)~=MRejes(i,2))|(x(3)~=MRejes(i,3))
Q2_simb2(a)=2*pi-Q2_simb2(a);
end
Q2_simb2_aux(a)=subs(Q2_simb2(a),Q2_simb(a),0);
Q2_simb2(a)=Q2_simb2(a)-Q2_simb2_aux(a);
else
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Resuelvo la matemática necesaria para calcular tethai
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
v=MRejes(i-1,[4 5 6]);
w=MRejes(i,[4 5 6]);
x=cross(v,w);
tethai(i-
1)=simple(acos((v(1)*w(1)+v(2)*w(2)+v(3)*w(3))/(sqrt(v(1)^2+v(2)^2+v(3
)^2)*(sqrt(w(1)^2+w(2)^2+w(3)^2)))));
mod_x=simple(abs(sqrt(x(1)^2+x(2)^2+x(3)^2)));
function calcbot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculo los ejes del robot a partir de la matriz MR
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:n
MRaux(i,:)=MR(i,:); %variable aux de MR
end
clear MR
a=0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% rotamos de forma simbólica el robot según las variables de
rotación
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:n
if MRaux(i,1)==2
a=a+1;
for j=i+1:n
[MRaux(j,2) MRaux(j,3)
MRaux(j,4)]=rot(MRaux(i,2),MRaux(i,3),MRaux(i,4),MRaux(i,5),MRaux(i,6)
,MRaux(i,7),MRaux(j,2),MRaux(j,3),MRaux(j,4),Q2_simb(a));
[MRaux(j,5) MRaux(j,6)
MRaux(j,7)]=rot(MRaux(i,2),MRaux(i,3),MRaux(i,4),MRaux(i,5),MRaux(i,6)
,MRaux(i,7),MRaux(j,5),MRaux(j,6),MRaux(j,7),Q2_simb(a));
MRaux=simple(MRaux);
end
MRaux=simple(MRaux);
end
end
MR=MRaux;
MR_simb=MRaux; %Creamos MR con los
valores simbólicos de rotación
MRvec=simple(MRtoMRvec(MRaux)); %Paso de matriz de robot a
matriz con vector del eje de la articulacion
MRperp=simple(MRvectoMRperp(MRvec,MRaux)); %Obtengo la matriz con
vector z + punto de origen + vector x
MRejes=simple(plotejes(MRperp)); %Obtengo el resto de ejes
y los dibujo
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% habilitaciones de nuevas opciones del menu
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
set(mfile_save,'Enable','on')
set(graph_DH,'Enable','on')
set(graph_calcbot,'Enable','off')
set(htras,'Enable','off');
set(heje,'Enable','off');
set(hrot,'Enable','off');
set(hgarra,'Enable','off');
set(hbase,'Enable','off');
set(graph_cindir,'Enable','on');
end
function cin_dir
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Muestra la cinemática directa que se obtiene directamente del punto
final
% del último elemento del robot, que está almacenado en MR
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
figure('Visible','on',...
'Units','normalized',...
'Renderer','opengl',...
'Color',[1 1 1],...
'Resize','on',...
'Name','Cinemática Inversa',...
'NumberTitle','off',...
'DockControls','off',...
'MenuBar','none',...
'Interruptible','off',...
'BusyAction','cancel',...
'Position',[0.15 0.15 0.6 0.6]);
uicontrol('Style', 'text', ...
'Callback',@label,...
'String',char(MR_simb(n,5)),...
'backgroundcolor',[1 1 1],...
'Units','normalized',...
'Position',[.4 0.7 .5
.05],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
uicontrol('Style', 'text', ...
'Callback',@label,...
'String',char(MR_simb(n,6)),...
'backgroundcolor',[1 1 1],...
'Units','normalized',...
'Position',[.4 0.5 .5
.05],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
uicontrol('Style', 'text', ...
'Callback',@label,...
'String',char(MR_simb(n,7)),...
'backgroundcolor',[1 1 1],...
'Units','normalized',...
'Position',[.4 0.3 .5
.05],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
uicontrol('Style', 'text', ...
'Callback',@label,...
'String','x=',...
'backgroundcolor',[1 1 1],...
'ForegroundColor','b',...
'FontWeight','bold',...
'Units','normalized',...
'Position',[.2 0.7 .1
.05],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
uicontrol('Style', 'text', ...
'Callback',@label,...
'String','y=',...
'backgroundcolor',[1 1 1],...
'ForegroundColor','b',...
'FontWeight','bold',...
'Units','normalized',...
'Position',[.2 0.5 .1
.05],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
uicontrol('Style', 'text', ...
'Callback',@label,...
'String','z=',...
'backgroundcolor',[1 1 1],...
'ForegroundColor','b',...
'FontWeight','bold',...
'Units','normalized',...
'Position',[.2 0.3 .1
.05],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
end
function cin_inv
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que calcula la cinemática inversa del robot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculamos el nº de articulaciones, el tipo y el orden
% de ellas.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=2:size(MRejes,1)
if MRejes(i,13)==1
a(i-1)=0;
cont1=cont1+1;
Var(i-1)=Q2_simb(cont1);
end
if MRejes(i,13)==2
a(i-1)=1;
cont2=cont2+1;
Var(i-1)=Q1_simb(cont2);
end
end
a(cont1+cont2+1)=0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Nueva ventana para introducir los datos de las variables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for j=1:num_simb_rot
P_D_Haux=subs(P_D_Haux,Q1_simb(j),0);
end
for j=1:num_simb_rot2
P_D_Haux=subs(P_D_Haux,Q2_simb(j),0);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creo la matriz del robot para usarla en el toolbox de robótica
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:n
siconbot{i}=link([P_D_Haux(i,1) P_D_Haux(i,2) P_D_Haux(i,3)
P_D_Haux(i,4) a(i)],'modified');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Cálculo de DH
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
DH=P_D_Haux;
for i=1:(size(DH,1))
DH(i,5)=a(i);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% ventana para introducir datos
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
figure('Visible','on',...
'Units','normalized',...
'Renderer','opengl',...
'Color',[1 1 1],...
'Resize','on',...
'Name','Cinemática Inversa',...
'NumberTitle','off',...
'DockControls','off',...
'MenuBar','none',...
'Interruptible','off',...
'BusyAction','cancel',...
'Position',[0.15 0.15 0.6 0.6]);
hintdata = uicontrol('style','pushbutton',...
'Callback',@intdata2,...
'backgroundcolor',[.724, .724, .724],...
'String','Calcular',...
'Units','normalized',...
'Position',[.8 .5 .1 .05],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
%introducir x
xedit=uicontrol('Style', 'edit', ...
'Units','normalized',...
'backgroundcolor',[1 1 1],...
'Position',[.2 0.7 .1
.05],...
'Enable','on',...
'Interruptible','off',...
'String','0',...
'BusyAction','cancel');
% Introducir y
yedit=uicontrol('Style', 'edit', ...
'Units','normalized',...
'backgroundcolor',[1 1 1],...
'Position',[.2 0.5 .1
.05],...
'Enable','on',...
'Interruptible','off',...
'String','0',...
'BusyAction','cancel');
% Introducir z
zedit=uicontrol('Style', 'edit', ...
'Units','normalized',...
'backgroundcolor',[1 1 1],...
'Position',[.2 0.3 .1
.05],...
'Enable','on',...
'Interruptible','off',...
'String','0',...
'BusyAction','cancel');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Nos dibuja las variables y su valor y
% las coloca en la ventana dependiendo del nº de variables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
b=1/(n-1);
c=1+b/2;
for i=1:n-1
uicontrol('Style', 'text', ...
'Callback',@label,...
'String',char(Var(1,i)),...
'backgroundcolor',[1 1 1],...
'Units','normalized',...
'Position',[.4 c-b .1
.05],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% creamos el robot según toolbox de robótica
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
robotd2=robot(siconbot,'Robot de siconbot');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que nos calcula la cinemática inversa
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
n=size(P_D_H,1);
stol=1e-3;
ilimit=1000;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Matriz de posición final deseada necesaria para "ikine"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
TG = [1 0 0 str2num(get(xedit,'String'));0 1 0
str2num(get(yedit,'String'));0 0 1 str2num(get(zedit,'String'));0 0 0
1];
vectorq0=zeros(1,tras+rotac-1); %Posición inicial
q=ikine(DH,stol,ilimit,TG,vectorq0,[1 1 1 1 1 1]); %Cálculo de
cinemática Inversa
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibujamos el robot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
plot(robotd2,q) %Posicionar robot
axis on
AXIS([0 30 0 30 0 40]);
camorbit(165,0)
grid on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Mostrar valores de variables articulares
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:n-1
set(hdata(i),'String',num2str(q(i)));
end
end
function V3=cross_sym(V1,V2)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% multiplica vectorialmente vectores simbólicos
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
function dibubot(MR)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que dibuja el robot equivalente a la matriz MR
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculamos MR con valores reales
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for j=1:num_simb_rot
MR=subs(MR,Q1_simb(j),Q1(j)); %Mr para valores concretos de las
variables
end
for j=1:num_simb_rot2
MR=subs(MR,Q2_simb(j),-Q2(j)); %Mr para valores concretos de las
variables
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibuja el tipo de elemento
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:n
switch MR(i,1)
case 1
traslac2(MR(i,2),MR(i,3),MR(i,4),MR(i,5),MR(i,6),MR(i,7),MR(i,8));
case 2
eje2(MR(i,2),MR(i,3),MR(i,4),MR(i,5),MR(i,6),MR(i,7),MR(i,8));
case 3
eslabon2(MR(i,2),MR(i,3),MR(i,4),MR(i,5),MR(i,6),MR(i,7),MR(i,8));
case 4
base2(MR(i,2),MR(i,3),MR(i,4),MR(i,5),MR(i,6),MR(i,7),MR(i,8));
case 5
garra2(MR(i,2),MR(i,3),MR(i,4),MR(i,5),MR(i,6),MR(i,7),MR(i,8));
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que dibuja una eje de rotación, situado entre un
punto inicial y
% otro final. La base dibujada llevará
% el ángulo de giro sobre el eje punto inicial-final
indicados por el usuario:
% [xf yf zf]=base(xi,yi,zi)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global sp1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculo pto dnd se centrará el eje
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
xi1=(xi+xf)/2;
yi1=(yi+yf)/2;
zi1=(zi+zf)/2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculamos la longitud del tramo para obtener el ángulo de
giro
% sobre el eje x a partir de zf y zi. Dependiendo del signo
de
% (yf-yi) el giro será en un sentido o en otro.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
l=sqrt(abs(xf-xi)^2+abs(yf-yi)^2+abs(zf-zi)^2);
% if (xi==xf)&(yi==yf)
% angz=0;
% angx=0;
% else
% angx=-(pi/2-asin((zf-zi)/l));
% lx=xf-xi;
% ly=yf-yi;
% l1=sqrt(lx^2+ly^2);
% V=[lx/l1 ly/l1 0]*l;
% xf1=V(1);
% yf1=V(2);
% zf1=V(3);
% angz=-(pi/2-acos(xf1/l));
% end
if (yf-yi)>0.0001 %ángulo positicvo
angx=-(pi/2-asin((zf-zi)/l));
else %ángulo negativo
angx=(pi/2-asin((zf-zi)/l));
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculamos el giro sobre el eje z a partir del pto inicial
y
% final.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
xf=xi;
yf=yi;
zf=zi+1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con los valores adecuados
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
[x1 y1 z1]=rotar(xi1,yi1,zi1,xi1,yi1-0.6,zi1-0.5,angx,angz);
[x2 y2 z2]=rotar(xi1,yi1,zi1,xi1+0.6,yi1,zi1-0.5,angx,angz);
[x3 y3 z3]=rotar(xi1,yi1,zi1,xi1,yi1+0.6,zi1-0.5,angx,angz);
[x4 y4 z4]=rotar(xi1,yi1,zi1,xi1-0.6,yi1,zi1-0.5,angx,angz);
[x5 y5 z5]=rotar(xi1,yi1,zi1,xi1,yi1-0.6,zi1+0.5,angx,angz);
[x6 y6 z6]=rotar(xi1,yi1,zi1,xi1+0.6,yi1,zi1+0.5,angx,angz);
[x7 y7 z7]=rotar(xi1,yi1,zi1,xi1,yi1+0.6,zi1+0.5,angx,angz);
[x8 y8 z8]=rotar(xi1,yi1,zi1,xi1-0.6,yi1,zi1+0.5,angx,angz);
[xf yf zf]=rotar(xi1,yi1,zi1,xf,yf,zf,angx,angz);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con respecto al eje Xi-Xf
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
if ange
[x1 y1 z1]=rot(xi,yi,zi,xf,yf,zf,x1,y1,z1,ange);
[x2 y2 z2]=rot(xi,yi,zi,xf,yf,zf,x2,y2,z2,ange);
[x3 y3 z3]=rot(xi,yi,zi,xf,yf,zf,x3,y3,z3,ange);
[x4 y4 z4]=rot(xi,yi,zi,xf,yf,zf,x4,y4,z4,ange);
[x5 y5 z5]=rot(xi,yi,zi,xf,yf,zf,x5,y5,z5,ange);
[x6 y6 z6]=rot(xi,yi,zi,xf,yf,zf,x6,y6,z6,ange);
[x7 y7 z7]=rot(xi,yi,zi,xf,yf,zf,x7,y7,z7,ange);
[x8 y8 z8]=rot(xi,yi,zi,xf,yf,zf,x8,y8,z8,ange);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibujamos el elemento
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que dibuja un eje de rotación, situado en un punto
inicial y
% que nos devuelve un punto final. El eje dibujado llevará
% los ángulos de inclinación indicados por el usuario:
% [xf yf zf]=eje(xi,yi,zi)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global hf1 htextox htextoz htextoz htexto htextoe sp1 sp2 sp3 sp4 sp5
n MR htextot1 num_simb_rot2 Q2_simb Q2 rotac num_simb_rot Q1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Obtenemos datos de variable
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
num_simb_rot2=num_simb_rot2+1;
l=str2num(get(htexto,'String'));
a=get(htextot1,'String');
Q2_simb(num_simb_rot2)=a;
L=sym(a);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Cogemos los valores de los ángulos y los pasamos a
radianes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
angx=-str2num(get(htextox,'String'))*2*pi/360;
angz=-str2num(get(htextoz,'String'))*2*pi/360;
ange=str2num(get(htextoe,'String'))*2*pi/360;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Situamos el punto final a una distancia L en vertical
respecto
% al punto inicial
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
xf=xi;
yf=yi;
zf=zi;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con los valores adecuados
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
[x1 y1 z1]=rotar(xi,yi,zi,xi,yi-0.6,zi-0.5,angx,angz);
[x2 y2 z2]=rotar(xi,yi,zi,xi+0.6,yi,zi-0.5,angx,angz);
[x3 y3 z3]=rotar(xi,yi,zi,xi,yi+0.6,zi-0.5,angx,angz);
[x4 y4 z4]=rotar(xi,yi,zi,xi-0.6,yi,zi-0.5,angx,angz);
[x5 y5 z5]=rotar(xi,yi,zi,xi,yi-0.6,zi+0.5,angx,angz);
[x6 y6 z6]=rotar(xi,yi,zi,xi+0.6,yi,zi+0.5,angx,angz);
[x7 y7 z7]=rotar(xi,yi,zi,xi,yi+0.6,zi+0.5,angx,angz);
[x8 y8 z8]=rotar(xi,yi,zi,xi-0.6,yi,zi+0.5,angx,angz);
[xf yf zf]=rotar(xi,yi,zi,xf,yf,zf,angx,angz);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con respecto al eje Xi-Xf
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
[x1 y1 z1]=rot(xi,yi,zi-0.5,xf,yf,zf+0.5,x1,y1,z1,ange);
[x2 y2 z2]=rot(xi,yi,zi-0.5,xf,yf,zf+0.5,x2,y2,z2,ange);
[x3 y3 z3]=rot(xi,yi,zi-0.5,xf,yf,zf+0.5,x3,y3,z3,ange);
[x4 y4 z4]=rot(xi,yi,zi-0.5,xf,yf,zf+0.5,x4,y4,z4,ange);
[x5 y5 z5]=rot(xi,yi,zi-0.5,xf,yf,zf+0.5,x5,y5,z5,ange);
[x6 y6 z6]=rot(xi,yi,zi-0.5,xf,yf,zf+0.5,x6,y6,z6,ange);
[x7 y7 z7]=rot(xi,yi,zi-0.5,xf,yf,zf+0.5,x7,y7,z7,ange);
[x8 y8 z8]=rot(xi,yi,zi-0.5,xf,yf,zf+0.5,x8,y8,z8,ange);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%sustituimos las variables por su valor
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:num_simb_rot
x1=subs(x1,Q1(i));
x2=subs(x2,Q1(i));
x3=subs(x3,Q1(i));
x4=subs(x4,Q1(i));
x5=subs(x5,Q1(i));
x6=subs(x6,Q1(i));
x7=subs(x7,Q1(i));
x8=subs(x8,Q1(i));
y1=subs(y1,Q1(i));
y2=subs(y2,Q1(i));
y3=subs(y3,Q1(i));
y4=subs(y4,Q1(i));
y5=subs(y5,Q1(i));
y6=subs(y6,Q1(i));
y7=subs(y7,Q1(i));
y8=subs(y8,Q1(i));
z1=subs(z1,Q1(i));
z2=subs(z2,Q1(i));
z3=subs(z3,Q1(i));
z4=subs(z4,Q1(i));
z5=subs(z5,Q1(i));
z6=subs(z6,Q1(i));
z7=subs(z7,Q1(i));
z8=subs(z8,Q1(i));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibujamos el elemento
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
function env_bot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Funcion que nos permite posicionar el robot en la posición
% indicada, según el valor de las articulaciones
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculamos el nº de articulaciones, el tipo y el orden
% de ellas.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=2:size(MRejes,1)
if MRejes(i,13)==1 %Articulación de traslacion
a(i-1)=0; %Vector con tipo de variable
articular
cont1=cont1+1;
Var(i-1)=Q2_simb(cont1); %Vector con variables
articulares ordenadas
end
if MRejes(i,13)==2
a(i-1)=1;
cont2=cont2+1;
Var(i-1)=Q1_simb(cont2);
end
end
a(cont1+cont2+1)=0; %Creamos un articulación
ficticia al final del robot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Damos valor cero a las variables articulares para adaptarlas
al
% formato del toolbox de robótica
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for j=1:num_simb_rot
P_D_Haux=subs(P_D_Haux,Q1_simb(j),0);
end
for j=1:num_simb_rot2
P_D_Haux=subs(P_D_Haux,Q2_simb(j),0);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Nueva ventana para introducir los datos de las variables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
figure('Visible','on',...
'Units','normalized',...
'Renderer','opengl',...
'Color',[1 1 1],...
'Resize','on',...
'Name','Introducir datos',...
'NumberTitle','off',...
'DockControls','off',...
'MenuBar','none',...
'Interruptible','off',...
'BusyAction','cancel',...
'Position',[0.15 0.15 0.6 0.6]);
% Botón
hintdata = uicontrol('style','pushbutton',...
'Callback',@intdata,...
'backgroundcolor',[.724, .724, .724],...
'String','Intr. Dato',...
'Units','normalized',...
'Position',[.6 .6 .1 .05],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
% Checkbox
hcheck = uicontrol('style','checkbox',...
'Callback',@check,...
'backgroundcolor',[1 1 1],...
'String','Ver Robot en
3D',...
'Units','normalized',...
'Position',[.6 .4 .15
.05],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Nos dibuja las variables para que le podamos asignar un valor
y
% las coloca en la ventana dependiendo del nº de variables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creo la matriz del robot para usarla en el toolbox de robótica
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:n
siconbot{i}=link([P_D_Haux(i,1) P_D_Haux(i,2) P_D_Haux(i,3)
P_D_Haux(i,4) a(i)],'modified');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% creamos el robot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
robotd2=robot(siconbot,'Robot de siconbot');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Obtenemos los valores de las articulaciones
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:size(hdata,2)
vector(i)=str2num(get(hdata(i),'String'));
end
vector(i+1)=0; %Ultima articulación(Ficticia)=0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibujamos el robot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
plot(robotd2,vector) %dibuja el robot
axis on
AXIS([0 30 0 30 0 40]);
camorbit(165,0)
grid on
if checkdata==1 % si queremos dibujarlo en 3D
cont2=0;
cont1=0;
for i=1:size(hdata,2)
if MRejes(i+1,13)==1
Q2(cont2+1)=str2num(get(hdata(i),'String')); %valor de
variables
cont2=cont2+1;
end
if MRejes(i+1,13)==2
Q1(cont1+1)=str2num(get(hdata(i),'String')); %Valor de
variables
cont1=cont1+1;
end
end
figure(hf1) %Seleccionamos figure principal de
siconbot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Preparamos el subplot principal
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
delete (sp1)
sp1=subplot(5,3,[2 3 5 6 8 9 11 12 14 15]);
xlabel('eje x');
ylabel('eje y');
axis on
AXIS([-30 30 -30 30 0 40]);
camorbit(165,0)
grid on
subplot(sp1)
for i=1:n
MRaux(i,:)=MR(i,:); %variable aux de MR
end
clear MR
a=0;
MR=MR_simb;
dibubot(MR) %dibuja robot en 3D
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global checkdata
if checkdata==0
checkdata=1;
else
chackdata=0;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que dibuja un eslabón, situado entre un punto
inicial y
% otro final. La base dibujada llevará
% el ángulo de giro sobre el eje punto inicial-final
indicados por el usuario:
% [xf yf zf]=eslabon2(xi,yi,zi,xf,yf,zf,ange)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global sp1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculamos la longitud del tramo para obtener el ángulo de
giro
% sobre el eje x a partir de zf y zi. Dependiendo del signo
de
% (yf-yi) el giro será en un sentido o en otro.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculamos el giro sobre el eje z a partir del pto inicial
y
% final.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Situamos el punto final a una distancia L en vertical
respecto
% al punto inicial
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
xf=xi;
yf=yi;
zf=zi+l;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con los valores adecuados
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
[x1 y1 z1]=rotar(xi,yi,zi,xi-0.5,yi-0.5,zi,angx,angz);
[x2 y2 z2]=rotar(xi,yi,zi,xi+0.5,yi-0.5,zi,angx,angz);
[x3 y3 z3]=rotar(xi,yi,zi,xi+0.5,yi+0.5,zi,angx,angz);
[x4 y4 z4]=rotar(xi,yi,zi,xi-0.5,yi+0.5,zi,angx,angz);
[x5 y5 z5]=rotar(xi,yi,zi,xi-0.5,yi-0.5,zi+l,angx,angz);
[x6 y6 z6]=rotar(xi,yi,zi,xi+0.5,yi-0.5,zi+l,angx,angz);
[x7 y7 z7]=rotar(xi,yi,zi,xi+0.5,yi+0.5,zi+l,angx,angz);
[x8 y8 z8]=rotar(xi,yi,zi,xi-0.5,yi+0.5,zi+l,angx,angz);
[xf yf zf]=rotar(xi,yi,zi,xf,yf,zf,angx,angz);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con respecto al eje Xi-Xf
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
if ange
[x1 y1 z1]=rot(xi,yi,zi,xf,yf,zf,x1,y1,z1,ange);
[x2 y2 z2]=rot(xi,yi,zi,xf,yf,zf,x2,y2,z2,ange);
[x3 y3 z3]=rot(xi,yi,zi,xf,yf,zf,x3,y3,z3,ange);
[x4 y4 z4]=rot(xi,yi,zi,xf,yf,zf,x4,y4,z4,ange);
[x5 y5 z5]=rot(xi,yi,zi,xf,yf,zf,x5,y5,z5,ange);
[x6 y6 z6]=rot(xi,yi,zi,xf,yf,zf,x6,y6,z6,ange);
[x7 y7 z7]=rot(xi,yi,zi,xf,yf,zf,x7,y7,z7,ange);
[x8 y8 z8]=rot(xi,yi,zi,xf,yf,zf,x8,y8,z8,ange);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibujamos el elemento
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que dibuja una eslabón, situado en un punto
inicial y
% que nos devuelve un punto final. El eslabón dibujado
llevará
% los ángulos de inclinación indicados por el usuario:
% [xf yf zf]=eslabon(xi,yi,zi)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global hf1 htextox htextoz htextoz htexto htextoe sp1 sp2 sp3 sp4 sp5
tras Q1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculamos el nº de elementos de traslacion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
if tras>1
tras2=tras-1;
else tras2=tras;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Obtenemos datos de longitud
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
l=str2num(get(htexto,'String'));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Cogemos los valores de los ángulos y los pasamos a
radianes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
angx=-str2num(get(htextox,'String'))*2*pi/360;
angz=-str2num(get(htextoz,'String'))*2*pi/360;
ange=str2num(get(htextoe,'String'))*2*pi/360;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Situamos el punto final a una distancia L en vertical
respecto
% al punto inicial
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
xf=xi;
yf=yi;
zf=zi+l;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con los valores adecuados
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
[x1 y1 z1]=rotar(xi,yi,zi,xi-0.5,yi-0.5,zi,angx,angz);
[x2 y2 z2]=rotar(xi,yi,zi,xi+0.5,yi-0.5,zi,angx,angz);
[x3 y3 z3]=rotar(xi,yi,zi,xi+0.5,yi+0.5,zi,angx,angz);
[x4 y4 z4]=rotar(xi,yi,zi,xi-0.5,yi+0.5,zi,angx,angz);
[x5 y5 z5]=rotar(xi,yi,zi,xi-0.5,yi-0.5,zi+l,angx,angz);
[x6 y6 z6]=rotar(xi,yi,zi,xi+0.5,yi-0.5,zi+l,angx,angz);
[x7 y7 z7]=rotar(xi,yi,zi,xi+0.5,yi+0.5,zi+l,angx,angz);
[x8 y8 z8]=rotar(xi,yi,zi,xi-0.5,yi+0.5,zi+l,angx,angz);
[xf yf zf]=rotar(xi,yi,zi,xf,yf,zf,angx,angz);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con respecto al eje Xi-Xf
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
if ange
[x1 y1 z1]=rot(xi,yi,zi,xf,yf,zf,x1,y1,z1,ange);
[x2 y2 z2]=rot(xi,yi,zi,xf,yf,zf,x2,y2,z2,ange);
[x3 y3 z3]=rot(xi,yi,zi,xf,yf,zf,x3,y3,z3,ange);
[x4 y4 z4]=rot(xi,yi,zi,xf,yf,zf,x4,y4,z4,ange);
[x5 y5 z5]=rot(xi,yi,zi,xf,yf,zf,x5,y5,z5,ange);
[x6 y6 z6]=rot(xi,yi,zi,xf,yf,zf,x6,y6,z6,ange);
[x7 y7 z7]=rot(xi,yi,zi,xf,yf,zf,x7,y7,z7,ange);
[x8 y8 z8]=rot(xi,yi,zi,xf,yf,zf,x8,y8,z8,ange);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%sustituimos las variables por su valor
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
x1=subs(x1,Q1(tras2));
x2=subs(x2,Q1(tras2));
x3=subs(x3,Q1(tras2));
x4=subs(x4,Q1(tras2));
x5=subs(x5,Q1(tras2));
x6=subs(x6,Q1(tras2));
x7=subs(x7,Q1(tras2));
x8=subs(x8,Q1(tras2));
y1=subs(y1,Q1(tras2));
y2=subs(y2,Q1(tras2));
y3=subs(y3,Q1(tras2));
y4=subs(y4,Q1(tras2));
y5=subs(y5,Q1(tras2));
y6=subs(y6,Q1(tras2));
y7=subs(y7,Q1(tras2));
y8=subs(y8,Q1(tras2));
z1=subs(z1,Q1(tras2));
z2=subs(z2,Q1(tras2));
z3=subs(z3,Q1(tras2));
z4=subs(z4,Q1(tras2));
z5=subs(z5,Q1(tras2));
z6=subs(z6,Q1(tras2));
z7=subs(z7,Q1(tras2));
z8=subs(z8,Q1(tras2));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibujamos el elemento
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que dibuja una garra, situado entre un punto
inicial y
% otro final. La garra dibujada llevará
% el ángulo de giro sobre el eje punto inicial-final
indicados por el usuario:
% [xf yf zf]=garra2(xi,yi,zi,xf,yf,zf,ange)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global sp1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculamos la longitud del tramo para obtener el ángulo de
giro
% sobre el eje x a partir de zf y zi. Dependiendo del signo
de
% (yf-yi) el giro será en un sentido o en otro.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
l=sqrt(abs(xf-xi)^2+abs(yf-yi)^2+abs(zf-zi)^2);
angx=-(pi/2-asin((zf-zi)/l));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculamos el giro sobre el eje z a partir del pto inicial
y
% final.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
if (xi==xf)&(yi==yf)
angz=0;
else
lx=xf-xi;
ly=yf-yi;
l1=sqrt(lx^2+ly^2);
V=[lx/l1 ly/l1 0]*l;
xf1=V(1);
yf1=V(2);
zf1=V(3);
angz=-(pi/2-acos(xf1/l));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Situamos el punto final a una distancia L en vertical
respecto
% al punto inicial
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
xf=xi;
yf=yi;
zf=zi+l;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con los valores adecuados
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
[x1 y1 z1]=rotar(xi,yi,zi,xi-0.5,yi-0.5,zi,angx,angz);
[x2 y2 z2]=rotar(xi,yi,zi,xi+0.5,yi-0.5,zi,angx,angz);
[x3 y3 z3]=rotar(xi,yi,zi,xi+0.5,yi+0.5,zi,angx,angz);
[x4 y4 z4]=rotar(xi,yi,zi,xi-0.5,yi+0.5,zi,angx,angz);
[x5 y5 z5]=rotar(xi,yi,zi,xi,yi,zi+l,angx,angz);
[xf yf zf]=rotar(xi,yi,zi,xf,yf,zf,angx,angz);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con respecto al eje Xi-Xf
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
if ange
[x1 y1 z1]=rot(xi,yi,zi,xf,yf,zf,x1,y1,z1,ange);
[x2 y2 z2]=rot(xi,yi,zi,xf,yf,zf,x2,y2,z2,ange);
[x3 y3 z3]=rot(xi,yi,zi,xf,yf,zf,x3,y3,z3,ange);
[x4 y4 z4]=rot(xi,yi,zi,xf,yf,zf,x4,y4,z4,ange);
[x5 y5 z5]=rot(xi,yi,zi,xf,yf,zf,x5,y5,z5,ange);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibujamos el elemento
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que dibuja una garra, situada en un punto inicial
y
% que nos devuelve un punto final. La garra dibujada llevará
% los ángulos de inclinación indicados por el usuario:
% [xf yf zf]=garra(xi,yi,zi)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global hf1 htextox htextoz htextoz htexto htextoe sp1 sp2 sp3 sp4 sp5
l=str2num(get(htexto,'String'));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Cogemos los valores de los ángulos y los pasamos a
radianes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
angx=-str2num(get(htextox,'String'))*2*pi/360;
angz=-str2num(get(htextoz,'String'))*2*pi/360;
ange=str2num(get(htextoe,'String'))*2*pi/360;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Situamos el punto final a una distancia L en vertical
respecto
% al punto inicial
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
xf=xi;
yf=yi;
zf=zi+l;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con los valores adecuados
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
[x1 y1 z1]=rotar(xi,yi,zi,xi-0.5,yi-0.5,zi,angx,angz);
[x2 y2 z2]=rotar(xi,yi,zi,xi+0.5,yi-0.5,zi,angx,angz);
[x3 y3 z3]=rotar(xi,yi,zi,xi+0.5,yi+0.5,zi,angx,angz);
[x4 y4 z4]=rotar(xi,yi,zi,xi-0.5,yi+0.5,zi,angx,angz);
[x5 y5 z5]=rotar(xi,yi,zi,xi,yi,zi+l,angx,angz);
[xf yf zf]=rotar(xi,yi,zi,xf,yf,zf,angx,angz);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con respecto al eje Xi-Xf
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
if ange
[x1 y1 z1]=rot(xi,yi,zi,xf,yf,zf,x1,y1,z1,ange);
[x2 y2 z2]=rot(xi,yi,zi,xf,yf,zf,x2,y2,z2,ange);
[x3 y3 z3]=rot(xi,yi,zi,xf,yf,zf,x3,y3,z3,ange);
[x4 y4 z4]=rot(xi,yi,zi,xf,yf,zf,x4,y4,z4,ange);
[x5 y5 z5]=rot(xi,yi,zi,xf,yf,zf,x5,y5,z5,ange);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibujamos el elemento
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
function loadbot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que carga un robot almacenado en disco
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global hf1 htextox htextoz htextoz htexto htextoe sp1 sp2 sp3 sp4 sp5
sp6 sp7 n num_simb_rot Q1_simb Q1 MRejes Q2_simb num_simb_rot2 Q2
htras heje hrot hgarra hbase graph_DH graph_calcbot MR_simb
graph_cindir graph_cininv rotac tras
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% carga las variables del archivo
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% carga las variables al workspace
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
load(fname)
for i=1:n
MRaux(i,:)=MR(i,:); %variable aux de MR
end
clear MR
a=0;
MR=MR_simb;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Habilitacion de nuevas opciones en el menu
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
set(htras,'Enable','off');
set(heje,'Enable','off');
set(hrot,'Enable','off');
set(hgarra,'Enable','off');
set(hbase,'Enable','off');
set(graph_DH,'Enable','on')
set(graph_calcbot,'Enable','off')
set(graph_cindir,'Enable','on')
return
function MRvec=MRtoMRvec(MR)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que transforma la matriz con las coordenadas de los
% eslabones en una matriz con los ejes de las articulaciones de
% rotación y traslacion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
num=0;
n=size(MR,1);
MRvec=sym([0 0 0 0 0 0 0]);
for i=1:n
x0=MR(i,2);
y0=MR(i,3);
z0=MR(i,4);
if (MR(i,1)==1)|(MR(i,1)==2) %eje rot o tras
x1=MR(i,5);
y1=MR(i,6);
z1=MR(i,7);
num=num+1;
if MR(i,1)==2
%si la articulacion es de rotacion el eje se calcula:
MRvec(num,:)=simple([(x0+x1)/2 (y0+y1)/2 (z0+z1)/2 x1-x0
y1-y0 z1-z0 1]);
else
%si la articulacion es de traslaccion el eje se calcula:
MRvec(num,:)=simple([x1 y1 z1 x1-x0 y1-y0 z1-z0 2]);
end
end
if (i==n)&(MR(i,1)~=1)&(MR(i,1)~=2) %si es un ultimo eslabon y no
es una articulacion
x1=MR(i,5);
y1=MR(i,6);
z1=MR(i,7);
num=num+1;
MRvec(num,:)=simple([MR(i-1,2) MR(i-1,3) MR(i-1,4) MR(i-1,5)-
MR(i-1,2) MR(i-1,6)-MR(i-1,3) MR(i-1,7)-MR(i-1,4) 0]);
end
end
end
function MRperp=MRvectoMRperp(MRvec,MR)
k1=q1-p1;
k2=q2-p2;
k3=q3-p3;
mod_v1=sqrt(v1^2+v2^2+v3^2);
A=[v1/mod_v1 w1;v2/mod_v1 w2;v3/mod_v1 w3];
B=[k1 v1 w1;k2 v2 w2; k3 v3 w3];
if rectas==0 %coincidentes
end
end
if rectas==1 % Paralelas
q1_=simple(det([q1 0 0 -w1;q2 1 0 -w2;q3 0 1 -w3;q4 v2 v3
0])/det([1 0 0 -w1; 0 1 0 -w2; 0 0 1 -w3; v1 v2 v3 0]));
q2_=simple(det([1 q1 0 -w1;0 q2 0 -w2;0 q3 1 -w3;v1 q4 v3
0])/det([1 0 0 -w1; 0 1 0 -w2; 0 0 1 -w3; v1 v2 v3 0]));
q3_=simple(det([1 0 q1 -w1;0 1 q2 -w2;0 0 q3 -w3;v1 v2 q4
0])/det([1 0 0 -w1; 0 1 0 -w2; 0 0 1 -w3; v1 v2 v3 0]));
u(i,:)=([simple(q1_-p1) simple(q2_-p2) simple(q3_-
p3)]/sqrt((q1_-p1)^2+(q2_-p2)^2+(q3_-p3)^2));
%sum(abs([simple(q1_-p1) simple(q2_-p2) simple(q3_-
p3)]).^2)^(1/2));%norm([q1_-p1 q2_-p2 q3_-p3]);
MRperp(i,:)=simple([MRvec(i,[4 5 6]) p1 p2 p3 u(i,:)
MRvec(i,7)]);
end
if rectas==3 %Cortan
x=simple((det([k1 w1 u(1);k2 w2 u(2);k3 w3 u(3)])/det([v1 w1
u(i,1);v2 w2 u(i,2);v3 w3 u(i,3)])));
r1=simple(p1+abs(x)*v1);
r2=simple(p2+abs(x)*v2);
r3=simple(p3+abs(x)*v3);
MRperp(i,:)=([MRvec(i,[4 5 6]) r1 r2 r3 u(i,:) MRvec(i,7)]);
end
if rectas==4 % Cruzan
MRperp(i,:)=([MRvec(i,[4 5 6]) p1 p2 p3 u(i,:) MRvec(i,7)]);
end
end
MRperp(i+1,:)=([MRvec(i+1,[4 5 6]) MR(n2,[5 6 7]) u(i,:)
MRvec(i+1,7)]); %vector z + punto de origen + vector x
end
function nuevo()
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función para dibujar un nuevo robot, cargar uno ya existente o
% salvar uno nuevo al disco
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global hf1 htextox htextoy htextoz htexto htextoe sp1 sp2 sp3 sp4 sp5
sp6 sp7 MR mfile_save n mfile_load mfile_graf mfile_DH n MRperp MRvec
t htextot1 num_simb_rot Q1_simb x y z tras hejes hbot graph_DH MRejes
hrot3d Q1 rotac Q2_simb Q2 num_simb_rot2 graph_calcbot htras heje hrot
hgarra hbase xinf xsup yinf ysup zinf zsup t1 q1 q2 q3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%inicializacion de variables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% lim de los ejes del plot principal
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
xinf=-30;
xsup=30;
yinf=-30;
ysup=30;
zinf=0;
zsup=40;
ejes=[-20 20 -20 20 0 20];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Color de fondo
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Habilita opciones del menu
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
set(mfile_load,'Enable','on')
set(mfile_graf,'Enable','off')
set(mfile_DH,'Enable','off')
set(graph_calcbot,'Enable','on')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creación de paneles
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creación de Plots para la representación de las figuras
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
sp1=subplot(5,3,[2 3 5 6 8 9 11 12 14 15]);
xlabel('eje x','color','r');
ylabel('eje y','color','g');
sp2=subplot(5,3,1);
sp3=subplot(5,3,4);
sp4=subplot(5,3,7);
sp5=subplot(5,3,10);
sp6=subplot(5,3,13);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Borrado de ejes de los subplots
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(sp1);
axis off
subplot(sp2);
axis off
subplot(sp3);
axis off
subplot(sp4);
axis off
subplot(sp5);
axis off
subplot(sp6);
axis off
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibujo de Figuras de referencia
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% traslacion
vertices1=[x-0.3 y-0.3 z;x+0.3 y-0.3 z;x+0.3 y+0.3 z;x-0.3 y+0.3 z;x-
0.3 y-0.3 z+7;x+0.3 y-0.3 z+7;x+0.3 y+0.3 z+7;x-0.3 y+0.3 z+7];
caras1=[1 2 3 4;1 2 6 5;2 3 7 6;3 4 8 7;1 4 8 5;5 6 7 8];
subplot(sp2)
patch('Vertices',vertices1,'Faces',caras1,'FaceVertexCData',[.4, .4,
.125],'FaceColor','flat');
AXIS([-0.5 9.5 -0.5 9.5 0 10]);
camorbit(55,-45)
% Rotación
vertices2=[x y-0.5 z;x+0.5 y z;x y+0.5 z;x-0.5 y z;x y-0.5 z+1;x+0.5 y
z+1;x y+0.5 z+1;x-0.5 y z+1];
caras2=[1 2 3 4;5 6 7 8;1 5 6 2;2 6 7 3;7 8 4 3;8 4 1 5];
subplot(sp3)
patch('Vertices',vertices2,'Faces',caras2,'FaceVertexCData',[1, 0,
0],'FaceColor','flat');
AXIS([-0.5 9.5 -0.5 9.5 0 10]);
camorbit(55,-45)
% Eslabón
vertices3=[x-0.5 y-0.5 z;x+0.5 y-0.5 z;x+0.5 y+0.5 z;x-0.5 y+0.5 z;x-
0.5 y-0.5 z+7;x+0.5 y-0.5 z+7;x+0.5 y+0.5 z+7;x-0.5 y+0.5 z+7];
caras3=[1 2 3 4;1 2 6 5;2 3 7 6;3 4 8 7;1 4 8 5;5 6 7 8];
subplot(sp4)
patch('Vertices',vertices3,'Faces',caras3,'FaceVertexCData',[.8, .4,
.125],'FaceColor','flat');
axis xy
AXIS([-0.5 9.5 -0.5 9.5 0 10]);
camorbit(55,-45)
% Base
vertices4=[x-1 y-1 z;x+1 y-1 z;x+1 y+1 z;x-1 y+1 z;x-1 y-1 z+1;x+1 y-1
z+1;x+1 y+1 z+1;x-1 y+1 z+1];
caras4=[1 2 3 4;1 2 6 5;2 3 7 6;3 4 8 7;1 4 8 5;5 6 7 8];
subplot(sp5)
patch('Vertices',vertices4,'Faces',caras4,'FaceVertexCData',[0, 0,
0],'FaceColor','flat');
axis xy
AXIS([-1 8 -1 8 0 4]);
camorbit(55,-15)
% Garra
vertices5=[x-0.5 y-0.5 z;x+0.5 y-0.5 z;x+0.5 y+0.5 z;x-0.5 y+0.5 z;x y
z+1];
caras3=[1 2 3 4;1 2 5 5;2 3 5 5;3 4 5 5;1 4 5 5];
subplot(sp6)
patch('Vertices',vertices3,'Faces',caras3,'FaceVertexCData',[.0, .1,
.0],'FaceColor','flat');
axis xy
AXIS([-0.5 9.5 -0.5 9.5 0 10]);
camorbit(55,-45)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(sp1)
axis on
AXIS([xinf xsup yinf ysup zinf zsup]); %Límite de ejes
camorbit(165,0) % Cámara
grid on
camlight right
camlight left
lighting phong
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Botones, Textos y cuadros editables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
rotate_struct = load([matlabroot,'/toolbox/matlab/icons/rotate.mat']);
rotate_cdata = rotate_struct.cdata;
imgejes = imread('ejes.TIF');
imgbot = imread('robot.TIF');
%boton de rotación
hrot3d = uicontrol('Style','togglebutton',...
'Callback',@rot3d,...
'Tag','mypan',...
'Units','normalized',...
'Position',[0.95 0.94 0.03
0.03],...
'CData',rotate_cdata,...
'Interruptible','off',...
'BusyAction','cancel');
%longitud
htexto = uicontrol('Style', 'edit', ...
'Units','normalized',...
'backgroundcolor',[1 1 1],...
%rot z
htextoz = uicontrol('Style', 'edit', ...
'Units','normalized',...
'backgroundcolor',[1 1 1],...
'Position',[.31 .11 .05
.03],...
'Enable','on',...
'Interruptible','off',...
'String','0',...
'BusyAction','cancel');
%rot x
htextox = uicontrol('Style', 'edit', ...
'Units','normalized',...
'backgroundcolor',[1 1 1],...
'Position',[.31 .16 .05
.03],...
'Enable','on',...
'Interruptible','off',...
'String','0',...
'BusyAction','cancel');
%Rot eje
htextoe = uicontrol('Style', 'edit', ...
'Units','normalized',...
'backgroundcolor',[1 1 1],...
'Position',[.31 .21 .05
.03],...
'Enable','off',...
'Interruptible','off',...
'String','0',...
'BusyAction','cancel');
%Limite traslacion
htextot = uicontrol('Style', 'edit', ...
'Units','normalized',...
'backgroundcolor',[1 1 1],...
'Position',[.31 .92 .05
.03],...
'Enable','off',...
'Interruptible','off',...
'String','10',...
'BusyAction','cancel');
%limite rot -
htextor1 = uicontrol('Style', 'edit', ...
'Units','normalized',...
'backgroundcolor',[1 1 1],...
'Position',[.31 .60 .05
.03],...
'Enable','off',...
'Interruptible','off',...
'String','-360',...
'BusyAction','cancel');
%limite rot +
htextor2 = uicontrol('Style', 'edit', ...
'Units','normalized',...
'backgroundcolor',[1 1 1],...
'Position',[.31 .55 .05
.03],...
'Enable','off',...
'Interruptible','off',...
'String','360',...
'BusyAction','cancel');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejecutar la función del tipo de pieza elegida
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% colocar traslacion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
function varargout = colocar1(varargin)
if n==0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Colocar rotacion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Colocar eslabon
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global MR n x y z htextoe
if n==0
MR=sym([0 0 0 0 0 0 0 0]);
end
n=n+1; %nº de elementos
MR(n,[2 3 4])=[x y z]; %pto inicial
[x y z]=eslabon(x,y,z); %pto final
MR(n,[5 6 7])=[x y z];
MR(n,1)=3; %tipo elem
MR(n,8)=str2num(get(htextoe,'String'))*2*pi/360; %rot eje
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% colocar base
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global MR n x y z htextoe
if n==0
MR=sym([0 0 0 0 0 0 0 0]);
end
n=n+1; %nº de elementos
MR(n,[2 3 4])=[x y z]; %pto inicial
[x y z]=base(x,y,z); %pto final
MR(n,[5 6 7])=[x y z];
MR(n,1)=4; %tipo de elem
MR(n,8)=str2num(get(htextoe,'String'))*2*pi/360; %rot eje
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% colocar garra
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global MR n x y z htextoe
if n==0
MR=sym([0 0 0 0 0 0 0 0]);
end
n=n+1; %nº de elemento
MR(n,[2 3 4])=[x y z]; %pto inicial
[x y z]=garra(x,y,z); %pto final
MR(n,[5 6 7])=[x y z];
MR(n,1)=5; %tipo de elem
MR(n,8)=str2num(get(htextoe,'String'))*2*pi/360; %rot eje
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% habilitar/deshabilitar rotacion 3D
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global hrot3d
persistent enable_state;
val = get(hrot3d,'Value');
switch val
case 0
rotate3d off;
case 1
rotate3d on;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Habilitar o Deshabilitar ver ejes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
persistent enable_state;
val1 = get(hejes,'Value');
val2 = get(hbot,'Value');
delete (sp1)
sp1=subplot(5,3,[2 3 5 6 8 9 11 12 14 15]);
xlabel('eje x');
ylabel('eje y');
axis on
AXIS([-30 30 -30 30 0 40]);
camorbit(165,0)
grid on
if val1==1
plotejes(MRperp); %mostrar ejes si esta activado
end
if val2==1 %si esta activada la opción de dibujar robot
for i=1:n
MRaux(i,:)=MR(i,:); %variable aux de MR
end
clear MR
a=0;
for i=1:n
if MRaux(i,1)==2
a=a+1;
%rotar tramos
for j=i+1:n
[MRaux(j,2) MRaux(j,3)
MRaux(j,4)]=rot(MRaux(i,2),MRaux(i,3),MRaux(i,4),MRaux(i,5),MRaux(i,6)
,MRaux(i,7),MRaux(j,2),MRaux(j,3),MRaux(j,4),Q2_simb(a));
[MRaux(j,5) MRaux(j,6)
MRaux(j,7)]=rot(MRaux(i,2),MRaux(i,3),MRaux(i,4),MRaux(i,5),MRaux(i,6)
,MRaux(i,7),MRaux(j,5),MRaux(j,6),MRaux(j,7),Q2_simb(a));
end
MRaux=simple(MRaux);
end
end
MR=MRaux;
dibubot(MR); %dibujar robot
end
end
function Par_DH
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que calcula los parámetros DH
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
P_D_H=sym([0 0 0 0]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Nueva ventana
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
hf2=figure('Visible','on',...
'Units','normalized',...
'Renderer','opengl',...
'Color',[1 1 1],...
'Resize','on',...
'Name','Parámetros D-H',...
'NumberTitle','off',...
'DockControls','off',...
'MenuBar','none',...
'Interruptible','off',...
'BusyAction','cancel',...
'Position',[0.25 0.25 0.5 0.5]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calcula los parámetros
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
di=simple(calc_di(MRejes));
ai=simple(calc_ai(MRejes));
tethai=simple(calc_tethai(MRejes));
alphai=simple(calc_alphai(MRejes));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% mostramos los valores
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
tam=1+(1/(size(di,2)+1));
for i=1:size(ai,2)+1
if i==1
hpar_di = uicontrol('Style', 'text', ...
'Callback',@label,...
'String','ai',...
'ForegroundColor','b',...
'FontWeight','bold',...
'backgroundcolor',[1 1 1],...
'Units','normalized',...
'Position',[0.25 0 .25 tam-
(1/(size(di,2)+1))],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
tam=tam-(1/(size(di,2)+1));
else
hpar_ai = uicontrol('Style', 'text', ...
'Callback',@label,...
'String',char(ai(i-1)),...
'backgroundcolor',[1 1 1],...
'Units','normalized',...
'Position',[0.25 0 .25 tam-
(1/(size(di,2)+1))],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
tam=tam-(1/(size(di,2)+1));
end
end
tam=1+(1/(size(di,2)+1));
for i=1:size(tethai,2)+1
if i==1
hpar_di = uicontrol('Style', 'text', ...
'Callback',@label,...
'String','tethai',...
'ForegroundColor','b',...
'FontWeight','bold',...
'backgroundcolor',[1 1 1],...
'Units','normalized',...
'Position',[0.5 0 .25 tam-
(1/(size(di,2)+1))],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
tam=tam-(1/(size(di,2)+1));
else
hpar_ai = uicontrol('Style', 'text', ...
'Callback',@label,...
'String',char(tethai(i-1)),...
'backgroundcolor',[1 1 1],...
'Units','normalized',...
'Position',[0.5 0 .25 tam-
(1/(size(di,2)+1))],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
tam=tam-(1/(size(di,2)+1));
end
end
tam=1+(1/(size(di,2)+1));
for i=1:size(alphai,2)+1
if i==1
hpar_di = uicontrol('Style', 'text', ...
'Callback',@label,...
'String','alphai',...
'ForegroundColor','b',...
'FontWeight','bold',...
'backgroundcolor',[1 1 1],...
'Units','normalized',...
'Position',[0.75 0 .25 tam-
(1/(size(di,2)+1))],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
tam=tam-(1/(size(di,2)+1));
else
hpar_ai = uicontrol('Style', 'text', ...
'Callback',@label,...
'String',char(alphai(i-1)),...
'backgroundcolor',[1 1 1],...
'Units','normalized',...
'Position',[0.75 0 .25 tam-
(1/(size(di,2)+1))],...
'Enable','on',...
'Interruptible','off',...
'BusyAction','cancel');
tam=tam-(1/(size(di,2)+1));
end
end
for i=1:size(alphai,2)
P_D_H(i,:)=[alphai(i);ai(i);tethai(i);di(i)]; %matriz con los
parametros de Denavit-Hartemberg
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% habilitación de nuevas opciones de los menus
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
set(graph_robot,'Enable','on')
set(graph_cininv,'Enable','on');
set(mfile_saveDH,'Enable','on');
end
function MRejes=plotejes(MRperp)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que nos muestra los ejes del robot a partir de la
matriz
% MRperp y los almacena en otra matriz. MRejes=plotejes(MRperp)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%sustitucion de valores de traslacion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for j=1:num_simb_rot
MRejes_aux=subs(MRejes,Q1_simb(j),Q1(j));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%sustitucion de valores de rotacion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for j=1:num_simb_rot2
MRejes_aux=subs(MRejes,Q2_simb(j),Q2(j));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%dibuja ejes iniciales
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for j=0:0.15:3
hold on
plot3(MRejes_aux(1,1)*j, MRejes_aux(1,2)*j,
MRejes_aux(1,3)*j,'.b',MRejes_aux(1,4)*j, MRejes_aux(1,5)*j,
MRejes_aux(1,6)*j,'-*r',MRejes_aux(1,7)*j, MRejes_aux(1,8)*j,
MRejes_aux(1,9)*j,'-+g')
hold off
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculo los ejes y los dibujo
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:n
lz=sqrt(MRperp(i,1)^2+MRperp(i,2)^2+MRperp(i,3)^2);
if lz~=0
MRejes(i+1,[1 2 3])=[MRperp(i,1)/lz MRperp(i,2)/lz
MRperp(i,3)/lz]; %eje Z
else
MRejes(i+1,[1 2 3])=MRejes(i,[1 2 3]);
end
lx=sqrt(MRperp(i,7)^2+MRperp(i,8)^2+MRperp(i,9)^2);
if lx~=0
MRejes(i+1,[4 5 6])=[MRperp(i,7)/lx MRperp(i,8)/lx
MRperp(i,9)/lx]; %eje X
else
MRejes(i+1,[4 5 6])=MRejes(i,[4 5 6]);
end
MRejes(i+1,[7 8 9])=cross(MRejes(i+1,[1 2 3]),MRejes(i+1,[4 5
6])); %eje y
MRejes(i+1,[10 11 12])=MRperp(i,[4 5 6]);
%punto de los ejes
MRejes(i+1,13)=MRperp(i,10);
%Tipo de articulación
MRejes_aux=MRejes;
MRejes=expand(MRejes);
function mat=redondear(mat)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%redondeamos los valores de las matrices
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
[n,m]=size(mat);
for i=1:n
for j=1:m
if (mat(i,j)<0.0001)&mat(i,j)>-0.0001
mat(i,j)=0;
end
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función para resolver el giro de un punto (X,Y,Z) respecto a
la
% recta que pasa por los puntos (X1,Y1,Z1) y (X2,Y2,Z2) con un
ángulo
% de rotación igual a tetha
% [Xf Yf Zf]=rot(X1,Y1,Z1,X2,Y2,Z2,X,Y,Z,tetha)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que rota un punto Pf con respecto a los ejes x e y
que
% hacemos pasar por otro punto dado Pi:
% [Xf Yf Zf]=Rotar(xi,yi,zi,xf,yf,zf,angx,angy)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
A=xf-xi;
B=yf-yi;
C=zf-zi;
F=[A B C 1]*Rx*Rz;
Xf=F(1,1)+xi;
Yf=F(1,2)+yi;
Zf=F(1,3)+zi;
function savebot
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que salva un robot al disco
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
save
(fname,'MR','n','num_simb_rot','Q1_simb','Q1','Q2_simb','Q2','num_simb
_rot2','MRperp','MRvec','MR_simb','rotac','tras')
return
function saveDH
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que salva un robot al disco, guardando la matriz
P_D_H,
% que contiene la matriz de Denavit-Hartemberg, y la matriz DH
que es
% igual que P_D_H pero le añadimos el tipo de rotación. DH es
% compatible con el toolbox de robótica
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
P_D_Haux=P_D_H;
cont1=0;
cont2=0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%vemos tipo de articulación
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=2:size(MRejes,1)
if MRejes(i,13)==1 %Es un eje de rotacion
a(i-1)=0; %Tipo de articulación
cont1=cont1+1; %nº de artic de rotación
end
if MRejes(i,13)==2 %Es un eje de traslacion
a(i-1)=1; %Tipo de articulación
cont2=cont2+1; %nº de artic de traslacion
end
end
a(cont1+cont2+1)=0; %Consideramos el eje final como otro
eje
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Sustituimos variables articulares por cero
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
for j=1:num_simb_rot
P_D_Haux=subs(P_D_Haux,Q1_simb(j),0);
end
for j=1:num_simb_rot2
P_D_Haux=subs(P_D_Haux,Q2_simb(j),0);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% creamos DH
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
DH=P_D_Haux;
for i=1:(size(DH,1))
DH(i,5)=a(i);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%Guardamos
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
save (fname,'P_D_H','DH')
return
function sicon()
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función inicial que dibuja el logo y crea los menus
desplegables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
clc
clear variables
warning off
img = imread('Logo.jpg'); %imagen principal
scrsz = get(0,'ScreenSize');
global hf1 mfile_save mfile_load mfile_graf MR graph_DH MRejes
graph_calcbot graph_robot graph_cindir graph_cininv mfile_saveDH
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ventana principal
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
hf1=figure('Visible','on',...
'Units','normalized',...
'Renderer','opengl',...
'Color',[1 1 1],...
'Resize','off',...
'Name','Sicon-Bot',...
'NumberTitle','off',...
'DockControls','off',...
'MenuBar','none',...
'Interruptible','on',...
'BusyAction','cancel',...
'Position',[0 0.08 1 0.92]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creamos los menus y submenus desplegables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
mfile= uimenu('Label','Archivo');
mfile_graf=uimenu(mfile,'Label','Nuevo
Gráficamente','Callback','nuevo','Separator','on');
mfile_save=uimenu(mfile,'Label','Salvar
Robot','Callback','Savebot','Separator','on','Enable','off','Accelerat
or','S');
mfile_saveDH=uimenu(mfile,'Label','Salvar D-
H','Callback','SaveDH','Separator','off','Enable','off');
mfile_load=uimenu(mfile,'Label','Cargar
Robot','Callback','loadbot','Separator','on','Enable','off','Accelerat
or','L');
uimenu(mfile,'Label','Salir','Callback','clear
all','Callback','close all','Separator','on','Accelerator','Q');
mopt= uimenu('Label','Configuracion');
mopt_pardin=uimenu(mopt,'Label','Parámetros
Dinámicos','Callback','par_din','Accelerator','X','Enable','off');
graph= uimenu('Label','Ejecucion');
graph_calcbot=uimenu(graph,'Label','Calcular
Robot','Callback','calcbot','Enable','off');
graph_DH=uimenu(graph,'Label','Parámetros D-
H','Callback','Par_DH','Enable','off');
graph_robot=uimenu(graph,'Label','Posicionar
Robot','Callback','env_bot','Enable','off');
graph_cindir=uimenu(graph,'Label','Cinemática
Directa','Callback','cin_dir','Enable','off');
graph_cininv=uimenu(graph,'Label','Cinemática
Inversa','Callback','cin_inv','Enable','off');
mopt= uimenu('Label','Ayuda');
uimenu(mopt,'Label','Ayuda
Sicon','Callback','Ayuda','Accelerator','H','Enable','on');
uimenu(mopt,'Label','Sobre...','Callback','sobre','Enable','on');
end
function sobre
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Nos muestra una ventana con datos sobre el programa
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que dibuja un eslabón, situado entre un punto
inicial y
% otro final, se usa en la función dibubot. La base dibujada
llevará
% el ángulo de giro sobre el eje punto inicial-final
indicados por el usuario:
% [xf yf zf]=eslabon2(xi,yi,zi,xf,yf,zf,ange)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
global sp1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculamos la longitud del tramo para obtener el ángulo de
giro
% sobre el eje x a partir de zf y zi. Dependiendo del signo
de
% (yf-yi) el giro será en un sentido o en otro.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculamos el giro sobre el eje z a partir del pto inicial
y
% final.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Situamos el punto final a una distancia L en vertical
respecto
% al punto inicial
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
xf=xi;
yf=yi;
zf=zi+l;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con los valores adecuados
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
[x1 y1 z1]=rotar(xi,yi,zi,xi-0.3,yi-0.3,zi,angx,angz);
[x2 y2 z2]=rotar(xi,yi,zi,xi+0.3,yi-0.3,zi,angx,angz);
[x3 y3 z3]=rotar(xi,yi,zi,xi+0.3,yi+0.3,zi,angx,angz);
[x4 y4 z4]=rotar(xi,yi,zi,xi-0.3,yi+0.3,zi,angx,angz);
[x5 y5 z5]=rotar(xi,yi,zi,xi-0.3,yi-0.3,zi+l,angx,angz);
[x6 y6 z6]=rotar(xi,yi,zi,xi+0.3,yi-0.3,zi+l,angx,angz);
[x7 y7 z7]=rotar(xi,yi,zi,xi+0.3,yi+0.3,zi+l,angx,angz);
[x8 y8 z8]=rotar(xi,yi,zi,xi-0.3,yi+0.3,zi+l,angx,angz);
[xf yf zf]=rotar(xi,yi,zi,xf,yf,zf,angx,angz);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con respecto al eje Xi-Xf
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
if ange
[x1 y1 z1]=rot(xi,yi,zi,xf,yf,zf,x1,y1,z1,ange);
[x2 y2 z2]=rot(xi,yi,zi,xf,yf,zf,x2,y2,z2,ange);
[x3 y3 z3]=rot(xi,yi,zi,xf,yf,zf,x3,y3,z3,ange);
[x4 y4 z4]=rot(xi,yi,zi,xf,yf,zf,x4,y4,z4,ange);
[x5 y5 z5]=rot(xi,yi,zi,xf,yf,zf,x5,y5,z5,ange);
[x6 y6 z6]=rot(xi,yi,zi,xf,yf,zf,x6,y6,z6,ange);
[x7 y7 z7]=rot(xi,yi,zi,xf,yf,zf,x7,y7,z7,ange);
[x8 y8 z8]=rot(xi,yi,zi,xf,yf,zf,x8,y8,z8,ange);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibujamos el elemento
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Función que dibuja eje de traslacion, situado en un punto
inicial y
% que nos devuelve un punto final. El eslabón dibujado
llevará
% los ángulos de inclinación indicados por el usuario en la
ventana
% principal:
% [xf yf zf]=traslac(xi,yi,zi)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
global hf1 htextox htextoz htextoz htexto htextoe sp1 sp2 sp3 sp4 sp5
htextot1 num_simb_rot Q1_simb Q1 tras
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculamos el nº de elementos de traslacion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Obtenemos datos de variable
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Cogemos los valores de los ángulos y los pasamos a
radianes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
angx=-str2num(get(htextox,'String'))*2*pi/360;
angz=-str2num(get(htextoz,'String'))*2*pi/360;
ange=str2num(get(htextoe,'String'))*2*pi/360;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Situamos el punto final a una distancia L en vertical
respecto
% al punto inicial
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
xf=xi;
yf=yi;
zf=zi+L;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con los valores adecuados
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
[x1 y1 z1]=rotar(xi,yi,zi,xi-0.3,yi-0.3,zi,angx,angz);
[x2 y2 z2]=rotar(xi,yi,zi,xi+0.3,yi-0.3,zi,angx,angz);
[x3 y3 z3]=rotar(xi,yi,zi,xi+0.3,yi+0.3,zi,angx,angz);
[x4 y4 z4]=rotar(xi,yi,zi,xi-0.3,yi+0.3,zi,angx,angz);
[x5 y5 z5]=rotar(xi,yi,zi,xi-0.3,yi-0.3,zi+l,angx,angz);
[x6 y6 z6]=rotar(xi,yi,zi,xi+0.3,yi-0.3,zi+l,angx,angz);
[x7 y7 z7]=rotar(xi,yi,zi,xi+0.3,yi+0.3,zi+l,angx,angz);
[x8 y8 z8]=rotar(xi,yi,zi,xi-0.3,yi+0.3,zi+l,angx,angz);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Rotamos la figura con respecto al eje Xi-Xf
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
if ange
[x1 y1 z1]=rot(xi,yi,zi,xf,yf,zf,x1,y1,z1,ange);
[x2 y2 z2]=rot(xi,yi,zi,xf,yf,zf,x2,y2,z2,ange);
[x3 y3 z3]=rot(xi,yi,zi,xf,yf,zf,x3,y3,z3,ange);
[x4 y4 z4]=rot(xi,yi,zi,xf,yf,zf,x4,y4,z4,ange);
[x5 y5 z5]=rot(xi,yi,zi,xf,yf,zf,x5,y5,z5,ange);
[x6 y6 z6]=rot(xi,yi,zi,xf,yf,zf,x6,y6,z6,ange);
[x7 y7 z7]=rot(xi,yi,zi,xf,yf,zf,x7,y7,z7,ange);
[x8 y8 z8]=rot(xi,yi,zi,xf,yf,zf,x8,y8,z8,ange);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%sustituimos las variables por su valor
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
x1=subs(x1,Q1(tras2));
x2=subs(x2,Q1(tras2));
x3=subs(x3,Q1(tras2));
x4=subs(x4,Q1(tras2));
x5=subs(x5,Q1(tras2));
x6=subs(x6,Q1(tras2));
x7=subs(x7,Q1(tras2));
x8=subs(x8,Q1(tras2));
y1=subs(y1,Q1(tras2));
y2=subs(y2,Q1(tras2));
y3=subs(y3,Q1(tras2));
y4=subs(y4,Q1(tras2));
y5=subs(y5,Q1(tras2));
y6=subs(y6,Q1(tras2));
y7=subs(y7,Q1(tras2));
y8=subs(y8,Q1(tras2));
z1=subs(z1,Q1(tras2));
z2=subs(z2,Q1(tras2));
z3=subs(z3,Q1(tras2));
z4=subs(z4,Q1(tras2));
z5=subs(z5,Q1(tras2));
z6=subs(z6,Q1(tras2));
z7=subs(z7,Q1(tras2));
z8=subs(z8,Q1(tras2));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
% Dibujamos el elemento
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%