945 Bottle &intrinsicsLeft=options.addList();
946 intrinsicsLeft.addString(
"camera_intrinsics_left");
947 Bottle &intrinsicsLeftValues=intrinsicsLeft.addList();
948 Matrix PrjL;
int wL,hL;
950 for (
int r=0; r<PrjL.rows(); r++)
951 for (
int c=0; c<PrjL.cols(); c++)
952 intrinsicsLeftValues.addFloat64(PrjL(r,c));
954 Bottle &widthLeft=options.addList();
955 widthLeft.addString(
"camera_width_left");
956 widthLeft.addInt32(wL);
957 Bottle &heightLeft=options.addList();
958 heightLeft.addString(
"camera_height_left");
959 heightLeft.addInt32(hL);
961 Bottle &intrinsicsRight=options.addList();
962 intrinsicsRight.addString(
"camera_intrinsics_right");
963 Bottle &intrinsicsRightValues=intrinsicsRight.addList();
964 Matrix PrjR;
int wR,hR;
966 for (
int r=0; r<PrjR.rows(); r++)
967 for (
int c=0; c<PrjR.cols(); c++)
968 intrinsicsRightValues.addFloat64(PrjR(r,c));
970 Bottle &widthRight=options.addList();
971 widthRight.addString(
"camera_width_right");
972 widthRight.addInt32(wR);
973 Bottle &heightRight=options.addList();
974 heightRight.addString(
"camera_height_right");
975 heightRight.addInt32(hR);
977 Bottle &extrinsicsLeft=options.addList();
978 extrinsicsLeft.addString(
"camera_extrinsics_left");
979 Bottle &extrinsicsLeftValues=extrinsicsLeft.addList();
982 for (
int r=0; r<HL.rows(); r++)
983 for (
int c=0; c<HL.cols(); c++)
984 extrinsicsLeftValues.addFloat64(HL(r,c));
986 Bottle &extrinsicsRight=options.addList();
987 extrinsicsRight.addString(
"camera_extrinsics_right");
988 Bottle &extrinsicsRightValues=extrinsicsRight.addList();
991 for (
int r=0; r<HR.rows(); r++)
992 for (
int c=0; c<HR.cols(); c++)
993 extrinsicsRightValues.addFloat64(HR(r,c));
1114 double ping_robot_tmo;
1115 Vector counterRotGain(2);
1121 Bottle &imuGroup=
rf.findGroup(
"imu");
1122 Bottle &eyeTiltGroup=
rf.findGroup(
"eye_tilt");
1123 Bottle &trajTimeGroup=
rf.findGroup(
"trajectory_time");
1124 Bottle &camerasGroup=
rf.findGroup(
"cameras");
1125 Bottle &tweakGroup=
rf.findGroup(
"tweak");
1128 ctrlName=
rf.check(
"name",Value(
"iKinGazeCtrl")).asString();
1129 headName=
rf.check(
"head",Value(
"head")).asString();
1130 torsoName=
rf.check(
"torso",Value(
"torso")).asString();
1131 neckTime=trajTimeGroup.check(
"neck",Value(0.75)).asFloat64();
1132 eyesTime=trajTimeGroup.check(
"eyes",Value(0.25)).asFloat64();
1133 min_abs_vel=
CTRL_DEG2RAD*fabs(
rf.check(
"min_abs_vel",Value(0.0)).asFloat64());
1134 ping_robot_tmo=
rf.check(
"ping_robot_tmo",Value(40.0)).asFloat64();
1136 auto head_version=
rf.check(
"head_version",Value(
"v1.0")).asString();
1137 if ((head_version.length()<2) || (tolower(head_version[0])!=
'v'))
1139 yWarning(
"Unrecognized \"head_version\" %s; going with default version",head_version.c_str());
1140 head_version=
"v1.0";
1157 counterRotGain[0]=imuGroup.check(
"vor",Value(1.0)).asFloat64();
1158 counterRotGain[1]=
rf.check(
"ocr",Value(0.0)).asFloat64();
1162 counterRotGain[0]=imuGroup.check(
"vor",Value(0.0)).asFloat64();
1163 counterRotGain[1]=
rf.check(
"ocr",Value(1.0)).asFloat64();
1166 if (camerasGroup.check(
"file"))
1168 camerasGroup.check(
"context")?
1171 commData.
rf_cameras.setDefaultConfigFile(camerasGroup.find(
"file").asString().c_str());
1191 float imuTimeout {0.04F};
1193 if (imuGroup.check(
"source_port_name"))
1194 remoteInertialName=imuGroup.find(
"source_port_name").asString();
1195 if (imuGroup.check(
"timeout"))
1196 imuTimeout=imuGroup.find(
"timeout").asFloat32();
1198 Property optTorso(
"(device remote_controlboard)");
1199 optTorso.put(
"remote",remoteTorsoName);
1200 optTorso.put(
"local",localTorsoName);
1201 optTorso.put(
"part",torsoName);
1203 Property optHead(
"(device remote_controlboard)");
1204 optHead.put(
"remote",remoteHeadName);
1205 optHead.put(
"local",localHeadName);
1206 optHead.put(
"part",headName);
1209 optHead.put(
"writeStrict",
"on");
1211 if (torsoName!=
"off")
1215 new PolyDriver(optTorso);
1219 yWarning(
"Torso device driver not available!");
1220 yWarning(
"Perhaps only the head is running; trying to continue ...");
1228 yWarning(
"Torso device is off!");
1234 new PolyDriver(optHead);
1238 yError(
"Head device driver not available!");
1244 Property mas_conf{{
"device", Value(
"multipleanalogsensorsclient")},
1245 {
"remote", Value(remoteInertialName)},
1246 {
"local", Value(localInertialName)},
1247 {
"timeout",Value(imuTimeout)}};
1251 yError(
"Unable to open the MAS client");
1259 yError(
"View failed of the MAS interfaces");
1268 yWarning(
"IMU data will be not received/used");
1272 yDebug(
"Commands to robot will be also streamed out on debug port");
1303 bool respond(
const Bottle &command, Bottle &reply)
override
1305 int ack=Vocab32::encode(
"ack");
1306 int nack=Vocab32::encode(
"nack");
1308 if (command.size()>0)
1310 switch (command.get(0).asVocab32())
1313 case createVocab32(
'g',
'e',
't'):
1315 if (command.size()>1)
1317 int type=command.get(1).asVocab32();
1319 if (type==createVocab32(
'T',
'n',
'e',
'c'))
1321 reply.addVocab32(
ack);
1325 else if (type==createVocab32(
'T',
'e',
'y',
'e'))
1327 reply.addVocab32(
ack);
1331 else if (type==createVocab32(
'v',
'o',
'r'))
1334 reply.addVocab32(
ack);
1335 reply.addFloat64(gain[0]);
1338 else if (type==createVocab32(
'o',
'c',
'r'))
1341 reply.addVocab32(
ack);
1342 reply.addFloat64(gain[1]);
1345 else if (type==createVocab32(
's',
'a',
'c',
'c'))
1347 reply.addVocab32(
ack);
1351 else if (type==createVocab32(
's',
'i',
'n',
'h'))
1353 reply.addVocab32(
ack);
1357 else if (type==createVocab32(
's',
'a',
'c',
't'))
1359 reply.addVocab32(
ack);
1363 else if (type==createVocab32(
't',
'r',
'a',
'c'))
1365 reply.addVocab32(
ack);
1369 else if (type==createVocab32(
's',
't',
'a',
'b'))
1371 reply.addVocab32(
ack);
1375 else if (type==createVocab32(
'd',
'o',
'n',
'e'))
1377 reply.addVocab32(
ack);
1381 else if (type==createVocab32(
's',
'd',
'o',
'n'))
1383 reply.addVocab32(
ack);
1387 else if (type==createVocab32(
'p',
'i',
't',
'c'))
1389 double min_deg,max_deg;
1392 reply.addVocab32(
ack);
1393 reply.addFloat64(min_deg);
1394 reply.addFloat64(max_deg);
1397 else if (type==createVocab32(
'r',
'o',
'l',
'l'))
1399 double min_deg,max_deg;
1402 reply.addVocab32(
ack);
1403 reply.addFloat64(min_deg);
1404 reply.addFloat64(max_deg);
1407 else if (type==createVocab32(
'y',
'a',
'w'))
1409 double min_deg,max_deg;
1412 reply.addVocab32(
ack);
1413 reply.addFloat64(min_deg);
1414 reply.addFloat64(max_deg);
1417 else if (type==createVocab32(
'e',
'y',
'e',
's'))
1419 reply.addVocab32(
ack);
1423 else if (type==createVocab32(
'n',
't',
'o',
'l'))
1427 reply.addVocab32(
ack);
1428 reply.addFloat64(angle);
1431 else if (type==createVocab32(
'd',
'e',
's'))
1436 reply.addVocab32(
ack);
1437 reply.addList().read(des);
1441 else if (type==createVocab32(
'v',
'e',
'l'))
1446 reply.addVocab32(
ack);
1447 reply.addList().read(vel);
1451 else if ((type==createVocab32(
'p',
'o',
's',
'e')) && (command.size()>2))
1453 string poseSel=command.get(2).asString();
1459 reply.addVocab32(
ack);
1460 reply.addList().read(
x);
1462 Bottle &bStamp=reply.addList();
1463 bStamp.addInt32(stamp.getCount());
1464 bStamp.addFloat64(stamp.getTime());
1469 else if ((type==createVocab32(
'2',
'D')) && (command.size()>2))
1471 if (Bottle *bOpt=command.get(2).asList())
1476 string eye=bOpt->get(0).asString();
1477 x[0]=bOpt->get(1).asFloat64();
1478 x[1]=bOpt->get(2).asFloat64();
1479 x[2]=bOpt->get(3).asFloat64();
1484 reply.addVocab32(
ack);
1485 reply.addList().read(px);
1491 else if ((type==createVocab32(
'3',
'D')) && (command.size()>3))
1493 int subType=command.get(2).asVocab32();
1494 if (subType==createVocab32(
'm',
'o',
'n',
'o'))
1496 if (Bottle *bOpt=command.get(3).asList())
1500 string eye=bOpt->get(0).asString();
1501 double u=bOpt->get(1).asFloat64();
1502 double v=bOpt->get(2).asFloat64();
1503 double z=bOpt->get(3).asFloat64();
1508 reply.addVocab32(
ack);
1509 reply.addList().read(
x);
1515 else if (subType==createVocab32(
's',
't',
'e',
'r'))
1517 if (Bottle *bOpt=command.get(3).asList())
1521 Vector pxl(2),pxr(2);
1522 pxl[0]=bOpt->get(0).asFloat64();
1523 pxl[1]=bOpt->get(1).asFloat64();
1524 pxr[0]=bOpt->get(2).asFloat64();
1525 pxr[1]=bOpt->get(3).asFloat64();
1530 reply.addVocab32(
ack);
1531 reply.addList().read(
x);
1537 else if (subType==createVocab32(
'p',
'r',
'o',
'j'))
1539 if (Bottle *bOpt=command.get(3).asList())
1544 string eye=bOpt->get(0).asString();
1545 double u=bOpt->get(1).asFloat64();
1546 double v=bOpt->get(2).asFloat64();
1547 plane[0]=bOpt->get(3).asFloat64();
1548 plane[1]=bOpt->get(4).asFloat64();
1549 plane[2]=bOpt->get(5).asFloat64();
1550 plane[3]=bOpt->get(6).asFloat64();
1555 reply.addVocab32(
ack);
1556 reply.addList().read(
x);
1562 else if (subType==createVocab32(
'a',
'n',
'g'))
1564 if (Bottle *bOpt=command.get(3).asList())
1569 string type=bOpt->get(0).asString();
1575 reply.addVocab32(
ack);
1576 reply.addList().read(
x);
1582 else if ((type==createVocab32(
'a',
'n',
'g')) && (command.size()>2))
1584 if (Bottle *bOpt=command.get(2).asList())
1589 x[0]=bOpt->get(0).asFloat64();
1590 x[1]=bOpt->get(1).asFloat64();
1591 x[2]=bOpt->get(2).asFloat64();
1594 reply.addVocab32(
ack);
1595 reply.addList().read(ang);
1600 else if (type==createVocab32(
'p',
'i',
'd'))
1605 reply.addVocab32(
ack);
1606 reply.addList()=options;
1609 else if (type==createVocab32(
'i',
'n',
'f',
'o'))
1614 reply.addVocab32(
ack);
1615 reply.addList()=info;
1619 else if (type==createVocab32(
't',
'w',
'e',
'a'))
1624 reply.addVocab32(
ack);
1625 reply.addList()=options;
1635 case createVocab32(
's',
'e',
't'):
1637 if (command.size()>2)
1639 int type=command.get(1).asVocab32();
1640 if (type==createVocab32(
'T',
'n',
'e',
'c'))
1642 double execTime=command.get(2).asFloat64();
1644 reply.addVocab32(
ack);
1647 else if (type==createVocab32(
'T',
'e',
'y',
'e'))
1649 double execTime=command.get(2).asFloat64();
1651 reply.addVocab32(
ack);
1654 else if (type==createVocab32(
'v',
'o',
'r'))
1657 gain[0]=command.get(2).asFloat64();
1659 reply.addVocab32(
ack);
1662 else if (type==createVocab32(
'o',
'c',
'r'))
1665 gain[1]=command.get(2).asFloat64();
1667 reply.addVocab32(
ack);
1670 else if (type==createVocab32(
's',
'a',
'c',
'c'))
1673 reply.addVocab32(
ack);
1676 else if (type==createVocab32(
's',
'i',
'n',
'h'))
1678 double period=command.get(2).asFloat64();
1680 reply.addVocab32(
ack);
1683 else if (type==createVocab32(
's',
'a',
'c',
't'))
1685 double angle=command.get(2).asFloat64();
1687 reply.addVocab32(
ack);
1690 else if (type==createVocab32(
'n',
't',
'o',
'l'))
1692 double angle=command.get(2).asFloat64();
1694 reply.addVocab32(
ack);
1697 else if (type==createVocab32(
't',
'r',
'a',
'c'))
1699 bool mode=(command.get(2).asInt32()>0);
1701 reply.addVocab32(
ack);
1704 else if (type==createVocab32(
's',
't',
'a',
'b'))
1706 bool mode=(command.get(2).asInt32()>0);
1710 else if (type==createVocab32(
'p',
'i',
'd'))
1712 if (Bottle *bOpt=command.get(2).asList())
1715 reply.addVocab32(
ack);
1719 else if (type==createVocab32(
't',
'w',
'e',
'a'))
1721 if (Bottle *bOpt=command.get(2).asList())
1733 case createVocab32(
'l',
'o',
'o',
'k'):
1735 if (command.size()>2)
1737 int type=command.get(1).asVocab32();
1738 if (type==createVocab32(
'3',
'D'))
1740 if (Bottle *bOpt=command.get(2).asList())
1745 x[0]=bOpt->get(0).asFloat64();
1746 x[1]=bOpt->get(1).asFloat64();
1747 x[2]=bOpt->get(2).asFloat64();
1751 reply.addVocab32(
ack);
1757 else if (type==createVocab32(
'm',
'o',
'n',
'o'))
1759 if (Bottle *bOpt=command.get(2).asList())
1763 string eye=bOpt->get(0).asString();
1764 double u=bOpt->get(1).asFloat64();
1765 double v=bOpt->get(2).asFloat64();
1769 if (bOpt->get(3).isFloat64())
1771 z=bOpt->get(3).asFloat64();
1774 else if ((bOpt->get(3).asString()==
"ver") && (bOpt->size()>4))
1776 double ver=bOpt->get(4).asFloat64();
1788 reply.addVocab32(
ack);
1796 else if (type==createVocab32(
's',
't',
'e',
'r'))
1798 if (Bottle *bOpt=command.get(2).asList())
1802 Vector pxl(2),pxr(2);
1803 pxl[0]=bOpt->get(0).asFloat64();
1804 pxl[1]=bOpt->get(1).asFloat64();
1805 pxr[0]=bOpt->get(2).asFloat64();
1806 pxr[1]=bOpt->get(3).asFloat64();
1813 reply.addVocab32(
ack);
1820 else if (type==createVocab32(
'a',
'n',
'g'))
1822 if (Bottle *bOpt=command.get(2).asList())
1827 string type=bOpt->get(0).asString();
1835 reply.addVocab32(
ack);
1847 case createVocab32(
's',
't',
'o',
'p'):
1850 reply.addVocab32(
ack);
1855 case createVocab32(
's',
't',
'o',
'r'):
1859 reply.addVocab32(
ack);
1865 case createVocab32(
'r',
'e',
's',
't'):
1867 if (command.size()>1)
1869 int id=command.get(1).asInt32();
1872 reply.addVocab32(
ack);
1881 case createVocab32(
'd',
'e',
'l'):
1883 if (command.size()>1)
1885 Bottle *ids=command.get(1).asList();
1888 reply.addVocab32(
ack);
1897 case createVocab32(
'b',
'i',
'n',
'd'):
1899 if (command.size()>2)
1901 int joint=command.get(1).asVocab32();
1902 if (joint==createVocab32(
'p',
'i',
't',
'c'))
1904 double min=command.get(2).asFloat64();
1905 double max=command.get(3).asFloat64();
1907 reply.addVocab32(
ack);
1910 else if (joint==createVocab32(
'r',
'o',
'l',
'l'))
1912 double min=command.get(2).asFloat64();
1913 double max=command.get(3).asFloat64();
1915 reply.addVocab32(
ack);
1918 else if (joint==createVocab32(
'y',
'a',
'w'))
1920 double min=command.get(2).asFloat64();
1921 double max=command.get(3).asFloat64();
1923 reply.addVocab32(
ack);
1926 else if (joint==createVocab32(
'e',
'y',
'e',
's'))
1928 double ver=command.get(2).asFloat64();
1930 reply.addVocab32(
ack);
1939 case createVocab32(
'c',
'l',
'e',
'a'):
1941 if (command.size()>1)
1943 int joint=command.get(1).asVocab32();
1944 if (joint==createVocab32(
'p',
'i',
't',
'c'))
1947 reply.addVocab32(
ack);
1950 else if (joint==createVocab32(
'r',
'o',
'l',
'l'))
1953 reply.addVocab32(
ack);
1956 else if (joint==createVocab32(
'y',
'a',
'w'))
1959 reply.addVocab32(
ack);
1962 else if (joint==createVocab32(
'e',
'y',
'e',
's'))
1965 reply.addVocab32(
ack);
1974 case createVocab32(
'r',
'e',
'g',
'i'):
1976 if (command.size()>1)
1978 int type=command.get(1).asVocab32();
1979 if (type==createVocab32(
'o',
'n',
'g',
'o'))
1981 if (command.size()>2)
1983 double checkPoint=command.get(2).asFloat64();
1986 reply.addVocab32(
ack);
1997 case createVocab32(
'u',
'n',
'r',
'e'):
1999 if (command.size()>1)
2001 int type=command.get(1).asVocab32();
2002 if (type==createVocab32(
'o',
'n',
'g',
'o'))
2004 if (command.size()>2)
2006 double checkPoint=command.get(2).asFloat64();
2009 reply.addVocab32(
ack);
2020 case createVocab32(
'l',
'i',
's',
't'):
2022 if (command.size()>1)
2024 int type=command.get(1).asVocab32();
2025 if (type==createVocab32(
'o',
'n',
'g',
'o'))
2027 reply.addVocab32(
ack);
2037 case createVocab32(
's',
'u',
's',
'p'):
2042 reply.addVocab32(
ack);
2047 case createVocab32(
'r',
'u',
'n'):
2052 reply.addVocab32(
ack);
2057 case createVocab32(
's',
't',
'a',
't'):
2059 reply.addVocab32(
ack);
2060 if (
ctrl->isSuspended())
2061 reply.addString(
"suspended");
2063 reply.addString(
"running");
2069 return RFModule::respond(command,reply);
2073 reply.addVocab32(
nack);