-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
cf73e9b
commit f2caf27
Showing
49 changed files
with
6,320 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
Software License Agreement (BSD License) | ||
|
||
Copyright (c) 2015-2016, Carlos Alvarez. | ||
All rights reserved. | ||
|
||
Redistribution and use in source and binary forms, with or without | ||
modification, are permitted provided that the following conditions | ||
are met: | ||
|
||
* Redistributions of source code must retain the above copyright | ||
notice, this list of conditions and the following disclaimer. | ||
* Redistributions in binary form must reproduce the above | ||
copyright notice, this list of conditions and the following | ||
disclaimer in the documentation and/or other materials provided | ||
with the distribution. | ||
* Neither the name of the Carlos Alvarez nor the names of its | ||
contributors may be used to endorse or promote products derived | ||
from this software without specific prior written permission. | ||
|
||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
POSSIBILITY OF SUCH DAMAGE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
Changelog for package explore_lite | ||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
1.0.0 (2021-08-01) | ||
------------------ | ||
* First working port in ros2 foxy | ||
* Contributors: Carlos Alvarez, Juan Gavlis |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
cmake_minimum_required(VERSION 3.5) | ||
project(explore_lite) | ||
|
||
# Default to C99 | ||
if(NOT CMAKE_C_STANDARD) | ||
set(CMAKE_C_STANDARD 99) | ||
endif() | ||
|
||
# Default to C++14 | ||
if(NOT CMAKE_CXX_STANDARD) | ||
set(CMAKE_CXX_STANDARD 14) | ||
endif() | ||
|
||
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") | ||
add_compile_options(-Wall -Wextra -Wpedantic) | ||
endif() | ||
|
||
# Set flag depending on distro | ||
if(NOT DEFINED ENV{ROS_DISTRO}) | ||
message(FATAL_ERROR "ROS_DISTRO is not defined." ) | ||
endif() | ||
if("$ENV{ROS_DISTRO}" STREQUAL "eloquent") | ||
message(STATUS "Build for ROS2 eloquent") | ||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DELOQUENT") | ||
elseif("$ENV{ROS_DISTRO}" STREQUAL "dashing") | ||
message(STATUS "Build for ROS2 dashing") | ||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDASHING") | ||
else() | ||
message(STATUS "BuilD for ROS2: " "$ENV{ROS_DISTRO}") | ||
endif() | ||
|
||
# find dependencies | ||
find_package(ament_cmake REQUIRED) | ||
find_package(rclcpp REQUIRED) | ||
find_package(std_msgs REQUIRED) | ||
find_package(sensor_msgs REQUIRED) | ||
find_package(tf2_ros REQUIRED) | ||
find_package(tf2 REQUIRED) | ||
find_package(tf2_geometry_msgs REQUIRED) | ||
find_package(nav2_msgs REQUIRED) | ||
find_package(nav_msgs REQUIRED) | ||
find_package(map_msgs REQUIRED) | ||
find_package(visualization_msgs REQUIRED) | ||
find_package(nav2_costmap_2d REQUIRED) | ||
|
||
|
||
set(DEPENDENCIES | ||
rclcpp | ||
std_msgs | ||
sensor_msgs | ||
tf2 | ||
tf2_ros | ||
tf2_geometry_msgs | ||
nav2_msgs | ||
nav_msgs | ||
map_msgs | ||
nav2_costmap_2d | ||
visualization_msgs | ||
) | ||
|
||
include_directories( | ||
include | ||
) | ||
|
||
install( | ||
DIRECTORY include/explore/ | ||
DESTINATION include/explore/ | ||
) | ||
|
||
install(DIRECTORY | ||
config | ||
DESTINATION share/${PROJECT_NAME} | ||
) | ||
install(DIRECTORY | ||
launch | ||
DESTINATION share/${PROJECT_NAME} | ||
) | ||
|
||
|
||
add_executable(explore | ||
src/costmap_client.cpp | ||
src/explore.cpp | ||
src/frontier_search.cpp | ||
) | ||
|
||
target_include_directories(explore PUBLIC | ||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> | ||
$<INSTALL_INTERFACE:include>) | ||
|
||
|
||
target_link_libraries(explore ${rclcpp_LIBRARIES}) | ||
|
||
ament_target_dependencies(explore ${DEPENDENCIES}) | ||
|
||
install(TARGETS explore | ||
DESTINATION lib/${PROJECT_NAME}) | ||
|
||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GAZEBO_CXX_FLAGS}") | ||
|
||
############# | ||
## Testing ## | ||
############# | ||
if(BUILD_TESTING) | ||
find_package(ament_lint_auto REQUIRED) | ||
# the following line skips the linter which checks for copyrights | ||
set(ament_cmake_copyright_FOUND TRUE) | ||
set(ament_cmake_cpplint_FOUND TRUE) | ||
ament_lint_auto_find_test_dependencies() | ||
|
||
find_package(ament_cmake_gtest REQUIRED) | ||
|
||
ament_add_gtest(test_explore test/test_explore.cpp) | ||
target_link_libraries(test_explore ${catkin_LIBRARIES}) | ||
ament_target_dependencies(test_explore ${DEPENDENCIES}) | ||
|
||
|
||
endif() | ||
|
||
|
||
ament_export_include_directories(include) | ||
ament_package() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
/**: | ||
ros__parameters: | ||
robot_base_frame: base_link | ||
return_to_init: false | ||
costmap_topic: map | ||
costmap_updates_topic: map_updates | ||
visualize: true | ||
planner_frequency: 0.05 #0.15 | ||
progress_timeout: 30.0 #30.0 | ||
potential_scale: 0.001 #3.0 | ||
orientation_scale: 0.0 | ||
gain_scale: 4.0 #1.0 | ||
transform_tolerance: 0.25 #0.3 | ||
min_frontier_size: 0.05 #0.75 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
explore_node: | ||
ros__parameters: | ||
robot_base_frame: base_link | ||
costmap_topic: /global_costmap/costmap | ||
costmap_updates_topic: /global_costmap/costmap_updates | ||
visualize: true | ||
planner_frequency: 0.2 #0.15 | ||
progress_timeout: 300.0 | ||
potential_scale: 0.001 | ||
orientation_scale: 0.0 | ||
gain_scale: 1.0 #1.0 | ||
transform_tolerance: 0.25 #0.3 | ||
min_frontier_size: 0.3 |
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,148 @@ | ||
<<PackageHeader(explore_lite)>> | ||
|
||
<<GitHubIssues(hrnr/m-explore)>> | ||
|
||
<<TOC(4)>> | ||
|
||
== Overview == | ||
This package provides greedy frontier-based exploration. When node is running, robot will greedily explore its environment until no frontiers could be found. Movement commands will be send to [[move_base]]. | ||
|
||
{{attachment:screenshot.png||width="755px"}} | ||
|
||
Unlike similar packages, {{{explore_lite}}} does not create its own costmap, which makes it easier to configure and more efficient (lighter on resources). Node simply subscribes to <<MsgLink(nav_msgs/OccupancyGrid)>> messages. Commands for robot movement are send to [[move_base]] node. | ||
|
||
Node can do frontier filtering and can operate even on non-inflated maps. Goal blacklisting allows to deal with places inaccessible for robot. | ||
|
||
<<Youtube(op0L0LyGNwY&rel=0)>> | ||
|
||
== Architecture == | ||
{{{explore_lite}}} uses [[move_base]] for navigation. You need to run properly configured [[move_base]] node. | ||
|
||
{{attachment:architecture.svg||width="755px"}} | ||
|
||
{{{explore_lite}}} subscribes to a <<MsgLink(nav_msgs/OccupancyGrid)>> and <<MsgLink(map_msgs/OccupancyGridUpdate)>> messages to construct a map where it looks for frontiers. You can either use costmap published by [[move_base]] (ie. `<move_base>/global_costmap/costmap`) or you can use map constructed by mapping algorithm (SLAM). | ||
|
||
Depending on your environment you may achieve better results with either SLAM map or costmap published by `move_base`. Advantage of `move_base` costmap is the inflation which helps to deal with some very small unexplorable frontiers. When you are using a raw map produced by SLAM you should set the `min_frontier_size` parameter to some reasonable number to deal with the small frontiers. For details on both setups check the `explore.launch` and `explore_costmap.launch` launch files. | ||
|
||
== Setup == | ||
|
||
Before starting experimenting with {{{explore_lite}}} you need to have working [[move_base]] for navigation. You should be able to navigate with [[move_base]] manually through [[rviz]]. Please refer to [[navigation#Tutorials]] for setting up [[move_base]] and the rest of the navigation stack with your robot. | ||
|
||
You should be also able to to navigate with [[move_base]] though unknown space in the map. If you set the goal to unknown place in the map, planning and navigating should work. With most planners this should work by default, refer to [[navfn#Parameters]] if you need to setup this for [[navfn]] planner (but should be enabled by default). Navigation through unknown space is required for {{{explore_lite}}}. | ||
|
||
If you want to use costmap provided by [[move_base]] you need to enable unknown space tracking by setting `track_unknown_space: true`. | ||
|
||
If you have [[move_base]] configured correctly, you can start experimenting with {{{explore_lite}}}. Provided `explore.launch` should work out-of-the box in most cases, but as always you might need to adjust topic names and frame names according to your setup. | ||
|
||
== ROS API == | ||
{{{ | ||
#!clearsilver CS/NodeAPI | ||
|
||
name = explore | ||
desc = Provides exploration services offered by this package. Exploration will start immediately after node initialization. | ||
|
||
pub { | ||
0.name = ~frontiers | ||
0.type = visualization_msgs/MarkerArray | ||
0.desc = Visualization of frontiers considered by exploring algorithm. Each frontier is visualized by frontier points in blue and with a small sphere, which visualize the cost of the frontiers (costlier frontiers will have smaller spheres). | ||
} | ||
sub { | ||
0.name = costmap | ||
0.type = nav_msgs/OccupancyGrid | ||
0.desc = Map which will be used for exploration planning. Can be either costmap from [[move_base]] or map created by SLAM (see above). Occupancy grid must have got properly marked unknown space, mapping algorithms usually track unknown space by default. If you want to use costmap provided by [[move_base]] you need to enable unknown space tracking by setting `track_unknown_space: true`. | ||
|
||
1.name = costmap_updates | ||
1.type = map_msgs/OccupancyGridUpdate | ||
1.desc = Incremental updates on costmap. Not necessary if source of map is always publishing full updates, i.e. does not provide this topic. | ||
} | ||
|
||
param { | ||
0.name = ~robot_base_frame | ||
0.default = `base_link` | ||
0.type = string | ||
0.desc = The name of the base frame of the robot. This is used for determining robot position on map. Mandatory. | ||
|
||
1.name = ~costmap_topic | ||
1.default = `costmap` | ||
1.type = string | ||
1.desc = Specifies topic of source <<MsgLink(nav_msgs/OccupancyGrid)>>. Mandatory. | ||
|
||
3.name = ~costmap_updates_topic | ||
3.default = `costmap_updates` | ||
3.type = string | ||
3.desc = Specifies topic of source <<MsgLink(map_msgs/OccupancyGridUpdate)>>. Not necessary if source of map is always publishing full updates, i.e. does not provide this topic. | ||
|
||
4.name = ~visualize | ||
4.default = `false` | ||
4.type = bool | ||
4.desc = Specifies whether or not publish visualized frontiers. | ||
|
||
6.name = ~planner_frequency | ||
6.default = `1.0` | ||
6.type = double | ||
6.desc = Rate in Hz at which new frontiers will computed and goal reconsidered. | ||
|
||
7.name = ~progress_timeout | ||
7.default = `30.0` | ||
7.type = double | ||
7.desc = Time in seconds. When robot do not make any progress for `progress_timeout`, current goal will be abandoned. | ||
|
||
8.name = ~potential_scale | ||
8.default = `1e-3` | ||
8.type = double | ||
8.desc = Used for weighting frontiers. This multiplicative parameter affects frontier potential component of the frontier weight (distance to frontier). | ||
|
||
9.name = ~orientation_scale | ||
9.default = `0` | ||
9.type = double | ||
9.desc = Used for weighting frontiers. This multiplicative parameter affects frontier orientation component of the frontier weight. This parameter does currently nothing and is provided solely for forward compatibility. | ||
|
||
10.name = ~gain_scale | ||
10.default = `1.0` | ||
10.type = double | ||
10.desc = Used for weighting frontiers. This multiplicative parameter affects frontier gain component of the frontier weight (frontier size). | ||
|
||
11.name = ~transform_tolerance | ||
11.default = `0.3` | ||
11.type = double | ||
11.desc = Transform tolerance to use when transforming robot pose. | ||
|
||
12.name = ~min_frontier_size | ||
12.default = `0.5` | ||
12.type = double | ||
12.desc = Minimum size of the frontier to consider the frontier as the exploration goal. In meters. | ||
} | ||
|
||
req_tf { | ||
0.from = global_frame | ||
0.to = robot_base_frame | ||
0.desc = This transformation is usually provided by mapping algorithm. Those frames are usually called `map` and `base_link`. For adjusting `robot_base_frame` name see respective parameter. You don't need to set `global_frame`. The name for `global_frame` will be sourced from `costmap_topic` automatically. | ||
} | ||
|
||
act_called { | ||
0.name = move_base | ||
0.type = move_base_msgs/MoveBaseAction | ||
0.desc = [[move_base]] actionlib API for posting goals. See [[move_base#Action API]] for details. This expects [[move_base]] node in the same namespace as `explore_lite`, you may want to remap this node if this is not true. | ||
} | ||
}}} | ||
|
||
== Acknowledgements == | ||
|
||
This package was developed as part of my bachelor thesis at [[http://www.mff.cuni.cz/to.en/|Charles University]] in Prague. | ||
|
||
{{{ | ||
@masterthesis{Hörner2016, | ||
author = {Jiří Hörner}, | ||
title = {Map-merging for multi-robot system}, | ||
address = {Prague}, | ||
year = {2016}, | ||
school = {Charles University in Prague, Faculty of Mathematics and Physics}, | ||
type = {Bachelor's thesis}, | ||
URL = {https://is.cuni.cz/webapps/zzp/detail/174125/}, | ||
} | ||
}}} | ||
|
||
This project was initially based on [[explore]] package by Charles !DuHadway. Most of the node has been rewritten since then. The current frontier search algorithm is based on [[frontier_exploration]] by Paul Bovbel. | ||
|
||
## AUTOGENERATED DON'T DELETE | ||
## CategoryPackage |
Oops, something went wrong.