手把手教你将A*算法作为全局路径规划器应用于ROS

本文详细介绍了如何将A*算法应用于ROS的全局路径规划器。从创建ROS工作空间、编写Astar.cpp/h文件,到注册插件、修改CMakeLists.txt,再到生成XML描述文件和package.xml的更新,一步步手把手教学,最终实现自定义规划器的调用与使用。

未经作者同意禁止转载

首先创建ROS环境:

mkdir -p aster_ws/src

cd aster_ws/src

catkin_init_workspace

cd ..

catkin_make

第一步:创建功能包并添加依赖:

cd src

catkin_create_pkg astar_planner nav_core roscpp rospy std_msgs pluginlib

第二步:把自己写的 astar.cpp 和 astar.h 文件放进功能包的src文件中

astar.cpp 和 astar.h 源码我已经上传到我的优快云

白嫖链接:为自己打造 a 世界 / Aster · GitCode

第三步:把自己写的全局规划器注册为一个插件(已在源码中体现),在astar.cpp文件中加入以下代码:

记住Astar_planner::AstarPlannerROS,分别是代码的命名空间和类名,后面将多次出现,不能出错。

PLUGINLIB_EXPORT_CLASS(Astar_planner::AstarPlannerROS, nav_core::BaseGlobalPlanner)

第四步:修改功能包的CMakeLists.txt文件

catkin_package(

INCLUDE_DIRS include

# LIBRARIES Astar_planner

CATKIN_DEPENDS nav_core pluginlib roscpp rospy std_msgs

# DEPENDS system_lib

)

 

add_library(Astar_planner_lib

     src/astar.cpp

)

第五步:编译功能包,Aster/devel/lib下会生成libAstar24_planner_lib.so文件

在aster_ws目录下编译:

第六步:为我们的规划器写⼀个.xml描述⽂件,文件名Astar_planner.xml

在aster_planner目录下新建文件:

touch Aster_planner.xml

Aster_planner.xml文本内容如下,一定要记住名字,前面出现过哦name="Astar_planner/AstarPlannerROS",这个将是你调用插件时的名字

<library path="lib/libAstar_planner_lib">
   <class name="Astar_planner/AstarPlannerROS" type="Astar_planner::AstarPlannerROS" base_class_type="nav_core::BaseGlobalPlanner">
      <description>This is a global planner plugin by iroboapp project.</description>
    </class>
</library>

第七步:修改package.xml⽂件,在最后面包含刚刚写的.xml文件


  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->
    <nav_core plugin="${prefix}/Astar_planner.xml" />
  </export>
</package>

 此时路径规划器已经写完。

注意:在其他窗口调用时,一定要 source 这个ROS包的环境变量

全局规划器调用过程:

调用move_base功能包时,通过参数加载自定义的全局规划器

<launch>

    <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
        
        <!-- 加载自己写的全局规划器 -->
        <param name="base_global_planner" value="Astar_planner/AstarPlannerROS"/>

        <!-- 通用参数用在全局代价地图上 -->
        <rosparam file="$(find nav_demo)/newparam/costmap_common_params.yaml" command="load" ns="global_costmap" />
        <!-- 通用参数用在局部代价地图上 -->
        <rosparam file="$(find nav_demo)/newparam/costmap_common_params.yaml" command="load" ns="local_costmap" />
        <!-- 加载局部代价地图参数 -->
        <rosparam file="$(find nav_demo)/newparam/local_costmap_params.yaml" command="load" />
        <!-- 加载全局代价地图参数 -->
        <rosparam file="$(find nav_demo)/newparam/global_costmap_params.yaml" command="load" />
        <!-- 加载本地路径规划算法 -->
        <rosparam file="$(find nav_demo)/newparam/base_local_planner_params.yaml" command="load" />
        <!-- reset frame_id parameters using user input data -->
        <param name="global_costmap/global_frame" value="map" />
        <param name="global_costmap/robot_base_frame" value="base_link" />
        <param name="local_costmap/global_frame" value="odom" />
        <param name="local_costmap/robot_base_frame" value="base_link" />

        <!-- <remap from="cmd_vel" to="cmd_vel" />
        <remap from="odom" to="odom" />
        <remap from="scan" to="scan" />
        <remap from="map" to="map" /> -->
    </node>

</launch>

结果,选择Path_global的话题名称,就是你的规划器名称

 

### 使用 A* 算法替代默认全局路径规划算法实现方式 在 ROS 导航堆栈中,默认的全局路径规划(如 `navfn` 或其他内置选项)可以通过编写自定义插件的方式替换为 A* 算法。这需要遵循导航堆栈的标准接口设计,并确保新实现的路径规划能够无缝集成到现有的框架中。 #### 1. ### 创建自定义全局路径规划节点 要将 A* 算法用于全局路径规划,需创建一个新的 ROS 节点作为路径规划插件。此节点应继承自 `nav_core::BaseGlobalPlanner` 抽象基类[^8],并实现必要的虚函数: - **`initialize()`**: 初始化路径规划所需的参数和资源。 - **`makePlan()`**: 实现具体的路径计算逻辑,返回从起始位置到目标位置的路径。 以下是基本结构的一个示例代码片段: ```cpp #include <ros/ros.h> #include <nav_core/base_global_planner.h> #include <costmap_2d/costmap_2d_ros.h> #include <geometry_msgs/PoseStamped.h> #include <nav_msgs/Path.h> namespace custom_a_star { class AStarPlanner : public nav_core::BaseGlobalPlanner { public: AStarPlanner(); ~AStarPlanner(); bool initialize(std::string name, costmap_2d::Costmap2DROS* costmap_ros); bool makePlan(const geometry_msgs::PoseStamped& start, const geometry_msgs::PoseStamped& goal, std::vector<geometry_msgs::PoseStamped>& plan); private: costmap_2d::Costmap2D* costmap_; }; } // namespace custom_a_star ``` #### 2. ### 配置 navigation.yaml 文件 为了让 `move_base` 加载新的全局路径规划,需要编辑配置文件 `navigation.yaml`,指定自定义插件的位置及其名称。例如: ```yaml global_planner: "custom_a_star/AStarPlanner" planner_frequency: 1.0 replan_frequency: 0.5 ``` 这里的关键在于正确声明插件包名以及类名,即 `"package_name/class_name"` 形式的字符串。 #### 3. ### 替代原有 global_plan 输出流程 一旦成功替换了默认的全局路径规划,那么由 `TebLocalPlannerROS` 订阅的主题 `/move_base/TebLocalPlannerROS/global_plan` 将自动切换成来自 A* 规划的结果[^9]。这意味着无需额外更改局部规划部分即可完成整个系统的适配工作。 需要注意的是,虽然理论上可以完全移除原有的 NavFn 组件,但在实际部署前建议保留原生版本作为备份方案以防万一出现问题时快速回滚。 --- ###
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值