苏黎世的grid map
是一种用于环境建图的算法,也称为Occupancy Grid Mapping
(占据栅格地图)。该算法将环境划分为一系列正方形的栅格,每个栅格表示环境中的一个小区域。栅格的状态可以是占据(occupied
)、自由(free
)或未知(unknown
),用于表示栅格内是否有障碍物或是否可以通过。在建图过程中,机器人通过传感器获取环境的信息,将该信息转换为栅格地图的形式,并利用栅格地图进行定位和路径规划等任务,具有较高的实时性和可扩展性。该算法已被广泛应用于机器人导航、自主驾驶等领域。
grid map
包含多个子工程文件,以下是子工程的简要介绍:
grid_map_core
:包含grid map
类的定义,实现了所有grid map
的核心算法和数据结构。grid_map_ros
:提供了与ROS(Robot Operating System)
集成所需的功能和节点,包括地图的发布和订阅、转换等。grid_map_msgs
:定义了ROS
消息的格式,用于传输grid map
的数据。grid_map_cv
:提供了与OpenCV(Open Source Computer Vision Library)
集成所需的功能,包括图像与grid map
的转换、图像处理等。grid_map_visualization
:提供了用于可视化grid map
的工具和节点,包括rviz
插件、Matlab
接口等。grid_map_filters
:提供了一些用于grid map
滤波的函数和类,如高斯滤波、中值滤波、形态学滤波等。grid_map_loader
:提供了用于从文件中加载grid map
的函数和类,如从ROS bag
文件中加载、从图片文件中加载等。这些子工程提供了grid map
库的核心功能和一些扩展功能,可以方便地与ROS
、OpenCV
等其他库进行集成,使得grid map
的应用更加方便和灵活。
grid map github:https://github.com/ANYbotics/grid_map
·
本文系统环境:
可以直接安装,但如果想进一步学习源码和实现原理,建议源码安装,以下是直接安装的命令:
# sudo apt-get install ros-$ROS_DISTRO-grid-map
sudo apt-get install ros-melodic-grid-map
grid_map_core
子工程仅取决于线性代数库eigen
:
sudo apt-get install libeigen3-dev
其他子工程主要依赖的有OpenCV, pcl等,OpenCV一般都装过了,这里仅贴出pcl的安装,本文是安装了pcl1.8
大版本,可先下载 pcl 1.8.1
版本(点击Source code(zip)
先安装pcl1.8.1
所需的依赖库:
sudo apt-get update
sudo apt-get install git build-essential linux-libc-dev
sudo apt-get install cmake cmake-gui
sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
sudo apt-get install mpi-default-dev openmpi-bin openmpi-common
sudo apt-get install libflann1.9 libflann-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libboost-all-dev
sudo apt-get install libvtk7.1-qt libvtk7.1
sudo apt-get install libqhull* libgtest-dev
sudo apt-get install freeglut3-dev pkg-config
sudo apt-get install libxmu-dev libxi-dev
sudo apt-get install mono-complete
sudo apt-get install openjdk-8-jdk openjdk-8-jre
然后解压下载的pcl1.8.1
源码,并进入到pcl1.8.1
文件夹中:
mkdir build
cd build
cmake ..
make -j4
sudo make install
测试pcl是否安装成功的话,可用pcl_viewer xxx.pcd
:
如果没有pcd文件,可去点云库PCL(Point Cloud Library)的学习资源汇总下载rabbit.pcd
pcl_viewer rabbit.pcd
为了最大限度地提高性能,请确保以发布(Release
)模式构建:
cd catkin_grid_map/src
git clone https://github.com/anybotics/grid_map.git
cd ../
catkin_make -DCMAKE_BUILD_TYPE=Release
编译后出现如下costmap_2d
库的错误:
CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
Could not find a package configuration file provided by "costmap_2d" with
any of the following names:
costmap_2dConfig.cmake
costmap_2d-config.cmake
安装 costmap-2d
库即可
sudo apt-get install ros-melodic-costmap-2d
编译又报了一个有关yaml-cpp
库的错误:
~/catkin_grid_map/devel/lib/libgrid_map_pcl.so: undefined reference to `typeinfo for YAML::BadConversion'
~/catkin_grid_map/devel/lib/libgrid_map_pcl.so: undefined reference to `YAML::BadConversion::~BadConversion()'
~/catkin_grid_map/devel/lib/libgrid_map_pcl.so: undefined reference to `vtable for YAML::BadConversion'
grid_map/grid_map_pcl/CMakeFiles/grid_map_pcl_loader_node.dir/build.make:332: recipe for target '~/catkin_grid_map/devel/lib/grid_map_pcl/grid_map_pcl_loader_node' failed
应该是工程中yaml-cpp
库的问题,仔细检查后,只有grid_map_pcl
子工程目录的CMakelists.txt
需要用到yaml-cpp
,根据上述报错也是定位到该CMakelists.txt
,如下,增加find_package(yaml-cpp REQUIRED)
进行尝试:
set(CATKIN_PACKAGE_DEPENDENCIES
grid_map_core
grid_map_msgs
grid_map_ros
pcl_ros
roscpp
)
# 新增这行,使用系统安装的yaml-cpp 进行尝试
find_package(yaml-cpp REQUIRED)
find_package(OpenMP QUIET)
重新执行catkin_make -DCMAKE_BUILD_TYPE=Release
,发现编译通过:
[ 91%] Built target octomap_to_gridmap_demo
[ 92%] Built target filters_demo
[ 94%] Built target grid_map_to_image_demo
[ 95%] Built target iterators_demo
[ 98%] Built target grid_map_pcl
Consolidate compiler generated dependencies of target grid_map_pcl_loader_node
[100%] Linking CXX executable ~/catkin_grid_map/devel/lib/grid_map_pcl/grid_map_pcl_loader_node
[100%] Built target grid_map_pcl_loader_node
simple_demo
演示了一个使用栅格地图库的简单示例。此ROS
节点创建一个栅格地图,向其添加数据并发布它,可用RVIZ查看可视化结果,命令如下:
# source 激活grid_map环境
# 后面的演示就不再source
source ~/catkin_grid_map/devel/setup.bash
roslaunch grid_map_demos simple_demo.launch
启动后,如下所示在rviz
中即可看到一张栅格地图:
tutorial_demo
是grid map
库功能的扩展演示。命令如下:
roslaunch grid_map_demos tutorial_demo.launch
启动后,如下所示在rviz
中即可看到一张栅格地图:
iterators_demo
展示grid map
迭代器的用法,命令如下:
roslaunch grid_map_demos iterators_demo.launch
启动后,如下所示在rviz
中即可看到一张动态迭代的栅格地图:
image_to_gridmap_demo
演示了如何将数据从图像转换为栅格地图,命令如下:
roslaunch grid_map_demos image_to_gridmap_demo.launch
启动后,如下所示在rviz
中即可看到一张由图片转换的栅格地图:
grid_map_to_image_demo
演示了如何将栅格地图保存到图像。命令如下,其中/grid_map
是栅格地图的topic
,_file
后面需要写要保存图像的路径和名字:
rosrun grid_map_demos grid_map_to_image_demo _grid_map_topic:=/grid_map _file:=/home/$USER/Desktop/grid_map_image.png
可以结合2.4等,保存栅格地图。
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
interpolation_demo
显示了结果表面上不同插值方法的结果,命令如下:
roslaunch grid_map_demos interpolation_demo.launch
启动后,如下所示在rviz
中勾选两个 grid map
的topic
,即可看到一张在表面差值后的栅格地图:
用户可以在文件中使用不同的世界(表面)和不同的插值设置interpolation_demo.yaml
.
可视化以绿色和黄色显示地面实况,插值结果以红色和紫色显示。
此外,该演示还计算最大和平均插值误差,以及单个插值查询所需的平均时间。
网格地图具有四种不同的插值方法(按照精度增加和复杂性增加的顺序):
至此,成功编译安装grid map
栅格地图,并运行多个示例熟悉grid map
.
Reference:
⭐️