【ROS】恢复行为
【ROS】恢复行为
- 前言
- 恢复行为(recovery_behavior)概述
- 恢复行为的参数
- 示例:`recovery_behavior.yaml` 配置文件
- 参数说明与配置原则
- 恢复行为模块的参数设置
- reset_recovery(重置行为:清除代价地图)
- 参数冲突说明与解决方法
- rotate_recovery(旋转清除)
前言
本文将介绍 ROS 导航系统中核心节点之一的内部模块——恢复行为(recovery_behavior
)。
当导航过程中机器人陷入停滞或无法继续前进时,恢复行为模块会尝试更新障碍物信息,并执行一系列预设操作以帮助机器人脱困,从而重新规划一条可行的全局路径。
我的环境:
本教程使用的环境是:实体 ROS 小车,Ubuntu 18.04,ROS1 Melodic
参考资料:
- ROS导航系统 | 恢复行为 | Recovery Behaviors
- ROS导航系统 | 恢复行为的参数设置 | Recovery Behaviors
- ROS Wiki - rotate_recovery
- ROS Wike - clear_costmap_recovery
恢复行为(recovery_behavior)概述
当机器人被动态障碍物困住,无法继续导航任务时,ROS 导航系统会启用一种应急机制——恢复行为(recovery_behavior
)。该机制的目标是在导航“卡死”时,尝试清除障碍信息、刷新代价地图,并重新进行路径规划,从而帮助机器人“脱困”,恢复正常导航。
推荐参考讲解视频:
👉 ROS导航系统 | 恢复行为 | Recovery Behaviors(2–7分钟)
恢复行为机制的框架图如下:
恢复行为策略说明:
-
保守重置(conservative_reset):
清除机器人当前位置附近较小范围内的障碍物信息,用于轻微的路径阻塞处理。 -
激进重置(aggressive_reset):
清除更大范围内的障碍物信息,用于尝试处理更严重的路径堵塞。 -
第一次旋转清除(rotate_recovery 1):
原地旋转一圈,让激光雷达完整扫描一圈,用于更新全方位障碍信息,解决可能因激光雷达盲区导致的信息不完整问题。 -
第二次旋转清除(rotate_recovery 2):
与第一次类似,但覆盖范围更大,进一步尝试清理未被检测的障碍。
✅ 实际使用中,保守和激进清除的效果有限,真正发挥作用的往往是旋转清除,尤其对带有雷达盲区的机器人来说尤为关键。
恢复行为的参数
该部分内容推荐参考:
- ROS导航系统 | 恢复行为的参数设置
更多恢复行为的参数说明可参考官方文档:
- rotate_recovery(旋转恢复行为) - ROS Wiki
- clear_costmap_recovery(清除代价地图) - ROS Wiki
我们可以直接使用 ROS 提供的三种恢复行为,为它们设置对应参数,并对三者进行组合,从而构建一套自定义的恢复策略。
示例:recovery_behavior.yaml
配置文件
恢复行为(recovery behavior)的参数理论上可以放在任意位置,只要加载到 ROS 参数服务器时命名空间设置正确即可。
常见做法是将参数写入 recovery_behaviors.yaml
、global_costmap.yaml
、move_base_params.yaml
等文件,并通过 rosparam
加载。
关键在于确保参数所属的命名空间与调用模块一致,例如使用 ns=recovery_behavior
进行加载时,配置文件中的命名空间也应对应。
建议:虽然参数文件的位置没有强制要求,但为了结构清晰、便于管理,通常建议将恢复行为参数统一放在 move_base
的参数文件中,如 move_base_params.yaml
。
下面是一个示例的 recovery_behavior.yaml
配置文件:
recovery_behaviors:- name: 'reset_recovery' # 定义一个名为 'reset_recovery' 的恢复行为type: 'clear_costmap_recovery/ClearCostmapRecovery' # 指定该恢复行为的类型为清除代价地图- name: 'rotate_recovery' # 定义一个名为 'rotate_recovery' 的恢复行为type: 'rotate_recovery/RotateRecovery' # 指定该恢复行为的类型为原地旋转- name: 'move_slow_and_clear' # 定义一个名为 'move_slow_and_clear' 的恢复行为type: 'move_slow_and_clear/MoveSlowAndClear' # 指定该恢复行为的类型为缓慢移动并清除障碍物# 'reset_recovery' (clear_costmap_recovery) 的参数
reset_recovery:reset_distance: 3.0 # 注意:对于 clear_costmap_recovery,这个参数通常不适用或没有实际效果。# 它更常用于 move_slow_and_clear 类型的恢复行为,表示清除障碍物的距离。# 对于 clear_costmap_recovery,更关键的是 'layer_names' 参数。layer_names: ['obstacle_layer'] # 指定需要清除的代价地图图层名称列表。# 这里设置为清除名为 'obstacle_layer' 的图层。# 'rotate_recovery' (rotate_recovery) 的参数
rotate_recovery:sim_granularity: 0.017 # 旋转时检查障碍物的角度间隔(弧度)。# 0.017 弧度约为 1 度。数值越小,检查越精细。frequency: 20.0 # 向机器人发送旋转速度指令的频率(赫兹)。# 'move_slow_and_clear' (move_slow_and_clear) 的参数
move_slow_and_clear:clearing_distance: 0.5 # 机器人前方尝试清除障碍物的距离(米)。limited_trans_speed: 0.25 # 机器人在此恢复行为中允许的最大平移速度(米/秒)。limited_rot_speed: 0.45 # 机器人在此恢复行为中允许的最大旋转速度(弧度/秒)。planner_namespace: 'PlannerROS' # 规划器的命名空间。这个参数用于在执行清除动作时与规划器进行交互。# 例如,在清除障碍物后可能需要通知规划器重新规划路径。
参数说明与配置原则
- 恢复行为的名称(name) 可以自定义,但 type 类型 必须是以下三种之一:
clear_costmap_recovery/ClearCostmapRecovery
(重置清除)rotate_recovery/RotateRecovery
(原地旋转清除)move_slow_and_clear/MoveSlowAndClear
(缓慢移动清除,风险较高,通常不建议使用)
恢复行为模块的参数设置
reset_recovery(重置行为:清除代价地图)
reset_distance
:清除半径范围,单位为米。会清除该范围 以外 的所有障碍物信息。layer_names
:指定需要清除的地图层,通常为obstacle_layer
,表示障碍物层(动态障碍地图)。
注意:
清除操作完成后,激光雷达会在下一帧自动重新检测并更新障碍物信息,因此可能无法直观观察到“清除”的过程,但地图实际上已经刷新。
参数冲突说明与解决方法
clear_costmap_recovery
插件默认清除的是名为 obstacles
的层,而 costmap_2d
中常用的障碍层名称为 obstacle_layer
,两者不一致将导致清除失败。因此,我们需要进行以下修改:
修改步骤:
① 修改 costmap_common_params.yaml
中的插件名称,统一为 obstacle
:
plugins:- {name: static_layer, type: "costmap_2d::StaticLayer"}- {name: obstacles, type: "costmap_2d::VoxelLayer"}- {name: inflation_layer, type: "costmap_2d::InflationLayer"}
② 修改恢复行为配置文件中 reset_recovery
的参数:
reset_recovery:reset_distance: 3.0layer_names: ['obstacle_layer']
推荐参考视频讲解:
恢复行为参数设置(8~11分钟)
rotate_recovery(旋转清除)
该恢复行为用于原地旋转来尝试摆脱困境。
详细参数说明请见:
rotate_recovery - ROS Wiki
常用参数:
sim_granularity
:模拟障碍检测的角度分辨率,单位为弧度。值越小,检测越精细,旋转越安全但计算开销更大。frequency
:向机器人发送旋转速度指令的频率(单位:Hz)。rotational_vel
:机器人旋转的角速度(单位:rad/s)。
相关文章:
【ROS】恢复行为
【ROS】恢复行为 前言恢复行为(recovery_behavior)概述恢复行为的参数示例:recovery_behavior.yaml 配置文件参数说明与配置原则恢复行为模块的参数设置reset_recovery(重置行为:清除代价地图)参数冲突说明…...
HashMap中put方法的执行流程
在 Java 编程中,HashMap 是一种常用的集合类,它以键值对(Key-Value)的形式存储数据,它具有高效查找、插入和删除的优势。 一.HashMap底层数据结构 JDK 1.7:采用 数组 链表 的结构。JDK 1.8:优…...
基于深度学习并利用时间信息在X射线血管造影中进行冠状动脉血管分割|文献速递-深度学习医疗AI最新文献
Title 题目 Deep learning based coronary vessels segmentation in X-ray angiographyusing temporal information 基于深度学习并利用时间信息在X射线血管造影中进行冠状动脉血管分割 01 文献速递介绍 有创冠状动脉造影(ICA)在冠状动脉疾病&#…...
JVM详解(曼波脑图版)
(✪ω✪)ノ 好哒!曼波会用最可爱的比喻给小白同学讲解JVM,准备好开启奇妙旅程了吗?(๑˃̵ᴗ˂̵)و 📌 思维导图 ━━━━━━━━━━━━━━━━━━━ 🍎 JVM是什么?(苹果式比…...
深度理解指针之例题
文章目录 前言题目分析与讲解涉及知识点 前言 对指针有一定了解后,讲一下一道初学者的易错题 题目分析与讲解 先定义一个数组跟一个指针变量 然后把数组名赋值给指针变量————也就是把首地址传到pulPtr中 重点是分析这一句: *(pulPtr…...
Electricity Market Optimization(VI) - 机组组合问题的 GAMS 求解
根据之前的博客,我们考虑机组的启动成本只讨论考虑以下几种约束的机组组合问题: 功率平衡约束火电机组启停约束和爬坡约束备用容量约束 min ∑ t 1 T ( C t g e n C t u c C t curt ) s.t. C t g e n ∑ i ∈ [ G ] c i ( p i , t c ) C t u c …...
【Leetcode 每日一题】2176. 统计数组中相等且可以被整除的数对
问题背景 给你一个下标从 0 0 0 开始长度为 n n n 的整数数组 n u m s nums nums 和一个整数 k k k,请你返回满足 0 ≤ i < j < n 0 \le i < j < n 0≤i<j<n, n u m s [ i ] n u m s [ j ] nums[i] nums[j] nums[i]nums[j] 且…...
赛灵思 XCVU3P‑2FFVC1517I XilinxFPGA Virtex UltraScale+
XCVU3P‑2FFVC1517I AMD Xilinx Virtex UltraScale 系列中的高端 FPGA,基于 TSMC 16 nm FinFET 工艺及第三代 3D IC 堆栈互连技术(SSI),旨在为数据中心互连、高性能计算、网络加速和信号处理等苛刻应用提供领先的性能‑功耗比。…...
Rust 与 JavaScript 的 WebAssembly 互操作指南
1. Rust 中导入和导出 JS 函数 导入 JS 函数 Rust 代码中可以通过 extern 块导入 JavaScript 函数: #[link(wasm_import_module "mod")] // 指定 JS 模块名 extern { fn foo(); // 声明导入的 JS 函数 }如果没有指定 wasm_import_module,默…...
2025年特种设备安全管理 A 证考试全解析
对于想要获取特种设备安全管理 A 证的人员来说,了解考试的具体内容与形式是备考的关键。下面将为大家全面解析特种设备安全管理 A 证考试,助力大家顺利备考,成功取证。 特种设备安全管理 A 证考试内容丰富,涵盖多个重要领域。特种…...
TOA与AOA联合定位的高精度算法,三维、4个基站的情况,MATLAB例程,附完整代码
本代码实现了三维空间内目标的高精度定位,结合到达角(AOA) 和到达时间(TOA) 两种测量方法,通过4个基站的协同观测,利用最小二乘法解算目标位置。代码支持噪声模拟、误差分析及三维可视化,适用于无人机导航、室内定位等场景。订阅专栏后可获得完整代码 文章目录 运行结果…...
java 设计模式之策略模式
简介 策略模式:策略模式可以定制目标对象的行为,它尅通过传入不同的策略实现,来配置目标对象的行为。使用策略模式,就是为了定制目标对象在某个关键点的行为。 策略模式中的角色: 上下文类:持有一个策略…...
BH1750光照传感器---附代码
目录 BH1750简介BH1750指令集BH1750工作流程 BH1750简介 VCC-->电源正; ADDR-->地址端口; GND-->电源负; PA5-->SDA-->I2C数据线; PA3-->SCL-->I2C时钟线; DVI-->I2C端口参考电压;…...
docker harbor私有仓库登录报错
docker harbor私有仓库登录报错如下: [rootsrv-1 ~]# docker login -u user1 -p pwd1 harbor.chinacloudapi.cn WARNING! Using --password via the CLI is insecure. Use --password-stdin. Error response from daemon: Get "https://harbor.chinacloudapi.…...
浔川AI翻译v7.0更新预告
亲爱的浔川AI翻译用户: 感谢您一直以来的支持!浔川AI翻译自推出以来,已迭代6个版本,其中**v2.0和v4.0因技术问题(翻译结果显示异常、注册失败、密码找回功能失效等)**被迫下架。我们深知这些问题影响了您…...
Linux网络编程实战:从字节序到UDP协议栈的深度解析与开发指南
网路通信的三大要素:协议,端口和IP 知识点1【字节序】 多字节在主机中的存放数据 把多字节看成一个整体存储的顺序。 为什么我们在文件中没有这个概念呢? 因为文件是字节流(流指针),流是以一个字节为操…...
Java基础知识面试题(已整理Java面试宝典pdf版)
什么是Java Java是一门面向对象编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论…...
速盾:高防CDN访问多了会影响源站吗?
在当今数字化时代,内容分发网络(CDN)已经成为保障网站性能和用户体验的重要工具。特别是高防CDN,它不仅能够加速内容传输,还能有效抵御各种类型的网络攻击,确保业务的连续性和稳定性。然而,一些…...
Python(19)Python并发编程:深入解析多线程与多进程的差异及锁机制实战
目录 一、背景:Python并发编程的必要性二、核心概念对比2.1 技术特性对比表2.2 性能测试对比(4核CPU) 三、线程与进程的创建实战3.1 多线程基础模板3.2 多进程进阶模板 四、锁机制深度解析4.1 资源竞争问题重现4.2 线程锁解决方案4.3 进程锁的…...
赛灵思 XCVU440-2FLGA2892E XilinxFPGA Virtex UltraScale
XCVU440-2FLGA2892E 属于 Xilinx Virtex UltraScale 系列,是面向高端应用的旗舰 FPGA 器件。该系列产品以出色的高并行处理能力、丰富的逻辑资源和高速互联能力闻名,广泛用于 高性能计算、数字信号处理等对计算能力和带宽要求极高的场景。采用先进的 20n…...
UE5 相机裁剪面
UE5无法单独修改相机的裁剪面,不论是场景相机还是游戏相机都不可以 只能在配置里统一修改 项目设置里直接搜clip...
uniapp自定义底部导航栏,解决下拉时候顶部空白的问题
一、背景 最近使用uniapp开发微信小程序,因为使用了自定义的顶部导航栏,所以在ios平台上(Android未测试)测试的时候,下拉的时候会出现整个页面下拉并且顶部留下大片空白的问题 二、任务:解决这个问题 经…...
vue2 element-ui 中 el-radio 单选框点击事件失效问题
前情提要 点进这篇文章的小伙伴,应该和博主一样,都是遇到了这种单选框可点击取消的需求。也就只有这种不同寻常的需求,才能让我们发现element框架的缺陷点,话不多说,下面博主来提供一个解决思路。 click为什么无法触发…...
yolov8复现
Yolov8的复现流程主要包含环境配置、下载源码和验证环境三大步骤: 环境配置 查看电脑状况:通过任务管理器查看电脑是否有独立显卡(NVIDIA卡)。若有,后续可安装GPU版本的pytorch以加速训练;若没有࿰…...
提高Qt工作线程的运行速度
1. 使用线程池(QThreadPool)替代单一线程 做过,但是当时没想到。。。 目的:减少线程创建和销毁的开销,复用线程资源。 实现步骤: 创建自定义任务类:继承QRunnable,实现run()方法。…...
ZStack文档DevOps平台建设实践
(一)前言 对于软件产品而言,文档是不可或缺的一环。文档能帮助用户快速了解并使用软件,包括不限于特性概览、用户手册、API手册、安装部署以及场景实践教程等。由于软件与文档紧密耦合,面对业务的瞬息万变以及软件的飞…...
网络规划设计之广域网结构设计,6种架构模式对比
在数字化转型的浪潮中,网络基础设施的设计理念正在发生深刻变革。传统的基于点线拓扑的研究方法已无法满足现代复杂网络的需求,取而代之的是更具系统性的网络结构设计理念。本文将深入解析网络结构的定义特征,并重点剖析六种主流广域网架构的…...
FortiAI 重塑Fortinet Security Fabric全面智能化进阶
专注推动网络与安全融合的全球性综合网络安全解决方案供应商 Fortinet(NASDAQ:FTNT),近日宣布,旗下 Fortinet Security Fabric 安全平台成功嵌入了 FortiAI 关键创新功能。这一举措将有效增强用户对各类新兴威胁的防护…...
uniapp h5接入地图选点组件
uniapp h5接入地图选点组件 1、申请腾讯地图key2、代码接入2.1入口页面 (pages/map/map)templatescript 2.2选点页面(pages/map/mapselect/mapselect)templatescript 该内容只针对uniapp 打包h5接入地图选点组件做详细说明&#x…...
Openfein实现远程调用的方法(实操)
文章目录 环境准备一、URL中接收参数二、接收一个参数三、接收多个参数四、传递对象五、传递JSON格式数据 环境准备 下面的配置,服务调用方加入即可。 依赖导入: <!-- openfeign依赖--><dependency><groupId>org.springframe…...
Matter如何终结智能家居生态割据,重构你的居住体验?
现阶段,Zigbee、Z-Wave、Thread、Wi-Fi与蓝牙等多种通信协议在智能家居行业中已得到广泛应用,但协议间互不兼容的通信问题仍在凸显。由于各协议自成体系、彼此割据,智能家居市场被迫催生出大量桥接器、集线器及兼容性软件以在不同生态的设备间…...
Thin-Agent服务(TAS)概述
### **Thin-Agent服务(TAS)概述** **Thin-Agent服务(TAS)** 是一种轻量级监控服务,通过 **BMC/IPMI**(基板管理控制器/智能平台管理接口)收集**硬件和操作系统特定数据**,为系统管…...
2025.4.17学习日记 初识JavaScript 以及Java和JavaScript有什么区别
Java 和 JavaScript 虽然名字相似,但实际上是两种不同的编程语言。 1. 语言背景和设计目的 Java:由 Sun Microsystems(现被 Oracle 收购)在 1995 年推出。设计初衷是为了实现 “一次编写,到处运行(Write O…...
python学习—合并多个word文档
系列文章目录 python学习—合并TXT文本文件 python学习—统计嵌套文件夹内的文件数量并建立索引表格 python学习—查找指定目录下的指定类型文件 python学习—年会不能停,游戏抽签抽奖 python学习—循环语句-控制流 python学习—合并多个Excel工作簿表格文件 pytho…...
01、单片机简介
单片机简介 1、什么是单片机2、STM32F103ZET6介绍2.1、参数的含义2.2、存储器映射 3、外设寄存器介绍 1、什么是单片机 单片机(Single-Chip Microcomputer)是一种微型计算机,是一种集成电路芯片。把具有数据处理能力的中央处理器CPU、随机存储器RAM、闪存flash、多…...
常用UI设计工具及平台概览
在当今快速发展的数字世界中,UI设计平台成为设计师和开发者创建用户界面不可或缺的利器。这些平台不仅支持从简单原型到复杂交互设计的各种需求,而且许多还提供将设计直接转换为代码的功能,极大地提高了开发效率。下面将为您介绍几个主流的UI设计工具及其特点,帮助您根据项…...
考研单词笔记 2025.04.17
associate v联系,联想n同事,伙伴,朋友a副的,准的,非正式的 association n联系,联想,协会,社团,关系,交往 associative a联想的 bond n纽带,联系…...
MySQL常用SQL语句的示例
概述 MySQL 常用 SQL 语句的示例,涵盖数据定义、操作、查询等常见场景 一、数据库操作 创建数据库 CREATE DATABASE mydb;选择数据库 USE mydb;删除数据库 DROP DATABASE mydb;二、表操作 创建表 CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VAR…...
java 多线程之Worker Thread模式(Thread Pool模式)
Worker Thread模式 Worker的意思是工作的人,在Worker Thread模式中,工人线程Worker thread会逐个取回工作并进行处理,当所有工作全部完成后,工人线程会等待新的工作到来。 Worker Thread模式也被成为Background Threadÿ…...
4月17日星期四今日早报简报微语报早读
4月17日星期四,农历三月二十,早报#微语早读。 1、国家统计局:一季度国内生产总值同比增长5.4%; 2、我国博士后已超40万人,2024年招收人数再创新高; 3、神舟二十号计划近日择机实施发射,船箭组…...
【最新版】芸众商城独立版源码 425+插件 全新后台框架
一.系统介绍 芸众商城系统最新版 已经更新425全插件版,一套系统支持各种新零售、商城、模式,天天美丽链动商城。不要相信那些外面的旧版本。旧版本等于是废品,无法小程序运营的,框架还是旧的! 芸众系统最新版 服务器可…...
android liveData observeForever 与 observe对比
LiveData 是一个非常有用的组件,用于在数据变化时通知观察者。LiveData 提供了两种主要的观察方法:observe 和 observeForever。这两种方法在使用场景、生命周期感知以及内存管理等方面有所不同。 一、observe 方法 1. 基本介绍 生命周期感知:observe…...
定制化 Docsify 文档框架实战分享
🌟 定制化 Docsify 文档框架实战分享 在构建前端文档平台时,我们希望拥有更友好的用户界面、便捷的搜索、清晰的目录导航以及实用的代码复制功能。借助 Docsify,我实现了以下几个方面的定制优化,分享给大家 🙌。 &…...
蓝桥杯题目:二维前缀和
首先分析一下二维数组的差分。s[x2][y2]-s[x1][y1]s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]s[x1-1][y1-1] 因为对于二维数组x2y2-x1y1范围内的值需要通过x2y2减去从x1,y2-1的这段存储的前缀和以及减去x2-1,y1这两部分的前缀和,但是还有一个x1-1&a…...
数字孪生城市技术应用典型实践案例汇编(22个典型案例)(附下载)
近年来,数字孪生技术在我国从战略框架逐步向系统性落地推进,成为推动数字中国建设的重要技术引擎。随着《数字中国建设整体布局规划》《"十四五"数字经济发展规划》《深化智慧城市发展推进城市全域数字化转型的指导意见》等政策的实施…...
Linux——信号(1)信号的产生
我们在讲进程的多种状态时提到过,一个进程的退出有三种情况:正常退出,结果出错退出(代码也执行完了),异常终止退出(代码未执行完),其中最后一种退出相当于进程在运行时&a…...
【模型常见评价指标(分类)】
目录 常见指标 其他的评估指标 3.1 BLEU 3.2 ROUGE 3.3 困惑度PPL(perplexity) 常见指标 其他的评估指标 3.1 BLEU BLEU(Bilingual Evaluation Understudy,双语评估替补)分数是评估一种语言翻译成另一种语言的文本质量的指标。它将“质…...
个人博客系统后端 - 用户信息管理功能实现指南(上)
本文记录了如何实现用获取户信息,用户信息更新,用户头像上传三大基础功能 先上接口实现截图: 一、项目结构概览 先介绍一下 个人博客系统采用了标准的 Spring Boot 项目结构,用户功能相关的文件主要分布在以下几个目录:…...
CyberAgentAILab 开源数字人项目TANGO,heygen的开源版来了~
简介 TANGO 是 CyberAgentAILab 开源的一项前沿研究成果,其初衷在于探索高效生成模型在实际应用场景中的表现。项目诞生于 CyberAgent 在整合创意与人工智能的实践中,旨在为数字内容生成、交互和实时渲染等领域提供一个高性能、模块化、可扩展的解决方案…...
高等数学同步测试卷 同济7版 试卷部分 上 做题记录 上册期中同步测试卷 A 卷
上册期中同步测试卷A卷 一、单项选择题(本大题共5小题,每小题3分,总计15 分) 1. 2. 3. 4. 5. 二、填空题(本大题共5小题,每小题3分,总计15分) 6. 7. 8. 9. 10. 三、求解下列各题(本大题共5小题,每小题6分,总计30分) 11. …...