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 <termios.h>
00034 #include <signal.h>
00035 #include <cstdio>
00036 #include <cstdlib>
00037 #include <unistd.h>
00038 #include <math.h>
00039
00040 #include <ros/ros.h>
00041
00042 #include "pr2_teleop_general/pr2_teleop_general_commander.h"
00043
00044 int kfd = 0;
00045 struct termios cooked, raw;
00046
00047 class Pr2TeleopGeneralKeyboard
00048 {
00049 public:
00050 Pr2TeleopGeneralKeyboard()
00051 {
00052 gc = NULL;
00053 }
00054
00055 ~Pr2TeleopGeneralKeyboard() {
00056 if(gc != NULL) {
00057 delete gc;
00058 }
00059 }
00060
00061 void init()
00062 {
00063 ros::NodeHandle n_local("~");
00064
00065
00066 n_local.param("max_pan", max_pan_, 2.7);
00067 n_local.param("max_tilt", max_tilt_, 1.4);
00068 n_local.param("min_tilt", min_tilt_, -0.4);
00069
00070 n_local.param("tilt_diff", tilt_scale_, .5);
00071 n_local.param("pan_diff", pan_scale_, 1.2);
00072
00073 n_local.param("vx_scale", vx_scale_, 0.6);
00074 n_local.param("vy_scale", vy_scale_, 0.6);
00075 n_local.param("vw_scale", vw_scale_, 0.8);
00076
00077 n_local.param("torso_step", torso_step_, 0.01);
00078 n_local.param("min_torso", min_torso_, 0.0);
00079 n_local.param("max_torso", max_torso_, 1.8);
00080
00081 n_local.param("arm_x_scale", arm_x_scale_, .10);
00082 n_local.param("arm_y_scale", arm_y_scale_, .10);
00083 n_local.param("arm_z_scale", arm_z_scale_, .10);
00084 n_local.param("arm_roll_scale", arm_roll_scale_, .10);
00085 n_local.param("arm_pitch_scale", arm_pitch_scale_, .10);
00086
00087 n_local.param("wrist_velocity",wrist_velocity_, 4.5);
00088
00089 n_local.param("control_prosilica", control_prosilica, true);
00090
00091 n_local.param("control_body", control_body, true);
00092
00093 n_local.param("control_larm", control_larm, true);
00094
00095 n_local.param("control_rarm", control_rarm, true);
00096
00097 n_local.param("control_head", control_head, true);
00098
00099 std::string arm_controller_name;
00100 n_local.param("arm_controller_name", arm_controller_name,std::string(""));
00101
00102 if(arm_controller_name.empty()) {
00103 gc = new GeneralCommander(control_body,
00104 control_head,
00105 control_rarm,
00106 control_larm,
00107 control_prosilica);
00108 } else {
00109 gc = new GeneralCommander(control_body,
00110 control_head,
00111 control_rarm,
00112 control_larm,
00113 control_prosilica,
00114 arm_controller_name);
00115 }
00116
00117 head_init_ = false;
00118 torso_init_ = false;
00119 }
00120
00121 void sendHeadCommand(double pan_diff, double tilt_diff) {
00122 if(!head_init_) {
00123 double cur_pan_pos = 0.0;
00124 double cur_tilt_pos = 0.0;
00125 bool ok = gc->getJointPosition("head_pan_joint", cur_pan_pos);
00126 if(!ok) return;
00127 ok = gc->getJointPosition("head_tilt_joint", cur_tilt_pos);
00128 if(!ok) return;
00129 des_pan_pos_ = cur_pan_pos;
00130 des_tilt_pos_ = cur_tilt_pos;
00131 head_init_ = true;
00132 }
00133 des_pan_pos_ += pan_diff;
00134 des_pan_pos_ = std::min(des_pan_pos_, max_pan_);
00135 des_pan_pos_ = std::max(des_pan_pos_, -max_pan_);
00136 des_tilt_pos_ += tilt_diff;
00137 des_tilt_pos_ = std::min(des_tilt_pos_, max_tilt_);
00138 des_tilt_pos_ = std::max(des_tilt_pos_, min_tilt_);
00139 gc->sendHeadCommand(des_pan_pos_, des_tilt_pos_);
00140 }
00141
00142 void sendTorsoCommand(double torso_diff) {
00143
00144
00145
00146
00147
00148
00149
00150 double cur_torso_pos = 0.0;
00151 gc->getJointPosition("torso_lift_joint", cur_torso_pos);
00152 des_torso_pos_ = cur_torso_pos+torso_diff;
00153 des_torso_pos_ = std::min(des_torso_pos_, max_torso_);
00154 des_torso_pos_ = std::max(des_torso_pos_, min_torso_);
00155 gc->sendTorsoCommand(des_torso_pos_,.1);
00156 }
00157
00158 public:
00159
00160 GeneralCommander* gc;
00161
00162 double max_pan_, max_tilt_, min_tilt_;
00163 double tilt_scale_, pan_scale_;
00164
00165 double des_pan_pos_;
00166 double des_tilt_pos_;
00167
00168 bool head_init_;
00169 bool torso_init_;
00170
00171 double min_torso_;
00172 double max_torso_;
00173 double des_torso_pos_;
00174 double torso_step_;
00175
00176 double des_vx_;
00177 double des_vy_;
00178 double des_vw_;
00179
00180 double vx_scale_;
00181 double vy_scale_;
00182 double vw_scale_;
00183
00184 double arm_x_scale_;
00185 double arm_y_scale_;
00186 double arm_z_scale_;
00187 double arm_roll_scale_;
00188 double arm_pitch_scale_;
00189
00190 double wrist_velocity_;
00191
00192 bool control_body;
00193 bool control_head;
00194 bool control_larm;
00195 bool control_rarm;
00196 bool control_prosilica;
00197 };
00198
00199 void spin_function() {
00200 ros::spin();
00201 }
00202
00203 Pr2TeleopGeneralKeyboard* generalkey = NULL;
00204
00205 void quit(int sig)
00206 {
00207 tcsetattr(kfd, TCSANOW, &cooked);
00208 ros::shutdown();
00209 if(generalkey) {
00210 delete generalkey;
00211 }
00212 exit(0);
00213 }
00214
00215 int main(int argc, char** argv)
00216 {
00217 ros::init(argc, argv, "pr2_telep_general_keyboard", ros::init_options::NoSigintHandler);
00218 signal(SIGINT,quit);
00219
00220 boost::thread spin_thread(boost::bind(&spin_function));
00221
00222
00223 tcgetattr(kfd, &cooked);
00224 memcpy(&raw, &cooked, sizeof(struct termios));
00225 raw.c_lflag &=~ (ICANON | ECHO);
00226
00227 raw.c_cc[VEOL] = 1;
00228 raw.c_cc[VEOF] = 2;
00229 tcsetattr(kfd, TCSANOW, &raw);
00230
00231 generalkey = new Pr2TeleopGeneralKeyboard();
00232 generalkey->init();
00233 char c;
00234
00235 bool stop = false;
00236 while(!stop)
00237 {
00238 puts("Reading from keyboard");
00239 puts("---------------------------");
00240 if(generalkey->control_head) {
00241 puts("Use 'h' for head commands");
00242 }
00243 if(generalkey->control_body) {
00244 puts("Use 'b' for body commands");
00245 }
00246 if(generalkey->control_larm) {
00247 puts("Use 'l' for left arm commands");
00248 }
00249 if(generalkey->control_rarm) {
00250 puts("Use 'r' for right arm commands");
00251 }
00252 if(generalkey->control_larm && generalkey->control_rarm) {
00253 puts("Use 'a' for both arm commands");
00254 }
00255 puts("Use 'q' to quit");
00256
00257
00258 if(read(kfd, &c, 1) < 0)
00259 {
00260 perror("read():");
00261 exit(-1);
00262 }
00263
00264 switch(c)
00265 {
00266 case 'h':
00267 {
00268 if(!generalkey->control_head) {
00269 ROS_INFO("No head control enabled");
00270 break;
00271 }
00272 puts("---------------------------");
00273 puts("Use 'z' for projector on");
00274 puts("Use 'x' for projector off");
00275 puts("Use 's' for laser slow tilt");
00276 puts("Use 'f' for laser fast tilt");
00277 puts("Use 'g' for laser tilt off");
00278 puts("Use 'm' to set head mannequin mode");
00279 puts("Use 'y' to set to keyboard head control");
00280 puts("Use 'i/j/k/l' in keyboard head control mode to move head");
00281 puts("Use 'q' to quit head mode and return to main menu");
00282 bool head_stop = false;
00283
00284 while(!head_stop)
00285 {
00286
00287 if(read(kfd, &c, 1) < 0)
00288 {
00289 perror("read():");
00290 exit(-1);
00291 }
00292 switch(c) {
00293 case 'z':
00294 generalkey->gc->sendProjectorStartStop(true);
00295 break;
00296 case 'x':
00297 generalkey->gc->sendProjectorStartStop(false);
00298 break;
00299 case 's':
00300 generalkey->gc->setLaserMode(GeneralCommander::LASER_TILT_SLOW);
00301 break;
00302 case 'f':
00303 generalkey->gc->setLaserMode(GeneralCommander::LASER_TILT_FAST);
00304 break;
00305 case 'g':
00306 generalkey->gc->setLaserMode(GeneralCommander::LASER_TILT_OFF);
00307 break;
00308 case 'm':
00309 generalkey->gc->setHeadMode(GeneralCommander::HEAD_MANNEQUIN);
00310 generalkey->head_init_ = true;
00311 break;
00312 case 'y':
00313 generalkey->gc->setHeadMode(GeneralCommander::HEAD_JOYSTICK);
00314 break;
00315 case 'i':
00316 if(generalkey->gc->getHeadMode() == GeneralCommander::HEAD_JOYSTICK) {
00317 generalkey->sendHeadCommand(0.0, -generalkey->tilt_scale_);
00318 }
00319 break;
00320 case 'k':
00321 if(generalkey->gc->getHeadMode() == GeneralCommander::HEAD_JOYSTICK) {
00322 generalkey->sendHeadCommand(0.0, generalkey->tilt_scale_);
00323 }
00324 break;
00325 case 'j':
00326 if(generalkey->gc->getHeadMode() == GeneralCommander::HEAD_JOYSTICK) {
00327 generalkey->sendHeadCommand(generalkey->pan_scale_,0.0);
00328 }
00329 break;
00330 case 'l':
00331 if(generalkey->gc->getHeadMode() == GeneralCommander::HEAD_JOYSTICK) {
00332 generalkey->sendHeadCommand(-generalkey->pan_scale_, 0.0);
00333 }
00334 break;
00335 case 'q':
00336 head_stop = true;
00337 break;
00338 }
00339 }
00340 }
00341 break;
00342 case 'b':
00343 {
00344 if(!generalkey->control_body) {
00345 ROS_INFO("No head control enabled");
00346 break;
00347 }
00348 puts("---------------------------");
00349 puts("Use 'u' for torso up");
00350 puts("Use 'd' for torso down");
00351 puts("Use 'i/k' for forward/back");
00352 puts("Use 'j/l' for turning left and right");
00353 puts("Use 'n/m' for straffing left and right");
00354 puts("Use 'q' to quit body mode and return to main menu");
00355
00356 bool body_stop = false;
00357
00358 while(!body_stop)
00359 {
00360
00361 if(read(kfd, &c, 1) < 0)
00362 {
00363 perror("read():");
00364 exit(-1);
00365 }
00366 switch(c) {
00367 case 'u':
00368 generalkey->sendTorsoCommand(generalkey->torso_step_);
00369 break;
00370 case 'd':
00371 generalkey->sendTorsoCommand(-generalkey->torso_step_);
00372 break;
00373 case 'i':
00374 generalkey->gc->sendBaseCommand(generalkey->vx_scale_, 0.0, 0.0);
00375 break;
00376 case 'k':
00377 generalkey->gc->sendBaseCommand(-generalkey->vx_scale_, 0.0, 0.0);
00378 break;
00379 case 'j':
00380 generalkey->gc->sendBaseCommand(0.0, 0.0, generalkey->vw_scale_);
00381 break;
00382 case 'l':
00383 generalkey->gc->sendBaseCommand(0.0, 0.0, -generalkey->vw_scale_);
00384 break;
00385 case 'n':
00386 generalkey->gc->sendBaseCommand(0.0, generalkey->vy_scale_, 0.0);
00387 break;
00388 case 'm':
00389 generalkey->gc->sendBaseCommand(0.0, -generalkey->vy_scale_, 0.0);
00390 break;
00391 case 'q':
00392 body_stop = true;
00393 break;
00394 }
00395 }
00396 }
00397 break;
00398 case 'l': case 'r': case 'a':
00399 {
00400 if(c == 'l' && !generalkey->control_larm) {
00401 ROS_INFO("No left arm control enabled");
00402 break;
00403 }
00404 if(c == 'r' && !generalkey->control_rarm) {
00405 ROS_INFO("No right arm control enabled");
00406 break;
00407 }
00408 if(c == 'a' && (!generalkey->control_larm || !generalkey->control_rarm)) {
00409 ROS_INFO("Both arms not enabled");
00410 break;
00411 }
00412 GeneralCommander::WhichArm arm;
00413 if(c == 'l') {
00414 arm = GeneralCommander::ARMS_LEFT;
00415 } else if(c == 'r') {
00416 arm = GeneralCommander::ARMS_RIGHT;
00417 } else {
00418 arm = GeneralCommander::ARMS_BOTH;
00419 }
00420 puts("---------------------------");
00421 puts("Use 'o' for gripper open");
00422 puts("Use 'p' for gripper close");
00423 puts("Use 'r' for wrist rotate clockwise");
00424 puts("Use 'u' for wrist flex up");
00425 puts("Use 'd' for wrist flex down");
00426 puts("Use 't' for wrist rotate counter-clockwise");
00427 puts("Use 'i/k' for hand pose forward/back");
00428 puts("Use 'j/l' for hand pose left/right");
00429 puts("Use 'h/n' for hand pose up/down");
00430 puts("Use 'q' to quit arm mode and return to main menu");
00431 bool arm_stop = false;
00432
00433 while(!arm_stop)
00434 {
00435
00436 if(read(kfd, &c, 1) < 0)
00437 {
00438 perror("read():");
00439 exit(-1);
00440 }
00441
00442 switch(c) {
00443 case 'o':
00444 generalkey->gc->sendGripperCommand(arm, false);
00445 break;
00446 case 'p':
00447 generalkey->gc->sendGripperCommand(arm, true);
00448 break;
00449 case 'i':
00450 if(arm == GeneralCommander::ARMS_LEFT) {
00451 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,0.0,
00452 generalkey->arm_x_scale_, 0.0,0.0,0.0,0.0,
00453 20.0);
00454 } else if(arm == GeneralCommander::ARMS_RIGHT) {
00455 generalkey->gc->sendArmVelCommands(generalkey->arm_x_scale_,0.0,0.0,0.0,0.0,
00456 0.0, 0.0,0.0,0.0,0.0,
00457 20.0);
00458 } else {
00459 generalkey->gc->sendArmVelCommands(generalkey->arm_x_scale_,0.0,0.0,0.0,0.0,
00460 generalkey->arm_x_scale_, 0.0,0.0,0.0,0.0,
00461 20.0);
00462 }
00463 break;
00464 case 'k':
00465 if(arm == GeneralCommander::ARMS_LEFT) {
00466 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,0.0,
00467 -generalkey->arm_x_scale_, 0.0,0.0,0.0,0.0,
00468 20.0);
00469 } else if(arm == GeneralCommander::ARMS_RIGHT) {
00470 generalkey->gc->sendArmVelCommands(-generalkey->arm_x_scale_,0.0,0.0,0.0,0.0,
00471 0.0, 0.0,0.0,0.0,0.0,
00472 20.0);
00473 } else {
00474 generalkey->gc->sendArmVelCommands(-generalkey->arm_x_scale_,0.0,0.0,0.0,0.0,
00475 -generalkey->arm_x_scale_, 0.0,0.0,0.0,0.0,
00476 20.0);
00477 }
00478 break;
00479 case 'j':
00480 if(arm == GeneralCommander::ARMS_LEFT) {
00481 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,0.0,
00482 0.0,generalkey->arm_y_scale_,0.0,0.0,0.0,
00483 20.0);
00484 } else if(arm == GeneralCommander::ARMS_RIGHT) {
00485 generalkey->gc->sendArmVelCommands(0.0,generalkey->arm_y_scale_,0.0,0.0,0.0,
00486 0.0, 0.0,0.0,0.0,0.0,
00487 20.0);
00488 } else {
00489 generalkey->gc->sendArmVelCommands(0.0,generalkey->arm_y_scale_,0.0,0.0,0.0,
00490 0.0,generalkey->arm_y_scale_, 0.0,0.0,0.0,
00491 20.0);
00492 }
00493 break;
00494 case 'l':
00495 if(arm == GeneralCommander::ARMS_LEFT) {
00496 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,0.0,
00497 0.0,-generalkey->arm_y_scale_,0.0,0.0,0.0,
00498 20.0);
00499 } else if(arm == GeneralCommander::ARMS_RIGHT) {
00500 generalkey->gc->sendArmVelCommands(0.0,-generalkey->arm_y_scale_,0.0,0.0,0.0,
00501 0.0, 0.0,0.0,0.0,0.0,
00502 20.0);
00503 } else {
00504 generalkey->gc->sendArmVelCommands(0.0,-generalkey->arm_y_scale_,0.0,0.0,0.0,
00505 0.0,-generalkey->arm_y_scale_, 0.0,0.0,0.0,
00506 20.0);
00507 }
00508 break;
00509 case 'h':
00510 if(arm == GeneralCommander::ARMS_LEFT) {
00511 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,0.0,
00512 0.0,0.0,generalkey->arm_z_scale_,0.0,0.0,
00513 20.0);
00514 } else if(arm == GeneralCommander::ARMS_RIGHT) {
00515 generalkey->gc->sendArmVelCommands(0.0,0.0,generalkey->arm_z_scale_,0.0,0.0,
00516 0.0, 0.0,0.0,0.0,0.0,
00517 20.0);
00518 } else {
00519 generalkey->gc->sendArmVelCommands(0.0,0.0,generalkey->arm_z_scale_,0.0,0.0,
00520 0.0,0.0,generalkey->arm_z_scale_, 0.0,0.0,
00521 20.0);
00522 }
00523 break;
00524 case 'n':
00525 if(arm == GeneralCommander::ARMS_LEFT) {
00526 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,0.0,
00527 0.0,0.0,-generalkey->arm_z_scale_,0.0,0.0,
00528 20.0);
00529 } else if(arm == GeneralCommander::ARMS_RIGHT) {
00530 generalkey->gc->sendArmVelCommands(0.0,0.0,-generalkey->arm_z_scale_,0.0,0.0,
00531 0.0, 0.0,0.0,0.0,0.0,
00532 20.0);
00533 } else {
00534 generalkey->gc->sendArmVelCommands(0.0,0.0,-generalkey->arm_z_scale_,0.0,0.0,
00535 0.0,0.0,-generalkey->arm_z_scale_, 0.0,0.0,
00536 20.0);
00537 }
00538 break;
00539 case 'd':
00540 if(arm == GeneralCommander::ARMS_LEFT) {
00541 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,0.0,
00542 0.0,0.0,0,generalkey->arm_pitch_scale_,0.0,
00543 20.0);
00544 } else if(arm == GeneralCommander::ARMS_RIGHT) {
00545 generalkey->gc->sendArmVelCommands(0.0,0.0,0,generalkey->arm_pitch_scale_,0.0,
00546 0.0, 0.0,0.0,0.0,0.0,
00547 20.0);
00548 } else {
00549 generalkey->gc->sendArmVelCommands(0.0,0.0,0,generalkey->arm_pitch_scale_,0.0,
00550 0.0,0.0,0,generalkey->arm_pitch_scale_,0.0,
00551 20.0);
00552 }
00553 break;
00554 case 'u':
00555 if(arm == GeneralCommander::ARMS_LEFT) {
00556 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,0.0,
00557 0.0,0.0,0,-generalkey->arm_pitch_scale_,0.0,
00558 20.0);
00559 } else if(arm == GeneralCommander::ARMS_RIGHT) {
00560 generalkey->gc->sendArmVelCommands(0.0,0.0,0,-generalkey->arm_pitch_scale_,0.0,
00561 0.0, 0.0,0.0,0.0,0.0,
00562 20.0);
00563 } else {
00564 generalkey->gc->sendArmVelCommands(0.0,0.0,0,-generalkey->arm_pitch_scale_,0.0,
00565 0.0,0.0,0,-generalkey->arm_pitch_scale_,0.0,
00566 20.0);
00567 }
00568 break;
00569 case 'r':
00570 if(arm == GeneralCommander::ARMS_LEFT) {
00571 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,0.0,
00572 0.0,0.0,0.0,0.0,generalkey->arm_roll_scale_,
00573 20.0);
00574 } else if(arm == GeneralCommander::ARMS_RIGHT) {
00575 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,generalkey->arm_roll_scale_,
00576 0.0, 0.0,0.0,0.0,0.0,
00577 20.0);
00578 } else {
00579 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,generalkey->arm_roll_scale_,
00580 0.0,0.0,0.0,0.0,generalkey->arm_roll_scale_,
00581 20.0);
00582 }
00583 break;
00584 case 't':
00585 if(arm == GeneralCommander::ARMS_LEFT) {
00586 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,0.0,
00587 0.0,0.0,0.0,0.0,-generalkey->arm_roll_scale_,
00588 20.0);
00589 } else if(arm == GeneralCommander::ARMS_RIGHT) {
00590 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,-generalkey->arm_roll_scale_,
00591 0.0, 0.0,0.0,0.0,0.0,
00592 20.0);
00593 } else {
00594 generalkey->gc->sendArmVelCommands(0.0,0.0,0.0,0.0,-generalkey->arm_roll_scale_,
00595 0.0,0.0,0.0,0.0,-generalkey->arm_roll_scale_,
00596 20.0);
00597 }
00598 break;
00599 case 'q':
00600 arm_stop = true;
00601 break;
00602 }
00603 }
00604 }
00605 break;
00606 case 'q':
00607 stop = true;
00608 break;
00609 default:
00610 ROS_INFO_STREAM("Keycode is " << c);
00611 break;
00612 }
00613 }
00614
00615 tcsetattr(kfd, TCSANOW, &cooked);
00616 ros::shutdown();
00617 spin_thread.join();
00618 return(0);
00619 }