Existem duas abordagens gerais:
- soluções analíticas, dada uma pose de efetor final, calculam diretamente as coordenadas das juntas. Em geral, a solução não é exclusiva, portanto, você pode calcular um conjunto de possíveis coordenadas de juntas. Alguns podem fazer com que o robô atinja coisas em seu ambiente (ou ele próprio), ou sua tarefa pode ajudá-lo a escolher uma solução específica, por exemplo. você pode preferir o cotovelo para cima (ou para baixo) ou o robô para colocar o braço à esquerda (ou à direita) do tronco. Em geral, existem restrições na obtenção de uma solução analítica; para robôs de 6 eixos, um pulso esférico (todos os eixos se cruzam) é assumido. As soluções analíticas para muitos tipos diferentes de robôs foram computadas ao longo das décadas e você provavelmente encontrará um documento que fornece uma solução para o seu robô.
- As soluções numéricas, conforme descritas nas outras respostas, usam uma abordagem de otimização para ajustar as coordenadas das juntas até que a cinemática direta forneça a solução certa. Novamente, há uma enorme literatura sobre isso e muito software.
Usando minha Robotics Toolbox para MATLAB, crio um modelo de um conhecido robô de 6 eixos usando parâmetros 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|
+---+-----------+-----------+-----------+-----------+-----------+
então escolha uma coordenada de junta aleatória
>> q = rand(1,6)
q =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
depois calcule a cinemática direta
>> 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
Agora podemos calcular a cinemática inversa usando uma solução analítica publicada para um robô com 6 articulações e um punho esférico
>> p560.ikine6s(T)
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
e pronto, temos as coordenadas conjuntas originais.
A solução numérica
>> 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 =
[]
falhou e esse é um problema comum, pois eles geralmente precisam de uma boa solução inicial. Vamos tentar
>> p560.ikine(T, 'q0', [1 1 0 0 0 0])
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
que agora fornece uma resposta, mas é diferente da solução analítica. Tudo bem, pois existem várias soluções para o problema da IK. Podemos verificar se nossa solução está correta calculando a cinemática direta
>> 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
e verificando se é igual à transformação com a qual começamos (qual é).
Outros recursos: