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
Ich würde vorschlagen, dass Sie Partikelfilter / EKF versuchen.
Was Sie gerade tun:
-> Dead Reckoning: Sie sehen Ihre aktuelle Position ohne Referenz.
-> Kontinuierliche Lokalisierung: Sie wissen ungefähr, wo Sie sich auf der Karte befinden.
Wenn Sie keine Referenz haben und nicht wissen, wo Sie sich auf der Karte befinden, unabhängig davon, welche Aktionen Sie ausführen, ist es schwierig, eine perfekte Karte zu erhalten.
Zum Beispiel: Sie befinden sich in einem runden Raum. Sie bewegen sich weiter vorwärts. Sie wissen, was Ihr letzter Schritt war. Die Karte, die Sie erhalten, ist die einer geraden kastenartigen Struktur. Dies geschieht nur, wenn Sie eine Möglichkeit haben, kontinuierlich zu lokalisieren oder zu wissen, wo Sie sich genau auf der Karte befinden.
Die Lokalisierung kann über EKF / Partikelfilter erfolgen, wenn Sie einen Startreferenzpunkt haben. Der Ausgangspunkt ist jedoch ein Muss.
quelle
Weil Sie Dead Reckoning verwenden, häufen sich die Fehler bei der Schätzung der Pose des Roboters rechtzeitig an. Nach meiner Erfahrung wird nach einer Weile die Schätzung der toten Abrechnung unbrauchbar. Wenn Sie zusätzliche Sensoren wie Gyroskop oder Beschleunigungsmesser verwenden, verbessert sich die Posenschätzung. Da Sie jedoch irgendwann keine Rückmeldung erhalten, wird sie wie zuvor abweichen. Selbst wenn Sie gute Daten vom Kinect haben, ist es daher schwierig, eine genaue Karte zu erstellen, da Ihre Posenschätzung nicht gültig ist.
Sie müssen Ihren Roboter gleichzeitig mit dem Versuch, Ihre Karte zu erstellen, lokalisieren (SLAM!). Während die Karte erstellt wird, wird dieselbe Karte auch zum Lokalisieren des Roboters verwendet. Dies stellt sicher, dass Ihre Posenschätzung nicht abweicht und Ihre Kartenqualität besser sein sollte. Daher würde ich vorschlagen, einige SLAM-Algorithmen (dh FastSLAM) zu studieren und zu versuchen, Ihre eigene Version zu implementieren.
quelle