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

本文主要是介绍grid map算法1之Ubuntu18.04+ROS-melodic编译安装grid_map栅格地图及示例运行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 0 引言
  • 1 安装依赖和编译
    • 1.1 安装依赖
    • 1.2 下载编译
  • 2 运行示例
    • 2.1 simple_demo
    • 2.2 tutorial_demo
    • 2.3 iterators_demo
    • 2.4 image_to_gridmap_demo
    • 2.5 grid_map_to_image_demo
    • 2.6 opencv_demo
    • 2.7 resolution_change_demo
    • 2.8 filters_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 安装依赖和编译

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

# sudo apt-get install ros-$ROS_DISTRO-grid-map
sudo apt-get install ros-melodic-grid-map

1.1 安装依赖

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

请添加图片描述

1.2 下载编译

为了最大限度地提高性能,请确保以发布(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" withany of the following names:costmap_2dConfig.cmakecostmap_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_DEPENDENCIESgrid_map_coregrid_map_msgsgrid_map_rospcl_rosroscpp
)# 新增这行,使用系统安装的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

2 运行示例

2.1 simple_demo

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

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

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

请添加图片描述

2.2 tutorial_demo

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

roslaunch grid_map_demos tutorial_demo.launch

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

请添加图片描述

2.3 iterators_demo

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

roslaunch grid_map_demos iterators_demo.launch

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

2.4 image_to_gridmap_demo

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

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后面需要写要保存图像的路径和名字:

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功能的帮助下演示了地图操作,命令如下:

roslaunch grid_map_demos opencv_demo.launch

启动后,如下所示在rviz中即可看到一张栅格地图:
请添加图片描述

2.7 resolution_change_demo

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

roslaunch grid_map_demos resolution_change_demo.launch

启动后,如下所示在rviz中即可看到一张栅格地图:
请添加图片描述

2.8 filters_demo

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

roslaunch grid_map_demos filters_demo.launch

2.9 interpolation_demo

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

roslaunch grid_map_demos interpolation_demo.launch

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

请添加图片描述
用户可以在文件中使用不同的世界(表面)和不同的插值设置interpolation_demo.yaml.
可视化以绿色和黄色显示地面实况,插值结果以红色和紫色显示。
此外,该演示还计算最大和平均插值误差,以及单个插值查询所需的平均时间。

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

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

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


Reference:

  • https://github.com/anybotics/grid_map



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



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

这篇关于grid map算法1之Ubuntu18.04+ROS-melodic编译安装grid_map栅格地图及示例运行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/163690

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.