00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "Component/ModelManager.H"
00040 #include "Image/Image.H"
00041 #include "Image/Transforms.H"
00042 #include "Image/DrawOps.H"
00043 #include "Image/Rectangle.H"
00044 #include "Image/MathOps.H"
00045 #include "Image/MatrixOps.H"
00046 #include "Image/Layout.H"
00047 #include "Media/FrameSeries.H"
00048 #include "Transport/FrameInfo.H"
00049 #include "Raster/GenericFrame.H"
00050 #include "Raster/Raster.H"
00051 #include "Neuro/BeoHeadBrain.H"
00052 #include "Util/Timer.H"
00053 #include "GUI/GeneralGUI.H"
00054 #include "GUI/ImageDisplayStream.H"
00055 #include "GUI/DebugWin.H"
00056 #include "GUI/XWinManaged.H"
00057 #include "RCBot/Motion/MotionEnergy.H"
00058 #include "ArmControl/ArmSim.H"
00059 #include "ArmControl/RobotArm.H"
00060 #include "ArmControl/ArmController.H"
00061 #include "Devices/DeviceOpts.H"
00062 #include "Util/MathFunctions.H"
00063 #include <unistd.h>
00064 #include <stdio.h>
00065 #include <signal.h>
00066
00067 #ifdef LWPR
00068 #define USE_EXPAT
00069 #include <lwpr/lwpr.h>
00070 #include <lwpr/lwpr_xml.h>
00071 #endif
00072 ModelManager *mgr = new ModelManager("Test ObjRec");
00073 nub::soft_ref<Scorbot> scorbot(new Scorbot(*mgr,"Scorbot", "Scorbot", "/dev/ttyUSB0"));
00074 nub::soft_ref<ArmSim> armSim(new ArmSim(*mgr));
00075 nub::soft_ref<ArmController> armControllerScorbot(new ArmController(*mgr, "ArmControllerScorbot", "ArmControllerScorbot", scorbot));
00076 nub::soft_ref<ArmController> armControllerArmSim(new ArmController(*mgr,
00077 "ArmControllerArmSim", "ArmControllerArmSim", armSim));
00078
00079 double desireCup[3] = {-1*1.125/4-0.15,0.15,0.25};
00080 double desireBlock[3] = {-1*1.125/4,0,0.05};
00081
00082 bool gradient(double *desire,double errThres);
00083
00084 void terminate(int s)
00085 {
00086
00087 armControllerScorbot->setBasePos( 0 , false);
00088 armControllerScorbot->setSholderPos( 0 , false);
00089 armControllerScorbot->setElbowPos( 0 , false);
00090 armControllerScorbot->setWrist1Pos(0 , false);
00091 armControllerScorbot->setWrist2Pos(0 , false);
00092 while(!armControllerScorbot->isFinishMove())
00093 {
00094 usleep(1000);
00095 }
00096
00097 LERROR("*** INTERRUPT ***");
00098 exit(0);
00099 }
00100 double getDistance(const double* pos, const double* desire)
00101 {
00102
00103
00104 double sum = 0;
00105 for(int i=0;i<3;i++)
00106 sum+= (pos[i]-desire[i])*(pos[i]-desire[i]);
00107 return sqrt(sum);
00108 }
00109
00110
00111
00112
00113
00114 ArmController::JointPos getIK(LWPR_Model& ik_model, const double* desiredPos)
00115 {
00116 double joints[5];
00117 #ifdef LWPR
00118 lwpr_predict(&ik_model, desiredPos, 0.001, joints, NULL, NULL);
00119 #endif
00120
00121 ArmController::JointPos jointPos;
00122
00123 jointPos.base = (int)joints[0];
00124 jointPos.sholder = (int)joints[1];
00125 jointPos.elbow = (int)joints[2];
00126 jointPos.wrist1 = (int)joints[3];
00127 jointPos.wrist2 = (int)joints[4];
00128 jointPos.gripper = 0;
00129
00130 LDEBUG("Mapping %0.2f %0.2f %0.2f => %i %i %i %i %i",
00131 desiredPos[0], desiredPos[1], desiredPos[2],
00132 jointPos.base, jointPos.sholder, jointPos.elbow,
00133 jointPos.wrist1, jointPos.wrist2);
00134 return jointPos;
00135 }
00136 Point2D<int> getClick(nub::soft_ref<OutputFrameSeries> &ofs)
00137 {
00138 const nub::soft_ref<ImageDisplayStream> ids =
00139 ofs->findFrameDestType<ImageDisplayStream>();
00140
00141 const rutz::shared_ptr<XWinManaged> uiwin =
00142 ids.is_valid()
00143 ? ids->getWindow("Output")
00144 : rutz::shared_ptr<XWinManaged>();
00145 return uiwin->getLastMouseClick();
00146 }
00147
00148 void trainArm(LWPR_Model& ik_model, const double* armPos, const ArmController::JointPos& jointPos)
00149 {
00150
00151 double joints[5];
00152 double pJoints[5];
00153 LDEBUG("Training => %0.2f,%0.2f,%0.2f => %i %i %i %i %i",
00154 armPos[0], armPos[1], armPos[2],
00155 jointPos.base, jointPos.sholder, jointPos.elbow,
00156 jointPos.wrist1, jointPos.wrist2);
00157
00158 joints[0] = jointPos.base;
00159 joints[1] = jointPos.sholder;
00160 joints[2] = jointPos.elbow;
00161 joints[3] = jointPos.wrist1;
00162 joints[4] = jointPos.wrist2;
00163 #ifdef LWPR
00164 lwpr_update(&ik_model, armPos, joints, pJoints, NULL);
00165 #endif
00166
00167 }
00168
00169
00170 ArmController::JointPos calcGradient(const double* desiredPos)
00171 {
00172
00173 ArmController::JointPos jointPos = armControllerArmSim->getJointPos();
00174 ArmController::JointPos tmpJointPos = jointPos;
00175
00176 double dist1, dist2;
00177 double baseGrad, sholderGrad, elbowGrad;
00178 double err = getDistance(armSim->getEndPos(), desiredPos);
00179
00180
00181 tmpJointPos.base = jointPos.base + 100;
00182 armControllerArmSim->setJointPos(tmpJointPos);
00183 dist1 = getDistance(armSim->getEndPos(), desiredPos);
00184
00185 tmpJointPos.base = jointPos.base - 100;
00186 armControllerArmSim->setJointPos(tmpJointPos);
00187 dist2 = getDistance(armSim->getEndPos(), desiredPos);
00188 baseGrad = dist1 - dist2;
00189 tmpJointPos.base = jointPos.base;
00190
00191
00192 tmpJointPos.sholder = jointPos.sholder + 100;
00193 armControllerArmSim->setJointPos(tmpJointPos);
00194 dist1 = getDistance(armSim->getEndPos(), desiredPos);
00195 tmpJointPos.sholder = jointPos.sholder - 100;
00196 armControllerArmSim->setJointPos(tmpJointPos);
00197 dist2 = getDistance(armSim->getEndPos(), desiredPos);
00198 sholderGrad = dist1 - dist2;
00199 tmpJointPos.sholder = jointPos.sholder;
00200
00201
00202 tmpJointPos.elbow = jointPos.elbow + 100;
00203 armControllerArmSim->setJointPos(tmpJointPos);
00204 dist1 = getDistance(armSim->getEndPos(), desiredPos);
00205 tmpJointPos.elbow = jointPos.elbow - 100;
00206 armControllerArmSim->setJointPos(tmpJointPos);
00207 dist2 = getDistance(armSim->getEndPos(), desiredPos);
00208 elbowGrad = dist1 - dist2;
00209 tmpJointPos.elbow = jointPos.elbow;
00210
00211 int moveThresh = (int)(err*100000);
00212 jointPos.base -= (int)(randomUpToIncluding(moveThresh)*baseGrad);
00213 jointPos.sholder -= (int)(randomUpToIncluding(moveThresh)*sholderGrad);
00214 jointPos.elbow -= (int)(randomUpToIncluding(moveThresh)*elbowGrad);
00215
00216 return jointPos;
00217 }
00218
00219
00220 int getKey(nub::soft_ref<OutputFrameSeries> &ofs)
00221 {
00222 const nub::soft_ref<ImageDisplayStream> ids =
00223 ofs->findFrameDestType<ImageDisplayStream>();
00224
00225 const rutz::shared_ptr<XWinManaged> uiwin =
00226 ids.is_valid()
00227 ? ids->getWindow("Output")
00228 : rutz::shared_ptr<XWinManaged>();
00229 return uiwin->getLastKeyPress();
00230 }
00231 void output()
00232 {
00233 double *pos = armSim->getEndPos();
00234 printf("%f %f %f ",pos[0],pos[1],pos[2]);
00235 printf("%d %d %d\n",armControllerArmSim->getBase(),
00236 armControllerArmSim->getSholder(),
00237 armControllerArmSim->getElbow());
00238 }
00239 void sync()
00240 {
00241 int basePos = armControllerArmSim->getBase();
00242 int sholderPos = armControllerArmSim->getSholder();
00243 int elbowPos = armControllerArmSim->getElbow();
00244 int wrist1Pos = armControllerArmSim->getWrist1();
00245 int wrist2Pos = armControllerArmSim->getWrist2();
00246
00247 elbowPos +=sholderPos;
00248
00249 armControllerScorbot->setBasePos( basePos , false);
00250 armControllerScorbot->setSholderPos( sholderPos , false);
00251 sleep(2);
00252 armControllerScorbot->setElbowPos( -1*elbowPos , false);
00253 sleep(2);
00254
00255 wrist1Pos += (int)((0.2496*(float)-1*elbowPos)-39.746) ;
00256 wrist2Pos -= (int)((0.2496*(float)-1*elbowPos)-39.746) ;
00257 armControllerScorbot->setWrist1Pos( wrist1Pos , false);
00258 armControllerScorbot->setWrist2Pos( wrist2Pos , false);
00259
00260 output();
00261
00262 }
00263
00264 void moveMotor(int motor,int move)
00265 {
00266 switch(motor)
00267 {
00268 case 0:
00269 armControllerArmSim->setBasePos(move, true);
00270 break;
00271 case 1:
00272 armControllerArmSim->setSholderPos(move, true);
00273 break;
00274 case 2:
00275 armControllerArmSim->setElbowPos(move, true);
00276 break;
00277 default:
00278 break;
00279 }
00280 while(!armControllerArmSim->isFinishMove())
00281 {
00282 armSim->simLoop();
00283 usleep(1000);
00284 }
00285 }
00286 bool gibbsSampling(double *desire,double errThres)
00287 {
00288
00289
00290 double current_distance = getDistance(armSim->getEndPos(),desire);
00291 double prev_distance = current_distance;
00292 errThres = errThres * errThres;
00293 int moveThres = 200;
00294 if(current_distance < 0.02)
00295 moveThres /= 2;
00296 if(current_distance < 0.01)
00297 moveThres /= 2;
00298 if(current_distance < errThres){
00299
00300 return true;
00301 }
00302 do{
00303 int motor = randomUpToIncluding(2);
00304 int move = randomUpToIncluding(moveThres*2)-moveThres;
00305
00306 LINFO("Move motor %d with %d dist %f",motor,move,current_distance);
00307 prev_distance = current_distance;
00308 moveMotor(motor,move);
00309 current_distance = getDistance(armSim->getEndPos(),desire);
00310 LINFO("Motor moved %d with %d dist %f",motor,move,current_distance);
00311
00312
00313 if(current_distance > prev_distance)
00314 {
00315 moveMotor(motor,-move);
00316 }
00317 }while(current_distance > prev_distance);
00318
00319 return false;
00320 }
00321 bool gibbsControl(double *desire,double d)
00322 {
00323 double *current = armSim->getEndPos();
00324 double distance = getDistance(armSim->getEndPos(),desire);
00325
00326 double errThresForSampling = d;
00327 double v[3],nextPoint[3];
00328
00329
00330
00331
00332 if(getDistance(armSim->getEndPos(),desire) < 0.01){
00333 LINFO("Move by gibbs only");
00334 errThresForSampling = d;
00335 return gradient(desire,errThresForSampling);
00336 }else{
00337 for(int i=0;i<3;i++)
00338 {
00339 v[i] = desire[i] - current[i];
00340 v[i] = v[i]/distance;
00341 nextPoint[i] = current[i]+(distance/2)*v[i];
00342 }
00343 while(!gradient(nextPoint,errThresForSampling));
00344 sync();
00345 LINFO("Move to next point %f %f %f %f",nextPoint[0],nextPoint[1],nextPoint[2],getDistance(armSim->getEndPos(),nextPoint));
00346
00347 }
00348
00349 return false;
00350
00351 }
00352 bool gradient(double *desire,double errThres)
00353 {
00354 int gradient_base = armSim->getGradientEncoder(RobotArm::BASE,desire);
00355 int gradient_sholder= armSim->getGradientEncoder(RobotArm::SHOLDER,desire);
00356 int gradient_elbow = armSim->getGradientEncoder(RobotArm::ELBOW,desire);
00357 gradient_base =(int)((double)gradient_base*(-483/63));
00358 gradient_sholder=(int)((double)gradient_sholder*(-2606/354));
00359 gradient_elbow =(int)((double)gradient_elbow*(-46/399));
00360 errThres = errThres * errThres;
00361 LINFO("Gradient: %d %d %d dist %f",gradient_base,gradient_sholder,gradient_elbow,
00362 getDistance(armSim->getEndPos(),desire));
00363 if(getDistance(armSim->getEndPos(),desire) > errThres){
00364 moveMotor(0,gradient_base/10);
00365 moveMotor(1,gradient_sholder/10);
00366 moveMotor(2,gradient_elbow/10);
00367
00368 }else{
00369 return true;
00370 }
00371 return false;
00372 }
00373 int main(const int argc, const char **argv)
00374 {
00375 MYLOGVERB = LOG_INFO;
00376 LWPR_Model ik_model;
00377
00378 nub::soft_ref<OutputFrameSeries> ofs(new OutputFrameSeries(*mgr));
00379 mgr->addSubComponent(ofs);
00380
00381 mgr->addSubComponent(armControllerScorbot);
00382 mgr->addSubComponent(armControllerArmSim);
00383
00384
00385 nub::soft_ref<BeoHeadBrain> beoHeadBrain(new BeoHeadBrain(*mgr));
00386 mgr->addSubComponent(beoHeadBrain);
00387
00388 nub::soft_ref<GeneralGUI> armSimGUI(new GeneralGUI(*mgr));
00389 mgr->addSubComponent(armSimGUI);
00390 nub::soft_ref<GeneralGUI> scorbotGUI(new GeneralGUI(*mgr));
00391 mgr->addSubComponent(scorbotGUI);
00392
00393 mgr->exportOptions(MC_RECURSE);
00394
00395 if (mgr->parseCommandLine(
00396 (const int)argc, (const char**)argv, "", 0, 0) == false)
00397 return 1;
00398
00399 signal(SIGHUP, terminate); signal(SIGINT, terminate);
00400 signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00401 signal(SIGALRM, terminate);
00402
00403 #ifdef LWPR
00404 int numWarnings = 0;
00405 lwpr_read_xml(&ik_model, "ik_model.xml", &numWarnings);
00406 #endif
00407
00408 mgr->start();
00409
00410 initRandomNumbers();
00411
00412
00413
00414 armSimGUI->startThread(ofs);
00415 sleep(1);
00416
00417
00418
00419
00420
00421 armSimGUI->addMeter(armControllerArmSim->getBasePtr(),
00422 "Sim_Base", -3000, PixRGB<byte>(0, 255, 0));
00423 armSimGUI->addMeter(armControllerArmSim->getSholderPtr(),
00424 "Sim_Sholder", -3000, PixRGB<byte>(0, 255, 0));
00425 armSimGUI->addMeter(armControllerArmSim->getElbowPtr(),
00426 "Sim_Elbow", -3000, PixRGB<byte>(0, 255, 0));
00427 armSimGUI->addMeter(armControllerArmSim->getWrist1Ptr(),
00428 "Sim_Wrist1", -3000, PixRGB<byte>(0, 255, 0));
00429 armSimGUI->addMeter(armControllerArmSim->getWrist2Ptr(),
00430 "Sim_Wrist2", -3000, PixRGB<byte>(0, 255, 0));
00431
00432 armSimGUI->addMeter(armControllerScorbot->getBasePtr(),
00433 "Motor_Base", -3000, PixRGB<byte>(0, 255, 0));
00434 armSimGUI->addMeter(armControllerScorbot->getSholderPtr(),
00435 "Motor_Sholder", -3000, PixRGB<byte>(0, 255, 0));
00436 armSimGUI->addMeter(armControllerScorbot->getElbowPtr(),
00437 "Motor_Elbow", -3000, PixRGB<byte>(0, 255, 0));
00438 armSimGUI->addMeter(armControllerScorbot->getWrist1Ptr(),
00439 "Motor_Wrist1", -3000, PixRGB<byte>(0, 255, 0));
00440 armSimGUI->addMeter(armControllerScorbot->getWrist2Ptr(),
00441 "Motor_Wrist2", -3000, PixRGB<byte>(0, 255, 0));
00442
00443 armSimGUI->addImage(armControllerArmSim->getPIDImagePtr());
00444
00445 beoHeadBrain->initHead();
00446
00447 armControllerScorbot->setMotorsOn(true);
00448 armControllerArmSim->setMotorsOn(true);
00449 armControllerScorbot->setPidOn(true);
00450 armControllerArmSim->setPidOn(true);
00451
00452
00453 ArmController::JointPos jointPos;
00454 jointPos.base = 8000;
00455 jointPos.sholder = 5000;
00456 jointPos.elbow = 5000;
00457 jointPos.wrist1 = 0;
00458 jointPos.wrist2 = 0;
00459
00460
00461
00462
00463
00464 armControllerArmSim->setMaxJointPos(jointPos);
00465
00466 jointPos.base = -8000;
00467 jointPos.sholder = -1500;
00468 jointPos.elbow = -3000;
00469 jointPos.wrist1 = 0;
00470 jointPos.wrist2 = 0;
00471 armControllerArmSim->setMinJointPos(jointPos);
00472
00473
00474
00475
00476
00477 jointPos.base = 0;
00478 jointPos.sholder = 0;
00479 jointPos.elbow = 0;
00480 jointPos.wrist1 = 0;
00481 jointPos.wrist2 = 0;
00482 armControllerArmSim->setJointPos(jointPos);
00483
00484
00485 jointPos.base = 7431;
00486 jointPos.sholder = 3264;
00487 jointPos.elbow = 4630;
00488 jointPos.wrist1 = 9999;
00489 jointPos.wrist2 = 9999;
00490 armControllerScorbot->setMaxJointPos(jointPos);
00491
00492 jointPos.base = -5647;
00493 jointPos.sholder = -1296;
00494 jointPos.elbow = -2900;
00495 jointPos.wrist1 = -9999;
00496 jointPos.wrist2 = -9999;
00497 armControllerScorbot->setMinJointPos(jointPos);
00498
00499
00500 bool isGibbs = false;
00501 double *desireObject = desireBlock;
00502 armSim->addObject(ArmSim::BOX,desireObject);
00503
00504 bool reachComplete = true;
00505 int numReaches = 0;
00506 int numTries = 0;
00507 while(1)
00508 {
00509 armSim->simLoop();
00510 Image<PixRGB<byte> > armCam = flipVertic(armSim->getFrame(-1));
00511
00512 Image< PixRGB<byte> > inputImg = beoHeadBrain->getLeftEyeImg();
00513
00514 Image<PixRGB<byte> > simCam = flipVertic(armSim->getFrame(-1));
00515
00516
00517 if (!inputImg.initialized())
00518 continue;
00519
00520 Point2D<int> targetLoc = beoHeadBrain->getTargetLoc();
00521
00522 if (targetLoc.isValid())
00523 drawCircle(inputImg, targetLoc, 3, PixRGB<byte>(255,0,0));
00524
00525 simCam += inputImg/2;
00526
00527 Layout<PixRGB<byte> > outDisp;
00528 outDisp = vcat(outDisp, hcat(inputImg, simCam));
00529 outDisp = hcat(outDisp, armCam);
00530 ofs->writeRgbLayout(outDisp, "Output", FrameInfo("Output", SRC_POS));
00531
00532 Point2D<int> clickLoc = getClick(ofs);
00533 if (clickLoc.isValid())
00534 {
00535 LINFO("clickPos %ix%i", clickLoc.i, clickLoc.j);
00536 int screenx = clickLoc.i%320;
00537 double loc[3];
00538 armSim->getObjLoc(screenx, clickLoc.j, loc);
00539 LINFO("Loc %f,%f,%f", loc[0], loc[1], loc[2]);
00540 desireObject[0] = loc[0];
00541 desireObject[1] = loc[1];
00542 desireObject[2] = 0.04;
00543 armSim->moveObject(desireObject);
00544
00545
00546
00547 ArmController::JointPos jointPos = getIK(ik_model, desireObject);
00548
00549
00550 armControllerArmSim->setJointPos(jointPos);
00551
00552 }
00553
00554 numTries++;
00555
00556
00557 double *armPos = armSim->getEndPos();
00558 LDEBUG("Pos %f %f %f", armPos[0], armPos[1], armPos[2]);
00559
00560
00561 double err = getDistance(armPos, desireObject);
00562 if (!reachComplete)
00563 LINFO("Err %f tries %i: reaches=%i", err, numTries, numReaches);
00564
00565 if (err > 0.01)
00566 {
00567
00568 jointPos = calcGradient(desireObject);
00569
00570 armControllerArmSim->setJointPos(jointPos);
00571
00572 jointPos = armControllerArmSim->getJointPos();
00573 armPos = armSim->getEndPos();
00574
00575 trainArm(ik_model, armPos, jointPos);
00576 } else {
00577 reachComplete = true;
00578 numReaches++;
00579
00580
00581 #ifdef LWPR
00582 lwpr_write_xml(&ik_model, "ik_model.xml");
00583 #endif
00584 }
00585
00586 int key = getKey(ofs);
00587 if (key != -1)
00588 {
00589 switch(key)
00590 {
00591
00592
00593 case 10:
00594 armControllerArmSim->setBasePos(10, true);
00595 LINFO("Sim Base: %d",armControllerArmSim->getBase());
00596 break;
00597 case 24:
00598 armControllerArmSim->setBasePos(-10, true);
00599 break;
00600 case 11:
00601 armControllerArmSim->setSholderPos(-10, true);
00602 break;
00603 case 25:
00604 armControllerArmSim->setSholderPos(10, true);
00605 break;
00606 case 12:
00607 armControllerArmSim->setElbowPos(10, true);
00608 break;
00609 case 26:
00610 armControllerArmSim->setElbowPos(-10, true);
00611 break;
00612 case 13:
00613 armControllerArmSim->setWrist1Pos(10, true);
00614 break;
00615 case 27:
00616 armControllerArmSim->setWrist1Pos(-10, true);
00617 break;
00618 case 14:
00619 armControllerArmSim->setWrist2Pos(10, true);
00620 break;
00621 case 28:
00622 armControllerArmSim->setWrist2Pos(-10, true);
00623 break;
00624 case 15:
00625
00626 armControllerScorbot->setGripper(0);
00627 break;
00628 case 29:
00629
00630 armControllerScorbot->setGripper(1);
00631 break;
00632 case 65:
00633 armControllerArmSim->killMotors();
00634 armControllerScorbot->killMotors();
00635 break;
00636 case 41:
00637 armControllerScorbot->setWrist1Pos(10, true);
00638 armControllerScorbot->setWrist2Pos(10, true);
00639 break;
00640 case 55:
00641 armControllerScorbot->setWrist1Pos(-10, true);
00642 armControllerScorbot->setWrist2Pos(-10, true);
00643 break;
00644 case 42:
00645 gradient(desireObject,0.005);
00646 break;
00647 case 56:
00648 armControllerScorbot->setWrist1Pos(-10, true);
00649 armControllerScorbot->setWrist2Pos(10, true);
00650 break;
00651 case 57:
00652 LINFO("Set gibbs true");
00653 isGibbs = true;
00654 break;
00655 case 39:
00656 LINFO("Sync robot");
00657 sync();
00658 break;
00659 case 43:
00660 armControllerScorbot->setElbowPos( 0 , false);
00661 sleep(2);
00662 armControllerScorbot->setWrist1Pos( 0, false);
00663 armControllerScorbot->setWrist2Pos( 0 ,false);
00664 armControllerScorbot->setSholderPos( 0 , false);
00665 armControllerScorbot->setBasePos( 0 , false);
00666 armControllerScorbot->setGripper(1);
00667
00668 armControllerArmSim->setWrist1Pos( 0, false);
00669 armControllerArmSim->setWrist2Pos( 0 ,false);
00670 armControllerArmSim->setElbowPos( 0 , false);
00671 armControllerArmSim->setSholderPos( 0 , false);
00672 armControllerArmSim->setBasePos( 0 , false);
00673 break;
00674
00675 }
00676 output();
00677
00678 LINFO("Key = %i", key);
00679 }
00680 if(isGibbs){
00681
00682 if(gradient(desireObject,0.005)){
00683
00684 sync();
00685
00686 if(desireObject == desireBlock){
00687
00688
00689
00690
00691
00692
00693
00694
00695 }else{
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708 }
00709 }
00710
00711 }
00712
00713 }
00714 mgr->stop();
00715
00716 return 0;
00717
00718 }
00719