综述

这个类调用actionlib::ActionServer接口接受目标,然后将小车导航到目标位置。
move_base状态机
movebase状态机分为planning,controlling,clearing 和default。
planning是指接受新目标与进行全局规划的整个过程,cotrolling是指调用局部规划器计算机器人速度的过程,clearing是指利用用户定义的行为进行recovery的过程。
状态机的关系图:

move_base类

构造函数MoveBase ():
先定义了一个actionserver,收到目标之后调用executeCb
调用ros参数服务器获得参数。设置三个plan(planner,controller,latest)的缓冲池。创建规划器线程planner_thread_,在该线程中运行planner_thread()
然后初始化global costmap和local cost map。初始化global/local planner。然后开始更新地图。然后声明一个makeplan的ros服务器、清除地图的服务器。最后启动actionserver

executeCb():
首先调用tf将收到的目标变换到全局costmap下,然后锁定规划器互斥体,设定规划目标、然后启动规划器(改变规划器条件变量runplanner为true使规划线程中的makeplan开始工作),启动全局局部costmap,进入一个while循环。while循环中:根据actionserver状态不断接受新目标,并转换到全局costmap下,锁住规划器互斥体,给定规划目标,并发布该目标;判断全局costmap坐标系是否改变,并变换goalpose;执行executeCycle(goal, global_plan)。

executeCycle(goal, global_plan):
首先锁住配置互斥体,获得机器人在全局中的位姿,actionserver发布该位姿。检查局部costmap是否是当前的,否则返回零速度。如果有新的全局规划,则将该规划传递至局部规划器tc_->setPlan(*controller_plan_)。然后根据move_base状态机的状态判断如何操作,switch判断movebse处于什么状态,规划状态下设置runplanner为true,控制状态下就调用局部规划器计算速度,清除状态下则尝试用户定义的恢复行为。

planner_thread():
锁住规划互斥体planner_mutex_,然后进入while循环。在while循环中:若若runplanner为假,则planner_cond_.wait(lock),这里意思是解锁当前互斥体,此线程进入等待,等到别的线程里面出现cond.notify_one()后,此线程再次锁住互斥体。然后调用makeplan做全局规划。若得到全局规划的路径,然后将控制机状态设置为controlling。

makeplan()
首先判断是否有地图,没有地图直接返回false,然后获得机器人的当前位姿,然后调用全局规划器插件的planner_->makePlan(start, goal, plan)进行全局规划。

void MoveBase::goalCB():publish 目标,更改来自action message的 PoseStamped的时间戳 and re-sending to the server。

planService():(rosservice的回调函数)
当确认actionserver被激活,并且costmap存在时,设置机器人的起点,更新costmapWindow,直接根据指定终点进行全局规划器规划planner_->makePlan(),若无法生成有效规划,则在该终点附近允许范围内一点作为目标进行planner_->makePlan(),将得到的一系列规划点返回到response中。

getRobotPose()
首先定义一个在机器人本体坐标系tf2::transform类型的位姿(其实就是原点),然后转换成geometry_msgs::Stampedpose的形式,然后利用tf2_ros::Buffer类的transform函数,将此位姿转换到全局坐标系下。

私有属性:

  • 导航目标:actionserver,planner(指向全局规划器指针),global_pose,planner_goal_
  • 地图:planner_costmap_ros,controller_costmap_ros,各种radius
  • 坐标系及变换:robot_base_frame,global_frame,tf
  • 规划控制:planner_frequency_,controller_frequency_
  • rosPublisher:current_goal_pub_,vel_pub_,action_goal_pub_
  • rosSubscriber:goal_sub_(订阅rivz等软件发布的目标),
  • ros::ServiceServer:make_plan_srv_,clear_costmaps_srv_
  • 插件加载器:bgp_loader_(全局规划加载),blp_loader_(局部规划加载),recovery_loader_
  • 规划结果:planner_plan_,latest_plan_,controller_plan_(都是vector类型)
  • 线程:planner_mutex_(递归互斥体),planner_cond_(条件变量),planner_thread_(线程),configuration_mutex_(递归互斥体),
  • bool量控制:shutdown_costmaps_,clearing_rotation_allowed_,recovery_behavior_enabled_,runPlanner_,new_global_plan_,p_freq_change_,c_freq_change_。

