未经作者同意禁止转载
首先创建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的话题名称,就是你的规划器名称