navfn规划器假定机器人是圆形,并会在起点到终点之间寻找代价最小的规划。它的导航功能支持了Dijkstra和A*算法。此外,navfn也提供了ROS封装接口供调用,也继承了接口nav_core::BaseGlobalPlanner。
1 概述
本package实现了快速内插值导航功能,使用navfn::NavFn 类给机器人底座创建导航规划。navfn::NavfnROS对象是navfn::NavFn类的ROS封装,其继承了nav_core包中接口nav_core::BaseGlobalPlanner。navfn::NavfnROS 对象在move_base中被作为全局规划器插件使用。
2 NavfnROS
navfn::NavfnROS是navfn::NavFn的ROS封装,导出了可用的ROS接口,可以在初始化时指定的ROS命名空间使用,继承了nav_core::BaseGlobalPlanner接口。
下面是创建navfn::NavfnROS 对象的一个例子:
#include <tf/transform_listener.h>
#include <costmap_2d/costmap_2d_ros.h>
#include <navfn/navfn_ros.h>
...
tf::TransformListener tf(ros::Duration(10));
costmap_2d::Costmap2DROS costmap("my_costmap", tf);
navfn::NavfnROS navfn;
navfn.initialize("my_navfn_planner", &costmap);
2.1 API Stability
- The ROS API is stable
- The C++ API is stable
2.2 ROS API
2.2.1 Published Topics
~<name>/plan ( nav_msgs/Path)- 通过navfn计算的上一个最新规划, 规划器每次都会计算一条新路径并发布。
2.2.2 Parameters
~<name>/allow_unknown ( bool, default: true)- 指定是否允许navfn在unknown空间创建规划。 NOTE: if you are using a layered costmap_2d costmap witha voxel or obstacle layer, you must also set the track_unknown_space param for that layer to be true, or it will convert all your unknown space to free space (which navfn will then happily go right through).
- 指定可选窗口的x大小以限定规划器工作空间。This can be useful for restricting NavFn to work in a small window of a large costmap.
- 指定可选窗口的y大小以限定规划器工作空间。 This can be useful for restricting NavFn to work in a small window of a large costmap.
- 定义规划器目标点公差范围。 NavFn will attempt to create a plan that is as close to the specified goal as possible but no further thandefault_tolerance away. New in navigation 1.3.0
- 指定是否对navfn通过PointCloud2计算的potential区域可视化。 New in navigation 1.3.1
2.3 C++ API
navfn::NavfnROS继承了nav_core::BaseGlobalPlanner,细节请看 NavfnROS C++ Documentation
3 NavFN
navfn::NavFn 额提供了上述导航功能,且可以免费使用,但是请记住我们不保证其API是稳定的。
3.1 API Stability
-
C++ API不稳定. It is subject to change at any time.
3.2 C++ API
-
navfn::NavFn类的C++ API请参考: NavFn Documentation. 此外,请记住C++ API不保证是稳定的
4 Reference
Rationale of Dijkstra being used in navfn instead of A*