Come si può risolvere il problema della cinematica inversa?


20

La cinematica anteriore di un braccio robotico può essere risolta facilmente. Possiamo rappresentare ogni giunto usando le matrici di trasformazione Denavit – Hartenberg .

Ad esempio, se il giunto è un attuatore lineare, può avere la matrice di trasformazione:ioth

dove la lunghezza dell'estensione è definita da d iTio=[10000100001dio0001]dio

mentre un anello rotante può essere:

dove α è l'angolo e L è la lunghezza del collegamento.Tio=[100L0cosαio-peccatoαio00peccatoαiocosαio00001]αL

Possiamo quindi trovare la posizione e l'orientamento dell'effettore finale moltiplicando tutte le matrici di trasformazione: .ΠTio

La domanda è: come possiamo risolvere il problema inverso?

Matematicamente per un fine desiderata posizione effettore , trovare i parametri d i , α i tale che Π T i = M . Quali metodi esistono per risolvere questa equazione?MdioαioΠTio=M

Risposte:


11

Ai tempi, mentre stavo imparando, inventando questo mentre procedevo, ho usato un semplice gradiente per risolvere il problema IK.

Nel tuo modello, provi a ruotare ciascuna articolazione di ogni articolazione di una piccola quantità, vedi quanta differenza fa l'errore di posizione del punto finale. Fatto ciò, si ruota quindi ciascuna articolazione di un importo proporzionale al beneficio che offre. Quindi lo fai ancora e ancora finché non sei abbastanza vicino.

Generalmente, questo è noto come segue gradiente o seguendo la collina. Immagina un braccio robot con due gradi di libertà:

IK

Il giunto rotante A sposta leggermente il punto finale in direzione a . Il giunto rotante B si sposta leggermente del punto finale nella direzione b . Entrambi ci avvicinano all'obiettivo di circa la stessa quantità, quindi dovremmo ruotare entrambi i giunti alla stessa velocità.

Se dovessimo tracciare un grafico della distanza dal bersaglio rispetto agli angoli articolari, sembrerebbe così:

IK

Ho colorato alcuni contorni solo per aiutare. Possiamo vedere il percorso seguito da questo algoritmo. Quello che noterai è che nello spazio articolare, il percorso intrapreso non sembra ottimale. Ci vuole una curva. Tuttavia, nello spazio reale, vedresti il ​​punto finale prendere una linea abbastanza dritta verso il bersaglio. Puoi anche vedere che in realtà ci sono due soluzioni al problema e l'algoritmo ha appena trovato la soluzione più vicina.

Questo non è l'unico modo per risolvere il problema della cinematica inversa. Non è certamente il modo migliore neanche.

Professionisti:

  • È concettualmente semplice, fantastico se stai imparando questo.
  • È facile da implementare, anche se la vista delle matrici di trasformazione di Denavit – Hartenberg ti dà paura.
  • È molto generale e consente di utilizzare tutti i tipi di giunti: rotanti, lineari, qualcos'altro, purché sia ​​possibile stimare il modo in cui fanno muovere il punto finale.
  • Funziona bene, anche quando ci sono zero o un numero infinito di soluzioni.

Contro:

  • È lento, richiede molte iterazioni per trovare la soluzione. Tuttavia, va bene se puoi semplicemente fare in modo che il braccio reale segua l'avanzamento dell'algoritmo mentre viene calcolato.
  • Può rimanere bloccato nei minimi locali. IE Potrebbe non trovare la migliore soluzione possibile, se ne trova una abbastanza buona.

Ci sono ulteriori dettagli a riguardo sul mio sito molto vecchio: la bella pagina elastica, divertente, leggera, strutturata e leggera, divertente ed elastica .



1

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:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.