Tout d'abord, nous devons définir optimal . Puisque vous ne dites pas ce que vous considérez comme optimal, la plupart des gens choisissent une expression quadratique. Par exemple, supposons que vos angles de jonction actuels soient donnés par le vecteur . Nous pouvons envisager de réduire au minimum le mouvement nécessaire - avec une erreur → x = → a - → a s t un r t , vous pouvez définir une fonction de coût J = → x T Q → x pour une matrice Q . Nous utilisons normalement une matrice diagonale, mais n'importe quelle matrice définie positive fera l'affaire.α⃗ x⃗ =α⃗ −α⃗ startJ=x⃗ TQx⃗ Q
Dans un exemple simplifié avec deux angles de joint, si le joint avait un moteur moins cher (peut-être plus proche de l'effecteur terminal), nous pourrions avoir une fonction de coût dea
, c'est-à-dire. le mouvement du joint b est deux fois plus coûteux que le joint a .J=[xaxb][1002][xaxb]bune
Maintenant, l'équation cinématique est une formule matricielle, et dans la notation Denavit-Hartenberg pourrait être:
, où le côté droit représente la position ( x , y , z ) et l'orientation (actuellement définie comme une rotation nulle), étant donné la angles articulaires.∏ Tje= ⎡⎣⎢⎢⎢100001000010Xyz1⎤⎦⎥⎥⎥( x , y, z)
Puisque nous ne nous soucions pas de l'orientation, et seulement de la position, nous pouvons tronquer les 3 premières colonnes de la dernière matrice de transformation et la dernière ligne de la première matrice de transformation. Nous pouvons exprimer de manière équivalente cette formule comme:
⎡⎣⎢100010001000⎤⎦⎥∏ Tje⎡⎣⎢⎢⎢0001⎤⎦⎥⎥⎥= ⎡⎣⎢Xyz⎤⎦⎥
En multipliant le côté gauche, nous obtenons trois équations. Si les paramètres étaient linéaires, ce serait simple à résoudre. C'est le cas si tous les actionneurs sont des actionneurs linéaires. Dans ce cas, le problème est en fait un programme quadratique . Nous pouvons réorganiser le côté gauche pour obtenir l'équation:
, pour une matrice K .KX⃗ = ⎡⎣⎢Xyz⎤⎦⎥K
Un programme quadratique est un problème qui peut s'exprimer sous la forme:
Minimiser J= 12X⃗ TQ x⃗ + c⃗ TX⃗
Sous réserve de , E → x = → dA x⃗ ≤ b⃗ EX⃗ = d⃗
Pour résoudre ce problème, il existe un certain nombre d'algorithmes que vous pouvez utiliser, par exemple, point intérieur, ensemble actif, .... Trouvez simplement une bibliothèque appropriée, et elle la résoudra pour vous.
Un système d'équations non linéaire est plus difficile à résoudre. C'est ce qu'on appelle la programmation non linéaire , mais c'est ce que vous avez si vous avez des joints tournants.
Essentiellement, à la place des équations matricielles, vous avez des fonctions non linéaires.
Minimiser sous réserve de → h ( x ) = 0 , → g ( x ) ≤ 0 (réorganiser si nécessaire pour rendre la RHS des contraintes nulle)F( x )h⃗ ( x ) = 0g⃗ ( x ) ≤ 0
Les algorithmes utilisés pour résoudre ce problème sont encore plus complexes, mais comprennent des algorithmes de réflexion à point intérieur, de programmation quadratique séquentielle (SQP), à ensemble actif et à région de confiance. De toute évidence, l'explication du fonctionnement de ces algorithmes est très longue, et je laisserai cela hors de la portée de cette réponse. Qu'il suffise de dire que la quantité de contenu sur les algorithmes utilisés pour la programmation quadratique juste pourrait être tout un cours en soi.
Vous devriez simplement trouver une bibliothèque pour résoudre le problème, il faudrait beaucoup de temps pour coder une implémentation efficace, et les implémentations efficaces peuvent gérer 100 variables (ou plus) à la fois. Par exemple, si vous utilisez MATLAB, il existe de la documentation sur l'utilisation de la fonction fmincon à partir de la boîte à outils d'optimisation.
Pour le résoudre en ligne, vous souhaiterez peut-être C ++ ou une autre implémentation native, par exemple, NLopt. Notez que ce n'est peut-être pas quelque chose qu'un microcontrôleur peut résoudre rapidement, et de nombreuses bibliothèques peuvent avoir d'autres dépendances qui ne sont pas faciles à utiliser sur un microcontrôleur (car elles sont destinées à un ordinateur).
Si vous ne vous inquiétez pas de l'efficacité et que vous voulez juste quelque chose que vous pouvez coder vous-même, alors en supposant qu'il existe une fonction que vous pouvez appeler pour résoudre le problème cinématique inverse , vous pouvez simplement faire une méthode de descente de gradient. Par exemple, en choisissant arbitrairement une orientation de départ aléatoire, résolvez le problème inverse, puis vérifiez la fonction de coût. Ensuite, vous pouvez utiliser l'analyse de perturbation pour vérifier comment vous devez faire varier l'orientation. Par exemple, si vous vérifiez des orientations similaires autour de votre orientation actuelle (c'est-à-dire 8 points dans une grille cubique), vous pouvez obtenir une approximation de second ordre de la façon dont la fonction de coût varie dans chaque direction.
En utilisant l'approximation du second ordre (connue sous le nom de matrice de Hesse car elle est multivariée - tridimensionnelle pour l'orientation), vous pouvez trouver le passage par zéro du gradient de la fonction de coût (c'est-à-dire les minima locaux prédits).
Avec la nouvelle orientation prédite, il suffit de la passer à nouveau dans le solveur inverse et de répéter jusqu'à ce que la précision soit suffisante.
Notez que cela ne sera probablement pas aussi efficace, car le problème cinématique inverse lui-même doit être résolu de manière itérative (vous utilisez donc à plusieurs reprises une fonction qui prend elle-même un certain temps à résoudre). En outre, le code impliqué peut être inférieur à un algorithme d'optimisation à part entière, mais il est encore assez important et ne représente pas un investissement de temps insignifiant.
En utilisant l'une ou l'autre méthode (résolvant formellement un programme non linéaire ou utilisant itérativement une fonction pour résoudre le problème inverse), la solution peut ne pas être optimale s'il existe plusieurs minima locaux. Dans ce cas, vous pouvez essayer de trouver les minima globaux en utilisant différentes approches. Même avec un solveur de programmation non linéaire, on s'attend à ce qu'il l'amorce avec des valeurs initiales (par exemple, des angles de joint). Vous pouvez exécuter à plusieurs reprises l'une ou l'autre méthode avec la valeur de départ générée de différentes manières:
- redémarrage aléatoire (il est généré de façon aléatoire)
- basé sur une grille
ou d'autres méthodes personnalisées.
Cependant, notez que s'il existe de nombreux minima, il n'y a aucun bon moyen de garantir que vous trouverez les minima globaux. Vous ne pouvez qu'améliorer vos chances.