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⃗ = α⃗ - α⃗ s t a r tJ= x⃗ TQ x⃗ Q
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] [ 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 00 00 01 10 00 00 00 01 10 0xyz1 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 01 10 00 00 01 10 00 00 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= 12x⃗ TQ x⃗ + c⃗ Tx⃗
Sujeito a , E → x = → dA x⃗ ≤ b⃗ Ex⃗ = 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 ) = 0g⃗ ( x ) ≤ 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.