Move_base_flex(mbf)框架理解

news2024/11/15 10:20:30

本文章重点在 第二部分类图解析,第四部分代码解析

文章目录

  • 1. move_base_flex主体代码结构树
  • 2. move_base_flex 类图解析
    • 2.1 ROS2 navigation整体架构
    • 2.2 mbf类图主体思路详解
      • 2.2.1. 抽象层(abstract层)
      • 2.2.2. 外部信号输入(Action层)
      • 2.2.3. 外部API输入
  • 3. mbf向后兼容move_base解析
  • 4. mbf重点代码详解
  • 5. 基于mbf框架实现导航代码推荐

1. move_base_flex主体代码结构树


├── mbf_abstract_core (抽象父类,提供控制-局部规划,全局规划,脱困行为基础功能接口)
├── mbf_abstract_nav (抽象导航类,提供控制,规划,脱困执行行为虚函数接口和action对应的状态机以及插件管理器)
├── mbf_costmap_core (子类,基于代价地图costmap实现父类abstract_core的功能接口)
├── mbf_costmap_nav (子类,基于代价地图实现导航功能的接口的设置,action初始化,各接口执行器Execution算法绑定)
├── mbf_msgs (提供局部规划,全局规划,脱困,点到点move_base的action,以及检查路径点代价值等srv)
├── mbf_simple_nav (基于mbf实现简单的导航服务,但是局限性在于没有地图描述。可用于对costmap_nav简化剥离)
└── mbf_utility (mbf框架工具箱,包含速度,里程计获取,坐标变换等)

总结: 这里面的costmap_core,costmap_nav,simple_nav都是属于子类的实现,父类已经把整体流转框架思维写好了。
后续结合mbf类图的参照,就可以实现基于各种不同地图类型的2D,3D导航(如mbf框架已实现的costmap导航,和mesh_gridmap的3D导航)。 总结来说,该框架重点在于mbf_abstract_core, mbf_abstract_nav, mbf_msgs, mbf_utility

2. move_base_flex 类图解析

总结:move_base_flex的整体框架思维与ROS2 navigation具备高度相似。将控制,规划,脱困分模块解耦独立工作
ROS2 navROS2 nav通过行为树发送对应的action,让各个模块做自己对应的工作。
mbf则通过navigation_server去初始化,加载各个模块。本质上也是通过上层如行为树,状态机去调用对应的
action实现运转。 因此mbfROS2 nav架构思想十分类似,区别在于mbf将父类抽象剥离,只要重新写 子类的实现,对应的地图类型就能够使用,如mesh_navigation。具有再编辑性,复用性,可移植性

2.1 ROS2 navigation整体架构

ROS2 navigation包的整体架构图
ROS2 nav的更新在于将脱困,控制,规划整成独立模块,相较于ros1的move_base规划控制脱困相互耦合更容易做处理和拓展,缺点是没有高度抽象和高度复用性。

2.2 mbf类图主体思路详解

move_base_flex框架总体概括图

重点声明
以下思路分析全部基于抽象层 即图中对应的 Abstract Move Base Flex Level 层,从左到右分析!!!!!!!!!!!!!!!!!!!!!!!!!!!!

2.2.1. 抽象层(abstract层)

abstract层有规划,控制,脱困执行器(abstract Execution),通过插件加载的方式去调用其对应的算法。每个Execution都有对应的独立线程单独运行里面的各个状态机。 navigation server类似大脑,通过接收tf树,外部数据输入,然后再接收外部的action信号(get_path,exe_path, recovery),直接开启各模块action server内部的流转,运行起了各模块Execution。

2.2.2. 外部信号输入(Action层)

Abstract Navigation Server中,先注册好各个模块的action server等待外部的 client去唤起对应的行为。 如 外部client唤起了get_path的action,就会执行器Abstract Planner Execution的流程,进入其状态机流转,生成对应的全局路径,并返回到action 的result中去 (该生成路径可以用于后续的exe_path中调用控制模块)
再比如 外部client唤起了exe_path的action,会让控制模块独立运行,并一直反馈当前路径执行状态和最后执行结果。
通过Action Server的外部调用,就能实现各个模块的解耦。

2.2.3. 外部API输入

外部节点node(写好了服务srv端/make_plan),然后client 一旦唤起,srv回调中就会去get_path对应的client就会唤起对应的action server进行全局路径规划。 同理,topic也是,节点接收到对应的topic,回调就会action client call对应的server,进行调用move_base Action,进行其对应的流转。

3. mbf向后兼容move_base解析

  1. 当在rviz上给了一个目标点goal之后,对应的topic回调就会调用/move_base action
  2. 收到move_base的client唤起后,costmap_navigation_server (抽象导航类的实现-子类) 就会调用对应的执行。
  3. move_base_action_.start(goal_handle)为主要实现函数,里面分顺序先调用全局规划action_client_get_path_.sendGoal,生成全局路径后,在全局路径action结果返回的状态succeeded中向控制模块发出路径的action server唤起指令action_client_exe_path_.sendGoal。 该action里面包含了actionExePathDone,actionExePathFeedback. 主要用于执行结果以及执行过程中的状态。当机器人处于oscillation时,actionExePathFeedback中会调用attemptRecovery()函数,函数里面会唤起脱困的action,对应Recovery的行为。

