19 #include "nav2_util/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"}
36 rclcpp::ParameterValue(std::string(
"local_costmap/costmap_raw")));
39 rclcpp::ParameterValue(std::string(
"local_costmap/published_footprint")));
40 declare_parameter(
"cycle_frequency", rclcpp::ParameterValue(10.0));
41 declare_parameter(
"behavior_plugins", default_ids_);
43 get_parameter(
"behavior_plugins", behavior_ids_);
44 if (behavior_ids_ == default_ids_) {
45 for (
size_t i = 0; i < default_ids_.size(); ++i) {
46 declare_parameter(default_ids_[i] +
".plugin", default_types_[i]);
52 rclcpp::ParameterValue(std::string(
"odom")));
55 rclcpp::ParameterValue(std::string(
"base_link")));
57 "transform_tolerance",
58 rclcpp::ParameterValue(0.1));
62 BehaviorServer::~BehaviorServer()
67 nav2_util::CallbackReturn
70 RCLCPP_INFO(get_logger(),
"Configuring");
72 tf_ = std::make_shared<tf2_ros::Buffer>(get_clock());
73 auto timer_interface = std::make_shared<tf2_ros::CreateTimerROS>(
74 get_node_base_interface(),
75 get_node_timers_interface());
76 tf_->setCreateTimerInterface(timer_interface);
77 transform_listener_ = std::make_shared<tf2_ros::TransformListener>(*tf_);
79 std::string costmap_topic, footprint_topic, robot_base_frame;
80 double transform_tolerance;
81 this->get_parameter(
"costmap_topic", costmap_topic);
82 this->get_parameter(
"footprint_topic", footprint_topic);
83 this->get_parameter(
"transform_tolerance", transform_tolerance);
84 this->get_parameter(
"robot_base_frame", robot_base_frame);
85 costmap_sub_ = std::make_unique<nav2_costmap_2d::CostmapSubscriber>(
87 footprint_sub_ = std::make_unique<nav2_costmap_2d::FootprintSubscriber>(
88 shared_from_this(), footprint_topic, *tf_, robot_base_frame, transform_tolerance);
90 collision_checker_ = std::make_shared<nav2_costmap_2d::CostmapTopicCollisionChecker>(
91 *costmap_sub_, *footprint_sub_, this->get_name());
93 behavior_types_.resize(behavior_ids_.size());
95 return nav2_util::CallbackReturn::FAILURE;
98 return nav2_util::CallbackReturn::SUCCESS;
107 for (
size_t i = 0; i != behavior_ids_.size(); i++) {
108 behavior_types_[i] = nav2_util::get_plugin_type_param(node, behavior_ids_[i]);
111 get_logger(),
"Creating behavior plugin %s of type %s",
112 behavior_ids_[i].c_str(), behavior_types_[i].c_str());
113 behaviors_.push_back(plugin_loader_.createUniqueInstance(behavior_types_[i]));
114 behaviors_.back()->configure(node, behavior_ids_[i], tf_, collision_checker_);
115 }
catch (
const pluginlib::PluginlibException & ex) {
117 get_logger(),
"Failed to create behavior %s of type %s."
118 " Exception: %s", behavior_ids_[i].c_str(), behavior_types_[i].c_str(),
127 nav2_util::CallbackReturn
130 RCLCPP_INFO(get_logger(),
"Activating");
131 std::vector<pluginlib::UniquePtr<nav2_core::Behavior>>::iterator iter;
132 for (iter = behaviors_.begin(); iter != behaviors_.end(); ++iter) {
139 return nav2_util::CallbackReturn::SUCCESS;
142 nav2_util::CallbackReturn
145 RCLCPP_INFO(get_logger(),
"Deactivating");
147 std::vector<pluginlib::UniquePtr<nav2_core::Behavior>>::iterator iter;
148 for (iter = behaviors_.begin(); iter != behaviors_.end(); ++iter) {
149 (*iter)->deactivate();
155 return nav2_util::CallbackReturn::SUCCESS;
158 nav2_util::CallbackReturn
161 RCLCPP_INFO(get_logger(),
"Cleaning up");
163 std::vector<pluginlib::UniquePtr<nav2_core::Behavior>>::iterator iter;
164 for (iter = behaviors_.begin(); iter != behaviors_.end(); ++iter) {
169 transform_listener_.reset();
171 footprint_sub_.reset();
172 costmap_sub_.reset();
173 collision_checker_.reset();
175 return nav2_util::CallbackReturn::SUCCESS;
178 nav2_util::CallbackReturn
181 RCLCPP_INFO(get_logger(),
"Shutting down");
182 return nav2_util::CallbackReturn::SUCCESS;
187 #include "rclcpp_components/register_node_macro.hpp"
An server hosting a map of behavior plugins.
nav2_util::CallbackReturn on_cleanup(const rclcpp_lifecycle::State &state) override
Cleanup lifecycle server.
BehaviorServer(const rclcpp::NodeOptions &options=rclcpp::NodeOptions())
A constructor for behavior_server::BehaviorServer.
nav2_util::CallbackReturn on_deactivate(const rclcpp_lifecycle::State &state) override
Deactivate lifecycle server.
nav2_util::CallbackReturn on_activate(const rclcpp_lifecycle::State &state) override
Activate lifecycle server.
nav2_util::CallbackReturn on_shutdown(const rclcpp_lifecycle::State &state) override
Shutdown lifecycle server.
nav2_util::CallbackReturn on_configure(const rclcpp_lifecycle::State &state) override
Configure lifecycle server.
bool loadBehaviorPlugins()
Loads behavior plugins from parameter file.
std::shared_ptr< nav2_util::LifecycleNode > shared_from_this()
Get a shared pointer of this.
void createBond()
Create bond connection to lifecycle manager.
void destroyBond()
Destroy bond connection to lifecycle manager.