move_base源码学习相关推荐

  1. move_base源码解析

    序言 好久没写博客了,最近把move_base源码包研究了一下,顺便以写博客的形式总结一下,同时里面掺杂了自己的心得体会,各路大神如果有不同的简介可以私下评论. 1 move_base_node.cp ...

  2. Shiro源码学习之二

    接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws Authent ...

  3. Shiro源码学习之一

    一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId&g ...

  4. mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

    前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...

  5. vue实例没有挂载到html上,vue 源码学习 - 实例挂载

    前言 在学习vue源码之前需要先了解源码目录设计(了解各个模块的功能)丶Flow语法. src ├── compiler # 把模板解析成 ast 语法树,ast 语法树优化,代码生成等功能. ├── ...

  6. 2021-03-19Tomcat源码学习--WebAppClassLoader类加载机制

    Tomcat源码学习--WebAppClassLoader类加载机制 在WebappClassLoaderBase中重写了ClassLoader的loadClass方法,在这个实现方法中我们可以一窥t ...

  7. jQuery源码学习之Callbacks

    jQuery源码学习之Callbacks jQuery的ajax.deferred通过回调实现异步,其实现核心是Callbacks. 使用方法 使用首先要先新建一个实例对象.创建时可以传入参数flag ...

  8. JDK源码学习笔记——Integer

    一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...

  9. DotText源码学习——ASP.NET的工作机制

    --本文是<项目驱动学习--DotText源码学习>系列的第一篇文章,在这之后会持续发表相关的文章. 概论 在阅读DotText源码之前,让我们首先了解一下ASP.NET的工作机制,可以使 ...

最新文章

  1. idea调试debug技巧_这几个IDEA高级调试技巧,用了都说好!
  2. Linux服务器运行环境搭建(二)——Redis数据库安装
  3. Linux Shell脚本_禁用selinux
  4. 二叉树的先序、中序、后续遍历【Java】
  5. 【script】python 解析 Windows日志(python-evtx)
  6. 力扣——罗马数字转整数
  7. 软件的黑盒和白盒分析方法
  8. 北京药监局考试计算机操作,考科一电脑操作
  9. Meta 开源早期 AI 翻译工具支持 200 种语言
  10. 2021年全球及中国三元前驱体行业现状及竞争格局分析,基于海外新能源汽车发展,我国是最大出口国「图」
  11. Neo4j 学习笔记 1:属性图
  12. 【操作系统】简易文件系统设计
  13. linux 基本命令及用法列子
  14. 可口可乐市场调查失败的原因_案例:新可口可乐,市场调研,失误在哪里? -...
  15. 给 Linux 系统“减肥”,系统垃圾清理
  16. xdebug 不需要配置 idekey
  17. 复化梯形公式、复化Simpon公式、Romberg算法(python)
  18. 台式计算机键盘驱动,新扬天电脑所配USB键盘功能键驱动问题注意事项
  19. 幻璃镜服务器维护中,仙剑奇侠传幻璃镜6.22更新_仙剑奇侠传幻璃镜6月22日更新维护公告_快吧手游...
  20. maven wagon ftp ssh

热门文章

  1. php5时区,PHP5 时区设置方法详解
  2. openwrt路由器打印机服务器设置_openwrt路由器打印机服务器设置_TP-Link无线路由器打印机设置指南...
  3. 德国Tesla的招聘过程“糟透了”,混乱又自大
  4. 大疆2018校招笔试题
  5. 快速排序_查找第k小元素
  6. VMOS+小黄鸟无root抓包(解决抓包无网络问题)(附工具)
  7. TensorFlow 2019
  8. 文墨绘学:大型“100元学英语”市场操作方案
  9. 记忆网络之open-domain QA 应用
  10. 嵌入式linux远程桌面,嵌入式开发配置远程桌面和FTP