前言
move_base作为navigation包下的导航实现,集成了局部地图、局部运动规划、全局地图、全局路径规划四个模块。本文着重关注move_base默认使用的全局路径规划方法。
1
如果launch文件调用move_base时,没有指定参数 base_global_planner。
例如(turtlebot3包下,turtlebot3_navigation对导航功能的实现,只指明了base_local_planner,即局部导航方法)
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />
<rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="global_costmap" />
<rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="local_costmap" />
<rosparam file="$(find turtlebot3_navigation)/param/local_costmap_params.yaml" command="load" />
<rosparam file="$(find turtlebot3_navigation)/param/global_costmap_params.yaml" command="load" />
<rosparam file="$(find turtlebot3_navigation)/param/move_base_params.yaml" command="load" />
<rosparam file="$(find turtlebot3_navigation)/param/dwa_local_planner_params_$(arg model).yaml" command="load" />
<remap from="cmd_vel" to="$(arg cmd_vel_topic)"/>
<remap from="odom" to="$(arg odom_topic)"/>
<param name="DWAPlannerROS/min_vel_x" value="0.0" if="$(arg move_forward_only)" />
</node>
</launch>
一个指明了局部规划方法与全局规划方法的例子:
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<rosparam file="config/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="config/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="config/local_costmap_params.yaml" command="load" />
<rosparam file="config/global_costmap_params.yaml" command="load" />
<rosparam file="config/teb_local_planner_params.yaml" command="load" />
<param name="base_global_planner" value="RAstarPlannerROS"/>
<param name="planner_frequency" value="1.0" />
<param name="planner_patience" value="5.0" />
<param name="base_local_planner" value="teb_local_planner/TebLocalPlannerROS" />
<param name="controller_frequency" value="5.0" />
<param name="controller_patience" value="15.0" />
<param name="clearing_rotation_allowed" value="false" />
</node>
2
基于下move_base包中代码,找到了默认全局路径规划的方法——navfn/NavfnROS。
// navigation/move_base/src/move_base.cpp
private_nh.param("base_global_planner", global_planner, std::string("navfn/NavfnROS"));
该规划方法具体实现在 navigation/navfn中,标志在文件 navigation/navfn/bgp_plugin.xml中
<class name="navfn/NavfnROS" type="navfn::NavfnROS" base_class_type="nav_core::BaseGlobalPlanner">
该方法的核心调用在move_base.cpp下
// 函数 MoveBase::makePlan()下
planner_->makePlan(start, goal, plan)
3 关于navfn
参考 http://wiki.ros.org/navfn
五个参数
~/allow_unknown (bool, default: true) :是否将未知空间当成自由空间进行规划
~/planner_window_x (double, default: 0.0)
~/planner_window_y (double, default: 0.0)
~/default_tolerance (double, default: 0.0) 所允许的规划与目标点之间的误差
~/visualize_potential (bool, default: false)
使用方法
内部实现了优化的A*,但代码实际上把这一步注释掉了;
采用的实际是 dijkstra 算法。