【自主探索】基于 explore_lite包 的单个机器人自主探索建图

机器人自主建图有很多方式,比如基于位置边界的map-explore,基于快速搜索树的rrt-explore,指定区域自主探索建图frontier-explore,这几种方法各有优劣。

WIKI:explore_lite
GitHub:https://github.com/hrnr/m-explore

一、简介

explore-lite 提供了贪婪的基于边界的探索。当节点运行时,机器人会贪婪地探索它的环境,直到找不到边界,它的移动命令会发送至 move-base 节点。

explore_lite 不会创建自己的成本图,这使得配置更容易,效率更高(资源更少)。Node 只是订阅 nav_msgs/OccupancyGrid 消息。机器人移动命令发送到 move-base 节点。

节点可以进行边界过滤,甚至可以在非膨胀地图上操作。目标黑名单允许处理机器人无法进入的地方,也就是说可以在 move-base 的的代价地图层中配置禁止层参数,explore-lite 也会识别到,并不去探索这部分边界。

二、安装 explore_lite

方法一 自动安装:sudo apt-get install ros-ros版本(melodic、noetic等)-explore-lite

方法二 手动安装:git clone https://github.com/hrnr/m-explore.git

(explore 就是 explore_lite包,这个功能包的使用也很简单,src 中是源码,include 中是头文件,而我们使用时只需配置好相应的 launch 文件即可。)

在这里插入图片描述

三、launch 文件配置

找到 explore_lite 的功能包,其中 launch 文件夹下面有两个,配置 explore_lite 即可。

在这里插入图片描述explore_costmap.launch 配置文件如下,其中需要注意的是 robot_base_frame、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_footprint"/>
	    <!--地图主题-->
	  <param name="costmap_topic" value="move_base/global_costmap/costmap"/>
	    <!--地图更新,如果地图来源始终发布完整更新,即不提供此主题,则不需要-->
	  <param name="costmap_updates_topic" value="move_base/global_costmap/costmap_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.5"/>
	</node>
</launch>

explore.launch 配置文件如下,其中需要注意的是 robot_base_frame、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_footprint"/>
    <param name="costmap_topic" value="map"/>
    <param name="costmap_updates_topic" value="map_updates"/>
    <param name="visualize" value="true"/>
    <param name="planner_frequency" value="0.33"/>
    <param name="progress_timeout" value="60.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 的代价地图有障碍物膨胀系数,所以将这个参数进行了略微扩大。

move_base launch 相关配置

<launch>
  <!-- Arguments -->
  <arg name="odom_frame_id"   default="odom"/>
  <arg name="base_frame_id"   default="base_footprint"/>
  <arg name="global_frame_id" default="map"/>
  <arg name="laser_topic"     default="scan"/>
  <arg name="cmd_vel_topic"   default="cmd_vel" />
  <arg name="odom_topic"      default="odom" />
  <arg name="move_forward_only" default="false"/>
 
  <!-- move_base -->
  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
    <param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />
    <rosparam file="$(find nav_01)/param/costmap_common_params.yaml" command="load" ns="global_costmap" />
    <rosparam file="$(find nav_01)/param/costmap_common_params.yaml" command="load" ns="local_costmap" />
    <rosparam file="$(find nav_01)/param/local_costmap_params.yaml" command="load" />
    <rosparam file="$(find nav_01)/param/global_costmap_params.yaml" command="load" />
    <rosparam file="$(find nav_01)/param/base_local_planner_params.yaml" command="load" />
    
    <!-- <rosparam file="$(find nav_01)/param/move_base_params.yaml" command="load" /> -->
    <!-- <rosparam file="$(find nav_01)/param/dwa_local_planner_params.yaml" command="load" /> -->
    
    <param name="global_costmap/global_frame" value="$(arg global_frame_id)"/>
    <param name="global_costmap/robot_base_frame" value="$(arg base_frame_id)"/>
    <param name="local_costmap/global_frame" value="$(arg odom_frame_id)"/>
    <param name="local_costmap/robot_base_frame" value="$(arg base_frame_id)"/>
    <param name="DWAPlannerROS/global_frame_id" value="$(arg odom_frame_id)"/>
    
    <param name="DWAPlannerROS/min_vel_x" value="0.0" if="$(arg move_forward_only)" />
    
    <remap from="cmd_vel" to="$(arg cmd_vel_topic)"/>
    <remap from="laser_topic" to="$(arg laser_topic)"/>
    <remap from="odom" to="$(arg odom_topic)"/>
 
  </node>
