Movimenti fluidi per un robot strisciante


11

Qualche tempo fa ho realizzato un piccolo robot cingolato che aveva due gambe con due gradi di libertà ciascuna, quindi un totale di 4 servi RC. Mentre stavo programmando il movimento delle gambe ho notato che si muovevano piuttosto rigidamente. Ha senso che il controller interno del servo RC avrebbe una risposta molto rapida ai comandi di posizione, ma volevo che il mio crawler si muovesse in un modo che sembra un po 'più fluido e realistico.

La mia soluzione era creare una funzione cubica del tempo che descriva il percorso dei servi e quindi impostare la loro posizione con piccoli incrementi di tempo, con conseguente movimento più fluido. In sostanza quello che ho fatto è stato risolvere i coefficienti in un'equazione cubica usando l'intervallo di tempo, la posizione iniziale e finale del servo e le velocità iniziale e finale che il servo dovrebbe spostare (che è solo la derivata della posizione):un'io

Risolvi per , , e :a 1 a 2 a 3un'0un'1un'2un'3

r a t e ( t ) = p o s i t i o n ( t ) = a 1 + 2 a 2 t + 3 a 3 t

poSiotioon(t)=un'0+un'1t+un'2t2+un'3t3
run'te(t)=poSiotioon'(t)=un'1+2un'2t+3un'3t2

Dato: , , ,poSiotioon(0)poSiotioon(tf)run'te(0)run'te(tf)

Ho impostato il tasso del servo tra una coppia di movimenti su zero se i movimenti erano in direzioni opposte e positivo o negativo se i movimenti erano entrambi in direzione positiva o negativa, rispettivamente.

Ha funzionato abbastanza bene, ma questa soluzione è limitata in alcuni modi. Per uno, è difficile decidere quali dovrebbero essere esattamente i tassi tra i movimenti che vanno nella stessa direzione. Ho usato la media delle pendenze avanti e indietro di una particolare posizione tra i movimenti, ma non mi è chiaro che sia ottimale. In secondo luogo, le curve cubiche potrebbero portare il servo in una posizione al di fuori della gamma delle posizioni all'inizio e alla fine di un movimento, il che potrebbe essere indesiderabile. Ad esempio, ad un certo punto durante l'intervallo di tempo, la curva potrebbe far andare il servo oltre la seconda posizione o sotto la prima posizione. In terzo luogo, la generazione della curva qui non considera la velocità massima che il servo può ruotare, quindi una curva può far muovere il servo ad una velocità non realistica. Con quello,

Trascurando quest'ultima preoccupazione, questi problemi possono essere risolti aumentando il grado del polinomio e aggiungendo vincoli da risolvere per i coefficienti, ma ora sto iniziando a chiedermi ...

Esiste un modo migliore di questo per rendere più fluido il movimento dei servi e sembrare più realistico?


Il codice avrebbe dovuto essere relativamente semplice. Puoi parlare di più sul perché è stato coinvolto?
DaemonMaker

1
Hai ragione, il codice era abbastanza semplice, sebbene il metodo risultante per controllare i servi fosse più complesso di prima. Ho modificato la mia domanda per includere invece una descrizione dei limiti di questo metodo.
Robz,

NURBS , B-splines razionali non uniformi, potrebbe fare il lavoro
James Waldby - jwpat7

@ jwpat7 grazie per il tuo contributo, ma non credo che NURBS funzionerebbe perché quelle curve non sono garantite per raggiungere i punti forniti
Robz

Kp

Risposte:


6

Generazione di profili di movimento

In passato, ho usato un generatore di profili di movimento per risolvere questo problema. Per utilizzarlo occorrono la posizione target desiderata (set point), la velocità massima e i valori di accelerazione associati ai motori. Funziona integrando una curva di velocità trapezoidale al fine di ottenere un profilo di posizione regolare. Una curva a S può essere utilizzata se il movimento deve essere ancora più fluido. Riferimento all'articolo che spiega la profilazione Motion .

Pre-filtro prefissato

A parte il percorso di profilazione del movimento, puoi provare semplicemente passa basso filtrando il comando sui servi. Questo tipo di filtro del setpoint rallenterà la tua risposta, ma anche la smusserà e sarà facile da implementare. La frequenza di taglio dovrà essere scelta in modo che supporti la larghezza di banda del sistema (in modo da non filtrare il movimento desiderato). Semplice implementazione del filtro passa-basso in C


+1: sicuramente generazione di profili di movimento.
Guy Sirton,

2

Penso che la domanda si riferisca a questo tipo di dispositivo: servo RC

Quelli di solito non sono prestazioni molto elevate, quindi non saranno in grado di tracciare molto bene un profilo di movimento generato. La maggior parte dei sistemi di controllo motore commerciali utilizzano una curva a S per un movimento da punto a punto (vedere la risposta di @ddevaz) che crea un profilo a sbalzo in cui ogni segmento utilizza un'equazione diversa. Il tuo problema sarà che, affinché il tuo motore possa tracciare il profilo generato, probabilmente avrai un profilo molto "lento". In caso contrario, il profilo che si tenta di comandare al dispositivo di seguire avrà un errore di posizione elevato rispetto alla posizione effettiva del dispositivo.

Idealmente, vorrai una sorta di feedback che puoi guardare mentre esegui il movimento in modo da poter vedere quanto bene il dispositivo sta monitorando il comando. Da una prospettiva più pratica, se si desidera un movimento significativamente migliore, potrebbero essere necessari motori diversi e un controllo motore diverso.

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.