movebase导航和地图数据的使用 - 4 movebase 如何处理target请求

本文详细介绍了ROS MoveBase在处理目标请求时的内部工作流程,包括从接收到目标消息、转发到action server、执行回调、规划路径、更新状态以及驱动底座的具体步骤。涉及的关键组件包括SimpleActionServer、NavfnROS全球规划器和DWAPlannerROS本地规划器。

1. 第三方向/move_base_simple/goaltopic发送消息,消息包含一个新的目标=MoveBase::goalCB函数响应。



2. MoveBase::goalCB/move_base/goal转发消息。

我们有理由相信。向/move_base/goal发送的消息会导致actionserver的相应callback被调用

因为movebase建立了一个actionServer:MoveBaseActionServer, (其实是SimpleActionServer)而该server的初始化代码(action_server_imp.h中的voidActionServer<ActionSpec>::initialize())函数中可以发现,actionServer自己会监听”goal”topic,上的事件,当有新的goal来到时,会调用内部的callbackSimpleActionServer<ActionSpec>::goalCallback,它设置标记有了新的goal,然后其内部的SimpleActionServer<ActionSpec>::executeLoop()循环在检查到有新的goal后,才会调用我们传递给该server的用户callback函数execute_callback_(goal);新设定的goal会导致SimpleActionServer<ActionSpec>::executeLoop里面调用MoveBase::executeCb。且是另一个不同于node的线程调用该callback.而且该线程自己是一个loop,不断检查是否有新的goal被设置,如果被设置就调用该callback.



3.MoveBase::executeCbmove_base_goal)被触发,运行于一个actionServer建立的独立线程里

这个线程是SimpleActionServer<ActionSpec>::SimpleActionServer里面建立的,simple_action_server_imp.h中,

execute_thread_ = newboost::thread(boost::bind(&SimpleActionServer::executeLoop,this));

move_base_goal坐标变幻成global坐标,并保存到planner_goal_

通知planner_cond_信号量,唤醒planthread,告诉它新来了一个goal,需要从新进行plan的计算。

具体如何实现newgoal覆盖老的goal的逻辑我没有时间看了。

但是可以确定功能上的执行逻辑顺序。



4. MoveBase::planThread被唤醒,根据得到的新的goalplanner_goal_调用makePlan得到一个新的plan,并保存到planner_plan_里。然后更新到latest_plan_里。并将状态更新成CONTROLLING

这里调用makeplan得到一个新的plan实际上是调用globalplannermakePlan.Global plannernavfn/NavfnROS



5.MoveBase::executeCb继续执行,调用executeCycle作具体的驱动底座的工作。注意executeCb运行于actionserver建立的一个独立线程里面,所以底座的具体驱动工作,又一个独立于movebase主线程的actionserver线程执行。



6. bool MoveBase::executeCycle(geometry_msgs::PoseStamped&goal, std::vector<geometry_msgs::PoseStamped>&global_plan)工作如下:

先得到当前的robot位置,然后以feedback方式发送出去,通知actionServer的使用者。

如果发现拿到一个新的plan,就调用localplannersetPlan设置给localplanner

然后判断当前的状态,如果是CONTROLLING,那么就判断是否已经到了终点,如果没有到,就localplanner计算速度命令computeVelocityCommands(),然后发送给cmd_veltopic. Local plannerDWAPlannerROS



Note:NavfnRosDWAPlannerRos分别继承自BaseGlobalPlannerBaseLocalPlanner,实现了父类接口,并且以plugin的形式通过classloader加载,使得他们可以方便的被替换。他们分别封装了NavFnDWAPlanner



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值