RGBD SLAM mit der Intel RealSense R200 Kamera

From RobotinoWiki

Simultaneous Localization and Mapping (SLAM) bezeichnet das gleichzeitige Erstellen einer Karte als auch die Lokalisierung innerhalb dieser Karte (siehe auch SLAM auf Wikipedia). Dies wird in der Regel innerhalb von Gebäuden angewandt, wo keine Karte im Vorfeld bekannt ist sowie eine globale Positionierung mit Hilfe von GPS nicht möglich ist.

Um eine Karte aufzubauen sind grundsätzlich alle Sensoren denkbar, die in der Lage sind die Umgebung zu erfassen, wie zum Beispiel Laserscanner oder Kameras. Hier widmen wir uns dem Einsatz einer sogenannten 3D-Kamera, die neben dem visuellen Bild (RGB) auch ein Tiefenbild (D) liefert. Die Tiefeninformation kann dabei durch stereoskopische Verfahren, durch time-of-flight Sensoren oder über Triangulationsverfahren bestimmt werden. Bekannte Vertreter solcher 3D-Kameras sind die Kinect-Kamera sowie die Intel RealSense Kamera Serie. In diesem Fall nutzen wir die Intel RealSense R200 Kamera, die die Tiefeninformation durch die Kombination einer Stereokamera und einem Infrarot (IR) Laser-Projektor-System ermittelt.

Einen Überblick über verschiedene SLAM Verfahren bietet die Webseite openslam.org. Hier konzentrieren wir uns auf das Verfahren rtabmap, welches im Gegensatz zu anderen publizierten RGBD-Verfahren eine aktive Weiterentwicklung aufweist und in alle aktuellen ROS (Robotic Operating System) Varianten eingebunden werden kann. Dieses Verfahren wurde unter anderem vom Gewinner der IROS 2014 Microsoft Connect Challenge eingesetzt.


Voraussetzungen

Installation

Um die Installation zu vereinfachen wurde ein Paket zusammengestellt, das ein Installationsskript sowie alle notwendigen Anpassungen enthält um rtabmap in ROS mit einer Intel RealSense R200 Kamera zu nutzen. Die Installation besteht aus folgenden Schritten:

  • Installation der Robotino API2 über die Paketquelle http://packages.openrobotino.org, sofern sie noch nicht installiert sind.
  • Installation der ROS Pakete von der offiziellen Paketquelle http://packages.ros.org/ros/ubuntu.
  • Erstellen einer Sandbox rtabmap4robotino-ros im Verzeichnis des Benutzers mit folgenden Elementen:
    • ROS Treiber für die Intel RealSense R200 Kamera
    • ROS Anbindung an den Robotino über das Paket robotino_node sowie einem Patch um die robotino_node erfolgreich auf aktuellen ROS Varianten zu bauen.
    • Ein aktualisiertes Robotino Model.
    • Das ROS Paket rtabmap4robotino welches eine Vielzahl an vorbereiteten Konfigurationen (sog. launch-files) für ROS bereitstellt.
    • Das Skript enter_env.sh um die Umgebungsvariablen von ROS in einer neuen Shell zu setzen.


Zur Installation wird eine bestehende Internetverbindung benötigt. Die Befehle sind im einzelnen:

wget http://doc.openrobotino.org/download/jebens/rtabmap4robotino.tar.gz
tar xfz rtabmap4robotino.tar.gz
cd rtabmap4robotino
./install_rtabmap.sh

Nach der erfolgreich durchgeführten Installation liegt die ROS-Sandbox im Verzeichnis rtabmap4robotino-ros:

cd ~/rtabmap4robotino-ros


Erste Schritte in der ROS-Sandbox

Um die Verwendung der ROS-Sandbox zu vereinfachen wird während der Installation das Skript enter_env.sh in dem Sandbox-Verzeichnis installiert. Dieses setzt die für ROS notwendigen Umgebungsvariablen und erlaubt somit die Nutzung der ROS-Befehle und aktiviert die Tab-Completion für die Befehle.

Um die ROS-Sandbox zu aktivieren, werden folgende Befehle eingegeben:

cd ~/rtabmap4robotino-ros
./enter_env.sh

Nun befindet man sich in der Sandbox-Umgebung. Dies ist durch den geänderten Prompt der Shell ersichtlich, die nun die Zeichenkette [ROS] enthält.

Um ROS zu starten wurden verschiedene sogenannte Launch-files vorbereitet. Diese enthalten die Konfiguration des ROS-Systems, welches in der Regel aus mehreren unterschiedlichen Komponenten besteht. Die einzelnen Launch-files sind in der Regel Bestandteil ihrer jeweiligen ROS-Pakete, in diesem Fall dem ROS-Paket rtabmap4robotino. Um beispielsweise die Intel RealSense R200 Kamera zu starten und die 3D-Punktwolke mit dem Darstellungsprogramm rviz darzustellen wird folgender Befehl eingegeben:

roslaunch rtabmap4robotino realsense_live_display.launch

Bei der Befehlseingabe vereinfacht die Tab-Completion die Auswahl des ROS-Pakets (rtabmap4robotino) als auch des Launch-files (realsense_live_display.launch): Durch Drücken der Tab-Taste wird dabei der Name soweit vervollständigt wie möglich, durch zweimaliges Drücken der Tab-Taste wird eine Liste aller Möglichkeiten ausgegeben.


Bereitgestellte ROS-Konfigurationen

