系列文章目录
·【SLAM】基于explore_lite的移动机器人自主建图
·【SLAM】基于rrt_explore的移动机器人自主建图
·【问题解决】rrt_exploration功能包使用过程中报错处理
前言
机器人自主建图有很多方式,比如基于位置边界的map-explore,基于快速搜索树的rrt-explore,指定区域自主探索建图frontier-explore,这几种方法各有优劣,博主接下来将对每种方法进行简单介绍、使用实现,和比较测评
一、简介
explore-lite提供了贪婪的基于边界的探索。当节点运行时,机器人会贪婪地探索它的环境,直到找不到边界,它的移动命令会发送至move-base节点。
explore_lite不会创建自己的成本图,这使得配置更容易,效率更高(资源更少)。Node 只是订阅nav_msgs/OccupancyGrid消息。机器人移动命令发送到move-base节点。
节点可以进行边界过滤,甚至可以在非膨胀地图上操作。目标黑名单允许处理机器人无法进入的地方,也就是说可以在move-base的的代价地图层中配置禁止层参数,explore-lite也会识别到,并不去探索这部分边界。
二、安装
对于explore-lite的安装有两种方式
自动安装:
sudo apt-get install ros-noetic-explore-lite
手动安装:
git clone https://github.com/hrnr/m-explore.git
这个功能包的使用也很简单,src中是源码,include中是头文件,而我们使用时只需配置好相应的launch文件即可。
三、架构
explore_lite订阅nav_msgs/OccupancyGrid和map_msgs/OccupancyGridUpdate消息来构建一个地图,它会在其中寻找边界,可以使用 move_base 发布的成本地图(即<move_base>/global_costmap/costmap),也可以使用由SLAM算法构建的地图。
然后explore-lite算法发布move-base移动指令给move-base节点,控制小车运动
需要提供的tf变换:global_frame → robots_base_frame
这种变换通常由映射算法提供。这些框架通常称为map和base_link。可以在launch文件中调整robot_base_frame名称。不需要设置global_frame。global_frame的名称将自动来自costmap_topic。
四、参数配置
explore.launch配置文件如下,其中需要注意的是costmap_topic 和 costmap_updates_topic。
<launch>
<node pkg="explore_lite" type="explore" respawn="false" name="explore" output="screen">
<!--机器人底盘坐标系-->
<param name="robot_base_frame" value="base_link"/>
<!--地图主题-->
<param name="costmap_topic" value="map"/>
<!--地图更新,如果地图来源始终发布完整更新,即不提供此主题,则不需要-->
<param name="costmap_updates_topic" value="map_updates"/>
<!--指定是否发布可视化边界-->
<param name="visualize" value="true"/>
<!--计算新边界并重新考虑目标的速率(Hz)-->
<param name="planner_frequency" value="0.33"/>
<!--时间以秒为单位,当机器人在 progress_timeout 内没有任何进展时,将放弃当前目标-->
<param name="progress_timeout" value="30.0"/>
<!--用于加权边界,这个乘法参数影响边界权重的边界潜在分量(到边界的距离)-->
<param name="potential_scale" value="3.0"/>
<!--用于加权边界,该乘法参数影响前沿权重的前沿方向分量,此参数当前不执行任何操作,仅提供前向兼容性-->
<param name="orientation_scale" value="0.0"/>
<!--用于加权边界。,乘法参数影响边界权重(边界大小)的边界增益分量-->
<param name="gain_scale" value="1.0"/>
<!--变换机器人姿势时使用的变换容差-->
<param name="transform_tolerance" value="0.3"/>
<!--将边界视为探索目标的最小边界大小。以米为单位-->
<param name="min_frontier_size" value="0.75"/>
</node>
</launch>
explore_costmap.launch的配置文件如下,与explore.launch相比只是关于地图话题costmap_topic 和 costmap_updates_topic做了修改,改为了move_base发布的地图话题,然后对最后一个参数进行了修改,因为move_base的代价地图有障碍物膨胀系数,所以将这个参数进行了略微扩大。
五、仿真实验
我这里是手动下载了explore_lite的功能包,我发现它的功能包文件夹名称和package.xml文件中定义的不一致,于是先将文件夹名称进行了修改。
然后当我编译完工作空间的时候,运行这个功能包总会报错说:这个功能包无法定位。
这时可以使用下面的代码解决:
catkin_make -DCATKIN_WHITELIST_PACKAGES=explore_lite
上面是编译自主建图的功能包,下面是地图融合的功能包。
catkin_make -DCATKIN_WHITELIST_PACKAGES=multirobot_map_merge
进行完这些步骤之后,我们就可以依次运行gazebo仿真、slam建图程序、move-base导航程序、rviz可视化界面、自主建图程序。
roslaunch kbot_gazebo view_kbot_with_laser_gazebo.launch #启动gazebo仿真环境
roslaunch kbot_slam gmapping.launch #启动gmapping建图算法和move_base
roslaunch kbot_slam view_slam.launch #启动rviz可视化节点
roslaunch explore_lite explore.launch #启动自主建图算法
实验效果如下:
这是最终的建图效果,使用的是gmapping,基于滤波器的slam算法建图过程中有一些漂移,不过最终效果还是不错的。