【自主探索】基于 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、要求

使用本软件包进行边界探索,需要一个真实或模拟的机器人配置,以提供以下功能:

  1. 激光扫描仪或类似传感器,可清理空间并标记障碍物。
  2. 适当配置的导航堆栈,可接受移动基地的行动目标。
  3. (可选)由 map_server、gmapping 或 move_base 提供的全局 / 地图

二、使用方法

1、用于运行演示

使用预先存在的机器人和配置,您可以运行一个演示,看看该软件包如何工作。

  1. 安装 frontier_exploration 算法
sudo apt-get install ros-kinetic-frontier-exploration ros-kinetic-navigation-stage
  1. 在独立终端逐一运行必要的节点:
roslaunch navigation_stage move_base_gmapping_5cm.launch
roslaunch navigation_stage move_base.xml
roslaunch frontier_exploration global_map.launch

弹出 RViz,然后在地图中心周围出现一个演示机器人。

  1. 在 RViz 上打开 Marker 插件(RViz 插件可在弹出窗口中选择,通过 "添加 "按钮打开)。
  2. 下拉 "Displays --> Marker --> Marker Topic "菜单,然后选择 "exploration_polygon_marker "主题。
  3. 在 RViz 的地图上,想一个您希望机器人探索的区域。
  4. 点击 RViz 顶部的 “Publish Point”。
  5. 点击该区域 n 个角中的一个角(如果您的区域是正方形/长方形,请点击 n=4 个角)。
  6. 重复上述第 6 和第 7 步 n 次。之后你会看到一个有 n 个角的多边形。
  7. 再次执行步骤 6,然后点击多边形内的任意位置。

视频演示

报错:The goal pose passed to this planner must be in the map frame. It is instead in the base_footprint frame
解决方案:在rviz中,Fixed Frame选择"map"。或者在发布move_base/goal的时候,把frame_id设置为map。

2、用于开发人员

如果你只是想开始利用这个软件包的功能,husky_navigation 软件包中的教程会有所帮助。

如果你想了解得更深入一些,一般来说,当启动 explore_server 时,它会一直旋转,直到收到一个探索目标。要提交目标:

  1. 使用 explore_client 和 RViz - 在 Rviz 中为 exploration_polygon_marker 主题创建一个标记显示,并使用工具栏上的 "Click Point "工具标记探索边界。留意 ROS 控制台对所选边界的反馈。
  2. 通过 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)。

算法流程图如下所示:
在这里插入图片描述

参考:

  1. https://github.com/paulbovbel/frontier_exploration
  2. http://wiki.ros.org/frontier_exploration
  3. ROS学习笔记之——基于frontier_exploration的机器人自主探索(未成功运行)
  4. 结合frontier_exploration + gmapping + move_base包实现指定区域建图
  5. 【SLAM】ROS平台下三种自主探索算法总结

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机图形学-变换基础

坐标系转换历程模型坐标系 -> 世界坐标系 -> 摄像机坐标系 -> 视口&#xff08;屏幕&#xff09;坐标系 变换 仿射变换和线性变换线性&#xff1a;旋转 缩放 镜像 切变放射&#xff1a; 平移 平移 2D变换矩阵 3D变换矩阵 旋转 2D旋转矩阵 //2D 旋转private (float,…

电路 buck-boost相关知识

BUCK-BOOST 文章目录 BUCK-BOOST前言一、DC-DC工作模式电容电感特性伏秒积平衡原理 二、BUCK电路三、BOOST电路四、BUCK-BOOST电路总结 前言 最近需要用到buck-boost相关的电路知识&#xff0c;于是便写下这篇文章复习一下。 一、DC-DC 在学习buck-boost电路之前我们先来看一…

TCP /UDP协议的 socket 调用的过程

在传输层有两个主流的协议 TCP 和 UDP&#xff0c;socket 程序设计也是主要操作这两个协议。这两个协议的区别是什么呢&#xff1f;通常的答案是下面这样的。 TCP 是面向连接的&#xff0c;UDP 是面向无连接的。TCP 提供可靠交付&#xff0c;无差错、不丢失、不重复、并且按序…

独乐乐不如众乐乐(二)-某汽车零部件厂商IC EMC企业规范

前言&#xff1a;该汽车零部件厂商关于IC EMC的规范可能是小编看过的企业标准里要求最明确的一份企业标准了&#xff0c;充分说明了标准方法不是死的&#xff0c;可以灵活应用。 先看看这份规范的抬头&#xff1a; 与其他企业规范一样&#xff0c;该汽车零部件厂商的IC EMC规范…

C语言之内存函数

C语言之内存函数 文章目录 C语言之内存函数1. memcpy 使⽤和模拟实现1.1 memcpy 函数的使用1.3 memcpy的模拟实现 2. memmove 使⽤和模拟实现2.1 memmove 函数的使用2.2 memmove的模拟实现 3. memset 函数的使用4. memcmp 函数的使⽤ 1. memcpy 使⽤和模拟实现 函数声明如下&a…

2023最全的自动化测试入门基础知识(超详细~)

1)首先&#xff0c;什么是自动化测试&#xff1f; 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c;在设计了测试用例并通过评审之后&#xff0c;由测试人员根据测试用例中描述的过程一步步执行测试&#xff0c;得到实际结果与期望结果的比较。…

