28#include <yarp/math/Math.h>
32#define CARTCTRL_CLIENT_VER "2.0"
33#define CARTCTRL_DEFAULT_TMO 0.1
36using namespace yarp::os;
38using namespace yarp::sig;
39using namespace yarp::math;
92 string remote, local, carrier;
94 if (config.check(
"remote"))
95 remote=config.find(
"remote").asString();
99 if (config.check(
"local"))
100 local=config.find(
"local").asString();
105 carrier=config.check(
"carrier",Value(
"udp")).asString();
107 if (config.check(
"timeout"))
108 timeout=config.find(
"timeout").asFloat64();
110 portCmd.open(local+
"/command:o");
116 ok&=Network::connect(
portRpc.getName(),remote+
"/rpc:i");
121 if (info.check(
"server_version"))
123 string server_version=info.find(
"server_version").asString();
126 yError(
"version mismatch => server(%s) != client(%s); please update accordingly",
133 yWarning(
"unable to retrieve server version; please update the server");
137 yError(
"unable to connect to the server rpc port!");
142 ok&=Network::connect(
portCmd.getName(),remote+
"/command:i",carrier);
143 ok&=Network::connect(remote+
"/state:o",
portState.getName(),carrier);
144 ok&=Network::connect(remote+
"/events:o",
portEvents.getName(),carrier);
149 Bottle command, reply;
154 if (!
portRpc.write(command,reply))
156 yError(
"unable to get reply from server!");
166 yError(
"unable to connect to solver!");
172 yError(
"unable to connect to server!");
211 Bottle command, reply;
217 if (!
portRpc.write(command,reply))
219 yError(
"unable to get reply from server!");
233 Bottle command, reply;
237 if (!
portRpc.write(command,reply))
239 yError(
"unable to get reply from server!");
245 int mode=reply.get(1).asVocab32();
267 Bottle command, reply;
273 if (!
portRpc.write(command,reply))
275 yError(
"unable to get reply from server!");
289 Bottle command, reply;
293 if (!
portRpc.write(command,reply))
295 yError(
"unable to get reply from server!");
301 int mode=reply.get(1).asVocab32();
323 Bottle command, reply;
326 command.addString(
p);
328 if (!
portRpc.write(command,reply))
330 yError(
"unable to get reply from server!");
344 Bottle command, reply;
348 if (!
portRpc.write(command,reply))
350 yError(
"unable to get reply from server!");
356 p=reply.get(1).asString();
370 double now=Time::now();
381 o.resize(
pose.length()-
x.length());
383 for (
size_t i=0; i<
x.length(); i++)
386 for (
size_t i=0; i<o.length(); i++)
387 o[i]=
pose[
x.length()+i];
403 Bottle command, reply;
406 command.addInt32(axis);
408 if (!
portRpc.write(command,reply))
410 yError(
"unable to get reply from server!");
416 if (Bottle *posePart=reply.get(1).asList())
419 o.resize(posePart->size()-
x.length());
421 for (
size_t i=0; i<
x.length(); i++)
422 x[i]=posePart->get(i).asFloat64();
424 for (
size_t i=0; i<o.length(); i++)
425 o[i]=posePart->get(
x.length()+i).asFloat64();
427 if ((reply.size()>2) && (stamp!=NULL))
429 if (Bottle *stampPart=reply.get(2).asList())
431 Stamp tmpStamp(stampPart->get(0).asInt32(),
432 stampPart->get(1).asFloat64());
450 if (!
connected || (xd.length()<3) || (od.length()<4))
453 Bottle &command=
portCmd.prepare();
458 command.addFloat64(t);
459 Bottle &xdesPart=command.addList();
461 for (
int i=0; i<3; i++)
462 xdesPart.addFloat64(xd[i]);
464 for (
int i=0; i<4; i++)
465 xdesPart.addFloat64(od[i]);
479 Bottle &command=
portCmd.prepare();
484 command.addFloat64(t);
485 Bottle &xdesPart=command.addList();
487 for (
int i=0; i<3; i++)
488 xdesPart.addFloat64(xd[i]);
500 if (!
connected || (xd.length()<3) || (od.length()<4))
503 Bottle command, reply;
506 command.addFloat64(t);
507 Bottle &xdesPart=command.addList();
509 for (
int i=0; i<3; i++)
510 xdesPart.addFloat64(xd[i]);
512 for (
int i=0; i<4; i++)
513 xdesPart.addFloat64(od[i]);
515 if (!
portRpc.write(command,reply))
517 yError(
"unable to get reply from server!");
531 Bottle command, reply;
534 command.addFloat64(t);
535 Bottle &xdesPart=command.addList();
537 for (
int i=0; i<3; i++)
538 xdesPart.addFloat64(xd[i]);
540 if (!
portRpc.write(command,reply))
542 yError(
"unable to get reply from server!");
557 Bottle command, reply;
561 if (!
portRpc.write(command,reply))
563 yError(
"unable to get reply from server!");
573 Vector &xdhat, Vector &odhat,
579 Bottle command, reply;
580 Vector tg(xd.length()+od.length());
581 for (
size_t i=0; i<xd.length(); i++)
584 for (
size_t i=0; i<od.length(); i++)
585 tg[xd.length()+i]=od[i];
591 if (!
portRpc.write(command,reply))
593 yError(
"unable to get reply from server!");
603 const Vector &od, Vector &xdhat,
604 Vector &odhat, Vector &qdhat)
609 Bottle command, reply;
610 Vector tg(xd.length()+od.length());
611 for (
size_t i=0; i<xd.length(); i++)
614 for (
size_t i=0; i<od.length(); i++)
615 tg[xd.length()+i]=od[i];
622 if (!
portRpc.write(command,reply))
624 yError(
"unable to get reply from server!");
634 Vector &odhat, Vector &qdhat)
639 Bottle command, reply;
644 if (!
portRpc.write(command,reply))
646 yError(
"unable to get reply from server!");
656 Vector &xdhat, Vector &odhat,
662 Bottle command, reply;
668 if (!
portRpc.write(command,reply))
670 yError(
"unable to get reply from server!");
684 Bottle command, reply;
688 if (!
portRpc.write(command,reply))
690 yError(
"unable to get reply from server!");
696 if (Bottle *dofPart=reply.get(1).asList())
698 curDof.resize(dofPart->size());
700 for (
size_t i=0; i<curDof.length(); i++)
701 curDof[i]=dofPart->get(i).asFloat64();
717 Bottle command, reply;
720 Bottle &dofPart=command.addList();
722 for (
size_t i=0; i<newDof.length(); i++)
723 dofPart.addInt32((
int)newDof[i]);
725 if (!
portRpc.write(command,reply))
727 yError(
"unable to get reply from server!");
733 if (Bottle *dofPart=reply.get(1).asList())
735 curDof.resize(dofPart->size());
737 for (
size_t i=0; i<curDof.length(); i++)
738 curDof[i]=dofPart->get(i).asFloat64();
754 Bottle command, reply;
758 if (!
portRpc.write(command,reply))
760 yError(
"unable to get reply from server!");
766 if (Bottle *restPart=reply.get(1).asList())
768 curRestPos.resize(restPart->size());
770 for (
size_t i=0; i<curRestPos.length(); i++)
771 curRestPos[i]=restPart->get(i).asFloat64();
788 Bottle command, reply;
791 command.addList().read(newRestPos);
793 if (!
portRpc.write(command,reply))
795 yError(
"unable to get reply from server!");
801 if (Bottle *restPart=reply.get(1).asList())
803 curRestPos.resize(restPart->size());
804 for (
size_t i=0; i<curRestPos.length(); i++)
805 curRestPos[i]=restPart->get(i).asFloat64();
820 Bottle command, reply;
824 if (!
portRpc.write(command,reply))
826 yError(
"unable to get reply from server!");
832 if (Bottle *restPart=reply.get(1).asList())
834 curRestWeights.resize(restPart->size());
836 for (
size_t i=0; i<curRestWeights.length(); i++)
837 curRestWeights[i]=restPart->get(i).asFloat64();
849 Vector &curRestWeights)
854 Bottle command, reply;
857 command.addList().read(newRestWeights);
859 if (!
portRpc.write(command,reply))
861 yError(
"unable to get reply from server!");
867 if (Bottle *restPart=reply.get(1).asList())
869 curRestWeights.resize(restPart->size());
870 for (
size_t i=0; i<curRestWeights.length(); i++)
871 curRestWeights[i]=restPart->get(i).asFloat64();
884 if (!
connected || (min==NULL) || (max==NULL))
887 Bottle command, reply;
890 command.addInt32(axis);
892 if (!
portRpc.write(command,reply))
894 yError(
"unable to get reply from server!");
902 *min=reply.get(1).asFloat64();
903 *max=reply.get(2).asFloat64();
919 Bottle command, reply;
922 command.addInt32(axis);
923 command.addFloat64(min);
924 command.addFloat64(max);
926 if (!
portRpc.write(command,reply))
928 yError(
"unable to get reply from server!");
942 Bottle command, reply;
946 if (!
portRpc.write(command,reply))
948 yError(
"unable to get reply from server!");
956 *t=reply.get(1).asFloat64();
971 Bottle command, reply;
974 command.addFloat64(t);
976 if (!
portRpc.write(command,reply))
978 yError(
"unable to get reply from server!");
992 Bottle command, reply;
996 if (!
portRpc.write(command,reply))
998 yError(
"unable to get reply from server!");
1006 *tol=reply.get(1).asFloat64();
1021 Bottle command, reply;
1024 command.addFloat64(tol);
1026 if (!
portRpc.write(command,reply))
1028 yError(
"unable to get reply from server!");
1042 Bottle command, reply;
1046 if (!
portRpc.write(command,reply))
1048 yError(
"unable to get reply from server!");
1054 if (Bottle *qdotPart=reply.get(1).asList())
1056 qdot.resize(qdotPart->size());
1058 for (
size_t i=0; i<qdot.length(); i++)
1059 qdot[i]=qdotPart->get(i).asFloat64();
1075 Bottle command, reply;
1079 if (!
portRpc.write(command,reply))
1081 yError(
"unable to get reply from server!");
1087 if (Bottle *xdotPart=reply.get(1).asList())
1090 odot.resize(xdotPart->size()-xdot.length());
1092 for (
size_t i=0; i<xdot.length(); i++)
1093 xdot[i]=xdotPart->get(i).asFloat64();
1095 for (
size_t i=0; i<odot.length(); i++)
1096 odot[i]=xdotPart->get(xdot.length()+i).asFloat64();
1110 if (!
connected || (xdot.length()<3) || (odot.length()<4))
1113 Bottle &command=
portCmd.prepare();
1117 Bottle &xdotPart=command.addList();
1119 for (
int i=0; i<3; i++)
1120 xdotPart.addFloat64(xdot[i]);
1122 for (
int i=0; i<4; i++)
1123 xdotPart.addFloat64(odot[i]);
1134 if (!
connected || (
x.length()<3) || (o.length()<4))
1137 Bottle command, reply;
1140 Bottle &tipPart=command.addList();
1142 for (
int i=0; i<3; i++)
1143 tipPart.addFloat64(
x[i]);
1145 for (
int i=0; i<4; i++)
1146 tipPart.addFloat64(o[i]);
1148 if (!
portRpc.write(command,reply))
1150 yError(
"unable to get reply from server!");
1177 Bottle command, reply;
1181 if (!
portRpc.write(command,reply))
1183 yError(
"unable to get reply from server!");
1189 if (Bottle *tipPart=reply.get(1).asList())
1192 o.resize(tipPart->size()-
x.length());
1194 for (
size_t i=0; i<
x.length(); i++)
1195 x[i]=tipPart->get(i).asFloat64();
1197 for (
size_t i=0; i<o.length(); i++)
1198 o[i]=tipPart->get(
x.length()+i).asFloat64();
1221 Bottle command, reply;
1225 if (!
portRpc.write(command,reply))
1227 yError(
"unable to get reply from server!");
1235 int flag=reply.get(1).asVocab32();
1252 const double timeout)
1255 double t0=Time::now();
1259 Time::delay(period);
1275 Bottle command, reply;
1278 if (!
portRpc.write(command,reply))
1280 yError(
"unable to get reply from server!");
1294 Bottle command, reply;
1297 if (!
portRpc.write(command,reply))
1299 yError(
"unable to get reply from server!");
1322 Bottle command, reply;
1324 command.addInt32(
id);
1326 if (!
portRpc.write(command,reply))
1328 yError(
"unable to get reply from server!");
1342 Bottle command, reply;
1344 command.addList().addInt32(
id);
1346 if (!
portRpc.write(command,reply))
1348 yError(
"unable to get reply from server!");
1368 Bottle command, reply;
1370 Bottle &ids=command.addList();
1374 if (!
portRpc.write(command,reply))
1376 yError(
"unable to get reply from server!");
1389 Bottle command, reply;
1393 if (!
portRpc.write(command,reply))
1395 yError(
"unable to get reply from server!");
1403 if (Bottle *infoPart=reply.get(1).asList())
1427 string type=
event.get(0).asString();
1428 double time=
event.get(1).asFloat64();
1429 double checkPoint=(type==
"motion-ongoing")?event.get(2).asFloat64():-1.0;
1430 map<string,CartesianEvent*>::iterator itr;
1436 if (itr->second!=NULL)
1438 CartesianEvent &Event=*itr->second;
1439 Event.cartesianEventVariables.type=type;
1440 Event.cartesianEventVariables.time=
time;
1442 if (checkPoint>=0.0)
1443 Event.cartesianEventVariables.motionOngoingCheckPoint=checkPoint;
1445 Event.cartesianEventCallback();
1449 string typeExtended=type;
1450 if (checkPoint>=0.0)
1453 ss<<type<<
"-"<<checkPoint;
1454 typeExtended=ss.str();
1461 if (itr->second!=NULL)
1463 CartesianEvent &Event=*itr->second;
1464 Event.cartesianEventVariables.type=type;
1465 Event.cartesianEventVariables.time=
time;
1467 if (checkPoint>=0.0)
1468 Event.cartesianEventVariables.motionOngoingCheckPoint=checkPoint;
1470 Event.cartesianEventCallback();
1482 string type=
event.cartesianEventParameters.type;
1483 if (type==
"motion-ongoing")
1485 double checkPoint=
event.cartesianEventParameters.motionOngoingCheckPoint;
1487 Bottle command, reply;
1491 command.addFloat64(checkPoint);
1493 if (!
portRpc.write(command,reply))
1495 yError(
"unable to get reply from server!");
1503 ss<<type<<
"-"<<checkPoint;
1518 string type=
event.cartesianEventParameters.type;
1519 if (type==
"motion-ongoing")
1521 double checkPoint=
event.cartesianEventParameters.motionOngoingCheckPoint;
1523 Bottle command, reply;
1527 command.addFloat64(checkPoint);
1529 if (!
portRpc.write(command,reply))
1531 yError(
"unable to get reply from server!");
1539 ss<<type<<
"-"<<checkPoint;
1554 Bottle command, reply;
1557 command.addList()=options;
1559 if (!
portRpc.write(command,reply))
1561 yError(
"unable to get reply from server!");
1575 Bottle command, reply;
1579 if (!
portRpc.write(command,reply))
1581 yError(
"unable to get reply from server!");
1589 if (Bottle *optionsPart=reply.get(1).asList())
1590 options=*optionsPart;
#define CARTCTRL_DEFAULT_TMO
#define CARTCTRL_CLIENT_VER
#define IKINCARTCTRL_VOCAB_OPT_Q
#define IKINCARTCTRL_VOCAB_OPT_INFO
#define IKINCARTCTRL_VOCAB_VAL_POSE_XYZ
#define IKINCARTCTRL_VOCAB_OPT_PRIO
#define IKINCARTCTRL_VOCAB_OPT_UNREGISTER
#define IKINCARTCTRL_VOCAB_VAL_TRUE
#define IKINCARTCTRL_VOCAB_CMD_GET
#define IKINCARTCTRL_VOCAB_CMD_GO
#define IKINCARTCTRL_VOCAB_OPT_REST_POS
#define IKINCARTCTRL_VOCAB_OPT_REFERENCE
#define IKINCARTCTRL_VOCAB_OPT_DES
#define IKINCARTCTRL_VOCAB_OPT_LIM
#define IKINCARTCTRL_VOCAB_OPT_QDOT
#define IKINCARTCTRL_VOCAB_OPT_XD
#define IKINCARTCTRL_VOCAB_REP_ACK
#define IKINCARTCTRL_VOCAB_VAL_FALSE
#define IKINCARTCTRL_VOCAB_CMD_STORE
#define IKINCARTCTRL_VOCAB_OPT_TIME
#define IKINCARTCTRL_VOCAB_CMD_DELETE
#define IKINCARTCTRL_VOCAB_OPT_MODE
#define IKINCARTCTRL_VOCAB_CMD_TASKVEL
#define IKINCARTCTRL_VOCAB_VAL_POSE_FULL
#define IKINCARTCTRL_VOCAB_VAL_MODE_TRACK
#define IKINCARTCTRL_VOCAB_OPT_DOF
#define IKINCARTCTRL_VOCAB_OPT_TOL
#define IKINCARTCTRL_VOCAB_VAL_MODE_SINGLE
#define IKINCARTCTRL_VOCAB_CMD_ASK
#define IKINCARTCTRL_VOCAB_CMD_SET
#define IKINCARTCTRL_VOCAB_OPT_REST_WEIGHTS
#define IKINCARTCTRL_VOCAB_CMD_RESTORE
#define IKINCARTCTRL_VOCAB_OPT_ISSOLVERON
#define IKINCARTCTRL_VOCAB_OPT_TIP_FRAME
#define IKINCARTCTRL_VOCAB_CMD_EVENT
#define IKINCARTCTRL_VOCAB_OPT_XDOT
#define IKINCARTCTRL_VOCAB_OPT_TWEAK
#define IKINCARTCTRL_VOCAB_OPT_POSE
#define IKINCARTCTRL_VOCAB_CMD_STOP
#define IKINCARTCTRL_VOCAB_OPT_REGISTER
#define IKINCARTCTRL_VOCAB_VAL_EVENT_ONGOING
#define IKINCARTCTRL_VOCAB_OPT_MOTIONDONE
void setInterface(ClientCartesianController *interface)
ClientCartesianController * interface
void onRead(yarp::os::Bottle &event)
clientcartesiancontroller : implements the client part of the Cartesian Interface.
bool getPosePriority(std::string &p)
bool getTrackingMode(bool *f)
CartesianEventHandler portEvents
bool goToPosition(const yarp::sig::Vector &xd, const double t=0.0)
virtual ~ClientCartesianController()
bool getJointsVelocities(yarp::sig::Vector &qdot)
bool getRestPos(yarp::sig::Vector &curRestPos)
bool checkMotionDone(bool *f)
bool getRestWeights(yarp::sig::Vector &curRestWeights)
bool tweakGet(yarp::os::Bottle &options)
bool getTipFrame(yarp::sig::Vector &x, yarp::sig::Vector &o)
bool getReferenceMode(bool *f)
bool deleteContext(const int id)
bool getPose(yarp::sig::Vector &x, yarp::sig::Vector &o, yarp::os::Stamp *stamp=NULL)
bool open(yarp::os::Searchable &config)
ClientCartesianController()
bool goToPoseSync(const yarp::sig::Vector &xd, const yarp::sig::Vector &od, const double t=0.0)
bool getInfoHelper(yarp::os::Bottle &info)
bool getInTargetTol(double *tol)
bool getTaskVelocities(yarp::sig::Vector &xdot, yarp::sig::Vector &odot)
bool setPosePriority(const std::string &p)
bool getInfo(yarp::os::Bottle &info)
yarp::os::BufferedPort< yarp::os::Bottle > portCmd
bool getLimits(const int axis, double *min, double *max)
bool askForPosition(const yarp::sig::Vector &xd, yarp::sig::Vector &xdhat, yarp::sig::Vector &odhat, yarp::sig::Vector &qdhat)
bool attachTipFrame(const yarp::sig::Vector &x, const yarp::sig::Vector &o)
bool setRestPos(const yarp::sig::Vector &newRestPos, yarp::sig::Vector &curRestPos)
bool setInTargetTol(const double tol)
std::map< std::string, yarp::dev::CartesianEvent * > eventsMap
bool setRestWeights(const yarp::sig::Vector &newRestWeights, yarp::sig::Vector &curRestWeights)
std::set< int > contextIdList
double lastPoseMsgArrivalTime
void eventHandling(yarp::os::Bottle &event)
bool waitMotionDone(const double period=0.1, const double timeout=0.0)
bool setTaskVelocities(const yarp::sig::Vector &xdot, const yarp::sig::Vector &odot)
yarp::os::BufferedPort< yarp::sig::Vector > portState
bool setDOF(const yarp::sig::Vector &newDof, yarp::sig::Vector &curDof)
bool unregisterEvent(yarp::dev::CartesianEvent &event)
bool getDesired(yarp::sig::Vector &xdhat, yarp::sig::Vector &odhat, yarp::sig::Vector &qdhat)
bool restoreContext(const int id)
bool registerEvent(yarp::dev::CartesianEvent &event)
bool goToPositionSync(const yarp::sig::Vector &xd, const double t=0.0)
bool setLimits(const int axis, const double min, const double max)
bool getTrajTime(double *t)
bool setTrajTime(const double t)
bool goToPose(const yarp::sig::Vector &xd, const yarp::sig::Vector &od, const double t=0.0)
bool getDOF(yarp::sig::Vector &curDof)
yarp::os::RpcClient portRpc
bool storeContext(int *id)
bool askForPose(const yarp::sig::Vector &xd, const yarp::sig::Vector &od, yarp::sig::Vector &xdhat, yarp::sig::Vector &odhat, yarp::sig::Vector &qdhat)
bool tweakSet(const yarp::os::Bottle &options)
bool setReferenceMode(const bool f)
bool setTrackingMode(const bool f)
yarp::os::Stamp poseStamp
static void addVectorOption(yarp::os::Bottle &b, const int vcb, const yarp::sig::Vector &v)
static bool getDesiredOption(const yarp::os::Bottle &reply, yarp::sig::Vector &xdhat, yarp::sig::Vector &odhat, yarp::sig::Vector &qdhat)
static void addPoseOption(yarp::os::Bottle &b, const unsigned int pose)
Appends to a bottle all data needed to change the pose mode.
#define IKINCTRL_POSE_FULL
#define IKINCTRL_POSE_XYZ