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
00027
00028
00029
00030
00031 #include "pr2_controller_manager/controller_manager.h"
00032 #include "pr2_controller_manager/scheduler.h"
00033 #include <algorithm>
00034 #include <boost/thread/thread.hpp>
00035 #include <boost/thread/condition.hpp>
00036 #include <sstream>
00037 #include "ros/console.h"
00038
00039 using namespace pr2_mechanism_model;
00040 using namespace pr2_controller_manager;
00041 using namespace pr2_hardware_interface;
00042 using namespace pr2_controller_interface;
00043 using namespace boost::accumulators;
00044 using namespace ros;
00045
00046
00047 ControllerManager::ControllerManager(HardwareInterface *hw, const ros::NodeHandle& nh) :
00048 model_(hw),
00049 state_(NULL),
00050 controller_node_(nh),
00051 cm_node_(nh, "pr2_controller_manager"),
00052 start_request_(0),
00053 stop_request_(0),
00054 please_switch_(false),
00055 current_controllers_list_(0),
00056 used_by_realtime_(-1),
00057 pub_joint_state_(nh, "joint_states", 1),
00058 pub_mech_stats_(nh, "mechanism_statistics", 1),
00059 last_published_joint_state_(ros::Time::now()),
00060 last_published_mechanism_stats_(ros::Time::now())
00061 {}
00062
00063 ControllerManager::~ControllerManager()
00064 {
00065 if (state_)
00066 delete state_;
00067 }
00068
00069
00070 bool ControllerManager::initXml(TiXmlElement* config)
00071 {
00072 if (!model_.initXml(config)){
00073 ROS_ERROR("Failed to initialize pr2 mechanism model");
00074 return false;
00075 }
00076 state_ = new RobotState(&model_);
00077 motors_previously_halted_ = state_->isHalted();
00078
00079
00080 pub_mech_stats_.msg_.controller_statistics.resize(0);
00081 pub_mech_stats_.msg_.actuator_statistics.resize(model_.hw_->actuators_.size());
00082 int joints_size = 0;
00083 for (unsigned int i = 0; i < state_->joint_states_.size(); ++i)
00084 {
00085 int type = state_->joint_states_[i].joint_->type;
00086 if (type != urdf::Joint::REVOLUTE &&
00087 type != urdf::Joint::CONTINUOUS &&
00088 type != urdf::Joint::PRISMATIC){
00089 ROS_ERROR("Joint state contains joint '%s' of unknown type", state_->joint_states_[i].joint_->name.c_str());
00090 return false;
00091 }
00092 ++joints_size;
00093 }
00094 pub_mech_stats_.msg_.joint_statistics.resize(joints_size);
00095 pub_joint_state_.msg_.name.resize(joints_size);
00096 pub_joint_state_.msg_.position.resize(joints_size);
00097 pub_joint_state_.msg_.velocity.resize(joints_size);
00098 pub_joint_state_.msg_.effort.resize(joints_size);
00099
00100
00101 double publish_rate_joint_state, publish_rate_mechanism_stats;
00102 cm_node_.param("mechanism_statistics_publish_rate", publish_rate_mechanism_stats, 1.0);
00103 cm_node_.param("joint_state_publish_rate", publish_rate_joint_state, 100.0);
00104 publish_period_mechanism_stats_ = Duration(1.0/fmax(0.000001, publish_rate_mechanism_stats));
00105 publish_period_joint_state_ = Duration(1.0/fmax(0.000001, publish_rate_joint_state));
00106
00107
00108 controller_loader_.reset(new pluginlib::ClassLoader<pr2_controller_interface::Controller>("pr2_controller_interface",
00109 "pr2_controller_interface::Controller"));
00110
00111 srv_list_controllers_ = cm_node_.advertiseService("list_controllers", &ControllerManager::listControllersSrv, this);
00112 srv_list_controller_types_ = cm_node_.advertiseService("list_controller_types", &ControllerManager::listControllerTypesSrv, this);
00113 srv_load_controller_ = cm_node_.advertiseService("load_controller", &ControllerManager::loadControllerSrv, this);
00114 srv_unload_controller_ = cm_node_.advertiseService("unload_controller", &ControllerManager::unloadControllerSrv, this);
00115 srv_switch_controller_ = cm_node_.advertiseService("switch_controller", &ControllerManager::switchControllerSrv, this);
00116 srv_reload_libraries_ = cm_node_.advertiseService("reload_controller_libraries", &ControllerManager::reloadControllerLibrariesSrv, this);
00117
00118 return true;
00119 }
00120
00121
00122
00123
00124
00125
00126 void ControllerManager::update()
00127 {
00128 used_by_realtime_ = current_controllers_list_;
00129 std::vector<ControllerSpec> &controllers = controllers_lists_[used_by_realtime_];
00130 std::vector<size_t> &scheduling = controllers_scheduling_[used_by_realtime_];
00131
00132 ros::Time start = ros::Time::now();
00133 state_->propagateActuatorPositionToJointPosition();
00134 state_->zeroCommands();
00135 ros::Time start_update = ros::Time::now();
00136 pre_update_stats_.acc((start_update - start).toSec());
00137
00138
00139 if (!state_->isHalted() && motors_previously_halted_){
00140 for (size_t i=0; i<controllers.size(); i++){
00141 if (controllers[scheduling[i]].c->isRunning()){
00142 controllers[scheduling[i]].c->stopRequest();
00143 controllers[scheduling[i]].c->startRequest();
00144 }
00145 }
00146 }
00147 motors_previously_halted_ = state_->isHalted();
00148
00149
00150 for (size_t i=0; i<controllers.size(); i++){
00151 ros::Time start = ros::Time::now();
00152 controllers[scheduling[i]].c->updateRequest();
00153 ros::Time end = ros::Time::now();
00154 controllers[scheduling[i]].stats->acc((end - start).toSec());
00155 if (end - start > ros::Duration(0.001)){
00156 controllers[scheduling[i]].stats->num_control_loop_overruns++;
00157 controllers[scheduling[i]].stats->time_last_control_loop_overrun = end;
00158 }
00159 }
00160 ros::Time end_update = ros::Time::now();
00161 update_stats_.acc((end_update - start_update).toSec());
00162
00163 state_->enforceSafety();
00164 state_->propagateJointEffortToActuatorEffort();
00165 ros::Time end = ros::Time::now();
00166 post_update_stats_.acc((end - end_update).toSec());
00167
00168
00169 publishMechanismStatistics();
00170 publishJointState();
00171
00172
00173 if (please_switch_)
00174 {
00175
00176 for (unsigned int i=0; i<stop_request_.size(); i++)
00177 if (!stop_request_[i]->stopRequest())
00178 ROS_FATAL("Failed to stop controller in realtime loop. This should never happen.");
00179
00180
00181 for (unsigned int i=0; i<start_request_.size(); i++)
00182 if (!start_request_[i]->startRequest())
00183 ROS_FATAL("Failed to start controller in realtime loop. This should never happen.");
00184
00185 start_request_.clear();
00186 stop_request_.clear();
00187 please_switch_ = false;
00188 }
00189 }
00190
00191 pr2_controller_interface::Controller* ControllerManager::getControllerByName(const std::string& name)
00192 {
00193 std::vector<ControllerSpec> &controllers = controllers_lists_[current_controllers_list_];
00194 for (size_t i = 0; i < controllers.size(); ++i)
00195 {
00196 if (controllers[i].name == name)
00197 return controllers[i].c.get();
00198 }
00199 return NULL;
00200 }
00201
00202 void ControllerManager::getControllerNames(std::vector<std::string> &names)
00203 {
00204 boost::mutex::scoped_lock guard(controllers_lock_);
00205 std::vector<ControllerSpec> &controllers = controllers_lists_[current_controllers_list_];
00206 for (size_t i = 0; i < controllers.size(); ++i)
00207 {
00208 names.push_back(controllers[i].name);
00209 }
00210 }
00211
00212 void ControllerManager::getControllerSchedule(std::vector<size_t> &schedule)
00213 {
00214 boost::mutex::scoped_lock guard(controllers_lock_);
00215 schedule = controllers_scheduling_[current_controllers_list_];
00216 }
00217
00218
00219 bool ControllerManager::loadController(const std::string& name)
00220 {
00221 ROS_DEBUG("Will load controller '%s'", name.c_str());
00222
00223
00224 boost::mutex::scoped_lock guard(controllers_lock_);
00225
00226
00227 int free_controllers_list = (current_controllers_list_ + 1) % 2;
00228 while (ros::ok() && free_controllers_list == used_by_realtime_){
00229 if (!ros::ok())
00230 return false;
00231 usleep(200);
00232 }
00233 std::vector<ControllerSpec>
00234 &from = controllers_lists_[current_controllers_list_],
00235 &to = controllers_lists_[free_controllers_list];
00236 to.clear();
00237
00238
00239 for (size_t i = 0; i < from.size(); ++i)
00240 to.push_back(from[i]);
00241
00242
00243 for (size_t j = 0; j < to.size(); ++j)
00244 {
00245 if (to[j].name == name)
00246 {
00247 to.clear();
00248 ROS_ERROR("A controller named '%s' was already loaded inside the controller manager", name.c_str());
00249 return false;
00250 }
00251 }
00252
00253 NodeHandle c_node;
00254
00255 try{
00256 c_node = NodeHandle(controller_node_, name);
00257 }
00258 catch(std::exception &e) {
00259 ROS_ERROR("Exception thrown while constructing nodehandle for controller with name '%s':\n%s", name.c_str(), e.what());
00260 return false;
00261 }
00262 catch(...){
00263 ROS_ERROR("Exception thrown while constructing nodehandle for controller with name '%s'", name.c_str());
00264 return false;
00265 }
00266 pr2_controller_interface::Controller *c = NULL;
00267 std::string type;
00268 if (c_node.getParam("type", type))
00269 {
00270 ROS_DEBUG("Constructing controller '%s' of type '%s'", name.c_str(), type.c_str());
00271 try {
00272
00273 if (!controller_loader_->isClassAvailable(type))
00274 {
00275 std::vector<std::string> classes = controller_loader_->getDeclaredClasses();
00276 for(unsigned int i = 0; i < classes.size(); ++i)
00277 {
00278 if(type == controller_loader_->getName(classes[i]))
00279 {
00280 ROS_WARN("The deprecated controller type %s was not found. Using the namespaced version %s instead. "
00281 "Please update your configuration to use the namespaced version.",
00282 type.c_str(), classes[i].c_str());
00283 type = classes[i];
00284 break;
00285 }
00286 }
00287 }
00288
00289 c = controller_loader_->createClassInstance(type, true);
00290 }
00291 catch (const std::runtime_error &ex)
00292 {
00293 ROS_ERROR("Could not load class %s: %s", type.c_str(), ex.what());
00294 }
00295 }
00296
00297
00298 if (c == NULL)
00299 {
00300 to.clear();
00301 if (type == "")
00302 ROS_ERROR("Could not load controller '%s' because the type was not specified. Did you load the controller configuration on the parameter server?",
00303 name.c_str());
00304 else
00305 ROS_ERROR("Could not load controller '%s' because controller type '%s' does not exist",
00306 name.c_str(), type.c_str());
00307 return false;
00308 }
00309
00310
00311 ROS_DEBUG("Initializing controller '%s'", name.c_str());
00312 bool initialized;
00313 try{
00314 initialized = c->initRequest(this, state_, c_node);
00315 }
00316 catch(std::exception &e){
00317 ROS_ERROR("Exception thrown while initializing controller %s.\n%s", name.c_str(), e.what());
00318 initialized = false;
00319 }
00320 catch(...){
00321 ROS_ERROR("Exception thrown while initializing controller %s", name.c_str());
00322 initialized = false;
00323 }
00324 if (!initialized)
00325 {
00326 to.clear();
00327 delete c;
00328 ROS_ERROR("Initializing controller '%s' failed", name.c_str());
00329 return false;
00330 }
00331 ROS_DEBUG("Initialized controller '%s' succesful", name.c_str());
00332
00333
00334 to.resize(to.size() + 1);
00335 to[to.size()-1].name = name;
00336 to[to.size()-1].c.reset(c);
00337
00338
00339 if (!scheduleControllers(to, controllers_scheduling_[free_controllers_list])){
00340 to.clear();
00341 delete c;
00342 ROS_ERROR("Scheduling controller '%s' failed", name.c_str());
00343 return false;
00344 }
00345
00346
00347 pub_mech_stats_.lock();
00348 pub_mech_stats_.msg_.controller_statistics.resize(to.size());
00349 for (size_t i=0; i<to.size(); i++)
00350 pub_mech_stats_.msg_.controller_statistics[i].name = to[i].name;
00351
00352
00353 int former_current_controllers_list_ = current_controllers_list_;
00354 current_controllers_list_ = free_controllers_list;
00355 while (ros::ok() && used_by_realtime_ == former_current_controllers_list_){
00356 if (!ros::ok())
00357 return false;
00358 usleep(200);
00359 }
00360 from.clear();
00361 pub_mech_stats_.unlock();
00362
00363 ROS_DEBUG("Successfully load controller '%s'", name.c_str());
00364 return true;
00365 }
00366
00367
00368
00369
00370 bool ControllerManager::unloadController(const std::string &name)
00371 {
00372 ROS_DEBUG("Will unload controller '%s'", name.c_str());
00373
00374
00375 boost::mutex::scoped_lock guard(controllers_lock_);
00376
00377
00378 int free_controllers_list = (current_controllers_list_ + 1) % 2;
00379 while (ros::ok() && free_controllers_list == used_by_realtime_){
00380 if (!ros::ok())
00381 return false;
00382 usleep(200);
00383 }
00384 std::vector<ControllerSpec>
00385 &from = controllers_lists_[current_controllers_list_],
00386 &to = controllers_lists_[free_controllers_list];
00387 to.clear();
00388
00389
00390 for (size_t i = 0; i < from.size(); ++i){
00391 for (size_t b=0; b<from[i].c->before_list_.size(); b++){
00392 if (name == from[i].c->before_list_[b]){
00393 ROS_ERROR("Cannot unload controller %s because controller %s still depends on it",
00394 name.c_str(), from[i].name.c_str());
00395 return false;
00396 }
00397 }
00398 for (size_t a=0; a<from[i].c->after_list_.size(); a++){
00399 if (name == from[i].c->after_list_[a]){
00400 ROS_ERROR("Cannot unload controller %s because controller %s still depends on it",
00401 name.c_str(), from[i].name.c_str());
00402 return false;
00403 }
00404 }
00405 }
00406
00407
00408 bool removed = false;
00409 for (size_t i = 0; i < from.size(); ++i)
00410 {
00411 if (from[i].name == name){
00412 if (from[i].c->isRunning()){
00413 to.clear();
00414 ROS_ERROR("Could not unload controller with name %s because it is still running",
00415 name.c_str());
00416 return false;
00417 }
00418 removed = true;
00419 }
00420 else
00421 to.push_back(from[i]);
00422 }
00423
00424
00425 if (!removed)
00426 {
00427 to.clear();
00428 ROS_ERROR("Could not unload controller with name %s because no controller with this name exists",
00429 name.c_str());
00430 return false;
00431 }
00432
00433
00434 ROS_DEBUG("Rescheduling controller execution order");
00435 if (!scheduleControllers(to, controllers_scheduling_[free_controllers_list])){
00436 to.clear();
00437 ROS_ERROR("Scheduling controllers failed when removing controller '%s' failed", name.c_str());
00438 return false;
00439 }
00440
00441
00442 ROS_DEBUG("Resizing controller state vector");
00443 pub_mech_stats_.lock();
00444 pub_mech_stats_.msg_.controller_statistics.resize(to.size());
00445 for (size_t i=0; i<to.size(); i++)
00446 pub_mech_stats_.msg_.controller_statistics[i].name = to[i].name;
00447
00448
00449 ROS_DEBUG("Realtime switches over to new controller list");
00450 int former_current_controllers_list_ = current_controllers_list_;
00451 current_controllers_list_ = free_controllers_list;
00452 while (ros::ok() && used_by_realtime_ == former_current_controllers_list_){
00453 if (!ros::ok())
00454 return false;
00455 usleep(200);
00456 }
00457 ROS_DEBUG("Destruct controller");
00458 from.clear();
00459 ROS_DEBUG("Destruct controller finished");
00460 pub_mech_stats_.unlock();
00461
00462 ROS_DEBUG("Successfully unloaded controller '%s'", name.c_str());
00463 return true;
00464 }
00465
00466
00467
00468 bool ControllerManager::switchController(const std::vector<std::string>& start_controllers,
00469 const std::vector<std::string>& stop_controllers,
00470 int strictness)
00471 {
00472 if (!stop_request_.empty() || !start_request_.empty())
00473 ROS_FATAL("The switch controller stop and start list are not empty that the beginning of the swithcontroller call. This should not happen.");
00474
00475 if (strictness == 0){
00476 ROS_WARN("Controller Manager: To switch controllers you need to specify a strictness level of STRICT or BEST_EFFORT. Defaulting to BEST_EFFORT.");
00477 strictness = pr2_mechanism_msgs::SwitchController::Request::BEST_EFFORT;
00478 }
00479
00480 ROS_DEBUG("switching controllers:");
00481 for (unsigned int i=0; i<start_controllers.size(); i++)
00482 ROS_DEBUG(" - starting controller %s", start_controllers[i].c_str());
00483 for (unsigned int i=0; i<stop_controllers.size(); i++)
00484 ROS_DEBUG(" - stopping controller %s", stop_controllers[i].c_str());
00485
00486
00487 boost::mutex::scoped_lock guard(controllers_lock_);
00488
00489 pr2_controller_interface::Controller* ct;
00490
00491 for (unsigned int i=0; i<stop_controllers.size(); i++)
00492 {
00493 ct = getControllerByName(stop_controllers[i]);
00494 if (ct == NULL){
00495 if (strictness == pr2_mechanism_msgs::SwitchController::Request::STRICT){
00496 ROS_ERROR("Could not stop controller with name %s because no controller with this name exists",
00497 stop_controllers[i].c_str());
00498 stop_request_.clear();
00499 return false;
00500 }
00501 else{
00502 ROS_DEBUG("Could not stop controller with name %s because no controller with this name exists",
00503 stop_controllers[i].c_str());
00504 }
00505 }
00506 else{
00507 ROS_DEBUG("Found controller %s that needs to be stopped in list of controllers",
00508 stop_controllers[i].c_str());
00509 stop_request_.push_back(ct);
00510 }
00511 }
00512 ROS_DEBUG("Stop request vector has size %i", (int)stop_request_.size());
00513
00514
00515 for (unsigned int i=0; i<start_controllers.size(); i++)
00516 {
00517 ct = getControllerByName(start_controllers[i]);
00518 if (ct == NULL){
00519 if (strictness == pr2_mechanism_msgs::SwitchController::Request::STRICT){
00520 ROS_ERROR("Could not start controller with name %s because no controller with this name exists",
00521 start_controllers[i].c_str());
00522 stop_request_.clear();
00523 start_request_.clear();
00524 return false;
00525 }
00526 else{
00527 ROS_DEBUG("Could not start controller with name %s because no controller with this name exists",
00528 start_controllers[i].c_str());
00529 }
00530 }
00531 else{
00532 ROS_DEBUG("Found controller %s that needs to be started in list of controllers",
00533 start_controllers[i].c_str());
00534 start_request_.push_back(ct);
00535 }
00536 }
00537 ROS_DEBUG("Start request vector has size %i", (int)start_request_.size());
00538
00539
00540 switch_strictness_ = strictness;
00541 please_switch_ = true;
00542
00543
00544 ROS_DEBUG("Request atomic controller switch from realtime loop");
00545 while (ros::ok() && please_switch_){
00546 if (!ros::ok())
00547 return false;
00548 usleep(100);
00549 }
00550 ROS_DEBUG("Successfully switched controllers");
00551 return true;
00552 }
00553
00554
00555 void ControllerManager::publishJointState()
00556 {
00557 ros::Time now = ros::Time::now();
00558 if (now > last_published_joint_state_ + publish_period_joint_state_)
00559 {
00560 if (pub_joint_state_.trylock())
00561 {
00562 while (last_published_joint_state_ + publish_period_joint_state_ < now)
00563 last_published_joint_state_ = last_published_joint_state_ + publish_period_joint_state_;
00564
00565 unsigned int j = 0;
00566 for (unsigned int i = 0; i < state_->joint_states_.size(); ++i)
00567 {
00568 int type = state_->joint_states_[i].joint_->type;
00569 if (type == urdf::Joint::REVOLUTE || type == urdf::Joint::CONTINUOUS || type == urdf::Joint::PRISMATIC)
00570 {
00571 assert(j < pub_joint_state_.msg_.name.size());
00572 assert(j < pub_joint_state_.msg_.position.size());
00573 assert(j < pub_joint_state_.msg_.velocity.size());
00574 assert(j < pub_joint_state_.msg_.effort.size());
00575 pr2_mechanism_model::JointState *in = &state_->joint_states_[i];
00576 pub_joint_state_.msg_.name[j] = state_->joint_states_[i].joint_->name;
00577 pub_joint_state_.msg_.position[j] = in->position_;
00578 pub_joint_state_.msg_.velocity[j] = in->velocity_;
00579 pub_joint_state_.msg_.effort[j] = in->measured_effort_;
00580
00581 j++;
00582 }
00583 }
00584 pub_joint_state_.msg_.header.stamp = ros::Time::now();
00585 pub_joint_state_.unlockAndPublish();
00586 }
00587 }
00588 }
00589
00590
00591 void ControllerManager::publishMechanismStatistics()
00592 {
00593 ros::Time now = ros::Time::now();
00594 if (now > last_published_mechanism_stats_ + publish_period_mechanism_stats_)
00595 {
00596 if (pub_mech_stats_.trylock())
00597 {
00598 while (last_published_mechanism_stats_ + publish_period_mechanism_stats_ < now)
00599 last_published_mechanism_stats_ = last_published_mechanism_stats_ + publish_period_mechanism_stats_;
00600
00601
00602 unsigned int j = 0;
00603 for (unsigned int i = 0; i < state_->joint_states_.size(); ++i)
00604 {
00605 int type = state_->joint_states_[i].joint_->type;
00606 if (type == urdf::Joint::REVOLUTE || type == urdf::Joint::CONTINUOUS || type == urdf::Joint::PRISMATIC)
00607 {
00608 assert(j < pub_mech_stats_.msg_.joint_statistics.size());
00609 pr2_mechanism_model::JointState *in = &state_->joint_states_[i];
00610 pr2_mechanism_msgs::JointStatistics *out = &pub_mech_stats_.msg_.joint_statistics[j];
00611 out->timestamp = now;
00612 out->name = state_->joint_states_[i].joint_->name;
00613 out->position = in->position_;
00614 out->velocity = in->velocity_;
00615 out->measured_effort = in->measured_effort_;
00616 out->commanded_effort = in->commanded_effort_;
00617 out->is_calibrated = in->calibrated_;
00618 out->violated_limits = in->joint_statistics_.violated_limits_;
00619 out->odometer = in->joint_statistics_.odometer_;
00620 out->min_position = in->joint_statistics_.min_position_;
00621 out->max_position = in->joint_statistics_.max_position_;
00622 out->max_abs_velocity = in->joint_statistics_.max_abs_velocity_;
00623 out->max_abs_effort = in->joint_statistics_.max_abs_effort_;
00624 in->joint_statistics_.reset();
00625 j++;
00626 }
00627 }
00628
00629
00630 unsigned int i = 0;
00631 for (ActuatorMap::const_iterator it = model_.hw_->actuators_.begin(); it != model_.hw_->actuators_.end(); ++i, ++it)
00632 {
00633 pr2_mechanism_msgs::ActuatorStatistics *out = &pub_mech_stats_.msg_.actuator_statistics[i];
00634 ActuatorState *in = &(it->second->state_);
00635 out->timestamp = now;
00636 out->name = it->first;
00637 out->encoder_count = in->encoder_count_;
00638 out->encoder_offset = in->zero_offset_;
00639 out->position = in->position_;
00640 out->timestamp = ros::Time(in->timestamp_);
00641 out->device_id = in->device_id_;
00642 out->encoder_velocity = in->encoder_velocity_;
00643 out->velocity = in->velocity_;
00644 out->calibration_reading = in->calibration_reading_;
00645 out->calibration_rising_edge_valid = in->calibration_rising_edge_valid_;
00646 out->calibration_falling_edge_valid = in->calibration_falling_edge_valid_;
00647 out->last_calibration_rising_edge = in->last_calibration_rising_edge_;
00648 out->last_calibration_falling_edge = in->last_calibration_falling_edge_;
00649 out->is_enabled = in->is_enabled_;
00650 out->halted = in->halted_;
00651 out->last_commanded_current = in->last_commanded_current_;
00652 out->last_executed_current = in->last_executed_current_;
00653 out->last_measured_current = in->last_measured_current_;
00654 out->last_commanded_effort = in->last_commanded_effort_;
00655 out->last_executed_effort = in->last_executed_effort_;
00656 out->last_measured_effort = in->last_measured_effort_;
00657 out->motor_voltage = in->motor_voltage_;
00658 out->num_encoder_errors = in->num_encoder_errors_;
00659 }
00660
00661
00662 std::vector<ControllerSpec> &controllers = controllers_lists_[used_by_realtime_];
00663 for (unsigned int i = 0; i < controllers.size(); ++i)
00664 {
00665 pr2_mechanism_msgs::ControllerStatistics *out = &pub_mech_stats_.msg_.controller_statistics[i];
00666 out->timestamp = now;
00667 out->running = controllers[i].c->isRunning();
00668 out->max_time = ros::Duration(max(controllers[i].stats->acc));
00669 out->mean_time = ros::Duration(mean(controllers[i].stats->acc));
00670 out->variance_time = ros::Duration(sqrt(variance(controllers[i].stats->acc)));
00671 out->num_control_loop_overruns = controllers[i].stats->num_control_loop_overruns;
00672 out->time_last_control_loop_overrun = controllers[i].stats->time_last_control_loop_overrun;
00673 }
00674
00675 pub_mech_stats_.msg_.header.stamp = ros::Time::now();
00676
00677 pub_mech_stats_.unlockAndPublish();
00678 }
00679 }
00680 }
00681
00682
00683
00684 bool ControllerManager::reloadControllerLibrariesSrv(
00685 pr2_mechanism_msgs::ReloadControllerLibraries::Request &req,
00686 pr2_mechanism_msgs::ReloadControllerLibraries::Response &resp)
00687 {
00688
00689 ROS_DEBUG("reload libraries service called");
00690 boost::mutex::scoped_lock guard(services_lock_);
00691 ROS_DEBUG("reload libraries service locked");
00692
00693
00694 std::vector<std::string> controllers;
00695 getControllerNames(controllers);
00696 if (!controllers.empty() && !req.force_kill){
00697 ROS_ERROR("Controller manager: Cannot reload controller libraries because there are still %i controllers running", (int)controllers.size());
00698 resp.ok = false;
00699 return true;
00700 }
00701
00702
00703 if (!controllers.empty()){
00704 ROS_INFO("Controller manager: Killing all running controllers");
00705 std::vector<std::string> empty;
00706 if (!switchController(empty,controllers, pr2_mechanism_msgs::SwitchController::Request::BEST_EFFORT)){
00707 ROS_ERROR("Controller manager: Cannot reload controller libraries because failed to stop running controllers");
00708 resp.ok = false;
00709 return true;
00710 }
00711 for (unsigned int i=0; i<controllers.size(); i++){
00712 if (!unloadController(controllers[i])){
00713 ROS_ERROR("Controller manager: Cannot reload controller libraries because failed to unload controller %s",
00714 controllers[i].c_str());
00715 resp.ok = false;
00716 return true;
00717 }
00718 }
00719 getControllerNames(controllers);
00720 }
00721 assert(controllers.empty());
00722
00723
00724 controller_loader_.reset(new pluginlib::ClassLoader<pr2_controller_interface::Controller>("pr2_controller_interface",
00725 "pr2_controller_interface::Controller"));
00726 ROS_INFO("Controller manager: reloaded controller libraries");
00727 resp.ok = true;
00728
00729 ROS_DEBUG("reload libraries service finished");
00730 return true;
00731 }
00732
00733
00734 bool ControllerManager::listControllerTypesSrv(
00735 pr2_mechanism_msgs::ListControllerTypes::Request &req,
00736 pr2_mechanism_msgs::ListControllerTypes::Response &resp)
00737 {
00738
00739 (void) req;
00740
00741
00742 ROS_DEBUG("list types service called");
00743 boost::mutex::scoped_lock guard(services_lock_);
00744 ROS_DEBUG("list types service locked");
00745
00746 resp.types = controller_loader_->getDeclaredClasses();
00747
00748 ROS_DEBUG("list types service finished");
00749 return true;
00750 }
00751
00752
00753 bool ControllerManager::listControllersSrv(
00754 pr2_mechanism_msgs::ListControllers::Request &req,
00755 pr2_mechanism_msgs::ListControllers::Response &resp)
00756 {
00757
00758 (void) req;
00759
00760
00761 ROS_DEBUG("list controller service called");
00762 boost::mutex::scoped_lock guard(services_lock_);
00763 ROS_DEBUG("list controller service locked");
00764
00765 std::vector<std::string> controllers;
00766 std::vector<size_t> schedule;
00767
00768 getControllerNames(controllers);
00769 getControllerSchedule(schedule);
00770 assert(controllers.size() == schedule.size());
00771 resp.controllers.resize(controllers.size());
00772 resp.state.resize(controllers.size());
00773
00774 for (size_t i=0; i<schedule.size(); i++){
00775
00776 Controller* c = getControllerByName(controllers[schedule[i]]);
00777 assert(c);
00778 resp.controllers[i] = controllers[schedule[i]];
00779 if (c->isRunning())
00780 resp.state[i] = "running";
00781 else
00782 resp.state[i] = "stopped";
00783 }
00784
00785 ROS_DEBUG("list controller service finished");
00786 return true;
00787 }
00788
00789
00790 bool ControllerManager::loadControllerSrv(
00791 pr2_mechanism_msgs::LoadController::Request &req,
00792 pr2_mechanism_msgs::LoadController::Response &resp)
00793 {
00794
00795 ROS_DEBUG("loading service called for controller %s ",req.name.c_str());
00796 boost::mutex::scoped_lock guard(services_lock_);
00797 ROS_DEBUG("loading service locked");
00798
00799 resp.ok = loadController(req.name);
00800
00801 ROS_DEBUG("loading service finished for controller %s ",req.name.c_str());
00802 return true;
00803 }
00804
00805
00806 bool ControllerManager::unloadControllerSrv(
00807 pr2_mechanism_msgs::UnloadController::Request &req,
00808 pr2_mechanism_msgs::UnloadController::Response &resp)
00809 {
00810
00811 ROS_DEBUG("unloading service called for controller %s ",req.name.c_str());
00812 boost::mutex::scoped_lock guard(services_lock_);
00813 ROS_DEBUG("unloading service locked");
00814
00815 resp.ok = unloadController(req.name);
00816
00817 ROS_DEBUG("unloading service finished for controller %s ",req.name.c_str());
00818 return true;
00819 }
00820
00821
00822 bool ControllerManager::switchControllerSrv(
00823 pr2_mechanism_msgs::SwitchController::Request &req,
00824 pr2_mechanism_msgs::SwitchController::Response &resp)
00825 {
00826
00827 ROS_DEBUG("switching service called");
00828 boost::mutex::scoped_lock guard(services_lock_);
00829 ROS_DEBUG("switching service locked");
00830
00831 resp.ok = switchController(req.start_controllers, req.stop_controllers, req.strictness);
00832
00833 ROS_DEBUG("switching service finished");
00834 return true;
00835 }
00836