Il existe deux grandes approches:
- les solutions analytiques, étant donné une pose d'effecteur terminal, calculent directement les coordonnées conjointes. En général, la solution n'est pas unique, vous pouvez donc calculer un ensemble de coordonnées conjointes possibles. Certains peuvent amener le robot à heurter des choses dans son environnement (ou lui-même), ou votre tâche peut vous aider à choisir une solution particulière, par exemple. vous préférerez peut-être le coude vers le haut (ou vers le bas), ou le robot pour avoir son bras à gauche (ou à droite) de son tronc. En général, il existe des contraintes pour obtenir une solution analytique, pour les robots à 6 axes, un poignet sphérique (tous les axes se croisent) est supposé. Les solutions analytiques pour de nombreux types de robots différents ont été calculées au fil des décennies et vous pouvez probablement trouver un document qui donne une solution pour votre robot.
- Les solutions numériques, comme décrit dans les autres réponses, utilisent une approche d'optimisation pour ajuster les coordonnées de l'articulation jusqu'à ce que la cinématique avant donne la bonne solution. Encore une fois, il y a une énorme littérature à ce sujet et beaucoup de logiciels.
À l'aide de ma boîte à outils robotique pour MATLAB, je crée un modèle d'un robot 6 axes bien connu en utilisant les paramètres de 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|
+---+-----------+-----------+-----------+-----------+-----------+
puis choisissez une coordonnée commune aléatoire
>> q = rand(1,6)
q =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
puis calculer la cinématique avant
>> 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
Nous pouvons maintenant calculer la cinématique inverse en utilisant une solution analytique publiée pour un robot à 6 articulations et un poignet sphérique
>> p560.ikine6s(T)
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
et le tour est joué, nous avons les coordonnées communes d'origine.
La solution numérique
>> 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 =
[]
a échoué, et c'est un problème courant car ils ont généralement besoin d'une bonne solution initiale. Essayons
>> p560.ikine(T, 'q0', [1 1 0 0 0 0])
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
qui donne maintenant une réponse mais qui est différente de la solution analytique. Ce n'est pas grave cependant, car il existe plusieurs solutions au problème IK. Nous pouvons vérifier que notre solution est correcte en calculant la cinématique avant
>> 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
et en vérifiant que c'est la même chose que la transformation avec laquelle nous avons commencé (ce qu'elle est).
Autres ressources: