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

news2025/1/10 16:42:00

文章目录

      • 一、简介
      • 二、安装 explore_lite
      • 三、launch 文件配置
      • 四、实验效果
      • 五、常见问题

机器人自主建图有很多方式,比如基于位置边界的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可视化界面、自主建图程序。

附:

1、各个节点后的节点图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/388788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL速查

学习自C语言中文网SQL教程笔记&#xff0c;该笔记为速查笔记&#xff0c;学习还是看原教程文章&#xff1a;http://c.biancheng.net/sql/ SQL命令 SQL 是关系型数据库的标准语言&#xff0c;SQL关键字不区分大小写 SQL语句分为以下三种类型&#xff1a; DML: Data Manipulat…

中国不缺高端产品,缺的只是高端服务

作者 | 曾响铃 文 | 响铃说 最近&#xff0c;响铃受邀参加了讯飞智能办公本莫比俱乐部在广州举办的用户研学活动&#xff0c;感触颇多。 为什么会有这趟经历&#xff1f;说来也巧&#xff0c;前段时间因为开会需要入手了讯飞智能办公本X2&#xff0c;成了他们的用户&#xf…

20- tensorflow实现 10_monkeys分类 (tensorflow系列) (项目二十)

项目要点 10-monkey-species&#xff0c;是十个种类的猴子的图像集。txt 文件读取: labels pd.read_csv( ./monkey_labels.txt , header 0)训练数据 图片数据增强: # 图片数据生成器 # 图片数据生成器 train_datagen keras.preprocessing.image.ImageDataGenerator(rescal…

docker升级后启动失败 需要指定storage driver

问题描述&#xff1a;闲来无事就在开发电脑上执行了下sudo apt-get upgrade 升级下软件, 升级后docker启动失败.使用 journalctl -xeu docker.service 查看docker执行日志&#xff1a;Mar 04 16:48:10 pop-os dockerd[39273]: time"2023-03-04T16:48:10.35187991208:00&qu…

[Java代码审计]—OFCMS

环境搭建 下载地址&#xff1a;https://gitee.com/oufu/ofcms/repository/archive/V1.1.2?formatzip 项目导入idea&#xff0c;创建数据库&#xff0c;配置下tomcat就行&#xff0c;但要注意必须tomcat>8.5&#xff0c;mysql>5.7 漏洞分析 任意文件写入 com.ofsoft…

打包可执行文件

将Python脚本打包成可执行文件的方法&#xff1a;使用pip安装PyInstaller&#xff1a;pip install pyinstaller打开终端并导航到包含Python脚本的目录。运行PyInstaller创建可执行文件&#xff1a;pyinstaller --onefile phonequeryresult.py将my_script.py替换为您的脚本名称。…

SpringBoot(tedu)——day01——环境搭建

SpringBoot(tedu)——day01——环境搭建 目录SpringBoot(tedu)——day01——环境搭建零、今日目标一、IDEA2021项目环境搭建1.1 通过 ctrl鼠标滚轮 实现字体大小缩放1.2 自动提示设置 去除大小写匹配1.3 设置参数方法自动提示1.4 设定字符集 要求都使用UTF-8编码1.5 设置自动编…

LDO的强力对手

开题前咋们先来温习下LDO的特点以及选型要点&#xff1a; 特点&#xff1a;纹波噪声小&#xff0c;响应快&#xff0c;低静态电流&#xff0c;外围电路简单&#xff1b;损耗大&#xff0c;输出电流小。常用于小电流的模拟电路供电。 选型要点&#xff1a;纹波噪声&#xff0c…

TEX:文档的布局与组织

文章目录标准的类选项指定纸张大小页面格式其他选项与某些选项相关的参数页面样式页眉页的编号fancyhdr页眉页脚宏包(重)定义fancy页面样式Using extramarks文档中页面风格切换与段落有关的距离页面格式单双列页面文档中的部分标题摘要章节附录书的结构目录表自动条目显示目录表…

XMLHttpRequest、ajax、Promise、axios、async await

