AUV-Coop-Assembly
Master Thesis for Robotics Engineering. Cooperative peg-in-hole assembly with two underwater vehicles guided by vision
fovEEToToolTask.cpp
1 #include "header/fovEEToToolTask.h"
2 
3 FovEEToToolTask::FovEEToToolTask(int dim, bool eqType, std::string robotName)
4  : Task(dim, eqType, robotName, "FOV_EE_TO_TOOL") {
5 
6  if (dimension != 1){
7  std::cerr << "[" << robotName << "]" << taskName << "] ERROR, this task is intended to be a scalar one, "<<
8  "you setted "<< dimension << " as dimension\n";
9  return;
10  }
11  gain = 0.4;
12 }
13 
14 
15 int FovEEToToolTask::updateMatrices(struct Infos* const robInfo){
16 
17  Eigen::Vector3d kHat;
18  kHat << 0, 0, 1; //generic k versor
19 
20  Eigen::Matrix4d wTee = robInfo->robotState.wTv_eigen * robInfo->robotState.vTee_eigen;
21  //a from book
22  w_kHat_ee = wTee.topLeftCorner<3,3>() * kHat;
23 
24  w__Dist_ee_t = robInfo->transforms.wTt_eigen.topRightCorner<3,1>() -
25  wTee.topRightCorner<3,1>();
26 
27  //Problem here to find a_d norm must be not zero
28  if (w__Dist_ee_t.norm() < 0.000001){
29  return -1;
30  }
31  //a_d from book, that is the previous vector normalized
32  a_d = w__Dist_ee_t / w__Dist_ee_t.norm();
33 
34  distNorm = (a_d - w_kHat_ee).norm();
35  // not continue execution of task, it is useless because distance
36  // is already ok. Also we cant divide by zero to find a_d
37  if (distNorm < 0.000001){
38  return 1;
39  }
40 
41  setReference();
42  setActivation();
43  setJacobian(robInfo->robotState.w_Jee_robot);
44 
45  return 0;
46 }
47 
48 
49 
55 void FovEEToToolTask::setActivation(){
56 
57  // activation we know that is a scalar because dimension == 1
58  A(1) = CMAT::IncreasingBellShapedFunction(0.015, 0.6, 0, 1, distNorm);
59 }
60 
61 void FovEEToToolTask::setReference(){
62  //We know reference is a scalar becase task is scalar
63  reference(1) = - gain * distNorm;
64 
65 }
66 
67 void FovEEToToolTask::setJacobian(
68  Eigen::Matrix<double, 6, TOT_DOF> w_J_robot){
69 
70  Eigen::Vector3d normalVectDist = (a_d - w_kHat_ee) / distNorm;
71 
72  Eigen::Matrix3d skew_ad = FRM::skewMat(a_d);
73  Eigen::Matrix3d skew_Dist_ee_t__inv = FRM::pseudoInverse(FRM::skewMat(w__Dist_ee_t));
74  Eigen::Matrix3d skew_kHat_ee = FRM::skewMat(w_kHat_ee);
75 
76  Eigen::Matrix<double, 1, TOT_DOF> J_eigen;
77  J_eigen = normalVectDist.transpose() * (
78  -skew_ad * skew_Dist_ee_t__inv * w_J_robot.topRows<3>() +
79  skew_kHat_ee * w_J_robot.bottomRows<3>()
80  );
81 
82  J = CONV::matrix_eigen2cmat(J_eigen);
83 
84 }
85 
86 
87 
90 
98 //void FovEEToToolTask::setPhi(Eigen::Matrix4d wTv_eigen, Eigen::Matrix4d wTt_eigen,
99 // Eigen::Matrix4d vTee_eigen){
100 
101 // Eigen::Vector3d kHat;
102 // kHat << 0, 0, 1; //generic k versor
103 
104 // Eigen::Matrix3d wTee = wTv_eigen * vTee_eigen;
105 // Eigen::Vector3d w_kHat_ee = wTee.topLeftCorner<3,3>() * kHat; //versor k of ee projected on world
106 // //distance from ee to tool projected on world
107 // Eigen::Vector3d w__Dist_ee_t = wTt_eigen.topRightCorner<3,1>() - wTee.topRightCorner<3,1>();
108 
109 // phi = FRM::reducedVersorLemma(w__Dist_ee_t, w_kHat_ee);
110 
111 //}
Definition: infos.h:117
Eigen::Matrix4d wTv_eigen
Transforms.
Definition: infos.h:34
ABSTRACT class task. Each task is a derived class of this class. It contains all the variable that th...
Definition: task.h:17