我们需要看的是DWAPlannerROS
类的源码,继承自nav_core::BaseLocalPlanner
。 但是它还用到了base_local_planner
的LatchedStopRotateController
模块,用于latch机制和到达位置后转向。
initialize
原型是void DWAPlannerROS::initialize(std::string name, tf2_ros::Buffer* tf, costmap_2d::Costmap2DROS* costmap_ros)
其实主要是if( !isInitialized())
的部分,直接看里面的内容
1 | ros::NodeHandle private_nh("~/" + name); |
但是搜索发现,DWA的参数基本都在TrajectoryPlannerROS::initialize
里加载。
computeVelocityCommands
根据机器人离目标是否足够接近,路径规划由dwa sampling
或者stop and rotate
负责。
先是全局路径的处理1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22// 开始规划时再次获取位姿
if ( !costmap_ros_->getRobotPose(current_pose_))
{
ROS_ERROR("Could not get robot pose");
return false;
}
// TEB的部分全局路径也叫 transformed_plan,应该是因为下面的getLocalPlan参数也是这个名字
std::vector<geometry_msgs::PoseStamped> transformed_plan;
// 获取全局路径
if ( !planner_util_.getLocalPlan(current_pose_, transformed_plan) )
{
ROS_ERROR("Could not get local plan");
return false;
}
if(transformed_plan.empty())
{
ROS_WARN_NAMED("dwa_local_planner", "Received an empty transformed plan.");
return false;
}
ROS_DEBUG_NAMED("dwa_local_planner", "Received a transformed plan with %zu points.", transformed_plan.size());
上面的planner_util_.getLocalPlan
的内容实际是:1
2
3
4
5
6
7
8
9
10
11
12base_local_planner::transformGlobalPlan(
*tf_,
global_plan_,
global_pose,
*costmap_,
global_frame_,
transformed_plan)
if(limits_.prune_plan)
{
base_local_planner::prunePlan(global_pose, transformed_plan, global_plan_);
}
涉及到了DWA的参数prune_plan
,如果需要剪辑全局路径,就进入base_local_planner::prunePlan
,此函数在goal_funtions.cpp
,一看就是在namespace里。这里不如TEB的剪切全局路径复杂,其实就是把机器人当前位姿身后的部分剪掉,这部分是从路径起点到离位姿的欧氏距离的平方不到1米的点,这个1米已经写死,不能用参数更改,不过并不重要。
updatePlanAndLocalCosts
1 | // update plan in dwa_planner even if we just stop and rotate, to allow checkTrajectory |
1 | void DWAPlanner::updatePlanAndLocalCosts( |