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 #include <string>
00034 #include <boost/bind.hpp>
00035
00036 #include <pr2_mechanism_msgs/SwitchController.h>
00037 #include <geometry_msgs/Twist.h>
00038 #include <trajectory_msgs/JointTrajectory.h>
00039 #include <kinematics_msgs/GetKinematicSolverInfo.h>
00040 #include <kinematics_msgs/GetPositionFK.h>
00041 #include <kinematics_msgs/GetPositionIK.h>
00042 #include <polled_camera/GetPolledImage.h>
00043
00044 #include "pr2_teleop_general/pr2_teleop_general_commander.h"
00045
00046 #include "urdf_interface/pose.h"
00047
00048 static const std::string LEFT_HAND_LINK_TO_TRACK = "l_gripper_palm_link";
00049 static const std::string RIGHT_HAND_LINK_TO_TRACK = "r_gripper_palm_link";
00050
00051 static const double MAX_HEAD_TRACK_SPEED = 2.0;
00052
00053 static const double GRIPPER_CLOSE_POSITION = 0.000;
00054 static const double GRIPPER_CLOSE_MAX_EFFORT = 10000.0;
00055
00056 static const double GRIPPER_OPEN_POSITION = 0.086;
00057 static const double GRIPPER_OPEN_MAX_EFFORT = 10000.0;
00058
00059 static const std::string RIGHT_ARM_MANNEQUIN_CONTROLLER = "r_arm_controller_loose";
00060 static const std::string LEFT_ARM_MANNEQUIN_CONTROLLER = "l_arm_controller_loose";
00061
00062 static const std::string HEAD_MANNEQUIN_CONTROLLER = "head_traj_controller_loose";
00063 static const std::string HEAD_POSITION_CONTROLLER = "head_traj_controller";
00064
00065 static const unsigned int WALK_BUFFER = 10;
00066
00067 GeneralCommander::GeneralCommander(bool control_body,
00068 bool control_head,
00069 bool control_rarm,
00070 bool control_larm,
00071 bool control_prosilica,
00072 std::string arm_controller_name)
00073 : n_(),
00074 control_body_(control_body),
00075 control_head_(control_head),
00076 control_rarm_(control_rarm),
00077 control_larm_(control_larm),
00078 control_prosilica_(control_prosilica)
00079 {
00080
00081 r_arm_controller_name_ = "r_"+arm_controller_name;
00082 l_arm_controller_name_ = "l_"+arm_controller_name;
00083
00084 head_control_mode_ = HEAD_JOYSTICK;
00085
00086 std::string urdf_xml,full_urdf_xml;
00087 n_.param("urdf_xml", urdf_xml, std::string("robot_description"));
00088 if(!n_.getParam(urdf_xml,full_urdf_xml))
00089 {
00090 ROS_ERROR("Could not load the xml from parameter server: %s\n", urdf_xml.c_str());
00091 robot_model_initialized_ = false;
00092 }
00093 else
00094 {
00095 robot_model_.initString(full_urdf_xml);
00096 robot_model_initialized_ = true;
00097 }
00098
00099
00100 switch_controllers_service_ = n_.serviceClient<pr2_mechanism_msgs::SwitchController>("pr2_controller_manager/switch_controller");
00101 joint_state_sub_ = n_.subscribe("joint_states", 1, &GeneralCommander::jointStateCallback, this);
00102 power_board_sub_ = n_.subscribe<pr2_msgs::PowerBoardState>("power_board/state", 1, &GeneralCommander::powerBoardCallback, this);
00103
00104 if(control_head_) {
00105 tilt_laser_service_ = n_.serviceClient<pr2_msgs::SetPeriodicCmd>("laser_tilt_controller/set_periodic_cmd");
00106 head_pub_ = n_.advertise<trajectory_msgs::JointTrajectory>("head_traj_controller/command", 1);
00107 head_track_hand_client_ = new actionlib::SimpleActionClient<pr2_controllers_msgs::PointHeadAction>("/head_traj_controller/point_head_action", true);
00108 while(!head_track_hand_client_->waitForServer(ros::Duration(5.0))){
00109 ROS_INFO("Waiting for the point_head_action server to come up");
00110 }
00111
00112 head_track_hand_client_->cancelAllGoals();
00113 } else {
00114 head_track_hand_client_ = NULL;
00115 }
00116 if(control_body_) {
00117 torso_pub_ = n_.advertise<trajectory_msgs::JointTrajectory>("torso_controller/command", 1);
00118 base_pub_ = n_.advertise<geometry_msgs::Twist>("base_controller/command", 1);
00119 }
00120 if(control_rarm_) {
00121 right_gripper_client_ = new actionlib::SimpleActionClient<pr2_controllers_msgs::Pr2GripperCommandAction>("r_gripper_controller/gripper_action", true);
00122 right_arm_trajectory_client_ = new actionlib::SimpleActionClient<pr2_controllers_msgs::JointTrajectoryAction>(r_arm_controller_name_+"/joint_trajectory_action", true);
00123 right_arm_traj_pub_ = n_.advertise<trajectory_msgs::JointTrajectory>(r_arm_controller_name_+"/command", 1);
00124 while(!right_gripper_client_->waitForServer(ros::Duration(5.0))){
00125 ROS_INFO("Waiting for the right gripper action server to come up");
00126 }
00127 while(!right_arm_trajectory_client_->waitForServer(ros::Duration(5.0))){
00128 ROS_INFO_STREAM("Waiting for the right arm trajectory action server to come up" << r_arm_controller_name_+"/joint_trajectory_action");
00129 }
00130 } else {
00131 right_gripper_client_ = NULL;
00132 right_arm_trajectory_client_ = NULL;
00133 }
00134 if(control_larm_) {
00135 left_gripper_client_ = new actionlib::SimpleActionClient<pr2_controllers_msgs::Pr2GripperCommandAction>("l_gripper_controller/gripper_action", true);
00136 left_arm_trajectory_client_ = new actionlib::SimpleActionClient<pr2_controllers_msgs::JointTrajectoryAction>(l_arm_controller_name_+"/joint_trajectory_action", true);
00137 left_arm_traj_pub_ = n_.advertise<trajectory_msgs::JointTrajectory>(l_arm_controller_name_+"/command", 1);
00138 while(!left_gripper_client_->waitForServer(ros::Duration(5.0))){
00139 ROS_INFO("Waiting for the right gripper action server to come up");
00140 }
00141 while(!left_arm_trajectory_client_->waitForServer(ros::Duration(5.0))){
00142 ROS_INFO_STREAM("Waiting for the left arm trajectory action server to come up");
00143 }
00144 } else {
00145 left_gripper_client_ = NULL;
00146 left_arm_trajectory_client_ = NULL;
00147 }
00148 if(control_larm_ || control_rarm_) {
00149 tuck_arms_client_ = new actionlib::SimpleActionClient<pr2_common_action_msgs::TuckArmsAction>("tuck_arms", true);
00150 } else {
00151 tuck_arms_client_ = NULL;
00152 }
00153
00154 if(control_rarm_) {
00155 ROS_INFO("Waiting for right arm kinematics servers");
00156 ros::service::waitForService("pr2_right_arm_kinematics/get_fk_solver_info");
00157 ros::service::waitForService("pr2_right_arm_kinematics/get_fk");
00158 ros::service::waitForService("pr2_right_arm_kinematics/get_ik");
00159 right_arm_kinematics_solver_client_ = n_.serviceClient<kinematics_msgs::GetKinematicSolverInfo>("pr2_right_arm_kinematics/get_fk_solver_info", true);
00160 right_arm_kinematics_forward_client_ = n_.serviceClient<kinematics_msgs::GetPositionFK>("pr2_right_arm_kinematics/get_fk", true);
00161 right_arm_kinematics_inverse_client_ = n_.serviceClient<kinematics_msgs::GetPositionIK>("pr2_right_arm_kinematics/get_ik", true);
00162 }
00163
00164 if(control_larm_) {
00165 ROS_INFO("Waiting for left arm kinematics servers");
00166 ros::service::waitForService("pr2_left_arm_kinematics/get_fk");
00167 ros::service::waitForService("pr2_left_arm_kinematics/get_fk_solver_info");
00168 ros::service::waitForService("pr2_left_arm_kinematics/get_ik");
00169 left_arm_kinematics_solver_client_ = n_.serviceClient<kinematics_msgs::GetKinematicSolverInfo>("pr2_left_arm_kinematics/get_fk_solver_info", true);
00170 left_arm_kinematics_forward_client_ = n_.serviceClient<kinematics_msgs::GetPositionFK>("pr2_left_arm_kinematics/get_fk", true);
00171 left_arm_kinematics_inverse_client_ = n_.serviceClient<kinematics_msgs::GetPositionIK>("pr2_left_arm_kinematics/get_ik", true);
00172 }
00173
00174
00175 if(control_prosilica_) {
00176 ros::service::waitForService("prosilica/request_image");
00177 prosilica_polling_client_ = n_.serviceClient<polled_camera::GetPolledImage>("prosilica/request_image", true);
00178 }
00179
00180 right_walk_along_pose_.push_back(.049);
00181 right_walk_along_pose_.push_back(-.116);
00182 right_walk_along_pose_.push_back(.036);
00183 right_walk_along_pose_.push_back(-1.272);
00184 right_walk_along_pose_.push_back(-.084);
00185 right_walk_along_pose_.push_back(-.148);
00186 right_walk_along_pose_.push_back(-0.027);
00187
00188 left_walk_along_pose_.push_back(0.0);
00189 left_walk_along_pose_.push_back(-.149);
00190 left_walk_along_pose_.push_back(.085);
00191 left_walk_along_pose_.push_back(-1.234);
00192 left_walk_along_pose_.push_back(0.030);
00193 left_walk_along_pose_.push_back(-.141);
00194 left_walk_along_pose_.push_back(3.114);
00195
00196 head_nod_traj_.joint_names.push_back("head_pan_joint");
00197 head_nod_traj_.joint_names.push_back("head_tilt_joint");
00198 head_nod_traj_.points.resize(3);
00199 head_nod_traj_.points[0].positions.push_back(0.0);
00200 head_nod_traj_.points[0].positions.push_back(-0.2);
00201 head_nod_traj_.points[0].velocities.push_back(0.0);
00202 head_nod_traj_.points[0].velocities.push_back(0.0);
00203 head_nod_traj_.points[0].time_from_start = ros::Duration(0.5);
00204
00205 head_nod_traj_.points[1].positions.push_back(0.0);
00206 head_nod_traj_.points[1].positions.push_back(0.2);
00207 head_nod_traj_.points[1].velocities.push_back(0.0);
00208 head_nod_traj_.points[1].velocities.push_back(0.0);
00209 head_nod_traj_.points[1].time_from_start = ros::Duration(1.0);
00210
00211 head_nod_traj_.points[2].positions.push_back(0.0);
00212 head_nod_traj_.points[2].positions.push_back(0.0);
00213 head_nod_traj_.points[2].velocities.push_back(0.0);
00214 head_nod_traj_.points[2].velocities.push_back(0.0);
00215 head_nod_traj_.points[2].time_from_start = ros::Duration(1.5);
00216
00217 head_shake_traj_.joint_names.push_back("head_pan_joint");
00218 head_shake_traj_.joint_names.push_back("head_tilt_joint");
00219 head_shake_traj_.points.resize(3);
00220 head_shake_traj_.points[0].positions.push_back(.62);
00221 head_shake_traj_.points[0].positions.push_back(0.0);
00222 head_shake_traj_.points[0].velocities.push_back(0.0);
00223 head_shake_traj_.points[0].velocities.push_back(0.0);
00224 head_shake_traj_.points[0].time_from_start = ros::Duration(0.5);
00225
00226 head_shake_traj_.points[1].positions.push_back(-.62);
00227 head_shake_traj_.points[1].positions.push_back(0.0);
00228 head_shake_traj_.points[1].velocities.push_back(0.0);
00229 head_shake_traj_.points[1].velocities.push_back(0.0);
00230 head_shake_traj_.points[1].time_from_start = ros::Duration(1.0);
00231
00232 head_shake_traj_.points[2].positions.push_back(0.0);
00233 head_shake_traj_.points[2].positions.push_back(0.0);
00234 head_shake_traj_.points[2].velocities.push_back(0.0);
00235 head_shake_traj_.points[2].velocities.push_back(0.0);
00236 head_shake_traj_.points[2].time_from_start = ros::Duration(1.5);
00237
00238
00239 right_arm_control_mode_ = ARM_MANNEQUIN_MODE;
00240 left_arm_control_mode_ = ARM_MANNEQUIN_MODE;
00241 setArmMode(ARMS_BOTH, ARM_POSITION_CONTROL);
00242 head_control_mode_ = HEAD_MANNEQUIN;
00243 if(control_head_) {
00244 setHeadMode(HEAD_JOYSTICK);
00245 laser_control_mode_ = LASER_TILT_OFF;
00246 }
00247
00248
00249 laser_slow_period_ = 10;
00250 laser_slow_amplitude_ = .75;
00251 laser_slow_offset_ = .25;
00252
00253
00254 laser_fast_period_ = 2;
00255 laser_fast_amplitude_ = .78;
00256 laser_fast_offset_ = .3;
00257
00258 last_right_wrist_goal_stamp_ = ros::Time::now();
00259 last_left_wrist_goal_stamp_ = ros::Time::now();
00260
00261 last_torso_vel_ = 0.0;
00262 walk_along_ok_ = false;
00263 }
00264
00265 GeneralCommander::~GeneralCommander() {
00266 if(head_track_hand_client_) {
00267 head_track_hand_client_->cancelAllGoals();
00268 delete head_track_hand_client_;
00269 }
00270 if(right_gripper_client_) {
00271 delete right_gripper_client_;
00272 }
00273 if(left_gripper_client_) {
00274 delete left_gripper_client_;
00275 }
00276 if(right_arm_trajectory_client_) {
00277 delete right_arm_trajectory_client_;
00278 }
00279 if(left_arm_trajectory_client_) {
00280 delete left_arm_trajectory_client_;
00281 }
00282 if(tuck_arms_client_) {
00283 delete tuck_arms_client_;
00284 }
00285 }
00286
00287 void GeneralCommander::jointStateCallback(const sensor_msgs::JointStateConstPtr &jointState)
00288 {
00289 for(unsigned int i = 0; i < jointState->name.size(); i++) {
00290 joint_state_position_map_[jointState->name[i]] = jointState->position[i];
00291 joint_state_velocity_map_[jointState->name[i]] = jointState->velocity[i];
00292
00293
00294
00295 }
00296 }
00297
00298 bool GeneralCommander::getJointPosition(const std::string& name, double& pos) const {
00299 if(joint_state_position_map_.find(name) == joint_state_position_map_.end()) {
00300 return false;
00301 }
00302 pos = joint_state_position_map_.find(name)->second;
00303 return true;
00304 }
00305
00306 bool GeneralCommander::getJointVelocity(const std::string& name, double& vel) const {
00307 if(joint_state_velocity_map_.find(name) == joint_state_velocity_map_.end()) {
00308 return false;
00309 }
00310 vel = joint_state_velocity_map_.find(name)->second;
00311 return true;
00312 }
00313
00314 GeneralCommander::LaserControlMode GeneralCommander::getLaserMode() {
00315 return laser_control_mode_;
00316 }
00317
00318 GeneralCommander::HeadControlMode GeneralCommander::getHeadMode() {
00319 return head_control_mode_;
00320 }
00321
00322 GeneralCommander::ArmControlMode GeneralCommander::getArmMode(WhichArm arm) {
00323 if(arm == ARMS_RIGHT || arm == ARMS_BOTH) {
00324 return right_arm_control_mode_;
00325 } else {
00326 return left_arm_control_mode_;
00327 }
00328 }
00329
00330 void GeneralCommander::sendProjectorStartStop(bool start) {
00331
00332 if(!control_head_) return;
00333
00334 if(start) {
00335 int ok = system("rosrun dynamic_reconfigure dynparam set camera_synchronizer_node narrow_stereo_trig_mode 3");
00336 ROS_DEBUG("Trying to send projector on");
00337 if(ok < 0) {
00338 ROS_WARN("Dynamic reconfigure for setting trigger mode ON failed");
00339 }
00340 } else {
00341 int ok = system("rosrun dynamic_reconfigure dynparam set camera_synchronizer_node narrow_stereo_trig_mode 4");
00342 ROS_DEBUG("Trying to send trigger off");
00343 if(ok < 0) {
00344 ROS_WARN("Dynamic reconfigure for setting trigger mode OFF failed");
00345 }
00346 }
00347 }
00348
00349 void GeneralCommander::setLaserMode(LaserControlMode mode) {
00350 if(!control_head_) return;
00351
00352 if(laser_control_mode_ == mode) return;
00353
00354 pr2_msgs::SetPeriodicCmd::Request req;
00355 pr2_msgs::SetPeriodicCmd::Response res;
00356
00357 req.command.profile = "linear";
00358 if(mode == LASER_TILT_SLOW) {
00359 ROS_DEBUG("Sending slow");
00360 req.command.period = laser_slow_period_;
00361 req.command.amplitude = laser_slow_period_;
00362 req.command.offset = laser_slow_offset_;
00363 } else if(mode == LASER_TILT_FAST) {
00364 ROS_DEBUG("Sending fast");
00365 req.command.period = laser_fast_period_;
00366 req.command.amplitude = laser_fast_period_;
00367 req.command.offset = laser_fast_offset_;
00368 } else {
00369 ROS_DEBUG("Sending off");
00370 req.command.period = 1.0;
00371 req.command.amplitude = 0;
00372 req.command.offset = laser_slow_offset_;
00373 }
00374
00375 if(tilt_laser_service_.call(req,res)) {
00376
00377 } else {
00378 ROS_ERROR("Tilt laser service call failed.\n");
00379 }
00380 laser_control_mode_ = mode;
00381 }
00382
00383 void GeneralCommander::setHeadMode(HeadControlMode mode) {
00384 if(!control_head_) return;
00385 if(mode == head_control_mode_) return;
00386 if(mode == HEAD_TRACK_LEFT_HAND) {
00387 ROS_DEBUG("Setting head to track left hand");
00388 } else if(mode == HEAD_TRACK_RIGHT_HAND) {
00389 ROS_DEBUG("Setting head to track right hand");
00390 }
00391 std::vector<std::string> start_controllers;
00392 std::vector<std::string> stop_controllers;
00393 if(mode == HEAD_MANNEQUIN) {
00394 start_controllers.push_back(HEAD_MANNEQUIN_CONTROLLER);
00395 stop_controllers.push_back(HEAD_POSITION_CONTROLLER);
00396 } else if(head_control_mode_ == HEAD_MANNEQUIN) {
00397 start_controllers.push_back(HEAD_POSITION_CONTROLLER);
00398 stop_controllers.push_back(HEAD_MANNEQUIN_CONTROLLER);
00399 }
00400 if(!start_controllers.empty() || !stop_controllers.empty()) {
00401 switchControllers(start_controllers, stop_controllers);
00402 }
00403 head_control_mode_ = mode;
00404 }
00405
00406 void GeneralCommander::setArmMode(WhichArm arm, ArmControlMode mode) {
00407 if(!control_rarm_ && !control_larm_) return;
00408 if(!control_rarm_ && arm == ARMS_RIGHT) return;
00409 if(!control_larm_ && arm == ARMS_LEFT) return;
00410
00411 if(arm == ARMS_LEFT) {
00412 if(mode == left_arm_control_mode_) return;
00413 } else if(arm == ARMS_RIGHT) {
00414 if(mode == right_arm_control_mode_) return;
00415 } else {
00416 if(mode == left_arm_control_mode_ && mode == right_arm_control_mode_) return;
00417 }
00418
00419 std::string left_running_controller;
00420 std::string right_running_controller;
00421
00422 if(left_arm_control_mode_ == ARM_MANNEQUIN_MODE) {
00423 left_running_controller = LEFT_ARM_MANNEQUIN_CONTROLLER;
00424 } else if(left_arm_control_mode_ == ARM_POSITION_CONTROL) {
00425 left_running_controller = l_arm_controller_name_;
00426 }
00427
00428 if(right_arm_control_mode_ == ARM_MANNEQUIN_MODE) {
00429 right_running_controller = RIGHT_ARM_MANNEQUIN_CONTROLLER;
00430 } else if(right_arm_control_mode_ == ARM_POSITION_CONTROL) {
00431 right_running_controller = r_arm_controller_name_;
00432 }
00433
00434 std::vector<std::string> start_controllers;
00435 std::vector<std::string> stop_controllers;
00436
00437 if(mode == ARM_NO_CONTROLLER) {
00438 if(arm == ARMS_LEFT || arm == ARMS_BOTH) {
00439 stop_controllers.push_back(left_running_controller);
00440 }
00441 if(arm == ARMS_RIGHT || arm == ARMS_BOTH) {
00442 stop_controllers.push_back(right_running_controller);
00443 }
00444 } else if(mode == ARM_MANNEQUIN_MODE) {
00445 if(arm == ARMS_LEFT || arm == ARMS_BOTH) {
00446 if(!left_running_controller.empty()) {
00447 stop_controllers.push_back(left_running_controller);
00448 }
00449 start_controllers.push_back(LEFT_ARM_MANNEQUIN_CONTROLLER);
00450 }
00451 if(arm == ARMS_RIGHT || arm == ARMS_BOTH) {
00452 if(!right_running_controller.empty()) {
00453 stop_controllers.push_back(right_running_controller);
00454 }
00455 start_controllers.push_back(RIGHT_ARM_MANNEQUIN_CONTROLLER);
00456 }
00457 } else if(mode == ARM_POSITION_CONTROL) {
00458 if(arm == ARMS_LEFT || arm == ARMS_BOTH) {
00459 if(!left_running_controller.empty()) {
00460 stop_controllers.push_back(left_running_controller);
00461 }
00462 start_controllers.push_back(l_arm_controller_name_);
00463 }
00464 if(arm == ARMS_RIGHT || arm == ARMS_BOTH) {
00465 if(!right_running_controller.empty()) {
00466 stop_controllers.push_back(right_running_controller);
00467 }
00468 start_controllers.push_back(r_arm_controller_name_);
00469 }
00470 }
00471 switchControllers(start_controllers, stop_controllers);
00472 if(arm == ARMS_LEFT || arm == ARMS_BOTH) {
00473 left_arm_control_mode_ = mode;
00474 }
00475 if(arm == ARMS_RIGHT || arm == ARMS_BOTH) {
00476 right_arm_control_mode_ = mode;
00477 }
00478 }
00479
00480 void GeneralCommander::sendHeadCommand(double req_pan, double req_tilt) {
00481 if(!control_head_) return;
00482 if(head_control_mode_ != HEAD_JOYSTICK) {
00483 return;
00484 }
00485
00486 trajectory_msgs::JointTrajectory traj;
00487 traj.header.stamp = ros::Time::now() + ros::Duration(0.01);
00488 traj.joint_names.push_back("head_pan_joint");
00489 traj.joint_names.push_back("head_tilt_joint");
00490 traj.points.resize(1);
00491 traj.points[0].positions.push_back(req_pan);
00492 traj.points[0].velocities.push_back(0.0);
00493 traj.points[0].positions.push_back(req_tilt);
00494 traj.points[0].velocities.push_back(0.0);
00495 traj.points[0].time_from_start = ros::Duration(0.1);
00496
00497 head_pub_.publish(traj);
00498 }
00499
00500 void GeneralCommander::sendHeadTrackCommand() {
00501 if(!control_head_) return;
00502 if(head_control_mode_ != HEAD_TRACK_LEFT_HAND &&
00503 head_control_mode_ != HEAD_TRACK_RIGHT_HAND) {
00504 return;
00505 }
00506
00507
00508 pr2_controllers_msgs::PointHeadGoal goal;
00509
00510
00511 geometry_msgs::PointStamped point;
00512 if(head_control_mode_ == HEAD_TRACK_LEFT_HAND) {
00513 point.header.frame_id = LEFT_HAND_LINK_TO_TRACK;
00514 } else {
00515 point.header.frame_id = RIGHT_HAND_LINK_TO_TRACK;
00516 }
00517 point.point.x = 0.0;
00518 point.point.y = 0.0;
00519 point.point.z = 0.0;
00520 goal.target = point;
00521
00522
00523
00524 goal.pointing_frame = "high_def_frame";
00525
00526
00527 goal.min_duration = ros::Duration(0.1);
00528
00529
00530 goal.max_velocity = MAX_HEAD_TRACK_SPEED;
00531
00532
00533 head_track_hand_client_->sendGoal(goal);
00534
00535
00536
00537 }
00538
00539 void GeneralCommander::sendGripperCommand(WhichArm which, bool close) {
00540 if(!control_rarm_ && !control_larm_) return;
00541 if(!control_rarm_ && which == ARMS_RIGHT) return;
00542 if(!control_larm_ && which == ARMS_LEFT) return;
00543 if(which == ARMS_RIGHT || which == ARMS_BOTH) {
00544 pr2_controllers_msgs::Pr2GripperCommandGoal com;
00545 if(close) {
00546 com.command.position = GRIPPER_CLOSE_POSITION;
00547 com.command.max_effort = GRIPPER_CLOSE_MAX_EFFORT;
00548 } else {
00549 com.command.position = GRIPPER_OPEN_POSITION;
00550 com.command.max_effort = GRIPPER_OPEN_MAX_EFFORT;
00551 }
00552 right_gripper_client_->sendGoal(com);
00553 right_gripper_client_->waitForResult(ros::Duration(5.0));
00554 if(right_gripper_client_->getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
00555 ROS_DEBUG("Right gripper command succeeded");
00556 else
00557 ROS_WARN("Right gripper command failed");
00558 }
00559 if(which == ARMS_LEFT || which == ARMS_BOTH) {
00560 pr2_controllers_msgs::Pr2GripperCommandGoal com;
00561 if(close) {
00562 com.command.position = GRIPPER_CLOSE_POSITION;
00563 com.command.max_effort = GRIPPER_CLOSE_MAX_EFFORT;
00564 } else {
00565 com.command.position = GRIPPER_OPEN_POSITION;
00566 com.command.max_effort = GRIPPER_OPEN_MAX_EFFORT;
00567 }
00568 left_gripper_client_->sendGoal(com);
00569 left_gripper_client_->waitForResult(ros::Duration(5.0));
00570 if(left_gripper_client_->getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
00571 ROS_DEBUG("Left gripper command succeeded");
00572 else
00573 ROS_WARN("Left gripper command failed");
00574 }
00575
00576 }
00577
00578 void GeneralCommander::sendTorsoCommand(double pos, double vel) {
00579 if(!control_body_) return;
00580
00581 if(fabs(vel) < .0001 && fabs(last_torso_vel_ < .0001)) {
00582
00583 }
00584 last_torso_vel_ = vel;
00585
00586 trajectory_msgs::JointTrajectory traj;
00587 traj.header.stamp = ros::Time::now() + ros::Duration(0.01);
00588 traj.joint_names.push_back("torso_lift_joint");
00589 traj.points.resize(1);
00590 traj.points[0].positions.push_back(pos);
00591 traj.points[0].velocities.push_back(vel);
00592 traj.points[0].time_from_start = ros::Duration(0.25);
00593 torso_pub_.publish(traj);
00594 }
00595
00596 void GeneralCommander::sendBaseCommand(double vx, double vy, double vw) {
00597 if(!control_body_) return;
00598 geometry_msgs::Twist cmd;
00599
00600 cmd.linear.x = vx;
00601 cmd.linear.y = vy;
00602 cmd.angular.z = vw;
00603 base_pub_.publish(cmd);
00604 }
00605
00606 void GeneralCommander::switchControllers(const std::vector<std::string>& start_controllers, const std::vector<std::string>& stop_controllers) {
00607 pr2_mechanism_msgs::SwitchController::Request req;
00608 pr2_mechanism_msgs::SwitchController::Response res;
00609 req.start_controllers = start_controllers;
00610 req.stop_controllers = stop_controllers;
00611 for(std::vector<std::string>::const_iterator it = start_controllers.begin();
00612 it != start_controllers.end();
00613 it++) {
00614 ROS_DEBUG_STREAM("Trying to start controller " << (*it));
00615 }
00616 for(std::vector<std::string>::const_iterator it = stop_controllers.begin();
00617 it != stop_controllers.end();
00618 it++) {
00619 ROS_DEBUG_STREAM("Trying to stop controller " << (*it));
00620 }
00621 req.strictness = pr2_mechanism_msgs::SwitchController::Request::BEST_EFFORT;
00622 if(!switch_controllers_service_.call(req,res)) {
00623 ROS_WARN("Call to switch controllers failed entirely");
00624 }
00625 if(res.ok != true) {
00626 ROS_WARN("Call to switch controllers reports not ok");
00627 }
00628 }
00629
00630 void GeneralCommander::sendWristVelCommands(double right_wrist_vel, double left_wrist_vel, double hz) {
00631
00632 clampDesiredArmPositionsToActual(.05);
00633
00634 if(control_rarm_) {
00635 if(abs(right_wrist_vel) > .01) {
00636 if((ros::Time::now()-last_right_wrist_goal_stamp_).toSec() > .5) {
00637 clampDesiredArmPositionsToActual(0.0);
00638 }
00639 last_right_wrist_goal_stamp_ = ros::Time::now();
00640
00641
00642 pr2_controllers_msgs::JointTrajectoryGoal right_goal;
00643 composeWristRotGoal("r", right_goal, right_des_joint_states_ ,right_wrist_vel, hz);
00644 right_arm_traj_pub_.publish(right_goal.trajectory);
00645
00646 }
00647 }
00648 if(control_larm_) {
00649 if(abs(left_wrist_vel) > .01) {
00650 if((ros::Time::now()-last_left_wrist_goal_stamp_).toSec() > .5) {
00651 clampDesiredArmPositionsToActual(0.0);
00652 }
00653 last_left_wrist_goal_stamp_ = ros::Time::now();
00654
00655 pr2_controllers_msgs::JointTrajectoryGoal left_goal;
00656 composeWristRotGoal("l", left_goal, left_des_joint_states_, left_wrist_vel, hz);
00657 left_arm_traj_pub_.publish(left_goal.trajectory);
00658
00659 }
00660 }
00661 }
00662
00663 void GeneralCommander::composeWristRotGoal(const std::string pref, pr2_controllers_msgs::JointTrajectoryGoal& goal,
00664 std::vector<double>& des_joints,
00665 double des_vel, double hz) const {
00666
00667 double trajectory_duration = .2;
00668
00669 std::vector<std::string> joint_names;
00670
00671
00672 joint_names.push_back(pref+"_"+"shoulder_pan_joint");
00673 joint_names.push_back(pref+"_"+"shoulder_lift_joint");
00674 joint_names.push_back(pref+"_"+"upper_arm_roll_joint");
00675 joint_names.push_back(pref+"_"+"elbow_flex_joint");
00676 joint_names.push_back(pref+"_"+"forearm_roll_joint");
00677 joint_names.push_back(pref+"_"+"wrist_flex_joint");
00678 joint_names.push_back(pref+"_"+"wrist_roll_joint");
00679
00680 double end_pos_diff = (trajectory_duration)*des_vel;
00681 double cur_pos_diff = (1.0/hz)*des_vel;
00682
00683 goal.trajectory.joint_names=joint_names;
00684 goal.trajectory.points.resize(1);
00685 goal.trajectory.points[0].positions = des_joints;
00686
00687 goal.trajectory.points[0].velocities.resize(7,0.0);
00688
00689
00690 goal.trajectory.points[0].positions[6] += end_pos_diff;
00691 des_joints[6] += cur_pos_diff;
00692
00693
00694 goal.trajectory.header.stamp = ros::Time::now()+ros::Duration(0.030);
00695 goal.trajectory.points[0].time_from_start = ros::Duration(trajectory_duration);
00696 }
00697
00698 void GeneralCommander::updateCurrentWristPositions() {
00699
00700 if(control_rarm_) {
00701 kinematics_msgs::GetKinematicSolverInfo::Request right_request;
00702 kinematics_msgs::GetKinematicSolverInfo::Response right_response;
00703
00704 kinematics_msgs::GetPositionFK::Request right_fk_request;
00705 kinematics_msgs::GetPositionFK::Response right_fk_response;
00706
00707 right_arm_kinematics_solver_client_.call(right_request, right_response);
00708
00709 right_fk_request.header.frame_id = "base_link";
00710 right_fk_request.fk_link_names.push_back("r_wrist_roll_link");
00711 right_fk_request.robot_state.joint_state.position.resize(right_response.kinematic_solver_info.joint_names.size());
00712 right_fk_request.robot_state.joint_state.name = right_response.kinematic_solver_info.joint_names;
00713 for(unsigned int i = 0; i < right_fk_request.robot_state.joint_state.name.size(); i++) {
00714 bool ok = getJointPosition(right_fk_request.robot_state.joint_state.name[i], right_fk_request.robot_state.joint_state.position[i]);
00715 if(!ok) {
00716 ROS_WARN_STREAM("No joint state yet for " << right_fk_request.robot_state.joint_state.name[i]);
00717 return;
00718 }
00719 }
00720 if(right_arm_kinematics_forward_client_.call(right_fk_request, right_fk_response)) {
00721 if(right_fk_response.error_code.val == right_fk_response.error_code.SUCCESS) {
00722 right_wrist_roll_pose_ = right_fk_response.pose_stamped[0].pose;
00723 } else {
00724 ROS_DEBUG("Right fk not a success");
00725 }
00726 } else {
00727 ROS_WARN("Right fk call failed all together");
00728 }
00729 }
00730
00731 if(control_larm_) {
00732 kinematics_msgs::GetKinematicSolverInfo::Request left_request;
00733 kinematics_msgs::GetKinematicSolverInfo::Response left_response;
00734
00735 kinematics_msgs::GetPositionFK::Request left_fk_request;
00736 kinematics_msgs::GetPositionFK::Response left_fk_response;
00737
00738 left_arm_kinematics_solver_client_.call(left_request, left_response);
00739
00740 left_fk_request.header.frame_id = "base_link";
00741 left_fk_request.fk_link_names.push_back("l_wrist_roll_link");
00742 left_fk_request.robot_state.joint_state.position.resize(left_response.kinematic_solver_info.joint_names.size());
00743 left_fk_request.robot_state.joint_state.name = left_response.kinematic_solver_info.joint_names;
00744 for(unsigned int i = 0; i < left_fk_request.robot_state.joint_state.name.size(); i++) {
00745 bool ok = getJointPosition(left_fk_request.robot_state.joint_state.name[i], left_fk_request.robot_state.joint_state.position[i]);
00746 if(!ok) {
00747 ROS_WARN_STREAM("No joint state yet for " << left_fk_request.robot_state.joint_state.name[i]);
00748 return;
00749 }
00750 }
00751 if(left_arm_kinematics_forward_client_.call(left_fk_request, left_fk_response)) {
00752 if(left_fk_response.error_code.val == left_fk_response.error_code.SUCCESS) {
00753 left_wrist_roll_pose_ = left_fk_response.pose_stamped[0].pose;
00754 } else {
00755 ROS_DEBUG("Left fk not a success");
00756 }
00757 } else {
00758 ROS_WARN("Left fk call failed all together");
00759 }
00760
00761
00762 }
00763 }
00764
00765 void GeneralCommander::clampDesiredArmPositionsToActual(double max_dist) {
00766
00767 updateCurrentWristPositions();
00768
00769 double tot_distance;
00770 if(control_rarm_) {
00771 tot_distance = sqrt(pow(des_r_wrist_roll_pose_.position.x-right_wrist_roll_pose_.position.x,2.0)+
00772 pow(des_r_wrist_roll_pose_.position.y-right_wrist_roll_pose_.position.y,2.0)+
00773 pow(des_r_wrist_roll_pose_.position.z-right_wrist_roll_pose_.position.z,2.0));
00774
00775
00776
00777
00778
00779
00780 if(tot_distance > max_dist) {
00781 des_r_wrist_roll_pose_ = right_wrist_roll_pose_;
00782
00783 std::vector<std::string> joint_names;
00784 std::string pref = "r";
00785
00786 joint_names.push_back(pref+"_"+"shoulder_pan_joint");
00787 joint_names.push_back(pref+"_"+"shoulder_lift_joint");
00788 joint_names.push_back(pref+"_"+"upper_arm_roll_joint");
00789 joint_names.push_back(pref+"_"+"elbow_flex_joint");
00790 joint_names.push_back(pref+"_"+"forearm_roll_joint");
00791 joint_names.push_back(pref+"_"+"wrist_flex_joint");
00792 joint_names.push_back(pref+"_"+"wrist_roll_joint");
00793 right_des_joint_states_.clear();
00794 for(unsigned int i = 0; i < joint_names.size(); i++) {
00795 double cur_pos;
00796 getJointPosition(joint_names[i], cur_pos);
00797 right_des_joint_states_.push_back(cur_pos);
00798 }
00799
00800 }
00801 }
00802
00803 if(control_larm_) {
00804 tot_distance = sqrt(pow(des_l_wrist_roll_pose_.position.x-left_wrist_roll_pose_.position.x,2.0)+
00805 pow(des_l_wrist_roll_pose_.position.y-left_wrist_roll_pose_.position.y,2.0)+
00806 pow(des_l_wrist_roll_pose_.position.z-left_wrist_roll_pose_.position.z,2.0));
00807
00808 if(tot_distance > max_dist) {
00809 des_l_wrist_roll_pose_ = left_wrist_roll_pose_;
00810 std::vector<std::string> joint_names;
00811 std::string pref = "l";
00812
00813 joint_names.push_back(pref+"_"+"shoulder_pan_joint");
00814 joint_names.push_back(pref+"_"+"shoulder_lift_joint");
00815 joint_names.push_back(pref+"_"+"upper_arm_roll_joint");
00816 joint_names.push_back(pref+"_"+"elbow_flex_joint");
00817 joint_names.push_back(pref+"_"+"forearm_roll_joint");
00818 joint_names.push_back(pref+"_"+"wrist_flex_joint");
00819 joint_names.push_back(pref+"_"+"wrist_roll_joint");
00820 left_des_joint_states_.clear();
00821 for(unsigned int i = 0; i < joint_names.size(); i++) {
00822 double cur_pos;
00823 getJointPosition(joint_names[i], cur_pos);
00824 left_des_joint_states_.push_back(cur_pos);
00825 }
00826
00827 }
00828 }
00829 }
00830
00831 void GeneralCommander::unnormalizeTrajectory(trajectory_msgs::JointTrajectory& traj) const {
00832
00833 std::vector<double> current_values;
00834 std::vector<bool> wraparound;
00835 trajectory_msgs::JointTrajectory input_trajectory = traj;
00836
00837 for (size_t i=0; i<input_trajectory.joint_names.size(); i++)
00838 {
00839 std::string name = input_trajectory.joint_names[i];
00840
00841 double pos;
00842 if(!getJointPosition(name, pos)) {
00843 ROS_WARN_STREAM("Can't unnormalize as no current joint state for " << name);
00844 return;
00845 }
00846
00847
00848 current_values.push_back(pos);
00849
00850 boost::shared_ptr<const urdf::Joint> joint = robot_model_.getJoint(name);
00851 if (joint.get() == NULL)
00852 {
00853 ROS_ERROR("Joint name %s not found in urdf model", name.c_str());
00854 return;
00855 }
00856 if (joint->type == urdf::Joint::CONTINUOUS) {
00857 wraparound.push_back(true);
00858 } else {
00859 wraparound.push_back(false);
00860 }
00861 }
00862
00863 trajectory_msgs::JointTrajectory unnormalized_trajectory = input_trajectory;
00864 for (size_t i=0; i<unnormalized_trajectory.points.size(); i++)
00865 {
00866 for (size_t j=0; j<unnormalized_trajectory.points[i].positions.size(); j++)
00867 {
00868 if(!wraparound[j]){
00869 continue;
00870 }
00871 double current = current_values[j];
00872 double traj = unnormalized_trajectory.points[i].positions[j];
00873 while ( current - traj > M_PI ) traj += 2*M_PI;
00874 while ( traj - current > M_PI ) traj -= 2*M_PI;
00875 ROS_DEBUG("Normalizing joint %s from %f to %f", unnormalized_trajectory.joint_names.at(j).c_str(),
00876 unnormalized_trajectory.points[i].positions[j], traj);
00877 unnormalized_trajectory.points[i].positions[j] = traj;
00878
00879 current_values[j] = traj;
00880 }
00881 }
00882 traj = unnormalized_trajectory;
00883 }
00884
00885 void GeneralCommander::sendArmVelCommands(double r_x_vel, double r_y_vel, double r_z_vel, double r_pitch_vel, double r_roll_vel,
00886 double l_x_vel, double l_y_vel, double l_z_vel, double l_pitch_vel, double l_roll_vel,
00887 double hz) {
00888
00889
00890 ros::Time beforeCall = ros::Time::now();
00891
00892 double trajectory_duration = .2;
00893
00894
00895
00896 clampDesiredArmPositionsToActual(.1);
00897
00898 if(control_rarm_) {
00899
00900 if(fabs(r_x_vel) > .001 || fabs(r_y_vel) > .001 || fabs(r_z_vel) > .001 || fabs(r_roll_vel) > 0 || fabs(r_pitch_vel) > 0) {
00901
00902 geometry_msgs::Pose right_trajectory_endpoint = des_r_wrist_roll_pose_;
00903
00904 kinematics_msgs::GetKinematicSolverInfo::Request right_request;
00905 kinematics_msgs::GetKinematicSolverInfo::Response right_response;
00906
00907 right_arm_kinematics_solver_client_.call(right_request, right_response);
00908
00909 double pos_diff_x = r_x_vel*(1.0/hz);
00910 double pos_diff_y = r_y_vel*(1.0/hz);
00911 double pos_diff_z = r_z_vel*(1.0/hz);
00912 double pos_diff_pitch = r_pitch_vel*trajectory_duration;
00913 double pos_diff_roll = r_roll_vel*trajectory_duration;
00914
00915 right_trajectory_endpoint.position.x += r_x_vel*trajectory_duration;
00916 right_trajectory_endpoint.position.y += r_y_vel*trajectory_duration;
00917 right_trajectory_endpoint.position.z += r_z_vel*trajectory_duration;
00918 {
00919 urdf::Rotation q(right_trajectory_endpoint.orientation.x,right_trajectory_endpoint.orientation.y,
00920 right_trajectory_endpoint.orientation.z,right_trajectory_endpoint.orientation.w);
00921 double tmp[3];
00922 q.getRPY(tmp[0],tmp[1],tmp[2]);
00923 tmp[0] += r_roll_vel*trajectory_duration;
00924 tmp[1] += r_pitch_vel*trajectory_duration;
00925 q.setFromRPY(tmp[0],tmp[1],tmp[2]);
00926
00927 right_trajectory_endpoint.orientation.x = q.x;
00928 right_trajectory_endpoint.orientation.y = q.y;
00929 right_trajectory_endpoint.orientation.z = q.z;
00930 right_trajectory_endpoint.orientation.w = q.w;
00931 }
00932
00933 des_r_wrist_roll_pose_.position.x += pos_diff_x;
00934 des_r_wrist_roll_pose_.position.y += pos_diff_y;
00935 des_r_wrist_roll_pose_.position.z += pos_diff_z;
00936 {
00937 urdf::Rotation q(des_r_wrist_roll_pose_.orientation.x,des_r_wrist_roll_pose_.orientation.y,
00938 des_r_wrist_roll_pose_.orientation.z,des_r_wrist_roll_pose_.orientation.w);
00939 double tmp[3];
00940 q.getRPY(tmp[0],tmp[1],tmp[2]);
00941 tmp[0] += pos_diff_roll;
00942 tmp[1] += pos_diff_pitch;
00943 q.setFromRPY(tmp[0],tmp[1],tmp[2]);
00944
00945 des_r_wrist_roll_pose_.orientation.x = q.x;
00946 des_r_wrist_roll_pose_.orientation.y = q.y;
00947 des_r_wrist_roll_pose_.orientation.z = q.z;
00948 des_r_wrist_roll_pose_.orientation.w = q.w;
00949 }
00950
00951
00952
00953
00954 kinematics_msgs::GetPositionIK::Request ik_req;
00955 kinematics_msgs::GetPositionIK::Response ik_res;
00956
00957 ik_req.timeout = ros::Duration(0.05);
00958 ik_req.ik_request.ik_link_name = "r_wrist_roll_link";
00959 ik_req.ik_request.pose_stamped.header.frame_id = "base_link";
00960 ik_req.ik_request.pose_stamped.header.stamp = ros::Time::now();
00961 ik_req.ik_request.pose_stamped.pose = right_trajectory_endpoint;
00962
00963 ik_req.ik_request.ik_seed_state.joint_state.position.resize(right_response.kinematic_solver_info.joint_names.size());
00964 ik_req.ik_request.ik_seed_state.joint_state.name = right_response.kinematic_solver_info.joint_names;
00965 for(unsigned int i = 0; i < ik_req.ik_request.ik_seed_state.joint_state.name.size(); i++) {
00966 bool ok = getJointPosition(ik_req.ik_request.ik_seed_state.joint_state.name[i], ik_req.ik_request.ik_seed_state.joint_state.position[i]);
00967 if(!ok) {
00968 ROS_WARN_STREAM("No joint state yet for " << ik_req.ik_request.ik_seed_state.joint_state.name[i]);
00969 return;
00970 } else {
00971
00972
00973 }
00974 }
00975
00976
00977
00978 if(right_arm_kinematics_inverse_client_.call(ik_req, ik_res) && ik_res.error_code.val == ik_res.error_code.SUCCESS) {
00979
00980 pr2_controllers_msgs::JointTrajectoryGoal goal;
00981
00982 std::vector<std::string> joint_names;
00983 std::string pref = "r";
00984
00985
00986 joint_names.push_back(pref+"_"+"shoulder_pan_joint");
00987 joint_names.push_back(pref+"_"+"shoulder_lift_joint");
00988 joint_names.push_back(pref+"_"+"upper_arm_roll_joint");
00989 joint_names.push_back(pref+"_"+"elbow_flex_joint");
00990 joint_names.push_back(pref+"_"+"forearm_roll_joint");
00991 joint_names.push_back(pref+"_"+"wrist_flex_joint");
00992 joint_names.push_back(pref+"_"+"wrist_roll_joint");
00993
00994 goal.trajectory.joint_names = joint_names;
00995
00996
00997 goal.trajectory.points.resize(1);
00998
00999 for(unsigned int i = 0; i < goal.trajectory.joint_names.size(); i++) {
01000 goal.trajectory.points[0].positions.push_back(ik_res.solution.joint_state.position[i]);
01001 goal.trajectory.points[0].velocities.push_back(0.0);
01002 }
01003 goal.trajectory.header.stamp = ros::Time::now()+ros::Duration(0.200);
01004 goal.trajectory.points[0].time_from_start = ros::Duration(trajectory_duration);
01005
01006 unnormalizeTrajectory(goal.trajectory);
01007 right_arm_traj_pub_.publish(goal.trajectory);
01008 } else {
01009 ROS_DEBUG_STREAM("Ik failed with response " << ik_res.error_code.val);
01010 }
01011 }
01012
01013 ros::Time afterCall = ros::Time::now();
01014 }
01015 if(control_larm_) {
01016 if(fabs(l_x_vel) > .001 || fabs(l_y_vel) > .001 || fabs(l_z_vel) > .001 || fabs(l_roll_vel) > 0 || fabs(l_pitch_vel) > 0) {
01017
01018 geometry_msgs::Pose left_trajectory_endpoint = des_l_wrist_roll_pose_;
01019
01020 kinematics_msgs::GetKinematicSolverInfo::Request left_request;
01021 kinematics_msgs::GetKinematicSolverInfo::Response left_response;
01022
01023 left_arm_kinematics_solver_client_.call(left_request, left_response);
01024
01025 double pos_diff_x = l_x_vel*(1.0/hz);
01026 double pos_diff_y = l_y_vel*(1.0/hz);
01027 double pos_diff_z = l_z_vel*(1.0/hz);
01028 double pos_diff_pitch = l_pitch_vel*trajectory_duration;
01029 double pos_diff_roll = l_roll_vel*trajectory_duration;
01030
01031 left_trajectory_endpoint.position.x += l_x_vel*trajectory_duration;
01032 left_trajectory_endpoint.position.y += l_y_vel*trajectory_duration;
01033 left_trajectory_endpoint.position.z += l_z_vel*trajectory_duration;
01034
01035 {
01036 urdf::Rotation q(left_trajectory_endpoint.orientation.x,left_trajectory_endpoint.orientation.y,
01037 left_trajectory_endpoint.orientation.z,left_trajectory_endpoint.orientation.w);
01038 double tmp[3];
01039 q.getRPY(tmp[0],tmp[1],tmp[2]);
01040 tmp[0] += r_roll_vel*trajectory_duration;
01041 tmp[1] += r_pitch_vel*trajectory_duration;
01042 q.setFromRPY(tmp[0],tmp[1],tmp[2]);
01043
01044 left_trajectory_endpoint.orientation.x = q.x;
01045 left_trajectory_endpoint.orientation.y = q.y;
01046 left_trajectory_endpoint.orientation.z = q.z;
01047 left_trajectory_endpoint.orientation.w = q.w;
01048 }
01049
01050 des_l_wrist_roll_pose_.position.x += pos_diff_x;
01051 des_l_wrist_roll_pose_.position.y += pos_diff_y;
01052 des_l_wrist_roll_pose_.position.z += pos_diff_z;
01053 {
01054 urdf::Rotation q(des_l_wrist_roll_pose_.orientation.x,des_l_wrist_roll_pose_.orientation.y,
01055 des_l_wrist_roll_pose_.orientation.z,des_l_wrist_roll_pose_.orientation.w);
01056 double tmp[3];
01057 q.getRPY(tmp[0],tmp[1],tmp[2]);
01058 tmp[0] += pos_diff_roll;
01059 tmp[1] += pos_diff_pitch;
01060 q.setFromRPY(tmp[0],tmp[1],tmp[2]);
01061
01062 des_l_wrist_roll_pose_.orientation.x = q.x;
01063 des_l_wrist_roll_pose_.orientation.y = q.y;
01064 des_l_wrist_roll_pose_.orientation.z = q.z;
01065 des_l_wrist_roll_pose_.orientation.w = q.w;
01066 }
01067
01068
01069
01070 kinematics_msgs::GetPositionIK::Request ik_req;
01071 kinematics_msgs::GetPositionIK::Response ik_res;
01072
01073 ik_req.timeout = ros::Duration(0.05);
01074 ik_req.ik_request.ik_link_name = "l_wrist_roll_link";
01075 ik_req.ik_request.pose_stamped.header.frame_id = "base_link";
01076 ik_req.ik_request.pose_stamped.header.stamp = ros::Time::now();
01077 ik_req.ik_request.pose_stamped.pose = left_trajectory_endpoint;
01078
01079 ik_req.ik_request.ik_seed_state.joint_state.position.resize(left_response.kinematic_solver_info.joint_names.size());
01080 ik_req.ik_request.ik_seed_state.joint_state.name = left_response.kinematic_solver_info.joint_names;
01081 for(unsigned int i = 0; i < ik_req.ik_request.ik_seed_state.joint_state.name.size(); i++) {
01082 bool ok = getJointPosition(ik_req.ik_request.ik_seed_state.joint_state.name[i], ik_req.ik_request.ik_seed_state.joint_state.position[i]);
01083 if(!ok) {
01084 ROS_WARN_STREAM("No joint state yet for " << ik_req.ik_request.ik_seed_state.joint_state.name[i]);
01085 return;
01086 } else {
01087
01088
01089 }
01090 }
01091
01092
01093
01094 if(left_arm_kinematics_inverse_client_.call(ik_req, ik_res) && ik_res.error_code.val == ik_res.error_code.SUCCESS) {
01095
01096 pr2_controllers_msgs::JointTrajectoryGoal goal;
01097
01098 std::vector<std::string> joint_names;
01099 std::string pref = "l";
01100
01101
01102 joint_names.push_back(pref+"_"+"shoulder_pan_joint");
01103 joint_names.push_back(pref+"_"+"shoulder_lift_joint");
01104 joint_names.push_back(pref+"_"+"upper_arm_roll_joint");
01105 joint_names.push_back(pref+"_"+"elbow_flex_joint");
01106 joint_names.push_back(pref+"_"+"forearm_roll_joint");
01107 joint_names.push_back(pref+"_"+"wrist_flex_joint");
01108 joint_names.push_back(pref+"_"+"wrist_roll_joint");
01109
01110 goal.trajectory.joint_names = joint_names;
01111
01112
01113 goal.trajectory.points.resize(1);
01114
01115 for(unsigned int i = 0; i < goal.trajectory.joint_names.size(); i++) {
01116 goal.trajectory.points[0].positions.push_back(ik_res.solution.joint_state.position[i]);
01117 goal.trajectory.points[0].velocities.push_back(0.0);
01118 }
01119 goal.trajectory.header.stamp = ros::Time::now()+ros::Duration(0.200);
01120 goal.trajectory.points[0].time_from_start = ros::Duration(trajectory_duration);
01121
01122 unnormalizeTrajectory(goal.trajectory);
01123 left_arm_traj_pub_.publish(goal.trajectory);
01124 } else {
01125 ROS_DEBUG_STREAM("Ik failed with response " << ik_res.error_code.val);
01126 }
01127 }
01128 }
01129 }
01130
01131 bool GeneralCommander::moveToWalkAlongArmPose() {
01132
01133
01134 if(!control_rarm_ || !control_larm_) {
01135 return false;
01136 }
01137
01138 updateCurrentWristPositions();
01139
01140 ROS_DEBUG("Attempting to set arms to walk along pose");
01141
01142 std::vector<std::string> joint_names;
01143 std::string pref;
01144 pr2_controllers_msgs::JointTrajectoryGoal goal;
01145
01146 pref = "r";
01147
01148
01149 joint_names.push_back(pref+"_"+"shoulder_pan_joint");
01150 joint_names.push_back(pref+"_"+"shoulder_lift_joint");
01151 joint_names.push_back(pref+"_"+"upper_arm_roll_joint");
01152 joint_names.push_back(pref+"_"+"elbow_flex_joint");
01153 joint_names.push_back(pref+"_"+"forearm_roll_joint");
01154 joint_names.push_back(pref+"_"+"wrist_flex_joint");
01155 joint_names.push_back(pref+"_"+"wrist_roll_joint");
01156
01157 goal.trajectory.joint_names = joint_names;
01158
01159
01160 goal.trajectory.points.resize(1);
01161 goal.trajectory.points[0].positions = right_walk_along_pose_;
01162
01163 for(unsigned int i = 0; i < goal.trajectory.joint_names.size(); i++) {
01164 goal.trajectory.points[0].velocities.push_back(0.0);
01165 }
01166
01167 geometry_msgs::Pose right_walk_pose = getPositionFromJointsPose(right_arm_kinematics_forward_client_,
01168 "r_wrist_roll_link",
01169 joint_names,
01170 right_walk_along_pose_);
01171 double tot_distance = sqrt(pow(right_walk_pose.position.x-right_wrist_roll_pose_.position.x,2.0)+
01172 pow(right_walk_pose.position.y-right_wrist_roll_pose_.position.y,2.0)+
01173 pow(right_walk_pose.position.z-right_wrist_roll_pose_.position.z,2.0));
01174 ROS_DEBUG_STREAM("Right dist is " << tot_distance);
01175
01176 if(tot_distance > .02) {
01177
01178 goal.trajectory.header.stamp = ros::Time::now()+ros::Duration(0.030);
01179 goal.trajectory.points[0].time_from_start = ros::Duration(3.0);
01180
01181 unnormalizeTrajectory(goal.trajectory);
01182
01183 ROS_DEBUG("Sending right arm goal");
01184
01185 right_arm_trajectory_client_->sendGoal(goal);
01186 bool finished_before_timeout = right_arm_trajectory_client_->waitForResult(ros::Duration(5.0));
01187
01188 actionlib::SimpleClientGoalState state = right_arm_trajectory_client_->getState();
01189
01190 if(!finished_before_timeout || state != actionlib::SimpleClientGoalState::SUCCEEDED) {
01191 right_arm_trajectory_client_->sendGoal(goal);
01192 finished_before_timeout = right_arm_trajectory_client_->waitForResult(ros::Duration(5.0));
01193 state = right_arm_trajectory_client_->getState();
01194 if(!finished_before_timeout || state != actionlib::SimpleClientGoalState::SUCCEEDED) {
01195 ROS_WARN("Not in walk along pose");
01196 return false;
01197 }
01198 } else {
01199 ROS_DEBUG("Right arm goal successful");
01200 }
01201 } else {
01202 ROS_DEBUG("No need for right arm goal");
01203 }
01204 joint_names.clear();
01205 pref = "l";
01206
01207
01208 joint_names.push_back(pref+"_"+"shoulder_pan_joint");
01209 joint_names.push_back(pref+"_"+"shoulder_lift_joint");
01210 joint_names.push_back(pref+"_"+"upper_arm_roll_joint");
01211 joint_names.push_back(pref+"_"+"elbow_flex_joint");
01212 joint_names.push_back(pref+"_"+"forearm_roll_joint");
01213 joint_names.push_back(pref+"_"+"wrist_flex_joint");
01214 joint_names.push_back(pref+"_"+"wrist_roll_joint");
01215
01216 goal.trajectory.joint_names = joint_names;
01217 goal.trajectory.points[0].positions = left_walk_along_pose_;
01218 goal.trajectory.points[0].velocities.clear();
01219 for(unsigned int i = 0; i < goal.trajectory.joint_names.size(); i++) {
01220 goal.trajectory.points[0].velocities.push_back(0.0);
01221 }
01222
01223 geometry_msgs::Pose left_walk_pose = getPositionFromJointsPose(left_arm_kinematics_forward_client_,
01224 "l_wrist_roll_link",
01225 joint_names,
01226 left_walk_along_pose_);
01227 tot_distance = sqrt(pow(left_walk_pose.position.x-left_wrist_roll_pose_.position.x,2.0)+
01228 pow(left_walk_pose.position.y-left_wrist_roll_pose_.position.y,2.0)+
01229 pow(left_walk_pose.position.z-left_wrist_roll_pose_.position.z,2.0));
01230 ROS_DEBUG_STREAM("Left dist is " << tot_distance);
01231
01232 if(tot_distance > .02) {
01233
01234
01235
01236 goal.trajectory.header.stamp = ros::Time::now()+ros::Duration(0.030);
01237 goal.trajectory.points[0].time_from_start = ros::Duration(3.0);
01238
01239 unnormalizeTrajectory(goal.trajectory);
01240
01241 ROS_DEBUG("Sending left arm goal");
01242
01243 left_arm_trajectory_client_->sendGoal(goal);
01244 bool finished_before_timeout = left_arm_trajectory_client_->waitForResult(ros::Duration(5.0));
01245
01246 actionlib::SimpleClientGoalState state = left_arm_trajectory_client_->getState();
01247
01248 if(!finished_before_timeout || state != actionlib::SimpleClientGoalState::SUCCEEDED) {
01249 left_arm_trajectory_client_->sendGoal(goal);
01250 finished_before_timeout = left_arm_trajectory_client_->waitForResult(ros::Duration(5.0));
01251 state = left_arm_trajectory_client_->getState();
01252 if(!finished_before_timeout || state != actionlib::SimpleClientGoalState::SUCCEEDED) {
01253 ROS_WARN("Not in walk along pose");
01254 return false;
01255 }
01256 } else {
01257 ROS_DEBUG("Left arm goal successful");
01258 }
01259 } else {
01260 ROS_DEBUG("No need for arm goal");
01261 }
01262
01263
01264
01265 updateCurrentWristPositions();
01266 walk_along_right_des_pose_ = right_wrist_roll_pose_;
01267 walk_along_left_des_pose_ = left_wrist_roll_pose_;
01268
01269
01270
01271 walk_rdx_vals_.clear();
01272 walk_rdy_vals_.clear();
01273 walk_ldx_vals_.clear();
01274 walk_ldy_vals_.clear();
01275
01276 return true;
01277 }
01278
01279 bool GeneralCommander::initWalkAlong() {
01280
01281
01282 if(!control_rarm_ || !control_larm_) {
01283 return false;
01284 }
01285
01286 updateCurrentWristPositions();
01287
01288 std::vector<std::string> joint_names;
01289 std::string pref = "r";
01290
01291
01292 joint_names.push_back(pref+"_"+"shoulder_pan_joint");
01293 joint_names.push_back(pref+"_"+"shoulder_lift_joint");
01294 joint_names.push_back(pref+"_"+"upper_arm_roll_joint");
01295 joint_names.push_back(pref+"_"+"elbow_flex_joint");
01296 joint_names.push_back(pref+"_"+"forearm_roll_joint");
01297 joint_names.push_back(pref+"_"+"wrist_flex_joint");
01298 joint_names.push_back(pref+"_"+"wrist_roll_joint");
01299
01300 geometry_msgs::Pose right_walk_pose = getPositionFromJointsPose(right_arm_kinematics_forward_client_,
01301 "r_wrist_roll_link",
01302 joint_names,
01303 right_walk_along_pose_);
01304 double tot_distance = sqrt(pow(right_walk_pose.position.x-right_wrist_roll_pose_.position.x,2.0)+
01305 pow(right_walk_pose.position.y-right_wrist_roll_pose_.position.y,2.0)+
01306 pow(right_walk_pose.position.z-right_wrist_roll_pose_.position.z,2.0));
01307 ROS_DEBUG_STREAM("Right dist is " << tot_distance);
01308
01309 if(tot_distance > .02) {
01310 walk_along_ok_ = false;
01311 return false;
01312 }
01313
01314 joint_names.clear();
01315 pref = "l";
01316
01317
01318 joint_names.push_back(pref+"_"+"shoulder_pan_joint");
01319 joint_names.push_back(pref+"_"+"shoulder_lift_joint");
01320 joint_names.push_back(pref+"_"+"upper_arm_roll_joint");
01321 joint_names.push_back(pref+"_"+"elbow_flex_joint");
01322 joint_names.push_back(pref+"_"+"forearm_roll_joint");
01323 joint_names.push_back(pref+"_"+"wrist_flex_joint");
01324 joint_names.push_back(pref+"_"+"wrist_roll_joint");
01325 geometry_msgs::Pose left_walk_pose = getPositionFromJointsPose(left_arm_kinematics_forward_client_,
01326 "l_wrist_roll_link",
01327 joint_names,
01328 left_walk_along_pose_);
01329 tot_distance = sqrt(pow(left_walk_pose.position.x-left_wrist_roll_pose_.position.x,2.0)+
01330 pow(left_walk_pose.position.y-left_wrist_roll_pose_.position.y,2.0)+
01331 pow(left_walk_pose.position.z-left_wrist_roll_pose_.position.z,2.0));
01332 ROS_DEBUG_STREAM("Left dist is " << tot_distance);
01333
01334 if(tot_distance > .02) {
01335 walk_along_ok_ = false;
01336 return false;
01337 }
01338 walk_along_ok_ = true;
01339 return true;
01340 }
01341
01342 void GeneralCommander::updateWalkAlongAverages() {
01343
01344
01345 if(!control_rarm_ || !control_larm_) {
01346 return;
01347 }
01348
01349 if(walk_rdx_vals_.size() > WALK_BUFFER) {
01350 walk_rdx_vals_.pop_front();
01351 }
01352 if(walk_rdy_vals_.size() > WALK_BUFFER) {
01353 walk_rdy_vals_.pop_front();
01354 }
01355 if(walk_ldx_vals_.size() > WALK_BUFFER) {
01356 walk_ldx_vals_.pop_front();
01357 }
01358 if(walk_ldy_vals_.size() > WALK_BUFFER) {
01359 walk_ldy_vals_.pop_front();
01360 }
01361
01362 updateCurrentWristPositions();
01363
01364
01365
01366
01367 double rdx = right_wrist_roll_pose_.position.x-walk_along_right_des_pose_.position.x;
01368 double rdy = right_wrist_roll_pose_.position.y-walk_along_right_des_pose_.position.y;
01369
01370 double ldx = left_wrist_roll_pose_.position.x-walk_along_left_des_pose_.position.x;
01371 double ldy = left_wrist_roll_pose_.position.y-walk_along_left_des_pose_.position.y;
01372
01373
01374
01375 walk_rdx_vals_.push_back(rdx);
01376 walk_rdy_vals_.push_back(rdy);
01377 walk_ldx_vals_.push_back(ldx);
01378 walk_ldy_vals_.push_back(ldy);
01379
01380 }
01381
01382 void GeneralCommander::sendWalkAlongCommand(double thresh,
01383 double x_dist_max, double x_speed_scale,
01384 double y_dist_max, double y_speed_scale,
01385 double rot_speed_scale) {
01386
01387 if(!control_rarm_ || !control_larm_) {
01388 return;
01389 }
01390
01391 if(!walk_along_ok_) {
01392 return;
01393 }
01394
01395 updateWalkAlongAverages();
01396
01397 double av_rdx = calcAverage(walk_rdx_vals_);
01398 double av_rdy = calcAverage(walk_rdy_vals_);
01399 double av_ldx = calcAverage(walk_ldx_vals_);
01400 double av_ldy = calcAverage(walk_ldy_vals_);
01401
01402
01403
01404 if(fabs(av_rdx) < thresh) {
01405 av_rdx = 0.0;
01406 }
01407 if(fabs(av_rdy) < thresh) {
01408 av_rdy = 0.0;
01409 }
01410 if(fabs(av_ldx) < thresh) {
01411 av_ldx = 0.0;
01412 }
01413 if(fabs(av_ldy) < thresh) {
01414 av_ldy = 0.0;
01415 }
01416
01417 double vx = 0.0;
01418 double vy = 0.0;
01419 double vw = 0.0;
01420
01421
01422
01423
01424
01425
01426
01427
01428
01429
01430
01431
01432
01433
01434 double av_x = av_rdx/2.0+av_ldx/2.0;
01435 double per_x = fabs(av_x)/x_dist_max;
01436 per_x = std::min(per_x, 1.0);
01437 vx = (per_x*per_x)*x_speed_scale*((av_x > 0) ? 1 : -1);
01438
01439 double per_y = fabs(av_ldy/2.0)/y_dist_max;
01440 per_y = std::min(per_y, 1.0);
01441 vy = (per_y*per_y)*y_speed_scale*((av_ldy > 0) ? 1 : -1);
01442
01443
01444
01445 double per_rot = fabs(av_rdy/2.0)/y_dist_max;
01446 per_rot = std::min(per_rot, 1.0);
01447 vw = (per_rot*per_rot)*rot_speed_scale*((av_rdy > 0) ? 1 : -1);;
01448
01449
01450
01451 sendBaseCommand(vx, vy, vw);
01452
01453
01454
01455
01456
01457
01458 }
01459
01460 double GeneralCommander::calcAverage(const std::list<double>& av_list) const {
01461 double av = 0.0;
01462 for(std::list<double>::const_iterator it = av_list.begin();
01463 it != av_list.end();
01464 it++) {
01465 av += (*it);
01466 }
01467 av /= av_list.size();
01468 return av;
01469 }
01470
01471 geometry_msgs::Pose GeneralCommander::getPositionFromJointsPose(ros::ServiceClient& service_client,
01472 std::string fk_link,
01473 const std::vector<std::string>& joint_names, const std::vector<double>& joint_pos) {
01474 kinematics_msgs::GetPositionFK::Request fk_request;
01475 kinematics_msgs::GetPositionFK::Response fk_response;
01476
01477 geometry_msgs::Pose ret_pose;
01478
01479 fk_request.header.frame_id = "base_link";
01480 fk_request.fk_link_names.push_back(fk_link);
01481 fk_request.robot_state.joint_state.position.resize(joint_names.size());
01482 fk_request.robot_state.joint_state.name = joint_names;
01483 fk_request.robot_state.joint_state.position = joint_pos;
01484 if(service_client.call(fk_request, fk_response)) {
01485 if(fk_response.error_code.val == fk_response.error_code.SUCCESS) {
01486 ret_pose = fk_response.pose_stamped[0].pose;
01487 } else {
01488 ROS_DEBUG("fk not a success");
01489 }
01490 } else {
01491 ROS_WARN("fk call failed all together");
01492 }
01493 return ret_pose;
01494 }
01495
01496 void GeneralCommander::sendHeadSequence(HeadSequence seq) {
01497
01498 if(!control_head_) return;
01499
01500 setHeadMode(HEAD_JOYSTICK);
01501
01502 trajectory_msgs::JointTrajectory traj;
01503
01504 if(seq == HEAD_NOD) {
01505 traj = head_nod_traj_;
01506 } else if(seq == HEAD_SHAKE){
01507 traj = head_shake_traj_;
01508 }
01509 traj.header.stamp = ros::Time::now() + ros::Duration(0.01);
01510 head_pub_.publish(traj);
01511 }
01512
01513 void GeneralCommander::powerBoardCallback(const pr2_msgs::PowerBoardStateConstPtr &powerBoardState) {
01514 if(walk_along_ok_) {
01515 if(!powerBoardState->run_stop || !powerBoardState->wireless_stop) {
01516 ROS_DEBUG("Killing walk along due to stop");
01517 walk_along_ok_ = false;
01518 }
01519 }
01520 }
01521
01522 void GeneralCommander::requestProsilicaImage(std::string ns) {
01523 if(!control_prosilica_) return;
01524 polled_camera::GetPolledImage::Request gpi_req;
01525 polled_camera::GetPolledImage::Response gpi_res;
01526 gpi_req.response_namespace = ns;
01527 if(!prosilica_polling_client_.call(gpi_req, gpi_res)) {
01528 ROS_WARN("Prosilica polling request failed");
01529 }
01530 }
01531
01532 void GeneralCommander::tuckArms(WhichArm arm) {
01533
01534
01535 if(!control_rarm_ || !control_larm_) {
01536 return;
01537 }
01538
01539 setArmMode(arm, ARM_POSITION_CONTROL);
01540
01541 pr2_common_action_msgs::TuckArmsGoal tuck_arm_goal;
01542
01543 if(arm == ARMS_BOTH) {
01544 tuck_arm_goal.tuck_right = true;
01545 tuck_arm_goal.tuck_left = true;
01546 } else {
01547 ROS_DEBUG("Tucking one arm not supported");
01548 }
01549
01550 ROS_DEBUG("Sending tuck arms");
01551
01552 tuck_arms_client_->sendGoalAndWait(tuck_arm_goal, ros::Duration(10.0), ros::Duration(5.0));
01553 }
01554
01555 void GeneralCommander::untuckArms(WhichArm arm) {
01556
01557
01558 if(!control_rarm_ || !control_larm_) {
01559 return;
01560 }
01561
01562 setArmMode(arm, ARM_POSITION_CONTROL);
01563
01564 pr2_common_action_msgs::TuckArmsGoal tuck_arm_goal;
01565
01566 if(arm == ARMS_BOTH) {
01567 tuck_arm_goal.tuck_right = false;
01568 tuck_arm_goal.tuck_left = false;
01569 } else {
01570 ROS_DEBUG("Untucking one arm not supported");
01571 }
01572
01573 ROS_DEBUG("Sending untuck arms");
01574
01575 tuck_arms_client_->sendGoalAndWait(tuck_arm_goal, ros::Duration(10.0), ros::Duration(5.0));
01576
01577 }