赞
踩
哈哈哈哈 经过多日的总结与试错,这以小节终于是可以整理错误发布了哈哈哈哈
*****************************************************************************************************
我一贯的学习路子就先模仿后创造
所以我找到了哔哩哔哩上的一个up写好的算法放到我的小车中
ros的官方教程链接是:
navigation/Tutorials/Writing a Local Path Planner As Plugin in ROS - ROS Wiki
首先去up的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文件。
我是在主机电脑上写的代码再移植到ros小车中,我主机是noetic版本的ros 小车上是melodic版本的ros
所以需要配置一个虚拟的仿真环境,那么如果你也没有小车,就可以按照之后的步骤来
首先我们将在虚拟平台中实现仿真,这一步需要确保安装以下内容
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
- [ERROR] [1708226260.373894354]: Failed to build tree: parent link [base_link] of joint [lidar_joint] not found. This is not valid according to the URDF spec. Every link you refer to from a joint needs to be explicitly defined in the robot description. To fix this problem you can either remove this joint [lidar_joint] from your urdf file, or add "<link name="base_link" />" to your urdf file.
- [robot_state_publisher-5] process has died [pid 9467, exit code 1, cmd /opt/ros/noetic/lib/robot_state_publisher/robot_state_publisher __name:=robot_state_publisher __log:=/home/xiaofei/.ros/log/422931fc-ce0c-11ee-85d6-c1647ddeb65f/robot_state_publisher-5.log].
- log file: /home/xiaofei/.ros/log/422931fc-ce0c-11ee-85d6-c1647ddeb65f/robot_state_publisher-5*.log
发现是提示没有雷达,因为我是虚拟仿真嘛,按照网上相似问题的处理方式。
找到文件夹/mbot_description/urdf/,里面有一堆的.xacro文件
我的是雷达有问题,我就找雷达的那个文件
在这里增加xacro:宏名
其他错误同理。
接着保存并编译。
[ WARN] [1708312959.483990221, 0.140000000]: DiffDrive(ns = //): missing <odometrySource> default is 1
找到配置文件 /mbot_description/urdf/mbot_base_gazebo.xacro
在如图所示位置添加
- <odometrySource>world</odometrySource>
- <!-- 'encoder' instead of 'world' is also possible -->
- <publishTf>1</publishTf>
DiffDrive(ns = //): missing <publishOdomTF> default is true
接着之前的位置添加
<publishOdomTF>1</publishOdomTF>
运行Gazebo时,卡在加载模型界面,加载太慢或者黑屏:
- cd ~/.gazebo/
-
- mkdir -p models
-
- cd ~/.gazebo/models/
-
- wget http://file.ncnynl.com/ros/gazebo_models.txt
-
- wget -i gazebo_models.txt
-
- ls model.tar.g* | xargs -n1 tar xzvf
参考这篇文章:从零开始的ROS学习之仿真+SLAM_slam仿真-CSDN博客
接着
roslaunch mbot_navigation exploring_slam_demo.launch
终端出现一堆警告,rivz是状态如图所示 查看tf树:rosrun rqt_tf_tree rqt_tf_tree
map 没有到tf的装换关系
找到tf转换的launch文件:其实就是你启动的那个launch文件
增加如下代码
- <!-- 新增的tf关系树 -->
-
- <!-- 这个是map到tf树的,我的tf图有所以不需要 -->
- <!-- <node pkg="tf" type="static_transform_publisher" name="fix_map" args="0 0 0 0 0 0 map odom 50" /> -->
- <!-- 这个是odom到tf树的,我的tf图没有所以需要 -->
- <node pkg="tf" type="static_transform_publisher" name="fix_odom" args="0 0 0 0 0 0 odom base_footprint 50" />
提示没有gmapping
运行gmapping算法建图时,ERROR: cannot launch node of type [gmapping/slam_gmapping]: gmapping,解决方法-CSDN博客
从新编译并执行之前的两个launch文件
roslaunch mbot_gazebo view_mbot_with_laser_gazebo.launch
新开终端
roslaunch mbot_navigation exploring_slam_demo.launch
成功的状态如下
参考链接: ROS高效编程报错(chapter6)之tf error: canTransform: target_frame map does not exist...-CSDN博客
新的问题是给路径点后小车移动,up的ros是melodic 我的是neotic,所以有问题正常,可惜的是网上没有人写这方面的导航教程,所以只能自己一步一步修理。
查看话题间的关系
rosrun rqt_graph rqt_graph
这是我小车上的话题关系,
这一部分的程序资料参考网站:
https://github.com/guyuehome/guyueclass/tree/main/ros_basic/mbot_gazebo
*****************************************************************************************************
试错段结束
总结错误后发现是因为noetic与 melodic在语法输入上的不同导致,gazebo一些模型引入的时候语法不同出现了错误
解决办法如下:
首先将mbot_gazebo.xacro的
<mbot_base_gazebo/>
修改为
<xacro:mbot_base_gazebo/>
然后再次运行,不报错但是不显示机器人,如同其他文章的情况
左边的mbot只加载了一个差速控制插件,其他主体都没有加载,第一个解决办法当然是版本降级,如果ubuntu和ros版本都降到和老师一样肯定能运行,但是....不想降.....所以经过几个小时的研究,我发现其实和刚刚的情况一样,问题就出在升级后,有些写法的规则改了,所有自定义的macro,要引用的话都要加上xacro:
我们把mbot_base_gazebo.xacro里自定义的cylinder_inertial_matrix, sphere_inertial_matrix ,wheel, caster 四个标签引用的时候都加上xacro:
例如<wheel prefix="left" reflect="-1"/> 改成 <xacro:wheel prefix="left" reflect="-1"/>
再次运行,机器人就出现了
参考文档:ros + gazebo未报错却加载不出来机器人模型 解决办法
如果不想配置或者配置总出错的话,可以从我提供的链接下载配置好的文件
noetic:https://download.csdn.net/download/qq_42087574/88867939
melodic:https://download.csdn.net/download/qq_42087574/88867962
navigation导航功能包下载:
https://github.com/ros-planning/navigation
https://github.com/ros-planning/navigation_msgs
总体需要的功能包如下图所示
catkin_create_pkg tcalgorithm roscpp rospy nav_core //我自己的功能包
在tcalgorithm/src下创建TC.cpp文件
tcalgorithm/include/TC下创建TC.h头文件
(TC.cpp和TC.h是我自己写的全局路径规划的算法程序文件)
ctakin_make
提示缺少nav_core
所以我在主机上安装nav_core的命令是
sudo apt-get install ros-noetic-nav-core
再次编译后不在提示错误
值得注意的是,一般在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工作空间路径。
这一部分就是按照上面的“如何导入插件”执行即可
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。