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包含多个子工程文件,以下是子工程的简要介绍:
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
·
本文系统环境:
- 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_demo是grid 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_demo在OpenCV功能的帮助下演示了地图操作,命令如下:
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 map 的topic,即可看到一张在表面差值后的栅格地图:

用户可以在文件中使用不同的世界(表面)和不同的插值设置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栅格地图及示例运行
文章目录 0 引言1 安装依赖和编译1.1 安装依赖1.2 下载编译 2 运行示例2.1 simple_demo2.2 tutorial_demo2.3 iterators_demo2.4 image_to_gridmap_demo2.5 grid_map_to_image_demo2.6 opencv_demo2.7 resolution_change_demo2.8 filters_demo2.9 interpolation_demo 0 引言 苏…...
postgres wal2json插件jsonb字段数据丢失问题解决
使用pgwal2jsondebezium进行数据同步时,发现偶尔会有jsonb字段数据丢失的问题 进行测试时发现: 1、发生数据丢失的jsonb字段长度都比较大(超过toast阈值,使用toast表存储) 2、针对发生jsonb字段丢失的数据,jsonb字段本身未发生修…...
华为eNSP:路由引入
一、拓扑图 二、路由器的配置 1、配置路由器的IP AR1: [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei-GigabitEthernet0/0/0]qu AR2: [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.2 24 [Huaw…...
Retrospectives on the Embodied AI Workshop(嵌入式人工智能研讨会回顾) 论文阅读
论文信息 题目:Retrospectives on the Embodied AI Workshop 作者:Matt Deitke, Dhruv Batra, Yonatan Bisk 来源:arXiv 论文地址:https://arxiv.org/pdf/2210.06849 Abstract 我们的分析重点关注 CVPR Embodied AI Workshop 上…...
「JVM」Full GC和Minor GC、Major GC
Full GC和Minor GC、Major GC 一、Full GC1、什么是Full GC?2、什么情况下会触发full gc? 二、Minor GC1、什么是Minor GC?2、什么情况下会触发Minor GC? 三、Major GC1、什么是Major GC?2、什么情况下会触发Major GC?…...
Asp.Net MVC 使用Log4Net
Asp.Net MVC 使用Log4Net 在 ASP.NET MVC 中使用 Log4net 需要进行一些配置和代码集成。下面是在 ASP.NET MVC 中使用 Log4net 的步骤: 1. 安装 Log4net NuGet 包 打开 NuGet 包管理器控制台,并运行以下命令来安装 Log4net: Install-Pack…...
[元带你学: eMMC协议 29] eMMC 断电通知(PON) | 手机平板电脑断电通知
依JEDEC eMMC及经验辛苦整理,原创保护,禁止转载。 专栏 《元带你学:eMMC协议》 内容摘要 全文 2000 字, 主要内容 前言 断电通知是什么? 断电通知过程...
vue使用recorder-core.js实现录音功能
下载组件 npm install recorder-core封装方法 record.ts //必须引入的核心 import Recorder from recorder-core;//引入mp3格式支持文件;如果需要多个格式支持,把这些格式的编码引擎js文件放到后面统统引入进来即可 import recorder-core/src/engine/…...
ThinkPHP8知识详解:给PHP8和MySQL8添加到环境变量
在PHPenv安装的时候,环境变量默认的PHP版本是7.4的,MySQL的版本是5.7的,要想使用ThinkPHP8来开发,就必须修改环境变量,本文就详细讲解了如果修改PHP和MySQL的环境变量。 1、添加网站 启动phpenv,网站&…...
UE使用UnLua(二)
1.前言 最近也是比较忙,忘了来更新了,好多都是开了头断更的(狗头),今天抽空再更一篇!! 这篇讲一下在UnLua中覆盖蓝图事件(函数),及按钮、文本控件的一些使用…...
Appium+python自动化(二十五)-获取控件ID(超详解)
简介 在前边的第二十二篇文章里,已经分享了通过获取控件的坐标点来获取点击事件的所需要的点击位置,那么还有没有其他方法来获取控件点击事件所需要的点击位置呢?答案是:Yes!因为在不同的大小屏幕的手机上获取控件的坐…...
SDWAN组网的九大应用场景
SD-WAN(软件定义广域网)是一种新兴的网络技术,它可以优化和管理企业广域网(WAN)的数据传输,提供更加高效、灵活和安全的网络连接。SD-WAN的出现极大地改变了传统WAN的组网方式,为企业提供了更多…...
el-date-picker时间范围只能选五分钟之内
el-date-picker时间范围只能选五分钟之内 一、主要代码 一、主要代码 <el-date-pickertype"datetime"size"small"value-format"yyyy-MM-dd HH:mm:ss"v-model"searchData.submitTimeCode":editable"false"placeholder&qu…...
大数据分析案例-基于LightGBM算法构建乳腺癌分类预测模型
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
Java中的io流
File文件类 1.访问文件名相关的方法 String getName():返回此File对象所表示的文件名或路径名(如果是路径,则返回最后一级子路径名)。 String getPath():返回此File对象所对应的路径名。File getAbsoluteFile():返回此 File对象的绝对路径。 String getA…...
23 自定义控件
案例:组合Spin Box和Horizontal Slider实现联动 新建Qt设计师界面: 选择Widget: 选择类名(生成.h、.cpp、.ui文件) 在smallWidget.ui中使用Spin Box和Horizontal Slider控件 可以自定义数字区间: 在主窗口w…...
从原理到实践,分析 Redisson 分布式锁的实现方案(二)
上篇讲解了如何用 Redis 实现分布式锁的方案,它提供了简单的原语来实现基于Redis的分布式锁。然而,Redis作为分布式锁的实现方式也存在一些缺点。本文将引入Redisson来实现分布式锁。 一、Redisson是什么 Redisson是一个基于Redis的分布式Java框架。它提…...
QT【day3】
思维导图: 闹钟: //widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimerEvent> #include<QTimer> #include<QTime> //时间类 #include<QPushButton> //按钮类头文件 #include<QDebug&…...
模版模式和策略模式的区别
前言 模版模式和策略模式在日常开发中经常遇到,这两个设计模式有啥区别,这里简单总结下。 模版模式简单demo // 抽象模板类 abstract class AbstractClass {// 模板方法定义了算法的骨架public void templateMethod() {// 执行固定的步骤step1();step…...
Github搭建个人博客全攻略
Github搭建个人博客全攻略 一、Github二、配置博客仓库三、配置Git用户SSH密钥四、Deploy Key or Token方法一: Deploy Key方法二: Token 五、Hexo六、 主题七、 发布博文八、参考链接 一、Github Github是开发者的代码仓库,一个开源和分享社…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
