15 #include "opennav_docking/dock_database.hpp"
17 namespace opennav_docking
22 dock_loader_(
"opennav_docking_core",
"opennav_docking_core::ChargingDock")
27 dock_instances_.clear();
28 dock_plugins_.clear();
29 reload_db_service_.reset();
33 const rclcpp_lifecycle::LifecycleNode::WeakPtr & parent,
34 std::shared_ptr<tf2_ros::Buffer> tf)
37 auto node = node_.lock();
42 "An error occurred while getting the dock plugins!");
49 "An error occurred while getting the dock instances!");
55 "Docking Server has %u dock types and %u dock instances available.",
56 this->plugin_size(), this->instance_size());
59 std::shared_ptr<rclcpp_lifecycle::LifecycleNode>>>(
64 std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
71 DockPluginMap::iterator it;
72 for (it = dock_plugins_.begin(); it != dock_plugins_.end(); ++it) {
73 it->second->activate();
79 DockPluginMap::iterator it;
80 for (it = dock_plugins_.begin(); it != dock_plugins_.end(); ++it) {
81 it->second->deactivate();
86 const std::shared_ptr<rmw_request_id_t>,
87 const std::shared_ptr<nav2_msgs::srv::ReloadDockDatabase::Request> request,
88 std::shared_ptr<nav2_msgs::srv::ReloadDockDatabase::Response> response)
90 if (!mutex_->try_lock()) {
91 RCLCPP_ERROR(node_.lock()->get_logger(),
"Cannot reload database while docking!");
92 response->success =
false;
96 auto node = node_.lock();
97 DockMap dock_instances;
98 if (utils::parseDockFile(request->filepath, node, dock_instances)) {
99 dock_instances_ = dock_instances;
100 response->success =
true;
103 "Dock database reloaded from file %s.", request->filepath.c_str());
107 response->success =
false;
114 ChargingDock::Ptr dock_plugin{
nullptr};
120 dock_instance->plugin = dock_plugin;
121 return dock_instance;
130 auto it = dock_instances_.find(dock_id);
131 if (it != dock_instances_.end()) {
132 return &(it->second);
140 if (type.empty() && dock_plugins_.size() == 1) {
141 return dock_plugins_.begin()->second;
144 auto it = dock_plugins_.find(type);
145 if (it != dock_plugins_.end()) {
152 const rclcpp_lifecycle::LifecycleNode::SharedPtr & node,
153 std::shared_ptr<tf2_ros::Buffer> tf)
155 std::vector<std::string> docks_plugins;
156 if (!node->has_parameter(
"dock_plugins")) {
157 node->declare_parameter(
"dock_plugins", rclcpp::ParameterType::PARAMETER_STRING_ARRAY);
159 if (!node->get_parameter(
"dock_plugins", docks_plugins)) {
160 RCLCPP_ERROR(node->get_logger(),
"Charging dock plugins not given!");
164 if (docks_plugins.size() < 1u) {
165 RCLCPP_ERROR(node->get_logger(),
"Charging dock plugins empty! Must provide 1.");
169 for (
size_t i = 0; i != docks_plugins.size(); i++) {
171 std::string plugin_type = nav2_util::get_plugin_type_param(
172 node, docks_plugins[i]);
173 opennav_docking_core::ChargingDock::Ptr dock =
174 dock_loader_.createUniqueInstance(plugin_type);
176 node->get_logger(),
"Created charging dock plugin %s of type %s",
177 docks_plugins[i].c_str(), plugin_type.c_str());
178 dock->configure(node, docks_plugins[i], tf);
179 dock_plugins_.insert({docks_plugins[i], dock});
180 }
catch (
const std::exception & ex) {
182 node->get_logger(),
"Failed to create Charging Dock plugin. Exception: %s",
193 using rclcpp::ParameterType::PARAMETER_STRING;
194 using rclcpp::ParameterType::PARAMETER_STRING_ARRAY;
197 std::string dock_filepath;
198 if (!node->has_parameter(
"dock_database")) {
199 node->declare_parameter(
"dock_database", PARAMETER_STRING);
201 if (node->get_parameter(
"dock_database", dock_filepath)) {
203 node->get_logger(),
"Loading dock from database file %s.", dock_filepath.c_str());
205 return utils::parseDockFile(dock_filepath, node, dock_instances_);
206 }
catch (YAML::BadConversion & e) {
209 "Dock database (%s) is malformed: %s.", dock_filepath.c_str(), e.what());
216 std::vector<std::string> docks_param;
217 if (!node->has_parameter(
"docks")) {
218 node->declare_parameter(
"docks", PARAMETER_STRING_ARRAY);
220 if (node->get_parameter(
"docks", docks_param)) {
221 RCLCPP_INFO(node->get_logger(),
"Loading docks from parameter file.");
222 return utils::parseDockParams(docks_param, node, dock_instances_);
227 "Dock database filepath nor dock parameters set. "
228 "Docking actions can only be executed specifying the dock pose via the action request. "
229 "Or update the dock database via the reload_database service.");
235 return dock_plugins_.size();
240 return dock_instances_.size();
A simple wrapper on ROS2 services server.
Dock * findDock(const std::string &dock_id)
Find a dock instance & plugin in the databases from ID.
bool getDockInstances(const rclcpp_lifecycle::LifecycleNode::SharedPtr &node)
Populate database of dock instances.
Dock * findDockInstance(const std::string &dock_id)
Find a dock instance in the database from ID.
bool initialize(const rclcpp_lifecycle::LifecycleNode::WeakPtr &parent, std::shared_ptr< tf2_ros::Buffer > tf)
A setup function to populate database.
ChargingDock::Ptr findDockPlugin(const std::string &type)
Find a dock plugin to use for a given type.
void reloadDbCb(const std::shared_ptr< rmw_request_id_t > request_header, const std::shared_ptr< nav2_msgs::srv::ReloadDockDatabase::Request > request, std::shared_ptr< nav2_msgs::srv::ReloadDockDatabase::Response > response)
Service request to reload database of docks.
void deactivate()
An deactivation method.
unsigned int plugin_size() const
Get the number of dock types in the database.
~DockDatabase()
A destructor for opennav_docking::DockDatabase.
unsigned int instance_size() const
Get the number of docks in the database.
DockDatabase(std::shared_ptr< std::mutex > mutex=std::make_shared< std::mutex >())
A constructor for opennav_docking::DockDatabase.
void activate()
An activation method.
bool getDockPlugins(const rclcpp_lifecycle::LifecycleNode::SharedPtr &node, std::shared_ptr< tf2_ros::Buffer > tf)
Populate database of dock type plugins.
Dock was not found in the provided dock database.
Dock plugin provided in the database or action was invalid.