Skip to content

Commit 58a651c

Browse files
Pluginizing BT Navigators (#3345)
* initial prototype * linting
1 parent 85fca19 commit 58a651c

16 files changed

+204
-77
lines changed

nav2_bringup/params/nav2_multirobot_params_1.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ bt_navigator:
4545
odom_topic: /odom
4646
bt_loop_duration: 10
4747
default_server_timeout: 20
48+
navigators: ["navigate_to_pose", "navigate_through_poses"]
49+
navigate_to_pose:
50+
plugin: "nav2_bt_navigator/NavigateToPoseNavigator"
51+
navigate_through_poses:
52+
plugin: "nav2_bt_navigator/NavigateThroughPosesNavigator"
4853
# 'default_nav_through_poses_bt_xml' and 'default_nav_to_pose_bt_xml' are use defaults:
4954
# nav2_bt_navigator/navigate_to_pose_w_replanning_and_recovery.xml
5055
# nav2_bt_navigator/navigate_through_poses_w_replanning_and_recovery.xml

nav2_bringup/params/nav2_multirobot_params_2.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ bt_navigator:
4545
odom_topic: /odom
4646
bt_loop_duration: 10
4747
default_server_timeout: 20
48+
navigators: ["navigate_to_pose", "navigate_through_poses"]
49+
navigate_to_pose:
50+
plugin: "nav2_bt_navigator/NavigateToPoseNavigator"
51+
navigate_through_poses:
52+
plugin: "nav2_bt_navigator/NavigateThroughPosesNavigator"
4853
# 'default_nav_through_poses_bt_xml' and 'default_nav_to_pose_bt_xml' are use defaults:
4954
# nav2_bt_navigator/navigate_to_pose_w_replanning_and_recovery.xml
5055
# nav2_bt_navigator/navigate_through_poses_w_replanning_and_recovery.xml

nav2_bringup/params/nav2_params.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ bt_navigator:
4545
odom_topic: /odom
4646
bt_loop_duration: 10
4747
default_server_timeout: 20
48+
navigators: ["navigate_to_pose", "navigate_through_poses"]
49+
navigate_to_pose:
50+
plugin: "nav2_bt_navigator/NavigateToPoseNavigator"
51+
navigate_through_poses:
52+
plugin: "nav2_bt_navigator/NavigateThroughPosesNavigator"
4853
# 'default_nav_through_poses_bt_xml' and 'default_nav_to_pose_bt_xml' are use defaults:
4954
# nav2_bt_navigator/navigate_to_pose_w_replanning_and_recovery.xml
5055
# nav2_bt_navigator/navigate_through_poses_w_replanning_and_recovery.xml

nav2_bt_navigator/CMakeLists.txt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ find_package(std_srvs REQUIRED)
1717
find_package(nav2_util REQUIRED)
1818
find_package(nav2_core REQUIRED)
1919
find_package(tf2_ros REQUIRED)
20+
find_package(pluginlib REQUIRED)
2021

2122
nav2_package()
2223

@@ -47,12 +48,11 @@ set(dependencies
4748
nav2_util
4849
nav2_core
4950
tf2_ros
51+
pluginlib
5052
)
5153

5254
add_library(${library_name} SHARED
5355
src/bt_navigator.cpp
54-
src/navigators/navigate_to_pose.cpp
55-
src/navigators/navigate_through_poses.cpp
5656
)
5757

5858
ament_target_dependencies(${executable_name}
@@ -65,9 +65,16 @@ ament_target_dependencies(${library_name}
6565
${dependencies}
6666
)
6767

68+
add_library(nav2_navigate_to_pose_navigator SHARED src/navigators/navigate_to_pose.cpp)
69+
ament_target_dependencies(nav2_navigate_to_pose_navigator ${dependencies})
70+
71+
add_library(nav2_navigate_through_poses SHARED src/navigators/navigate_through_poses.cpp)
72+
ament_target_dependencies(nav2_navigate_through_poses ${dependencies})
73+
74+
pluginlib_export_plugin_description_file(nav2_core navigator_plugins.xml)
6875
rclcpp_components_register_nodes(${library_name} "nav2_bt_navigator::BtNavigator")
6976

70-
install(TARGETS ${library_name}
77+
install(TARGETS ${library_name} nav2_navigate_to_pose_navigator nav2_navigate_through_poses
7178
ARCHIVE DESTINATION lib
7279
LIBRARY DESTINATION lib
7380
RUNTIME DESTINATION bin
@@ -89,6 +96,6 @@ if(BUILD_TESTING)
8996
endif()
9097

9198
ament_export_include_directories(include)
92-
ament_export_libraries(${library_name})
99+
ament_export_libraries(${library_name} nav2_navigate_to_pose_navigator nav2_navigate_through_poses)
93100
ament_export_dependencies(${dependencies})
94101
ament_package()

nav2_bt_navigator/include/nav2_bt_navigator/bt_navigator.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// Copyright (c) 2018 Intel Corporation
2+
// Copyright (c) 2023 Samsung Research America
23
//
34
// Licensed under the Apache License, Version 2.0 (the "License");
45
// you may not use this file except in compliance with the License.
@@ -25,8 +26,8 @@
2526
#include "tf2_ros/buffer.h"
2627
#include "tf2_ros/transform_listener.h"
2728
#include "tf2_ros/create_timer_ros.h"
28-
#include "nav2_bt_navigator/navigators/navigate_to_pose.hpp"
29-
#include "nav2_bt_navigator/navigators/navigate_through_poses.hpp"
29+
#include "nav2_core/behavior_tree_navigator.hpp"
30+
#include "pluginlib/class_loader.hpp"
3031

3132
namespace nav2_bt_navigator
3233
{
@@ -53,7 +54,7 @@ class BtNavigator : public nav2_util::LifecycleNode
5354
/**
5455
* @brief Configures member variables
5556
*
56-
* Initializes action server for "NavigationToPose"; subscription to
57+
* Initializes action servers for navigator plugins; subscription to
5758
* "goal_sub"; and builds behavior tree from xml file.
5859
* @param state Reference to LifeCycle node state
5960
* @return SUCCESS or FAILURE
@@ -85,10 +86,9 @@ class BtNavigator : public nav2_util::LifecycleNode
8586
nav2_util::CallbackReturn on_shutdown(const rclcpp_lifecycle::State & state) override;
8687

8788
// To handle all the BT related execution
88-
std::unique_ptr<nav2_bt_navigator::Navigator<nav2_msgs::action::NavigateToPose>> pose_navigator_;
89-
std::unique_ptr<nav2_bt_navigator::Navigator<nav2_msgs::action::NavigateThroughPoses>>
90-
poses_navigator_;
91-
nav2_bt_navigator::NavigatorMuxer plugin_muxer_;
89+
pluginlib::ClassLoader<nav2_core::NavigatorBase> class_loader_;
90+
std::vector<pluginlib::UniquePtr<nav2_core::NavigatorBase>> navigators_;
91+
nav2_core::NavigatorMuxer plugin_muxer_;
9292

9393
// Odometry smoother object
9494
std::shared_ptr<nav2_util::OdomSmoother> odom_smoother_;
@@ -99,7 +99,7 @@ class BtNavigator : public nav2_util::LifecycleNode
9999
double transform_tolerance_;
100100
std::string odom_topic_;
101101

102-
// Spinning transform that can be used by the BT nodes
102+
// Spinning transform that can be used by the node
103103
std::shared_ptr<tf2_ros::Buffer> tf_;
104104
std::shared_ptr<tf2_ros::TransformListener> tf_listener_;
105105
};

nav2_bt_navigator/include/nav2_bt_navigator/navigators/navigate_through_poses.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2021 Samsung Research
1+
// Copyright (c) 2021-2023 Samsung Research
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
2121
#include "rclcpp/rclcpp.hpp"
2222
#include "rclcpp_action/rclcpp_action.hpp"
2323
#include "geometry_msgs/msg/pose_stamped.hpp"
24-
#include "nav2_bt_navigator/navigator.hpp"
24+
#include "nav2_core/behavior_tree_navigator.hpp"
2525
#include "nav2_msgs/action/navigate_through_poses.hpp"
2626
#include "nav_msgs/msg/path.hpp"
2727
#include "nav2_util/robot_utils.hpp"
@@ -36,7 +36,7 @@ namespace nav2_bt_navigator
3636
* @brief A navigator for navigating to a a bunch of intermediary poses
3737
*/
3838
class NavigateThroughPosesNavigator
39-
: public nav2_bt_navigator::Navigator<nav2_msgs::action::NavigateThroughPoses>
39+
: public nav2_core::BehaviorTreeNavigator<nav2_msgs::action::NavigateThroughPoses>
4040
{
4141
public:
4242
using ActionT = nav2_msgs::action::NavigateThroughPoses;
@@ -46,7 +46,7 @@ class NavigateThroughPosesNavigator
4646
* @brief A constructor for NavigateThroughPosesNavigator
4747
*/
4848
NavigateThroughPosesNavigator()
49-
: Navigator() {}
49+
: BehaviorTreeNavigator() {}
5050

5151
/**
5252
* @brief A configure state transition to configure navigator's state

nav2_bt_navigator/include/nav2_bt_navigator/navigators/navigate_to_pose.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2021 Samsung Research
1+
// Copyright (c) 2021-2023 Samsung Research
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
2121
#include "rclcpp/rclcpp.hpp"
2222
#include "rclcpp_action/rclcpp_action.hpp"
2323
#include "geometry_msgs/msg/pose_stamped.hpp"
24-
#include "nav2_bt_navigator/navigator.hpp"
24+
#include "nav2_core/behavior_tree_navigator.hpp"
2525
#include "nav2_msgs/action/navigate_to_pose.hpp"
2626
#include "nav2_util/geometry_utils.hpp"
2727
#include "nav2_util/robot_utils.hpp"
@@ -36,7 +36,7 @@ namespace nav2_bt_navigator
3636
* @brief A navigator for navigating to a specified pose
3737
*/
3838
class NavigateToPoseNavigator
39-
: public nav2_bt_navigator::Navigator<nav2_msgs::action::NavigateToPose>
39+
: public nav2_core::BehaviorTreeNavigator<nav2_msgs::action::NavigateToPose>
4040
{
4141
public:
4242
using ActionT = nav2_msgs::action::NavigateToPose;
@@ -45,7 +45,7 @@ class NavigateToPoseNavigator
4545
* @brief A constructor for NavigateToPoseNavigator
4646
*/
4747
NavigateToPoseNavigator()
48-
: Navigator() {}
48+
: BehaviorTreeNavigator() {}
4949

5050
/**
5151
* @brief A configure state transition to configure navigator's state
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<class_libraries>
2+
<library path="nav2_navigate_to_pose_navigator">
3+
<class
4+
name="nav2_bt_navigator/NavigateToPoseNavigator"
5+
type="nav2_bt_navigator::NavigateToPoseNavigator"
6+
base_class_type="nav2_core::NavigatorBase">
7+
<description>Navigate to Pose Navigator</description>
8+
</class>
9+
</library>
10+
<library path="nav2_navigate_through_poses">
11+
<class
12+
name="nav2_bt_navigator/NavigateThroughPosesNavigator"
13+
type="nav2_bt_navigator::NavigateThroughPosesNavigator"
14+
base_class_type="nav2_core::NavigatorBase">
15+
<description>Navigate through Poses Navigator</description>
16+
</class>
17+
</library>
18+
</class_libraries>

nav2_bt_navigator/package.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<build_depend>geometry_msgs</build_depend>
2323
<build_depend>std_srvs</build_depend>
2424
<build_depend>nav2_util</build_depend>
25+
<build_depend>pluginlib</build_depend>
2526
<build_depend>nav2_core</build_depend>
2627

2728
<exec_depend>behaviortree_cpp_v3</exec_depend>
@@ -34,12 +35,14 @@
3435
<exec_depend>std_msgs</exec_depend>
3536
<exec_depend>nav2_util</exec_depend>
3637
<exec_depend>geometry_msgs</exec_depend>
38+
<exec_depend>pluginlib</exec_depend>
3739
<exec_depend>nav2_core</exec_depend>
3840

3941
<test_depend>ament_lint_common</test_depend>
4042
<test_depend>ament_lint_auto</test_depend>
4143

4244
<export>
4345
<build_type>ament_cmake</build_type>
46+
<nav2_core prefix="$(prefix)/navigator_plugins.xml"/>
4447
</export>
4548
</package>

nav2_bt_navigator/src/bt_navigator.cpp

Lines changed: 56 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ namespace nav2_bt_navigator
2727
{
2828

2929
BtNavigator::BtNavigator(const rclcpp::NodeOptions & options)
30-
: nav2_util::LifecycleNode("bt_navigator", "", options)
30+
: nav2_util::LifecycleNode("bt_navigator", "", options),
31+
class_loader_("nav2_core", "nav2_core::NavigatorBase")
3132
{
3233
RCLCPP_INFO(get_logger(), "Creating");
3334

@@ -111,28 +112,56 @@ BtNavigator::on_configure(const rclcpp_lifecycle::State & /*state*/)
111112
// Libraries to pull plugins (BT Nodes) from
112113
auto plugin_lib_names = get_parameter("plugin_lib_names").as_string_array();
113114

114-
pose_navigator_ = std::make_unique<nav2_bt_navigator::NavigateToPoseNavigator>();
115-
poses_navigator_ = std::make_unique<nav2_bt_navigator::NavigateThroughPosesNavigator>();
116-
117-
nav2_bt_navigator::FeedbackUtils feedback_utils;
115+
nav2_core::FeedbackUtils feedback_utils;
118116
feedback_utils.tf = tf_;
119117
feedback_utils.global_frame = global_frame_;
120118
feedback_utils.robot_frame = robot_frame_;
121119
feedback_utils.transform_tolerance = transform_tolerance_;
122120

123121
// Odometry smoother object for getting current speed
124-
odom_smoother_ = std::make_shared<nav2_util::OdomSmoother>(shared_from_this(), 0.3, odom_topic_);
122+
auto node = shared_from_this();
123+
odom_smoother_ = std::make_shared<nav2_util::OdomSmoother>(node, 0.3, odom_topic_);
124+
125+
// Navigator defaults
126+
const std::vector<std::string> default_navigator_ids = {
127+
"navigate_to_pose",
128+
"navigate_through_poses"
129+
};
130+
const std::vector<std::string> default_navigator_types = {
131+
"nav2_bt_navigator/NavigateToPoseNavigator",
132+
"nav2_bt_navigator/NavigateThroughPosesNavigator"
133+
};
125134

126-
if (!pose_navigator_->on_configure(
127-
shared_from_this(), plugin_lib_names, feedback_utils, &plugin_muxer_, odom_smoother_))
128-
{
129-
return nav2_util::CallbackReturn::FAILURE;
135+
std::vector<std::string> navigator_ids;
136+
declare_parameter("navigators", default_navigator_ids);
137+
get_parameter("navigators", navigator_ids);
138+
if (navigator_ids == default_navigator_ids) {
139+
for (size_t i = 0; i < default_navigator_ids.size(); ++i) {
140+
declare_parameter(default_navigator_ids[i] + ".plugin", default_navigator_types[i]);
141+
}
130142
}
131143

132-
if (!poses_navigator_->on_configure(
133-
shared_from_this(), plugin_lib_names, feedback_utils, &plugin_muxer_, odom_smoother_))
134-
{
135-
return nav2_util::CallbackReturn::FAILURE;
144+
// Load navigator plugins
145+
for (size_t i = 0; i != navigator_ids.size(); i++) {
146+
std::string navigator_type = nav2_util::get_plugin_type_param(node, navigator_ids[i]);
147+
try {
148+
RCLCPP_INFO(
149+
get_logger(), "Creating navigator id %s of type %s",
150+
navigator_ids[i].c_str(), navigator_type.c_str());
151+
navigators_.push_back(class_loader_.createUniqueInstance(navigator_type));
152+
if (!navigators_.back()->on_configure(
153+
node, plugin_lib_names, feedback_utils,
154+
&plugin_muxer_, odom_smoother_))
155+
{
156+
return nav2_util::CallbackReturn::FAILURE;
157+
}
158+
} catch (const pluginlib::PluginlibException & ex) {
159+
RCLCPP_FATAL(
160+
get_logger(), "Failed to create navigator id %s of type %s."
161+
" Exception: %s", navigator_ids[i].c_str(), navigator_type.c_str(),
162+
ex.what());
163+
return nav2_util::CallbackReturn::FAILURE;
164+
}
136165
}
137166

138167
return nav2_util::CallbackReturn::SUCCESS;
@@ -142,9 +171,10 @@ nav2_util::CallbackReturn
142171
BtNavigator::on_activate(const rclcpp_lifecycle::State & /*state*/)
143172
{
144173
RCLCPP_INFO(get_logger(), "Activating");
145-
146-
if (!poses_navigator_->on_activate() || !pose_navigator_->on_activate()) {
147-
return nav2_util::CallbackReturn::FAILURE;
174+
for (size_t i = 0; i != navigators_.size(); i++) {
175+
if (!navigators_[i]->on_activate()) {
176+
return nav2_util::CallbackReturn::FAILURE;
177+
}
148178
}
149179

150180
// create bond connection
@@ -157,9 +187,10 @@ nav2_util::CallbackReturn
157187
BtNavigator::on_deactivate(const rclcpp_lifecycle::State & /*state*/)
158188
{
159189
RCLCPP_INFO(get_logger(), "Deactivating");
160-
161-
if (!poses_navigator_->on_deactivate() || !pose_navigator_->on_deactivate()) {
162-
return nav2_util::CallbackReturn::FAILURE;
190+
for (size_t i = 0; i != navigators_.size(); i++) {
191+
if (!navigators_[i]->on_deactivate()) {
192+
return nav2_util::CallbackReturn::FAILURE;
193+
}
163194
}
164195

165196
// destroy bond connection
@@ -177,13 +208,13 @@ BtNavigator::on_cleanup(const rclcpp_lifecycle::State & /*state*/)
177208
tf_listener_.reset();
178209
tf_.reset();
179210

180-
if (!poses_navigator_->on_cleanup() || !pose_navigator_->on_cleanup()) {
181-
return nav2_util::CallbackReturn::FAILURE;
211+
for (size_t i = 0; i != navigators_.size(); i++) {
212+
if (!navigators_[i]->on_cleanup()) {
213+
return nav2_util::CallbackReturn::FAILURE;
214+
}
182215
}
183216

184-
poses_navigator_.reset();
185-
pose_navigator_.reset();
186-
217+
navigators_.clear();
187218
RCLCPP_INFO(get_logger(), "Completed Cleaning up");
188219
return nav2_util::CallbackReturn::SUCCESS;
189220
}

nav2_bt_navigator/src/navigators/navigate_through_poses.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,3 +217,8 @@ NavigateThroughPosesNavigator::initializeGoalPoses(ActionT::Goal::ConstSharedPtr
217217
}
218218

219219
} // namespace nav2_bt_navigator
220+
221+
#include "pluginlib/class_list_macros.hpp"
222+
PLUGINLIB_EXPORT_CLASS(
223+
nav2_bt_navigator::NavigateThroughPosesNavigator,
224+
nav2_core::NavigatorBase)

nav2_bt_navigator/src/navigators/navigate_to_pose.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,3 +225,8 @@ NavigateToPoseNavigator::onGoalPoseReceived(const geometry_msgs::msg::PoseStampe
225225
}
226226

227227
} // namespace nav2_bt_navigator
228+
229+
#include "pluginlib/class_list_macros.hpp"
230+
PLUGINLIB_EXPORT_CLASS(
231+
nav2_bt_navigator::NavigateToPoseNavigator,
232+
nav2_core::NavigatorBase)

0 commit comments

Comments
 (0)