4. mbf重点代码详解

重点声明以下思路分析全部基于抽象层
本章节拿controller模块举例

  1. abstract_navigation_server里面已经注册好了controller模块的算法,以及对应的action服务器,为action_server_exe_path_ptr_.
  2. 当收到路径点时候就会进入回调函数callActionExePath
  3. callActionExePath先判断有没有指定要求哪个控制算法,然后通过插件管理器加载对应算法
  4. 创建并赋值controller_execution指针,接着controller_action_.start(goal_handle, controller_execution)实现控制模块的执行行为线程入口。
  5. 若控制模块没有被新的路径进来中断,则子类特意单独执行父类的AbstractActionBase::start(goal_handle, execution_ptr);
  6. 在父类中开启了关于控制模块独立运行的线程threads_.create_thread(boost::bind(&AbstractActionBase::run, this, boost::ref(concurrency_slots_[slot]))); run函数里面包含了runImpl,优先调用的是子类的实现,由于入口最开始是从子类开始的。即调用了ControllerAction::runImpl函数。 因此控制模块的线程循环关键函数ControllerAction::runImpl函数。
  7. case AbstractControllerExecution::INITIALIZED:
     	execution.setNewPlan(plan, goal.tolerance_from_action, goal.dist_tolerance, goal.angle_tolerance);
     	execution.start();
    上面代码极其重要,因为调用了runImpl后,控制模块的Execution处于初始化状态,会先设好要跟随的路径以及execution.start();创建了一个新进程同步运行控制的Execution,
    即控制算法执行在其他进程中一直进行。因此runImpl函数属于将控制算法跟踪的状态,Action的结果实时反馈到/exe_path中,即publishExePathFeedback()函数和fillExePathResult()
    

总结: 有两个线程独立运行,一个为ControllerAction线程反馈Action状态,一个ControllerExecution实时运行算法。

5. 基于mbf框架实现导航代码推荐

  1. mesh_navigation(mbf公司实现的3D导航算法,用于崎岖地形):https://github.com/uos/mesh_navigation

  2. xju机器人(国人制作),内含各种室内清扫机器人入门干货,墙裂推荐:https://github.com/Mr-Tony921/xju-robot

  3. FCPP全覆盖清扫全局规划算法,使用了mbf框架进行执行清扫:https://github.com/nobleo/full_coverage_path_planner

  4. 官方教程:https://uos.github.io/mbf_docs/tutorials/beginner/basic_navigation/

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

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

相关文章

【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(4通道示波器)】

目录 序言 🍍放置虚拟仪器仪表 🍉4通道示波器 1.“时基”选项组 2.“通道”选项组 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和仿真。 首先启动NI Multisim 14.0…

C语言 通讯录最终版(动态内存+实时保存)

欢迎来到 Claffic 的博客 💞💞💞 前言: 上期通讯录我们实现了动态内存的申请,但数据依然是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候…

什么是REST和RESTful

REST(Representational State Transfer)表象化状态转变(表述性状态转变),在2000年被提出,基于HTTP、URI、XML、JSON等标准和协议,支持轻量级、跨平台、跨语言的架构设计。是Web服务的一种新的架…

单身福利专场——Python采集某相亲地数据

嗨害大家好鸭!我是小熊猫~ 咳咳年前最后一天… 一点单身福利… 我想… 应该会有需要的吧… 环境开发: Python 3.8Pycharm 模块使用: import parselimport requestsimport csvimport re 爬虫基本思路流程: 一. 数据来源分析: 1. 明确需求: 采集数据是什么 —…

Linux基本功系列之ping命令实战

文章目录一. 命令介绍二. 语法格式及常用选项三. 参考案例3.1 测试本机与指定网站服务器之间的网络连通性3.2 指定ping的次数3.3 指定时间间隔和次数3.4 设置TTL为2553.5 极快速的测试使用大包ping四. 使用ping命令常见问题总结前言🚀🚀🚀 想…

Java项目部署到云服务器的思路

Java项目部署到云服务器的思路 1 部署项目的前提条件 1.1 购买云服务器 我购买的是腾讯云的服务器,第一年享优惠88一年 cpu好像两核的,作为入门级的也算够用了 如果第二年该续费的时候,我记得因为收到备案什么因素的影响,要提前三个月就续费了,第二年续费价格应该是510 对于学…

思科与华为设备中的OSFP配置命令以及部分实例(超详细~~!!)

目录 一、OSPF相关配置命令 1.思科设备配置命令 (1)启动OSPF路由进程 (2)激活参与OSPF路由协议的接口,并且通告结构属于哪个区域的OSPF (3)配置路由器ID (4)配置被动…

苹果再次舍弃3纳米,对ASML是沉重打击,ASML得靠中国救命了

