Com um robô de 6 eixos, dada a posição do efetor final e a gama de orientações, como encontrar os valores ideais das juntas

10

Dado um braço de robô articulado de seis eixos segurando uma ferramenta em seu efeito final, se eu tiver uma posição e orientação de ferramenta desejadas, haverá exatamente 1 solução para a equação cinemática inversa para que o robô atinja essa posição.
(ou melhor, até 16 soluções diferentes, dependendo do alcance das juntas)

http://en.wikipedia.org/wiki/Robotic_arm

Mas se o robô está segurando algo como uma caneta, e eu quero que o robô marque um ponto específico com essa caneta no alvo, então não me importo com a orientação da caneta, desde que seja perpendicular à superfície marcada.

Portanto, a equação da cinemática inversa terá infinitas soluções.

Como posso escolher entre essas soluções a configuração de junta mais próxima da configuração atual: aquela que exigirá a menor quantidade de movimento possível?
(ou a configuração da articulação ideal de acordo com outro critério semelhante, como que todos os ângulos da articulação estejam mais distantes do máximo e do mínimo?)

HugoRune
fonte

Respostas:

9

Primeiro, precisamos definir o ideal . Como você não diz o que considera ideal, a maioria das pessoas escolhe uma expressão quadrática. Por exemplo, suponha que seus ângulos articulares atuais sejam dados pelo vetor . Podemos considerar minimizando o movimento necessário - com um erro x = alfa - alfa s t a r t , você pode definir uma função de custo J = x T Q x para alguma matriz Q . Normalmente usamos uma matriz diagonal, mas qualquer matriz positiva definida o fará.αx=α-αstumartJ=xTQxQ

Em um exemplo simplificado com dois ângulos articulares, se a articulação tiver um motor mais barato (talvez mais próximo do efetor final), poderemos ter uma função de custo deuma

, ie. o movimento da articulação b é duas vezes mais caro que a articulação a .J=[xumaxb][1 10 00 02][xumaxb]buma

Agora, a equação cinemática é uma fórmula matricial, e na notação Denavit-Hartenberg pode ser:

, em que o lado direito representa a posição ( x , y , z ) e a orientação (actualmente definida como rotação de zero), dado o ângulos articulares.TEu=[1 10 00 0x0 01 10 0y0 00 01 1z0 00 00 01 1](x,y,z)

Como não nos importamos com a orientação e apenas a posição, podemos truncar as 3 primeiras colunas da última matriz de transformação e a última linha da primeira matriz de transformação. Podemos expressar de maneira equivalente essa fórmula como:

[1 10 00 00 00 01 10 00 00 00 01 10 0]TEu[0 00 00 01 1]=[xyz]

Multiplicando o lado esquerdo, obtemos três equações. Se os parâmetros fossem lineares, seria simples de resolver. Este é o caso se todos os atuadores forem atuadores lineares. Nesse caso, o problema é realmente um programa quadrático . Podemos reorganizar o lado esquerdo para obter a equação:

, para alguns matriz K .Kx=[xyz]K

Um programa quadrático é um problema que pode ser expresso na forma:

Minimizar J=1 12xTQx+cTx

Sujeito a , E x = dUMAxbEx=d

Para resolver isso, existem vários algoritmos que você pode usar, por exemplo, ponto interior, conjunto ativo, .... Basta encontrar uma biblioteca adequada e ela resolverá para você.

Um sistema não linear de equações é mais difícil de resolver. Isso é chamado de programação não linear , mas é o que você tem se tiver juntas rotativas.

Essencialmente, no lugar das equações da matriz, você tem funções não lineares.

Minimize sujeito a h ( x ) = 0 , g ( x ) 0 (reorganize, se necessário, para zerar o RHS das restrições)f(x)h(x)=0 0g(x)0 0

Os algoritmos usados ​​para resolver isso são ainda mais complexos, mas incluem algoritmos refletivos de ponto interior, programação quadrática sequencial (SQP), conjunto ativo e região confiável. Obviamente, a explicação de como esses algoritmos funcionam é muito extensa, e eu a deixarei fora do escopo desta resposta. Basta dizer que a quantidade de conteúdo nos algoritmos usados ​​para apenas a programação quadrática pode ser um curso completo por si só.

