eband_local_planner源码架构分析

ROS 同时被 3 个专栏收录
13 篇文章 1 订阅
3 篇文章 0 订阅
8 篇文章 0 订阅

一、文件结构(代码组成)

由5部分组成,第一部分负责数据类型的转换;第二部分负责具体的局部规划的具体实现,是核心代码;第三部分是move_base局部规划器和本局部规划器具体实现的中间转换接口;第四部分是将局部规划转成速度(cmd_vel或twist_cmd)控制指令;第五部分是RVIZ可视化设置,方便调试;

程序流程:eband_local_planner_ros ----->eband_local_planner ----->eband_trajectory_controller;

move_base.cpp中直接调用这些函数(继承nav_core::BaseLocalPlanner),最终通过方法computeVelocityCommands获得运动控制指令cmd_vel或者,并发布出去!那么具体的cmd_vel是如何得出来的呢?

二、类之间的关系

step1:move_base与eband_local_planner_ros

move_base.cpp调用局部规划算法时,调用的对象是boost::shared_ptr<nav_core::BaseLocalPlanner> tc_

controller_plan_ = latest_plan_;
.......
tc_->setPlan(*controller_plan_);

 

通过使用对象 tc_的成员函数(方法)setPlan,将全局规划器得到的latest_plan_传递到局部规划器中,即本案例中的eband_local_planner_ros;

对于本package,这个对象的类型就是eband_local_planner::EBandPlannerROS,该类是nav_core::BaseLocalPlanner的派生类;

step2:eband_local_planner_ros与eband_local_planner 

eband_local_planner_ros.cpp调用eband_local_planner.cpp,是通过声明对象  boost::shared_ptr<EBandPlanner> eband_;

该智能指针的数据类型EBandPlanner,是eband_local_planner.h中定义的类;

// set plan - as this is fresh from the global planner robot pose should be identical to start frame
if(!eband_->setPlan(transformed_plan_))   //transformed_plan_是由controller_plan_转换而来

 

通过使用对象eband_的成员函数(方法)setPlan,将eband_local_planner_ros得到的transformed_plan_传递到eband_local_planner ,那么eband_local_planner 做了这么工作?看下图大致能知道,它主要工作是将plan转换成了band(convertPlanToBand),同时band又会反向影响plan(convertBandToPlan);其次还有优化band,插入/删除bubble等;

step3:eband_local_planner_ros与eband_trajectory_controller

eband_local_planner_ros .cpp调用eband_trajectory_controller.cpp,boost::shared_ptr<EBandTrajectoryCtrl> eband_trj_ctrl_;

该智能指针的数据类型EBandTrajectoryCtrl,是eband_trajectory_controller.h中定义的类;

 

实现计算cmd_vel是通过调用对象eband_trj_ctrl_,boost::shared_ptr<EBandTrajectoryCtrl> eband_trj_ctrl_,eband_trj_ctrl_是类EBandTrajectoryCtrl的对象,在初始化(initialize)时被创建。

// create the according controller
        eband_trj_ctrl_ = boost::shared_ptr<EBandTrajectoryCtrl>(new EBandTrajectoryCtrl(name, costmap_ros_));

在将eband_local_planner_ros与eband_trajectory_controller关联之前,需要进行一些准备工作:

1.将eband_local_planner 中得到的band传递到eband_trajectory_controller中,这些是通过以下函数实现:(即eband_local_planner 与eband_trajectory_controller的关联)

// get current Elastic Band and
      eband_->getBand(current_band);
      // set it to the controller
      if(!eband_trj_ctrl_->setBand(current_band))
      {
        ROS_DEBUG("Failed to to set current band to Trajectory Controller");
        return false;
      }

2.将当前eband_local_planner_ros速度控制数据base_odom_ 传递给eband_trajectory_controller中速度控制数据odom_vel_;

 // set Odometry to controller
      if(!eband_trj_ctrl_->setOdometry(base_odom_))
      {
        ROS_DEBUG("Failed to to set current odometry to Trajectory Controller");
        return false;
      }

准备工作之后核心工作,通过使用对象的成员函数(方法)getTwist,得到速度控制指令cmd_vel,即在源码中的cmd_twist;

// get resulting commands from the controller
      geometry_msgs::Twist cmd_twist;
      if(!eband_trj_ctrl_->getTwist(cmd_twist, goal_reached_))
      {
        ROS_DEBUG("Failed to calculate Twist from band in Trajectory Controller");
        return false;
      }

 

以上即为eband_local_planner获取全局规划器中的latest_plan_并将其转换为具体的速度控制指令cmd_twist的过程!!!

 

总结:

程序流程:eband_local_planner_ros ----->eband_local_planner ----->eband_trajectory_controller对应的核心函数调用关系;

boost::shared_ptr<nav_core::BaseLocalPlanner> tc_即boost::shared_ptr<eband_local_planner::EBandPlannerROS> tc_;

准备工作:

 

 

 

转换工作:

 

最后附上:eband_local_planner的论文《Elastic_Bands_Connecting_Path_Planning and Robot Control》

 

 

 

 

 

 

  • 3
    点赞
  • 1
    评论
  • 8
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 1 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Amos_Lee1987

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值