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

news2024/10/6 6:46:50

文章目录

  • 一、概述
    • 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,然后点击多边形内的任意位置。

视频演示

看到有个博主跑这个包没成功,出现报错

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 时,它会一直旋转,直到收到一个探索目标。要提交目标:

  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 parameters
            footprint: [[0.1, 0.0], [0.0, 0.1], [0.0, -0.1], [-0.1, 0.0]]
            robot_radius: 0.10
            
            transform_tolerance: 0.5
            update_frequency: 5.0
            publish_frequency: 5.0

            global_frame: map
            robot_base_frame: base_link
            resolution: 0.05

            rolling_window: false
            track_unknown_space: true

            plugins: 
         
                - {name: explore_boundary, type: "frontier_exploration::BoundedExploreLayer"}
                - {name: sensor,           type: "costmap_2d::ObstacleLayer"}
                - {name: inflation,        type: "costmap_2d::InflationLayer"}

            explore_boundary:
                resize_to_boundary: true
                frontier_travel_point: closest

            sensor:
                observation_sources: laser
                laser: {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.10
            
            transform_tolerance: 0.5
            update_frequency: 5.0
            publish_frequency: 5.0

            #must match incoming static map
            global_frame: map
            robot_base_frame: base_link
            resolution: 0.05

            rolling_window: false
            track_unknown_space: true

            plugins: 

                - {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: true

            explore_boundary:
                resize_to_boundary: false
                frontier_travel_point: middle
                #set to false for gmapping, true if re-exploring a known area
                explore_clear_space: false

            sensor:
                observation_sources: laser
                laser: {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.coloradmin.cn/o/1247928.html

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

相关文章

手把手教你,怎么制作出满意的组织架构图

组织架构图在企业管理中起着重要的作用&#xff0c;它可以清晰地展示一个组织的层级结构、职责分工和工作流程。通过组织架构图&#xff0c;领导者可以更好地了解和掌握企业的人员组成和管理情况&#xff0c;帮助他们做出更明智的决策。此外&#xff0c;组织架构图也可以提高企…

首先啊骚年们我们必须先了解网络安全这个行业究竟是干啥的。

导 读 近年来&#xff0c;人工智能、5G、量子信息技术、工业互联网、大数据、云计算、物联网、虚拟现实、区块链等具有颠覆性的战略性新技术突飞猛进&#xff0c;但伴随着互联网技术的发展&#xff0c;网络安全问题也日趋多样化&#xff0c;甚至严重威胁到国家、企业&#xff…

03.依赖倒置原则(Dependence Inversion Principle)

概述 高层模块不应依赖低层模块&#xff0c;二者都应该依赖其抽象。而抽象不应依赖细节&#xff0c;细节应该依赖抽象。依赖倒置原则的中心思想其实就是面向接口编程。 相对于细节的多变性&#xff0c;抽象的东西会稳定的多&#xff0c;所以以抽象为基础搭建的架构自然也会比以…

【Tiny_CD】Tiny_CD变化检测网络详解(含python代码)

题目:TinyCD: A (Not So) Deep Learning Model For Change Detection 论文:paper 代码:code 目录 🍟 🍟1.摘要 🍗🍗 2.贡献 🍖🍖 3.网络结构

语音合成综述Speech Synthesis

一、语音合成概述 语音信号的产生分为两个阶段&#xff0c;信息编码和生理控制。首先在大脑中出现某种想要表达的想法&#xff0c;然后由大脑将其编码为具体的语言文字序列&#xff0c;及语音中可能存在的强调、重读等韵律信息。经过语言的组织&#xff0c;大脑通过控制发音器…

python中pprint()与print()

平常经常使用print()&#xff0c;今天突然看到pprint()&#xff0c;好奇查了下&#xff0c;记录。 统而言之&#xff0c;pprint()更适合打印结构化数据&#xff0c;对于可读性有很大的提升 这里有两个对象在一个arry里面&#xff0c;普通的print直接全部打印出来&#xff0c;而…

贝锐花生壳:无需公网IP、简单3步,远程访问群晖NAS

面对NAS远程访问难题&#xff0c;贝锐花生壳一招搞定&#xff01;并且无需公网IP、简单3步&#xff0c;即可实现固定域名远程访问NAS。 步骤1&#xff1a; 目前&#xff0c;群晖NAS已在套件中心内置花生壳客户端。 浏览器进入群晖NAS的DSM管理界面&#xff0c;点击【套件中心】…

机器学习算法(1)——简单线性回归

一、说明 在在这篇文章中&#xff0c;我们将学习我们的第一个机器学习算法&#xff0c;称为简单线性回归。这是一个重要的算法&#xff0c;因为当您可能正在学习第一个神经网络&#xff08;称为人工神经网络&#xff09;时&#xff0c;在此算法中学习的技术也适用于深度学习。我…

OpenStack云计算平台

目录 一、OpenStack 1、简介 2、硬件需求 3、网络 二、环境搭建 1、安全 2、主机网络 3、网络时间协议(NTP) 4、OpenStack包 5、SQL数据库 6、消息队列 7、Memcached 一、OpenStack 1、简介 官网&#xff1a;https://docs.openstack.org/2023.2/ OpenStack系统由…

简单使用YOLOv5自己训练模型

使用YOLOv5自己训练模型 前言&#xff1a;本文基于我的另一篇文章作为基础&#xff0c;文章戳这里&#xff0c;主要还是实操为主&#xff0c;让大家能快速上手使用。 数据集构建 1.准备工作 数据收集&#xff1a; 图片类型数据 视频类型数据&#xff08;使用opencv进行视频…

矩阵论(Matrix)

​ 大纲 矩阵微积分&#xff1a;多元微积分的一种特殊表达&#xff0c;尤其是在矩阵空间上进行讨论的时候逆矩阵(inverse matrix)矩阵分解&#xff1a;特征分解&#xff08;Eigendecomposition&#xff09;&#xff0c;又称谱分解&#xff08;Spectral decomposition&#xf…

【MATLAB源码-第88期】基于matlab的灰狼优化算法(GWO)的栅格路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;是一种模仿灰狼捕食行为的优化算法。灰狼是群居动物&#xff0c;有着严格的社会等级结构。在灰狼群体中&#xff0c;通常有三个等级&#xff1a;首领&#xff…

java中 自动装箱与拆箱,基本数据类型,java堆与栈,面向对象与面向过程

文章目录 自动装箱与拆箱基本数据类型与包装类的区别&#xff08;int 和 Integer 有什么区别&#xff09;应用场景的区别&#xff1a; 堆和栈的区别重点来说一下堆和栈&#xff1a;那么堆和栈是怎么联系起来的呢? 堆与栈的区别 很明显&#xff1a;延伸&#xff1a;关于Integer…

python opencv 边缘检测(sobel、沙尔算子、拉普拉斯算子、Canny)

python opencv 边缘检测&#xff08;sobel、沙尔算子、拉普拉斯算子、Canny&#xff09; 这次实验&#xff0c;我们分别使用opencv 的 sobel算子、沙尔算子、拉普拉斯算子三种算子取进行边缘检测&#xff0c;然后后面又使用了Canny算法进行边缘检测。 直接看代码&#xff0c;代…

【腾讯云云上实验室-向量数据库】基于向量数据的客户价值体系推荐系统设计

【腾讯云云上实验室-向量数据库】深入浅出-基于向量分析的客户价值体系推荐系统设计 前言 很早之前就有过想写推荐系统系列文章了&#xff0c;本人曾任职高级大数据工程师全程参与过推荐系统的搭建&#xff0c;故在搭建推荐系统算得上是有一定的经验。推荐系统搭建有相当多的…

UI自动化(selenium+python)之元素定位的三种等待方式!

前言 在UI自动化过程中&#xff0c;常遇到元素未找到&#xff0c;代码报错的情况。这种情况下&#xff0c;需要用等待wait。 在selenium中可以用到三种等待方式即sleep,implicitly_wait,WebDriverWait 一、固定等待(sleep) 导入time模块&#xff0c;设定固定的等待时间 缺…

【点云surface】无序点云快速三角化

1 介绍 GreedyProjectionTriangulation 是一种基于局部二维投影的三维点贪婪三角剖分算法的实现。它假定局部表面光滑&#xff0c;不同点密度区域之间的过渡相对平滑。 GreedyProjectionTriangulation算法的基本思想是通过逐步投影点云数据到一个三角化网格上来进行重建。它首…

Pycharm创建项目新环境,安装Pytorch

在python项目中&#xff0c;很多项目使用的各类包的版本是不一致的。所以我们可以对每个项目有专属于它的环境。所以这个文章就是教你如何创建新环境。 一、创建新环境 二、下载安装包 在下载安装包时&#xff0c;可以加入清华源&#xff0c;这样下载更快&#xff01;不然有时…

消息推送到微信,快速实现WxPusher

文章目录 前言一、平台二、代码总结 前言 我的博客里也有其他方法&#xff0c;测试了下感觉这个方法还是比较实用。 一、平台 先仔细阅读下平台的使用方法。 平台地址请点击 二、代码 import requests text 孪生网络模型已经训练完成&#xff0c;请注意查阅相关信息。 req…

学习Pandas 二(Pandas缺失值处理、数据离散化、合并、交叉表与透视表、分组与聚合)

文章目录 六、高级处理-缺失值处理6.1 检查是否有缺失值6.2 缺失值处理6.3 不是缺失值NaN&#xff0c;有默认标记的 七、高级处理-数据离散化7.1 什么是数据的离散化7.2 为什么要离散化7.3 如何实现数据的离散化 八、高级处理-合并8.1 pc.concat实现合并&#xff0c;按方向进行…