8 #include <iCub/ctrl/math.h> 9 #include <yarp/math/Math.h> 10 #include <yarp/os/LogStream.h> 11 #include <yarp/os/Property.h> 12 #include <yarp/os/ResourceFinder.h> 15 using namespace Eigen;
21 using yarp::sig::Vector;
25 const bool use_forearm,
27 const double resolution_ratio,
28 const ConstString& cam_sel,
29 const ConstString& laterality,
30 const ConstString& context) :
31 laterality_(laterality),
32 icub_arm_(iCubArm(laterality+
"_v2")),
33 icub_kin_finger_{iCubFinger(laterality+
"_thumb"), iCubFinger(laterality+
"_index"), iCubFinger(laterality+
"_middle")},
35 resolution_ratio_(resolution_ratio),
36 use_thumb_(use_thumb),
37 use_forearm_(use_forearm)
41 icub_kin_eye_ = iCubEye(cam_sel_+
"_v2");
42 icub_kin_eye_.setAllConstraints(
false);
43 icub_kin_eye_.releaseLink(0);
44 icub_kin_eye_.releaseLink(1);
45 icub_kin_eye_.releaseLink(2);
47 if (openGazeController())
50 itf_gaze_->getInfo(cam_info);
51 yInfo() <<
log_ID_ <<
"[CAM PARAMS]" << cam_info.toString();
52 Bottle* cam_sel_intrinsic = cam_info.findGroup(
"camera_intrinsics_" + cam_sel_).get(1).asList();
53 cam_width_ = cam_info.findGroup(
"camera_width_" + cam_sel_).get(1).asInt();
54 cam_height_ = cam_info.findGroup(
"camera_height_" + cam_sel_).get(1).asInt();
55 cam_fx_ =
static_cast<float>(cam_sel_intrinsic->get(0).asDouble());
56 cam_cx_ =
static_cast<float>(cam_sel_intrinsic->get(2).asDouble());
57 cam_fy_ =
static_cast<float>(cam_sel_intrinsic->get(5).asDouble());
58 cam_cy_ =
static_cast<float>(cam_sel_intrinsic->get(6).asDouble());
62 yWarning() <<
log_ID_ <<
"[CAM PARAMS]" <<
"No intrinisc camera information could be found by the ctor. Looking for fallback values in config.ini.";
65 rf.setDefaultContext(context);
66 rf.setDefaultConfigFile(
"config.ini");
67 rf.configure(0, YARP_NULLPTR);
69 Bottle* fallback_intrinsic = rf.findGroup(
"FALLBACK").find(
"intrinsic_" + cam_sel_).asList();
70 if (fallback_intrinsic)
72 yInfo() <<
log_ID_ <<
"[FALLBACK][CAM PARAMS]" << fallback_intrinsic->toString();
74 cam_width_ =
static_cast<unsigned int>(fallback_intrinsic->get(0).asInt());
75 cam_height_ =
static_cast<unsigned int>(fallback_intrinsic->get(1).asInt());
76 cam_fx_ =
static_cast<float>(fallback_intrinsic->get(2).asDouble());
77 cam_cx_ =
static_cast<float>(fallback_intrinsic->get(3).asDouble());
78 cam_fy_ =
static_cast<float>(fallback_intrinsic->get(4).asDouble());
79 cam_cy_ =
static_cast<float>(fallback_intrinsic->get(5).asDouble());
83 yWarning() <<
log_ID_ <<
"[CAM PARAMS]" <<
"No fallback values could be found in config.ini by the ctor for the intrinisc camera parameters. Falling (even more) back to iCub_SIM values.";
93 yInfo() <<
log_ID_ <<
"[CAM]" <<
"Found camera information:";
94 yInfo() <<
log_ID_ <<
"[CAM]" <<
" - width:" << cam_width_;
95 yInfo() <<
log_ID_ <<
"[CAM]" <<
" - height:" << cam_height_;
96 yInfo() <<
log_ID_ <<
"[CAM]" <<
" - fx:" << cam_fx_;
97 yInfo() <<
log_ID_ <<
"[CAM]" <<
" - fy:" << cam_fy_;
98 yInfo() <<
log_ID_ <<
"[CAM]" <<
" - cx:" << cam_cx_;
99 yInfo() <<
log_ID_ <<
"[CAM]" <<
" - cy:" << cam_cy_;
101 cam_width_ /= resolution_ratio_;
102 cam_height_ /= resolution_ratio_;
103 cam_fx_ /= resolution_ratio_;
104 cam_cx_ /= resolution_ratio_;
105 cam_fy_ /= resolution_ratio_;
106 cam_cy_ /= resolution_ratio_;
108 yInfo() <<
log_ID_ <<
"[CAM]" <<
"Running with:";
109 yInfo() <<
log_ID_ <<
"[CAM]" <<
" - resolution_ratio:" << resolution_ratio_;
110 yInfo() <<
log_ID_ <<
"[CAM]" <<
" - width:" << cam_width_;
111 yInfo() <<
log_ID_ <<
"[CAM]" <<
" - height:" << cam_height_;
112 yInfo() <<
log_ID_ <<
"[CAM]" <<
" - fx:" << cam_fx_;
113 yInfo() <<
log_ID_ <<
"[CAM]" <<
" - fy:" << cam_fy_;
114 yInfo() <<
log_ID_ <<
"[CAM]" <<
" - cx:" << cam_cx_;
115 yInfo() <<
log_ID_ <<
"[CAM]" <<
" - cy:" << cam_cy_;
127 rf.setDefaultContext(context +
"/mesh");
129 cad_obj_[
"palm"] = rf.findFileByName(
"r_palm.obj");
130 if (!file_found(cad_obj_[
"palm"]))
131 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_palm.obj not found!");
135 cad_obj_[
"thumb1"] = rf.findFileByName(
"r_tl0.obj");
136 if (!file_found(cad_obj_[
"thumb1"]))
137 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_tl0.obj not found!");
138 cad_obj_[
"thumb2"] = rf.findFileByName(
"r_tl1.obj");
139 if (!file_found(cad_obj_[
"thumb2"]))
140 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_tl1.obj not found!");
141 cad_obj_[
"thumb3"] = rf.findFileByName(
"r_tl2.obj");
142 if (!file_found(cad_obj_[
"thumb3"]))
143 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_tl2.obj not found!");
144 cad_obj_[
"thumb4"] = rf.findFileByName(
"r_tl3.obj");
145 if (!file_found(cad_obj_[
"thumb4"]))
146 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_tl3.obj not found!");
147 cad_obj_[
"thumb5"] = rf.findFileByName(
"r_tl4.obj");
148 if (!file_found(cad_obj_[
"thumb5"]))
149 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_tl4.obj not found!");
152 cad_obj_[
"index0"] = rf.findFileByName(
"r_indexbase.obj");
153 if (!file_found(cad_obj_[
"index0"]))
154 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_indexbase.obj not found!");
155 cad_obj_[
"index1"] = rf.findFileByName(
"r_ail0.obj");
156 if (!file_found(cad_obj_[
"index1"]))
157 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_ail0.obj not found!");
158 cad_obj_[
"index2"] = rf.findFileByName(
"r_ail1.obj");
159 if (!file_found(cad_obj_[
"index2"]))
160 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_ail1.obj not found!");
161 cad_obj_[
"index3"] = rf.findFileByName(
"r_ail2.obj");
162 if (!file_found(cad_obj_[
"index3"]))
163 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_ail2.obj not found!");
164 cad_obj_[
"index4"] = rf.findFileByName(
"r_ail3.obj");
165 if (!file_found(cad_obj_[
"index4"]))
166 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_ail3.obj not found!");
168 cad_obj_[
"medium0"] = rf.findFileByName(
"r_ml0.obj");
169 if (!file_found(cad_obj_[
"medium0"]))
170 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_ml0.obj not found!");
171 cad_obj_[
"medium1"] = rf.findFileByName(
"r_ml1.obj");
172 if (!file_found(cad_obj_[
"medium1"]))
173 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_ml1.obj not found!");
174 cad_obj_[
"medium2"] = rf.findFileByName(
"r_ml2.obj");
175 if (!file_found(cad_obj_[
"medium2"]))
176 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_ml2.obj not found!");
177 cad_obj_[
"medium3"] = rf.findFileByName(
"r_ml3.obj");
178 if (!file_found(cad_obj_[
"medium3"]))
179 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_ml3.obj not found!");
183 cad_obj_[
"forearm"] = rf.findFileByName(
"r_forearm.obj");
184 if (!file_found(cad_obj_[
"forearm"]))
185 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::FILE\nERROR: 3D mesh file r_forearm.obj not found!");
188 rf.setDefaultContext(context +
"/shader");
189 ConstString shader_path = rf.findFileByName(
"shader_model.vert");
190 if (!file_found(shader_path))
191 throw std::runtime_error(
"ERROR::VISUALPROPRIOCEPTION::CTOR::DIR\nERROR: shader directory not found!");
192 size_t rfind_slash = shader_path.rfind(
"/");
193 size_t rfind_backslash = shader_path.rfind(
"\\");
194 shader_path = shader_path.substr(0, rfind_slash > rfind_backslash ? rfind_slash : rfind_backslash);
198 si_cad_ =
new SICAD(cad_obj_,
199 cam_width_, cam_height_, cam_fx_, cam_fy_, cam_cx_, cam_cy_,
201 {1.0, 0.0, 0.0,
static_cast<float>(M_PI)},
205 catch (
const std::runtime_error& e)
207 throw std::runtime_error(e.what());
210 icub_kin_finger_[0].setAllConstraints(
false);
211 icub_kin_finger_[1].setAllConstraints(
false);
212 icub_kin_finger_[2].setAllConstraints(
false);
214 icub_arm_.setAllConstraints(
false);
215 icub_arm_.releaseLink(0);
216 icub_arm_.releaseLink(1);
217 icub_arm_.releaseLink(2);
220 right_hand_analogs_bounds_ = yarp::sig::Matrix(15, 2);
222 right_hand_analogs_bounds_(0, 0) = 218.0; right_hand_analogs_bounds_(0, 1) = 61.0;
223 right_hand_analogs_bounds_(1, 0) = 210.0; right_hand_analogs_bounds_(1, 1) = 20.0;
224 right_hand_analogs_bounds_(2, 0) = 234.0; right_hand_analogs_bounds_(2, 1) = 16.0;
226 right_hand_analogs_bounds_(3, 0) = 224.0; right_hand_analogs_bounds_(3, 1) = 15.0;
227 right_hand_analogs_bounds_(4, 0) = 206.0; right_hand_analogs_bounds_(4, 1) = 18.0;
228 right_hand_analogs_bounds_(5, 0) = 237.0; right_hand_analogs_bounds_(5, 1) = 23.0;
230 right_hand_analogs_bounds_(6, 0) = 250.0; right_hand_analogs_bounds_(6, 1) = 8.0;
231 right_hand_analogs_bounds_(7, 0) = 195.0; right_hand_analogs_bounds_(7, 1) = 21.0;
232 right_hand_analogs_bounds_(8, 0) = 218.0; right_hand_analogs_bounds_(8, 1) = 0.0;
234 right_hand_analogs_bounds_(9, 0) = 220.0; right_hand_analogs_bounds_(9, 1) = 39.0;
235 right_hand_analogs_bounds_(10, 0) = 160.0; right_hand_analogs_bounds_(10, 1) = 10.0;
236 right_hand_analogs_bounds_(11, 0) = 209.0; right_hand_analogs_bounds_(11, 1) = 101.0;
237 right_hand_analogs_bounds_(12, 0) = 224.0; right_hand_analogs_bounds_(12, 1) = 63.0;
238 right_hand_analogs_bounds_(13, 0) = 191.0; right_hand_analogs_bounds_(13, 1) = 36.0;
239 right_hand_analogs_bounds_(14, 0) = 232.0; right_hand_analogs_bounds_(14, 1) = 98.0;
244 port_head_enc_.open (
"/hand-tracking/VisualProprioception/" + cam_sel_ +
"/head:i");
246 port_torso_enc_.open(
"/hand-tracking/VisualProprioception/" + cam_sel_ +
"/torso:i");
253 drv_right_hand_analog_.close();
255 port_head_enc_.close();
264 cam_width_(proprio.cam_width_),
265 cam_height_(proprio.cam_height_),
266 cam_fx_(proprio.cam_fx_),
267 cam_cx_(proprio.cam_cx_),
268 cam_fy_(proprio.cam_fy_),
269 cam_cy_(proprio.cam_cy_),
270 cad_obj_(proprio.cad_obj_),
271 si_cad_(proprio.si_cad_)
294 cam_fx_(std::move(proprio.cam_fx_)),
295 cam_cx_(std::move(proprio.cam_cx_)),
296 cam_fy_(std::move(proprio.cam_fy_)),
297 cam_cy_(std::move(proprio.cam_cy_)),
298 cad_obj_(std::move(proprio.cad_obj_)),
299 si_cad_(std::move(proprio.si_cad_))
301 cam_x_[0] = proprio.cam_x_[0];
302 cam_x_[1] = proprio.cam_x_[1];
303 cam_x_[2] = proprio.cam_x_[2];
305 cam_o_[0] = proprio.cam_o_[0];
306 cam_o_[1] = proprio.cam_o_[1];
307 cam_o_[2] = proprio.cam_o_[2];
308 cam_o_[3] = proprio.cam_o_[3];
314 proprio.cam_x_[0] = 0.0;
315 proprio.cam_x_[1] = 0.0;
316 proprio.cam_x_[2] = 0.0;
318 proprio.cam_o_[0] = 0.0;
319 proprio.cam_o_[1] = 0.0;
320 proprio.cam_o_[2] = 0.0;
321 proprio.cam_o_[3] = 0.0;
328 *
this = std::move(tmp);
336 icub_arm_ = std::move(proprio.icub_arm_);
342 cam_x_[0] = proprio.cam_x_[0];
343 cam_x_[1] = proprio.cam_x_[1];
344 cam_x_[2] = proprio.cam_x_[2];
346 cam_o_[0] = proprio.cam_o_[0];
347 cam_o_[1] = proprio.cam_o_[1];
348 cam_o_[2] = proprio.cam_o_[2];
349 cam_o_[3] = proprio.cam_o_[3];
351 cam_width_ = std::move(proprio.cam_width_);
352 cam_height_ = std::move(proprio.cam_height_);
353 cam_fx_ = std::move(proprio.cam_fx_);
354 cam_cx_ = std::move(proprio.cam_cx_);
355 cam_fy_ = std::move(proprio.cam_fy_);
356 cam_cy_ = std::move(proprio.cam_cy_);
358 cad_obj_ = std::move(proprio.cad_obj_);
359 si_cad_ = std::move(proprio.si_cad_);
361 proprio.cam_x_[0] = 0.0;
362 proprio.cam_x_[1] = 0.0;
363 proprio.cam_x_[2] = 0.0;
365 proprio.cam_o_[0] = 0.0;
366 proprio.cam_o_[1] = 0.0;
367 proprio.cam_o_[2] = 0.0;
368 proprio.cam_o_[3] = 0.0;
376 for (
int j = 0; j < cur_states.cols(); ++j)
378 Superimpose::ModelPoseContainer hand_pose;
379 Superimpose::ModelPose pose;
384 ee_t(0) = cur_states(0, j);
385 ee_t(1) = cur_states(1, j);
386 ee_t(2) = cur_states(2, j);
389 ee_o(0) = cur_states(3, j);
390 ee_o(1) = cur_states(4, j);
391 ee_o(2) = cur_states(5, j);
392 ee_o(3) = cur_states(6, j);
394 pose.assign(ee_t.data(), ee_t.data()+3);
395 pose.insert(pose.end(), ee_o.data(), ee_o.data()+4);
396 hand_pose.emplace(
"palm", pose);
399 yarp::sig::Matrix Ha = axis2dcm(ee_o);
401 for (
unsigned int fng = (
use_thumb_ ? 0 : 1); fng < 3; ++fng)
403 std::string finger_s;
407 Vector j_x = (Ha * (
icub_kin_finger_[fng].getH0().getCol(3))).subVector(0, 2);
410 if (fng == 1) { finger_s =
"index0"; }
411 else if (fng == 2) { finger_s =
"medium0"; }
413 pose.assign(j_x.data(), j_x.data()+3);
414 pose.insert(pose.end(), j_o.data(), j_o.data()+4);
415 hand_pose.emplace(finger_s, pose);
420 Vector j_x = (Ha * (
icub_kin_finger_[fng].getH(i,
true).getCol(3))).subVector(0, 2);
423 if (fng == 0) { finger_s =
"thumb"+std::to_string(i+1); }
424 else if (fng == 1) { finger_s =
"index"+std::to_string(i+1); }
425 else if (fng == 2) { finger_s =
"medium"+std::to_string(i+1); }
427 pose.assign(j_x.data(), j_x.data()+3);
428 pose.insert(pose.end(), j_o.data(), j_o.data()+4);
429 hand_pose.emplace(finger_s, pose);
434 yarp::sig::Matrix invH6 = Ha *
438 Vector j_x = invH6.getCol(3).subVector(0, 2);
439 Vector j_o = dcm2axis(invH6);
441 pose.assign(j_x.data(), j_x.data()+3);
442 pose.insert(pose.end(), j_o.data(), j_o.data()+4);
443 hand_pose.emplace(
"forearm", pose);
446 hand_poses.push_back(hand_pose);
453 std::vector<Superimpose::ModelPoseContainer> hand_poses;
456 observations.create(cam_height_ *
si_cad_->getTilesRows(), cam_width_ *
si_cad_->getTilesCols(), CV_8UC3);
457 Mat hand_ogl = observations.getMat();
465 if (property ==
"VP_PARAMS")
468 if (property ==
"VP_ANALOGS_ON")
470 if (property ==
"VP_ANALOGS_OFF")
481 cam_x_[0] = left_eye_pose(0);
482 cam_x_[1] = left_eye_pose(1);
483 cam_x_[2] = left_eye_pose(2);
485 cam_o_[0] = left_eye_pose(3);
486 cam_o_[1] = left_eye_pose(4);
487 cam_o_[2] = left_eye_pose(5);
488 cam_o_[3] = left_eye_pose(6);
517 icub_arm_.setAng(q.subVector(0, 9) * (M_PI/180.0));
520 for (
size_t i = 0; i < 3; ++i)
530 icub_arm_.setAng(q.subVector(0, 9) * (M_PI/180.0));
533 for (
size_t i = 0; i < 3; ++i)
535 icub_kin_finger_[i].getChainJoints(q.subVector(3, 18), analogs, chainjoints, analog_bounds);
545 yInfo() <<
log_ID_ <<
"File " + file.substr(file.rfind(
"/") + 1) +
" found.";
555 return si_cad_->getTilesNumber();
561 return si_cad_->getTilesRows();
567 return si_cad_->getTilesCols();
623 yarp::sig::Matrix H(4, 4);
625 double theta = offset + q;
626 double c_th = cos(theta);
627 double s_th = sin(theta);
628 double c_al = cos(alpha);
629 double s_al = sin(alpha);
636 H(1,0) = s_th * c_al;
637 H(1,1) = c_th * c_al;
641 H(2,0) = s_th * s_al;
642 H(2,1) = c_th * s_al;
658 opt_gaze.put(
"device",
"gazecontrollerclient");
659 opt_gaze.put(
"local",
"/hand-tracking/VisualProprioception/" +
cam_sel_ +
"/gaze:i");
660 opt_gaze.put(
"remote",
"/iKinGazeCtrl");
667 yError() <<
log_ID_ <<
"Cannot get head gazecontrollerclient interface!";
675 yError() <<
log_ID_ <<
"Cannot open head gazecontrollerclient!";
688 Property opt_right_hand_analog;
689 opt_right_hand_analog.put(
"device",
"analogsensorclient");
690 opt_right_hand_analog.put(
"local",
"/hand-tracking/VisualProprioception/" +
cam_sel_ +
"/" +
laterality_ +
"_hand/analog:i");
691 opt_right_hand_analog.put(
"remote",
"/icub/right_hand/analog:o");
698 yError() <<
log_ID_ <<
"Cannot get right hand analogsensorclient interface!";
706 yError() <<
log_ID_ <<
"Cannot open right hand analogsensorclient!";
736 if (!b)
return Vector(3, 0.0);
739 torso_enc(0) = b->get(2).asDouble();
740 torso_enc(1) = b->get(1).asDouble();
741 torso_enc(2) = b->get(0).asDouble();
750 if (!b)
return Vector(19, 0.0);
752 Vector root_fingers_enc(19);
753 root_fingers_enc.setSubvector(0,
readTorso());
754 for (
size_t i = 0; i < 16; ++i)
755 root_fingers_enc(3 + i) = b->get(i).asDouble();
757 return root_fingers_enc;
764 if (!b)
return Vector(8, 0.0);
766 Vector root_eye_enc(8);
767 root_eye_enc.setSubvector(0,
readTorso());
768 for (
size_t i = 0; i < 4; ++i)
769 root_eye_enc(3 + i) = b->get(i).asDouble();
771 if (cam_sel ==
"left") root_eye_enc(7) = b->get(4).asDouble() + b->get(5).asDouble()/2.0;
772 if (cam_sel ==
"right") root_eye_enc(7) = b->get(4).asDouble() - b->get(5).asDouble()/2.0;
yarp::dev::IGazeControl * itf_gaze_
bool setProperty(const std::string property) override
yarp::sig::Vector readRootToFingers()
iCub::iKin::iCubEye icub_kin_eye_
const yarp::os::ConstString log_ID_
yarp::sig::Matrix right_hand_analogs_bounds_
yarp::os::ConstString laterality_
void observe(const Eigen::Ref< const Eigen::MatrixXf > &cur_states, cv::OutputArray observations) override
bool openGazeController()
VisualProprioception & operator=(const VisualProprioception &proprio)
yarp::dev::PolyDriver drv_right_hand_analog_
iCub::iKin::iCubFinger icub_kin_finger_[3]
yarp::os::BufferedPort< yarp::os::Bottle > port_arm_enc_
unsigned int getCamHeight()
SICAD::ModelPathContainer cad_obj_
~VisualProprioception() noexcept
yarp::sig::Vector readRootToEye(const yarp::os::ConstString cam_sel)
yarp::os::ConstString laterality_
void setArmJoints(const yarp::sig::Vector &q)
yarp::os::BufferedPort< yarp::os::Bottle > port_torso_enc_
yarp::os::ConstString cam_sel_
yarp::sig::Matrix getInvertedH(const double a, const double d, const double alpha, const double offset, const double q)
yarp::os::ConstString log_ID_
void getModelPose(const Eigen::Ref< const Eigen::MatrixXf > &cur_states, std::vector< Superimpose::ModelPoseContainer > &hand_poses)
yarp::os::BufferedPort< yarp::os::Bottle > port_head_enc_
unsigned int getCamWidth()
bool file_found(const yarp::os::ConstString &file)
yarp::dev::PolyDriver drv_gaze_
yarp::dev::IAnalogSensor * itf_right_hand_analog_
yarp::os::BufferedPort< yarp::os::Bottle > port_torso_enc_
yarp::sig::Vector readTorso()
yarp::os::BufferedPort< yarp::os::Bottle > port_arm_enc_
iCub::iKin::iCubArm icub_arm_
VisualProprioception(const bool use_thumb, const bool use_forearm, const int num_images, const double resolution_ratio, const yarp::os::ConstString &cam_sel, const yarp::os::ConstString &laterality, const yarp::os::ConstString &context)