29 const double _neckTime,
const double _eyesTime,
const double _min_abs_vel,
30 const unsigned int _period) :
31 PeriodicThread((double)_period/1000.0), drvTorso(_drvTorso), drvHead(_drvHead),
32 commData(_commData), neckTime(_neckTime), eyesTime(_eyesTime),
33 min_abs_vel(_min_abs_vel), period(_period), Ts(_period/1000.0),
69 IEncoders *encTorso;
drvTorso->view(encTorso);
75 IEncoders *encHead;
drvHead->view(encHead);
86 yInfo(
"### neck control - requested POSITION mode: IPositionDirect [%s] => %s mode selected",
90 yInfo(
"### neck control - requested VELOCITY mode => VELOCITY mode selected");
102 velHead->setRefAccelerations(a_robHead.data());
176 cl.setAng(
zeros(cl.getDOF()));
181 for (
double ver=minVer; ver<maxVer; ver+=0.5*
CTRL_DEG2RAD)
183 cl(cl.getDOF()-1).setAng(ver/2.0);
187 if (CartesianHelper::computeFixationPointData(cl,cr,
fp))
195 Vector fpe=SE3inv(cl.getH())*
fp;
204 yInfo(
"### computed minimum allowed vergence = %g [deg]",minVer*
CTRL_RAD2DEG);
228 ev.addFloat64(checkPoint);
269 if (execStopPosition)
286 if (execStopPosition)
291 ss<<
"pos_"<<neckJoint;
292 info.addString(ss.str());
293 info.addString(
"stop");
304 info.addString(ss.str());
305 info.addFloat64(0.0);
344 Vector &v,
double printTime)
350 printf(
"norm(e) = %g\n",
norm(xd-
fp));
351 printf(
"Target fix. point = %s\n",xd.toString().c_str());
352 printf(
"Actual fix. point = %s\n",
fp.toString().c_str());
353 printf(
"Target Joints = %s\n",
qd.toString().c_str());
354 printf(
"Actual Joints = %s\n",q.toString().c_str());
355 printf(
"Velocity = %s\n",
v.toString().c_str());
371 yInfo(
"Starting Controller at %d ms",
period);
405 yInfo(
"Controller started successfully");
407 yError(
"Controller did not start!");
413 const Vector &w,
const Vector &x_FP)
419 H_(0,3)=x_FP[0]-H_(0,3);
420 H_(1,3)=x_FP[1]-H_(1,3);
421 H_(2,3)=x_FP[2]-H_(2,3);
422 Vector dx_FP_pos=
v+(w_[0]*
cross(H_,0,H_,3)+
423 w_[1]*
cross(H_,1,H_,3)+
424 w_[2]*
cross(H_,2,H_,3));
426 H_(0,3)=H_(1,3)=H_(2,3)=0.0;
427 Vector dx_FP_rot=H_*w_;
428 dx_FP_rot.pop_back();
430 return cat(dx_FP_pos,dx_FP_rot);
457 Matrix JNp=JN.submatrix(3,5,3,5);
459 return pinv(JNp)*dfp.subVector(3,5);
466 Matrix eyesJ; Vector
tmp;
469 return pinv(eyesJ)*dfp.subVector(0,2);
496 for (
size_t i=0; i<ang_.length(); i++)
500 info.addString(ss.str());
501 info.addFloat64(ang_[i]);
550 modHead->getControlModes(modes.data());
553 for (
int i=0; i<(int)modes.size(); i++)
555 if ((modes[i]==VOCAB_CM_HW_FAULT) || (modes[i]==VOCAB_CM_IDLE))
561 if (modes[i]!=VOCAB_CM_POSITION_DIRECT)
564 else if (modes[i]!=VOCAB_CM_VELOCITY)
567 else if (modes[i]!=VOCAB_CM_MIXED)
587 modes.push_back(VOCAB_CM_POSITION_DIRECT);
589 modes.push_back(VOCAB_CM_VELOCITY);
592 modes.push_back(VOCAB_CM_MIXED);
682 yError(
"Communication timeout detected!");
697 for (
int i=0; i<3; i++)
719 double errEyes=
norm(
qd.subVector(3,(
unsigned int)
qd.length()-1)-
fbEyes);
733 event=
"motion-onset";
760 else if (jointsHealthy)
791 event=
"motion-onset";
800 if (event==
"motion-onset")
842 Vector gyro{resGyro.first};
843 bool statusGyro = resGyro.second;
870 Vector gyro{resGyro.first};
871 bool statusGyro = resGyro.second;
892 for (
size_t i=0; i<
v.length(); i++)
925 for (
size_t i=0; i<posdeg.length(); i++)
929 info.addString(ss.str());
930 info.addFloat64(posdeg[i]);
936 for (
size_t i=j; i<
vdeg.length(); i++)
940 info.addString(ss.str());
962 for (; (size_t)j<q.length(); j++)
966 if (
port_x.getOutputCount()>0)
974 if (
port_q.getOutputCount()>0)
981 if (event==
"motion-onset")
986 if (event==
"motion-done")
1004 PeriodicThread::suspend();
1007 yInfo(
"Controller has been suspended!");
1019 PeriodicThread::resume();
1020 yInfo(
"Controller has been resumed!");
1042 double lowerThresNeck=
eyesTime+0.2;
1043 if (execTime<lowerThresNeck)
1045 yWarning(
"neck execution time is under the lower bound!");
1046 yWarning(
"a new neck execution time of %g s is chosen",lowerThresNeck);
1057 double lowerThresEyes=10.0*
Ts;
1058 if (execTime<lowerThresEyes)
1060 yWarning(
"eyes execution time is under the lower bound!");
1061 yWarning(
"a new eyes execution time of %g s is chosen",lowerThresEyes);
1090 yInfo(
"tracking mode set to %s",
1125 if (poseSel==
"left")
1131 else if (poseSel==
"right")
1137 else if (poseSel==
"head")
1152 if ((checkPoint>=0.0) && (checkPoint<=1.0))
1168 if ((checkPoint>=0.0) && (checkPoint<=1.0))
1189 events.addFloat64(motionOngoingEvent);
bool unregisterMotionOngoingEvent(const double checkPoint)
void stopLimb(const bool execStopPosition=true)
bool setGazeStabilization(const bool f)
BufferedPort< Bottle > port_event
bool getPose(const string &poseSel, Vector &x, Stamp &stamp)
void afterStart(bool s) override
void threadRelease() override
Vector computedxFP(const Matrix &H, const Vector &v, const Vector &w, const Vector &x_FP)
void printIter(Vector &xd, Vector &fp, Vector &qd, Vector &q, Vector &v, double printTime)
minJerkVelCtrl * mjCtrlNeck
Vector computeEyesVelFromdxFP(const Vector &dfp)
void setTeyes(const double execTime)
bool areJointsHealthyAndSet()
void motionOngoingEventsFlush()
vector< int > jointsToSet
multiset< double > motionOngoingEvents
bool look(const Vector &x)
void notifyEvent(const string &event, const double checkPoint=-1.0)
minJerkVelCtrl * mjCtrlEyes
void minAllowedVergenceChanged() override
void setTneck(const double execTime)
bool getVelocity(Vector &vel)
void doSaccade(const Vector &ang, const Vector &vel)
bool threadInit() override
bool getDesired(Vector &des)
void findMinimumAllowedVergence()
IPositionControl * posHead
void setTrackingMode(const bool f)
bool getGazeStabilization() const
double ctrlActiveRisingEdgeTime
void motionOngoingEventsHandling()
BufferedPort< Vector > port_q
Integrator * IntStabilizer
IPositionDirect * posNeck
IVelocityControl * velHead
Controller(PolyDriver *_drvTorso, PolyDriver *_drvHead, ExchangeData *_commData, const double _neckTime, const double _eyesTime, const double _min_abs_vel, const unsigned int _period)
BufferedPort< Bottle > port_debug
BufferedPort< Vector > port_x
multiset< double > motionOngoingEventsCurrent
Vector computeNeckVelFromdxFP(const Vector &fp, const Vector &dfp)
bool getTrackingMode() const
condition_variable cv_eventLook
Bottle listMotionOngoingEvents()
bool registerMotionOngoingEvent(const double checkPoint)
ResourceFinder rf_cameras
std::pair< Vector, bool > get_gyro()
double gyro_noise_threshold
void set_q(const Vector &_q)
double minAllowedVergence
void set_v(const Vector &_v)
iKinLimbVersion head_version
void set_torso(const Vector &_torso)
A class for defining a saturated integrator based on Tustin formula: .
const yarp::sig::Vector & integrate(const yarp::sig::Vector &x)
Executes one-step integration of input vector.
void reset(const yarp::sig::Vector &y0)
Resets the internal state and sets the output vector to the given value.
void setLim(const yarp::sig::Matrix &_lim)
Sets the output vector constraints matrix.
const yarp::sig::Vector & get() const
Returns the current output vector.
Implements a minimum-jerk controller with velocity commands in the assumption that the plant can be m...
virtual void reset(const yarp::sig::Vector &u0)=0
Resets the controller to a given value.
virtual yarp::sig::Vector computeCmd(const double _T, const yarp::sig::Vector &e)=0
Computes the velocity command.
A class for defining the iCub Eye.
A class for describing the kinematic of the straight line coming out from the point located between t...
A class for defining the Inertia Sensor Kinematics of the iCub.
A Base class for defining a Serial Link Chain.
yarp::sig::Matrix getH(const unsigned int i, const bool allLink=false)
Returns the rigid roto-translation matrix from the root reference frame to the ith frame in Denavit-H...
bool setHN(const yarp::sig::Matrix &_HN)
Sets HN, the rigid roto-translation matrix from the Nth frame to the end-effector.
yarp::sig::Matrix GeoJacobian(const unsigned int i)
Returns the geometric Jacobian of the ith link.
bool releaseLink(const unsigned int i)
Releases the ith Link.
yarp::sig::Vector EndEffPose(const bool axisRep=true)
Returns the coordinates of end-effector.
yarp::sig::Vector setAng(const yarp::sig::Vector &q)
Sets the free joint angles to values of q[i].
unsigned int getDOF() const
Returns the current number of Chain's DOF.
void setAllConstraints(bool _constrained)
Sets the constraint status of all chain links.
std::string get_version() const
Return the version string.
iKinChain * asChain()
Returns a pointer to the Limb seen as Chain object.
bool set_xd(const Vector &_xd)
constexpr double GAZECTRL_MOTIONDONE_EYES_QTHRES
constexpr int32_t GAZECTRL_SWOFFCOND_DISABLESLOT
constexpr double GAZECTRL_CRITICVER_STABILIZATION
constexpr double GAZECTRL_MOTIONDONE_NECK_QTHRES
double norm(const yarp::sig::Matrix &M, int col)
Returns the norm of the vector given in the form: matrix(:,col).
yarp::sig::Vector cross(const yarp::sig::Matrix &A, int colA, const yarp::sig::Matrix &B, int colB)
Returns the cross product between two vectors given in the form: matrix(:,col).
void copyJointsBounds(iKinChain *ch1, iKinChain *ch2)
bool getAlignHN(const ResourceFinder &rf, const string &type, iKinChain *chain, const bool verbose=false)
bool getFeedback(Vector &fbTorso, Vector &fbHead, PolyDriver *drvTorso, PolyDriver *drvHead, const ExchangeData *commData, double *timeStamp=nullptr)
Matrix alignJointsBounds(iKinChain *chain, PolyDriver *drvTorso, PolyDriver *drvHead, const ExchangeData *commData)
double sat(const double val, const double min, const double max)
static struct bpf_program fp