技术分享 | 为什么学习rrt_exploration实现自主建图容易掉坑?

在无人车领域当中,SLAM和导航两个部分一直是研究人员关注的重点,无人车作为移动机器人,这两个功能也十分重要,无人车到一个未知的环境中,人为控制无人车进行建图,建立好地图后,再使用导航,这是目前在无人车应用场景中十分常见的场景,但在实际应用过程中,还是存在局限性,很多应用场景下需要无人车在未知环境下自主地探索建图,而不是人为控制的情况下建图,自主探索也就由此而生。

rrt_exploration是基于RRT路径规划算法实现的搜索算法。之所以使用RRT算法是因为RRT对于未知区域有着强烈的倾向,在RRT exploration中,RRT主要用于生成边界点,这样对于探索边界点是很有好处的。所谓的边界点就是已经探索过的和未知的区域的交界点。

在ros当中使用rrt_exploration来实现自主建图,官方文档

(http://wiki.ros.org/rrt_exploration)说得比较清楚,这里简单地讲解一下流程,主要是针对一些容易掉进坑的地方说明一下,给大家排排雷。

一.下载rrt_exploration功能包

1.打开终端

2.进入你的工作空间/src文件下

cd catkin_ws/src

#将命令中的catkin_ws更换为你个人的工作空间名

3.下载rrt_exploration功能包

git clone

https://github.com/hasauino/rrt_exploration.git

二.下载相关依赖包(ros版本为kinetic)

OpenCV(cv2)

sudo apt-get install python-opencv

Numpy

sudo apt-get install python-numpy

Sklearn

sudo apt-get install python-scikits-learn

gmapping

sudo apt-get install ros-kinetic-gmapping

navigation

sudo apt-get install ros-kinetic-navigation

三.编译工作空间

1.进入你的工作空间

cd catkin_ws #将命令中的catkin_ws更换为你个人的工作空间名

2.编译

catkin_make

到这一个步骤,如果没有错误,那么rrt_exploration功能包的下载安装已经全部完成,接下来就到了使用阶段,在此,我推荐创建一个launch文件来达到使用自主探索建图功能的目的。我把自主探索建图功能分为两个模块,一个是自主探索功能,一个是建图功能,自主探索功能需要rrt_exploration和move_base,建图这里就采用gmapping。因此你的launch文件内需要包含3个内容:

① rrt_exploration

② move_base

③ gmapping

四.创建自主建图launch文件

1.随意在一个功能包内创建launch文件夹,并在launch文件夹中建立一个rrt_slam.launch文件

文件内容如下:

<include file="$(find rrt_exploration)/launch/simple.launch"/>

<include file="$(find tiprobot_slam)/launch/tiprobot_gmapping.launch"/>



<node pkg="rviz" type="rviz" name="rviz" required="true" args="-d $(find tiprobot_slam)/rviz/tiprobot_explore.rviz"/>



<node pkg="move_base" type="move_base" respawn="false" name="move_base_node" output="screen">

  <param name="footprint_padding" value="0.01" />

  <param name="controller_frequency" value="5.0" />

  <param name="controller_patience" value="3.0" />

  <param name="oscillation_timeout" value="30.0" />

  <param name="oscillation_distance" value="0.5" />

  <param name="planner_patience" value="1" />

  <param name="controller_patience" value="1" />

  <param name="recovery_behavior_enabled" value="false" />

  <rosparam file="$(find tiprobot_slam)/config/costmap_common_params.yaml" command="load" ns="global_costmap" />

  <rosparam file="$(find tiprobot_slam)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />

  <rosparam file="$(find tiprobot_slam)/config/local_costmap_params.yaml" command="load" />

  <rosparam file="$(find tiprobot_slam)/config/global_costmap_params.yaml" command="load" />

  <rosparam file="$(find tiprobot_slam)/config/base_local_planner_params.yaml" command="load" />

  <param name="global_costmap/global_frame" value="/map"/>

  <param name="global_costmap/robot_base_frame" value="/base_link"/>

  <param name="global_costmap/laser_scan_sensor/sensor_frame" value="/base_scan"/>

  <param name="global_costmap/laser_scan_sensor/topic" value="/scan"/>    

  <param name="local_costmap/global_frame" value="/map"/>

  <param name="local_costmap/robot_base_frame" value="/base_link"/>

  <param name="local_costmap/laser_scan_sensor/sensor_frame" value="/base_scan"/>

  <param name="local_costmap/laser_scan_sensor/topic" value="/scan"/>

  <param name="local_costmap/obstacle_layer/laser_scan_sensor/topic" value="/scan"/>

  <remap from="cmd_vel" to="cmd_vel"/>

</node>

2.文件内容讲解

rrt_exploration

直接使用include包含就行,simple.launch是单机器人使用rrt_exploration的launch文件。

gmapping

也是直接使用include包含就行,gmapping的配置各种参考文档都很多,这里不过多讲解。

move_base

这部分要重点讲解一下,虽然rrt_exploration为单机器人创建了simple.launch文件,但大部分人使用依然会出现问题。原因这里就直接说明了。

大部分使用出现问题都在于这一句,注意到

name="move_base_node"这一段,这就是问题根源,

rrt_exploration作者是根据这一个命名来写代码的,但大部分ros使用者都是使用move_base这个命名,而作者的源代码采用的是move_base_node,而且没有在launch文件中给出接口来更改move_base的命名,因此大部分人在使用rrt_exploration的时候会发现move_base无法和rrt_exploraiton连接,导致自主探索功能失败,有两种解决办法:

①在launch文件中将move_base节点命名为move_base_node,这是最简单快捷的方法,也是推荐的方法。

②在源代码中修改move_base_node名,这个不推荐,因为需要修改的的地方很多,效率不高,还容易出错。

move_base配置部分:

  <param name="controller_frequency" value="5.0" />

  <param name="controller_patience" value="3.0" />

  <param name="oscillation_timeout" value="30.0" />

  <param name="oscillation_distance" value="0.5" />

  <param name="planner_patience" value="1" />

  <param name="controller_patience" value="1" />

  <param name="recovery_behavior_enabled" value="false" />

        这一段是作者配置的参数,应该是作者根据算法作出的调试,建议大家就使用作者默认的这一套参数。

        <param name="global_costmap/global_frame" value="/map"/>

  <param name="global_costmap/robot_base_frame" value="/base_link"/>

  <param name="global_costmap/laser_scan_sensor/sensor_frame" value="/base_scan"/>

  <param name="global_costmap/laser_scan_sensor/topic" value="/scan"/>    

  <param name="local_costmap/global_frame" value="/map"/>

  <param name="local_costmap/robot_base_frame" value="/base_link"/>

  <param name="local_costmap/laser_scan_sensor/sensor_frame" value="/base_scan"/>

  <param name="local_costmap/laser_scan_sensor/topic" value="/scan"/>

        这一段是全局代价地图和本地代价地图的设置

全局代价地图和本地代价地图的参数类似

它们前四个参数分别代表

全局坐标名:在作者的设置中全局代价地图采用的是map,本地代价地图采用的是odom,我测试之后感觉本地代价地图改为map效果要好一些,所以我这里采用的是map。

机器人基坐标:这个基本上大家都类似,一般都是base_link或者base_footprint。

传感器坐标名:这个可能会有些区别,可以使用rosrun rqt_tf_tree rqt_tf_tree命令来查看激光的tf名,根据自己机器人的命名情况来修改。

传感器数据话题名:这个大部分应该都是scan,也是根据自己机器人的命名情况来修改。

五.使用基于rrt_exploration的自主探索功能

这里简单地给大家展示一下,跑一跑流程。我这里采用的是turtlebot3的仿真来测试一下。

1.启动turtlebot3仿真

roslaunch turtlebot3_gazebo turtlebot3_stage_4.launch

roslaunch turtlebot3_bringup turtlebot3_remote.launch

2.启动rrt_slam.launch

roslaunch rrt_exploration rrt_slam.launch

我这里是把这个launch文件放在rrt_exploration功能包里面的,根据个人情况调整命令即可。

通过rviz中的Publish Point设置四个点(推荐为一个矩形区域的四个顶点)为探索的范围,第五个点设置在机器人附近。

技术分享 | 为什么学习rrt_exploration实现自主建图容易掉坑?

效果展示: 技术分享 | 为什么学习rrt_exploration实现自主建图容易掉坑?

自主探索建图的效果还是不错的。

  • End -

技术发展的日新月异,阿木实验室将紧跟技术的脚步,不断把机器人行业最新的技术和硬件推荐给大家。看到经过我们培训的学员在技术上突飞猛进,是我们培训最大的价值。如果你在机器人行业,就请关注我们的公众号,我们将持续发布机器人行业最有价值的信息和技术。 阿木实验室致力于前沿IT科技的教育和智能装备,让机器人研发更高效!

上一篇:三分钟教会你汉诺塔图解


下一篇:第一章 栈和队列(用栈来求解汉诺塔问题)