1 | private_nh.param("base_local_planner", local_planner, std::string("base_local_planner/TrajectoryPlannerROS")); |
local planner
根据附近的障碍物进行躲避路线规划,只处理局部代价地图中的数据. 是利用base_local_planner
包实现的。该包使用Trajectory Rollout和Dynamic Window approaches算法计算机器人每个周期内应该行驶的速度和角度。
对于全向机器人来说,也就是存在x方向的速度,y方向的速度,和角速度。DWAlocalplanner
确实效率高一点。但是如果是非全向机器人,比如说只存在角速度和线速度,trajectorylocalplanner
会更适用一点。
base_local_planner
这个包通过地图数据,通过算法搜索到达目标的多条路经,利用一些评价标准(是否会撞击障碍物,所需要的时间等等)选取最优的路径,并且计算所需要的实时速度和角度。
其中,Trajectory Rollout 和Dynamic Window approaches算法的主要思路如下:
- 采样机器人当前的状态(dx,dy,dtheta);
- 针对每个采样的速度,计算机器人以该速度行驶一段时间后的状态,得出一条行驶的路线。
- 利用一些评价标准为多条路线打分。
- 根据打分,选择最优路径。
- 重复上面过程。
发送导航目标点后,首先在rviz上出现一个绿色全局路径,机器人开始行走,同时还有一个蓝色的本地路径,只是很小,不容易观察到,示意图如下:
现在机器人正在按照规划的全局路径行走,地图中突然增加了一个障碍物,它不会进入全局代价地图,但会在局部代价地图中创建.所以全局路径开始没有改变,当它快接近障碍物时,局部路径检测到了它,进而会重新规划一个全局路径,这样避开了障碍物. 局部规划器把全局路径分成几部分,再执行每一部分,生成控制命令。
话题
机器人行走时,在rviz上显示全局路径的相关话题是/move_base/DWAPlannerROS/global_plan
,属于Global Map。局部规划器把全局路径的一部分发布到这个话题,代码是在DWAPlannerROS::computeVelocityCommands
——DWAPlannerROS::publishGlobalPlan
rviz中显示局部路径的相关话题是/move_base/DWAPlannerROS/local_plan
,属于Local Map。一旦局部路径计算出来,它就会发布到这个话题,代码是在DWAPlannerROS::computeVelocityCommands
——DWAPlannerROS::publishLocalPlan
常用算法
ROS的局部规划器的接口plugin类为nav_core::BaseLocalPlanner
,常用的包有4种:
- base_local_planner - 提供了 Dynamic Window Approach(DWA)和Trajectory Rollout方法来局部控制;
- dwa_local_planner - 模块化DWA方法应用,相比base_local_planner具有更多的恢复机制、更便于理解的接口和针对全向运动机器人更灵活的Y轴变量控制;
- teb_local_planner