【自主探索】基于 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,然后點擊多邊形內的任意位置。

視頻演示

看到有個博主跑這個包沒成功,出現報錯

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 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.pswp.cn/news/168076.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/168076.shtml
英文地址,請注明出處:http://en.pswp.cn/news/168076.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【科技素養】藍橋杯STEMA 科技素養組模擬練習試卷6

1、將一個空塑料袋與一個裝滿空氣的塑料袋放到秤上稱重。在兩個塑料袋本身完全一樣的情況下&#xff0c;得出的結果會是 A、空塑料袋更重 B、裝滿空氣的塑料袋更重 C、兩個塑料袋一樣重 D、無法判斷 答案&#xff1a;C 2、全球變暖帶來的一個主要影響就是海平面的上升。造…

web前端開發基礎----標準流布局和非標準流布局

1&#xff0c;標準流布局 標準流&#xff0c;也稱文檔流或普通流&#xff0c;是所有元素默認的布局方式。 在標準流中&#xff0c;元素按照其在 HTML 中出現的順序&#xff0c;自上而下依次排列&#xff0c;并占據其父容器內的可用空間。 標準流中的元素按照其自然尺寸和位置進…

uniapp實現多時間段設置

功能說明&#xff1a; 1 點擊新增時間&#xff0c;出現一個默認時間段模板&#xff0c;不能提交 2 點擊“新增時間文本”&#xff0c;彈出彈窗&#xff0c;選擇時間&#xff0c;不允許開始時間和結束時間同時為00:00&#xff0c; <view class"item_cont"> …

TCP/IP協議:最流行的電子郵件協議SMTP(簡單郵件傳輸協議)詳解

SMTP 是一種電子郵件協議&#xff0c;用于通過互聯網從一個電子郵件帳戶向另一個電子郵件帳戶發送電子郵件。它是TCP/IP協議應用層的一部分。作為一種電子郵件協議&#xff0c;它建立了不同電子郵件客戶端和帳戶之間輕松信息交換的規則。這樣&#xff0c;簡單郵件傳輸協議就可以…

求最小的起始正整數

題目描述 給你一個整數數組 nums 。你可以選定任意的 正數 startValue 作為初始值。 你需要從左到右遍歷 nums 數組&#xff0c;并將 startValue 依次累加上 nums 數組中的值。 請你在確保累加和始終大于等于 1 的前提下&#xff0c;選出一個最小的 正數 作為 startValue 。…

【Rust 日報】2023-11-23 - egui 0.24 發布

項目 - egui 0.24 發布 egui 是一個易于使用的 Rust GUI 庫&#xff0c;支持在本地環境和瀏覽器中運行。 egui 0.24 的重要新特性是多視窗功能。在支持的后端上&#xff08;如eframe&#xff09;&#xff0c;用戶可以利用全新的 viewport API 同時生成多個本機窗口。 此外&…

Git 的基本概念和使用方式。

Git 是一個開源的分布式版本控制系統&#xff0c;它可以記錄代碼的修改歷史&#xff0c;跟蹤文件的版本變化&#xff0c;并支持多人協同開發。Git 的基本概念包括&#xff1a; 1. 倉庫&#xff08;Repository&#xff09;&#xff1a;存放代碼和版本歷史記錄的地方。 2. 分支…

ArkUI開發進階—@Builder函數@BuilderParam裝飾器的妙用與場景應用

ArkUI開發進階—@Builder函數@BuilderParam裝飾器的妙用與場景應用 HarmonyOS,作為一款全場景分布式操作系統,為了推動更廣泛的應用開發,采用了一種先進而靈活的編程語言——ArkTS。ArkTS是在TypeScript(TS)的基礎上發展而來,為HarmonyOS提供了豐富的應用開發工具,使開…

Educational Codeforces Round 158 (Rated for Div. 2)(A~E)(貪心,樹形DP)

A - Line Trip 題意&#xff1a;有一條路&#xff0c;可以用一條數線來表示。你位于數線上的點 0 &#xff0c;你想從點 0 到點 x &#xff0c;再回到點 0。你乘汽車旅行&#xff0c;每行駛 1個單位的距離要花費 1 升汽油。當您從點 0出發時&#xff0c;汽車已加滿油(油箱中的…

麒麟linux離線安裝dotnet core

1. 下載 dotnet core,以3.1為例 下載地址: 下載 .NET Core 3.1 (Linux、macOS 和 Windows) 查看linux cpu類型,然后根據類型下載 uname -m #結果是: aarch64 2. 放到指定目錄,比如:/usr/dotnet 3. 解壓dotnet-sdk-3.1.426-linux-arm64.tar.gz cd /usr/dotnet tar –zxvf a…

告別算法暗處:備案帶來的光明未來

在當今數字化時代&#xff0c;算法已經成為了企業發展和創新的關鍵推動力。然而&#xff0c;伴隨著算法的廣泛應用&#xff0c;數據隱私、知識產權和法規合規等問題也引發了越來越多的關切。為了解決這些問題&#xff0c;越來越多的公司開始意識到算法備案的重要性。本文將深入…

點云從入門到精通技術詳解100篇-基于深度學習的稀疏點云障礙物檢測(續)

目錄 3.1 連續幀點云空間特征融合 3.1.1 點云預處理 3.1.2 地面分割 3.1.3 自適應點云聚類

播放器開發(三):FFmpeg與SDL環境配置

學習課題&#xff1a;逐步構建開發播放器【QT5 FFmpeg6 SDL2】 環境配置 我這邊的是使用macOS&#xff1b;IDE用的是CLion&#xff1b;CMake構建&#xff0c;除了創建項目步驟、CMakeLists文件有區別之外的代碼層面不會有太大區別。 配置上只添加一下CMakeLists中FFmpeg和SD…

Ubuntu 22.04.3編譯AOSP13刷機

文章目錄 設備信息下載AOSP并切換分支獲取設備驅動編譯系統編譯遇到的問題Cannot allocate memoryUbuntu設置USB調試刷機參考鏈接 設備信息 手機&#xff1a;Pixel 4XL 下載AOSP并切換分支 在清華大學開源軟件鏡像站下載初始化包aosp-latest.tar。 解壓縮&#xff0c;切換到…

解決LocalDateTime傳輸前端為時間的數組

問題出現如下&#xff1a; 問題出現原因&#xff1a; 默認序列化情況下會使用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS。使用這個解析時就會打印出數組。 解決方法&#xff1a; 我在全文搜索處理方法總結如下&#xff1a; 1.前端自定義函數來書寫 ,cols: [[ //表頭{…

[ubuntu]ubuntu上如何徹底卸載C++的opencv而不影響下次安裝使用

問題場景&#xff1a;我在ubuntu上安裝編譯了opencv3.4.4之后我又想安裝opencv4.5.0結果裝上后&#xff0c;opencv庫在系統目錄很混亂導致出現cmake項目出現很多錯誤。因此又想卸載掉opencv3.4.4重新安裝opencv4.5.0進去。但是如何卸載呢&#xff1f;我們知道opencv在系統里面有…

Go事件管理器:簡單實現

關注公眾號【愛發白日夢的后端】分享技術干貨、讀書筆記、開源項目、實戰經驗、高效開發工具等&#xff0c;您的關注將是我的更新動力&#xff01; 在編程中&#xff0c;事件管理器是一種常見的工具&#xff0c;用于通過通知來觸發操作。在Go語言中&#xff0c;我們可以通過創建…

Langchain的Agents介紹

??覺得內容不錯的話&#xff0c;歡迎點贊收藏加關注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后續會繼續輸入更多優質內容?? &#x1f449;有問題歡迎大家加關注私戳或者評論&#xff08;包括但不限于NLP算法相關&#xff0c;linux學習相關&#xff0c;讀研讀博…

Redis -- 介紹

1、NoSQL: 指的是非關系型數據庫&#xff0c;主要分成四大類&#xff1a;鍵值存儲數據庫、列存儲數據庫、文檔型數據庫、圖形數據庫。 2、什么是Redis&#xff1a; Redis是一種基于內存的數據庫&#xff0c;一般用于做緩存的中間件。 3、Redis的主要的特點&#xff1a; 1、Rd…

C++ 多線程鎖

目錄 1. mutex2. lock_guard3. unique_lock 是 lock_guard 的升級加強版4. condition_variable5. 調用 #include “thread” #include “mutex” #include “iostream” //! std::thread //! jion 阻塞式&#xff0c; .join()后面的代碼等待線程結束 //! detach 非阻塞式&#…