ROS机器人启动move base时代价地图概率性无法加载的原因及解决方法
最近,使用ROS机器人,在启动move_base 节点时,概率性会出现全局和局部代价地图不加载的问题,此时,发布目标点也无法启动路径规划。而且该问题有时候出现概率很低,比如启动10次,会有1次发送该情况,有时候概率又比较高,运气最差的一次,启动了8次才正常启动。
上图中,是正常情况下,rviz显示的局部代价地图,在确保rviz已经配置了显示局部代价地图后,上述异常情况下,该局部代价地图不会显示。此时,rviz的局部代价地图的map配置中会显示No map received,通过rostopic echo在终端打印局部代价地图信息,会发现该消息没有被发布出来。
在比赛过程中,若遇到这个问题,纯纯搞心态,初赛中,8分钟的比赛时间,卡在代价地图无法正常加载浪费了至少1分钟,所以还是下定决心要刨根问底,解决这个隐患。
为了找到异常启动 move_base 节点时程序是否卡在了某个地方,从而导致代价地图没有加载出来,我先后在move_base、costmap_2d、global_planner功能包的初始化函数(构造函数)以及调用的相关函数编写打印了大量的流程运行信息,用来分析程序卡在了什么地方。


–
经过层层套娃式深入探究和分析,最终确定上述异常的代价地图为正常加载是卡在了位于move_base构造函数中调用的以下函数中
planner_costmap_ros_->start();
planner_costmap_ros_中的start()函数具体程序位于costmap_2d_ros.cpp中,我添加了标志信息后的程序如下所示:
void Costmap2DROS::start()
{ROS_INFO("c1");std::vector < boost::shared_ptr<Layer> > *plugins = layered_costmap_->getPlugins();ROS_INFO("c2");// check if we're stopped or just pausedif (stopped_){// if we're stopped we need to re-subscribe to topicsfor (vector<boost::shared_ptr<Layer> >::iterator plugin = plugins->begin(); plugin != plugins->end();++plugin){(*plugin)->activate();}stopped_ = false;}stop_updates_ = false;ROS_INFO("c3");// block until the costmap is re-initialized.. meaning one update cycle has runros::Rate r(100.0);ROS_INFO("initialized_: %d", initialized_);while (ros::ok() && !initialized_)r.sleep();ROS_INFO("c4");
}
上述异常导致此处调用start函数时的initialized_值为0,从而卡在了start函数的while循环中,从而使得move_base中planner_costmap_ros_->start()语句后的初始化部分未能执行,从而导致代价地图未能加载。
正常情况下,调用start函数时initialized_值为1。后来我深入探究了为什么有时候程序运行到planner_costmap_ros_->start()语句时,initialized_值为1(正常情况),有时候initialized_值为0(异常情况)。
经过层层套娃式分析,最终锁定到了costmap_2d_ros.cpp中的void Costmap2DROS::updateMap()函数中的layered_costmap_->updateMap(x, y, yaw);函数中
void Costmap2DROS::updateMap()
{ROS_INFO("true 490");if (!stop_updates_){ROS_INFO("true 495");// get global posegeometry_msgs::PoseStamped pose;if (getRobotPose (pose)){double x = pose.pose.position.x,y = pose.pose.position.y,yaw = tf2::getYaw(pose.pose.orientation);ROS_INFO("up1");layered_costmap_->updateMap(x, y, yaw);ROS_INFO("up2");geometry_msgs::PolygonStamped footprint;footprint.header.frame_id = global_frame_;footprint.header.stamp = ros::Time::now();ROS_INFO("up3");transformFootprint(x, y, yaw, padded_footprint_, footprint);ROS_INFO("up4");footprint_pub_.publish(footprint);ROS_INFO("up5");initialized_ = true;ROS_INFO("true 505");}}
}
根本原因是正常情况下和异常情况下layered_costmap的updateMap(x, y, yaw)函数执行速度不同,导致了这个将initialized_值置为1的线程与另一个通过planner_costmap_ros_->pause()将initialized_值置为0的线程在正常和异常情况下的执行顺序不同,正常情况下另一个将initialized_值置为0的线程先执行,然后将其值置为1的线程后执行,异常情况下则相反,此时导致本线程程序卡在start函数,而不能正常运行。
至于该问题的解决方法,我编写了一个Costmap2DROS类的成员函数force_start(),在该函数中将initialized_的值强制置为1。然后在move_base.cpp文件中执行planner_costmap_ros_->start();之前,先执行该planner_costmap_ros_->force_start();语句,将initialized_的值强制置为1,此时,便不会出现上述程序卡在start()函数的情况。
planner_costmap_ros_->force_start();
添加在costmap_2d_ros.cpp文件中的force_start()函数的具体程序如下:
void Costmap2DROS::force_start()
{initialized_ = true;ROS_INFO("initialized_ force_start");}
添加在costmap_2d_ros.h文件中Costmap2DROS类中的force_start()函数的声明如下:
/*** @brief initialized_ force_start*/void force_start();
至此,经过以上修改,在启动move_base 节点时,概率性会出现全局和局部代价地图不加载的问题,就可以得到解决。
相关文章:
ROS机器人启动move base时代价地图概率性无法加载的原因及解决方法
最近,使用ROS机器人,在启动move_base 节点时,概率性会出现全局和局部代价地图不加载的问题,此时,发布目标点也无法启动路径规划。而且该问题有时候出现概率很低,比如启动10次,会有1次发送该情况…...
快速上手PyCharm指南
PyCharm简介 PyCharm是一种Python IDE(Integrated Development Environment,集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动…...
数字图像处理 - 图像处理结合机器学习的应用示例
在本文中,特别关注树叶分类机器学习技术的实现。我们的目标是演示如何利用机器学习算法来分析一系列叶子照片,从而实现准确分类并提供对植物领域有价值的算法。 图像处理中机器学习的本质 机器学习使计算机能够学习模式并根据视觉数据进行预测,彻底改变了图像处理领域。在叶…...
Linux命令200例:zip和unzip用于压缩和解压文件(常用)
🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…...
通过 HttpClient 发送请求
文章目录 1. 引入 maven 依赖2. 发送 GET 方式的请求3. 发送 POST 方式的请求 1. 引入 maven 依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId> </dependency>2. 发送 GET 方式的请求…...
管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——假言——第二节 必要条件假言+第三节 特殊假言
文章目录 第二节 必要条件假言命题-才真题(2018-26)-假言-必要假言-才-(1)建模-“才”-后推前。-(2)A→B的公式化转换-A→B的等价命题:①逆否命题:非B→非A。真题(2020-26)-假言-必要假言-才-(1)建模-“才”-后推前。-(2)A→B的公式化转换-A→B的等价命题:①逆…...
算法笔记:A*算法
A*算法是一种很常用的路径查找和图形遍历算法。它有较好的性能和准确度 1 中心思路 A*算法通过下面这个函数来计算每个节点n的优先级 f(n)g(n)h(n) f(n)是节点n的综合优先级。当选择下一个要遍历的节点时,总会选取综合优先级最高(f(n)值最小࿰…...
postgresql 分类排名
postgresql 分类排名 排名窗口函数示例CUME_DIST 和 NTILE 排名窗口函数 排名窗口函数用于对数据进行分组排名。常见的排名窗口函数包括: • ROW_NUMBER,为分区中的每行数据分配一个序列号,序列号从 1 开始分配。 • RANK,计算每…...
TCP服务器实现—多进程版,多线程版,线程池版
目录 前言 1.存在的问题 2.多进程版 3.多线程版 4.线程池版 总结 前言 在上一篇文章中使用TCP协议实现了一个简单的服务器,可以用来服务端和客户端通信,但是之前的服务器存在一个问题,就是当有多个客户端连接服务器的时候,服…...
Nginx 配置文件的完整指南 (二)
文章目录 四、反向代理配置4.1 proxy_pass效果1—路径重写效果2—转发到其他服务器 4.2 proxy_pass使用规则4.3 proxy_set_header4.3.1 修改请求协议 五、负载均衡配置5.1 upstream5.2 server5.3 负载均衡策略5.3.1 轮询5.3.2 加权轮询5.3.3 最少连接5.3.3 ip_hash:…...
AI夏令营第三期 - 基于论文摘要的文本分类与关键词抽取挑战赛笔记
赛题:基于论文摘要的文本分类与关键词抽取 背景:高效的从海量医学文献中提取疾病诊断和治疗关键信息 任务:通过论文摘要判断论文是否为医学文献 样例 数据集:csv文件,字段:标题、作者、摘要、关键词 评价指…...
使用qsqlmysql操作mysql提示Driver not loaded
环境: win10 IDE: qt creator 编译器: mingw32 这里简单的记录下。我遇到的情况是在IDE使用debug和release程序都是运行正常,但是当我编译成发布版本之后。老是提示Driver not load。 这就很奇诡了。 回顾了下编译的时候是需要在使用qt先编译下libqsqlmysql.dll的…...
Java云原生框架Quarkus初探
Java云原生框架Quarkus初探 Quarkus 介绍 Quarkus 是一个云原生,容器优先的Java应用框架,它号称是超音速和亚原子的框架,主要特点是构建速度、启动速度快和占用资源少等特点。它为OpenJDK HotSpot和GraalVM量身定制, 根据Java库和…...
ElasticSearch相关概念
文章目录 前提倒排索引MySQL、ES的区别和关联IK分词器索引库mapping属性索引库的crud 文档的crudRestClientDSL查询DSL 查询种类DSL query 基本语法 搜索结构处理排序分页高亮RestClient 前提 开源的搜索引擎,从海量数据中快速找到需要的内容。(分词检索…...
微服务实战项目-学成在线-项目部署
微服务实战项目-学成在线-项目部署 1 什么是DevOps 一个软件的生命周期包括:需求分析阶、设计、开发、测试、上线、维护、升级、废弃。 通过示例说明如下: 1、产品人员进行需求分析 2、设计人员进行软件架构设计和模块设计。 3、每个模块的开发人员…...
封装form表单
目录 1. 源码 2. 其他页面引用 ps:请看完看明白再复用 1. 源码 <template><div style"width: 100%; height: 100%" class"form-condition"><!-- 普通表单 --><el-card shadow"hover" class"cardheigh…...
程序员如何利用公网远程访问查询本地硬盘【内网穿透】
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想,就是为了理想的生活! 公网远程访问本地硬盘文件【内网穿透】 文章目录 公网远程访问本地硬盘文件【内网穿透】前言1. 下载cpolar和Everything软件1.…...
算法|Day42 动态规划10
LeetCode 121.买卖股票的最佳时机 题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 题目描述:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天…...
vmalert集成钉钉告警
vmalert通过在alert.rules中配置告警规则实现告警,告警规则语法与Prometheus兼容,依赖Alertmanager与prometheus-webhook-dingtalk实现钉钉告警,以下步骤: 1、构建vmalert 从源代码构建vmalert: git clone https://…...
深入解析 MyBatis 中的 <foreach> 标签:优雅处理批量操作与动态 SQL
在当今的Java应用程序开发中,数据库操作是一个不可或缺的部分。MyBatis作为一款颇受欢迎的持久层框架,为我们提供了一种优雅而高效的方式来管理数据库操作。在MyBatis的众多特性中,<foreach>标签无疑是一个强大的工具,它使得…...
智能科学毕设易上手项目选题答疑
0 选题推荐 - 大数据篇 毕业设计是大家学习生涯的最重要的里程碑,它不仅是对四年所学知识的综合运用,更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要,它应该既能体现你的专业能力,又能满足实际应…...
生成式AI数据回流机制失效=法律风险+商业价值归零:2024Q2监管通报中12起AI服务下架事件,100%存在回流链路缺失审计证据
第一章:生成式AI应用数据回流机制 2026奇点智能技术大会(https://ml-summit.org) 生成式AI系统在生产环境中持续演进,其核心驱动力之一是高质量、结构化、可追溯的数据回流机制。该机制并非简单日志采集,而是涵盖用户反馈、模型输出置信度、…...
从手机导航到厘米级RTK:一文搞懂GNSS三大观测量(伪距、载波相位、多普勒)到底怎么用
从手机导航到厘米级RTK:GNSS三大观测量的技术跃迁与应用革命 当我们打开手机地图导航时,很少会思考那个蓝色定位点背后的技术奥秘。事实上,从日常导航到精准农业,从无人机测绘到自动驾驶,全球导航卫星系统(GNSS)技术的…...
从一坨面条代码开始——V1最小原型
🧠 专栏:「当AI学会发脾气」—— 一个类脑认知系统的诞生记 副标题:7个版本迭代Python脚本,教会AI像人一样焦虑、兴奋、犯错和成长 这是一个从零开始构建"有情绪的AI"的完整记录。不需要深度学习框架,不需要…...
Golang怎么实现配置校验_Golang如何在启动时检查必填配置项是否缺失【技巧】
必填环境变量校验必须在main()开头用os.LookupEnv集中检查,禁止在init()中校验;mapstructure需关闭WeaklyTypedInput或二次校验;第三方env库须显式处理Parse返回error。启动时 panic 之前先检查 os.Getenv 是否为空Go 没有内置配置校验机制&a…...
如何打造无网络环境下的iScroll开发参考方案:完整离线文档指南
如何打造无网络环境下的iScroll开发参考方案:完整离线文档指南 【免费下载链接】iscroll Smooth scrolling for the web 项目地址: https://gitcode.com/gh_mirrors/is/iscroll iScroll作为一款高性能、轻量级的Web滚动库,为开发者提供了流畅的跨…...
告别cmake-gui!纯命令行搞定OpenCV 3.4.1到ARM开发板的交叉编译(附完整脚本)
纯命令行实现OpenCV 3.4.1向ARM架构的交叉编译全流程 在嵌入式开发领域,将计算机视觉库OpenCV移植到ARM平台是常见需求。传统方法依赖cmake-gui图形界面工具,但真正的效率提升往往来自纯命令行操作——它不仅能实现自动化编译流程,更适用于无…...
如何3分钟从视频中智能提取PPT:终极自动化工具指南
如何3分钟从视频中智能提取PPT:终极自动化工具指南 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 你是否曾经花费数小时手动暂停视频、截图PPT页面?extract-…...
无涯教程-JavaScript - 深入理解 has() 方法:从 WeakSet 到集合成员检测
1. 认识JavaScript中的has()方法 第一次接触JavaScript的has()方法时,我完全被它简洁而强大的功能惊艳到了。这个方法就像是一个高效的"探测器",专门用来检查某个元素是否存在于集合中。想象一下你有一个装满各种物品的盒子,has()方…...
PDS Skeleton与Composer完美集成:构建企业级PHP包的10个技巧
PDS Skeleton与Composer完美集成:构建企业级PHP包的10个技巧 【免费下载链接】skeleton Standard PHP package skeleton. 项目地址: https://gitcode.com/gh_mirrors/skele/skeleton PDS Skeleton(PHP开发标准骨架)是一个标准化的PHP包…...