</launch>

nav_01是自己创建的包,存放的是move_base相关配置,可以去官方网站复制

一个launch启动所有自主建图的节点

<launch>
    <!--参数配置,运动是否只向前,false 则表示小车可以后退操作-->
    <arg name="move_forward_only" default="true" />  
    
    <!--启动gmapping建图-->
    <include file="$(find nav_01)/launch/nav01_slam.launch" />
 
    <!--启动move_base-->
    <include file="$(find explore_lite_test)/launch/move_base.launch">
        <arg name="move_forward_only" value="$(arg move_forward_only)"/>
    </include>
 	
 	 <!--启动rviz-->
 	<node pkg="rviz" type="rviz" name="rviz" args="-d $(find explore_lite_test)/rviz/rviz.rviz"/>

    <!--启动explore_costmap-->
    <include file="$(find explore_lite)/launch/explore.launch" />
   
</launch>

还需要启动gazebo和robot,我是之前有写过这个launch,这里就直接用的之前的

<launch>

    <param name="robot_description" command="$(find xacro)/xacro $(find urdf02_gazebo)/urdf/mycar.xacro" />

    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <!-- <arg name="world_name" value="$(find urdf02_gazebo)/worlds/box_house.world" /> -->
        <arg name="world_name" value="$(find urdf02_gazebo)/worlds/demo03.world" />
    </include>

    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />

</launch>

注意:启动自主建图的步骤:

1、启动 gazebo

2、启动 cartographer 或者 gmapping 建图,发布 /map 话题

3、启动 move_base 保证接收到 goal 后能够发布 /cmd_vel 话题

4、启动 explore_lite launch 文件即可

四、实验效果

在这里插入图片描述小车经常出现撞墙的现象,不知道是哪里参数设置地有问题,,,弄清楚原因后再来补充。

五、常见问题

1、启动各个节点以后,并没有开始路径规划,小车未移动。

检查节点各个话题是否能对应上,tf 树是否正确,另外小车的基体坐标系是 base_link 还是 base_footprint。

2、节点话题都对应的上,小车还是不走的情况。

检查 cartographer 或者 gmapping 的地图发布频率,建议发布速度为 5Hz。或者检查 gmapping 建图中map_update_interval 这个参数,改为0.01。

3、若手动下载 explore_lite 包,功能包文件夹名称和package.xml文件中定义的不一致,需要先将文件夹名称进行修改。若编译功能区间时报错:这个功能包无法定位。

可以使用下面的代码解决:catkin_make -DCATKIN_WHITELIST_PACKAGES=explore_lite

上面是编译自主建图的功能包,下面是地图融合的功能包:catkin_make -DCATKIN_WHITELIST_PACKAGES=multirobot_map_merge

进行完这些步骤之后,就可以依次运行gazebo仿真、slam建图程序、move-base导航程序、rviz可视化界面、自主建图程序。

六、explore_lite 解析

explore_lite 使用 move_base 进行导航。你需要运行配置正确的 move_base 节点。

在这里插入图片描述
explore_lite 订阅 nav_msgs/OccupancyGrid 和 map_msgs/OccupancyGridUpdate 消息来构建地图,并在其中寻找边界。可以使用 move_base 发布的成本地图(即 <move_base>/global_costmap/costmap),也可以使用映射算法(SLAM)构建的地图。

根据环境的不同,使用 SLAM 地图或 move_base 发布的成本地图可能会取得更好的效果。move_base 成本地图的优势在于膨胀,这有助于处理一些非常小的无法探索的边界。在使用 SLAM 生成的原始地图时,应将 min_frontier_size 参数设置为某个合理的数字,以处理小边界。有关这两种设置的详细信息,请查看 explore.launch 和 explore_costmap.launch 启动文件。

ROS API —— explore

提供本软件包提供的探索服务。节点初始化后将立即开始探索。

1、调用的操作

  • move_base (move_base_msgs/MoveBaseAction)
    用于发布目标的 move_base actionlib API。详见 move_base#Action API。该 API 希望 move_base 节点与 explore_lite 位于同一命名空间,否则可能需要重新映射该节点。

2、订阅的主题

  • costmap (nav_msgs/OccupancyGrid)
    用于勘探规划的地图。可以是来自 move_base 的成本地图,也可以是 SLAM 创建的地图(见上文)。占用网格必须有正确标记的未知空间,绘图算法通常默认跟踪未知空间。如果要使用 move_base 提供的 costmap,则需要通过设置 track_unknown_space:true 来启用未知空间追踪功能。
    costmap_updates (map_msgs/OccupancyGridUpdate)
    对成本地图进行增量更新。如果地图源始终发布完整更新,即不提供此主题,则不需要。

3、发布的主题

  • ~frontiers (visualization_msgs/MarkerArray)
    探索算法所考虑的边界可视化。每个边界都由蓝色的边界点和一个小球体可视化,小球体可视化边界的成本(成本较高的边界球体较小)。

4、参数

  • ~robot_base_frame (字符串,默认为 base_link)
    机器人基准框架的名称。用于确定机器人在地图上的位置。必须填写。
  • ~costmap_topic (字符串,默认值: costmap)
    指定来源 nav_msgs/OccupancyGrid 的主题。必须填写。
  • ~costmap_updates_topic (字符串,默认值: costmap_updates)
    指定源 map_msgs/OccupancyGridUpdate 的主题。如果地图源始终发布完整更新,即不提供此主题,则不需要。
  • ~visualize (bool,默认:false)
    指定是否发布可视化边界。
  • ~planner_frequency (double,默认:1.0)
    以 Hz 为单位计算新边界和重新考虑目标的频率。
  • ~progress_timeout (double,默认值:30.0)
    以秒为单位的时间。当机器人在 progress_timeout 时间内没有取得任何进展时,将放弃当前目标。
  • ~potential_scale (double,默认值:1e-3)
    用于加权边界。这个乘法参数会影响边界权重(到边界的距离)中的边界势能分量。
  • ~orientation_scale (double,默认值:0)
    用于加权边界。该乘法参数影响边界权重的边界方向分量。该参数目前没有任何作用,仅用于向前兼容。
  • ~gain_scale (double,默认值:1.0)
    用于加权边界。该乘法参数影响边界权重的边界增益分量(边界大小)。
  • ~transform_tolerance (double,默认:0.3)
    机器人姿势变换时使用的变换容差。
  • ~min_frontier_size (double,默认值: 0.5)
    将边界作为探索目标时的最小边界尺寸。单位为米。

5、所需 tf 变换

  • global_frame → robot_base_frame
    这种变换通常由映射算法提供。这些框架通常称为 map 和 base_link。要调整机器人基准帧名称,请参阅相关参数。您无需设置 global_frame。global_frame 的名称将自动从 costmap_topic 中获取。

附:

1、各个节点后的节点图

在这里插入图片描述

参考:

  1. https://github.com/hrnr/m-explore/tree/melodic-devel
  2. http://wiki.ros.org/explore_lite
  3. http://wiki.ros.org/multirobot_map_merge
  • 11
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
ROS Explore Lite是基于ROS机器人操作系统)的一个轻量级的自动地图构建与导航。它旨在为移动机器人提供一种可靠且高效的方法来探索并构建地图。ROS Explore Lite具有以下主要特点和功能: 1. 探索和构建地图:ROS Explore Lite可以通过自主探索未知环境来构建地图。它使用激光或深度传感器等传感器来获取环境信息,并使用SLAM(同时定位与地图构建)算法将这些信息转换为二维或三维地图。这样,机器人就可以具备较为准确的感知并能够根据地图进行导航。 2. 导航和路径规划:ROS Explore Lite通过路径规划算法,使得机器人能够在已构建的地图上进行导航。它可以根据用户定义的目标点或者目标区域,生成可行且安全的路径,并在导航过程中避免障碍物。这样,用户可以轻松指定移动机器人在室内或室外地区的目标位置。 3. 自主探索策略:ROS Explore Lite提供了多种自主探索策略,使机器人能够在未知环境中自主探索。这些策略基于概率算法、蒙特卡罗方法等技术,使机器人能够主动选择具有最高未知性的区域以进行探索,并在该过程中实时更新地图。 4. 基于ROS的灵活性:ROS Explore Lite是基于ROS的软件,因此具有高度的灵活性和可扩展性。用户可以利用ROS的丰富工具和库来自定义和扩展ROS Explore Lite,以满足特定应用场景的需求。此外,ROS Explore Lite还可以与其他ROS软件和模块配合使用,如传感器驱动、机器人操作等,以构建更复杂的机器人系统。 综上所述,ROS Explore Lite是一款功能强大而又灵活的ROS软件,适用于各种移动机器人应用,自主探索、地图构建和导航等。它为机器人提供了先进的感知和导航能力,使得机器人能够在未知环境中自主地移动和完成任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玳宸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值