ros导航框架-代价地图

1、Costmap2DROS

Costmap2DROS是代价地图与其他ROS模块的接口类,move_base中使用的代价地图就是Costmap2DROS对象。
Costmap2DROS负责对代价地图进行更新,以及发布代价地图,我们在rviz上看到的代价地图就是在这个类中进行发布的。
Costmap2DROS中最重要的一个成员就是layered_costmap_。

protected:LayeredCostmap* layered_costmap_;

LayeredCostmap类的作用是对各层代价地图进行管理以及数据整合。
LayeredCostmap类有两个重要的成员:

std::vector<boost::shared_ptr<Layer> > plugins_;// 各层地图插件
Costmap2D costmap_;     // master layer   各层插件地图合并后的代价地图

Costmap2D类
重要成员:
unsigned char* costmap_ : costmap的每一个栅格的代价值。
主要功能:提供对代价地图的操作接口-读取信息,修改数据。

在Costmap2DROS的构造函数中,可以看到,

  publisher_ = new Costmap2DPublisher(&private_nh, layered_costmap_->getCostmap(), global_frame_, "costmap",always_send_full_costmap);

1.1 代价地图的更新

代价地图的更新调用链:
Costmap2DROS::mapUpdateLoop(double frequency)->Costmap2DROS::updateMap()->void LayeredCostmap::updateMap(double robot_x, double robot_y, double robot_yaw)
可见最终进入到LayeredCostmap类中的updateMap函数。
void LayeredCostmap::updateMap(double robot_x, double robot_y, double robot_yaw)
1、根据机器人的位置对costmap_进行移动
2、遍历所有的插件地图 调用 updateBounds()
3、遍历所有的插件地图 调用 updateCosts()
将各层代价地图的代价值整合到costmap_上,costmap_就是master layer.

2、 obstacle_layer

障碍物层对应的类是ObstacleLayer,CostmapLayer的子类,通过读取各个传感器的观测数据进行更新,所使用的传感器可以在yaml参数文件中自行设置。
地图数据保存在哪? ObstacleLayer继承了CostmapLayer的父类,而CostmapLayer类又继承Layer类和Costmap2D类,因此ObstacleLayer的地图数据保存在继承于Costmap2D类的costmap_。
构造函数
对所使用传感器进行遍历,并一一构造ObservationBuffer放入observation_buffers_,

std::vector<boost::shared_ptr<costmap_2d::ObservationBuffer> > observation_buffers_;     // 保存所使用的传感器的观测buffer

costmap_2d::ObservationBuffer类中有一个重要成员-observation_list_,它会按照时序保存历史的观测数据,

std::list<Observation> observation_list_;

那么也有个函数void purgeStaleObservations() 负责对旧数据进行清理,成员变量observation_keep_time_用来决定数据保留的时间,早于这个时间的数据被丢弃。observation_keep_time_这个变量可以在我们的yaml参数文件中进行配置,一般设为0。

接着将该传感器的观测buffer,设置到marking_buffers_(用于在障碍物层地图山标记障碍),以及设置到clearing_buffers_(用于清除障碍物标记)。比如,我们一共使用激光雷达和超声波传感器来更新障碍物层,那么marking_buffers_和clearing_buffers_中就会有激光雷达和超声波这两个传感器的观测buffer。

   // marking_buffers_ 保存了每个传感器的ObservationBufferif (marking)marking_buffers_.push_back(observation_buffers_.back());   // check if we'll also add this buffer to our clearing observation buffers// clearing_buffers_ 保存了每个传感器的ObservationBufferif (clearing)clearing_buffers_.push_back(observation_buffers_.back());

最后就是设置读取相应传感器的回调函数。

2.x updateBounds

1、跟随机器人的位置移动地图。
2、根据观测数据更新自由空间

  // raytrace freespacefor (unsigned int i = 0; i < clearing_observations.size(); ++i){raytraceFreespace(clearing_observations[i], min_x, min_y, max_x, max_y);}

3、根据观测到的障碍信息,对costmap_进行更新。

2.x updateCosts

void ObstacleLayer::updateCosts(costmap_2d::Costmap2D& master_grid, int min_i, int min_j, int max_i, int max_j)

将当前层的代价数据更新到master_grid。从前面可以知道,这里传入到master_grid的是LayeredCostmap类的costmap_,也就是将该障碍物层的代价数据更新到LayeredCostmap类的costmap_上。
更新可采用两种方式-updateWithOverwrite和updateWithMax

