¿Cómo se puede resolver el problema de la cinemática inversa?

20

La cinemática delantera de un brazo robótico se puede resolver fácilmente. Podemos representar cada articulación usando las matrices de transformación Denavit-Hartenberg .

Por ejemplo, si la junta es un actuador lineal, puede tener la matriz de transformación:yoth

donde la longitud de extensión está definida por d iTyo=[10 00 00 00 010 00 00 00 01reyo0 00 00 01]reyo

mientras que un enlace rotativo puede ser:

donde α es el ángulo y L es la longitud del enlace.Tyo=[10 00 0L0 0cosαyo-pecadoαyo0 00 0pecadoαyocosαyo0 00 00 00 01]αL

Entonces podemos encontrar la posición y orientación del efector final multiplicando todas las matrices de transformación: .Tyo

La pregunta es, ¿cómo resolvemos el problema inverso?

Matemáticamente, para una posición del efector final deseado , encontrar los parámetros d i , α i tal que Π T i = M . ¿Qué métodos existen para resolver esta ecuación?METROreyoαyoTyo=METRO

ronalchn
fuente

Respuestas:

11

En el pasado, cuando estaba aprendiendo, inventando esto a medida que avanzaba, usé un seguimiento de gradiente simple para resolver el problema de IK.

En su modelo, intente rotar cada junta una pequeña cantidad, vea cuánta diferencia hace al error de posición del punto final. Una vez hecho esto, usted rota cada articulación en una cantidad proporcional al beneficio que le brinda. Luego lo haces una y otra vez hasta que estás lo suficientemente cerca.

En general, esto se conoce como seguimiento de gradiente o seguimiento de colina. Imagine un brazo robot con dos grados de libertad:

IK

La articulación giratoria A mueve un poco el punto final en la dirección a . La articulación giratoria B mueve un poco el punto final en la dirección b . Ambos nos acercan al objetivo aproximadamente la misma cantidad, por lo que debemos rotar ambas articulaciones aproximadamente a la misma velocidad.

Si trazáramos un gráfico de la distancia al objetivo frente a los ángulos articulares, se vería así:

IK

He coloreado algunos contornos solo para ayudar. Podemos ver el camino que toma este algoritmo. Lo que notará es que en el espacio articular, el camino tomado no parece óptimo. Se necesita una curva. Sin embargo, en el espacio real, verías que el punto final toma una línea bastante recta hacia el objetivo. También puede ver que en realidad hay dos soluciones al problema, y ​​el algoritmo acaba de encontrar la más cercana.

Esta no es la única forma de resolver el problema de la cinemática inversa. Ciertamente, tampoco es la mejor manera.

Pros:

  • Es conceptualmente simple, genial si solo estás aprendiendo esto.
  • Es fácil de implementar, incluso si la vista de las matrices de transformación de Denavit-Hartenberg te da miedo.
  • Es muy general, lo que le permite utilizar todo tipo de juntas: rotativas, lineales, algo más, siempre que pueda estimar cómo hacen que se mueva el punto final.
  • Se adapta bien, incluso cuando hay cero o un número infinito de soluciones.

Contras:

  • Es lento, toma muchas iteraciones para encontrar la solución. Sin embargo, está bien si puede hacer que el brazo real siga el progreso del algoritmo tal como se calcula.
  • Se puede atascar en los mínimos locales. Es posible que no encuentre la mejor solución posible, si encuentra una lo suficientemente buena.

Hay más detalles al respecto en mi sitio web muy antiguo: la página inteligente y elástica, atractiva, texturizada, ligera y divertida .

Rocketmagnet
fuente
1

Hay dos enfoques generales:

  • Las soluciones analíticas, dada una pose de efector final, calculan directamente las coordenadas conjuntas. En general, la solución no es única, por lo que puede calcular un conjunto de posibles coordenadas conjuntas. Algunos pueden hacer que el robot golpee cosas en su entorno (o en sí mismo), o su tarea puede ayudarlo a elegir una solución particular, es decir. es posible que prefiera el codo hacia arriba (o hacia abajo), o que el robot tenga su brazo a la izquierda (o derecha) de su tronco. En general, existen limitaciones para obtener una solución analítica, para los robots de 6 ejes, se supone una muñeca esférica (todos los ejes se cruzan). Las soluciones analíticas para muchos tipos diferentes de robots se han calculado a lo largo de las décadas y probablemente pueda encontrar un documento que brinde una solución para su robot.
  • Las soluciones numéricas, como se describe en las otras respuestas, utilizan un enfoque de optimización para ajustar las coordenadas de la junta hasta que la cinemática directa proporcione la solución correcta. Una vez más, hay una gran literatura sobre esto y mucho software.

Usando mi Robotics Toolbox para MATLAB, creo un modelo de un conocido robot de 6 ejes usando los parámetros de Denavit-Hartenberg

>> mdl_puma560
>> p560

p560 = 

Puma 560 [Unimation]:: 6 axis, RRRRRR, stdDH, fastRNE            
 - viscous friction; params of 8/95;                             
+---+-----------+-----------+-----------+-----------+-----------+
| j |     theta |         d |         a |     alpha |    offset |
+---+-----------+-----------+-----------+-----------+-----------+
|  1|         q1|          0|          0|     1.5708|          0|
|  2|         q2|          0|     0.4318|          0|          0|
|  3|         q3|    0.15005|     0.0203|    -1.5708|          0|
|  4|         q4|     0.4318|          0|     1.5708|          0|
|  5|         q5|          0|          0|    -1.5708|          0|
|  6|         q6|          0|          0|          0|          0|
+---+-----------+-----------+-----------+-----------+-----------+

luego elija una coordenada conjunta aleatoria

>> q = rand(1,6)
q =
    0.7922    0.9595    0.6557    0.0357    0.8491    0.9340

luego calcule la cinemática directa

>> T = p560.fkine(q)
T = 
   -0.9065    0.0311   -0.4210  -0.02271
    0.2451    0.8507   -0.4649   -0.2367
    0.3437   -0.5247   -0.7788    0.3547
         0         0         0         1

Ahora podemos calcular la cinemática inversa utilizando una solución analítica publicada para un robot con 6 articulaciones y una muñeca esférica.

>> p560.ikine6s(T)
ans =
    0.7922    0.9595    0.6557    0.0357    0.8491    0.9340

y listo, tenemos las coordenadas conjuntas originales.

La solucion numerica

>> p560.ikine(T)
Warning: ikine: rejected-step limit 100 exceeded (pose 1), final err 0.63042 
> In SerialLink/ikine (line 244) 
Warning: failed to converge: try a different initial value of joint coordinates 
> In SerialLink/ikine (line 273) 

ans =

     []

ha fallado, y este es un problema común ya que generalmente necesitan una buena solución inicial. Intentemos

>> p560.ikine(T, 'q0', [1 1 0 0 0 0])
ans =
    0.7922    0.9595    0.6557    0.0357    0.8491    0.9340

que ahora da una respuesta pero es diferente a la solución analítica. Sin embargo, está bien, ya que hay múltiples soluciones para el problema de IK. Podemos verificar que nuestra solución es correcta calculando la cinemática directa

>> p560.fkine(ans)
ans = 
   -0.9065    0.0311   -0.4210  -0.02271
    0.2451    0.8507   -0.4649   -0.2367
    0.3437   -0.5247   -0.7788    0.3547
         0         0         0         1

y comprobando que es lo mismo que la transformación con la que comenzamos (que es).

Otros recursos:

Peter Corke
fuente