我一贯的学习路子就先模仿后创造
所以我找到了哔哩哔哩上的一个up写好的算法放到我的小车中
ros的官方教程链接是:
navigation/Tutorials/Writing a Local Path Planner As Plugin in ROS - ROS Wiki
首先去up的github上下载插件
Grizi-ju (xiaoju) · GitHub
下载这个
但是该作者用的导航包中是有move_base.launch文件的
up说在该文件中修改如下对应段就可以
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
<param name="base_global_planner" value="BAstar_planner/BAstarPlannerROS"/>
但是我没有
我只有move_base.cpp
所以我找到move_base.cpp修改了一以下内容
// 网上的教程都是在move_base.launch文件中添加下面这句话来引用插件,但是wiki小车中并不存在该launch文件
// <param name="base_local_planner" value="local_planner/LocalPlanner" />
// 而是通过cpp文件节点的方式调用,因此,我将对应修改下一句为非注释的样子
// private_nh.param("base_global_planner", global_planner, std::string("navfn/NavfnROS"));
private_nh.param("base_global_planner", global_planner, std::string("BAstar_planner/BAstarPlannerROS"));
我发现我原本调用的插件的名字是navfn所以我就找到了该文件夹的位置改为,发现该文件在navigation-melodic功能包目录级下,所以我将up的插件目录也放在该文件夹下。
复制好文件夹后
会发现,navfn对应的better_aster_global_planner应该是BAstar_planner,但是考录到ros一贯有文件夹名和功能包名是不对应的情况我也没更改
单独编译导航功能包
catkin_make -DCATKIN_WHITELIST_PACKAGES="better_astar_global_planner"
接着试试改包能不能规划
失败move_base_params.yaml试试。
改
#设置全局路径规划器
#base_global_planner: "carrot_planner/CarrotPlanner"
#base_global_planner: "navfn/NavfnROS"
#base_global_planner: "global_planner/GlobalPlanner"
base_global_planner: "BAstar_planner/BAstarPlannerROS"
该这里就成功了
归根结底就是该move_base的参数
有的是launch 有的就是这个 move_base_params.yaml文件夹。
编写自己的插件
首先创建工作空间
创建功能包
catkin_create_pkg tcalgorithm roscpp rospy nav_core //我自己的功能包
在tcalgorithm/src下创建TC.cpp文件
tcalgorithm/include/TC下创建TC.h头文件
工作空间/src文件夹下粘贴up的cpp文件
编译
ctakin_make
提示缺少nav_core
我是在主机电脑上写的胆码再移植到ros小车中,我主机是noetic版本的ros 小车上是melodic版本的ros
所以我在主机上安装nav_core的命令是
sudo apt-get install ros-noetic-nav-core
再次编译后不在提示错误
cpp文件和h文件的编写
值得注意的是,一般在ros平台下编写功能包的h头文件是放在“功能包目录/include/功能包名/” 的文件夹下的,但是由于我们后面需要注册插件,因此需要复制h文件到cpp文件所属的src文件夹下。
待到后期封装完成时,才可以将h文件从cpp文件所在的src文件夹下移动到功能包目录/include/功能包名/” 的文件夹下
插件的注册
打开功能包tc_algorithm文件下的CMakeList.txt文件。这是通过终端创建功能包时自动生成的文件,找到下面这一段内容,取消注释。
修改为如下内容
tcalgorithm_lib是我们生成的.so文件,该文件将生成在“工作空间/devel/lib/”文件夹下
add_library(tcalgorithm_lib
src/TC.cpp
)
接着编译一下
报错
fatal error: move_base_msgs/MoveBaseAction.h
fatal error: base_local_planner/world_model.h: 没有那个文件或目录
sudo apt-get install ros-noetic-move-base-msgs
sudo apt-get install ros-noetic-base-local-planner
生成的libtcalgorithm_lib.so文件,在“工作空间/devel/lib/”文件夹下
接着在功能包文件夹下新建一个"功能包名字_plugin.xml"文件,输入以下内容,并对照自己的设定的插件名字修改。
<library path="lib/libtcalgorithm_lib">
<class name="TC_planner/TCPlannerROS" type="TC_planner::TCPlannerROS" base_class_type="nav_core::BaseGlobalPlanner">
<description>This is the better A* global planner plugin by xiaoju.</description>
</class>
</library>
打开功能包文件夹下的package.xml
拉到最后将export中插入以下内容
<export>
<!-- Other tools can request additional information be placed here -->
<nav_core plugin="${prefix}/功能包名字_plugin.xml" />
</export>
到这为止,一个全局规划器就处理好了,可以通过以下命令查看插件是否注册成功
rospack plugins --attrib=plugin nav_core
如果输入结果没有你的插件,请检查是否source工作空间路径。
接下来测试我们的功能包
首先我们将在虚拟平台中实现仿真,这一步需要确保安装以下内容
sudo git clone https://gitclone.com/github.com/guyuehome/guyueclass.git
找到guyueclass/planning&perception/mbot_navigation 文件夹下的4个功能包复制到你的工作空间目录下的src文件夹中。
编译
catkin_make
注意:编译之前删除工作空间目录下的devel和build文件夹。
接着测试
roslaunch mbot_gazebo view_mbot_with_laser_gazebo.launch
roslaunch mbot_navigation exploring_slam_demo.launch
这一部分的参考网站:
https://github.com/guyuehome/guyueclass/tree/main/ros_basic/mbot_gazebo