void CostmapLayer::updateWithOverwrite(costmap_2d::Costmap2D& master_grid, int min_i, int min_j, int max_i, int max_j)
用当前层的代价数据直接覆盖master_grid的数据。

void CostmapLayer::updateWithAddition(costmap_2d::Costmap2D& master_grid, int min_i, int min_j, int max_i, int max_j)
叠加模式。

3、static_layer

静态层对应的类是StaticLayer, 同样是CostmapLayer的子类,因此,代价地图数据保存在继承于Costmap2D类的costmap_。

3.1 数据订阅

在构造函数中可见,map_sub_ = g_nh.subscribe(map_topic, 1, &StaticLayer::incomingMap, this);
订阅的话题是map_topic,数据类型StaticLayer::incomingMap, 回调函数StaticLayer::incomingMap,在回调函数中,将新接收到的静态栅格地图赋值给costmap_。

3.2 updateBounds

这里就是更新了一下地图的边界信息。

3.3 updateCosts

将当前层的代价地图数据costmap_更新到master layer上。

4、inflation_layer

膨胀层InflationLayer不订阅任何数据,要膨胀的地图通过引用传递给updateCosts的master_grid形参即可,

void InflationLayer::updateCosts(costmap_2d::Costmap2D& master_grid, int min_i, int min_j, int max_i, int max_j)

在LayeredCostmap::updateMap中,会将costmap_传入InflationLayer::updateCosts,而costmap_为之前各层插件地图的叠加。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/4840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM - 大语言模型(LLM) 的 评估体系

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/138160155 大语言模型(LLM)的评估是复杂且多维的过程,涉及多个方面,包括评估体系、评估方法、评估实践。评估体系包括评估数据集、模型输出、样本/输出变换…

头条系统-01-环境搭建、SpringCloud微服务(注册发现、服务调用、网关)

文章目录 环境搭建、SpringCloud微服务(注册发现、服务调用、网关)1)项目介绍2)项目概述2.1)学习到的技术内容2.2)项目课程大纲2.3)项目概述2.4)项目术语2.5)业务说明 3)技术栈4)nacos环境搭建4.1)虚拟机镜像准备注&#xff1a; 4.2)nacos安装 5)初始工程搭建5.1)环境准备连接G…

工业相机分类

工业相机分类 按芯片类型CCD(电荷耦合器件)相机CMOS(互补金属氧化物半导体)相机按传感器结构特征线阵相机面阵相机按扫描方式隔行扫描逐行扫描按分辨率大小普通分辨率高分辨率按输出信号模拟相机数字相机按输出色彩黑白相机彩色相机按输出数据速度普通高速相机高速相机按响应频…

org.yaml.snakeyaml.scanner.ScannerException: while scanning a simple key 。。。

控制台信息&#xff1a; 这个信息一般是yml文件配置出现了问题&#xff0c;如 出现非法数据 、缩进有问题等 问题地方如下&#xff0c;修改一下就好了 控制台一般报的这种错就是配置文件的格式不正确

【 深度可分离卷积】

深度可分离卷积 深度可分离卷积&#xff08;Depthwise Separable Convolution&#xff09;是一种在卷积神经网络中减少计算量和参数数量的技术。这种技术将标准的卷积操作分解为两个更简单的操作&#xff1a;逐通道卷积&#xff08;Depthwise Convolution&#xff09;和逐点卷…

C++初阶-----对运算符重载的进一步理解(2)

目录 1.对于加加&#xff0c;减减运算符的重载理解 2.const修饰的一些事情 3.日期对象之间的减法实现逻辑 1.对于加加&#xff0c;减减运算符的重载理解 &#xff08;1&#xff09;在C语言里面&#xff0c;我们已经知道并且了解加加&#xff0c;减减的一些基本的用法&#…

QT学习之QFileDialog

打开一个文件夹 m_dirXML QFileDialog::getExistingDirectory(this, tr("打开XML所在文件夹"), "D:/", QFileDialog::ShowDirsOnly|QFileDialog::DontResolveSymlinks); ui.xmlDri->setText(m_dirXML);选择一个文件&#xff1a; scriptPath QFileDia…

【软件开发规范篇】JAVA后端开发编码命名规范

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

HTML+CSS:构建网站不可不知的18个模块!

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具…