Das ROS-Paket rtabmap4robotino enthält ROS-Konfigurationen für unterschiedliche Einsatzgebiete der rtabmap Software. Diese sind in den folgenden Abschnitten weiter erläutert.


Nutzung ohne Roboter

Um erste Erfahrungen mit der Software zu sammeln bieten sich die Konfigurationen

  • realsense_live_display.launch
  • rtabmap_start_mapping.launch
  • rtabmap_continue_mapping.launch
  • rtabmap_localization.launch

an, die die Intel RealSense R200 Kamera einlesen jedoch keine Verbindung zum Roboter benötigen. Die für das SLAM-Verfahren benötigte Odometrie wird dabei aus den Kamerabildern berechnet.

Die erste Konfiguration realsense_live_display.launch startet neben der Kamera auch ein rviz Display um die Daten zu visualisieren. Diese Konfiguration ist für den ersten Test der Intel RealSense Kamera gedacht.

Die Konfiguration rtabmap_start_mapping.launch startet die Kamera und die rtabmap Software um eine neue Karte zu erzeugen (Achtung: Eine evtl. vorhandene Karte wird überschrieben!). Während der Aufnahme wird über eine grafische Darstellung der aktuelle Zustand des SLAM-Verfahrens angezeigt. Hier sind beispielsweise die aktuelle 3d-Karte, evtl. loop-closures sowie der Zustand der visuellen Odometrie dargestellt.

Um die Konfiguration zu beenden reicht es im Terminal Ctrl-C zu drücken. Die generierte Karte wird dabei automatisch in der Datei ~/.ros/rtabmap.db gespeichert.

Um eine Kartierung fortzusetzen wird die Konfiguration rtabmap_continue_mapping.launch genutzt. Diese unterscheidet sich zur Konfiguration rtabmap_start_mapping.launch nur darin, dass die Karte beim Start nicht gelöscht wird. Die neu hinzugefügten Bilder werden bei einem erfolgreich durchgeführten loop-closure automatisch in die alte Karte überführt.

Möchte man die Karte nicht ändern, sondern nur die Lokalisierung nutzen, so wird die Konfiguration rtabmap_localization.launch gestartet. Um die alte Karte in der Visualisierung zu sehen, sollte der Menüpunkt Edit -> Download Map ausgewählt werden.


Nutzung der Odometrie des Robotinos

Die Konfigurationen

  • robotino_realsense_live_display.launch
  • robotino_rtabmap_start_mapping.launch
  • robotino_rtabmap_continue_mapping.launch
  • robotino_rtabmap_localization.launch

nutzen die Odometrie des Robotinos, die in der Regel deutlich genauer als die visuelle Odometrie auf Basis der Intel RealSense R200 Kamera ist. Dank der Robotino API2 können die Konfigurationen sowohl direkt auf dem Robotino gestartet werden, als auch auf einem anderen Computer der über eine Netzwerkverbindung die Daten des Robotinos empfängt. Dazu wird die Umgebungsvariable ROBOTINO_IP verwendet. Diese Variable muss vor dem Start der ROS Konfiguration gesetzt werden:

export ROBOTINO_IP=172.26.1.1
roslaunch rtabmap4robotino robotino_rtabmap_start_mapping.launch

Wird die Umgebungsvariable nicht gesetzt, so wird die Verbindung mit dem localhost (127.0.0.1) aufgebaut.

Trennung von Kamera und SLAM-Berechnung

Soll die Bildaufnahme und die SLAM-Berechnung auf unterschiedlichen Rechnern erfolgen, so kann auf dem Kamera-PC die Konfiguration

  • realsense_sender.launch

und auf dem Empfangs-PC eine der Konfigurationen

  • remote_camera_rtabmap_start_mapping.launch
  • remote_camera_rtabmap_continue_mapping.launch
  • remote_camera_rtabmap_localization.launch

genutzt werden. Die Sende-Seite reduziert dabei die Bildwiederholfrequenz und die Empfangsseite fordert nur komprimierte Daten an.

Um Sende- und Empfangsseite miteinander zu verbinden, muss auf einer Seite die Umgebungsvariable ROS_MASTER_URI gesetzt werden. Hat beispielsweise der Kamera-PC die IP 192.168.1.1 und der Empfangs-PC die IP 192.168.1.2, so wird auf dem Kamera-PC ROS wie gehabt gestartet:

roslaunch rtabmap4robotino realsense_sender.launch

Auf dem Empfangs-PC wird zunächst die Umgebungsvariable ROS_MASTER_URI gesetzt und anschließend die gewünschte Konfiguration gestartet:

export ROS_MASTER_URI=http://192.168.1.1:11311
roslaunch rtabmap4robotino remote_camera_rtabmap_start_mapping.launch

Playback von ROS-Bags

Die Konfigurationen

  • playback_realsense_display.launch
  • playback_rtabmap_start_mapping.launch
  • playback_rtabmap_continue_mapping.launch
  • playback_rtabmap_localization.launch

entsprechen den Konfigurationen des Abschnitts "Nutzung ohne Roboter", starten aber nicht die Intel RealSense R200 Kamera. Hier wird davon ausgegangen, dass die Bilddaten aus einer Aufzeichnung von ROS kommen, die parallel gestartet werden muss.

Inspektion der Karte

rtabmap stellt das Tool rtabmap-databaseViewer zur Verfügung um die Karte zu inspizieren. Gestartet wird das Tool durch die Eingabe des Befehls

rtabmap-databaseViewer ~/.ros/rtabmap.db