【自主探索】基于 frontier_exploration 的单个机器人自主探索建图
文章目录
- 一、概述
- 1、功能
- 2、要求
- 二、使用方法
- 1、用于运行演示
- 2、用于开发人员
- 2.1. 探索无/地图数据
- 2.2. 使用 /map 数据进行探索
- 三、提供的组件
- 1、explore_client
- 1.1. 调用的操作
- 1.2. 订阅主题
- 1.3. 发布主题
- 2、explore_server
- 2.1. 提供的操作
- 2.2. 调用的操作
- 2.3. 调用的服务
- 2.4. 参数
- 3、BoundedExploreLayer
- 3.1. 发布主题
- 3.2. 服务
- 3.3. 参数
一、概述
尝试 frontier_exploration 的最佳方法是使用 husky_navigation 中提供的演示,请参阅演示教程。
1、功能
frontier_exploration 软件包提供了 costmap_2d 层插件 BoundedExploreLayer 以及 actionlib 客户端/服务器节点 explore_client 和 explore_server。
所提供的节点可用于演示成本图层的功能,方法是执行一个以用户定义的多边形区域为边界的边界探索任务。
BoundedExploreLayer 图层当然也可用于执行更复杂的勘探任务,其功能通过两个服务实现: UpdatePolygonBoundary 和 GetNextFrontier。
2、要求
使用本软件包进行边界探索,需要一个真实或模拟的机器人配置,以提供以下功能:
- 激光扫描仪或类似传感器,可清理空间并标记障碍物。
- 适当配置的导航堆栈,可接受移动基地的行动目标。
- (可选)由 map_server、gmapping 或 move_base 提供的全局 / 地图
二、使用方法
1、用于运行演示
使用预先存在的机器人和配置,您可以运行一个演示,看看该软件包如何工作。
- 安装 frontier_exploration 算法
sudo apt-get install ros-kinetic-frontier-exploration ros-kinetic-navigation-stage
- 在独立终端逐一运行必要的节点:
roslaunch navigation_stage move_base_gmapping_5cm.launch
roslaunch navigation_stage move_base.xml
roslaunch frontier_exploration global_map.launch
弹出 RViz,然后在地图中心周围出现一个演示机器人。
- 在 RViz 上打开 Marker 插件(RViz 插件可在弹出窗口中选择,通过 "添加 "按钮打开)。
- 下拉 "Displays --> Marker --> Marker Topic "菜单,然后选择 "exploration_polygon_marker "主题。
- 在 RViz 的地图上,想一个您希望机器人探索的区域。
- 点击 RViz 顶部的 “Publish Point”。
- 点击该区域 n 个角中的一个角(如果您的区域是正方形/长方形,请点击 n=4 个角)。
- 重复上述第 6 和第 7 步 n 次。之后你会看到一个有 n 个角的多边形。
- 再次执行步骤 6,然后点击多边形内的任意位置。
视频演示
看到有个博主跑这个包没成功,出现报错
ERROR: cannot launch node of type [frontier_exploration/explore_client]: Cannot locate node of type [explore_client] in package [frontier_exploration]. Make sure file exists in package path and permission is set to executable (chmod +x)
ERROR: cannot launch node of type [frontier_exploration/explore_server]: Cannot locate node of type [explore_server] in package [frontier_exploration]. Make sure file exists in package path and permission is set to executable (chmod +x)
评论区说编译通过以后在/catkin_ws/devel/lib/frontier_exploration下没有任何文件,所以会出现此报错,感觉包本身是有问题的
2、用于开发人员
如果你只是想开始利用这个软件包的功能,husky_navigation 软件包中的教程会有所帮助。
如果你想了解得更深入一些,一般来说,当启动 explore_server 时,它会一直旋转,直到收到一个探索目标。要提交目标:
- 使用 explore_client 和 RViz - 在 Rviz 中为 exploration_polygon_marker 主题创建一个标记显示,并使用工具栏上的 "Click Point "工具标记探索边界。留意 ROS 控制台对所选边界的反馈。
- 通过 actionlib SimpleActionClient,用自己的节点向服务器提交目标。
探索目标包含一个开始探索的初始点和一个限制探索范围的多边形边界。要运行无边界探索任务,只需将边界留空即可。
服务器收到目标后,就会创建初始探索地图,开始处理传感器/成本地图数据,并发出 move_base 行动目标。默认情况下,探索任务将探索边界内的所有区域(无论之前是否访问过)。下面提供了几种使用案例的启动文件示例。
2.1. 探索无/地图数据
在没有全局/地图信息源的情况下运行动作服务器/客户端时,请启用 resize_too_boundary 参数,以便根据动作目标的多边形边界动态调整地图大小。当机器人在探索边界外行进时,costmap_2d 会出现传感器超出地图边界的错误信息。这些信息可以安全地忽略,也可以使用 rosconsole 配置文件加以抑制。
如果不使用 resize_to_boundary(例如运行无边界探索),请确保成本地图配置了足够大的高度/宽度。
启动文件示例:no_global_map.launch
<launch><!-- Set to your sensor's range --><arg name="sensor_range" default="1.0"/><node pkg="frontier_exploration" type="explore_client" name="explore_client" output="screen"/><node pkg="frontier_exploration" type="explore_server" name="explore_server" output="screen" ><param name="frequency" type="double" value="2.0"/><param name="goal_aliasing" type="double" value="$(arg sensor_range)"/>#All standard costmap_2d parameters as in move_base, other than BoundedExploreLayer<rosparam ns="explore_costmap" subst_value="true">#Sample parametersfootprint: [[0.1, 0.0], [0.0, 0.1], [0.0, -0.1], [-0.1, 0.0]]robot_radius: 0.10transform_tolerance: 0.5update_frequency: 5.0publish_frequency: 5.0global_frame: maprobot_base_frame: base_linkresolution: 0.05rolling_window: falsetrack_unknown_space: trueplugins: - {name: explore_boundary, type: "frontier_exploration::BoundedExploreLayer"}- {name: sensor, type: "costmap_2d::ObstacleLayer"}- {name: inflation, type: "costmap_2d::InflationLayer"}explore_boundary:resize_to_boundary: truefrontier_travel_point: closestsensor:observation_sources: laserlaser: {data_type: LaserScan, clearing: true, marking: true, topic: scan, inf_is_valid: true, raytrace_range: $(arg sensor_range), obstacle_range: $(arg sensor_range)}inflation:inflation_radius: 0.15</rosparam></node>
</launch>
2.2. 使用 /map 数据进行探索
在使用全局 /map 信息源(来自 map_server 或 gmapping)运行动作服务器/客户端时,勘探成本地图的大小/分辨率将与静态图层加载的外部地图源地图相匹配,因此必须禁用 resize_too_boundary 参数,并且勘探成本地图的 global_frame 必须与外部 /map 相匹配。
使用 gmapping 进行探索时,还必须禁用 explore_clear_space,以防止节点重新探索已知区域。
启动文件示例:global_map.launch
<launch><!-- Set to your sensor's range --><arg name="sensor_range" default="1.0"/><node pkg="frontier_exploration" type="explore_client" name="explore_client" output="screen"/><node pkg="frontier_exploration" type="explore_server" name="explore_server" output="screen" ><param name="frequency" type="double" value="2.0"/><param name="goal_aliasing" type="double" value="$(arg sensor_range)"/>#All standard costmap_2d parameters as in move_base, other than BoundedExploreLayer<rosparam ns="explore_costmap" subst_value="true">footprint: [[0.1, 0.0], [0.0, 0.1], [0.0, -0.1], [-0.1, 0.0]]robot_radius: 0.10transform_tolerance: 0.5update_frequency: 5.0publish_frequency: 5.0#must match incoming static mapglobal_frame: maprobot_base_frame: base_linkresolution: 0.05rolling_window: falsetrack_unknown_space: trueplugins: - {name: static, type: "costmap_2d::StaticLayer"} - {name: explore_boundary, type: "frontier_exploration::BoundedExploreLayer"}#Can disable sensor layer if gmapping is fast enough to update scans- {name: sensor, type: "costmap_2d::ObstacleLayer"}- {name: inflation, type: "costmap_2d::InflationLayer"}static:#Can pull data from gmapping, map_server or a non-rolling costmap map_topic: /map# map_topic: move_base/global_costmap/costmap subscribe_to_updates: trueexplore_boundary:resize_to_boundary: falsefrontier_travel_point: middle#set to false for gmapping, true if re-exploring a known areaexplore_clear_space: falsesensor:observation_sources: laserlaser: {data_type: LaserScan, clearing: true, marking: true, topic: scan, inf_is_valid: true, raytrace_range: $(arg sensor_range), obstacle_range: $(arg sensor_range)}inflation:inflation_radius: 0.15</rosparam></node></launch>
三、提供的组件
1、explore_client
explore_client 节点侦听 Rviz 发布的点,并构建一个 ExploreTask 行动目标发送给 explore_server。
1.1. 调用的操作
explore_server(frontier_exploration/ExploreTask)
向 explore_server 发送探索目标的客户端。
1.2. 订阅主题
/clicked_point(geometry_msgs/PointStamped)
从 rviz 工具点击的点。
1.3. 发布主题
exploration_polygon_marker(visualization_msgs/Marker)
通过点击点实现边界可视化。
2、explore_server
explore_server 节点为所有已连接的客户端执行探索操作。它使用 costmap_2d 对象来跟踪探索进度,并在必要时为 move_base 创建移动目标。
2.1. 提供的操作
explore_server(frontier_exploration/ExploreTask)
接收勘探任务请求的服务器
2.2. 调用的操作
move_base(move_base_msgs/MoveBaseAction)
向 move_base 发送移动目标的客户端。
2.3. 调用的服务
~explore_costmap/explore_boundary/update_boundary_polygon(frontier_exploration/UpdateBoundaryPolygon)
(来自 Costmap 的内部服务)为勘探任务设置边界。~explore_costmap/explore_boundary/get_next_frontier(frontier_exploration/GetNextFrontier)
(来自 Costmap 的内部服务)获取下一个要探索的边界的姿态。
2.4. 参数
~explore_costmap(插件)
内部 costmap 图层的配置,预计包含 BoundedExploreLayer。~frequency(浮点数,默认值:0.0)
为下一个边界目标重新处理代价图的频率。如果频率为 0.0,则只有在通过 move_base 达到上一个边界目标时,才会询问新的边界目标。频率越高,提交 move_base 目标的频率越高,探索过程也就越 “平滑”。~goal_aliasing(浮点数,默认值:0.1)
当频率 > 0.0 时,~goal_aliasing 是在新目标提交给 move_base 之前,上一个目标和新目标之间所需的距离 delta。在 sensor_range/2 > ~goal_aliasing > 0.0 范围内的任何位置设置都是安全的,而且该参数将减少 "平滑 "探索过程中发送的冗余目标数量。
3、BoundedExploreLayer
frontier_exploration::BoundedExploreLayer 层是一个 costmap_2d 插件,它实现了执行边界探索任务所需的若干功能。
3.1. 发布主题
~frontiers(sensor_msgs/PointCloud2)
点云 pcl::Pointcloud< pcl::PointXYZI> 在调用 ~get_next_frontier 服务时标记检测到的所有边界,并使用强度较高的点标记所选边界。
3.2. 服务
~update_boundary_polygon(frontier_exploration/UpdateBoundaryPolygon)
为探索任务设置边界。~get_next_frontier(frontier_exploration/GetNextFrontier)
获取下一个探索边界的姿态。
3.3. 参数
~resize_too_boundary(bool,默认:false)
当通过 ~update_boundary_polygon 接收到多边形边界时,会根据边界极值调整图层父成本贴图的大小。~frontier_travel_point(字符串,默认:最近)
通过 ~get_next_frontier 输出下一个边界的姿态时,定义要输出为 pose.position 的边界几何属性。可用:离机器人最近的点、边界的中间点、所有边界点的中心点(笛卡尔平均值)。~explore_clear_space(bool,默认:true)
配置探索任务是探索所有清晰空间(true),还是只探索未知空间(false)。
算法流程图如下所示:

