ros导航框架-代价地图

2024-04-29 21:12
文章标签 框架 地图 ros 导航 代价

本文主要是介绍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_为之前各层插件地图的叠加。

这篇关于ros导航框架-代价地图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

Yii框架relations的使用

通过在 relations() 中声明这些相关对象,我们就可以利用强大的 Relational ActiveRecord (RAR) 功能来访问资讯的相关对象,例如它的作者和评论。不需要自己写复杂的 SQL JOIN 语句。 前提条件 在组织数据库时,需要使用主键与外键约束才能使用ActiveReocrd的关系操作; 场景 申明关系 两张表之间的关系无非三种:一对多;一对一;多对多; 在