【双十一特辑】爱心代码(程序员的浪漫)-李峋

前言 最近《点燃我温暖你》中李峋的爱心代码超级火&#xff0c;看着特别心动&#xff0c;这不&#xff0c;光棍节快到了&#xff0c;给兄弟们教学一波爱心代码&#xff0c;赶在双十一前表白&#xff0c;让这个双十一不在是孤单一个人&#xff01; 目录 前言 C语言简易爱心代码…

0002Java程序设计-springboot在线考试系统小程序

文章目录 **摘 要****目录**系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘 要 本毕业设计的内容是设计并且实现一个基于springboot的在线考试系统小程序。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&…

Java 图片验证码需求分析

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 图片验证码 需求分析 连续因输错密码而登录失败时&#xff0c;记录其连续输错密码的累加次数&#xff1b;若在次数小于5时&#xff0c;用户输入正确的密码并成功登录…

微服务负载均衡器Ribbon

1.什么是Ribbon 目前主流的负载方案分为以下两种&#xff1a; 集中式负载均衡&#xff0c;在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的&#xff08;比如 F5&#xff09;&#xff0c;也有软件的&#xff08;比如 Nginx&#xff09;。 客户端根据…

使用Kibana让es集群形象起来

部署Elasticsearch集群详细步骤参考本人&#xff1a; https://blog.csdn.net/m0_59933574/article/details/134605073?spm1001.2014.3001.5502https://blog.csdn.net/m0_59933574/article/details/134605073?spm1001.2014.3001.5502 kibana部署 es集群设备 安装软件主机名…

MQ-7一氧化碳传感器模块功能实现(STM32)

认识MQ-7模块与其工作原理 首先来认识MQ-7模块&#xff0c;MQ-7可以检测空气中的一氧化碳&#xff08;CO&#xff09;浓度。他采用半导体气敏元件来检测CO的气体浓度&#xff0c;其灵敏度高、反应速度快、响应时间短、成本低廉等特点使得它被广泛应用于智能家居、工业自动化、环…

minio客户端基本操作

minio客户端基本操作 桶 创建桶 如果要创建新的桶 输入名称&#xff0c;点击创建即可&#xff0c;默认权限就行 删除桶 点击要删除的桶 点击删除 修改桶 如果哪天需要修改桶的权限或者其他信息&#xff0c;还是先点击这个桶进入详情 然后点击要修改的属性&#xff0c;选择…

Qt5.15.2静态编译 VS2017 with static OpenSSL

几年前编译过一次Qt静态库:VS2015编译Qt5.7.0生成支持XP的静态库,再次编译,毫无压力。 一.环境 系统:Windows 10 专业版 64位 编译器:visual studio 2017 第三方工具:perl,ruby和python python用最新的3.x.x版本也是可以的 这三个工具都需要添加到环境变量,安装时勾选…

JavaScript 的初步学习上篇

JavaScript 的介绍 JavaScript 之父 布兰登 . 艾奇 (Brendan Eich) ,1995 年, 用 10 天时间完成 JavaScript 的设计. JavaScript 和 Java 的关系 两者之间就像老婆和老婆饼的关系,即毫无关系, JavaScript 最初的名字叫LiveScript,为了蹭 Java 热度,才改名为 JavaScript.JavaScr…

【2023 云栖】阿里云田奇铣:大模型驱动 DataWorks 数据开发治理平台智能化升级

云布道师 本文根据 2023 云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;田奇铣 | 阿里云 DataWorks 产品负责人 演讲主题&#xff1a;大模型驱动 DataWorks 数据开发治理平台智能化升级 随着大模型掀起 AI 技术革新浪潮&#xff0c;大数…

C#中openFileDialog控件的使用方法

目录 一、OpenFileDialog基本属性 二、使用 OpenFile 从筛选的选择中打开文件 1.示例源码 2.生成效果 3. 其它示例 三、使用 StreamReader 以流的形式读取文件 1.示例源码 2.生成效果 四、一种新颖的Windows窗体应用文件设计方法 在C#中&#xff0c;OpenFileDialog控件…

AIGC,ChatGPT AI绘画 Midjourney 注册流程详细步骤

AI 绘画,Midjourney完成高清图片绘制,轻松掌握AI工具。 前期准备: ① 一个能使用的谷歌账号 ② 可以访问外网 Midjourney注册 1.进入midjourney官网https://www.midjourney.com 点击左下角”Join the Beta”,就可以注册,第一次使用的小伙伴会弹出提示,只需要点击Acc…

C语言程序设计知识点总结归纳(全书)

C知识点总结归纳目录 第一章 程序设计和C语言一、C的入门小概念二、程序设计的问题三、首先要搞清楚编译器、编辑器和IDE的区别 第二章 算法——程序的灵魂一、程序算法数据结构二、算法的特性三、怎样表示一个算法四、结构化程序的设计方法 第三章 C程序设计——顺序程序设计一…

vue3+ts 依赖注入 provide inject

父级&#xff1a; <template><div><h1>App.vue (爷爷级别)</h1><label><input type"radio" v-model"colorVal" value"red" name"color" />红色</label><label><input type"r…