Come posso migliorare la mappa nel mio robot autonomo mobile usando KINECT


9

Un piccolo sfondo del mio obiettivo

Sto costruendo un robot autonomo mobile che deve navigare in un'area sconosciuta, deve evitare ostacoli e ricevere input vocali per svolgere varie attività. Deve anche riconoscere volti, oggetti, ecc. Sto usando un sensore Kinect e i dati dell'odometria della ruota come suoi sensori. Ho scelto C # come lingua principale in quanto i driver ufficiali e sdk sono prontamente disponibili. Ho completato il modulo Vision e NLP e sto lavorando sulla parte di navigazione.

Il mio robot attualmente utilizza Arduino come modulo per la comunicazione e un processore Intel i7 x64 bit su un laptop come CPU.

Questa è la panoramica del robot e della sua elettronica:

panoramica del robot elettronica del robot


Il problema

Ho implementato un semplice algoritmo SLAM che ottiene la posizione del robot dagli encoder e aggiunge tutto ciò che vede usando kinect (come una porzione 2D della nuvola di punti 3D) alla mappa.

Ecco come appaiono attualmente le mappe della mia stanza:

come appare una mappa della mia stanza Un'altra mappa della mia stanza

Questa è una rappresentazione approssimativa della mia stanza reale:

inserisci qui la descrizione dell'immagine

Come puoi vedere, sono mappe molto diverse e molto brutte.

  • Ci si aspetta che utilizzi solo la resa dei conti morta?
  • Sono a conoscenza dei filtri antiparticolato che lo perfezionano e sono pronto per l'implementazione, ma quali sono i modi in cui posso migliorare questo risultato?

Aggiornare

Ho dimenticato di menzionare il mio approccio attuale (che prima dovevo ma ho dimenticato). Il mio programma lo fa approssimativamente: (Sto usando una tabella hash per memorizzare la mappa dinamica)

  • Prendi la nuvola di punti da Kinect
  • Attendere i dati di odometria seriale in entrata
  • Sincronizzazione utilizzando un metodo basato su data e ora
  • Stimare la posa del robot (x, y, theta) usando le equazioni su Wikipedia e i dati dell'encoder
  • Ottieni una "fetta" della nuvola di punti
  • La mia sezione è sostanzialmente una matrice dei parametri X e Z.
  • Quindi tracciare questi punti in base alla posa del robot e ai parametri X e Z.
  • Ripetere

Risposte:


1

È questo ciò che ci si aspetterebbe: in linea di principio sì. Anche se potresti essere in grado di migliorare il tuo modello di odometria, in generale non è sufficiente ottenere una buona mappa. Senza una descrizione del tuo sistema è difficile dire come migliorarlo. Sulla maggior parte dei sistemi, la stima della traduzione è migliore della rotazione. È possibile aggiungere un giroscopio e misurare la rotazione. Ciò dovrebbe migliorare significativamente i risultati.

Invece di implementare tu stesso un filtro antiparticolato, potresti usare un'implementazione SLAM, ad esempio da openslam . Ciò dovrebbe farti risparmiare molto tempo e molto probabilmente darà risultati migliori.


Mi fai sentire meglio dicendo quello che mi aspettavo: D, ma sono davvero fiducioso che la mia odometria sia molto buona, ( specialmente la mia rotazione : D). Ho aggiunto un aggiornamento che descrive brevemente il sistema (se ciò non bastasse, posso fornirti il ​​codice o qualsiasi altra informazione). Proverò ad usare un giroscopio domani e quindi aggiornerò i risultati. Mi piacerebbe usare gli algoritmi di openslam, ma sto usando C # (in modo da poter usare l'SDK ufficiale), e la maggior parte delle librerie per tali compiti sono in C ++ o sono fornite in ROS (solo Linux). Mi piacerebbe sicuramente usarli ma non vedo bene!
Shreyas Kapur,

tinyslam afferma di usare 200 righe di codice c. Immagino che portarlo su c # non dovrebbe essere così difficile.
Jakob,

Wow! Ma immagino che non usi alcun filtro antiparticolato e faccia la stessa cosa che sto facendo. Cercherò sicuramente di implementarlo. Grazie mille :-)
Shreyas Kapur,

