Wie kann ich die Karte in meinem mobilen autonomen Roboter mit KINECT verbessern?

9

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:

Übersicht über den Roboter Elektronik des Roboters


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:

Wie sieht eine Karte von meinem Zimmer aus? Eine andere Karte mein Zimmer

Dies ist eine grobe Darstellung meines tatsächlichen Zimmers:

Geben Sie hier die Bildbeschreibung ein

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
Shreyas Kapur
quelle

Antworten:

1

Ist das zu erwarten: im Prinzip ja. Obwohl Sie möglicherweise Ihr Kilometerzählermodell verbessern können, reicht es im Allgemeinen nicht aus, eine gute Karte zu erhalten. Ohne eine Beschreibung Ihres Systems ist es schwierig zu sagen, wie Sie es verbessern können. Bei den meisten Systemen ist die Translationsschätzung besser als die Rotation. Sie können einen Kreisel hinzufügen und die Drehung messen. Dies sollte Ihre Ergebnisse erheblich verbessern.

Anstatt selbst einen Partikelfilter zu implementieren, können Sie eine SLAM-Implementierung verwenden, z . B. von openslam . Dies sollte Ihnen viel Zeit sparen und höchstwahrscheinlich zu besseren Ergebnissen führen.

Jakob
quelle
Sie geben mir ein besseres Gefühl, wenn Sie sagen, dass dies erwartet wird: D, aber ich bin wirklich zuversichtlich, dass meine Kilometerzähler sehr gut sind ( insbesondere meine Rotation : D). Ich habe ein Update hinzugefügt, das das System kurz beschreibt (wenn das nicht ausreicht, kann ich Ihnen Code oder andere Informationen geben). Ich werde morgen versuchen, einen Kreisel zu verwenden und dann die Ergebnisse aktualisieren. Ich würde gerne die Algorithmen von openslam verwenden, aber ich verwende C # (damit ich das offizielle SDK verwenden kann), und die meisten Bibliotheken für solche Aufgaben befinden sich entweder in C ++ oder werden in ROS (nur Linux) bereitgestellt. Ich würde sie sicherlich gerne benutzen, aber ich sehe einfach nicht scharf!
Shreyas Kapur
tinyslam behauptet, 200 Zeilen c-Code zu verwenden. Ich denke, es sollte nicht so schwer sein, es auf c # zu portieren.
Jakob
Beeindruckend! Aber ich denke, es verwendet keinen Partikelfilter und macht das Gleiche wie ich. Aber ich werde sicherlich versuchen, das umzusetzen. Vielen Dank :-)
Shreyas Kapur
1

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.

Naresh
quelle
Vielen Dank für die Antwort, sehr schönes Beispiel, ich werde sicherlich EKF verwenden, aber das Problem ist, dass ich nicht schlecht in Mathe bin, aber auch nicht sehr gut, und ich verwende C #, also habe ich keine Bibliotheken und implementiere es Ich selbst werde ewig brauchen. Irgendwelche Vorschläge dazu?
Shreyas Kapur
Es wäre weitaus besser, Ihre Mathematik aufzufrischen und ein paar Kurse zu belegen, als etwas zu machen, das Sie nicht verstehen und das Sie nicht debuggen können. Lernen Sie es und implementieren Sie es. Es wird definitiv in Zukunft von Nutzen sein.
Naresh
Suchen Sie auch nach C # -Implementierungen auf Github. Die Arbeit ist populärer als es aussieht.
Naresh
Vielen Dank für die Vorschläge, werde es sicherlich morgen tun. Ich versuche mein Bestes, um die Mathematik zu lernen, und hoffe, es zu tun, und bin mir sicher, dass es einen langen Weg gehen wird. Ich bin 13 Jahre alt, was der Engpass für das Lernen hier ist. Wir haben noch nicht einmal Matrizen in der Schule kennengelernt! :-(
Shreyas Kapur
Ich weiß, dass du 13 bist :) Das Internet kümmert sich nicht. Sie können Matrizen von der Khan Academy abholen. Wahrscheinlichkeit und Statistik auch.
Naresh
1

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.

Demetris
quelle
Danke für deine Antwort :-). Mir ist klar, dass die tote Abrechnung falsch ist, aber die Karte, die ich erstellt habe, war sehr klein. Ich bewegte den Roboter langsam und langsam, um so viele Fehler wie möglich zu minimieren. Der Roboter bewegte sich nicht viel. Ich habe tatsächlich viele SLAM-Algorithmen von OpenSlam studiert, aber wie ich zu Naresh sagte: "Ich bin nicht schlecht in Mathe, aber auch nicht sehr gut, und ich verwende C #, also habe ich keine Bibliotheken und implementiere es Ich selbst werde ewig brauchen. " Irgendwelche Vorschläge dazu?
Shreyas Kapur
Führen Sie eine Nachbearbeitung mit den Kinect-Daten durch? Es ist möglich, dass Daten Rauschen enthalten. Wenn Sie sie unbehandelt lassen, kann dies Ihre Karte ungültig machen. Versuchen Sie, das Problem einfach zu machen. Lassen Sie den Roboter stehen und kartieren Sie die Wände davor. Wie funktioniert es jetzt? Wenn die Karte klar ist, bedeutet dies, dass das Problem aufgrund der Bewegung auftritt. Wenn nicht, ist das Problem viel grundlegender.
Demetris