ROS : Navigation - move_base 功能包源码分析

move_base 的整体框架

move_base 是一个开源 2D 移动机器人导航包,实现机器人自主导航到给定目标点的功能。 move_base 提供配置、运行以及跟导航栈交互的接口,基本框架如下图所示,其核心包含了 3 大功能模块,并以插件的形式加载到 move_base 中:

move_base 框架

用户可以自定义任意的全局路径规划器、局部路径规划器,只需要将其跟 nav_core::BaseGlobalPlannernav_core::BaseLocalPlanner 接口对接上即可。这两个接口的实现在 nav_core 包

move_base 的输入输出

move_base 的 输入是一个 goal (geometry_msgs/PoseStamped)输出是一系列 command (geometry_msgs/Twist) 。详细一点来说,就是在已知环境地图和机器人在地图中位置的情况下,利用地图和传感器数据处理得到的 global costmap 和 local costmap ,调用全局路径规划器得到一条全局路径,调用局部路径规划器使机器人在移动过程中能在大致沿着路径前进并动态规避障碍物,整个行进过程中还要处理一部分异常情况即 recovery_behaviors 。

move_base 功能包中的话题和服务

move_base 通过订阅 /move_base_simple/goal 或者 /move_base/goal 话题消息接收目标点。发布一个目标点的两种方式示例如下:

root@eln-pc:~/catkin_ws# rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped "
header:
  seq: 0
  stamp:
    secs: 0
    nsecs: 0
  frame_id: "map"
pose:
  position:
    x: 2.0
    y: -1.0
    z: 0.0
  orientation:
    x: 0.0
    y: 0.0
    z: 0.471599513115
    w: 0.881812848188
"
root@eln-pc:~/catkin_ws# rostopic pub /move_base/goal move_base_msgs/MoveBaseActionGoal "
header:
  seq: 0
  stamp:
    secs: 0
    nsecs: 0
  frame_id: ''
goal_id:
  stamp:
    secs: 0
    nsecs: 0
  id: ''
goal:
  target_pose:
    header:
      seq: 0
      stamp:
        secs: 0
        nsecs: 0
      frame_id: "map"
    pose:
      position:
        x: 2.0
        y: -1.0
        z: 0.0
      orientation:
        x: 0.0
        y: 0.0
        z: 0.474801462745
        w: 0.880092933147
"

move_base 中各函数的主要作用

  • MoveBase :构造函数
  • goalCB :将 goal 转换为 move_base_msgs::MoveBaseActionGoal 类型
  • clearCostmapWindows :清空机器人周围的正方形空间
  • clearCostmapsService :将 costmap 重置为 unknow
  • planService :服务 make_plan 的回调函数。接受 Service 的消息后,开始路径规划,得到 global_plan 的路径,跟 as_ 得到的 action 一样,都会 make_plan ,但是不做局部路径规划(只是提供了个全局路径规划的接口)
  • ~MoveBase :析构函数
  • makePlan :获取机器人的位姿作为起点,然后调用全局规划器的 makePlan 返回规划路径,存储在 planner_plan_
  • publishZeroVelocity :发布速度为 0 的 cmd_vel
  • isQuaternionValid :验证是否是四元数
  • goalToGlobalFrame :将 goal 转化为 geometry_msgs::PoseStamped 格式的 goal_pose_msg
  • wakePlanner :通过 boost thread 的条件变量 planner_cond_ 唤醒线程 planThread
  • planThread :是全局路径规划的线程,调用全局路径规划获取路径,同时保证规划的周期性以及规划超时清除 goal
  • executeCb :是 move_base 接收到新目标时调用的函数,执行局部路径规划和导航
  • distance :计算 p1 和 p2 两个点之间的距离
  • executeCycle :是局部路径规划的核心函数
  • loadRecoveryBehaviors :加载 Recovery 的行为
  • loadDefaultRecoveryBehaviors :加载默认的 Behaviors
  • resetState

move_base 中各函数

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
move_base功能ROS中常用的导航功能,它封装了许多导航相关的算法和工具,提供了一个基于全局和局部路径规划的导航系统。下面是move_base功能源码封装。 1. move_base.cpp move_base.cpp是move_base功能的主要源文件,它含了move_base节点的主函数和节点类的定义。该文件首先初始化了ROS节点,然后创建了一个MoveBase类的对象,开始执行节点循环,等待接收导航目标,执行路径规划和控制机器人运动。 2. move_base.h move_base.h是MoveBase类的头文件,含了该类的成员变量和函数定义。MoveBase类是move_base节点的核心,它负责整个导航系统的控制和协调,括全局路径规划、局部路径规划、机器人控制等功能。 3. global_planner.h global_planner.h是全局路径规划器的头文件,含了GlobalPlanner类的定义。该类负责实现全局路径规划算法,根据机器人当前位置和导航目标,生成一条从起点到终点的路径。 4. global_planner.cpp global_planner.cpp是全局路径规划器的源文件,含了GlobalPlanner类的成员函数的实现。该文件实现了A*算法和Dijkstra算法,用于全局路径规划。 5. local_planner.h local_planner.h是局部路径规划器的头文件,含了LocalPlanner类的定义。该类负责实现局部路径规划算法,根据机器人当前位置和全局路径,生成一条从机器人当前位置到全局路径上某一点的局部路径。 6. local_planner.cpp local_planner.cpp是局部路径规划器的源文件,含了LocalPlanner类的成员函数的实现。该文件实现了DWA算法,用于局部路径规划。 7. costmap_2d.h costmap_2d.h是代价地图的头文件,含了Costmap2D类的定义。该类负责管理代价地图,括读取、更新和查询代价地图。 8. costmap_2d.cpp costmap_2d.cpp是代价地图的源文件,含了Costmap2D类的成员函数的实现。该文件实现了代价地图的读取、更新和查询功能。 9. recovery_behaviors.h recovery_behaviors.h是恢复行为的头文件,含了RecoveryBehaviors类的定义。该类负责实现机器人遇到异常情况时的恢复行为,例如旋转、后退等操作。 10. recovery_behaviors.cpp recovery_behaviors.cpp是恢复行为的源文件,含了RecoveryBehaviors类的成员函数的实现。该文件实现了机器人遇到异常情况时的恢复行为。 以上是move_base功能的主要源码封装,它们共同实现了一个完整的导航系统,可以用于控制机器人自主导航。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值