Como o problema da cinemática inversa pode ser resolvido?

20

A cinemática avançada de um braço de robô pode ser resolvida facilmente. Podemos representar cada junta usando matrizes de transformação Denavit – Hartenberg .

Por exemplo, se o conjunta é um actuador linear, que pode ter a matriz de transformação:Euth

que o comprimento da extensão é definido por d iTEu=[10 00 00 00 010 00 00 00 01dEu0 00 00 01]dEu

considerando que um link rotativo pode ser:

que α é o ângulo e L é o comprimento do link.TEu=[10 00 0eu0 0porqueαEu-pecadoαEu0 00 0pecadoαEuporqueαEu0 00 00 00 01]αeu

Podemos então encontrar a posição e a orientação do efetor final multiplicando todas as matrizes de transformação: .TEu

A questão é: como resolvemos o problema inverso?

Matematicamente, para um fim desejado posição efectora , encontrar os parâmetros de d i , α i tal que Π T i = M . Quais métodos existem para resolver esta equação?MdEuαEuTEu=M

ronalchn
fonte

Respostas:

11

Naquela época, quando eu estava aprendendo, inventando isso à medida que avançava, usei um gradiente simples para resolver o problema da IK.

No seu modelo, você tenta rotacionar cada articulação cada articulação uma pequena quantidade, ver quanta diferença isso faz com o erro de posição do ponto final. Feito isso, você gira cada junta em uma quantidade proporcional ao benefício que ela oferece. Então você faz isso repetidamente até estar perto o suficiente.

Geralmente, isso é conhecido como gradiente a seguir ou subida a seguir. Imagine um braço robótico com dois graus de liberdade:

IK

A junção rotativa A move um pouquinho o ponto final na direção a . Girar a junta B um pouquinho move o ponto final na direção b . Ambos nos aproximam do alvo quase na mesma quantidade, portanto, devemos girar as duas juntas na mesma velocidade.

Se planejássemos um gráfico da distância do alvo versus ângulos articulares, ficaria assim:

IK

Eu pintei alguns contornos apenas para ajudar. Podemos ver o caminho desse algoritmo. O que você notará é que, no espaço conjunto, o caminho percorrido não parece ótimo. É preciso uma curva. No entanto, no espaço real, você veria o ponto final seguindo uma linha bastante reta em direção ao alvo. Você também pode ver que, na verdade, existem duas soluções para o problema, e o algoritmo acabou de encontrar a mais próxima.

Esta não é a única maneira de resolver o problema da cinemática inversa. Certamente também não é o melhor caminho.

Prós:

  • É conceitualmente simples, ótimo se você apenas aprender isso.
  • É fácil de implementar, mesmo que a visão das matrizes de transformação Denavit – Hartenberg dê a você os sustos.
  • É muito geral, permitindo que você use todos os tipos de juntas: rotativa, linear, outra coisa, desde que você possa estimar como elas fazem com que o ponto final se mova.
  • Ele lida bem, mesmo quando há zero ou um número infinito de soluções.

Contras:

  • É lento, fazendo muitas iterações para encontrar a solução. No entanto, tudo bem se você puder fazer com que o braço real siga o progresso do algoritmo conforme ele é calculado.
  • Pode ficar preso em mínimos locais. IE Talvez não encontre a melhor solução possível, se encontrar uma solução boa o suficiente.

Há mais detalhes sobre isso no meu site muito antigo: a página inteligente e elástica, divertida e divertida, de fontes leves e texturizadas .

Rocketmagnet
fonte
3

Existem várias soluções para esse problema que estão centradas na matriz jacobiana. Esta apresentação de slides abrange os métodos jacobianos e também menciona um método de Descida por Coordenadas Cíclicas, com o qual não estou familiarizado.

Há uma infinidade de recursos sobre o assunto - se você pedir ao google "cinemática inversa jacobiana" .

Além disso, consulte o Capítulo 5.3 das notas da aula do Curso Aberto de M IT sobre Robótica Introdutória .

David Hernandez
fonte
1

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:

Peter Corke
fonte