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。

 

3、步骤

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

 

3.1、写类函数

 

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

 

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

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

 

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

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

 

 

planner初始化。

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

初始化BaseGlobalPlanner。

RA*初始化应用。

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

这是RAstar_ros.cpp

把它注册为一个插件(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。

修改在relaxed_astar_planner_plugin.xml

查看插件是否注册成功。

成功注册如上。

修改turtlebot文件。

最后就是测试。

 

 

 

 

 

 

 

 

 

### ROS 全局路径规划器实现与配置 #### 插件机制概述 ROS 的 `navigation` 官方功能包提供了一个灵活的架构来处理全局路径规划。全局路径规划器作为插件存在,允许开发者轻松替换或添加新的算法。这使得可以通过修改 `move_base` 节点中的 `base_global_planner` 参数来指定不同的全局路径规划器[^1]。 #### 默认全局路径规划器选项 默认情况下,ROS 提供了三个预构建的全局路径规划器: - **carrot_planner** - **global_planner** - **navfn** 其中最常用的为 `navfn`,它适用于大多数标准场景下的路径计算需求。 #### 创建自定义全局路径规划器步骤 为了满足特定应用的需求,可以按照如下方式创建一个新的全局路径规划器: 1. 复制现有的全局路径规划器源码作为一个起点; 2. 修改新复制文件夹内的所有命名空间、类名以及函数签名以反映新的名称约定; 3. 编辑 C++ 文件,在继承自基类的基础上重载虚函数 `makePlan()` 来实现具体的逻辑; 4. 更新 package.xml 和 CMakeLists.txt 文件以便正确编译此模块; 5. 注册该插件至 pluginlib 库中并通过 XML 配置文件描述其元数据信息; 6. 在 launch 文件里调整 `move_base` 设置指向这个新建的全局路径规划器实例; ```xml <param name="base_global_planner" value="your_package_name/YourPlannerClassName"/> ``` 7. 测试并验证自定义路径规划器的行为是否符合预期。 #### 示例代码片段展示如何覆盖 makePlan 方法 下面是一个简单的例子展示了怎样在一个派生类里面重新定义 `makePlan()` 函数: ```cpp bool YourCustomGlobalPlanner::makePlan(const geometry_msgs::PoseStamped& start, const geometry_msgs::PoseStamped& goal, std::vector<geometry_msgs::PoseStamped>& plan){ // Custom implementation here... } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值