Você deve apenas encontrar uma biblioteca para resolver o problema, levaria muito tempo para codificar uma implementação eficiente, e implementações eficientes podem lidar com 100 (ou mais) variáveis ​​de cada vez. Por exemplo, se você usa o MATLAB, há documentação sobre como usar a função fmincon na caixa de ferramentas de otimização.

Para resolvê-lo online, convém C ++ ou outra implementação nativa, por exemplo, NLopt. Observe que isso pode não ser algo que um microcontrolador possa resolver rapidamente, e muitas bibliotecas podem ter outras dependências que não são fáceis de usar em um microcontrolador (uma vez que se destinam a um computador).


Se você não está preocupado com a eficiência e quer apenas algo que possa codificar a si mesmo, assumindo que existe uma função que você pode chamar para resolver o problema cinemático inverso , basta executar um método de descida de gradiente. Por exemplo, escolhendo arbitrariamente uma orientação inicial aleatória, resolva o problema inverso e verifique a função de custo. Então você pode usar a análise de perturbação para verificar como você deve variar a orientação. Por exemplo, se você verificar orientações semelhantes em torno da sua orientação atual (ou seja, 8 pontos em uma grade cúbica), poderá obter uma aproximação de segunda ordem de como a função de custo varia em cada direção.

Usando a aproximação de segunda ordem (conhecida como matriz Hessiana por ser multivariada - tridimensional para orientação), é possível encontrar o cruzamento zero do gradiente da função de custo (isto é, os mínimos locais previstos).

Com a nova orientação prevista, basta colocá-lo no solucionador inverso novamente e repetir até que a precisão seja suficiente.

Observe que isso provavelmente não será tão eficiente, porque o próprio problema cinemático inverso deve ser resolvido iterativamente (para que você esteja usando repetidamente uma função que demora um pouco para ser resolvida). Além disso, o código envolvido pode ser menor que um algoritmo de otimização completo, mas ainda é bastante substancial e não é um investimento insignificante de tempo.


Usando qualquer método (formalmente resolvendo como um programa não linear ou usando iterativamente usando uma função para resolver o problema inverso), a solução pode não ser ótima se houver vários mínimos locais. Nesse caso, você pode tentar encontrar os mínimos globais usando várias abordagens. Mesmo com um solucionador de programação não linear, espera-se que ele os propague com valores iniciais (por exemplo, ângulos de articulação). Você pode executar repetidamente qualquer método com a semente gerada de várias maneiras:

  • reinicialização aleatória (é gerada aleatoriamente)
  • baseado em grade

ou outros métodos personalizados.

No entanto, observe que, se houver muitos mínimos, não há uma boa maneira de garantir que você encontre os mínimos globais. Você só pode melhorar suas chances.

ronalchn
fonte
2

Como a pergunta é sobre um robô industrial, provavelmente não temos um modelo da dinâmica do robô, portanto, suponho que estamos procurando soluções que otimizem apenas um critério cinemático.

O robô possui uma solução de forma fechada para sua cinemática inversa, mas, infelizmente, o efetor final possui um grau de liberdade de rotação extra, o que significa que o robô tem essencialmente 7 graus de liberdade. Mas como esse é apenas mais um dof , não é um problema tão grande quanto se poderia pensar.

0,051 13601 118

Se na maioria das vezes a caneta está se movendo apenas um pouco (por exemplo, ao desenhar uma linha), outro truque para acelerar a pesquisa é usar a IK numérica, por exemplo, o método pseudoinverso:

q1 1JΔxΔx=JΔqΔqq2=q1 1+ΔqΔq__Δq__

q2

antonakos
fonte
1

rz

J-1 1X˙=Θ˙=[j1 1j2j3j4j5j6][x˙y˙z˙rx˙ry˙rz˙]=[θ1 1˙θ2˙θ3˙θ4˙θ5˙θ6˙]
jEuEuthJ-1 1Θ˙rz˙
Θ˙=Θ˙x˙ry˙+Θ˙rz˙Θ˙rz˙=j6rz˙
(Θ˙x˙ry˙+Θ˙rz˙)TD(Θ˙x˙ry˙+Θ˙rz˙)
DUMA=Θ˙x˙ry˙B=Θ˙rz˙

UMATDUMA+2BTDUMA+BTDBouUMATDUMA+2rz˙j6TDUMA+rz˙2j6TDj6

rz˙rz˙0 0

2j6TDUMA+2rz˙j6TDj6=0 0rz˙=-j6TDUMAj6TDj6
joshkarges
fonte