rrt_exploration


一個實現基於多機器人RRT的地圖探測算法的ROS包。 它還具有使用圖像處理來提取邊界點的基於圖像的邊沿檢測

1.介紹

“rrt_exploration”是實現移動機器人的多機器人地圖探索算法的ROS包。 它是基於快速探索隨機樹(RRT)算法。 它使用占用網格作為地圖表示。該包具有5個不同的ROS節點:

1 全局RRT邊界點檢測器節點。

2 局部RRT邊界點檢測器節點。
3 基於OpenCV的邊界檢測器節點。
4 濾波器節點。
5 分配器節點。

 

  • Global RRT frontier point detector node.
  • Local RRT frontier point detector node.
  • OpenCV-based frontier detector node.
  • Filter node.
  • Assigner node.

 

這是一個播放列表,顯示在真實機器人上運行的軟件包和Gazebo模擬:

2.軟件包要求

該套件已經在ROS Kinetic和ROS Indigo上進行了測試,它應該可以在其他發行版上工作,如jade。 在安裝軟件包之前需要以下要求:
1-你應該安裝一個ROS發行版(indigo or later. Recommended is either indigo or kinetic)。
2-創建工作空間。
3-安裝了“gmapping”ROS包,可以在終端中鍵入以下命令:

$ sudo apt-get install ros-kinetic-gmapping

  4-安裝ROS導航堆棧。 您可以使用以下命令來執行此操作:

$ sudo apt-get install ros-kinetic-navigation

5 - 你應該有Python 2.7。 (它沒有在Python 3測試)。

Ubuntu16.04+python-2.7的安裝

在Ubuntu中自帶的有python模塊,但是該模塊較為簡單,並不含有日常處理所需的數據庫和安裝包。接下來說一下python的手動安裝方法,並附帶安裝我所需要的庫。 注意:ubuntu16.04中包含了python-2.7,python-3.5,在terminal下直接鍵入python可查看你所使用的版本,如圖為我自己的python版本:

如果你所使用的也是2.7的話可以安裝如下步驟進行安裝,若為3.5時所需安裝有所不同。

1.安裝所需依賴

$ sudo apt-get install libfreetype6-dev

 2.下載安裝包並解壓。

$ wget http://effbot.org/downloads/Imaging-1.1.7.tar.gz
$ tar -zxvf Imaging-1.1.7.tar.gz

 3.修改setup.py 中依賴庫的路徑

$ cd Imaging-1.1.7
$ emacs setup.py (emacs與vim一樣只是文本編輯器 sudo apt-get install emacs)

配置zlib ,freetype路徑

如果不知道系統中庫所在位置,可以使用如下命令查看:

$ pkg-config –variable=libdir zlib
$ pkg-config –variable=libdir freetype2

TCL_ROOT = None
JPEG_ROOT = None
ZLIB_ROOT = “/usr/lib/x86_64-linux-gnu”
TIFF_ROOT = None
FREETYPE_ROOT = “/usr/lib/x86_64-linux-gnu”
LCMS_ROOT = None

 4.安裝

$ sudo python setup.py build

確保設定過路徑的庫都是 avilable的,然后進行安裝:

$ sudo python setup.py install

經實測,以上安裝方法在virtualenv中也是可行的。

以下是我所需的數據庫,如果有需要其他的可以查閱其他資料

$ sudo apt-get install python-scipy
$ sudo apt-get install python-mysqldb

以上是python的安裝過程。

 

 

6 - 您應該有/安裝以下python模塊:

-OpenCV (cv2)

$ sudo apt-get install python-opencv

 -Numpy

$ sudo apt-get install python-numpy

-Sklearn

$ sudo apt-get install python-scikits-learn

3.硬件要求

可與導航堆棧一起使用的移動機器人(發布/ odom和/ tf.接收速度命令..)。 機器人還必須配備激光掃描儀或任何發布激光掃描信息的傳感器(sensor_msgs / LaserScan)。

4.安裝

下載包並將其放在工作區的/ src文件夾中。 然后使用catkin_make編譯。

 

5.設置你的機器人

該軟件包為單個或多個機器人提供了一個探索策略。 但是,為了使其正常工作,您應該使用導航堆棧設置機器人。 並且每個機器人應該從gmapping包運行“slam_gmapping”節點。

此外,機器人必須按照以下方式進行設置和准備。

注意:如果要快速運行和測試該軟件包,您可以嘗試使用rrt_exploration_tutorials軟件包,為單個和多個機器人提供Gazebo模擬,您可以直接使用該軟件包。

5.1 機器人網絡 