1.XMLHttpRequest(xhr) 什么是xhr xhr是浏览器提供的js对象&#xff0c;通过它来向服务器来请求资源。jquery中的Ajax是基于xhr对象来封装资源的 使用xhr发起get请求 // 1. 创建 XHR 对象var xhr new XMLHttpRequest()console.log(xhr, 我是xhr);// 2. 调用 open 函数xhr.…

性能优化(2)-渲染优化

一、渲染优化 如果把浏览器呈现页面的整个过程一分为二,前面所讲的主要是浏览器为呈现页面请求所需资源的部分;本章将主要关注浏览器获取到资源后,进行渲染部分的相关优化内容。 在前面的前端页面的生命周期课程中,介绍过关键渲染路径的概念,浏览器通过这个过程对HTML,CSS, J…

<学习笔记>从零开始自学Python-之-web应用框架Django( 十二)上下文处理器

1.在模板中处理上下文处理 上下文就是一系列模板变量和相应的值。模板使用上下文填充变量&#xff0c;放到标签里显示在页面。在 Django 中&#xff0c;上下文使用 django.template 模块中的 Context 类表示。 它的构造方法接受一个可选参数&#xff1a;一个字典&#xff0…

HCIE-Cloud Computing LAB备考第二步:逐题攻破--第二题:FusionAccess-思维导图+题目=建立逻辑

第二题 FusionAccess markmap思维导图1 将上述思维导图跟下述题目结合,以题目顺序辅助记忆思维导图,有了思维大纲,做起实验,也就有逻辑线路,必定手掐把拿。 2.1 搭建FA实验环境(随机二考一) FA1、FA2两台服务器,请通过VNC登陆,按照题目要求根据服务器参数选择安装对…

推荐几款主流好用的markdown编辑器

介绍 随着技术的不断发展和人们对效率的追求&#xff0c;Markdown 编辑器已经成为了许多人写作的首选工具。Markdown 是一种轻量级的标记语言&#xff0c;使用简单&#xff0c;方便快捷&#xff0c;且可以方便地转换成各种格式的文件。在这篇文章中&#xff0c;我们将介绍几款…

移动端适配之动态 rem 方案

代码 就是设置浏览器字体&#xff0c;从而实现根据屏幕动态计算大小 <script>const WIDTH 750; // 设计图尺寸const setView () > {document.documentElement.style.fontSize screen.width / WIDTH "px";};window.onorientationchange setView;setVi…

JUC入门 | 黑马

一、进程和线程 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至CPU&#xff0c;数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理I0的 当一个程序被运行&a…

OpenGL中的坐标系

1、2D笛卡尔坐标系2D笛卡尔坐标系跟我们高中的时候学习的坐标系一样&#xff0c;是由x、y决定的。2、3D笛卡尔坐标系3D笛卡尔坐标系坐标由x、y、z决定&#xff0c;满足右手定则。3、视口glViewport(GLint x,GLint y,GLsizei width,GLsizei height)窗口和视口大小可以相同&#…

手敲Mybatis-反射工具天花板

历时漫长的岁月&#xff0c;终于鼓起勇气继续研究Mybatis的反射工具类们&#xff0c;简直就是把反射玩出花&#xff0c;但是理解起来还是很有难度的&#xff0c;涉及的内容代码也颇多&#xff0c;所以花费时间也比较浩大&#xff0c;不过当了解套路每个类的功能也好&#xff0c…

@mixin与@include介绍

目录mixin与include介绍定义一个mixin使用mixin传递变量如何引入mixinmixin与include介绍 在Sass里面&#xff0c;我们经常会见到mixin与include。 其中 mixin允许定义一个可以在整个样式表中重复使用的样式 include就是将我们定义的mixin引入到文档中 定义一个mixin mixin…

【春招面经】视源股份前端一面

前言 本次主要记录一下视源股份CVTE前端一面 &#xff08;3.3下午4点15&#xff09; 文章目录前言本次主要记录一下视源股份CVTE前端一面 &#xff08;3.3下午4点15&#xff09;问题总结介绍一下项目的来源以及做这个项目的初衷一直监听滚动&#xff0c;有没有对性能产生影响&a…