00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <ros/ros.h>
00038 #include <moveit/controller_manager/controller_manager.h>
00039 #include <control_msgs/FollowJointTrajectoryAction.h>
00040 #include <actionlib/client/simple_action_client.h>
00041 #include <pluginlib/class_list_macros.h>
00042
00043 #include <pr2_mechanism_msgs/ListControllers.h>
00044 #include <pr2_mechanism_msgs/SwitchController.h>
00045 #include <pr2_mechanism_msgs/LoadController.h>
00046 #include <pr2_controllers_msgs/Pr2GripperCommandAction.h>
00047 #include <algorithm>
00048 #include <map>
00049
00050 namespace pr2_moveit_controller_manager
00051 {
00052
00054 static const double DEFAULT_MAX_GRIPPER_EFFORT = 10000.0;
00055
00057 static const double GRIPPER_OPEN = 0.086;
00058
00060 static const double GRIPPER_CLOSED = 0.0;
00061
00063 static const std::string R_GRIPPER_JOINT = "r_gripper_motor_screw_joint";
00064
00066 static const std::string L_GRIPPER_JOINT = "l_gripper_motor_screw_joint";
00067
00069 static const double GAP_CONVERSION_RATIO = 0.1714;
00070
00071 template<typename T>
00072 class ActionBasedControllerHandle : public moveit_controller_manager::MoveItControllerHandle
00073 {
00074 public:
00075 ActionBasedControllerHandle(const std::string &name, const std::string &ns) :
00076 moveit_controller_manager::MoveItControllerHandle(name),
00077 namespace_(ns),
00078 done_(true)
00079 {
00080 controller_action_client_.reset(new actionlib::SimpleActionClient<T>(name_ +"/" + namespace_, true));
00081 unsigned int attempts = 0;
00082 while (ros::ok() && !controller_action_client_->waitForServer(ros::Duration(5.0)) && ++attempts < 3)
00083 ROS_INFO_STREAM("Waiting for " << name_ + "/" + namespace_ << " to come up");
00084
00085 if (!controller_action_client_->isServerConnected())
00086 {
00087 ROS_ERROR_STREAM("Action client not connected: " << name_ + "/" + namespace_);
00088 controller_action_client_.reset();
00089 }
00090
00091 last_exec_ = moveit_controller_manager::ExecutionStatus::SUCCEEDED;
00092 }
00093
00094 bool isConnected() const
00095 {
00096 return controller_action_client_;
00097 }
00098
00099 virtual bool cancelExecution()
00100 {
00101 if (!controller_action_client_)
00102 return false;
00103 if (!done_)
00104 {
00105 ROS_INFO_STREAM("Cancelling execution for " << name_);
00106 controller_action_client_->cancelGoal();
00107 last_exec_ = moveit_controller_manager::ExecutionStatus::PREEMPTED;
00108 done_ = true;
00109 }
00110 return true;
00111 }
00112
00113 virtual bool waitForExecution(const ros::Duration &timeout = ros::Duration(0))
00114 {
00115 if (controller_action_client_ && !done_)
00116 return controller_action_client_->waitForResult(timeout);
00117 return true;
00118 }
00119
00120 virtual moveit_controller_manager::ExecutionStatus getLastExecutionStatus()
00121 {
00122 return last_exec_;
00123 }
00124
00125 protected:
00126
00127 void finishControllerExecution(const actionlib::SimpleClientGoalState& state)
00128 {
00129 ROS_DEBUG_STREAM("Controller " << name_ << " is done with state " << state.toString() << ": " << state.getText());
00130 if (state == actionlib::SimpleClientGoalState::SUCCEEDED)
00131 last_exec_ = moveit_controller_manager::ExecutionStatus::SUCCEEDED;
00132 else
00133 if (state == actionlib::SimpleClientGoalState::ABORTED)
00134 last_exec_ = moveit_controller_manager::ExecutionStatus::ABORTED;
00135 else
00136 if (state == actionlib::SimpleClientGoalState::PREEMPTED)
00137 last_exec_ = moveit_controller_manager::ExecutionStatus::PREEMPTED;
00138 else
00139 last_exec_ = moveit_controller_manager::ExecutionStatus::FAILED;
00140 done_ = true;
00141 }
00142
00143 moveit_controller_manager::ExecutionStatus last_exec_;
00144 std::string namespace_;
00145 bool done_;
00146 boost::shared_ptr<actionlib::SimpleActionClient<T> > controller_action_client_;
00147 };
00148
00149 class Pr2GripperControllerHandle : public ActionBasedControllerHandle<pr2_controllers_msgs::Pr2GripperCommandAction>
00150 {
00151 public:
00152 Pr2GripperControllerHandle(const std::string &name, const std::string &ns = "gripper_action") :
00153 ActionBasedControllerHandle<pr2_controllers_msgs::Pr2GripperCommandAction>(name, ns),
00154 closing_(false)
00155 {
00156 }
00157
00158 virtual bool sendTrajectory(const moveit_msgs::RobotTrajectory &trajectory)
00159 {
00160 if (!controller_action_client_)
00161 return false;
00162 if (!trajectory.multi_dof_joint_trajectory.points.empty())
00163 {
00164 ROS_ERROR("The PR2 gripper controller cannot execute multi-dof trajectories.");
00165 return false;
00166 }
00167
00168 if (trajectory.joint_trajectory.points.back().positions.empty())
00169 {
00170 ROS_ERROR("The PR2 gripper controller expects a joint trajectory with one point that specifies at least one position, but 0 positions provided)");
00171 return false;
00172 }
00173
00174 if (trajectory.joint_trajectory.points.size() > 1)
00175 ROS_DEBUG("The PR2 gripper controller expects a joint trajectory with one point only, but %u provided. Using last point only.", (unsigned int)trajectory.joint_trajectory.points.size());
00176
00177 int gripper_joint_index = -1;
00178 for (std::size_t i = 0 ; i < trajectory.joint_trajectory.joint_names.size() ; ++i)
00179 if (trajectory.joint_trajectory.joint_names[i] == R_GRIPPER_JOINT || trajectory.joint_trajectory.joint_names[i] == L_GRIPPER_JOINT)
00180 {
00181 gripper_joint_index = i;
00182 break;
00183 }
00184
00185 if (!trajectory.joint_trajectory.joint_names.empty())
00186 {
00187 std::stringstream ss;
00188 ss << std::endl;
00189 for (std::size_t i = 0 ; i < trajectory.joint_trajectory.joint_names.size() ; ++i)
00190 ss << "PR2 gripper trajectory (" << i << "): " << trajectory.joint_trajectory.joint_names[i] << " " << trajectory.joint_trajectory.points[0].positions[i] << std::endl;
00191 ss << std::endl;
00192 ROS_DEBUG("%s", ss.str().c_str());
00193 }
00194
00195 if (gripper_joint_index == -1)
00196 {
00197 ROS_ERROR("Could not find value for gripper virtual joint. Expected joint value for '%s' or '%s'.", L_GRIPPER_JOINT.c_str(), R_GRIPPER_JOINT.c_str());
00198 return false;
00199 }
00200
00201 double gap_opening = trajectory.joint_trajectory.points.back().positions[gripper_joint_index] * GAP_CONVERSION_RATIO;
00202 ROS_DEBUG("PR2 gripper gap opening: %f", gap_opening);
00203 closing_ = false;
00204
00205 if (gap_opening > GRIPPER_OPEN)
00206 {
00207 gap_opening = GRIPPER_OPEN;
00208 closing_ = false;
00209 }
00210 else
00211 if (gap_opening <= 0.0)
00212 {
00213 gap_opening = 0.0;
00214 closing_ = true;
00215 }
00216
00217 pr2_controllers_msgs::Pr2GripperCommandGoal goal;
00218 goal.command.max_effort = DEFAULT_MAX_GRIPPER_EFFORT;
00219
00220 goal.command.position = gap_opening;
00221 controller_action_client_->sendGoal(goal,
00222 boost::bind(&Pr2GripperControllerHandle::controllerDoneCallback, this, _1, _2),
00223 boost::bind(&Pr2GripperControllerHandle::controllerActiveCallback, this),
00224 boost::bind(&Pr2GripperControllerHandle::controllerFeedbackCallback, this, _1));
00225 done_ = false;
00226 last_exec_ = moveit_controller_manager::ExecutionStatus::RUNNING;
00227 return true;
00228 }
00229
00230 private:
00231
00232 void controllerDoneCallback(const actionlib::SimpleClientGoalState& state,
00233 const pr2_controllers_msgs::Pr2GripperCommandResultConstPtr& result)
00234 {
00235
00236 if (state == actionlib::SimpleClientGoalState::ABORTED && closing_)
00237 finishControllerExecution(actionlib::SimpleClientGoalState::SUCCEEDED);
00238 else
00239 finishControllerExecution(state);
00240 }
00241
00242 void controllerActiveCallback()
00243 {
00244 ROS_DEBUG_STREAM("Controller " << name_ << " started execution");
00245 }
00246
00247 void controllerFeedbackCallback(const pr2_controllers_msgs::Pr2GripperCommandFeedbackConstPtr& feedback)
00248 {
00249 }
00250
00251 bool closing_;
00252 };
00253
00254 class Pr2FollowJointTrajectoryControllerHandle : public ActionBasedControllerHandle<control_msgs::FollowJointTrajectoryAction>
00255 {
00256 public:
00257
00258 Pr2FollowJointTrajectoryControllerHandle(const std::string &name, const std::string &ns = "follow_joint_trajectory") :
00259 ActionBasedControllerHandle<control_msgs::FollowJointTrajectoryAction>(name, ns)
00260 {
00261 }
00262
00263 virtual bool sendTrajectory(const moveit_msgs::RobotTrajectory &trajectory)
00264 {
00265 if (!controller_action_client_)
00266 return false;
00267 if (!trajectory.multi_dof_joint_trajectory.points.empty())
00268 {
00269 ROS_ERROR("The PR2 FollowJointTrajectory controller cannot execute multi-dof trajectories.");
00270 return false;
00271 }
00272 if (done_)
00273 ROS_DEBUG_STREAM("Sending trajectory to FollowJointTrajectory action for controller " << name_);
00274 else
00275 ROS_DEBUG_STREAM("Sending continuation for the currently executed trajectory to FollowJointTrajectory action for controller " << name_);
00276 control_msgs::FollowJointTrajectoryGoal goal;
00277 goal.trajectory = trajectory.joint_trajectory;
00278 controller_action_client_->sendGoal(goal,
00279 boost::bind(&Pr2FollowJointTrajectoryControllerHandle::controllerDoneCallback, this, _1, _2),
00280 boost::bind(&Pr2FollowJointTrajectoryControllerHandle::controllerActiveCallback, this),
00281 boost::bind(&Pr2FollowJointTrajectoryControllerHandle::controllerFeedbackCallback, this, _1));
00282 done_ = false;
00283 last_exec_ = moveit_controller_manager::ExecutionStatus::RUNNING;
00284 return true;
00285 }
00286
00287 protected:
00288
00289 void controllerDoneCallback(const actionlib::SimpleClientGoalState& state,
00290 const control_msgs::FollowJointTrajectoryResultConstPtr& result)
00291 {
00292 finishControllerExecution(state);
00293 }
00294
00295 void controllerActiveCallback()
00296 {
00297 ROS_DEBUG_STREAM("Controller " << name_ << " started execution");
00298 }
00299
00300 void controllerFeedbackCallback(const control_msgs::FollowJointTrajectoryFeedbackConstPtr& feedback)
00301 {
00302 }
00303 };
00304
00305 class Pr2MoveItControllerManager : public moveit_controller_manager::MoveItControllerManager
00306 {
00307 public:
00308
00309 Pr2MoveItControllerManager() : node_handle_("~")
00310 {
00311 if (node_handle_.hasParam("controller_manager_name"))
00312 node_handle_.getParam("controller_manager_name", controller_manager_name_);
00313 if (controller_manager_name_.empty())
00314 node_handle_.param("pr2_controller_manager_name", controller_manager_name_, std::string("pr2_controller_manager"));
00315 if (node_handle_.hasParam("use_controller_manager"))
00316 node_handle_.param("use_controller_manager", use_controller_manager_, true);
00317 else
00318 node_handle_.param("use_pr2_controller_manager", use_controller_manager_, true);
00319
00320 XmlRpc::XmlRpcValue controller_list;
00321 if (node_handle_.hasParam("controller_list"))
00322 {
00323 node_handle_.getParam("controller_list", controller_list);
00324 if (controller_list.getType() != XmlRpc::XmlRpcValue::TypeArray)
00325 ROS_WARN("Controller list should be specified as an array");
00326 else
00327 for (int i = 0 ; i < controller_list.size() ; ++i)
00328 if (!controller_list[i].hasMember("name") || !controller_list[i].hasMember("joints"))
00329 ROS_WARN("Name and joints must be specifed for each controller");
00330 else
00331 {
00332 try
00333 {
00334 ControllerInformation ci;
00335 std::string name = std::string(controller_list[i]["name"]);
00336 if (controller_list[i].hasMember("default"))
00337 {
00338 try
00339 {
00340 if (controller_list[i]["default"].getType() == XmlRpc::XmlRpcValue::TypeBoolean)
00341 {
00342 ci.default_ = controller_list[i]["default"];
00343 }
00344 else
00345 {
00346 std::string def = std::string(controller_list[i]["default"]);
00347 std::transform(def.begin(), def.end(), def.begin(), ::tolower);
00348 if (def == "true" || def == "yes")
00349 ci.default_ = true;
00350 }
00351 }
00352 catch (...)
00353 {
00354 }
00355 }
00356
00357 if (controller_list[i].hasMember("ns"))
00358 {
00359 ci.ns_ = std::string(controller_list[i]["ns"]);
00360 ROS_WARN("'ns' argument specified. Please use 'action_ns' instead.");
00361 }
00362 if (controller_list[i].hasMember("action_ns"))
00363 ci.ns_ = std::string(controller_list[i]["action_ns"]);
00364 if (controller_list[i]["joints"].getType() == XmlRpc::XmlRpcValue::TypeArray)
00365 {
00366 int nj = controller_list[i]["joints"].size();
00367 for (int j = 0 ; j < nj ; ++j)
00368 ci.joints_.push_back(std::string(controller_list[i]["joints"][j]));
00369 }
00370 else
00371 ROS_WARN_STREAM("The list of joints for controller " << name << " is not specified as an array");
00372 if (!ci.joints_.empty())
00373 possibly_unloaded_controllers_[name] = ci;
00374 }
00375 catch (...)
00376 {
00377 ROS_ERROR("Unable to parse controller information");
00378 }
00379 }
00380 }
00381 else
00382 {
00383 if (use_controller_manager_)
00384 ROS_DEBUG_STREAM("No controller list specified. Using list obtained from the " << controller_manager_name_);
00385 else
00386 ROS_ERROR_STREAM("Not using a controller manager and no controllers specified. There are no known controllers.");
00387 }
00388
00389 if (use_controller_manager_)
00390 {
00391 static const unsigned int max_attempts = 5;
00392 unsigned int attempts = 0;
00393 while (ros::ok() && !ros::service::waitForService(controller_manager_name_ + "/list_controllers", ros::Duration(5.0)) && ++attempts < max_attempts)
00394 ROS_INFO_STREAM("Waiting for service " << controller_manager_name_ + "/list_controllers" << " to come up");
00395
00396 if (attempts < max_attempts)
00397 while (ros::ok() && !ros::service::waitForService(controller_manager_name_ + "/switch_controller", ros::Duration(5.0)) && ++attempts < max_attempts)
00398 ROS_INFO_STREAM("Waiting for service " << controller_manager_name_ + "/switch_controller" << " to come up");
00399
00400 if (attempts < max_attempts)
00401 while (ros::ok() && !ros::service::waitForService(controller_manager_name_ + "/load_controller", ros::Duration(5.0)) && ++attempts < max_attempts)
00402 ROS_INFO_STREAM("Waiting for service " << controller_manager_name_ + "/load_controller" << " to come up");
00403
00404 if (attempts < max_attempts)
00405 {
00406 lister_service_ = root_node_handle_.serviceClient<pr2_mechanism_msgs::ListControllers>(controller_manager_name_ + "/list_controllers", true);
00407 switcher_service_ = root_node_handle_.serviceClient<pr2_mechanism_msgs::SwitchController>(controller_manager_name_ + "/switch_controller", true);
00408 loader_service_ = root_node_handle_.serviceClient<pr2_mechanism_msgs::LoadController>(controller_manager_name_ + "/load_controller", true);
00409 }
00410 else
00411 ROS_ERROR("Not using the PR2 controller manager");
00412 }
00413 }
00414
00415 virtual ~Pr2MoveItControllerManager()
00416 {
00417 }
00418
00419 virtual moveit_controller_manager::MoveItControllerHandlePtr getControllerHandle(const std::string &name)
00420 {
00421 std::map<std::string, moveit_controller_manager::MoveItControllerHandlePtr>::const_iterator it = handle_cache_.find(name);
00422 if (it != handle_cache_.end())
00423 return it->second;
00424
00425 moveit_controller_manager::MoveItControllerHandlePtr new_handle;
00426 if (possibly_unloaded_controllers_.find(name) != possibly_unloaded_controllers_.end())
00427 {
00428 const std::string &ns = possibly_unloaded_controllers_.at(name).ns_;
00429 new_handle = getControllerHandleHelper(name, ns);
00430 }
00431 else
00432 new_handle = getControllerHandleHelper(name, "");
00433
00434 if (new_handle)
00435 handle_cache_[name] = new_handle;
00436 return new_handle;
00437 }
00438
00439 virtual void getControllersList(std::vector<std::string> &names)
00440 {
00441 const pr2_mechanism_msgs::ListControllers::Response &res = getListControllerServiceResponse();
00442 std::set<std::string> names_set;
00443 names_set.insert(res.controllers.begin(), res.controllers.end());
00444
00445 for (std::map<std::string, ControllerInformation>::const_iterator it = possibly_unloaded_controllers_.begin() ; it != possibly_unloaded_controllers_.end() ; ++it)
00446 names_set.insert(it->first);
00447
00448 names.clear();
00449 names.insert(names.end(), names_set.begin(), names_set.end());
00450 }
00451
00452 virtual void getActiveControllers(std::vector<std::string> &names)
00453 {
00454 names.clear();
00455 if (use_controller_manager_)
00456 {
00457 const pr2_mechanism_msgs::ListControllers::Response &res = getListControllerServiceResponse();
00458 for (std::size_t i = 0; i < res.controllers.size(); ++i)
00459 if (res.state[i] == "running")
00460 names.push_back(res.controllers[i]);
00461 }
00462 else
00463
00464 for (std::map<std::string, ControllerInformation>::const_iterator it = possibly_unloaded_controllers_.begin() ; it != possibly_unloaded_controllers_.end() ; ++it)
00465 names.push_back(it->first);
00466 }
00467
00468 virtual void getControllerJoints(const std::string &name, std::vector<std::string> &joints)
00469 {
00470 std::map<std::string, ControllerInformation>::const_iterator it = possibly_unloaded_controllers_.find(name);
00471 if (it != possibly_unloaded_controllers_.end())
00472 joints = it->second.joints_;
00473 else
00474 {
00475 joints.clear();
00476 std::string param_name;
00477 if (node_handle_.searchParam(name + "/joints", param_name))
00478 {
00479 XmlRpc::XmlRpcValue joints_list;
00480 node_handle_.getParam(param_name, joints_list);
00481 if (joints_list.getType() == XmlRpc::XmlRpcValue::TypeArray)
00482 for (int i = 0 ; i < joints_list.size() ; ++i)
00483 joints.push_back((std::string)joints_list[i]);
00484 }
00485 else
00486 if (node_handle_.searchParam(name + "/joint", param_name))
00487 {
00488 std::string joint_name;
00489 if (node_handle_.getParam(param_name, joint_name))
00490 joints.push_back(joint_name);
00491 }
00492 if (joints.empty())
00493 ROS_INFO("The joints for controller '%s' are not known and were not found on the ROS param server under '%s/joints'or '%s/joint'. "
00494 "Perhaps the controller configuration is not loaded on the param server?", name.c_str(), name.c_str(), name.c_str());
00495 ControllerInformation &ci = possibly_unloaded_controllers_[name];
00496 ci.joints_ = joints;
00497 }
00498 }
00499
00500 virtual moveit_controller_manager::MoveItControllerManager::ControllerState getControllerState(const std::string &name)
00501 {
00502 moveit_controller_manager::MoveItControllerManager::ControllerState state;
00503 if (use_controller_manager_)
00504 {
00505 const pr2_mechanism_msgs::ListControllers::Response &res = getListControllerServiceResponse();
00506 for (std::size_t i = 0; i < res.controllers.size(); ++i)
00507 {
00508 if (res.controllers[i] == name)
00509 {
00510 if (res.state[i] == "running")
00511 state.active_ = true;
00512 break;
00513 }
00514 }
00515 }
00516 else
00517 {
00518
00519 state.active_ = true;
00520 }
00521
00522 std::map<std::string, ControllerInformation>::const_iterator it = possibly_unloaded_controllers_.find(name);
00523 if (it != possibly_unloaded_controllers_.end())
00524 if (it->second.default_)
00525 state.default_ = true;
00526 return state;
00527 }
00528
00529 virtual bool switchControllers(const std::vector<std::string> &activate, const std::vector<std::string> &deactivate)
00530 {
00531 if (!use_controller_manager_)
00532 {
00533 ROS_WARN_STREAM("Cannot switch controllers without using the controller manager");
00534 return false;
00535 }
00536
00537 if (!activate.empty())
00538 {
00539
00540 const std::vector<std::string> &loaded_c = getListControllerServiceResponse().controllers;
00541 std::set<std::string> loaded_c_set(loaded_c.begin(), loaded_c.end());
00542 for (std::size_t i = 0 ; i < activate.size() ; ++i)
00543 if (loaded_c_set.find(activate[i]) == loaded_c_set.end())
00544 {
00545 handle_cache_.erase(activate[i]);
00546 pr2_mechanism_msgs::LoadController::Request req;
00547 pr2_mechanism_msgs::LoadController::Response res;
00548 req.name = activate[i];
00549 if (!loader_service_.call(req, res))
00550 {
00551 ROS_WARN("Something went wrong with loader service while trying to load '%s'", req.name.c_str());
00552 return false;
00553 }
00554 if (!res.ok)
00555 {
00556 ROS_WARN("Loading controller '%s' failed", req.name.c_str());
00557 return false;
00558 }
00559 }
00560 }
00561
00562 last_lister_response_ = ros::Time();
00563 pr2_mechanism_msgs::SwitchController::Request req;
00564 pr2_mechanism_msgs::SwitchController::Response res;
00565
00566 req.strictness = pr2_mechanism_msgs::SwitchController::Request::BEST_EFFORT;
00567 req.start_controllers = activate;
00568 req.stop_controllers = deactivate;
00569 if (!switcher_service_.call(req, res))
00570 {
00571 ROS_WARN_STREAM("Something went wrong with switcher service");
00572 return false;
00573 }
00574 if (!res.ok)
00575 ROS_WARN_STREAM("Switcher service failed");
00576 return res.ok;
00577 }
00578
00579 protected:
00580
00581 const pr2_mechanism_msgs::ListControllers::Response &getListControllerServiceResponse()
00582 {
00583 if (use_controller_manager_)
00584 {
00585 static const ros::Duration max_cache_age(1.0);
00586 if ((ros::Time::now() - last_lister_response_) > max_cache_age)
00587 {
00588 pr2_mechanism_msgs::ListControllers::Request req;
00589 if (!lister_service_.call(req, cached_lister_response_))
00590 ROS_WARN_STREAM("Something went wrong with lister service");
00591 last_lister_response_ = ros::Time::now();
00592 }
00593 }
00594 return cached_lister_response_;
00595 }
00596
00597 moveit_controller_manager::MoveItControllerHandlePtr getControllerHandleHelper(const std::string &name, const std::string &ns)
00598 {
00599 moveit_controller_manager::MoveItControllerHandlePtr new_handle;
00600 if (name == "l_gripper_controller" || name == "r_gripper_controller")
00601 {
00602 new_handle.reset(ns.empty() ? new Pr2GripperControllerHandle(name) : new Pr2GripperControllerHandle(name, ns));
00603 if (!static_cast<Pr2GripperControllerHandle*>(new_handle.get())->isConnected())
00604 new_handle.reset();
00605 }
00606 else
00607 {
00608 new_handle.reset(ns.empty() ? new Pr2FollowJointTrajectoryControllerHandle(name) : new Pr2FollowJointTrajectoryControllerHandle(name, ns));
00609 if (!static_cast<Pr2FollowJointTrajectoryControllerHandle*>(new_handle.get())->isConnected())
00610 new_handle.reset();
00611 }
00612 return new_handle;
00613 }
00614
00615 ros::NodeHandle node_handle_;
00616 ros::NodeHandle root_node_handle_;
00617
00618 std::string controller_manager_name_;
00619 bool use_controller_manager_;
00620 ros::ServiceClient loader_service_;
00621 ros::ServiceClient switcher_service_;
00622 ros::ServiceClient lister_service_;
00623
00624 ros::Time last_lister_response_;
00625 pr2_mechanism_msgs::ListControllers::Response cached_lister_response_;
00626
00627 std::map<std::string, moveit_controller_manager::MoveItControllerHandlePtr> handle_cache_;
00628
00629 struct ControllerInformation
00630 {
00631 ControllerInformation() : default_(false)
00632 {
00633 }
00634
00635 bool default_;
00636 std::string ns_;
00637 std::vector<std::string> joints_;
00638 };
00639 std::map<std::string, ControllerInformation> possibly_unloaded_controllers_;
00640 };
00641
00642 }
00643
00644 PLUGINLIB_EXPORT_CLASS(pr2_moveit_controller_manager::Pr2MoveItControllerManager,
00645 moveit_controller_manager::MoveItControllerManager);