Implementazione dell'algoritmo PID tramite computer vision


10

Sto costruendo un risolutore automatico di labirinti labirinto e sto usando una webcam per controllare il mio labirinto.

Sulla base dei suggerimenti di altri forum, sto cercando di controllare il movimento della palla del labirinto almeno in una direzione al momento. Quindi, sto cercando di controllare il movimento della mia palla tra due coordinate 466.288 e 466.152. L'ingresso alla scheda del controller del motore passo-passo è il tempo, nessun numero di passi da ruotare per ciascun asse, ovvero xey.

La scheda controller del motore passo-passo che sto usando è la scheda controller del motore passo-passo egg bot: http://www.sparkfun.com/products/10025

Quindi, per spostarmi tra due punti, dovrei creare un numero di punti intermedi tra i due punti, vale a dire 288 e 152 (diciamo 260 240 230 ... 150) e correggere il mio movimento della palla?

Il mio algoritmo di elaborazione delle immagini non è abbastanza veloce da tracciare la palla che la palla gira e cade in un buco.

Alcuni hanno suggerito di utilizzare un modello standard come mostrato nel seguente video e correggere i movimenti della palla per deviare nel percorso:

http://www.youtube.com/watch?v=Prq78ctJ2Rk&feature=player_embedded

Mi sono anche imbattuto in uno strumento di elaborazione delle immagini in cui hanno risolto lo stesso problema utilizzando i punti di passaggio per il movimento della palla. Vedendo troppe soluzioni allo stesso problema, sono totalmente confuso nel risolvere il problema. Sono consapevole che dovrei implementare un controller PID. Ma come dovrei risolvere i problemi in più fasi? Sono bloccato e solo frustrato nel trovare un vantaggio nel risolvere il problema.

La mia configurazione è simile al seguente:

foto di installazione

... ed ecco uno screenshot del mio software:

immagine dello schermo

Revisione 2: Sto anche affrontando un nuovo problema ora: in precedenza ho controllato i motori passo-passo tramite l'applet Java porta seriale Arduino. Sono in grado di guidare gli stepper usando l'applet.

Devo ripristinare la scheda ogni volta che provo a comunicare tramite porta seriale. Inoltre, il motore passo-passo si eccita a piccoli intervalli quando non viene inviato alcun comando. Quando il motore passo-passo entra in questa modalità, non posso controllare la mia scheda senza ripristinare la scheda. Qualsiasi aiuto sarebbe apprezzato.

Revisione 3:

Ho fatto alcuni progressi in cui ho implementato l'algoritmo PID. Puoi trovare il video qui sotto: http://www.youtube.com/watch?v=MEfp7RqPmqY

Ora ho un problema con la velocità con cui viene implementato l'algoritmo PID. In realtà la mia elaborazione delle immagini termina un ciclo in 200 ms, identifica una palla e invia i comandi alla scheda controller del motore passo-passo. Anche se alla mia porta seriale vengono inviati comandi per cambiare direzione, il mio stepper continua a ruotare nella stessa direzione. Puoi trovare lo strano comportamento nel video qui sopra.

Il mio pensiero è che dovrei limitare i valori PID con un limite in cui se il valore PID calcolato è maggiore di 100, dovrei semplicemente inviare un 100. Non vedo l'ora di sentire i tuoi pensieri su questo.

Il modo in cui ho implementato il controller PID è che ho identificato il punto iniziale del modello usando l'algoritmo di corrispondenza del modello e identificato la palla usando un altro algoritmo di corrispondenza del modello. Ora, ho fatto spostare la palla verso il centroide del modello del punto di partenza. Come faccio a farlo seguire la linea retta con l'algoritmo PID?

Revisione 4:

Traiettoria della chiazza isolata

Ho isolato la traiettoria ma non riesco a trovare la funzione corretta per stampare le coordinate pixel corrette dal punto iniziale. qualche idea?


1
Re PS: Quindi basta pubblicare un link all'immagine e sono sicuro che qualcuno arriverà e lo sostituirà con l'immagine stessa ...
Majenko,

@Matt - Risolto! Tuttavia, preferirei che l'utente fornisse il testo per andare con le immagini, non solo i collegamenti alle immagini. Non sono sicuro di dove li volessero @Sai, li ho semplicemente messi in fondo.
Kevin Vermeer,

Caspita ... Questi stepper hanno una coppia sufficiente per spostare la tavola a qualsiasi velocità? Spero che ci sia qualche riduzione dell'ingranaggio lì da qualche parte.
Connor Wolf,

