Odometrie und Motorcontroller ROS nodes

Im Moment arbeite ich an einem ROS Node welcher die Lichtschranken überwacht, die Odometrie berechnet und eine nav_msgs/odometry message publiziert. Dies kann ich dann als zusätzlichen Input für den Google Cartographer SLAM benutzen. Allerdings bin ich mir noch nicht sicher wie genau die Odometrie wird. Einerseits wegen des beträchtlichen Drift welcher durch die „Panzer Lenkung“ zustande kommt, andererseits weil der Taktgeber nur 32 Flanken pro Umdrehung generiert, was in einer Strecke von 1,9cm Pro tick resultiert. Die Kovarianz der Odometrie muss ich dann durch Messungen ermitteln.

Zusätzlich arbeite ich an einem ROS node welcher die Motoren steuert, so sind dann alle Systeme mit ROS ansprechbar.

orb_slam_2_ros

Seit kurzem ist meine Implementierung des ORB-SLAM2 für ROS online. Im vergleich zu der originalen Implementierung von Raul Mau-Artal ist meine Version auf den Einsatz mit ROS optimiert. Das Package kann komplett mit catkin build gebaut werden und die Position, die Pointcloud und ein Livestream der Kamera mit gefundenen Keypoints wird als ROS topic publiziert. Darüber hinaus verzichtet das Package auf den integrierten viewer, das Laden des vocabulary file wurde stark beschleunigt und Parameter sind über den ROS Parameterserver einstellbar.

Das Package findet sich hier, auf dem offiziellen Github account von appliedAI.

ROS Kinetic auf der Jetson

Auf der Nvidia Jetson TX2 Läuft jetzt Ubuntu 16.04 und ROS Kinetic. ROS ist eine Robotik Middleware und erleichtert das Entwickeln von Prototypen sehr. Im ROS Framework kommunizieren die Programmteile (Nodes) untereinande nach dem publisher-subscriber Prinzip.

Im Moment arbeite ich an einer Library welche die GPIO Funktionen der Pins und I2C bereit stellt. Diese benutze ich dann um meinen Motorcontroll-Node zu bauen.

 

ROS Kinetic Kame

USB Treiber TiM551

Ich habe den USB Treiber für den Sick Laserscanner TiM551 seit längerem fertig gestellt. Über diesen hat der Raspberry Pi Zugriff auf die Daten des Laserscanners. Die erwarteten Probleme beim auslesen des Sensors über USB blieben aus. Auch mein Debug Tool ist an die neue Anzahl der Scanpunkte angepasst.

Nun arbeite ich an dem Anpassen der Freiraumnavigation an die höhere Menge an Scandaten.

Sick TiM551

Ich habe von der Firma Sick einen Laserscanner vom Typ TiM551 zur Verfügung gestellt bekommen. Dieser hat eine Winkelauflösung von 1°, einen Messbereich von 270°, eine Reichweite von 10m und scant mit 15hz. Dieser Laserscanner wird mein selbstgebautes LiDAR Modul ersetzen.IMG_7780Ich arbeite an einem Treiber für den Raspberry Pi, um die Daten über Usb auslesen zu können. Alternativ kann man mit dem Sensor auch über Ethernet kommunizieren. Da der Raspi aber nur einen Netzwerkanschluss hat, ist dies für mich keine Möglichkeit.

ICP Algorithmus

Seit längerem nun arbeite ich an der Implementierung des ICP (Iterative Closest Point) Algorithmus. Mit diesem lässt sich der Abstand zwischen zwei Punktwolken (also z.B. zwischen zwei Scans oder einer Karte und einem Scan) minimieren.

Bei meiner Implementierung ist der resultierende Vektor, mit welchem die zu matchende Punktwolke bewegt werden muss, um eine optimale Überdeckung zu erreichen, die Bewegung des Roboters zwischen den beiden Scans.

Dies funktioniert aber noch nicht zuverlässig. Der Schwellwert, welcher benutzt wird, um Ausreißer aus den Scans zu erkennen, ist sehr wichtig für den Erfolg des ICP Algorithmus. Dieser Schwellwert wird in meinem Programm für jede Iteration des Algorithmus dekrementiert, ist also dynamisch. Ich denke dies geschieht noch nicht ganz optimal.

Laserscanner

Ich habe den Sharp Ir Sensor nun gegen ein Lasermodul ausgetauscht. Dieses misst Entfernung bis zu 40m mit einer Genauigkeit von +-2cm. Für einen Messzyklus braucht es weniger als 20mSec, im Gegensatz zu dem Ir Sensor, welcher 45mSec benötigt. So ist es nun möglich, mein LiDAR Modul wesentlich scheller zu drehen.IMG_7502

Das Lasermodul braucht im Durchschnitt nur 100mA bei 5V. Mein Debugtool habe ich bereits angepasst.gui lidar

Ich plane, jeweils den aktuellen Scan mit dem vorhergegangenen Scan zu matchen (zu vergleichen), um die Positionsänderung nachverfolgen zu können. Um dies tun zu können, ist es erforderlich, das in beiden Scans zumindest teilweise die gleichen Gegenstände abgebildet sind. Da der Ir Sensor nur eine Reichweite von 1,5m hatte, war der Scan „leer“, sobald sich kein Gegenstand innerhalb dieses Umkreises befand. Der Roboter könnte sich nicht orientieren. Dies wird mit dem Laserscanner behoben (es ist anzunehmen, dass sich immer etwas in der Sensorreichweite von 40m befindet).

PID Regler

Ich habe nun einen PID Regler für jeden Motor implementiert. Dieser nutzt die Daten der Lichtschranke, um die Geschwindigkeit des zu steuernden Motors zu regeln. So ist es nun möglich, alle Motoren exakt gleich schnell drehen zu lassen. Aber auch präzise Kurvenfahrten sind nun möglich.

Positionsschätzung mit Odometrie

Ich habe nun eine Funktion implementiert, welche die Position des Roboters auf Grundlage der Odometriedaten berechent. Dies ist nur approximativ möglich, da es recht viele Fehlerquellen (wie z.B. den Schlupf der Räder) gibt.

Um die Position zu berechen, Werden die Odometriedaten mit einer hohen Frequenz ausgelesen. So kann die Geschwindigkeit des Roboters für jeweils einen Messzyklus als konstant angenommen werden.