Это библиотека C++ с интерфейсом ROS для управления двумерными сеточными картами с несколькими слоями данных. Он предназначен для мобильного роботизированного картографирования и хранения таких данных, как высота, отклонение, цвет, коэффициент трения, качество опоры, нормаль поверхности, проходимость и т. д. Он используется в пакете Robot-Centric Elevation Mapping, предназначенном для навигации по пересеченной местности.
Функции:
Это исследовательский код, ожидайте, что он часто меняется, и любая пригодность для конкретной цели отвергается.
Исходный код распространяется под лицензией BSD 3-Clause.
Автор: Петер Фанкхаузер
Аффилиация: ANYbotics
Сопровождающий: Максимилиан Вульф, [email protected], Магнус Гертнер, [email protected]
При участии: Симона Аррегини, Таня Бауманн, Джефф Дельмерико, Ремо Дитхельм, Перри Франклин, Магнус Гертнер, Рубен Грандиа, Эдо Елавич, Доминик Джад, Ральф Кестнер, Филипп Крузи, Алекс Миллейн, Дэниел Стоньер, Елена Штумм, Мартин Вермелингер, Христос Залидис
Первоначально этот проект был разработан в ETH Zurich (Лаборатория автономных систем и Лаборатория робототехнических систем).
Эта работа проводится в рамках ANYmal Research, сообщества, занимающегося продвижением робототехники на ногах.
Если вы используете эту работу в академическом контексте, пожалуйста, дайте ссылку на следующую публикацию:
П. Фанкхаузер и М. Хаттер, «Универсальная библиотека сетчатых карт: реализация и вариант использования для навигации по пересеченной местности» , в операционной системе робота (ROS) - Полный справочник (том 1), А. Кубаа (ред.), 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}
}
В настоящее время поддерживаются следующие филиалы:
Запросы на включение для ROS 1 должны быть нацелены на master
. Запросы на включение для ROS 2 должны быть нацелены на rolling
и будут перенесены, если они не нарушат ABI.
В этой главе книги представлено введение в библиотеку карт-сеток, включая учебное пособие.
API C++ описан здесь:
Чтобы установить все пакеты из библиотеки карт сетки в качестве пакетов Debian, используйте
sudo apt-get install ros-$ROS_DISTRO-grid-map
Пакетgrid_map_core зависит только от библиотеки линейной алгебры Eigen.
sudo apt-get install libeigen3-dev
Остальные пакеты дополнительно зависят от стандартной установки ROS ( roscpp , tf , filter , Sensor_msgs , nav_msgs и cv_bridge ). Другие пакеты преобразования для конкретного формата (например ,grid_map_cv , grid_map_pcl и т. д.) зависят от пакетов, описанных ниже в разделе «Обзор пакетов» .
Чтобы выполнить сборку из исходного кода, клонируйте последнюю версию из этого репозитория в рабочую область Catkin и скомпилируйте пакет, используя
cd catkin_ws/src
git clone https://github.com/anybotics/grid_map.git
cd ../
catkin_make
Чтобы максимизировать производительность, обязательно выполняйте сборку в режиме Release . Вы можете указать тип сборки, установив
catkin_make -DCMAKE_BUILD_TYPE=Release
Этот репозиторий состоит из следующих пакетов:
GridMap
и несколько вспомогательных классов, таких как итераторы. Этот пакет реализован без зависимостей ROS.Дополнительные пакеты конвертации:
Запустите модульные тесты с помощью
catkin_make run_tests_grid_map_core run_tests_grid_map_ros
или
catkin build grid_map --no-deps --verbose --catkin-make-args run_tests
если вы используете инструменты Catkin.
Пакетgrid_map_demos содержит несколько демонстрационных узлов. Используйте этот код, чтобы проверить установку пакетов карт сетки и начать использовать библиотеку самостоятельно.
simple_demo демонстрирует простой пример использования библиотеки карт сетки. Этот узел ROS создает карту сетки, добавляет к ней данные и публикует ее. Чтобы увидеть результат в RViz, выполните команду
roslaunch grid_map_demos simple_demo.launch
tutorial_demo — это расширенная демонстрация возможностей библиотеки. Запустите учебник_demo с помощью
roslaunch grid_map_demos tutorial_demo.launch
iterators_demo демонстрирует использование итераторов карты сетки. Запустите его с помощью
roslaunch grid_map_demos iterators_demo.launch
image_to_gridmap_demo демонстрирует, как преобразовать данные из изображения в сетку. Начните демонстрацию с
roslaunch grid_map_demos image_to_gridmap_demo.launch
Grid_map_to_image_demo демонстрирует, как сохранить слой карты сетки в изображении. Начните демонстрацию с
rosrun grid_map_demos grid_map_to_image_demo _grid_map_topic:=/grid_map _file:=/home/$USER/Desktop/grid_map_image.png
opencv_demo демонстрирует манипуляции с картой с помощью функций OpenCV. Начните демонстрацию с
roslaunch grid_map_demos opencv_demo.launch
разрешение_change_demo показывает, как можно изменить разрешение карты сетки с помощью методов масштабирования изображения OpenCV. Посмотрите результаты, используйте
roslaunch grid_map_demos resolution_change_demo.launch
filter_demo использует цепочку фильтров ROS для обработки карты сетки. Начиная с высоты карты местности, демонстрационная версия использует несколько фильтров, чтобы показать, как вычислять нормали поверхности, использовать закрашивание для заполнения дыр, сглаживание/размытие карты и использование математических выражений для обнаружения краев, расчета шероховатости и проходимости. Настройка цепочки фильтров настраивается в файле filters_demo_filter_chain.yaml
. Запустите демо-версию с помощью
roslaunch grid_map_demos filters_demo.launch
Дополнительные сведения о фильтрах карты сетки см. в разделе Grid_map_filters.
interpolation_demo показывает результат различных методов интерполяции на полученной поверхности. Запустите демо, используйте
roslaunch grid_map_demos interpolation_demo.launch
Пользователь может играть с разными мирами (поверхностями) и разными настройками интерполяции в файле interpolation_demo.yaml
. Визуализация отображает основную истину зеленым и желтым цветом. Результат интерполяции отображается красным и фиолетовым цветами. Кроме того, демо-версия вычисляет максимальные и средние ошибки интерполяции, а также среднее время, необходимое для одного запроса интерполяции.
Карта-сетка имеет четыре различных метода интерполяции (в порядке возрастания точности и возрастания сложности):
Для получения более подробной информации ознакомьтесь с литературой, указанной в файле CubicInterpolation.hpp
.
Библиотека карт сетки для удобства содержит различные итераторы.
Карта сетки | Подкарта | Круг | Линия | Полигон |
---|---|---|---|---|
Эллипс | Спираль | |||
Использование итератора в цикле for
является обычным явлением. Например, выполните итерацию по всей карте сетки с помощью GridMapIterator
с помощью
for (grid_map::GridMapIterator iterator(map); !iterator.isPastEnd(); ++iterator) {
cout << "The value at index " << (*iterator).transpose() << " is " << map.at("layer", *iterator) << endl;
}
Другие итераторы карты сетки имеют ту же форму. Дополнительные примеры использования различных итераторов можно найти в узле iterators_demo .
Примечание. Для максимальной эффективности при использовании итераторов рекомендуется локально сохранять прямой доступ к слоям данных карты сетки с помощью grid_map::Matrix& data = map["layer"]
вне цикла for
:
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;
}
Вы можете найти результаты тестирования производительности итераторов в узле iterator_benchmark
grid_map_demos
, который можно запустить с помощью
rosrun grid_map_demos iterator_benchmark
Помните, что, хотя итераторы удобны, часто самым простым и эффективным способом является использование встроенных собственных методов. Вот несколько примеров:
Установка постоянного значения для всех ячеек слоя:
map["layer"].setConstant(3.0);
Добавляем два слоя:
map["sum"] = map["layer_1"] + map["layer_2"];
Масштабирование слоя:
map["layer"] = 2.0 * map["layer"];
Макс. значения между двумя слоями:
map["max"] = map["layer_1"].cwiseMax(map["layer_2"]);
Вычислите среднеквадратическую ошибку:
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);
Существует два разных метода изменения положения карты:
setPosition(...)
: изменяет положение карты без изменения данных, хранящихся на карте. Это изменяет соответствие между данными и фреймом карты.
move(...)
: перемещает область, захваченную картой сетки, во фрейм статической карты сетки. Используйте это для перемещения границ карты сетки без перемещения данных карты сетки. Берет на себя всю обработку данных, так что данные карты сетки остаются неподвижными во фрейме карты сетки.
Примечание . Из-за структуры кольцевого буфера соседние индексы могут не располагаться близко друг к другу во фрейме карты. Это предположение справедливо только для индексов, полученных с помощью getUnwrappedIndex().
setPosition(...) | move(...) |
---|---|
Этот плагин RViz визуализирует слой карты сетки как трехмерный график поверхности (карту высот). В качестве слоя для информации о цвете можно выбрать отдельный слой.
Этот пакет предоставляет эффективный алгоритм для преобразования карты высот в плотное трехмерное знаковое поле расстояний. Каждая точка трехмерной сетки содержит расстояние до ближайшей точки на карте вместе с градиентом.
Этот узел подписывается на тему типаgrid_map_msgs/GridMap и публикует сообщения, которые можно визуализировать в RViz. Опубликованные темы визуализатора можно полностью настроить с помощью файла параметров YAML. Можно добавить любое количество визуализаций с разными параметрами. Здесь приведен пример файла конфигурации Tutorial_demo .
Облако точек | Векторы | Сетка занятости | Ячейки сетки |
---|---|---|---|
grid_map_topic
(строка, по умолчанию: «/grid_map»)
Имя темы карты сетки, которую необходимо визуализировать. Описание визуализаторов смотрите ниже.
/grid_map
(grid_map_msgs/GridMap)
Карта-сетка для визуализации.
Опубликованные темы настраиваются с помощью файла параметров YAML. Возможные темы:
point_cloud
(sensor_msgs/PointCloud2)
Показывает карту сетки в виде облака точек. Выберите, какой слой преобразовать в точки, с помощью параметра layer
.
name: elevation
type: point_cloud
params:
layer: elevation
flat: false # optional
flat_point_cloud
(sensor_msgs/PointCloud2)
Показывает карту сетки как «плоское» облако точек, т.е. со всеми точками на одной высоте z . Это удобно для визуализации 2D-карт или изображений (или даже видеопотоков) в RViz с помощью Color Transformer
. height
параметра определяет желаемое положение по оси Z плоского облака точек.
name: flat_grid
type: flat_point_cloud
params:
height: 0.0
Примечание. Чтобы исключить точки в плоском облаке точек из пустых/недопустимых ячеек, укажите слои, достоверность которых следует проверить с помощью setBasicLayers(...)
.
vectors
(visualization_msgs/Marker)
Визуализирует векторные данные карты сетки в виде визуальных маркеров. Укажите слои, которые содержат компоненты x , y и z векторов, с помощью параметра layer_prefix
. Параметр position_layer
определяет слой, который будет использоваться в качестве начальной точки векторов.
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)
Визуализирует слой карты сетки как сетку занятости. Укажите слой для визуализации с помощью параметра layer
, а верхнюю и нижнюю границу — с помощью data_min
и data_max
.
name: traversability_grid
type: occupancy_grid
params:
layer: traversability
data_min: -0.15
data_max: 0.15
grid_cells
(nav_msgs/GridCells)
Визуализирует слой карты сетки в виде ячеек сетки. Укажите слой для визуализации с помощью параметра layer
, а верхнюю и нижнюю границы — с помощью lower_threshold
и upper_threshold
.
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)
Показывает границу карты сетки.
name: map_region
type: map_region
params:
color: 3289650
line_width: 0.003
Примечание. Значения цвета представлены в форме RGB как объединенные целые числа (для каждого значения канала от 0 до 255). Значения могут быть сгенерированы следующим образом, например, для зеленого цвета (красный: 0, зеленый: 255, синий: 0).
Пакетgrid_map_filters содержит несколько фильтров, которые можно применять к карте сетки для выполнения вычислений над данными в слоях. Фильтры карты сетки основаны на фильтрах ROS, что означает, что цепочку фильтров можно настроить как файл YAML. Кроме того, можно написать дополнительные фильтры и сделать их доступными через механизм плагинов ROS, например, InpaintFilter
из grid_map_cv
.
В пакетеgrid_map_filters имеется несколько основных фильтров:
gridMapFilters/ThresholdFilter
Установите значения в выходном слое на указанное значение , если Condition_layer превышает верхний или нижний порог (только один порог за раз).
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
Вычислите для каждой ячейки слоя среднее значение внутри радиуса.
name: mean_in_radius
type: gridMapFilters/MeanInRadiusFilter
params:
input_layer: input
output_layer: output
radius: 0.06 # in m.
gridMapFilters/MedianFillFilter
Вычислите для каждой ячейки NaN слоя медиану (конечных чисел) внутри участка с радиусом. При желании можно применить медианные вычисления для значений, которые уже конечны, радиус исправления для этих точек задается существующим_значением_радиусом. Обратите внимание, что вычисление заполнения выполняется только в том случае, если маска fill_mask действительна для этой точки.
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
Вычислите нормальные векторы слоя на карте.
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
Вычислите новый цветовой слой на основе слоев нормальных векторов.
name: surface_normals
type: gridMapFilters/NormalColorMapFilter
params:
input_layers_prefix: normal_vectors_
output_layer: normal_color
gridMapFilters/MathExpressionFilter
Разберите и оцените математическое матричное выражение со слоями карты сетки. См. документацию по выражениям в 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
Разберите и оцените математическое матричное выражение в скользящем окне на слое карты сетки. См. 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
Дублируйте слой карты-сетки.
name: duplicate
type: gridMapFilters/DuplicationFilter
params:
input_layer: input
output_layer: output
gridMapFilters/DeletionFilter
Удаление слоев из карты сетки.
name: delete
type: gridMapFilters/DeletionFilter
params:
layers: [color, score] # List of layers.
Кроме того, пакетgrid_map_cv предоставляет следующие фильтры:
gridMapCv/InpaintFilter
Используйте OpenCV для закрашивания/заполнения дыр в слое.
name: inpaint
type: gridMapCv/InpaintFilter
params:
input_layer: input
output_layer: output
radius: 0.05 # in m
Кинетический | Мелодичный | Ноэтический | |
---|---|---|---|
Grid_map | |||
док |
Кинетический | Мелодичный | Ноэтический | |
---|---|---|---|
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 |
Пожалуйста, сообщайте об ошибках и запрашивайте функции, используя систему отслеживания проблем.