Innanzitutto, dobbiamo definire ottimale . Dal momento che non dici ciò che ritieni ottimale, la maggior parte delle persone sceglie un'espressione quadratica. Ad esempio, supponiamo che i tuoi angoli articolari attuali siano indicati dal vettore . Possiamo considerare di ridurre al minimo il movimento richiesto - con un errore , puoi definire una funzione di costo per un po 'di matrice . Normalmente utilizziamo una matrice diagonale, ma qualsiasi matrice definita positiva lo farà.→ x = → α - → α startJα⃗ x⃗ =α⃗ −α⃗ start QJ= x⃗ TQ x⃗ Q
In un esempio semplificato con due angoli comuni, se il giunto avesse un motore più economico (forse più vicino all'effettore finale), potremmo avere una funzione di costo diun'
baJ= [ xun'XB] [ 1002] [ xun'XB] , vale a dire. lo spostamento dell'articolazione è due volte più costoso rispetto all'articolazione .Bun'
Ora, l'equazione cinematica è una formula di matrice, e nella notazione di Denavit-Hartenberg potrebbe essere:
(x,y,z)∏ Tio= ⎡⎣⎢⎢⎢100001000010Xyz1⎤⎦⎥⎥⎥ , dove il lato destro rappresenta la posizione e l'orientamento (attualmente impostato come rotazione zero), dati gli angoli dei giunti.( x , y, z)
Poiché non ci interessa l'orientamento e solo la posizione, possiamo troncare le prime 3 colonne dell'ultima matrice di trasformazione e l'ultima riga della prima matrice di trasformazione. Possiamo esprimere equivalentemente questa formula come:
⎡⎣⎢100010001000⎤⎦⎥∏ Tio⎡⎣⎢⎢⎢0001⎤⎦⎥⎥⎥=⎡⎣⎢Xyz⎤⎦⎥
Moltiplicando il lato sinistro, otteniamo tre equazioni. Se i parametri fossero lineari, sarebbe semplice da risolvere. Questo è il caso se tutti gli attuatori sono attuatori lineari. In questo caso, il problema è in realtà un programma quadratico . Possiamo riorganizzare il lato sinistro per ottenere l'equazione:
KKX⃗ =⎡⎣⎢Xyz⎤⎦⎥ , per qualche matrice .K
Un programma quadratico è un problema che può essere espresso nella forma:
Riduci a iconaJ= 12X⃗ TQ x⃗ + c⃗ TX⃗
Con riserva di , E →A x⃗ ≤ b⃗ EX⃗ = d⃗
Per risolvere questo, ci sono un certo numero di algoritmi che puoi usare, ad esempio punto interno, set attivo, .... Basta trovare una libreria adatta e la risolverà per te.
Un sistema non lineare di equazioni è più difficile da risolvere. Questa si chiama programmazione non lineare , ma è ciò che hai se hai giunti rotanti.
In sostanza, al posto delle equazioni di matrice, si hanno funzioni non lineari.
Riduci a icona soggetto a , (riorganizza se necessario per rendere zero l'RHS dei vincoli)→ h ( x ) = 0 → g ( x ) ≤ 0f( x )h⃗ ( x ) = 0g⃗ ( x ) ≤ 0
Gli algoritmi utilizzati per risolvere questo problema sono ancora più complessi, ma comprendono algoritmi riflettenti per punto interno, programmazione quadratica sequenziale (SQP), Active-set, Trust-region. Ovviamente, la spiegazione di come funzionano questi algoritmi è molto lunga e la lascerò fuori dallo scopo di questa risposta. Basti dire che la quantità di contenuto sugli algoritmi utilizzati per la sola programmazione quadratica potrebbe essere un intero corso da solo.
Dovresti semplicemente trovare una libreria per risolvere il problema, impiegare molto tempo a codificare un'implementazione efficiente e implementazioni efficienti possono gestire 100 (o più) variabili alla volta. Ad esempio, se si utilizza MATLAB, è disponibile la documentazione su come utilizzare la funzione fmincon dalla Casella degli strumenti di ottimizzazione.
Per risolverlo online, potresti volere C ++ o altra implementazione nativa, ad esempio NLopt. Si noti che questo potrebbe non essere qualcosa che un microcontrollore può risolvere rapidamente e che molte librerie potrebbero avere altre dipendenze che non sono facili da usare su un microcontrollore (poiché sono destinate a un computer).
Se non sei preoccupato dell'efficienza e desideri semplicemente qualcosa che puoi codificare da solo, supponendo che ci sia una funzione che puoi chiamare per risolvere il problema cinematico inverso , puoi semplicemente fare un metodo di discesa del gradiente. Ad esempio, scegliendo arbitrariamente un orientamento iniziale casuale, risolvi il problema inverso, quindi controlla la funzione di costo. Quindi è possibile utilizzare l'analisi delle perturbazioni per verificare come è necessario variare l'orientamento. Ad esempio, se si controllano orientamenti simili attorno al proprio orientamento corrente (ovvero 8 punti in una griglia cubica), è possibile ottenere un'approssimazione del secondo ordine di come varia la funzione di costo in ciascuna direzione.
Utilizzando l'approssimazione del secondo ordine (nota come matrice hessiana poiché multivariata - tridimensionale per l'orientamento), è possibile trovare l'attraversamento zero del gradiente della funzione di costo (ovvero i minimi locali previsti).
Con il nuovo orientamento previsto, basta inserirlo nuovamente nel solutore inverso e ripetere fino a quando l'accuratezza non è sufficiente.
Si noti che questo probabilmente non sarà altrettanto efficiente, poiché il problema cinematico inverso stesso deve essere risolto iterativamente (quindi si utilizza ripetutamente una funzione che a sua volta richiede un po 'di tempo per risolversi). Inoltre, il codice in questione potrebbe essere inferiore a un algoritmo di ottimizzazione completo, ma è ancora abbastanza sostanziale e non un investimento di tempo insignificante.
Utilizzando entrambi i metodi (risolvendo formalmente come un programma non lineare o utilizzando iterativamente una funzione per risolvere il problema inverso), la soluzione potrebbe non essere ottimale se vi sono più minimi locali. In questo caso, puoi provare a trovare i minimi globali usando vari approcci. Anche con un solutore di programmazione non lineare, ci si aspetta che lo seeding con valori iniziali (ad es. Angoli dei giunti). Puoi eseguire ripetutamente entrambi i metodi con il seme generato in vari modi:
- riavvio casuale (viene generato in modo casuale)
- Basato griglia
o altri metodi personalizzati.
Tuttavia, tieni presente che se ci sono molti minimi, non esiste un buon modo per garantire che troverai i minimi globali. Puoi solo migliorare le tue possibilità.