45 #include <controller_manager_msgs/ListControllers.h>
46 #include <controller_manager_msgs/SwitchController.h>
51 #include <boost/bimap.hpp>
86 const std::string
ns_;
88 typedef std::map<std::string, controller_manager_msgs::ControllerState>
ControllersMap;
91 typedef std::map<std::string, ControllerHandleAllocatorPtr>
AllocatorsMap;
94 typedef std::map<std::string, moveit_controller_manager::MoveItControllerHandlePtr>
HandleMap;
105 static bool isActive(
const controller_manager_msgs::ControllerState& s)
107 return s.state == std::string(
"running");
121 controller_manager_msgs::ListControllers srv;
128 for (
const controller_manager_msgs::ControllerState& controller : srv.response.controller)
134 if (
loader_.isClassAvailable(controller.type))
136 std::string absname =
getAbsName(controller.name);
149 void allocate(
const std::string& name,
const controller_manager_msgs::ControllerState& controller)
153 const std::string& type = controller.type;
154 AllocatorsMap::iterator alloc_it =
allocators_.find(type);
157 alloc_it =
allocators_.insert(std::make_pair(type,
loader_.createUniqueInstance(type))).first;
160 std::vector<std::string> resources;
162 for (
const controller_manager_msgs::HardwareInterfaceResources& claimed_resource : controller.claimed_resources)
164 for (
const std::string& resource : claimed_resource.resources)
166 resources.push_back(resource);
170 moveit_controller_manager::MoveItControllerHandlePtr handle =
171 alloc_it->second->alloc(name, resources);
173 handles_.insert(std::make_pair(name, handle));
182 std::string
getAbsName(
const std::string& name)
192 :
ns_(
ros::NodeHandle(
"~").
param(
"ros_control_namespace",
std::string(
"/")))
193 ,
loader_(
"moveit_ros_control_interface",
"moveit_ros_control_interface::ControllerHandleAllocator")
195 ROS_INFO_STREAM(
"Started moveit_ros_control_interface::MoveItControllerManager for namespace " <<
ns_);
203 :
ns_(ns),
loader_(
"moveit_ros_control_interface",
"moveit_ros_control_interface::ControllerHandleAllocator")
212 moveit_controller_manager::MoveItControllerHandlePtr
getControllerHandle(
const std::string& name)
override
215 HandleMap::iterator it =
handles_.find(name);
220 return moveit_controller_manager::MoveItControllerHandlePtr();
232 for (std::pair<const std::string, controller_manager_msgs::ControllerState>& managed_controller :
235 names.push_back(managed_controller.first);
248 for (std::pair<const std::string, controller_manager_msgs::ControllerState>& managed_controller :
251 if (
isActive(managed_controller.second))
252 names.push_back(managed_controller.first);
261 void getControllerJoints(
const std::string& name, std::vector<std::string>& joints)
override
267 for (controller_manager_msgs::HardwareInterfaceResources& claimed_resource : it->second.claimed_resources)
269 std::vector<std::string>& resources = claimed_resource.resources;
270 joints.insert(joints.end(), resources.begin(), resources.end());
301 bool switchControllers(
const std::vector<std::string>& activate,
const std::vector<std::string>& deactivate)
override
306 typedef boost::bimap<std::string, std::string> resources_bimap;
308 resources_bimap claimed_resources;
311 for (std::pair<const std::string, controller_manager_msgs::ControllerState>& active_controller :
active_controllers_)
313 for (std::vector<controller_manager_msgs::HardwareInterfaceResources>::iterator hir =
314 active_controller.second.claimed_resources.begin();
315 hir != active_controller.second.claimed_resources.end(); ++hir)
317 for (std::string& resource : hir->resources)
319 claimed_resources.insert(resources_bimap::value_type(active_controller.second.name, resource));
324 controller_manager_msgs::SwitchController srv;
326 for (
const std::string& it : deactivate)
331 srv.request.stop_controllers.push_back(c->second.name);
332 claimed_resources.right.erase(c->second.name);
336 for (
const std::string& it : activate)
341 srv.request.start_controllers.push_back(c->second.name);
342 for (controller_manager_msgs::HardwareInterfaceResources& claimed_resource : c->second.claimed_resources)
344 for (
const std::string& resource : claimed_resource.resources)
346 resources_bimap::right_const_iterator res = claimed_resources.right.find(resource);
347 if (res != claimed_resources.right.end())
349 srv.request.stop_controllers.push_back(res->second);
350 claimed_resources.left.erase(res->second);
356 srv.request.strictness = srv.request.STRICT;
358 if (!srv.request.start_controllers.empty() || !srv.request.stop_controllers.empty())
365 return srv.response.ok;
376 typedef std::map<std::string, moveit_ros_control_interface::MoveItControllerManagerPtr>
ControllerManagersMap;
401 for (
int i = 0; i < services.
size(); ++i)
403 std::string service = services[i][0];
404 std::size_t found = service.find(
"controller_manager/list_controllers");
405 if (found != std::string::npos)
407 std::string ns = service.substr(0, found);
412 std::make_pair(ns, std::make_shared<moveit_ros_control_interface::MoveItControllerManager>(ns)));
423 static std::string
getNamespace(
const std::string& name)
425 size_t pos =
name.find(
'/', 1);
426 if (pos == std::string::npos)
428 return name.substr(0, pos + 1);
437 moveit_controller_manager::MoveItControllerHandlePtr
getControllerHandle(
const std::string& name)
override
445 return it->second->getControllerHandle(name);
447 return moveit_controller_manager::MoveItControllerHandlePtr();
459 for (std::pair<const std::string, moveit_ros_control_interface::MoveItControllerManagerPtr>& controller_manager :
462 controller_manager.second->getControllersList(names);
475 for (std::pair<const std::string, moveit_ros_control_interface::MoveItControllerManagerPtr>& controller_manager :
478 controller_manager.second->getActiveControllers(names);
487 void getControllerJoints(
const std::string& name, std::vector<std::string>& joints)
override
495 it->second->getControllerJoints(name, joints);
512 return it->second->getControllerState(name);
514 return ControllerState();
523 bool switchControllers(
const std::vector<std::string>& activate,
const std::vector<std::string>& deactivate)
override
527 for (std::pair<const std::string, moveit_ros_control_interface::MoveItControllerManagerPtr>& controller_manager :
530 if (!controller_manager.second->switchControllers(activate, deactivate))