Esistono due approcci generali:
- le soluzioni analitiche, data la posa di un effettore, calcolano direttamente le coordinate articolari. In generale la soluzione non è unica, quindi è possibile calcolare un insieme di possibili coordinate congiunte. Alcuni potrebbero far sì che il robot colpisca le cose nel suo ambiente (o se stesso) o il tuo compito potrebbe aiutarti a scegliere una soluzione particolare, ad es. potresti preferire il gomito verso l'alto (o verso il basso) o il robot deve avere il braccio a sinistra (o destra) del suo tronco. In generale ci sono vincoli per ottenere una soluzione analitica, per i robot a 6 assi, si assume un polso sferico (tutti gli assi si intersecano). Le soluzioni analitiche per molti diversi tipi di robot sono state calcolate nel corso dei decenni e probabilmente puoi trovare un documento che fornisce una soluzione per il tuo robot.
- le soluzioni numeriche, come descritto nelle altre risposte, utilizzano un approccio di ottimizzazione per regolare le coordinate del giunto fino a quando la cinematica diretta non fornisce la soluzione giusta. Ancora una volta, c'è un'enorme letteratura su questo e un sacco di software.
Usando il mio Robotics Toolbox per MATLAB, creo un modello di un noto robot a 6 assi usando i parametri 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|
+---+-----------+-----------+-----------+-----------+-----------+
quindi scegliere una coordinata comune casuale
>> q = rand(1,6)
q =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
quindi calcola la cinematica diretta
>> 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
Ora possiamo calcolare la cinematica inversa usando una soluzione analitica pubblicata per un robot con 6 articolazioni e un polso sferico
>> p560.ikine6s(T)
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
e voilà, abbiamo le coordinate congiunte originali.
La soluzione numerica
>> 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 =
[]
non è riuscito e questo è un problema comune poiché in genere è necessaria una buona soluzione iniziale. Proviamo
>> p560.ikine(T, 'q0', [1 1 0 0 0 0])
ans =
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
che ora fornisce una risposta ma è diverso dalla soluzione analitica. Va bene però, poiché ci sono più soluzioni al problema IK. Possiamo verificare che la nostra soluzione sia corretta calcolando la cinematica diretta
>> 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 che sia la stessa della trasformazione che abbiamo iniziato (che è).
Altre risorse: