在无人车领域当中,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设置四个点(推荐为一个矩形区域的四个顶点)为探索的范围,第五个点设置在机器人附近。
效果展示:
自主探索建图的效果还是不错的。
- End -
技术发展的日新月异,阿木实验室将紧跟技术的脚步,不断把机器人行业最新的技术和硬件推荐给大家。看到经过我们培训的学员在技术上突飞猛进,是我们培训最大的价值。如果你在机器人行业,就请关注我们的公众号,我们将持续发布机器人行业最有价值的信息和技术。 阿木实验室致力于前沿IT科技的教育和智能装备,让机器人研发更高效!