Ein kleiner Hintergrund meines Ziels
Ich bin dabei, einen mobilen autonomen Roboter zu bauen, der in einem unbekannten Bereich navigieren, Hindernissen ausweichen und Spracheingaben erhalten muss, um verschiedene Aufgaben zu erledigen. Es muss auch Gesichter, Objekte usw. erkennen. Ich verwende einen Kinect-Sensor und Rad-Kilometerzähler-Daten als Sensoren. Ich habe C # als meine Hauptsprache gewählt, da die offiziellen Treiber und SDK sofort verfügbar sind. Ich habe das Vision- und NLP-Modul abgeschlossen und arbeite am Navigationsteil.
Mein Roboter verwendet derzeit den Arduino als Kommunikationsmodul und einen Intel i7 x64-Bit-Prozessor auf einem Laptop als CPU.
Dies ist die Übersicht über den Roboter und seine Elektronik:
Das Problem
Ich habe einen einfachen SLAM-Algorithmus implementiert, der die Roboterposition von den Encodern abruft und alles, was er sieht, mithilfe des Kinect (als 2D-Schicht der 3D-Punktwolke) zur Karte hinzufügt.
So sehen die Karten meines Zimmers derzeit aus:
Dies ist eine grobe Darstellung meines tatsächlichen Zimmers:
Wie Sie sehen können, sind sie sehr unterschiedlich und daher wirklich schlechte Karten.
- Wird dies erwartet, wenn man nur Dead Reckoning verwendet?
- Ich bin mir der Partikelfilter bewusst, die sie verfeinern, und bin bereit, sie zu implementieren. Aber wie kann ich dieses Ergebnis verbessern?
Aktualisieren
Ich habe vergessen, meinen aktuellen Ansatz zu erwähnen (den ich früher aber vergessen hatte). Mein Programm macht ungefähr Folgendes: (Ich verwende eine Hashtabelle zum Speichern der dynamischen Karte)
- Schnapp dir die Punktwolke von Kinect
- Warten Sie auf eingehende serielle Kilometerzählerdaten
- Synchronisieren Sie mit einer zeitstempelbasierten Methode
- Schätzen Sie die Roboterpose (x, y, Theta) mithilfe von Gleichungen bei Wikipedia und Encoderdaten
- Erhalten Sie eine "Scheibe" der Punktwolke
- Mein Slice ist im Grunde ein Array der X- und Z-Parameter
- Zeichnen Sie diese Punkte dann basierend auf der Roboterpose und den X- und Z-Parametern
- Wiederholen