- 在我的程序里,从Service的客户端(比如网页端)选择一个目标点后,服务端获得目标的位姿,传递给需要的线程.
- 初始化一个Action的客户端
SimpleActionClient
的指针g_ac_ptr:
1 | actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction>* g_ac_ptr=NULL; |
- 发送目标:
1 | move_base_msgs::MoveBaseGoal goal; |
sendGoal
会将目标点发送到move_base
节点进行处理,进而会发布话题move_base/goal
,消息类型为move_base_msgs/MoveBaseActionGoal
,用于存储导航的目标位置数据
我没有用到/move_base_simple/goal
话题,其实平时应该用这个,比如:1
2rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped \
'{ header: { frame_id: "base_link" }, pose: { position: { x: 1.0, y: 0, z: 0 }, orientation: { x: 0, y: 0, z: 0, w: 1 } } }'
- Action的服务端在
MoveBase
的构造函数:
1 | // 回调函数是 MoveBase::executeCb |
MoveBase::executeCb
函数在move_base
693行,过程太复杂,步骤大致如下:
- 验证目标位姿的欧拉角是否合理
- 目标位姿转换为全局frame中的位姿
1 | //we have a goal so start the planner |
- 发布话题
move_base/current_goal
,与/move_base/goal
的target_pose部分只有seq的不同
调用executeCycle
进行local plan,发布cmd_vel的topic,根据小车处于的状态,进行相应的实现(会进行plan,control,clear obstacle)
1 | enum MoveBaseState { |
DWAPlannerROS和TrajectoryPlannerROS都继承了 nav_core::BaseLocalPlanner
1 | DWAPlannerROS::computeVelocityCommands |
MoveBase::executeCycle调用了DWAPlannerROS::computeVelocityCommands