grid map学习笔记1之Ubuntu18.04+ROS-melodic编译安装grid_map栅格地图及示例运行

文章目录

  • [0 引言](#0 引言)
  • [1 安装依赖和编译](#1 安装依赖和编译)
    • [1.1 安装依赖](#1.1 安装依赖)
    • [1.2 下载编译](#1.2 下载编译)
  • [2 运行示例](#2 运行示例)
    • [2.1 simple_demo](#2.1 simple_demo)
    • [2.2 tutorial_demo](#2.2 tutorial_demo)
    • [2.3 iterators_demo](#2.3 iterators_demo)
    • [2.4 image_to_gridmap_demo](#2.4 image_to_gridmap_demo)
    • [2.5 grid_map_to_image_demo](#2.5 grid_map_to_image_demo)
    • [2.6 opencv_demo](#2.6 opencv_demo)
    • [2.7 resolution_change_demo](#2.7 resolution_change_demo)
    • [2.8 filters_demo](#2.8 filters_demo)
    • [2.9 interpolation_demo](#2.9 interpolation_demo)

0 引言

苏黎世的grid map是一种用于环境建图的算法,也称为Occupancy Grid Mapping(占据栅格地图)。该算法将环境划分为一系列正方形的栅格,每个栅格表示环境中的一个小区域。栅格的状态可以是占据(occupied)、自由(free)或未知(unknown),用于表示栅格内是否有障碍物或是否可以通过。在建图过程中,机器人通过传感器获取环境的信息,将该信息转换为栅格地图的形式,并利用栅格地图进行定位和路径规划等任务,具有较高的实时性和可扩展性。该算法已被广泛应用于机器人导航、自主驾驶等领域。

grid map包含多个子工程文件,以下是子工程的简要介绍:

  1. grid_map_core:包含grid map类的定义,实现了所有grid map的核心算法和数据结构。
  2. grid_map_ros:提供了与ROS(Robot Operating System)集成所需的功能和节点,包括地图的发布和订阅、转换等。
  3. grid_map_msgs:定义了ROS消息的格式,用于传输grid map的数据。
  4. grid_map_cv:提供了与OpenCV(Open Source Computer Vision Library)集成所需的功能,包括图像与grid map的转换、图像处理等。
  5. grid_map_visualization:提供了用于可视化grid map的工具和节点,包括rviz插件、Matlab接口等。
  6. grid_map_filters:提供了一些用于grid map滤波的函数和类,如高斯滤波、中值滤波、形态学滤波等。
  7. grid_map_loader:提供了用于从文件中加载grid map的函数和类,如从ROS bag文件中加载、从图片文件中加载等。

这些子工程提供了grid map库的核心功能和一些扩展功能,可以方便地与ROSOpenCV等其他库进行集成,使得grid map的应用更加方便和灵活。

👉 grid map github:https://github.com/ANYbotics/grid_map

·

本文系统环境:

  • Ubuntu18.04
  • ROS-melodic
  • OpenCV3.2.0
  • Eigen 3.3.4
  • PCL 1.8.1

1 安装依赖和编译

可以直接安装,但如果想进一步学习源码和实现原理,建议源码安装,以下是直接安装的命令:

bash 复制代码
# sudo apt-get install ros-$ROS_DISTRO-grid-map
sudo apt-get install ros-melodic-grid-map

1.1 安装依赖

grid_map_core 子工程仅取决于线性代数库eigen

bash 复制代码
sudo apt-get install libeigen3-dev

其他子工程主要依赖的有OpenCV, pcl等,OpenCV一般都装过了,这里仅贴出pcl的安装,本文是安装了pcl1.8大版本,可先下载pcl 1.8.1 版本(点击Source code(zip)

先安装pcl1.8.1所需的依赖库:

bash 复制代码
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文件夹中:

bash 复制代码
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

1.2 下载编译

为了最大限度地提高性能,请确保以发布(Release)模式构建:

bash 复制代码
cd catkin_grid_map/src
git clone https://github.com/anybotics/grid_map.git
cd ../
catkin_make -DCMAKE_BUILD_TYPE=Release

编译后出现如下costmap_2d库的错误:

bash 复制代码
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 库即可

bash 复制代码
sudo apt-get install ros-melodic-costmap-2d

编译又报了一个有关yaml-cpp 库的错误:

bash 复制代码
~/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)进行尝试:

cmake 复制代码
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,发现编译通过:

bash 复制代码
[ 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

2 运行示例

2.1 simple_demo

simple_demo演示了一个使用栅格地图库的简单示例。此ROS节点创建一个栅格地图,向其添加数据并发布它,可用RVIZ查看可视化结果,命令如下:

bash 复制代码
# source 激活grid_map环境
# 后面的演示就不再source
source ~/catkin_grid_map/devel/setup.bash
bash 复制代码
roslaunch grid_map_demos simple_demo.launch

启动后,如下所示在rviz中即可看到一张栅格地图:

2.2 tutorial_demo

tutorial_demogrid map库功能的扩展演示。命令如下:

bash 复制代码
roslaunch grid_map_demos tutorial_demo.launch

启动后,如下所示在rviz中即可看到一张栅格地图:

2.3 iterators_demo

iterators_demo展示grid map迭代器的用法,命令如下:

bash 复制代码
roslaunch grid_map_demos iterators_demo.launch

启动后,如下所示在rviz中即可看到一张动态迭代 的栅格地图:

2.4 image_to_gridmap_demo

image_to_gridmap_demo演示了如何将数据从图像转换为栅格地图,命令如下:

bash 复制代码
roslaunch grid_map_demos image_to_gridmap_demo.launch

启动后,如下所示在rviz中即可看到一张由图片转换的栅格地图:

2.5 grid_map_to_image_demo

grid_map_to_image_demo演示了如何将栅格地图保存到图像。命令如下,其中/grid_map是栅格地图的topic_file后面需要写要保存图像的路径和名字:

bash 复制代码
rosrun grid_map_demos grid_map_to_image_demo _grid_map_topic:=/grid_map _file:=/home/$USER/Desktop/grid_map_image.png

可以结合2.4等,保存栅格地图。

2.6 opencv_demo

opencv_demoOpenCV功能的帮助下演示了地图操作,命令如下:

bash 复制代码
roslaunch grid_map_demos opencv_demo.launch

启动后,如下所示在rviz中即可看到一张栅格地图:

2.7 resolution_change_demo

resolution_change_demo 显示如何在OpenCV图像缩放方法的帮助下更改栅格地图的分辨率,命令如下:

bash 复制代码
roslaunch grid_map_demos resolution_change_demo.launch

启动后,如下所示在rviz中即可看到一张栅格地图:

2.8 filters_demo

filters_demo使用一系列ROS过滤器来处理栅格地图。从地形图的高程开始,该演示使用多个过滤器展示如何计算表面正常,使用镶嵌物填充孔,平滑/模糊地图并使用数学表达式来检测边缘,计算粗糙度和遍历性。过滤器链设置在filters_demo_filter_chain.yaml文件中配置,启动命令:

bash 复制代码
roslaunch grid_map_demos filters_demo.launch

2.9 interpolation_demo

interpolation_demo 显示了结果表面上不同插值方法的结果,命令如下:

bash 复制代码
roslaunch grid_map_demos interpolation_demo.launch

启动后,如下所示在rviz中勾选两个 grid maptopic,即可看到一张在表面差值后的栅格地图:

用户可以在文件中使用不同的世界(表面)和不同的插值设置interpolation_demo.yaml.

可视化以绿色和黄色显示地面实况,插值结果以红色和紫色显示。

此外,该演示还计算最大和平均插值误差,以及单个插值查询所需的平均时间。

网格地图具有四种不同的插值方法(按照精度增加和复杂性增加的顺序):

  • NN - 最近邻(最快,但最不准确);
  • 线性- 线性插值;
  • 三次卷积- 分段三次插值。使用三次卷积算法实现;
  • Cubic - 三次插值(最慢,但最准确)。

至此,成功编译安装grid map栅格地图,并运行多个示例熟悉grid map.

Reference:

须知少时凌云志,曾许人间第一流。

⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔

相关推荐
我搞slam2 天前
Cartographer源码理解
算法·slam·cartographer
杀生丸学AI15 天前
【三维重建】近期进展(完善中)
3d·aigc·slam·三维重建·nerf·视觉大模型
WHAT81620 天前
【Orb-Slam3学习】 特征匹配函数的目的与分类
c++·人工智能·算法·slam
Chris·Bosh23 天前
intel RealSense D435i自制数据集跑SLAM
linux·slam
Johaden1 个月前
视觉SLAM ch3补充——在Linux中配置VScode以及CMakeLists如何添加Eigen库
linux·c++·ide·vscode·编辑器·slam
风与铃的约定1 个月前
2.2 视觉SLAM 实践:Eigen
c++·机器人·slam·视觉slam·eigen·机器人运动学
Johaden2 个月前
在C++程序中新建并使用库
linux·运维·服务器·c++·slam
WHAT8162 个月前
【视觉SLAM】 G2O库编写步骤介绍
算法·slam·g2o
百色彭于晏2 个月前
【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
开发语言·javascript·web3·区块链·eth·以太坊
什么都不会的小澎友2 个月前
(秋招复习)自动驾驶与机器人中的SLAM技术(一)
自动驾驶·秋招·slam