249 #include <yarp/os/all.h>
250 #include <yarp/dev/all.h>
251 #include <yarp/sig/Vector.h>
252 #include <yarp/math/Math.h>
253 #include <yarp/math/Rand.h>
255 #include <iCub/ctrl/neuralNetworks.h>
256 #include <iCub/iKin/iKinFwd.h>
258 #define DEFAULT_THR_PER 20
268 #define FACE_HAPPY ("hap")
269 #define FACE_SAD ("sad")
270 #define FACE_ANGRY ("ang")
271 #define FACE_SHY ("shy")
272 #define FACE_EVIL ("evi")
273 #define FACE_CUNNING ("cun")
274 #define FACE_SURPRISED ("sur")
277 #define STATE_REACH 1
278 #define STATE_CHECKMOTIONDONE 2
279 #define STATE_RELEASE 3
283 using namespace yarp::os;
284 using namespace yarp::sig;
285 using namespace yarp::dev;
286 using namespace yarp::math;
287 using namespace iCub::ctrl;
288 using namespace iCub::iKin;
294 ff2LayNN_tansig_purelin net;
297 bool configure(Property &options)
299 if (net.configure(options))
301 net.printStructure();
308 Vector predict(
const Vector &head, Bottle *imdLeft, Bottle *imdRight)
310 Bottle *firstBlobLeft=imdLeft->get(0).asList();
311 Bottle *firstBlobRight=imdRight->get(0).asList();
317 in[3]=firstBlobLeft->get(0).asFloat64();
318 in[4]=firstBlobLeft->get(1).asFloat64();
319 in[5]=firstBlobRight->get(0).asFloat64();
320 in[6]=firstBlobRight->get(1).asFloat64();
322 return net.predict(in);
327 class managerThread :
public PeriodicThread
336 std::vector<string> speech_grasp;
337 std::vector<string> speech_reach;
338 std::vector<string> speech_idle;
348 PolyDriver *drvTorso, *drvHead, *drvLeftArm, *drvRightArm;
349 PolyDriver *drvCartLeftArm, *drvCartRightArm;
350 PolyDriver *drvGazeCtrl;
354 IControlMode *modeTorso;
355 IPositionControl *posTorso;
357 IControlMode *modeArm;
358 IPositionControl *posArm;
359 ICartesianControl *cartArm;
360 IGazeControl *gazeCtrl;
362 BufferedPort<Bottle> inportTrackTarget;
363 BufferedPort<Bottle> inportIMDTargetLeft;
364 BufferedPort<Bottle> inportIMDTargetRight;
369 RpcClient breatherHrpc;
370 RpcClient breatherLArpc;
371 RpcClient breatherRArpc;
372 RpcClient blinkerrpc;
373 RpcClient lookSkinrpc;
374 BufferedPort<Bottle> gazeboMoverPort;
376 Vector leftArmReachOffs;
377 Vector leftArmGraspOffs;
378 Vector leftArmHandOrien;
379 Vector leftArmJointsStiffness;
380 Vector leftArmJointsDamping;
382 Vector rightArmReachOffs;
383 Vector rightArmGraspOffs;
384 Vector rightArmHandOrien;
385 Vector rightArmJointsStiffness;
386 Vector rightArmJointsDamping;
388 Vector *armReachOffs;
389 Vector *armGraspOffs;
390 Vector *armHandOrien;
392 Vector homePoss, homeVels;
397 bool leftGraspEnable;
398 bool rightGraspEnable;
399 bool leftArmImpVelMode;
400 bool rightArmImpVelMode;
404 double idleTimer, idleTmo;
406 double sphereRadius, sphereTmo;
412 Vector openHandPoss, closeHandPoss;
422 bool state_breathers;
423 int startup_context_id_left;
424 int startup_context_id_right;
425 int startup_context_id_gaze;
427 void breathersHandler(
const bool sw)
430 msg.addString(sw?
"start":
"stop");
432 if (breatherHrpc.getOutputCount()>0)
434 breatherHrpc.write(msg);
437 if (breatherLArpc.getOutputCount()>0)
439 breatherLArpc.write(msg);
442 if (breatherRArpc.getOutputCount()>0)
444 breatherRArpc.write(msg);
447 if (blinkerrpc.getOutputCount()>0)
449 blinkerrpc.write(msg);
452 if (lookSkinrpc.getOutputCount()>0)
454 lookSkinrpc.write(msg);
457 state_breathers = !sw;
460 void sendSpeak(
const string &txt)
462 if (outportSpeech.getOutputCount()>0)
466 outportSpeech.write(msg);
470 void getTorsoOptions(Bottle &b,
const char *type,
const int i, Vector &sw, Matrix &lim)
474 Bottle &grp=b.findGroup(type);
475 sw[i]=grp.get(1).asString()==
"on"?1.0:0.0;
477 if (grp.check(
"min",
"Getting minimum value"))
480 lim(i,1)=grp.find(
"min").asFloat64();
483 if (grp.check(
"max",
"Getting maximum value"))
486 lim(i,3)=grp.find(
"max").asFloat64();
491 void getArmOptions(Bottle &b,
bool &graspEnable, Vector &reachOffs,
492 Vector &graspOffs, Vector &orien,
bool &impVelMode,
493 Vector &impStiff, Vector &impDamp)
495 graspEnable=b.check(
"grasp_enable",Value(
"on"),
"Getting arm grasp mode").asString()==
"on"?
true:
false;
497 if (b.check(
"reach_offset",
"Getting reaching offset"))
499 Bottle &grp=b.findGroup(
"reach_offset");
503 for (
int i=0; i<len; i++)
504 reachOffs[i]=grp.get(1+i).asFloat64();
507 if (b.check(
"grasp_offset",
"Getting grasping offset"))
509 Bottle &grp=b.findGroup(
"grasp_offset");
513 for (
int i=0; i<len; i++)
514 graspOffs[i]=grp.get(1+i).asFloat64();
517 if (b.check(
"hand_orientation",
"Getting hand orientation"))
519 Bottle &grp=b.findGroup(
"hand_orientation");
523 for (
int i=0; i<len; i++)
524 orien[i]=grp.get(1+i).asFloat64();
527 impVelMode=b.check(
"impedance_velocity_mode",Value(
"off"),
"Getting arm impedance-velocity-mode").asString()==
"on"?
true:
false;
529 if (b.check(
"impedance_stiffness",
"Getting joints stiffness"))
531 Bottle &grp=b.findGroup(
"impedance_stiffness");
532 size_t sz=grp.size()-1;
533 size_t len=sz>impStiff.length()?impStiff.length():sz;
535 for (
size_t i=0; i<len; i++)
536 impStiff[i]=grp.get(1+i).asFloat64();
539 if (b.check(
"impedance_damping",
"Getting joints damping"))
541 Bottle &grp=b.findGroup(
"impedance_damping");
542 size_t sz=grp.size()-1;
543 size_t len=sz>impDamp.length()?impDamp.length():sz;
545 for (
size_t i=0; i<len; i++)
546 impDamp[i]=grp.get(1+i).asFloat64();
550 bool getHomeOptions(Bottle &b, Vector &poss, Vector &vels)
553 if (b.check(
"poss",
"Getting home poss"))
555 Bottle &grp=b.findGroup(
"poss");
559 for (
int i=0; i<len; i++)
560 poss[i]=grp.get(1+i).asFloat64();
564 yError(
"Missing 'poss' parameter");
568 if (b.check(
"vels",
"Getting home vels"))
570 Bottle &grp=b.findGroup(
"vels");
574 for (
int i=0; i<len; i++)
575 vels[i]=grp.get(1+i).asFloat64();
579 yError(
"Missing 'vels' parameter");
585 bool getGraspOptions(Bottle &b, Vector &openPoss, Vector &closePoss, Vector &vels)
588 if (b.check(
"open_hand",
"Getting openHand poss"))
590 Bottle &grp=b.findGroup(
"open_hand");
594 for (
int i=0; i<len; i++)
595 openPoss[i]=grp.get(1+i).asFloat64();
599 yError(
"Missing 'open_hand' parameter");
603 if (b.check(
"close_hand",
"Getting closeHand poss"))
605 Bottle &grp=b.findGroup(
"close_hand");
609 for (
int i=0; i<len; i++)
610 closePoss[i]=grp.get(1+i).asFloat64();
614 yError(
"Missing 'close_hand' parameter");
618 if (b.check(
"vels_hand",
"Getting hand vels"))
620 Bottle &grp=b.findGroup(
"vels_hand");
624 for (
int i=0; i<len; i++)
625 vels[i]=grp.get(1+i).asFloat64();
629 yError(
"Missing 'vels_hand' parameter");
635 void getSpeechOptions(Bottle &b, std::vector<string> &grasp,
636 std::vector<string> &reach, std::vector<string> &idle)
638 Bottle &bSpeechGrasp=b.findGroup(
"speech_grasp");
639 for (
int i=1; i<bSpeechGrasp.size(); i++)
641 std::string str = bSpeechGrasp.get(i).asList()->toString();
642 str.erase(std::remove(str.begin(), str.end(),
'\"'), str.end());
643 grasp.push_back(str);
646 Bottle &bSpeechReach=b.findGroup(
"speech_reach");
647 for (
int i=1; i<bSpeechReach.size(); i++)
649 std::string str = bSpeechReach.get(i).asList()->toString();
650 str.erase(std::remove(str.begin(), str.end(),
'\"'), str.end());
651 reach.push_back(str);
654 Bottle &bSpeechIdle=b.findGroup(
"speech_idle");
655 for (
int i=1; i<bSpeechIdle.size(); i++)
657 std::string str = bSpeechIdle.get(i).asList()->toString();
658 str.erase(std::remove(str.begin(), str.end(),
'\"'), str.end());
663 void initCartesianCtrl(
const Vector &sw,
const Matrix &lim,
const int sel=USEDARM)
665 ICartesianControl *icart=cartArm;
673 drvCartLeftArm->view(icart);
674 icart->storeContext(&startup_context_id_left);
675 icart->restoreContext(0);
682 else if (sel==RIGHTARM)
686 drvCartRightArm->view(icart);
687 icart->storeContext(&startup_context_id_right);
688 icart->restoreContext(0);
695 else if (armSel!=NOARM)
696 type=armSel==LEFTARM?
"left_arm":
"right_arm";
700 yInfo(
"*** Initializing %s controller ...",type.c_str());
702 icart->setTrackingMode(
false);
703 icart->setTrajTime(trajTime);
704 icart->setInTargetTol(reachTol);
708 icart->getInfo(info);
709 auto hwver=iKinLimbVersion(info.find(
"arm_version").asString());
715 if (hwver>=iKinLimbVersion(
"3.0"))
720 lim_.setSubrow(lim.getRow(1),0,0);
721 lim_.setSubrow(lim.getRow(0),1,0);
724 for (
size_t j=0; j<sw_.length(); j++)
727 if ((sw_[j]!=0.0) && ((lim_(j,0)!=0.0) || (lim_(j,2)!=0.0)))
730 icart->getLimits(j,&min,&max);
738 bool ok=icart->setLimits(j,min,max);
739 yInfo(
"jnt #%d in [%g, %g] deg => %s",(
int)j,min,max,ok?
"ok":
"failed");
744 else if (dof.size()>7)
746 dof[0]=dof[1]=dof[2]=0.0;
747 yInfo(
"Disabled torso joints");
750 icart->setDOF(dof,dof);
751 yInfo(
"DOF=(%s)",dof.toString(0,1).c_str());
756 bool newTarget=
false;
758 if (encTorso->getEncoders(torso.data()))
759 R=rotx(torso[1])*roty(-torso[2])*rotz(-torso[0]);
760 encHead->getEncoders(head.data());
764 Bottle *imdTargetLeft=inportIMDTargetLeft.read(
false);
765 Bottle *imdTargetRight=inportIMDTargetRight.read(
false);
767 if ((imdTargetLeft!=NULL) && (imdTargetRight!=NULL))
771 gazeCtrl->getLeftEyePose(x,o);
773 gazeCtrl->getRightEyePose(x,o);
775 Matrix T=axis2dcm(o);
778 Vector netout=pred.predict(head,imdTargetLeft,imdTargetRight);
779 netout.push_back(1.0);
780 targetPos=(T*netout).subVector(0,2);
784 else if (Bottle *targetPosNew=inportTrackTarget.read(
false))
786 if (targetPosNew->size()>6)
788 if (targetPosNew->get(6).asFloat64()==1.0)
791 fp[0]=targetPosNew->get(0).asFloat64();
792 fp[1]=targetPosNew->get(1).asFloat64();
793 fp[2]=targetPosNew->get(2).asFloat64();
796 if ((isnan(fp[0])==0) && (isnan(fp[1])==0) && (isnan(fp[2])==0))
800 gazeCtrl->getLeftEyePose(x,o);
802 gazeCtrl->getRightEyePose(x,o);
804 Matrix T=axis2dcm(o);
808 targetPos.pop_back();
817 idleTimer=Time::now();
819 if (state==STATE_IDLE)
822 breathersHandler(
false);
823 yInfo(
"--- Got target => REACHING");
827 if(useSpeech) sendSpeak(speech_reach[(
int)Rand::scalar(0,speech_reach.size()-1e-3)]);
830 else if (((state==STATE_IDLE) || (state==STATE_REACH)) &&
831 ((Time::now()-idleTimer)>idleTmo) && !wentHome && !simulation)
833 yInfo(
"--- Target timeout => IDLE");
838 steerArmToHome(LEFTARM);
839 steerArmToHome(RIGHTARM);
843 if(useSpeech) sendSpeak(speech_idle[(
int)Rand::scalar(0,speech_idle.size()-1e-3)]);
850 if (state==STATE_IDLE)
853 if (checkForHomePos())
854 breathersHandler(
true);
858 bool checkForHomePos()
862 if (useLeftArm) drvLeftArm->view(iencsLA);
863 if (useRightArm) drvRightArm->view(iencsRA);
865 if (breatherHrpc.getOutputCount()>0)
868 gazeCtrl->checkMotionDone(&done);
876 if (useLeftArm && breatherLArpc.getOutputCount()>0)
878 iencsLA->getAxes(&axes);
879 encs.resize(axes,0.0);
880 iencsLA->getEncoders(encs.data());
881 if (norm(encs.subVector(0,homePoss.length()-1)-homePoss)>4.0)
885 if (useRightArm && breatherRArpc.getOutputCount()>0)
887 iencsRA->getAxes(&axes);
888 encs.resize(axes,0.0);
889 iencsRA->getEncoders(encs.data());
890 if (norm(encs.subVector(0,homePoss.length()-1)-homePoss)>4.0)
899 if (state!=STATE_IDLE)
901 gazeCtrl->lookAtFixationPoint(targetPos);
903 if (outportGui.getOutputCount()>0)
906 obj.addString(
"object");
907 obj.addString(
"ball");
910 obj.addFloat64(50.0);
911 obj.addFloat64(50.0);
912 obj.addFloat64(50.0);
915 obj.addFloat64(1000.0*targetPos[0]);
916 obj.addFloat64(1000.0*targetPos[1]);
917 obj.addFloat64(1000.0*targetPos[2]);
932 outportGui.write(obj);
937 void steerHeadToHome()
945 yInfo(
"*** Homing head");
947 gazeCtrl->lookAtFixationPoint(homeHead);
950 void steerTorsoToHome()
961 yInfo(
"*** Homing torso");
963 vector<int> modes(3,VOCAB_CM_POSITION);
964 modeTorso->setControlModes(modes.data());
966 posTorso->setRefSpeeds(velTorso.data());
967 posTorso->positionMove(homeTorso.data());
970 void checkTorsoHome(
const double timeout=10.0)
975 yInfo(
"*** Checking torso home position... ");
978 double t0=Time::now();
979 while (!done && (Time::now()-t0<timeout))
981 posTorso->checkMotionDone(&done);
988 void steerArmToHome(
const int sel=USEDARM)
990 IControlMode *imode=modeArm;
991 IPositionControl *ipos=posArm;
998 drvLeftArm->view(imode);
999 drvLeftArm->view(ipos);
1006 else if (sel==RIGHTARM)
1010 drvRightArm->view(imode);
1011 drvRightArm->view(ipos);
1018 else if (armSel!=NOARM)
1019 type=armSel==LEFTARM?
"left_arm":
"right_arm";
1023 yInfo(
"*** Homing %s",type.c_str());
1024 for (
size_t j=0; j<homeVels.length(); j++)
1025 imode->setControlMode(j,VOCAB_CM_POSITION);
1027 for (
size_t j=0; j<homeVels.length(); j++)
1029 ipos->setRefSpeed(j,homeVels[j]);
1030 ipos->positionMove(j,homePoss[j]);
1036 void checkArmHome(
const int sel=USEDARM,
const double timeout=10.0)
1038 IPositionControl *ipos=posArm;
1044 drvLeftArm->view(ipos);
1050 else if (sel==RIGHTARM)
1053 drvRightArm->view(ipos);
1059 else if (armSel!=NOARM)
1060 type=armSel==LEFTARM?
"left_arm":
"right_arm";
1064 yInfo(
"*** Checking %s home position... ",type.c_str());
1067 double t0=Time::now();
1068 while (!done && (Time::now()-t0<timeout))
1070 ipos->checkMotionDone(&done);
1077 void stopArmJoints(
const int sel=USEDARM)
1079 IEncoders *ienc=encArm;
1080 IControlMode *imode=modeArm;
1081 IPositionControl *ipos=posArm;
1088 drvLeftArm->view(ienc);
1089 drvLeftArm->view(imode);
1090 drvLeftArm->view(ipos);
1097 else if (sel==RIGHTARM)
1101 drvRightArm->view(ienc);
1102 drvRightArm->view(imode);
1103 drvRightArm->view(ipos);
1110 else if (armSel!=NOARM)
1111 type=armSel==LEFTARM?
"left_arm":
"right_arm";
1115 yInfo(
"*** Stopping %s joints",type.c_str());
1116 for (
size_t j=0; j<homeVels.length(); j++)
1117 imode->setControlMode(j,VOCAB_CM_POSITION);
1119 for (
size_t j=0; j<homeVels.length(); j++)
1122 ienc->getEncoder(j,&fb);
1123 ipos->positionMove(j,fb);
1127 void moveHand(
const int action,
const int sel=USEDARM)
1129 IControlMode *imode=modeArm;
1130 IPositionControl *ipos=posArm;
1132 string actionStr, type;
1138 actionStr=
"Opening";
1142 poss=&closeHandPoss;
1143 actionStr=
"Closing";
1152 drvLeftArm->view(imode);
1153 drvLeftArm->view(ipos);
1156 else if (sel==RIGHTARM)
1158 drvRightArm->view(imode);
1159 drvRightArm->view(ipos);
1163 type=armSel==LEFTARM?
"left_hand":
"right_hand";
1165 yInfo(
"*** %s %s",actionStr.c_str(),type.c_str());
1166 for (
size_t j=0; j<handVels.length(); j++)
1167 imode->setControlMode(homeVels.length()+j,VOCAB_CM_POSITION);
1169 for (
size_t j=0; j<handVels.length(); j++)
1171 int k=homeVels.length()+j;
1172 ipos->setRefSpeed(k,handVels[j]);
1173 ipos->positionMove(k,(*poss)[j]);
1177 void openHand(
const int sel=USEDARM)
1179 moveHand(OPENHAND,sel);
1182 void closeHand(
const int sel=USEDARM)
1184 moveHand(CLOSEHAND,sel);
1189 if (useLeftArm && useRightArm)
1191 if (state==STATE_REACH)
1194 if ((armSel==LEFTARM) && (targetPos[1]>hystThres) ||
1195 (armSel==RIGHTARM) && (targetPos[1]<-hystThres))
1197 yInfo(
"*** Change arm event triggered");
1198 state=STATE_CHECKMOTIONDONE;
1199 latchTimer=Time::now();
1202 else if (state==STATE_CHECKMOTIONDONE)
1205 cartArm->checkMotionDone(&done);
1208 if (Time::now()-latchTimer>3.0*trajTime)
1210 yInfo(
"--- Timeout elapsed => FORCE STOP and CHANGE ARM");
1221 if (armSel==RIGHTARM)
1225 drvLeftArm->view(encArm);
1226 drvLeftArm->view(modeArm);
1227 drvLeftArm->view(posArm);
1228 drvCartLeftArm->view(cartArm);
1229 armReachOffs=&leftArmReachOffs;
1230 armGraspOffs=&leftArmGraspOffs;
1231 armHandOrien=&leftArmHandOrien;
1237 drvRightArm->view(encArm);
1238 drvRightArm->view(modeArm);
1239 drvRightArm->view(posArm);
1240 drvCartRightArm->view(cartArm);
1241 armReachOffs=&rightArmReachOffs;
1242 armGraspOffs=&rightArmGraspOffs;
1243 armHandOrien=&rightArmHandOrien;
1246 yInfo(
"*** Using %s",armSel==LEFTARM?
"left_arm":
"right_arm");
1256 if (useLeftArm || useRightArm)
1258 if (state==STATE_REACH)
1260 Vector x=R.transposed()*(targetPos+*armReachOffs);
1264 cartArm->goToPoseSync(x,*armHandOrien);
1271 if (useLeftArm || useRightArm)
1273 if (state==STATE_REACH)
1275 if (checkTargetForGrasp() && checkArmForGrasp())
1277 Vector x=R.transposed()*(targetPos+*armGraspOffs);
1281 yInfo(
"--- Hand in position AND Target still => GRASPING");
1282 yInfo(
"--- Target in %s",targetPos.toString().c_str());
1283 yInfo(
"*** Grasping x=%s",x.toString().c_str());
1286 if(useSpeech) sendSpeak(speech_grasp[(
int)Rand::scalar(0,speech_grasp.size()-1e-3)]);
1288 cartArm->goToPoseSync(x,*armHandOrien);
1291 latchTimer=Time::now();
1292 state=STATE_RELEASE;
1302 if (useLeftArm || useRightArm)
1304 if (state==STATE_RELEASE)
1306 if ((Time::now()-latchTimer)>releaseTmo)
1308 yInfo(
"--- Timeout elapsed => RELEASING");
1312 latchTimer=Time::now();
1321 if (useLeftArm || useRightArm)
1323 if (state==STATE_WAIT)
1325 if ((Time::now()-latchTimer)>idleTmo)
1327 yInfo(
"--- Timeout elapsed => IDLING");
1337 if (state==STATE_IDLE)
1338 setFace(state_breathers?FACE_SHY:FACE_HAPPY);
1339 else if (state==STATE_REACH)
1341 if (useLeftArm || useRightArm)
1343 if (checkArmForGrasp())
1346 setFace(FACE_ANGRY);
1351 else if (state==STATE_WAIT)
1352 setFace(FACE_HAPPY);
1355 bool checkArmForGrasp()
1358 cartArm->getPose(x,o);
1361 if (norm(targetPos+*armReachOffs-x)<sphereRadius)
1367 bool checkTargetForGrasp()
1369 const double t=Time::now();
1372 if (norm(targetPos-sphereCenter)>sphereRadius)
1377 else if ((t-latchTimer<sphereTmo) || (t-idleTimer>1.0))
1383 void resetTargetBall()
1385 latchTimer=Time::now();
1386 sphereCenter=targetPos;
1391 if (useLeftArm || useRightArm)
1393 yInfo(
"stopping control");
1394 cartArm->stopControl();
1399 void setFace(
const string &type)
1403 out.addVocab32(
"set");
1404 out.addVocab32(
"mou");
1405 out.addVocab32(type);
1406 outportCmdFace.write(out,in);
1410 out.addVocab32(
"set");
1411 out.addVocab32(
"leb");
1412 out.addVocab32(type);
1413 outportCmdFace.write(out,in);
1417 out.addVocab32(
"set");
1418 out.addVocab32(
"reb");
1419 out.addVocab32(type);
1420 outportCmdFace.write(out,in);
1423 void limitRange(Vector &x)
1425 x[0]=x[0]>-0.1 ? -0.1 : x[0];
1428 Matrix &rotx(
const double theta)
1430 double t=CTRL_DEG2RAD*theta;
1441 Matrix &roty(
const double theta)
1443 double t=CTRL_DEG2RAD*theta;
1454 Matrix &rotz(
const double theta)
1456 double t=CTRL_DEG2RAD*theta;
1467 void deleteGuiTarget()
1469 if (outportGui.getOutputCount()>0)
1472 obj.addString(
"delete");
1473 obj.addString(
"ball");
1474 outportGui.write(obj);
1484 delete drvCartLeftArm;
1485 delete drvCartRightArm;
1488 inportTrackTarget.interrupt();
1489 inportTrackTarget.close();
1491 inportIMDTargetLeft.interrupt();
1492 inportIMDTargetLeft.close();
1494 inportIMDTargetRight.interrupt();
1495 inportIMDTargetRight.close();
1497 setFace(FACE_HAPPY);
1498 outportCmdFace.interrupt();
1499 outportCmdFace.close();
1502 outportGui.interrupt();
1505 outportSpeech.interrupt();
1506 outportSpeech.close();
1508 breatherHrpc.close();
1509 breatherLArpc.close();
1510 breatherRArpc.close();
1512 lookSkinrpc.close();
1515 gazeboMoverPort.interrupt();
1516 gazeboMoverPort.close();
1521 managerThread(
const string &_name, ResourceFinder &_rf) :
1522 PeriodicThread((double)DEFAULT_THR_PER/1000.0), name(_name), rf(_rf)
1524 drvTorso=drvHead=drvLeftArm=drvRightArm=NULL;
1525 drvCartLeftArm=drvCartRightArm=NULL;
1532 Bottle &bGeneral=rf.findGroup(
"general");
1533 robot=bGeneral.check(
"robot",Value(
"icub"),
"Getting robot name").asString();
1534 useLeftArm=bGeneral.check(
"left_arm",Value(
"on"),
"Getting left arm use flag").asString()==
"on"?
true:
false;
1535 useRightArm=bGeneral.check(
"right_arm",Value(
"on"),
"Getting right arm use flag").asString()==
"on"?
true:
false;
1536 useTorso=bGeneral.check(
"torso",Value(
"on"),
"Getting torso use flag").asString()==
"on"?
true:
false;
1537 useSpeech=bGeneral.check(
"speech",Value(
"on"),
"Getting speech use flag").asString()==
"on"?
true:
false;
1538 useNetwork=bGeneral.check(
"use_network",Value(
"off"),
"Getting network enable").asString()==
"on"?
true:
false;
1539 simulation=bGeneral.check(
"simulation",Value(
"off"),
"Getting simulation enable").asString()==
"on"?
true:
false;
1540 trajTime=bGeneral.check(
"traj_time",Value(2.0),
"Getting trajectory time").asFloat64();
1541 reachTol=bGeneral.check(
"reach_tol",Value(0.01),
"Getting reaching tolerance").asFloat64();
1542 eyeUsed=bGeneral.check(
"eye",Value(
"left"),
"Getting the used eye").asString();
1543 idleTmo=bGeneral.check(
"idle_tmo",Value(1e10),
"Getting idle timeout").asFloat64();
1544 setPeriod((
double)bGeneral.check(
"thread_period",Value(DEFAULT_THR_PER),
"Getting thread period [ms]").asInt32()/1000.0);
1548 yWarning(
"Part \"torso\" is not employed!");
1552 Bottle &bTorso=rf.findGroup(
"torso");
1554 Vector torsoSwitch(3); torsoSwitch.zero();
1555 Matrix torsoLimits(3,4); torsoLimits.zero();
1557 getTorsoOptions(bTorso,
"pitch",0,torsoSwitch,torsoLimits);
1558 getTorsoOptions(bTorso,
"roll",1,torsoSwitch,torsoLimits);
1559 getTorsoOptions(bTorso,
"yaw",2,torsoSwitch,torsoLimits);
1562 Bottle &bLeftArm=rf.findGroup(
"left_arm");
1563 Bottle &bRightArm=rf.findGroup(
"right_arm");
1565 leftArmReachOffs.resize(3,0.0);
1566 leftArmGraspOffs.resize(3,0.0);
1567 leftArmHandOrien.resize(4,0.0);
1568 leftArmJointsStiffness.resize(5,0.0);
1569 leftArmJointsDamping.resize(5,0.0);
1570 rightArmReachOffs.resize(3,0.0);
1571 rightArmGraspOffs.resize(3,0.0);
1572 rightArmHandOrien.resize(4,0.0);
1573 rightArmJointsStiffness.resize(5,0.0);
1574 rightArmJointsDamping.resize(5,0.0);
1576 getArmOptions(bLeftArm,leftGraspEnable,leftArmReachOffs,leftArmGraspOffs,
1577 leftArmHandOrien,leftArmImpVelMode,leftArmJointsStiffness,leftArmJointsDamping);
1578 getArmOptions(bRightArm,rightGraspEnable,rightArmReachOffs,rightArmGraspOffs,
1579 rightArmHandOrien,rightArmImpVelMode,rightArmJointsStiffness,rightArmJointsDamping);
1582 Bottle &bHome=rf.findGroup(
"home_arm");
1583 homePoss.resize(7,0.0); homeVels.resize(7,0.0);
1584 if (!getHomeOptions(bHome, homePoss, homeVels)) { yError (
"Error in parameters section 'home_arm'");
return false; }
1587 Bottle &bArmSel=rf.findGroup(
"arm_selection");
1588 hystThres=bArmSel.check(
"hysteresis_thres",Value(0.0),
"Getting hysteresis threshold").asFloat64();
1591 Bottle &bGrasp=rf.findGroup(
"grasp");
1592 sphereRadius=bGrasp.check(
"sphere_radius",Value(0.0),
"Getting sphere radius").asFloat64();
1593 sphereTmo=bGrasp.check(
"sphere_tmo",Value(0.0),
"Getting sphere timeout").asFloat64();
1594 releaseTmo=bGrasp.check(
"release_tmo",Value(0.0),
"Getting release timeout").asFloat64();
1596 openHandPoss.resize(9,0.0); closeHandPoss.resize(9,0.0);
1597 handVels.resize(9,0.0);
1599 if(!getGraspOptions(bGrasp, openHandPoss, closeHandPoss, handVels)) { yError (
"Error in parameters section 'grasp'");
return false; }
1605 options.fromConfigFile(rf.findFile(bGeneral.check(
"network",Value(
"network.ini"),
1606 "Getting network data").asString()));
1608 if (!pred.configure(options))
1613 inportTrackTarget.open(name+
"/trackTarget:i");
1614 inportIMDTargetLeft.open(name+
"/imdTargetLeft:i");
1615 inportIMDTargetRight.open(name+
"/imdTargetRight:i");
1616 outportCmdFace.open(name+
"/cmdFace:rpc");
1617 outportGui.open(name+
"/gui:o");
1618 outportSpeech.open(name+
"/speech:o");
1619 breatherHrpc.open(name+
"/breather/head:rpc");
1620 breatherLArpc.open(name+
"/breather/left_arm:rpc");
1621 breatherRArpc.open(name+
"/breather/right_arm:rpc");
1622 blinkerrpc.open(name+
"/blinker:rpc");
1623 lookSkinrpc.open(name+
"/lookSkin:rpc");
1627 gazeboMoverPort.open(name+
"/gazebo:o");
1628 if (!Network::connect(gazeboMoverPort.getName(),
"/red-ball/mover:i"))
1630 yError()<<
"Unable to connect to the redball mover!";
1631 gazeboMoverPort.interrupt();
1632 gazeboMoverPort.close();
1644 Property optTorso(
"(device remote_controlboard)");
1645 Property optHead(
"(device remote_controlboard)");
1646 Property optLeftArm(
"(device remote_controlboard)");
1647 Property optRightArm(
"(device remote_controlboard)");
1649 optTorso.put(
"remote",fwslash+robot+
"/torso");
1650 optTorso.put(
"local",name+
"/torso");
1652 optHead.put(
"remote",fwslash+robot+
"/head");
1653 optHead.put(
"local",name+
"/head");
1655 optLeftArm.put(
"remote",fwslash+robot+
"/left_arm");
1656 optLeftArm.put(
"local",name+
"/left_arm");
1658 optRightArm.put(
"remote",fwslash+robot+
"/right_arm");
1659 optRightArm.put(
"local",name+
"/right_arm");
1663 drvTorso=
new PolyDriver;
1664 if (!drvTorso->open(optTorso))
1671 drvHead=
new PolyDriver;
1672 if (!drvHead->open(optHead))
1680 drvLeftArm=
new PolyDriver;
1681 if (!drvLeftArm->open(optLeftArm))
1690 drvRightArm=
new PolyDriver;
1691 if (!drvRightArm->open(optRightArm))
1699 Property optCartLeftArm(
"(device cartesiancontrollerclient)");
1700 Property optCartRightArm(
"(device cartesiancontrollerclient)");
1701 Property optGazeCtrl(
"(device gazecontrollerclient)");
1703 optCartLeftArm.put(
"remote",fwslash+robot+
"/cartesianController/left_arm");
1704 optCartLeftArm.put(
"local",name+
"/left_arm/cartesian");
1706 optCartRightArm.put(
"remote",fwslash+robot+
"/cartesianController/right_arm");
1707 optCartRightArm.put(
"local",name+
"/right_arm/cartesian");
1709 optGazeCtrl.put(
"remote",
"/iKinGazeCtrl");
1710 optGazeCtrl.put(
"local",name+
"/gaze");
1714 drvCartLeftArm=
new PolyDriver;
1715 if (!drvCartLeftArm->open(optCartLeftArm))
1721 if (leftArmImpVelMode)
1723 IInteractionMode *imode;
1724 IImpedanceControl *iimp;
1726 drvLeftArm->view(imode);
1727 drvLeftArm->view(iimp);
1729 int len=leftArmJointsStiffness.length()<leftArmJointsDamping.length()?
1730 leftArmJointsStiffness.length():leftArmJointsDamping.length();
1732 for (
int j=0; j<len; j++)
1734 iimp->setImpedance(j,leftArmJointsStiffness[j],leftArmJointsDamping[j]);
1735 imode->setInteractionMode(j,VOCAB_IM_COMPLIANT);
1742 drvCartRightArm=
new PolyDriver;
1743 if (!drvCartRightArm->open(optCartRightArm))
1749 if (rightArmImpVelMode)
1751 IInteractionMode *imode;
1752 IImpedanceControl *iimp;
1754 drvRightArm->view(imode);
1755 drvRightArm->view(iimp);
1757 int len=rightArmJointsStiffness.length()<rightArmJointsDamping.length()?
1758 rightArmJointsStiffness.length():rightArmJointsDamping.length();
1760 for (
int j=0; j<len; j++)
1762 iimp->setImpedance(j,rightArmJointsStiffness[j],rightArmJointsDamping[j]);
1763 imode->setInteractionMode(j,VOCAB_IM_COMPLIANT);
1768 drvGazeCtrl=
new PolyDriver;
1769 if (!drvGazeCtrl->open(optGazeCtrl))
1778 drvTorso->view(modeTorso);
1779 drvTorso->view(encTorso);
1780 drvTorso->view(posTorso);
1789 drvHead->view(encHead);
1790 drvGazeCtrl->view(gazeCtrl);
1792 gazeCtrl->storeContext(&startup_context_id_gaze);
1793 gazeCtrl->restoreContext(0);
1794 gazeCtrl->blockNeckRoll(0.0);
1795 gazeCtrl->setSaccadesActivationAngle(20.0);
1796 gazeCtrl->setSaccadesInhibitionPeriod(1.0);
1800 drvLeftArm->view(encArm);
1801 drvLeftArm->view(modeArm);
1802 drvLeftArm->view(posArm);
1803 drvCartLeftArm->view(cartArm);
1804 armReachOffs=&leftArmReachOffs;
1805 armGraspOffs=&leftArmGraspOffs;
1806 armHandOrien=&leftArmHandOrien;
1809 else if (useRightArm)
1811 drvRightArm->view(encArm);
1812 drvRightArm->view(modeArm);
1813 drvRightArm->view(posArm);
1814 drvCartRightArm->view(cartArm);
1815 armReachOffs=&rightArmReachOffs;
1816 armGraspOffs=&rightArmGraspOffs;
1817 armHandOrien=&rightArmHandOrien;
1836 encTorso->getAxes(&torsoAxes);
1837 torso.resize(torsoAxes,0.0);
1841 encHead->getAxes(&headAxes);
1842 head.resize(headAxes,0.0);
1844 targetPos.resize(3,0.0);
1845 R=Rx=Ry=Rz=eye(3,3);
1849 initCartesianCtrl(torsoSwitch,torsoLimits,LEFTARM);
1853 initCartesianCtrl(torsoSwitch,torsoLimits,RIGHTARM);
1860 steerArmToHome(LEFTARM);
1861 steerArmToHome(RIGHTARM);
1863 idleTimer=Time::now();
1867 state_breathers=
true;
1873 Bottle &bSpeech=rf.findGroup(
"speech");
1874 if (bSpeech.size()>0)
1876 getSpeechOptions(bSpeech,speech_grasp,speech_reach,speech_idle);
1880 yWarning(
"no speech group has been found even though speech flag option was true!");
1881 yWarning(
"setting speech flag option to false.");
1889 bool updateBall(
const double &x,
const double &y,
const double &z)
1893 if (gazeboMoverPort.getOutputCount() > 0)
1899 gazeboMoverPort.prepare() = pose;
1900 gazeboMoverPort.writeStrict();
1908 void startDemo(
const Vector& lookat)
1910 if (lookat.length() == 3)
1912 gazeCtrl->lookAtAbsAnglesSync(lookat);
1913 gazeCtrl->waitMotionDone(.1, 5.);
1925 steerArmToHome(LEFTARM);
1926 steerArmToHome(RIGHTARM);
1929 if(useSpeech) sendSpeak(speech_idle[(
int)Rand::scalar(0,speech_idle.size()-1e-3)]);
1942 if (((armSel==LEFTARM) && leftGraspEnable) ||
1943 ((armSel==RIGHTARM) && rightGraspEnable))
1954 void threadRelease()
1959 steerArmToHome(LEFTARM);
1960 steerArmToHome(RIGHTARM);
1962 checkTorsoHome(3.0);
1963 checkArmHome(LEFTARM,3.0);
1964 checkArmHome(RIGHTARM,3.0);
1968 ICartesianControl *icart;
1969 drvCartLeftArm->view(icart);
1970 icart->restoreContext(startup_context_id_left);
1972 if (leftArmImpVelMode)
1974 IInteractionMode *imode;
1975 drvLeftArm->view(imode);
1977 int len=leftArmJointsStiffness.length()<leftArmJointsDamping.length()?
1978 leftArmJointsStiffness.length():leftArmJointsDamping.length();
1980 for (
int j=0; j<len; j++)
1981 imode->setInteractionMode(j,VOCAB_IM_STIFF);
1987 ICartesianControl *icart;
1988 drvCartRightArm->view(icart);
1989 icart->restoreContext(startup_context_id_right);
1991 if (rightArmImpVelMode)
1993 IInteractionMode *imode;
1994 drvRightArm->view(imode);
1996 int len=rightArmJointsStiffness.length()<rightArmJointsDamping.length()?
1997 rightArmJointsStiffness.length():rightArmJointsDamping.length();
1999 for (
int j=0; j<len; j++)
2000 imode->setInteractionMode(j,VOCAB_IM_STIFF);
2004 gazeCtrl->restoreContext(startup_context_id_gaze);
2011 class managerModule:
public RFModule
2020 bool configure(ResourceFinder &rf)
2022 thr=
new managerThread(getName(),rf);
2029 rpcPort.open(getName(
"/rpc"));
2037 rpcPort.interrupt();
2046 bool respond(
const Bottle& cmd, Bottle& reply)
override
2048 if (cmd.get(0).asString() ==
"update_pose")
2052 yError() <<
"Requires x y z";
2053 reply.addVocab32(
"fail");
2056 double x=cmd.get(1).asFloat64();
2057 double y=cmd.get(2).asFloat64();
2058 double z=cmd.get(3).asFloat64();
2059 bool ok=thr->updateBall(x,y,z);
2062 reply.addVocab32(
"ok");
2066 reply.addVocab32(
"fail");
2069 if (cmd.get(0).asString() ==
"start")
2075 lookat[0]=cmd.get(1).asFloat64();
2076 lookat[1]=cmd.get(2).asFloat64();
2077 lookat[2]=cmd.get(3).asFloat64();
2079 thr->startDemo(lookat);
2080 reply.addVocab32(
"ok");
2082 if (cmd.get(0).asString() ==
"stop")
2085 reply.addVocab32(
"ok");
2090 double getPeriod() {
return 1.0; }
2091 bool updateModule() {
return true; }
2095 int main(
int argc,
char *argv[])
2098 if (!yarp.checkNetwork())
2100 yError(
"YARP server not available!");
2105 rf.setDefaultContext(
"demoRedBall");
2106 rf.setDefaultConfigFile(
"config.ini");
2107 rf.configure(argc,argv);
2110 mod.setName(
"/demoRedBall");
2112 return mod.runModule(rf);