對於多機器人配置,該軟件包不需要特殊的網絡配置,它可以通過使用單個ROS主機(可以是其中一個機器人)來工作。 所以在其他機器人上,ROS_MASTER_URI參數應該指向主機地址。 有關在多台機器上設置ROS的更多信息,請點擊this

5.2 機器人的框架名稱在tf

所有機器人的框架應以其名稱為前綴。 機器人的命名從“/ robot_1”,“/ robot_2”,“/ robot_3”,...等開始。 即使您使用單一機器人的包裝,機器人的框架也應以其名稱(即/ robot_1)為前綴。 所以對於robot_1,tf樹中的框架應該如下所示:

tf是一個包,讓用戶隨着時間的推移跟蹤多個坐標系。 tf保持時間緩沖的樹結構中的坐標系之間的關系,並且允許用戶在任何所需時間點的任何兩個坐標系之間轉換點,向量等。)

5.3 機器人的節點和主題名稱

 機器人上運行的所有節點和主題也必須以其名稱為前綴。 對於機器人1,節點名稱應如下所示:/ robot_1 / move_base_node,/ robot_1 / slam_gmapping。

主題名稱應該是:/ robot_1 / odom,/ robot_1 / map / / robot_1 / base_scan,..etc。

5.4 在機器人上設置導航堆棧

 在機器人上引導導航堆棧的move_base_node節點必須正在運行。 該包(rrt_exploration)生成目標勘探目標,每個機器人必須能夠接收這些點並向其移動。 這就是為什么需要導航堆棧。 此外,每個機器人必須具有全局和局部成本圖。 所有這些都來自move_base_node。

5.5 構建地圖節點

每個機器人應該具有從gmapping包生成的局部地圖。

5.6 地圖合並節點

對於多機器人的情況,應該有一個將所有局部地圖合並為一個全局地圖的節點。 你可以使用這個包。

6.節點

有3種類型的節點; 用於檢測占用網格圖中的邊界的節點,用於過濾檢測到的點的節點以及用於將點分配給機器人的節點。 下圖顯示了結構:

6.1 global_rrt_frontier_detector

global_rrt_frontier_detector節點占用網格,並在其中找到邊界點(它們是勘探目標)。 它發布檢測到的點,以便過濾器節點可以處理。 在多機器人配置中,其目的是僅運行該節點的單個實例。
如果需要,運行全局邊沿檢測器的附加實例可以提高邊界點檢測的速度。
 

6.1.1 訂閱主題

map (nav_msgs/OccupancyGrid)

主題名稱由〜map_topic參數定義。 它是節點將在其上接收地圖的主題名稱。

clicked_point (geometry_msgs/PointStamped)

