1Global Planner

ROSglobal planner是基于global_costmap上(产生一个初始的静态地图),更新频率基于update_frequency参数,全局是产生一个较长的路径让机器人从起点(或当前位置)到终点。一个基于网格的算法可以通过A*或者Dijkstra算法来获得一个无碰撞的最短路径,这些算法都在global_planner包里。ROS也提供另外一个global_planner叫做carrot_planner。当前的global_planner应用主要是用于圆形底座那个,当前的global_planner没有考虑机器人的动力学约束和加速度约束。即只能用于完整约束模型。

2Relaxed A*教程

        RA*是一个线性时间版本的A*,主要用来解决大范围的网格地图,它主要通过解决最优或者临近最优通过一个小范围,比传统A*算法时间要少好多。传统A*的代价函数g(n)这个节点要算很多次,而RA*g(n)近似的表示最短的path从起点cell到结点n
ROS全局路径

3、步骤

1)写planner的类函数;(2)部署它作为一个插件(plugin);

3.1、写类函数

    global_planner必须附带在nav_core这个包里,nav_core::BaseGlobalPlanner,从哪里继承过来,写一个新的全局plannerRAstar_ros.h

ROS全局路径

现在来解释下头文件的意义。

ROS全局路径

这些是ROS一些必要的头文件。

ROS全局路径

costmap_2d::Costmap2D类将作为planner的输入地图,这个地图将被planner自动加入到一个插件,即我们不需要通过订阅来获取代价图。ROS全局路径

ROS全局路径ROS全局路径定义命名空间为这个类,RAstar_palnner::RAstarPlannerROS,定义它从nav_core::BaseGlobalPlanner继承。

ROS全局路径

planner初始化。

ROS全局路径

初始化costmap,这个地图将被用于planner。

ROS全局路径

初始化BaseGlobalPlanner。ROS全局路径

RA*初始化应用。

ROS全局路径

这个函数是最终的规划,它储存向量std::vector<geometry_msgs::PoseStamped>&plan,这个方式将自动通过插件(plugin)发布到ROS的topic里。

这是RAstar_ros.cpp

ROS全局路径

ROS全局路径

ROS全局路径

ROS全局路径

ROS全局路径

把它注册为一个插件(plugin)。

ROS全局路径

这是个必要的库。

对与makePlan函数,起始点和目标点将从坐标系的x,y转换到地图中的cell。(即在一个50x50的地图中,在地图编号中是这样编号的,在第一行50个cell从左到右依次为1,2,3,4...50,第二行第一个为51,依次下去,这就是栅格地图的cell编号)。最后地图将cell转换为x,y通过函数(plan.push_back(pose))。这个得到的路径将通过ROS topic nav_msgs/Path。


ROS全局路径

ROS全局路径在CMakelists.txt中添加。

ROS全局路径

这让class RAstar_planner::RAstarPlannerROS注册为move_base一个插件,nav_core::BaseGlobalPlanner。

ROS全局路径

修改在relaxed_astar_planner_plugin.xml

ROS全局路径

ROS全局路径ROS全局路径

查看插件是否注册成功。

ROS全局路径

成功注册如上。

ROS全局路径

修改turtlebot文件。

ROS全局路径

最后就是测试。








相关文章: