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

文章介绍了ROS中的explore_lite包,用于机器人贪婪边界探索的节点,它依赖于move_base进行导航。文章详细讲解了explore_lite的安装、配置方法,特别是launch文件的参数设置,并提到了常见问题和解决办法。此外,还讨论了与gmapping、move_base和rviz等其他组件的集成,以及实验中遇到的问题,如小车撞墙等。
摘要由CSDN通过智能技术生成

机器人自主建图有很多方式,比如基于位置边界的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
移动机器人项目组任务安排表 Day 01 上午 1.gmapping参数配置(李超) 2.总体launch文件的编写(钟浩) 3.机器人tf,状态,滤波器launch文件的编写(李博) 4.移动机器人调试(李超,钟浩,李博) 5.完成gmapping建图修图(李超,钟浩,李博) 下午 1.move_base参数配置(李超,钟浩) 2.amcl参数配置(李博) 3.调试机器人导航参数(李超,钟浩,李博) 4.在rviz中完成机器人单点导航(李超,钟浩) 5.记录多个导航目标点(李超,钟浩) 6.查阅随机循环导航函数的资料(李博) 7.完成随机循环导航功能节点函数(李超,钟浩,李博) 8.完成随机循环导航功能测试(李超,钟浩,李博) 里程碑事件: 1.完成gmapping建图修图 2.调试机器人导航参数 3.完成随机循环导航功能测试 Day 02 上午 1.完成循环导航代码的编写(李超,钟浩,李博) 2.调试循环导航功能(李超,钟浩,李博) 下午 1.完成自主探索建图代码的编写(李超,钟浩,李博) 2.调试自主探索功能(李超,钟浩,李博) 3.优化自主探索功能代码(李超,钟浩,李博) Day 03 上午 1.完成初始化位姿功能 2.完成里程计清零功能 下午 1.完成可设置循环次数导航功能 2.调试初始化位姿,里程计清零,循环导航功能 Day 04 上午 1.完成单点设定导航插件 下午 1.完善单点设定导航插件 2.调试单点设定导航插件功能 Day 05 上午 1.完成多导航点记录插件 2.完成多点循环导航节点 下午 1.完成多点循环导航插件 2.调试多点循环导航插件功能 Day 06 上午 1.查找关于巡墙算法的解决方案 2.完成rrt_exploration(快速随机搜索树)的下载和demo测试 下午 1.修改rrt_exploration接口 Day 07 上午 1.修改rrt_exploration接口 下午 1.修改rrt_exploration接口 Day 08 上午 1.在仿真机器人上完成快速随机搜索树自主探索建图功能 2.优化导航UI界面 下午 1.在真实机器人上完成快速随机搜索树自主探索建图功能 2.优化导航UI界面 Day 09 上午 1.分别完成导航和自主建图的move_base参数的配置 下午 1.完成rviz中marker标记 Day 10 上午 1.将marker功能添加到真实机器人上,并完成各项参数优化。 下午 1.完成代码整理,说明文档撰写。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

玳宸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值