@Fake - Gli stepper non dovrebbero avere problemi con questo. La tavola non pesa molto e il suo peso è bilanciato. Ho un orologio da parete con lancette lunghe 40 cm ed è controllato dallo stesso piccolo meccanismo di qualsiasi altro, che è anche uno stepper. (Il meccanismo di 5 cm x 5 cm sembra ridicolmente piccolo rispetto al diametro di 80 cm dell'orologio)
stevenvh

@Fake: Steve ha ragione. Non ho problemi con lo stepper. Riguarda l'algoritmo PID
Sai,

Risposte:


2

In primo luogo, poiché gli stepper sono ottimi nel posizionamento (non è necessario un feedback di posizione), dovresti certamente limitare il loro movimento come hai detto tu stesso. Non sono sicuro di come sia stato progettato l'albero del motore in questo momento, ma se fosse fissato al motore, lasciarlo girare continuerebbe a danneggiare l'apparecchiatura.

Successivamente, il ritardo di trasporto di 200 ms nel sensore sarà probabilmente troppo lento, altrimenti dovrai rallentare molto per rallentare la palla stessa. Simile a quello che ha detto Rocket Surgeon , dovresti semplificare l'algoritmo di elaborazione delle immagini per calcolare il percorso una sola volta , quindi calcolare rapidamente solo la posizione della palla in ciascun fotogramma. Se vuoi saltare questo passaggio rapidamente, trova una pallina rossa anziché questa, quindi controlla solo il componente rosso nella tua immagine RGB, fino a quando non hai trovato un algoritmo migliore.

Per il controllo PID, inizia con il fatto che in realtà hai bisogno di due controller PID separati, uno per il motore est-ovest, l'altro per quello nord-sud. Se hai due motori esatti, i loro parametri devono essere uguali.

Perché un controller PID agisca, deve conoscere l' errore : differenza tra la posizione desiderata e la posizione effettiva della palla. I componenti X e Y di questo offset saranno gli ingressi per due controller PID (uno per ciascun motore). Per ottenere l'errore, devi prima avere la posizione desiderata sul tuo percorso: una traiettoria .

Per ottenere la traiettoria, è necessario elaborare l'immagine e ottenere il percorso , nonché il suo punto iniziale e finale. Non sono sicuro che il tuo algoritmo sia in grado di distinguere il percorso dal resto della scheda in questo momento, ma in caso contrario, nota che si tratta di un algoritmo tutto suo da gestire prima di continuare. Ancora una volta, puoi saltare questa parte inserendo manualmente i punti di giunzione, se sei desideroso di vedere rapidamente alcuni risultati. In ogni caso, dovresti essere in grado di definire la velocità del setpoint e far spostare il software sulla posizione delle coordinate desiderata lungo il percorso, dall'inizio alla fine. Ovviamente, inizierai con una bassa velocità desiderata.

Quindi, prima di iniziare con il controllo, dovresti prima esaminare la seguente lista di controllo:

  • Semplifica l'algoritmo di elaborazione delle immagini per ottenere una risposta più rapida
  • Crea un algoritmo che crea una traiettoria sul tuo percorso usando una velocità predefinita
  • In ogni frame:
    • Calcola la differenza tra la traiettoria e la posizione della palla
    • Passa il componente delta-X al PID est-ovest, passa il delta-Y al PID nord-sud

È possibile che sia meglio creare la traiettoria un segmento alla volta e continuare con il segmento successivo quando quella palla termina quella precedente. Altrimenti, dovrai fare attenzione che la palla non superi la traiettoria desiderata (che potrebbe essere difficile da realizzare)


1

Se si dispone di una posizione fissa per la lettura della fotocamera e del mometario per entrambi gli assi, non è necessario riconoscere il percorso, i fori e le pareti dipinti nei riquadri. Può essere fatto in un colpo solo durante il tempo di installazione. In fase di runtime potrebbe essere necessario individuare solo la posizione esatta della singola sfera di metallo lucido.

Per individuare la palla è possibile utilizzare 1 LED IR a punto fisso e filtro a banda stretta sulla fotocamera. L'algoritmo deve calcolare il pixel più luminoso e tradurre X, Y in X reale, Y tenendo conto di passaggi come:

  • trova il pixel più luminoso
  • utilizzare l'angolazione per entrambi gli assi (lettura dal servo) per recuperare la distanza dalla telecamera
  • utilizzare il timestamp per la lettura della posizione degli assi
  • applicare l'interpolazione nel tempo per la lettura della posizione, se necessario
  • utilizzare distorsione nota dell'obiettivo
  • tradurre il mondo X, Y del pixel nell'angolo di riflessione dalla sfera perfetta per trovare il vero centro della sfera nel mondo X, Y
  • delta time per recuperare il tempo reale del frame
  • interpolazione nel tempo della posizione nel piano di bordo X, Y se necessario
  • invia il risultato X, Y (t) all'algoritmo PID
  • invia il secondo obiettivo di avanzamento X, Y (t) dal generatore / sequenza della traiettoria
  • lasciare che PID decida sull'output
  • eseguire l'output (gli ultimi passaggi possono essere eseguiti in parallelo)

Non dovrebbe essere intensivo dal punto di vista computazionale e dipende principalmente da un paio di valori assoluti.

Normalmente, la CPU di piccole dimensioni dovrebbe farlo con il ritmo del framerate.


Non sono sicuro di aver capito la tua soluzione. Trovo la tua soluzione interessante. Come posso assicurarmi che la mia palla segua il percorso corretto? Devo assicurarmi di avere una serie di waypoint da seguire?
Sai,

Sì. Il software di controllo del movimento deve sempre avere un "generatore di traiettoria", che è una routine che produce una sequenza finita ideale di X, Y (t) per ogni dato passo nel tempo. Questa sequenza viene inviata al primo ingresso del circuito di controllo, il secondo ingresso del circuito di controllo è la sequenza di posizioni reali. La routine di controllo deve calcolare gli errori di posizione / velocità / accelerazione e amplificare / sommare tutti gli errori conformemente al PID e produrre i segnali di correzione risultanti.
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.