【python】调整图像大小_自定义调整、等高宽调整

【python】调整图像大小_自定义调整、等高宽调整 【先赞后看养成习惯】求点赞+关注+收藏😀 文章目录 【python】调整图像大小_自定义调整、等高宽调整1、安装 Pillow 库:2、加载图像:3、使用 resize 方法调整图像大小:4、保持图像宽高比:5、保存调整大小后的图像:在Py…

virtualbox 网络设置实现主机和虚拟机互相访问

前言 一般来说&#xff0c;virtualbox 虚拟机的上网模式是 NAT。这样虚拟机可以上网并访问宿主机&#xff0c;但宿主机无法访问虚拟机&#xff0c;也无法 ping 通。下面介绍双网卡模式&#xff0c;实现虚拟机和宿主机能够互相访问 ping 通。 双网卡模式 进入虚拟机的网络设置…

贪心算法在找零问题中的应用

贪心算法在找零问题中的应用 引言a. 贪心算法求解找零问题算法设计算法证明 b. 硬币面额为c的幂时的贪心算法证明算法设计算法证明 c. 设计使贪心算法失效的硬币面额组合d. 通用找零算法设计算法设计算法实现&#xff08;伪代码&#xff09;算法实现&#xff08;C代码&#xff…

基于SpringBoot和PostGIS的各省与地级市空间距离分析

目录 前言 一、PostGIS时空库 1、时空表设计 2、空间数据管理与查询 二、后台接口设计 1、ORM层设计与实现 2、业务层设计与实现 3、控制层设计 三、web可视化设计与实现 1、省份范围展示 2、城市距离可视化 3、成果展示 总结 前言 在上一篇博客中基于Java和GDAL实…

光伏电站信息化管理系统有哪些?

随着科学技术的进步&#xff0c;信息化管理系统在企业中得到广泛应用&#xff0c;光伏企业亦是如此&#xff0c;标志着光伏企业的管理现代化水平和信息化水平。光伏电站信息化管理系统有哪些&#xff1f; 一、鹧鸪云光伏业务管理专家 是一款覆盖光伏项目全流程的管理平台&…

Flutter:继承接口类,并将多个子类实例化

接口类 abstract class Animal {late String name;void eat() {} }子类 class Dog implements Animal{overridevoid eat() {print("Dog eat");}overridelate String name; }class Cat implements Animal{overridevoid eat() {print("cat eat");}override…

充电桩选型对比:ESP32-S3模组和ESP32-C3模组谁更合适

随着新能源电车的普及&#xff0c;全国各地和海外都开始加紧安装充电桩&#xff0c;运城到2025年年底,实现充电桩城镇居住小区全覆盖&#xff0c;截至今年3月底,泉州市新增充电桩居民报装1.68万户。 启明云端是国内领先的物联网通讯产品和整体解决方案供应商&#xff0c;有非常…

全面监控支撑业务系统的IT软硬件,确保企业信息化稳健运行

在当今高度信息化的时代&#xff0c;企业信息化业务系统的稳定运行显得尤为重要。为了确保信息化业务系统的连续性和高效性&#xff0c;企业需要对这些系统的关键组件进行实时监控和管理。监控易产品&#xff0c;以其强大的信息化业务系统管理与监控功能&#xff0c;为企业提供…

Gromacs——教程学习(6)

谈谈怎么判断分子动力学模拟是否达到了平衡 在计算RMSD之前必须先通过最小二乘法将各帧结构相对于参考结构进行最大程度叠合&#xff0c;从而消除体系的整体运动而令RMSD只体现生物分子内部结构的变化&#xff0c;这称为align或者least squares fit。 需要注意的是&#xff0…

国产Sora诞生!清华团队发布Vidu大模型,可直接生成16秒视频

大模型之争已从单模态转向多模态。 4月27日&#xff0c;在2024中关村论坛年会未来人工智能先锋论坛上&#xff0c;清华大学联合北京生数科技有限公司正式发布了文生视频大模型——Vidu。 在会议上&#xff0c;清华大学人工智能研究院副院长、生数科技首席科学家朱军对外展示了…

stack,queue的模拟实现以及优先级队列

这篇博客用来记录stack&#xff0c;queue的学习。 stack的模拟实现 stack的模拟实现比较简单&#xff0c;先上代码 #pragma once #include<vector> #include<list> #include<deque> #include<iostream> using std::deque; using namespace std;name…