Hasta ahora hicimos control de posición en el espacio articular: las referencias que se quieren alcanzar son posiciones angulares de las articulaciones. Ahora nos interesa alcanzar posiciones en el espacio de trabajo: posiciones cartesianas XYZ. Obtener las primeras a partir de las segundas es lo que se llama el problema de la cinemática inversa (revisar el Seminario sobre Movimiento del Brazo Robot).
1) Añadamos a nuestro modelo un algoritmo que nos calcule la cinemática inversa (IK Solver). Repasemos la teoría para entender que la solución sólo es posible obtenerla de manera analítica en casos muy sencillos como el del robot RR plano. En general, tendremos que echar mano de algoritmos iterativos que encuentren la solución por métodos numéricos. Matlab nos proporciona librerías con estos algoritmos ya programados, aunque tendremos que ajustar sus parámetros.
2) Para la simulación, definamos las posiciones que se quieren alcanzar en el espacio de trabajo XYZ. Hay que escogerlas con cuidado, para que estén efectivamente en el área de trabajo del robot, de lo contrario el método de IK nunca encontrará la solución. Por ejemplo, podríamos definirlos en un archivo parametros_cinematinv.m que pasaremos al IK Solver para que nos calcule las posiciones articulares que nos lleven a dichas posiciones.
El IK Solver también necesita el modelo cinemático del que va a calcular su inversa. Nos sirve un modelo de Simscape anterior, el más sencillo posible (como el de la primera práctica). Recordemos cómo lo obtuvimos a partir del modelo CAD / urdf:
La función importrobot que nos permite importar varios tipos de modelos (CAD y urdf principalmente) en formato rigid body tree (RBT) de matlab:
>> [robot, importInfo] = importrobot('abb_irb_120d.urdf')
tras lo cual lo convertimos a un modelo de Simscape (simscape multibody model ):
>> model2 = smimport(robot);
Este modelo, que ya vemos en bloques en una ventana de simulink, lo podemos ordenar, testear y limpiar de elementos innecesarios, y guardarlo ya como un modelo de simulink en formato slx, que es con el que fuimos construyendo el resto de la simulación. Ese es el caso del archivo irb120_ejes12.slx de nuestro ejemplo.
Si en algún momento necesitemos volver a utilizar el modelo RBT, como ocurre en el caso de la IK, basta con recurrir a cargar este modelo slx base, con:
>> [robot, importInfo] = importrobot('irb120_ejes12')
y podremos utilizar el tipo de dato robot (rbt) cuando sea requerido, como ocurre ahora en la parte de IK.
Los resultados que obtenemos son similares a estos:
Nuestros sistemas de control siguen dando resultados manifiestamente mejorables, como era esperable ya que no los hemos modificado respecto a la simulación anterior, pero las sucesivas posiciones XYZ se van alcanzando como se deseaba. Obsérvese que aunque el eje 1 no se mueve, el sistema de control tiene que compensar los ligeros movimientos inducidos por el movimiento del eje 2.