参考:
- https://github.com/paulbovbel/frontier_exploration
- http://wiki.ros.org/frontier_exploration
- ROS学习笔记之——基于frontier_exploration的机器人自主探索(未成功运行)
- 结合frontier_exploration + gmapping + move_base包实现指定区域建图
- 【SLAM】ROS平台下三种自主探索算法总结
相关文章:
【自主探索】基于 frontier_exploration 的单个机器人自主探索建图
文章目录 一、概述1、功能2、要求 二、使用方法1、用于运行演示2、用于开发人员2.1. 探索无/地图数据2.2. 使用 /map 数据进行探索 三、提供的组件1、explore_client1.1. 调用的操作1.2. 订阅主题1.3. 发布主题 2、explore_server2.1. 提供的操作2.2. 调用的操作2.3. 调用的服务…...
模板初阶(1):函数模板,类模板
一、函数模板 1.1 概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。 格式: template <typename T>或template <class T> template <class T>…...
AIGC: 关于ChatGPT中生成输出表格/表情/图片/图表这些非文本的方式
ChatGPT 不止是 文本输出 ChatGPT是一个文本模型, 它本身并不能直接去生成图片图表等内容在我们的工作当中,经常需要通过表格, 图表的方式去进行数据的处理和展示在这种情况下,GPT由于不支持去直接的生成图片和图表,我们还能够使用它的GPT帮…...
gen_arrow_contour_xld
area_center (SymbolRegions, Area, Row, Col) gen_arrow_contour_xld (Arrow, Row sin(rad(Orientation)) * 70, Col - cos(rad(Orientation)) * 70, Row - sin(rad(Orientation)) * 70, Col cos(rad(Orientation)) * 70, 25, 25) gray_range_rect:用一个矩形…...
智能时代的智能工具(gpt)国产化助手
目前gpt对代码以及其他领域都是可以支持,在国内有很多,常用的百度的 文心一言 ,阿里的 通义千问 ,还有(“豆包”,“”讯飞星火“”)等,除了写代码可以外,也可以很好的支持…...
量子计算 | 解密著名量子算法Shor算法和Grover算法
专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https:/…...
缓存组件状态,提升用户体验:探索 keep-alive 的神奇世界
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...
万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志文件配置
万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志文件配置 前言 在 Python 的logging模块中,它不仅提供了基础的日志功能,还拥有一系列高级配置选项来满足复杂应用的日志管理需求。 说到logging 模块的高级配置,必须提及日…...
LeetCode解法汇总1410. HTML 实体解析器
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 「HTML 实…...
OpenGL 绘制旋转球(Qt)
文章目录 一、简介二、实现代码三、实现效果一、简介 这里其实就是指三个互相垂直的三个圆形,正好之前已经完成了圆形平面的绘制,那么这里就需要对之前的圆形进行一些改造,使得它们可以以任意一种姿态在OpenGL中进行绘制(添加变换矩阵)。 这里同样对其进行封装,具体内容如…...
解决:javax.websocket.server.ServerContainer not available 报错问题
原因: 用于扫描带有 ServerEndpoint 的注解成为 websocket,该方法是 服务器端点出口,当进行 SpringBoot 单元测试时,并没有启动服务器,所以当加载到这个bean时会报错。 解决方法: 加上这个注解内容 Spr…...
81基于matlab GUI的图像处理
基于matlab GUI的图像处理,功能包括图像颜色处理(灰度图像、二值图像、反色变换、直方图、拉伸变换);像素操作(读取像素、修改像素)、平滑滤波(均值平滑、高斯平滑、中值平滑)、图像…...
虚拟机系列:vmware和Oracle VM VirtualBox虚拟机的区别,简述哪一个更适合我?以及相互转换
一. VMware和Oracle VM VirtualBox虚拟机的区别主要体现在以下几个方面: 首先两种软件的安装使用教程如下: VMware ESXI 安装使用教程 Oracle VM VirtualBox安装使用教程 商业模式:VMware是一家商业公司,而Oracle VM VirtualBox是开源软件; 功能:VMware拥有更多的功能和…...
Go lumberjack 日志轮换和管理
在开发应用程序时,记录日志是一项关键的任务,以便在应用程序运行时追踪问题、监视性能和保留审计记录。Go 语言提供了灵活且强大的日志记录功能,可以通过多种方式配置和使用。其中一个常用的日志记录库是 github.com/natefinch/lumberjack&am…...
git常用命令(git github ssh)
目录 1、语法说明2、本地仓库相关操作建立一个git文件(git init)把工作区的文件添加到暂存区(git add)把暂存区的文件添加到本地仓库(git commit)查看暂存区和本地仓库中的文件(git ls-files)查看文件夹下所有文件的状态(git status)查看版本库中的提交记录(git log)恢复的文件…...
完美解决:Nginx访问PHP出现File not found.
目录 解决方法一: 解决方法二: 遇到 File not found. 出现的问题解决: 解决方法一: 修改nginx的主配置文件。 vi /etc/nginx/nginx.conf location ~ \.php$ { root html; fastcgi_pass …...
音视频5、libavformat-2
4、封装 Muxers (封装器)以 AVPacket 的形式获取编码数据并将其写入到指定容器格式的文件或输出字节流中。 muxing过程中最重要的API函数有: avformat_write_header() 用于写入文件header; av_write_frame() / av_interleaved_write_frame() 用于写…...
python opencv -模板匹配
python opencv -模板匹配 模板匹配就是,我们现有一个模板和一个图片,然后,在这个图片中寻找和模板近似的部分。 在opencv 中主要通过cv2.matchTemplate这个函数去实现。 下面我们先看一下,模板图片和需要匹配的图片:…...
大数据技能大赛(高职组)答案
任务C:数据挖掘(10分) 所有模块都有,不是白嫖!!有需要可以联系我 环境说明: 服务端登录地址详见各任务服务端说明。 补充说明:各节点可通过Asbru工具或SSH客户端进行SSH访问…...
C++动态规划算法:最多可以参加的会议数目
本周推荐阅读 C二分算法:得到子序列的最少操作次数 本题的其它解法 C二分算法:最多可以参加的会议数目 II 本文涉及的基础知识点 二分查找算法合集 题目 给你一个 events 数组,其中 events[i] [startDayi, endDayi, valuei] …...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
