Dies ist eine C++-Bibliothek mit ROS-Schnittstelle zur Verwaltung zweidimensionaler Gitterkarten mit mehreren Datenebenen. Es wurde für die mobile Roboterkartierung entwickelt, um Daten wie Höhe, Varianz, Farbe, Reibungskoeffizient, Trittqualität, Oberflächennormale, Befahrbarkeit usw. zu speichern. Es wird im Robot-Centric Elevation Mapping-Paket verwendet, das für die Navigation in unebenem Gelände entwickelt wurde.
Merkmale:
Dies ist ein Forschungskodex. Es ist davon auszugehen, dass er sich häufig ändert und jegliche Eignung für einen bestimmten Zweck ausgeschlossen wird.
Der Quellcode wird unter einer BSD-3-Clause-Lizenz veröffentlicht.
Autor: Péter Fankhauser
Zugehörigkeit: ANYbotics
Betreuer: Maximilian Wulf, [email protected], Magnus Gärtner, [email protected]
Mit Beiträgen von: Simone Arreghini, Tanja Baumann, Jeff Delmerico, Remo Diethelm, Perry Franklin, Magnus Gärtner, Ruben Grandia, Edo Jelavic, Dominic Jud, Ralph Kaestner, Philipp Krüsi, Alex Millane, Daniel Stonier, Elena Stumm, Martin Wermelinger, Christos Zalidis
Dieses Projekt wurde ursprünglich an der ETH Zürich (Autonomous Systems Lab & Robotic Systems Lab) entwickelt.
Diese Arbeit wird im Rahmen von ANYmal Research durchgeführt, einer Gemeinschaft zur Förderung der Beinrobotik.
Wenn Sie diese Arbeit in einem wissenschaftlichen Kontext verwenden, zitieren Sie bitte die folgende Veröffentlichung:
P. Fankhauser und M. Hutter, „A Universal Grid Map Library: Implementation and Use Case for Rough Terrain Navigation“ , in Robot Operating System (ROS) – The Complete Reference (Band 1), A. Koubaa (Hrsg.), Springer , 2016. (PDF)
@incollection{Fankhauser2016GridMapLibrary,
author = {Fankhauser, P{'{e}}ter and Hutter, Marco},
booktitle = {Robot Operating System (ROS) – The Complete Reference (Volume 1)},
title = {{A Universal Grid Map Library: Implementation and Use Case for Rough Terrain Navigation}},
chapter = {5},
editor = {Koubaa, Anis},
publisher = {Springer},
year = {2016},
isbn = {978-3-319-26052-5},
doi = {10.1007/978-3-319-26054-9{_}5},
url = {http://www.springer.com/de/book/9783319260525}
}
Diese Filialen werden derzeit betreut:
Pull-Anfragen für ROS 1 sollten auf master
abzielen. Pull-Anfragen für ROS 2 sollten auf rolling
abzielen und werden zurückportiert, wenn sie ABI nicht unterbrechen.
In diesem Buchkapitel finden Sie eine Einführung in die Rasterkartenbibliothek einschließlich eines Tutorials.
Die C++-API ist hier dokumentiert:
Um alle Pakete aus der Grid-Map-Bibliothek als Debian-Pakete zu installieren, verwenden Sie
sudo apt-get install ros-$ROS_DISTRO-grid-map
Das Paket „grid_map_core“ hängt nur von der linearen Algebra-Bibliothek Eigen ab.
sudo apt-get install libeigen3-dev
Die anderen Pakete hängen zusätzlich von der ROS-Standardinstallation ab ( roscpp , tf , filter , sensor_msgs , nav_msgs und cv_bridge ). Andere formatspezifische Konvertierungspakete (z. B. „grid_map_cv“ , „grid_map_pcl “ usw.) hängen von den unten in „Paketübersicht“ beschriebenen Paketen ab.
Um aus dem Quellcode zu erstellen, klonen Sie die neueste Version aus diesem Repository in Ihren Catkin-Arbeitsbereich und kompilieren Sie das Paket mit
cd catkin_ws/src
git clone https://github.com/anybotics/grid_map.git
cd ../
catkin_make
Um die Leistung zu maximieren, stellen Sie sicher, dass Sie im Release -Modus erstellen. Sie können den Build-Typ durch Einstellung festlegen
catkin_make -DCMAKE_BUILD_TYPE=Release
Dieses Repository besteht aus folgenden Paketen:
GridMap
-Klasse und mehrere Hilfsklassen wie die Iteratoren bereit. Dieses Paket wird ohne ROS-Abhängigkeiten implementiert.Zusätzliche Konvertierungspakete:
Führen Sie die Unit-Tests mit aus
catkin_make run_tests_grid_map_core run_tests_grid_map_ros
oder
catkin build grid_map --no-deps --verbose --catkin-make-args run_tests
wenn Sie Catkin-Tools verwenden.
Das Paket „grid_map_demos“ enthält mehrere Demonstrationsknoten. Verwenden Sie diesen Code, um Ihre Installation der Rasterkartenpakete zu überprüfen und Ihnen den Einstieg in die eigene Nutzung der Bibliothek zu erleichtern.
simple_demo demonstriert ein einfaches Beispiel für die Verwendung der Rasterkartenbibliothek. Dieser ROS-Knoten erstellt eine Rasterkarte, fügt Daten hinzu und veröffentlicht sie. Um das Ergebnis in RViz anzuzeigen, führen Sie den Befehl aus
roslaunch grid_map_demos simple_demo.launch
„tutorial_demo“ ist eine erweiterte Demonstration der Funktionalitäten der Bibliothek. Starten Sie die „tutorial_demo“ mit
roslaunch grid_map_demos tutorial_demo.launch
iterators_demo demonstriert die Verwendung der Grid-Map-Iteratoren. Starten Sie es mit
roslaunch grid_map_demos iterators_demo.launch
image_to_gridmap_demo zeigt, wie Daten von einem Bild in eine Rasterkarte konvertiert werden. Starten Sie die Demonstration mit
roslaunch grid_map_demos image_to_gridmap_demo.launch
Grid_map_to_image_demo zeigt, wie eine Rasterkartenebene in einem Bild gespeichert wird. Starten Sie die Demonstration mit
rosrun grid_map_demos grid_map_to_image_demo _grid_map_topic:=/grid_map _file:=/home/$USER/Desktop/grid_map_image.png
opencv_demo demonstriert Kartenmanipulationen mithilfe von OpenCV-Funktionen. Starten Sie die Demonstration mit
roslaunch grid_map_demos opencv_demo.launch
Resolution_change_demo zeigt, wie die Auflösung einer Rasterkarte mithilfe der OpenCV-Bildskalierungsmethoden geändert werden kann. Die Ergebnisse sehen, verwenden
roslaunch grid_map_demos resolution_change_demo.launch
filter_demo verwendet eine Kette von ROS-Filtern, um eine Rasterkarte zu verarbeiten. Ausgehend von der Höhe einer Geländekarte verwendet die Demo mehrere Filter, um zu zeigen, wie man Oberflächennormalen berechnet, Inpainting zum Füllen von Löchern verwendet, die Karte glättet/unscharf macht und mathematische Ausdrücke verwendet, um Kanten zu erkennen, Rauheit und Durchquerbarkeit zu berechnen. Die Einrichtung der Filterkette wird in der Datei filters_demo_filter_chain.yaml
konfiguriert. Starten Sie die Demo mit
roslaunch grid_map_demos filters_demo.launch
Weitere Informationen zu Rasterkartenfiltern finden Sie unter „grid_map_filters“.
interpolation_demo zeigt das Ergebnis verschiedener Interpolationsmethoden auf der resultierenden Oberfläche. Starten Sie die Demo und verwenden Sie
roslaunch grid_map_demos interpolation_demo.launch
Der Benutzer kann mit verschiedenen Welten (Oberflächen) und verschiedenen Interpolationseinstellungen in der Datei interpolation_demo.yaml
spielen. Die Visualisierung zeigt die Grundwahrheit in grüner und gelber Farbe an. Das Interpolationsergebnis wird in den Farben Rot und Lila angezeigt. Außerdem berechnet die Demo maximale und durchschnittliche Interpolationsfehler sowie die durchschnittliche Zeit, die für eine einzelne Interpolationsabfrage benötigt wird.
Die Rasterkarte bietet vier verschiedene Interpolationsmethoden (in der Reihenfolge zunehmender Genauigkeit und zunehmender Komplexität):
Weitere Einzelheiten finden Sie in der in der Datei CubicInterpolation.hpp
aufgeführten Literatur.
Die Rasterkartenbibliothek enthält der Einfachheit halber verschiedene Iteratoren.
Rasterkarte | Unterkarte | Kreis | Linie | Polygon |
---|---|---|---|---|
Ellipse | Spiral | |||
Die Verwendung des Iterators in einer for
Schleife ist üblich. Iterieren Sie beispielsweise mit dem GridMapIterator
über die gesamte Rasterkarte
for (grid_map::GridMapIterator iterator(map); !iterator.isPastEnd(); ++iterator) {
cout << "The value at index " << (*iterator).transpose() << " is " << map.at("layer", *iterator) << endl;
}
Die anderen Grid-Map-Iteratoren folgen der gleichen Form. Weitere Beispiele zur Verwendung der verschiedenen Iteratoren finden Sie im Knoten iterators_demo .
Hinweis: Für maximale Effizienz beim Einsatz von Iteratoren empfiehlt es sich, den direkten Zugriff auf die Datenebenen der Rasterkarte mit grid_map::Matrix& data = map["layer"]
außerhalb der for
Schleife lokal zu speichern:
grid_map::Matrix& data = map["layer"];
for (GridMapIterator iterator(map); !iterator.isPastEnd(); ++iterator) {
const Index index(*iterator);
cout << "The value at index " << index.transpose() << " is " << data(index(0), index(1)) << endl;
}
Ein Benchmarking der Leistung der Iteratoren finden Sie im iterator_benchmark
Knoten des Pakets „ grid_map_demos
, mit dem Sie es ausführen können
rosrun grid_map_demos iterator_benchmark
Beachten Sie, dass Iteratoren zwar praktisch sind, es aber oft am saubersten und effizientesten ist, die integrierten Eigen-Methoden zu verwenden. Hier einige Beispiele:
Festlegen eines konstanten Werts für alle Zellen einer Ebene:
map["layer"].setConstant(3.0);
Zwei Ebenen hinzufügen:
map["sum"] = map["layer_1"] + map["layer_2"];
Eine Ebene skalieren:
map["layer"] = 2.0 * map["layer"];
Max. Werte zwischen zwei Schichten:
map["max"] = map["layer_1"].cwiseMax(map["layer_2"]);
Berechnen Sie den quadratischen Mittelwertfehler:
map.add("error", (map.get("layer_1") - map.get("layer_2")).cwiseAbs());
unsigned int nCells = map.getSize().prod();
double rootMeanSquaredError = sqrt((map["error"].array().pow(2).sum()) / nCells);
Es gibt zwei verschiedene Methoden, die Position der Karte zu ändern:
setPosition(...)
: Ändert die Position der Karte, ohne die in der Karte gespeicherten Daten zu ändern. Dadurch ändert sich die Übereinstimmung zwischen den Daten und dem Kartenrahmen.
move(...)
: Verschiebt die von der Rasterkarte erfasste Region in den statischen Rasterkartenrahmen. Verwenden Sie diese Option, um die Grenzen der Rasterkarte zu verschieben, ohne die Rasterkartendaten zu verschieben. Kümmert sich um die gesamte Datenverarbeitung, sodass die Rasterkartendaten stationär im Rasterkartenrahmen bleiben.
Hinweis : Aufgrund der kreisförmigen Pufferstruktur liegen benachbarte Indizes möglicherweise nicht dicht im Kartenrahmen. Diese Annahme gilt nur für Indizes, die von getUnwrappedIndex() erhalten wurden.
setPosition(...) | move(...) |
---|---|
Dieses RViz-Plugin visualisiert eine Rasterkartenebene als 3D-Oberflächendiagramm (Höhenkarte). Als Ebene für die Farbinformationen kann eine eigene Ebene gewählt werden.
Dieses Paket bietet einen effizienten Algorithmus zum Konvertieren einer Höhenkarte in ein dichtes, signiertes 3D-Entfernungsfeld. Jeder Punkt im 3D-Raster enthält die Entfernung zum nächstgelegenen Punkt in der Karte zusammen mit dem Gradienten.
Dieser Knoten abonniert ein Thema vom Typ „grid_map_msgs/GridMap“ und veröffentlicht Nachrichten, die in RViz visualisiert werden können. Die veröffentlichten Themen des Visualizers können vollständig mit einer YAML-Parameterdatei konfiguriert werden. Es können beliebig viele Visualisierungen mit unterschiedlichen Parametern hinzugefügt werden. Ein Beispiel finden Sie hier für die Konfigurationsdatei der „tutorial_demo“ .
Punktwolke | Vektoren | Belegungsraster | Gitterzellen |
---|---|---|---|
grid_map_topic
(Zeichenfolge, Standard: „/grid_map“)
Der Name des Rasterkartenzweigs, der visualisiert werden soll. Nachfolgend finden Sie eine Beschreibung der Visualisierer.
/grid_map
(grid_map_msgs/GridMap)
Die zu visualisierende Rasterkarte.
Die veröffentlichten Themen werden mit der YAML-Parameterdatei konfiguriert. Mögliche Themen sind:
point_cloud
(sensor_msgs/PointCloud2)
Zeigt die Rasterkarte als Punktwolke an. Wählen Sie mit dem layer
Parameter aus, welche Ebene in Punkte umgewandelt werden soll.
name: elevation
type: point_cloud
params:
layer: elevation
flat: false # optional
flat_point_cloud
(sensor_msgs/PointCloud2)
Zeigt die Rasterkarte als „flache“ Punktwolke, d. h. mit allen Punkten auf der gleichen Höhe z . Dies ist praktisch, um 2D-Karten oder Bilder (oder sogar Videostreams) in RViz mithilfe des Color Transformer
zu visualisieren. Der Parameter height
bestimmt die gewünschte z -Position der flachen Punktwolke.
name: flat_grid
type: flat_point_cloud
params:
height: 0.0
Hinweis: Um Punkte in der flachen Punktwolke aus leeren/ungültigen Zellen wegzulassen, geben Sie mit setBasicLayers(...)
die Layer an, deren Gültigkeit überprüft werden soll.
vectors
(visualization_msgs/Marker)
Visualisiert Vektordaten der Rasterkarte als visuelle Markierungen. Geben Sie mit dem Parameter layer_prefix
die Ebenen an, die die x- , y- und z -Komponenten der Vektoren enthalten. Der Parameter position_layer
definiert den Layer, der als Startpunkt der Vektoren verwendet werden soll.
name: surface_normals
type: vectors
params:
layer_prefix: normal_
position_layer: elevation
scale: 0.06
line_width: 0.005
color: 15600153 # red
occupancy_grid
(nav_msgs/OccupancyGrid)
Visualisiert eine Ebene der Rasterkarte als Belegungsraster. Geben Sie mit dem layer
-Parameter den Layer an, der visualisiert werden soll, und mit data_min
und data_max
die Ober- und Untergrenze.
name: traversability_grid
type: occupancy_grid
params:
layer: traversability
data_min: -0.15
data_max: 0.15
grid_cells
(nav_msgs/GridCells)
Visualisiert eine Ebene der Rasterkarte als Rasterzellen. Geben Sie die zu visualisierende Ebene mit dem Parameter layer
und die Ober- und Untergrenzen mit lower_threshold
und upper_threshold
an.
name: elevation_cells
type: grid_cells
params:
layer: elevation
lower_threshold: -0.08 # optional, default: -inf
upper_threshold: 0.08 # optional, default: inf
region
(visualization_msgs/Marker)
Zeigt die Grenze der Rasterkarte an.
name: map_region
type: map_region
params:
color: 3289650
line_width: 0.003
Hinweis: Farbwerte liegen im RGB-Format als verkettete ganze Zahlen vor (für jeden Kanalwert 0–255). Beispielhaft für die Farbe Grün können die Werte so generiert werden (Rot: 0, Grün: 255, Blau: 0).
Das Paket „grid_map_filters“ enthält mehrere Filter, die auf eine Rasterkarte angewendet werden können, um Berechnungen für die Daten in den Ebenen durchzuführen. Die Rasterkartenfilter basieren auf ROS-Filtern, was bedeutet, dass eine Filterkette als YAML-Datei konfiguriert werden kann. Darüber hinaus können zusätzliche Filter geschrieben und über den ROS-Plugin-Mechanismus verfügbar gemacht werden, beispielsweise der InpaintFilter
aus dem Paket grid_map_cv
.
Im Paket „grid_map_filters“ werden mehrere grundlegende Filter bereitgestellt:
gridMapFilters/ThresholdFilter
Legen Sie Werte in der Ausgabeebene auf einen angegebenen Wert fest, wenn die Bedingungsebene entweder den oberen oder unteren Schwellenwert überschreitet (jeweils nur einen Schwellenwert).
name: lower_threshold
type: gridMapFilters/ThresholdFilter
params:
condition_layer: layer_name
output_layer: layer_name
lower_threshold: 0.0 # alternative: upper_threshold
set_to: 0.0 # # Other uses: .nan, .inf
gridMapFilters/MeanInRadiusFilter
Berechnen Sie für jede Zelle einer Schicht den Mittelwert innerhalb eines Radius.
name: mean_in_radius
type: gridMapFilters/MeanInRadiusFilter
params:
input_layer: input
output_layer: output
radius: 0.06 # in m.
gridMapFilters/MedianFillFilter
Berechnen Sie für jede NaN- Zelle einer Schicht den Median (der endlichen Zahlen) innerhalb eines Patches mit Radius. Wenden Sie optional Medianberechnungen für Werte an, die bereits endlich sind. Der Patchradius für diese Punkte wird durch „existing_value_radius“ angegeben. Beachten Sie, dass die Füllberechnung nur durchgeführt wird, wenn die Füllmaske für diesen Punkt gültig ist.
name: median
type: gridMapFilters/MedianFillFilter
params:
input_layer: input
output_layer: output
fill_hole_radius: 0.11 # in m.
filter_existing_values: false # Default is false. If enabled it also does a median computation for existing values.
existing_value_radius: 0.2 # in m. Note that this option only has an effect if filter_existing_values is set true.
fill_mask_layer: fill_mask # A layer that is used to compute which areas to fill. If not present in the input it is automatically computed.
debug: false # If enabled, the additional debug_infill_mask_layer is published.
debug_infill_mask_layer: infill_mask # Layer used to visualize the intermediate, sparse-outlier removed fill mask. Only published if debug is enabled.
gridMapFilters/NormalVectorsFilter
Berechnen Sie die Normalenvektoren einer Ebene in einer Karte.
name: surface_normals
type: gridMapFilters/NormalVectorsFilter
params:
input_layer: input
output_layers_prefix: normal_vectors_
radius: 0.05
normal_vector_positive_axis: z
gridMapFilters/NormalColorMapFilter
Berechnen Sie eine neue Farbebene basierend auf Normalvektorebenen.
name: surface_normals
type: gridMapFilters/NormalColorMapFilter
params:
input_layers_prefix: normal_vectors_
output_layer: normal_color
gridMapFilters/MathExpressionFilter
Analysieren und bewerten Sie einen mathematischen Matrixausdruck mit Ebenen einer Rasterkarte. Die Dokumentation der Ausdrücke finden Sie in EigenLab.
name: math_expression
type: gridMapFilters/MathExpressionFilter
params:
output_layer: output
expression: acos(normal_vectors_z) # Slope.
# expression: abs(elevation - elevation_smooth) # Surface roughness.
# expression: 0.5 * (1.0 - (slope / 0.6)) + 0.5 * (1.0 - (roughness / 0.1)) # Weighted and normalized sum.
gridMapFilters/SlidingWindowMathExpressionFilter
Analysieren und bewerten Sie einen mathematischen Matrixausdruck in einem Schiebefenster auf einer Ebene einer Rasterkarte. Die Dokumentation der Ausdrücke finden Sie in EigenLab.
name: math_expression
type: gridMapFilters/SlidingWindowMathExpressionFilter
params:
input_layer: input
output_layer: output
expression: meanOfFinites(input) # Box blur
# expression: sqrt(sumOfFinites(square(input - meanOfFinites(input))) ./ numberOfFinites(input)) # Standard deviation
# expression: 'sumOfFinites([0,-1,0;-1,5,-1;0,-1,0].*elevation_inpainted)' # Sharpen with kernel matrix
compute_empty_cells: true
edge_handling: crop # options: inside, crop, empty, mean
window_size: 5 # in number of cells (optional, default: 3), make sure to make this compatible with the kernel matrix
# window_length: 0.05 # instead of window_size, in m
gridMapFilters/DuplicationFilter
Duplizieren Sie eine Ebene einer Rasterkarte.
name: duplicate
type: gridMapFilters/DuplicationFilter
params:
input_layer: input
output_layer: output
gridMapFilters/DeletionFilter
Ebenen aus einer Rasterkarte löschen.
name: delete
type: gridMapFilters/DeletionFilter
params:
layers: [color, score] # List of layers.
Darüber hinaus stellt das Paket „grid_map_cv“ die folgenden Filter bereit:
gridMapCv/InpaintFilter
Verwenden Sie OpenCV, um Löcher in einer Ebene einzumalen/zu füllen.
name: inpaint
type: gridMapCv/InpaintFilter
params:
input_layer: input
output_layer: output
radius: 0.05 # in m
Kinetisch | Melodisch | Noetisch | |
---|---|---|---|
Grid_map | |||
Dok |
Kinetisch | Melodisch | Noetisch | |
---|---|---|---|
Grid_map | |||
Grid_map_core | |||
grid_map_costmap_2d | |||
Grid_map_cv | |||
grid_map_demos | |||
Grid_map_filters | |||
Grid_map_loader | |||
grid_map_msgs | |||
grid_map_octomap | |||
grid_map_pcl | |||
grid_map_ros | |||
Grid_map_rviz_plugin | |||
grid_map_sdf | |||
Grid_map_visualization |
Bitte melden Sie Fehler und fordern Sie Funktionen über den Issue Tracker an.