热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

move_base源码学习

综述这个类调用actionlib::ActionServer接口接受目标,然后将小车导航到目标位置。move_base状态机movebase状态机分为plannin

综述

这个类调用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_。

推荐阅读
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • 本文介绍了解决mysql 5.1启动问题的方法,通过修改my.ini文件中的相关配置,包括innodb_data_home_dir和skip-innodb等,可以解决启动问题。同时还介绍了如何调整内存池来存储metadata信息。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
author-avatar
手机用户2502853443_910
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有