Wheeltec小车的开发实录(3)之 wheeltec小车中配置自己的全局优化算法

19 篇文章 0 订阅
6 篇文章 0 订阅

哈哈哈哈 经过多日的总结与试错,这以小节终于是可以整理错误发布了哈哈哈哈

*****************************************************************************************************

wheeltec 实体车中自定义全局规划算法

我一贯的学习路子就先模仿后创造

所以我找到了哔哩哔哩上的一个up写好的算法放到我的小车中

ros的官方教程链接是:

navigation/Tutorials/Writing a Local Path Planner As Plugin in ROS - ROS Wiki

如何导入插件 

算法插件下载

首先去up的github上下载插件

Grizi-ju (xiaoju) · GitHub

下载这个

move_base 配置段

但是该作者用的导航包中是有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文件。

搭建虚拟导航环境(gazebo与rviz实现) 

我是在主机电脑上写的代码再移植到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

报错1
[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
分析错误1

发现是提示没有雷达,因为我是虚拟仿真嘛,按照网上相似问题的处理方式。

解决错误1

找到文件夹/mbot_description/urdf/,里面有一堆的.xacro文件

我的是雷达有问题,我就找雷达的那个文件

在这里增加xacro:宏名

其他错误同理。

接着保存并编译。

新的警告2-1
[ WARN] [1708312959.483990221, 0.140000000]: DiffDrive(ns = //): missing <odometrySource> default is 1
解决警告2-1

找到配置文件 /mbot_description/urdf/mbot_base_gazebo.xacro

在如图所示位置添加

<odometrySource>world</odometrySource> 
<!-- 'encoder' instead of 'world' is also possible -->
<publishTf>1</publishTf>
警告2-2
DiffDrive(ns = //): missing <publishOdomTF> default is true
解决警告2-2

接着之前的位置添加

<publishOdomTF>1</publishOdomTF>
Gazebo错误3

运行Gazebo时,卡在加载模型界面,加载太慢或者黑屏:

解决方法3:
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
错误4:rviz链接RobotModel 错误

终端出现一堆警告,rivz是状态如图所示                       查看tf树:rosrun rqt_tf_tree rqt_tf_tree

map 没有到tf的装换关系

解决办法4:

找到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" />
错误5

提示没有gmapping

解决办法5

运行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 //我自己的功能包

cpp文件与h头文件的创建

在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

再次编译后不在提示错误

 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
 )

接着编译一下

报错5

fatal error: move_base_msgs/MoveBaseAction.h

fatal error: base_local_planner/world_model.h: 没有那个文件或目录

解决办法5
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编辑

打开功能包文件夹下的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工作空间路径。

接下来在虚拟环境中测试我们的功能包

这一部分就是按照上面的“如何导入插件”执行即可
 

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值