1

Suggerirei di provare i filtri antiparticolato / EKF.

Cosa fai attualmente:

-> Dead Reckoning: stai guardando la tua posizione attuale senza alcun riferimento.

-> Localizzazione continua: sai approssimativamente dove ti trovi nella mappa.

Se non si dispone di un riferimento e non si conosce la propria posizione sulla mappa, indipendentemente dalle azioni intraprese, sarà difficile ottenere una mappa perfetta.

Ad esempio: sei in una stanza circolare. Continui ad andare avanti. Sai qual è stata la tua ultima mossa. La mappa che otterrai sarà quella di una casella diritta come una struttura. Questo accadrà a meno che e fino a quando non hai un modo per localizzare o sapere dove ti trovi esattamente sulla mappa, continuamente.

La localizzazione può essere effettuata tramite EKF / Filtri antiparticolato se si dispone di un punto di riferimento iniziale. Tuttavia, il punto di riferimento iniziale è un must.


Grazie per la risposta, davvero un bell'esempio, userò sicuramente EKF, ma il problema è che non sono cattivo in matematica, ma non molto buono, e sto usando C #, quindi non ho librerie e lo sto implementando me stesso mi prenderà secoli. Qualche suggerimento al riguardo?
Shreyas Kapur,

Sarebbe molto meglio ripassare la matematica e seguire alcuni corsi piuttosto che fare qualcosa che non capisci e non riesci a eseguire il debug. Imparalo e implementalo. Sarà sicuramente utile in futuro.
Naresh,

Cerca anche implementazioni C # su github. Il lavoro è più popolare di quanto sembri.
Naresh,

Grazie per i suggerimenti, lo farò sicuramente domani. Sto facendo del mio meglio per imparare la matematica, e spero di farlo e sono sicuro che farà molto. Ho 13 anni, che è il collo di bottiglia per l'apprendimento qui, non siamo nemmeno stati introdotti alle matrici a scuola! :-(
Shreyas Kapur,

So che hai 13 anni :) A Internet non importa. Puoi ritirare le matrici dalla Khan Academy. Probabilità e statistiche pure.
Naresh,

1

Perché stai usando i calcoli morti, gli errori nella stima della posa del robot si accumulano nel tempo. Dalla mia esperienza, dopo un po ', la stima dei morti pone la stima diventa inutile. Se si utilizzano sensori extra, come il giroscopio o l'accelerometro, la stima della posa migliorerà ma poiché ad un certo punto non si ha alcun feedback, divergerà come prima. Di conseguenza, anche se si hanno buoni dati da Kinect, la costruzione di una mappa accurata è difficile poiché la stima della posa non è valida.

Devi localizzare il tuo robot mentre provi a costruire la tua mappa (SLAM!). Così come viene creata la mappa, la stessa mappa viene utilizzata anche per localizzare il robot. Ciò garantisce che la stima della posa non diverga e che la qualità della mappa sia migliore. Pertanto suggerirei di studiare alcuni algoritmi SLAM (cioè FastSLAM) e provare a implementare la tua versione.


Grazie per la tua risposta :-). Mi rendo conto che la resa dei conti morta è errata, ma la mappa che ho costruito era su scala molto piccola. Ho spostato il robot lentamente e lentamente per ridurre al minimo il maggior numero possibile di errori, il robot non si è mosso molto. In realtà sto studiando molti algoritmi SLAM di openslam, ma come ho detto a Naresh, "Non sono cattivo in matematica, ma non molto bravo, e sto usando C #, quindi non ho librerie e lo sto implementando me stesso mi prenderà secoli. " Qualche suggerimento al riguardo?
Shreyas Kapur,

Ti occupi di post elaborazione con i dati Kinect? È possibile che i dati contengano del rumore e se li lasci non trattati potrebbero invalidare la tua mappa. Prova a semplificare il problema. Lascia che il robot si fermi e mappare le pareti davanti a sé. Come funziona ora? Se la mappa è chiara, significa che il problema si verifica a causa del movimento. In caso contrario, il problema è molto più fondamentale.
Demetris,
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.