苹果在昨晚发布了新款M2 Pro和M2 Max芯片,这两款芯片都没有采用台积电的3纳米工艺,其实不仅是对台积电的打击,也是对ASML的打击,意味着ASML更先进的第二代EUV光刻机可能面临着没有太大需求的问题。一、ASML的愿望ASML当前的主要利…

day43|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II 1.代码 class Solution { public:int lastStoneWeightII(vector<int>& stones) {int sum 0;for(int i: stones) {sum i;}int t sum;sum sum /2;vector<int>f(sum 1);for (int i 0; i < stones.size(); i) {for (int j …

怎样防止数据怎么泄露了

近年来&#xff0c;各种数据泄露事件越演越烈&#xff0c;数据泄密日益成为企业管理者的梦魇。数据泄密不仅给企业带来严重的直接经济损失&#xff0c;而且还在品牌价值、投资人关系、社会公众形象等多方面造成损害。因此&#xff0c;要想提升企业数据的安全性&#xff0c;就要…

容器虚拟化技术Docker(二)mysql主从配置案例、redis集群搭建及扩容、缩容案例详解

容器虚拟化技术Docker&#xff08;二&#xff09;mysql主从配置案例、redis集群搭建及扩容缩容案例详解 对docker不熟悉的可以参考&#xff1a; 容器虚拟化技术Docker&#xff08;一&#xff09;简介、安装、常见命令、数据卷、安装常规软件 1、Docker安装mysql主从复制 &am…

2023年微软发布的第一个补丁都有什么?

微软于 10 日发布了 2023 年的第一个更新&#xff0c;修复了其Windows操作系统和其他软件中的近 100 个安全漏洞。 2023 年第一个补丁星期二的亮点包括&#xff1a;Windows 中的零日漏洞、美国国家安全局报告的打印机软件缺陷&#xff0c;以及允许未经身份验证的远程攻击者建立…

建木CI自定义节点说明

数据导出导入可以看下 https://gitee.com/jianmu-runners/jianmu-runner-mysq建木节点基于docker 镜像执行 1. 安装 docker & docker-compose 参考 https://blog.csdn.net/pushiqiang/article/details/78682323 https://docs.docker.com/compose/install/other/2.安装&a…

JDK安装与环境变量配置

经验 先使用LightlyLightlyLightly自带的JDKJDKJDK编辑器&#xff0c;进行运行代码&#xff0c;后续学习深入后&#xff0c;再继续探讨JDK的安装&#xff0c;开发大型项目工程时候会自己使用都行啦的回事与打算。 附带JDK安装链接 安装链接: JDK安装链接 总结 慢慢的将JDKJ…

9、Ubuntu安装Tomcat配置部署web

1、安装 Java 这里使用Ubuntu22.04 其他版本也差不多 tomcat是基于Java开发的&#xff0c;安装前需确保已经按照了jdk apt update apt install openjdk-8-jdk 验证是否按照成功 java -version 环境变量 2、安装 Tomcat 下载链接 Tomcat: Apache Tomcat - Apache Tomcat …

Python备份网络设备配置实验-ensp

一、实验简介 实验拓扑 简介 本实验为物理主机(windows电脑)通过物理主机的环回口虚拟网卡与ENSP模拟器中的Cloud建立通信,再与Cloud下面连接的虚拟网络设备通信。从而实现物理主机上面的python脚本抓取ENSP中网络设备的配置信息,并保存在物理主机磁盘指定位置。 本实验…

零入门容器云实战之测试环境介绍、网盘、联系方式

本篇文章主要介绍: 对测试环境的要求介绍一下我的测试环境都有哪些设备&#xff0c;分享一下我在学习中是如何测试的。 1、网盘资源 我已经将相关资源上传到了网盘 零入门容器云网络实战 链接: https://pan.baidu.com/s/1nPLRkAwjItAHmtEU2T1F4g 提取码: rrpd 2、技术交流…

vue3实现一个抽奖小项目

前言 在公司年会期间我做了个抽奖小项目&#xff0c;我把它分享出来&#xff0c;有用得着的可以看下。浏览链接&#xff1a;http://xisite.top/original/luck-draw/index.html项目链接&#xff1a;https://gitee.com/xi1213/luck-draw (欢迎star!)项目截图&#xff1a; 实现目…

UNIAPP学习点滴记录

一、事件处理 1&#xff09;tap和click的区别 在HbuilderX中&#xff0c;两者都是点击时触发事件;不同的是: 1.click是组件被点击时触发&#xff0c;会有约300ms的延迟(内置处理优化了) 2.tap是手指触摸离开时触发&#xff0c;没有300ms的延迟&#xff0c;但是会员事件穿透…

两种分类方法的比较

一个物体既可以按照元素分类法去分类&#xff0c;也可以按照形态分类法去分类。但似乎很难用元素去分类形态&#xff0c;也很难用形态去分类元素。 想用元素分类形态就得加入位置变量。而所谓的位置变量显然是一种空间变量。是粒子在空间中&#xff0c;所以所谓的空间变量似乎…