ROS全局路径

1、Global Planner

ROS的global 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全局路径_第1张图片

 

3、步骤

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

 

3.1、写类函数

 

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

ROS全局路径_第2张图片

 

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

ROS全局路径_第3张图片

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

 

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

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

 

 

planner初始化。

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

初始化BaseGlobalPlanner。ROS全局路径_第4张图片

RA*初始化应用。

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

这是RAstar_ros.cpp

ROS全局路径_第5张图片

ROS全局路径_第6张图片

ROS全局路径_第7张图片

ROS全局路径_第8张图片

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

这是个必要的库。

对与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。

 

在CMakelists.txt中添加。

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

ROS全局路径_第9张图片

修改在relaxed_astar_planner_plugin.xml

查看插件是否注册成功。

ROS全局路径_第10张图片

成功注册如上。

修改turtlebot文件。

ROS全局路径_第11张图片

最后就是测试。

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(ros)