19 #include "nav2_ros_common/node_utils.hpp"
20 #include "nav2_behaviors/behavior_server.hpp"
22 namespace behavior_server
26 : LifecycleNode(
"behavior_server",
"", options),
27 plugin_loader_(
"nav2_core",
"nav2_core::Behavior"),
28 default_ids_{
"spin",
"backup",
"drive_on_heading",
"wait"},
29 default_types_{
"nav2_behaviors::Spin",
30 "nav2_behaviors::BackUp",
31 "nav2_behaviors::DriveOnHeading",
32 "nav2_behaviors::Wait"}
34 declare_parameter(
"cycle_frequency", rclcpp::ParameterValue(10.0));
36 if (behavior_ids_ == default_ids_) {
37 for (
size_t i = 0; i < default_ids_.size(); ++i) {
38 declare_parameter(default_ids_[i] +
".plugin", default_types_[i]);
44 rclcpp::ParameterValue(std::string(
"odom")));
47 rclcpp::ParameterValue(std::string(
"map")));
51 BehaviorServer::~BehaviorServer()
59 RCLCPP_INFO(get_logger(),
"Configuring");
61 tf_ = nav2::create_transform_buffer(
this);
62 transform_listener_ = nav2::create_transform_listener(*tf_,
this,
true);
64 behavior_types_.resize(behavior_ids_.size());
67 return nav2::CallbackReturn::FAILURE;
72 return nav2::CallbackReturn::SUCCESS;
80 for (
size_t i = 0; i != behavior_ids_.size(); i++) {
82 behavior_types_[i] = nav2::get_plugin_type_param(node, behavior_ids_[i]);
84 get_logger(),
"Creating behavior plugin %s of type %s",
85 behavior_ids_[i].c_str(), behavior_types_[i].c_str());
86 behaviors_.push_back(plugin_loader_.createUniqueInstance(behavior_types_[i]));
87 }
catch (
const std::exception & ex) {
89 get_logger(),
"Failed to create behavior %s of type %s."
90 " Exception: %s", behavior_ids_[i].c_str(), behavior_types_[i].c_str(),
103 for (
size_t i = 0; i != behavior_ids_.size(); i++) {
104 behaviors_[i]->configure(
108 local_collision_checker_,
109 global_collision_checker_);
116 "local_costmap_topic", std::string(
"local_costmap/costmap_raw"));
118 "global_costmap_topic", std::string(
"global_costmap/costmap_raw"));
120 "local_footprint_topic", std::string(
"local_costmap/published_footprint"));
122 "global_footprint_topic", std::string(
"global_costmap/published_footprint"));
124 "robot_base_frame", std::string(
"base_link"));
127 bool need_local_costmap =
false;
128 bool need_global_costmap =
false;
129 for (
const auto & behavior : behaviors_) {
130 auto costmap_info = behavior->getResourceInfo();
131 if (costmap_info == nav2_core::CostmapInfoType::BOTH) {
132 need_local_costmap =
true;
133 need_global_costmap =
true;
136 if (costmap_info == nav2_core::CostmapInfoType::LOCAL) {
137 need_local_costmap =
true;
139 if (costmap_info == nav2_core::CostmapInfoType::GLOBAL) {
140 need_global_costmap =
true;
144 if (need_local_costmap) {
145 local_costmap_sub_ = std::make_unique<nav2_costmap_2d::CostmapSubscriber>(
148 local_footprint_sub_ = std::make_unique<nav2_costmap_2d::FootprintSubscriber>(
149 shared_from_this(), local_footprint_topic, *tf_, robot_base_frame, transform_tolerance);
151 local_collision_checker_ = std::make_shared<nav2_costmap_2d::CostmapTopicCollisionChecker>(
152 *local_costmap_sub_, *local_footprint_sub_, get_name());
155 if (need_global_costmap) {
156 global_costmap_sub_ = std::make_unique<nav2_costmap_2d::CostmapSubscriber>(
159 global_footprint_sub_ = std::make_unique<nav2_costmap_2d::FootprintSubscriber>(
160 shared_from_this(), global_footprint_topic, *tf_, robot_base_frame, transform_tolerance);
162 global_collision_checker_ = std::make_shared<nav2_costmap_2d::CostmapTopicCollisionChecker>(
163 *global_costmap_sub_, *global_footprint_sub_, get_name());
170 RCLCPP_INFO(get_logger(),
"Activating");
171 std::vector<pluginlib::UniquePtr<nav2_core::Behavior>>::iterator iter;
172 for (iter = behaviors_.begin(); iter != behaviors_.end(); ++iter) {
179 return nav2::CallbackReturn::SUCCESS;
185 RCLCPP_INFO(get_logger(),
"Deactivating");
187 std::vector<pluginlib::UniquePtr<nav2_core::Behavior>>::iterator iter;
188 for (iter = behaviors_.begin(); iter != behaviors_.end(); ++iter) {
189 (*iter)->deactivate();
195 return nav2::CallbackReturn::SUCCESS;
201 RCLCPP_INFO(get_logger(),
"Cleaning up");
203 std::vector<pluginlib::UniquePtr<nav2_core::Behavior>>::iterator iter;
204 for (iter = behaviors_.begin(); iter != behaviors_.end(); ++iter) {
209 transform_listener_.reset();
212 local_costmap_sub_.reset();
213 global_costmap_sub_.reset();
215 local_footprint_sub_.reset();
216 global_footprint_sub_.reset();
218 local_collision_checker_.reset();
219 global_collision_checker_.reset();
221 return nav2::CallbackReturn::SUCCESS;
227 RCLCPP_INFO(get_logger(),
"Shutting down");
228 return nav2::CallbackReturn::SUCCESS;
233 #include "rclcpp_components/register_node_macro.hpp"
An server hosting a map of behavior plugins.
BehaviorServer(const rclcpp::NodeOptions &options=rclcpp::NodeOptions())
A constructor for behavior_server::BehaviorServer.
nav2::CallbackReturn on_cleanup(const rclcpp_lifecycle::State &state) override
Cleanup lifecycle server.
nav2::CallbackReturn on_deactivate(const rclcpp_lifecycle::State &state) override
Deactivate lifecycle server.
nav2::CallbackReturn on_shutdown(const rclcpp_lifecycle::State &state) override
Shutdown lifecycle server.
void configureBehaviorPlugins()
configures behavior plugins
nav2::CallbackReturn on_activate(const rclcpp_lifecycle::State &state) override
Activate lifecycle server.
void setupResourcesForBehaviorPlugins()
configures behavior plugins
nav2::CallbackReturn on_configure(const rclcpp_lifecycle::State &state) override
Configure lifecycle server.
bool loadBehaviorPlugins()
Loads behavior plugins from parameter file.
void destroyBond()
Destroy bond connection to lifecycle manager.
nav2::LifecycleNode::SharedPtr shared_from_this()
Get a shared pointer of this.
ParameterT declare_or_get_parameter(const std::string ¶meter_name, const ParameterDescriptor ¶meter_descriptor=ParameterDescriptor())
Declares or gets a parameter with specified type (not value). If the parameter is already declared,...
void createBond()
Create bond connection to lifecycle manager.