Guten Tag, liebe Leser! In früheren Artikeln über die ROS-Roboterplattform habe ich das Thema Lokalisierung und Mapping angesprochen. Insbesondere haben wir die SLAM-Methoden untersucht: Gmapping im
Artikel und hector_slam im
Artikel . In diesem Artikel werde ich mich weiterhin mit den Lokalisierungsalgorithmen in ROS vertraut machen und einen Überblick über mehrere auf der ROS-Plattform implementierte visuelle Odometrie-Algorithmen geben. Die visuelle Kilometerzähler sind in der Robotik wichtig, da Sie damit die Bewegung des Roboters, seine aktuelle Position und Beschleunigung anhand des Videostreams von der Kamera bewerten können. Sie können entweder eine normale RGB-Kamera (in diesem Fall über monokulare Kilometerzähler) oder eine Stereokamera (Stereo-Kilometerzähler) und sogar eine RGBD-Kamera verwenden.
Bei Verwendung von RGBD-Kameras wie Microsoft Kinect ist es möglich, eine genauere visuelle Kilometerzähler zu erhalten als bei Stereokameras, da in diesem Fall 3D-Daten verwendet werden. In diesem Artikel werden wir solche Algorithmen betrachten. Wer sich für dieses Thema interessiert, bitte unter der Katze.
rtabmap
rtabmap ist im Wesentlichen ein ROS SLAM-Algorithmus. In diesem Paket gibt es zusätzlich zu den Tools für SLAM eine
odometryViewer- Anwendung zum Testen verschiedener Methoden der visuellen Odometrie. In rtabmap funktioniert die visuelle Kilometerzähler wie folgt: Zur Berechnung der Kilometerzähler verwendet der Algorithmus visuelle Attribute, die aus RGB-Bildern und Tiefendaten aus einer Tiefenkarte erhalten wurden. Unter Verwendung übereinstimmender visueller Attribute (Übereinstimmung) zwischen zwei Bildern berechnet der RANSAC-Algorithmus die Transformation zwischen aufeinanderfolgenden Bildern.
Die Installation von rtabmap auf ROS Indigo und Kinetic ist über apt-get sehr einfach:
sudo apt-get install ros-<version>-rtabmap ros-<version>-rtabmap-ros
Sie können auch rtabmap und rtabmap_ros von der Quelle aus festlegen:
source /opt/ros/<version>/setup.bash cd ~ git clone https://github.com/introlab/rtabmap.git rtabmap cd rtabmap/build cmake .. make cd ~/catkin_ws git clone https://github.com/introlab/rtabmap_ros.git src/rtabmap_ros catkin_make -j1
Führen Sie odometryViewer aus:
rtabmap-odometryViewer
Ein Fenster wie dieses öffnet sich:

Bewegen Sie die Kamera ein wenig:

Versuchen wir, mit den Parametern zu arbeiten. Beispiel: Verwenden der Bag-of-Word-Methode (Standard ist SURF):
rtabmap-odometryViewer -bow
Verwenden der Bag-of-Word-Methode mit einem SIFT-Deskriptor (0 = SURF, 1 = SIFT)
rtabmap-odometryViewer -bow 1

Verwenden der FAST + BRIEF-Methode:
rtabmap-odometryViewer -bin

Sie können auch die Kilometerzähler basierend auf der ICP-Methode (Iterative Closest Point) mit der Option -icp ausprobieren.
Sie können die Verarbeitungsfrequenz mit dem Parameter hz (ganzzahlige Bilder pro Sekunde) anpassen:
rtabmap-odometryViewer -hz 2
Sie können auch die internen Parameter des Algorithmus konfigurieren, z. B. den maximalen Abstand zwischen Inlayern, die maximale Anzahl visueller Zeichen zum Finden einer Übereinstimmung und die Anzahl der Iterationen in der RANSAC / ICP-Methode.
Im Allgemeinen haben Experimente mit der visuellen Kilometerzähler von rtabmap gezeigt, dass der Algorithmus schnell und ohne Verzögerung funktioniert und die Position der Kamera relativ zur Szene genau bestimmt. Das einzige Minus des Algorithmus aus dem rtabmap-Paket ist, dass es bei Verwendung nicht möglich war, Kilometerzählungsdaten in rviz anzuzeigen. Hier müssen Sie mehr über die Integration mit ROS erfahren.
Fovis_ros-Paket
Das Paket fovis_ros funktioniert nur unter der ROS Hydro-Version. Es gibt einen Indigo-Zweig im Repository, aber fovis_ros stürzt beim Kompilieren im Catkin-Arbeitsbereich mit einem Fehler ab.
Um fovis_ros zu installieren, benötigen wir die libfovis-Bibliothek und das fovis_ros-Paket selbst. Laden Sie sie aus den Github-Repositories herunter:
cd ~/catkin_ws/src git clone https://github.com/srv/libfovis.git cd libfovis git checkout hydro cd .. git clone https://github.com/srv/fovis.git cd fovis git checkout hydro cd ~/catkin_ws catkin_make source devel/setup.bash
Hier müssen wir sicherstellen, dass der aktuelle Zweig von Hydro ausgewählt wird, da sonst Kompilierungsprobleme auftreten können (der aktuelle Zweig in den Repositorys ist Indigo).
Erstellen Sie nun einen Launcher, um fovis_ros zu starten:
cd ~/catkin_ws/src git clone https://github.com/vovaekb/fovis_demo.git d ~/catkin_ws catkin_make source devel/setup.bash
Führen Sie fovis_demo.launch aus:
roslaunch fovis_demo fovis_demo.launch
Das rviz-Fenster wird geöffnet:

Bewegen Sie die Kamera ein wenig und erhalten Sie eine aktualisierte Position:

fovis_ros veröffentlicht Daten zu zwei Themen: / kinect_odometer / odometry (odometry) und / kinect_odometer /pose (position).
Jetzt werden wir uns in meinem Beispiel mit dem Inhalt der Startdateien befassen. Zur Information stammen die Dateien aus dem Buch „Lernen von ROS für die Robotikprogrammierung - Zweite Ausgabe“ aus Kapitel 5 mit dem Titel Computer Vision.
Beginnen wir mit der Hauptdatei fovis_demo.launch.
In der Schlange
<arg name="mode" default="no_registered"/>
Wir setzen den mode-Parameter auf no_registered. Dies bedeutet, dass wir keine registrierten Tiefeninformationen verwenden, d. H. Die Tiefenkarte ist nicht registriert und wird von einer RGB-Kamera nicht in ein Bild umgewandelt. Dies geschieht, um die Verarbeitung zu beschleunigen, da der Algorithmus bei einer Aufzeichnung der Tiefe langsam arbeiten würde.
Überprüfen Sie die Aktualisierungsrate des Kilometerzählers:
rostopic hz /kinect_odometer/odometry
Wir kommen zu einem ähnlichen Ergebnis:
average rate: 8.759 min: 0.084s max: 0.156s std dev: 0.02417s window: 9 average rate: 7.938 min: 0.084s max: 0.180s std dev: 0.02724s window: 16 average rate: 7.493 min: 0.084s max: 0.217s std dev: 0.03286s window: 23 average rate: 8.111 min: 0.068s max: 0.217s std dev: 0.03645s window: 33
Führen Sie fovis_demo mit Programmregistrierung im folgenden Modus aus: = sw_registered parameter:
roslaunch fovis_demo fovis_demo.launch mode:=sw_registered
Wir erhalten die folgenden Informationen zur Aktualisierungsrate des Kilometerzählers:
average rate: 0.963 min: 1.022s max: 1.056s std dev: 0.01676s window: 3 average rate: 0.968 min: 1.020s max: 1.056s std dev: 0.01635s window: 4 average rate: 1.212 min: 0.509s max: 1.056s std dev: 0.25435s window: 6
Als nächstes definieren wir die Anzeigekonfigurationsdatei für rviz:
<arg name="rviz_config" default="$(find fovis_demo)/config/rviz_$(arg mode).rviz"/>
Ich werde den Inhalt hier nicht berücksichtigen. Ich möchte nur sagen, dass es das Erscheinungsbild des rviz-Fensters bestimmt: aktive Anzeigen für Themen, globale Einstellungen wie fester Rahmen usw.
Das Folgende ist die Definition des Parameters rviz und der Start des Treibers für den Kinect-Sensor, abhängig vom Modusparameter:
<include file="$(find fovis_demo)/launch/openni_kinect_$(arg mode).launch"/>
Starten Sie den Launcher für Fovis aus unserem Paket auch abhängig vom Modusparameter:
<include file="$(find fovis_demo)/launch/fovis_$(arg mode).launch"/>
Da wir die Bewegung des Roboters basierend auf der Bewegung der Kamera schätzen, müssen wir die Verschiebung oder Transformation vom Kamerakoordinatensystem zum Roboterkoordinatensystem kennen. Dazu veröffentlichen wir eine statische Transformation zwischen den Koordinatensystemen base_link → camera_link mit static_transform_publisher aus dem tf-Paket:
<node pkg="tf" type="static_transform_publisher" name="base_to_camera_tf" args="0 0 -0.05 0 0 0 base_link camera_link 100"/>
Führen Sie abschließend rviz aus:
<group if="$(arg rviz)"> <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rviz_config)"/> </group>
Ich werde den Rest der Launcher-Dateien in diesem Artikel nicht berücksichtigen. Dies kann auf Wunsch unabhängig erfolgen. Ich sage nur, wenn fovis_ros mit dem Parameter mode = sw_registered gestartet wird, werden die Frames von der RGB-Kamera gedrosselt, d. H. erneutes Veröffentlichen von Nachrichten von einem Thema zu einem anderen mit einer niedrigeren Aktualisierungsfrequenz (2,5 Hz) (weitere Details finden Sie
hier ).
Für diejenigen, die sich eingehend mit dem Fovis-Algorithmus befassen möchten, gibt es
einen Artikel über die Details des Algorithmus.
Experimente mit visueller Kilometerzähler fovis_ros zeigten, dass der Algorithmus nicht so schnell wie rtabmap arbeitet, mit kleinen Verzögerungen beim Bewegen der Kamera, aber dennoch die Position der Kamera relativ zur Szene ziemlich genau bestimmt.
Ich hoffe, dass diese Überprüfung der visuellen Odometrie-Algorithmen bei Ihrer Arbeit hilfreich ist und Ihnen bei der Lösung einiger Probleme hilft. Ich wünsche Ihnen viel Erfolg bei Ihren Projekten und bis bald!
PS: Ich bitte Sie auch, an der Umfrage teilzunehmen und die Version von ROS auszuwählen, die Sie in Ihrer Arbeit verwenden.