【自主探索】基于 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] …...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
