zoukankan      html  css  js  c++  java
  • 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/
    

     仿真结果:

  • 相关阅读:
    Asp.net_解决vs运行报在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题的bug方法
    WebConfig常用节点
    编译器错误消息:必须添加对程序集“System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”的引用
    使用Log4net调试NHibernate
    Visual Studio 2012 如何打开MVC1.0 MVC2.0的项目
    MVC中IQueryable与IList的区别?
    vs2010 打开 vs2012 的解决方案
    LINQ分页和排序,skip和Take 用法
    未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService
    在Sql server数据库中,关于触发器的创建、调用及删除
  • 原文地址:https://www.cnblogs.com/dannierdeshenghuo/p/7512541.html
Copyright © 2011-2022 走看看