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:
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:
Questa è una rappresentazione approssimativa della mia stanza reale:
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