尝试 frontier_exploration 的最佳方法是使用 husky_navigation 中提供的演示,请参阅演示教程。
frontier_exploration 软件包提供了 costmap_2d 层插件 BoundedExploreLayer 以及 actionlib 客户端/服务器节点 explore_client 和 explore_server。
所提供的节点可用于演示成本图层的功能,方法是执行一个以用户定义的多边形区域为边界的边界探索任务。
BoundedExploreLayer 图层当然也可用于执行更复杂的勘探任务,其功能通过两个服务实现: UpdatePolygonBoundary 和 GetNextFrontier。
使用本软件包进行边界探索,需要一个真实或模拟的机器人配置,以提供以下功能:
使用预先存在的机器人和配置,您可以运行一个演示,看看该软件包如何工作。
sudo apt-get install ros-kinetic-frontier-exploration ros-kinetic-navigation-stage
roslaunch navigation_stage move_base_gmapping_5cm.launch
roslaunch navigation_stage move_base.xml
roslaunch frontier_exploration global_map.launch
弹出 RViz,然后在地图中心周围出现一个演示机器人。
视频演示
看到有个博主跑这个包没成功,出现报错
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下没有任何文件,所以会出现此报错,感觉包本身是有问题的
如果你只是想开始利用这个软件包的功能,husky_navigation 软件包中的教程会有所帮助。
如果你想了解得更深入一些,一般来说,当启动 explore_server 时,它会一直旋转,直到收到一个探索目标。要提交目标:
探索目标包含一个开始探索的初始点和一个限制探索范围的多边形边界。要运行无边界探索任务,只需将边界留空即可。
服务器收到目标后,就会创建初始探索地图,开始处理传感器/成本地图数据,并发出 move_base 行动目标。默认情况下,探索任务将探索边界内的所有区域(无论之前是否访问过)。下面提供了几种使用案例的启动文件示例。
在没有全局/地图信息源的情况下运行动作服务器/客户端时,请启用 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>
在使用全局 /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>
explore_client 节点侦听 Rviz 发布的点,并构建一个 ExploreTask 行动目标发送给 explore_server。
explore_server
(frontier_exploration/ExploreTask)/clicked_point
(geometry_msgs/PointStamped)exploration_polygon_marker
(visualization_msgs/Marker)explore_server 节点为所有已连接的客户端执行探索操作。它使用 costmap_2d 对象来跟踪探索进度,并在必要时为 move_base 创建移动目标。
explore_server
(frontier_exploration/ExploreTask)move_base
(move_base_msgs/MoveBaseAction)~explore_costmap/explore_boundary/update_boundary_polygon
(frontier_exploration/UpdateBoundaryPolygon)~explore_costmap/explore_boundary/get_next_frontier
(frontier_exploration/GetNextFrontier)~explore_costmap
(插件)~frequency
(浮点数,默认值:0.0)~goal_aliasing
(浮点数,默认值:0.1)frontier_exploration::BoundedExploreLayer 层是一个 costmap_2d 插件,它实现了执行边界探索任务所需的若干功能。
~frontiers
(sensor_msgs/PointCloud2)~update_boundary_polygon
(frontier_exploration/UpdateBoundaryPolygon)~get_next_frontier
(frontier_exploration/GetNextFrontier)~resize_too_boundary
(bool,默认:false)~frontier_travel_point
(字符串,默认:最近)~explore_clear_space
(bool,默认:true)参考: