这是一个带有 ROS 接口的 C++ 库,用于管理具有多个数据层的二维网格地图。它专为移动机器人测绘而设计,用于存储高程、方差、颜色、摩擦系数、立足点质量、表面法线、可遍历性等数据。它用于专为崎岖地形导航而设计的以机器人为中心的高程测绘包。
特征:
这是研究代码,预计它会经常更改,并且否认对特定目的的任何适用性。
源代码根据 BSD 3-Clause 许可证发布。
作者:彼得·范考瑟
隶属关系:ANYbotics
维护者:Maximilian Wulf,[email protected],Magnus Gärtner,[email protected]
贡献者: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扎利迪斯
该项目最初是在苏黎世联邦理工学院(自主系统实验室和机器人系统实验室)开发的。
这项工作是 ANYmal Research 的一部分,ANYmal Research 是一个推进腿式机器人技术的社区。
如果您在学术背景下使用这项工作,请引用以下出版物:
P. Fankhauser 和 M. Hutter, “通用网格地图库:粗糙地形导航的实现和用例” ,《机器人操作系统 (ROS) – 完整参考》(第 1 卷),A. Koubaa(编辑),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,则将向后移植。
本书章节介绍了网格地图库,包括教程。
C++ API 记录如下:
要像 Debian 软件包一样安装网格地图库中的所有软件包
sudo apt-get install ros-$ROS_DISTRO-grid-map
grid_map_core包仅依赖于线性代数库 Eigen。
sudo apt-get install libeigen3-dev
其他软件包还依赖于 ROS 标准安装( roscpp 、 tf 、 filters 、 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
为了最大限度地提高性能,请确保在发布模式下构建。您可以通过设置指定构建类型
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
如果您使用柔荑花工具。
grid_map_demos包包含几个演示节点。使用此代码来验证网格地图包的安装并让您开始自己使用该库。
simple_demo演示了使用网格地图库的简单示例。该 ROS 节点创建网格地图、向其中添加数据并发布它。要在 RViz 中查看结果,请执行命令
roslaunch grid_map_demos simple_demo.launch
tutorial_demo是库功能的扩展演示。启动tutorial_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
resolution_change_demo展示了如何借助 OpenCV 图像缩放方法来更改网格图的分辨率。查看结果,使用
roslaunch grid_map_demos resolution_change_demo.launch
filters_demo使用 ROS 过滤器链来处理网格地图。从地形图的高程开始,演示使用多个过滤器来展示如何计算表面法线、使用修复来填充孔、平滑/模糊地图以及使用数学表达式来检测边缘、计算粗糙度和可遍历性。过滤器链设置在filters_demo_filter_chain.yaml
文件中配置。启动演示
roslaunch grid_map_demos filters_demo.launch
有关网格地图过滤器的更多信息,请参阅 grid_map_filters。
interpolation_demo显示了结果表面上不同插值方法的结果。启动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节点中找到有关如何使用不同迭代器的更多示例。
注意:为了在使用迭代器时获得最大效率,建议在for
循环之外使用grid_map::Matrix& data = map["layer"]
在本地存储对网格图数据层的直接访问:
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;
}
您可以在grid_map_demos
包的iterator_benchmark
节点中找到迭代器性能的基准测试,该节点可以使用以下命令运行
rosrun grid_map_demos iterator_benchmark
请注意,虽然迭代器很方便,但使用内置 Eigen 方法通常是最干净、最有效的。以下是一些示例:
为图层的所有单元格设置常量值:
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 插件将网格地图层可视化为 3D 曲面图(高度图)。可以选择单独的层作为颜色信息的层。
该软件包提供了一种有效的算法,可将高程图转换为密集的 3D 有符号距离场。 3D 网格中的每个点都包含到地图中最近点的距离以及梯度。
该节点订阅 grid_map_msgs/GridMap 类型的主题并发布可在 RViz 中可视化的消息。可视化工具发布的主题可以使用 YAML 参数文件进行完全配置。可以添加任意数量的具有不同参数的可视化。这里有一个教程演示配置文件的示例。
点云 | 向量 | 占用网格 | 网格单元 |
---|---|---|---|
grid_map_topic
(字符串,默认值:“/grid_map”)
要可视化的网格地图主题的名称。请参阅下面有关可视化工具的描述。
/grid_map
(grid_map_msgs/GridMap)
要可视化的网格图。
发布的主题使用YAML参数文件进行配置。可能的主题有:
point_cloud
(传感器消息/PointCloud2)
将网格图显示为点云。使用layer
参数选择要转换为点的图层。
name: elevation
type: point_cloud
params:
layer: elevation
flat: false # optional
flat_point_cloud
(sensor_msgs/PointCloud2)
将网格图显示为“平面”点云,即所有点都处于相同高度z 。借助Color Transformer
可以方便地在 RViz 中可视化 2D 地图或图像(甚至视频流)。参数height
决定了平面点云所需的z位置。
name: flat_grid
type: flat_point_cloud
params:
height: 0.0
注意:为了从空/无效单元格中省略平面点云中的点,请指定应使用setBasicLayers(...)
检查有效性的图层。
vectors
(visualization_msgs/标记)
将网格地图的矢量数据可视化为视觉标记。使用layer_prefix
参数指定保存向量的x 、 y和z分量的层。参数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/占用网格)
将网格地图的图层可视化为占用网格。使用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
(可视化消息/标记)
显示网格地图的边界。
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 插件机制编写并提供其他过滤器,例如grid_map_cv
包中的InpaintFilter
。
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_costmap_2d | |||
网格地图CV | |||
网格地图演示 | |||
网格地图过滤器 | |||
网格地图加载器 | |||
网格地图消息 | |||
grid_map_octomap | |||
网格地图pcl | |||
网格地图ros | |||
grid_map_rviz_plugin | |||
网格地图sdf | |||
网格地图可视化 |
请使用问题跟踪器报告错误并请求功能。