global_rrt_frontier_detector節點需要定義要探索的區域。 該主題是節點收到定義該區域的五個點。 前四個點是四個定義要探索的正方形區域,最后一個點是樹的起點。 在發表了關於這個話題的五點后,RRT將開始檢測邊界。 這五點意圖由Rviz使用(https://github.com/hasauino/storage/blob/master/pictures/publishPointRviz_button.png?raw=true)按鈕發布。

6.1.2發表主題

 detected_points (geometry_msgs/PointStamped)

節點發布檢測到邊界點的主題。

~shapes (visualization_msgs/Marker)

在此主題中,節點發布線形狀,以使用Rviz可視化RRT。

 

6.1.3參數

~map_topic (string, default: "/robot_1/map")

此參數定義節點將在其上接收地圖的主題名稱。

~eta (float, default: 0.5) 

該參數控制用於檢測邊界點的RRT的增長率,單位為米。 該參數應根據地圖大小進行設置,非常大的值會導致樹長得更快,從而更快地檢測邊界點,但是增長速度很大,也意味着樹將在地圖中缺少小角。

6.2 local_rrt_frontier_detector

 該節點類似於global_rrt_frontier_detector。 但是,它的作用不同,因為這里的樹每次檢測到邊界點時都會保持重置。 該節點旨在沿着global_rrt_frontier_detector節點運行,它負責快速檢測位於機器人附近的邊界點。
在多機器人配置中,每個機器人運行local_rrt_frontier_detector的一個實例。 因此,對於3台機器人的團隊,將有4個節點用於檢測邊界點:3個局部檢測器和1個全局檢測器。 如果需要,運行局部邊界檢測器的附加實例可以提高邊界點檢測的速度。
所有檢測器將在同一主題(“/ detected_points”)上發布檢測到的邊界點。

6.2.1 訂閱主題

 map (nav_msgs/OccupancyGrid)

主題名稱由〜map_topic參數定義。 它是節點將在其上接收地圖的主題名稱。

clicked_point (geometry_msgs/PointStamped)

lobal_rrt_frontier_detector也預訂了與global_rrt_frontier_detector類似的主題。

 6.2.2 發表主題

detected_points (geometry_msgs/PointStamped)

節點發布檢測到邊界點的主題。

~shapes (visualization_msgs/Marker)

在此主題中,節點發布線形狀,以使用Rviz可視化RRT。

6.2.3 參數

~/robot_1/base_link (string, default: "/robot_1/base_link")

機架附着的框架。 每當樹復位時,它將從從此框架獲取的當前機器人位置開始。

~map_topic (string, default: 0.5)

此參數定義節點將在其上接收地圖的主題名稱。

~eta (float)

該參數控制用於檢測邊界點的RRT的增長率,單位為米。 該參數應根據地圖大小進行設置,非常大的值會導致樹長得更快,從而更快地檢測邊界點,但是增長速度很大,也意味着樹將在地圖中缺少小角。

6.3 frontier_opencv_detector

該節點是另一個邊界檢測器,但不是基於RRT。 該節點使用OpenCV工具來檢測邊界點它旨在單獨運行,並且在多機器人配置中,只應運行一個實例(運行此節點的附加實例沒有任何區別)。
最初這個節點被實現與基於RRT的邊界檢測器進行比較。 沿着RRT檢測器(局部和全局)一側運行該節點可以提高檢測點的速度。
注意:您可以運行任何類型和任何數量的檢測器,所有檢測器將發布在過濾器節點(將在下一節中介紹)正在訂閱的相同主題上。 另一方面,過濾器將過濾的入口點傳遞給分配器,以便命令機器人探索這些點。

6.3.1 訂閱主題

map (nav_msgs/OccupancyGrid)

主題名稱由〜map_topic參數定義。 它是節點將在其上接收地圖的主題名稱。

6.3.2 發表主題 

detected_points (geometry_msgs/PointStamped)

節點發布檢測到邊界點的主題。

shapes (visualization_msgs/Marker)

在此主題中,節點使用Rviz發布要進行可視化的檢測點。

6.3.3 參數

~map_topic (string, default: "/robot_1/map")

此參數定義節點將在其上接收地圖的主題名稱。

6.4濾波器

濾波器節點從所有檢測器接收檢測到的邊界點,對點進行濾波,並將它們傳遞給分配器節點以命令機器人。 過濾包括舊點和無效點的選擇,也是冗余點。

6.4.1 訂閱主題

map (nav_msgs/OccupancyGrid)

主題名稱由〜map_topic參數定義。 它是節點將在其上接收地圖的主題名稱。

robot_x/move_base_node/global_costmap/costmap (nav_msgs/OccupancyGrid)

其中x(在robot_x中)是指機器人的編號。
過濾器節點預訂所有機器人的所有costmap主題,因此需要costmap。 通常,導航堆棧應發布costmap(在引導機器人上的導航堆棧之后,每個機器人將具有一個costmap)。 例如,如果n_robots = 2,則節點將訂閱:robot_1 / move_base_node / global_costmap / costmap和robot_2 / move_base_node / global_costmap / costmap。 costmaps用於刪除無效點。
注意:機器人對應的所有節點的命名空間應以robot_x開頭。 再次,x是機器人編號。

The goals topic (geometry_msgs/PointStamped)

主題名稱由〜goals_topic參數定義。 這是濾波器節點接收檢測到的邊界點的主題。

6.4.2 發表主題

frontiers (visualization_msgs/Marker)

過濾器節點發布用於Rviz可視化的接收邊界點的主題。

centroids (visualization_msgs/Marker)

過濾器節點僅發布用於Rviz可視化的過濾邊界點的主題。

filtered_points (invalid message type for MsgLink(msg/type))

所有過濾的點作為一個點數組發送到該主題上的分配器節點。

6.4.3 參數

 ~map_topic (string, default: "/robot_1/map")

此參數定義節點將在其上接收地圖的主題名稱。 該地圖用於知道哪些點不再是邊界點(舊點)。

~costmap_clearing_threshold (float, default: 70.0)

占用率大於此閾值的邊界點將被視為無效。 占用值是從成本圖中獲得的。

~info_radius (float, default: 1.0)

用於計算邊界信息增益的信息半徑。

~goals_topic (string, default: "/detected_points")

定義節點接收檢測到的邊界點的主題。

~n_robots (float, default: 1.0)

機器人數量

~rate (float, default: 100.0)

節點循環速率(Hz)。

6.5 分配器

該節點接收到目標探測目標,即目標探測目標,這是過濾器節點發布過濾的邊界點,並相應地命令機器人。 分配器節點通過move_base_node命令機器人。 這就是為什么你在機器人上引導導航堆棧。

6.5.1 訂閱主題

map (nav_msgs/OccupancyGrid)

 主題名稱由〜map_topic參數定義。

Filtered frontier points topic (nav_msgs/OccupancyGrid)

 主題名稱由〜frontiers_topic參數定義。

The goals topic (invalid message type for MsgLink(msg/type))

主題名稱由〜goals_topic參數定義。 這是濾波器節點接收檢測到的邊界點的主題。

6.5.2 參數

~map_topic (string, default: "/robot_1/map")

此參數定義節點將接收地圖的主題名稱。 在單機器人情況下,應將此主題設置為機器人的地圖主題。 在多機器人案例中,此主題必須設置為全局合並映射。

~info_radius (float, default: 1.0)

用於計算邊界信息增益的信息半徑。

~info_multiplier (float, default: 3.0)

單位是米。 該參數用於重視成本上的邊界點的信息增益(到邊界點的預期行駛距離)。

~hysteresis_radius (float, default: 3.0)

單位是米。 該參數定義了滯后半徑。

~hysteresis_gain (float, default: 2.0)

單位是米。 該參數定義了滯后增益。

~frontiers_topic (string, default: "/filtered_points")

分配器節點接收過濾邊界點的主題。

~n_robots (float, default: 1.0)

機器人數量

~delay_after_assignement (float, default: 0.5)

單位是秒。 它定義每個機器人分配后的延遲量。

~rate (float, default: 100.0)

節點循環速率(Hz)。

7.教程

這里列出了有關如何使用包的教程。

Installation

本節將展示除了包本身(rrt_exploration)和rrt_exploration_tutorials軟件包之外,還可以安裝所需的軟件包和python模塊。 本教程假設您已經安裝了ROS,並且有一個工作區。

1. Install all required packages

In a terminal, write the following commands:

$ sudo apt-get install ros-kinetic-gmapping ros-kinetic-navigation ros-kinetic-kobuki ros-kinetic-kobuki-core ros-kinetic-kobuki-gazebo

$ sudo apt-get install python-opencv python-numpy python-scikits-learn

2. Install rrt_exploration and rrt_exploration_tutorials

假設您的工作區文件夾位於主目錄中,並命名為catkin_ws(如果不是,請相應地更改命令):

$ cd ~/catkin_ws/src/
$ git clone https://github.com/hasauino/rrt_exploration.git
$ git clone https://github.com/hasauino/rrt_exploration_tutorials.git
$ cd ~/catkin_ws
$ catkin_make

 就是這個! 現在你可以測試包。

3.Tutorials list(教程列表)

在教程中,我們將使用Gazebo模擬器。 您下載了rrt_exploration_tutorials軟件包后,您已經擁有所有需要的文件。

 

 

1-Single robot with laser scanner.

1.Gazebo simulation

在rrt_exploration_tutorials軟件包附帶的啟動文件中,您會發現幾個啟動文件。 在本教程中,我們將使用針對單機器人仿真的。

1-In a terminal, run the following command:

$ roslaunch rrt_exploration_tutorials single_simulated_house.launch

 這將打開Gazebo和RViz。 機器人設置為使用rrt_exploration軟件包。 主要是機器人框架以“robot_1”為前綴,對於節點和主題名稱也是如此。 

運行以上指令出現以下問題:

解決方法:

這個問題一般有兩個可能的原因,一個是忘了進行source,只需要回到上層進行source即可。

$ cd ~/catkin_ws

$ source devel/setup.bash

第二個錯誤是我最近剛發現的,因為我們默認的包是git clone在src下的,當你將新的包git clone在其他地方時,source命令就會出錯。因此我將該包剪切至src下,並重新執行

$ source devel/setup.bash 后,命令執行成功。


2.Start Exploration

我們將在rrt_exploration包中使用一個名為“single.launch”的啟動文件。 此啟動文件啟動全局和局部檢測器,過濾器和分配器節點。

$ roslaunch rrt_exploration single.launch

 

3.Troubleshooting(故障排除)

 

這意味着gazebo目前正在為您下載仿真模型。 如果花了太長時間,您可以離線下載所有gazebo模型,然后手動放置在“models”文件夾(路徑:〜/ .gazebo / models)中,如下所示:

$ wget -l 2 -nc -r "http://models.gazebosim.org/"
$ cd models.gazebosim.org
$ mkdir -p ~/.gazebo/models/
$ cp -r * ~/.gazebo/models/

 

 仿真結果:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM