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: