AUV-Coop-Assembly
Master Thesis for Robotics Engineering. Cooperative peg-in-hole assembly with two underwater vehicles guided by vision
kdlHelper.cpp
1 #include "header/kdlHelper.h"
8 KDLHelper::KDLHelper(std::string filename, std::string link0_name,
9  std::string endEffector_name, std::string vehicle_name,
10  std::string tool_name)
11 {
12 
13  TiXmlDocument file_xml(filename);
14  file_xml.LoadFile();
15 
16  // parse URDF arm model
17 
18  urdf::Model model;
19  if (!model.initXml(&file_xml)){
20  std::cerr << "[KDL_HELPER] Failed to parse urdf robot model\n" ;
21  return ;
22  }
23  if (!kdl_parser::treeFromUrdfModel(model, tree)){
24  std::cerr << "[KDL_HELPER] Failed to construct kdl tree\n";
25  return ;
26  }
27 
28  nJoints = 0;
29  this->link0_name = link0_name;
30  this->endEffector_name = endEffector_name;
31  this->vehicle_name = vehicle_name;
32  this->tool_name = tool_name;
33 
34 }
35 
36 KDLHelper::~KDLHelper(){
37 
38  delete eePose_solver;
39  delete jacobEE_solver;
40  delete jacobTool_solver;
41 
42 }
43 
44 
45 
56 
57  //generate the chain from link0 to final (end effector)
58  KDL::Chain kinChain;
59  tree.getChain(link0_name, endEffector_name, kinChain);
60 
61  nJoints = kinChain.getNrOfJoints();
62  if (nJoints != ARM_DOF){
63  std::cerr << "[KDL_HELPER] Something wrong with urdf:\n" <<
64  "I have found from urdf file " << nJoints << " joints " <<
65  "but from define list file I read " << ARM_DOF <<". Please check\n";
66  return -1;
67  }
68 
69  std::cout << "[KDL_HELPER] found " << nJoints << " joints from " << link0_name
70  << " to " << endEffector_name << "\n";
71 
72  eePose_solver = new KDL::ChainFkSolverPos_recursive(kinChain);
73  jacobEE_solver = new KDL::ChainJntToJacSolver(kinChain);
74 
75 
76  return 0;
77 }
78 
79 
80 
87 int KDLHelper::setToolSolvers(Eigen::Matrix4d eeTtool_eigen){
88 
89  KDL::Chain kinChain;
90 
91  tree.getChain(vehicle_name, endEffector_name, kinChain);
92  // now kinChain is a chain for only the arm
93 
94  nJoints = kinChain.getNrOfJoints();
95  if (nJoints != ARM_DOF){
96  std::cerr << "[KDL_HELPER] Something wrong with urdf:\n" <<
97  "I have found from urdf file " << nJoints << " joints " <<
98  "but from define list file I read " << ARM_DOF <<". Please check\n";
99  return -1;
100  }
101 
102 
103  // now we add a fake joint to add to kinChain a segment which is for the tool
104  //(that is fixed respect to the ee)
105  KDL::Frame eeTtool_kdl = CONV::transfMatrix_eigen2kdl(eeTtool_eigen);
106 
107  kinChain.addSegment(KDL::Segment(KDL::Joint(KDL::Joint::None), eeTtool_kdl));
108 
109  //even if we add a segment, the number of joint of kin chain remain 4. Probably because we add a fixed joint.
110  //however, this is good.
111 
113  jacobTool_solver = new KDL::ChainJntToJacSolver(kinChain);
114 
115 }
116 
122  if (tool_name.size() == 0 ){
123  std::cerr << "[KDL_HELPER] tool_name not inserted in costructor, insert it or use the other setTool\n";
124  return -1;
125  }
126 
127  KDL::Chain kinChain;
128  tree.getChain(vehicle_name, tool_name, kinChain);
129 
130  nJoints = kinChain.getNrOfJoints();
131  if (nJoints != ARM_DOF){
132  std::cerr << "[KDL_HELPER] Something wrong with urdf:\n" <<
133  "I have found from urdf file " << nJoints << " joints " <<
134  "but from define list file I read " << ARM_DOF <<". Please check\n";
135  return -1;
136  }
137 
138  jacobTool_solver = new KDL::ChainJntToJacSolver(kinChain);
139 
140 
141 }
142 
143 int KDLHelper::getEEpose(std::vector<double> jointPos, Eigen::Matrix4d *eePose_eigen){
144 
145  KDL::JntArray jointPositions = KDL::JntArray(nJoints);
146  for(unsigned int i=0; i<nJoints; i++){
147  jointPositions(i)=jointPos[i];
148  }
149  KDL::Frame eePose_kdl;
150  eePose_solver->JntToCart(jointPositions, eePose_kdl);
151 
152  *eePose_eigen = CONV::transfMatrix_kdl2eigen(eePose_kdl);
153 
154  return 0;
155 
156 }
157 
158 
165 int KDLHelper::getJacobianEE(std::vector<double> jointPos, Eigen::Matrix<double, 6, ARM_DOF> *jacobianEE_eigen){
166 
167  KDL::JntArray jointPositions = KDL::JntArray(nJoints);
168 
169  for(unsigned int i=0; i<nJoints; i++){
170  jointPositions(i)=jointPos[i];
171  }
172 
173  KDL::Jacobian jacobian_kdl;
174  jacobian_kdl.resize(nJoints);
175  jacobEE_solver->JntToJac(jointPositions, jacobian_kdl);
176 
177  *jacobianEE_eigen = CONV::jacobian_kdl2eigen(jacobian_kdl);
178 
179  return 0;
180 }
181 
188 int KDLHelper::getJacobianTool(std::vector<double> jointPos, Eigen::Matrix<double, 6, ARM_DOF> *jacobianTool_eigen){
189 
190  KDL::JntArray jointPositions = KDL::JntArray(nJoints);
191 
192  for(unsigned int i=0; i<nJoints; i++){
193  jointPositions(i)=jointPos[i];
194  }
195 
196  KDL::Jacobian jacobian_kdl;
197  jacobian_kdl.resize(nJoints); //il fixed non รจ considerato joint
198  jacobTool_solver->JntToJac(jointPositions, jacobian_kdl);
199 
200  *jacobianTool_eigen = CONV::jacobian_kdl2eigen(jacobian_kdl);
201 
202  return 0;
203 }
204 
205 
206 
220 int KDLHelper::getFixedFrame(std::string frameOrigin, std::string frameTarget, Eigen::Matrix4d *xTx_eigen){
221 
222  //generate the chain
223  KDL::Chain kinChain;
224  tree.getChain(frameOrigin, frameTarget, kinChain);
225 
226  int nJoints = kinChain.getNrOfJoints();
227  if (nJoints != 0) {
228  std::cerr << "[KDL_HELPER] Use this function only for FIXED things relative each other\n";
229  return -1;
230  }
231 
232  KDL::ChainFkSolverPos_recursive transfSolver(kinChain);
233 
234  //joint pos are needed to the function of the solver but they does not count for fixed thing
235  KDL::JntArray jointPositions = KDL::JntArray(nJoints);
236  for(unsigned int i=0; i<nJoints; i++){
237  jointPositions(i)=0.0;
238  }
239 
240  KDL::Frame xTx_kdl;
241  transfSolver.JntToCart(jointPositions, xTx_kdl);
242 
243  *xTx_eigen = CONV::transfMatrix_kdl2eigen(xTx_kdl);
244 
245  return 0;
246 }
247 
248 
249 int KDLHelper::getNJoints(){return nJoints;}
250 
251 
252 
253 
254 
255 
256 
257 
258 
259 
260 
261 
262 
263 
264 
265 
266 
267 
274 int KDLHelper::getToolpose(std::vector<double> jointPos, Eigen::Matrix4d eeTtool_eigen, Eigen::Matrix4d *toolPose_eigen){
275 
276  KDL::JntArray jointPositions = KDL::JntArray(nJoints);
277  for(unsigned int i=0; i<nJoints; i++){
278  jointPositions(i)=jointPos[i];
279  }
280  KDL::Frame toolPose_kdl;
281  KDL::Chain kinChain;
282  tree.getChain(link0_name, endEffector_name, kinChain);
283  KDL::Frame eeTtool_kdl = CONV::transfMatrix_eigen2kdl(eeTtool_eigen);
284 
285  kinChain.addSegment(KDL::Segment(KDL::Joint(KDL::Joint::None), eeTtool_kdl));
286  KDL::ChainFkSolverPos_recursive toolPose_solver(kinChain);
287 
288  toolPose_solver.JntToCart(jointPositions, toolPose_kdl);
289 
290  *toolPose_eigen = CONV::transfMatrix_kdl2eigen(toolPose_kdl);
291 
292  return 0;
293 
294 }
295 
296 
297 
298 
299 
300 
301 
302 
303 
304 
305 
312 int KDLHelper::setToolSolvers_old(Eigen::Matrix4d eeTtool_eigen){
313 
314  KDL::Chain kinChain;
315 
316  tree.getChain(link0_name, endEffector_name, kinChain);
317  // now kinChain is a chain for only the arm
318 
319  // now we add a fake joint to add to kinChain a segment which is for the tool
320  //(that is fixed respect to the ee)
321  KDL::Frame eeTtool_kdl = CONV::transfMatrix_eigen2kdl(eeTtool_eigen);
322 
323  kinChain.addSegment(KDL::Segment(KDL::Joint(KDL::Joint::None), eeTtool_kdl));
324 
325  //even if we add a segment, the number of joint of kin chain remain 4. Probably because we add a fixed joint.
326  //however, this is good.
327 
329  jacobTool_solver = new KDL::ChainJntToJacSolver(kinChain);
330 
331 }
int getJacobianEE(std::vector< double > jointPos, Eigen::Matrix< double, 6, ARM_DOF > *jacobianEE_eigen)
KDLHelper::getJacobianEE respect base frame of arm (link0)
Definition: kdlHelper.cpp:165
int getFixedFrame(std::string frameOrigin, std::string frameTarget, Eigen::Matrix4d *xTx_eigen)
KDLHelper::getFixedFrame get relative position of things inside the urdf file of the robot that NOT c...
Definition: kdlHelper.cpp:220
KDLHelper(std::string filename, std::string link0_name, std::string endEffector_name, std::string vehicle_name, std::string toolName="")
KDLHelper::KDLHelper.
Definition: kdlHelper.cpp:8
int getJacobianTool(std::vector< double > jointPos, Eigen::Matrix< double, 6, ARM_DOF > *jacobianTool_eigen)
KDLHelper::getJacobianTool respect base frame of arm (link0)
Definition: kdlHelper.cpp:188
int setToolSolvers()
KDLHelper::setToolSolvers version for when the peg is a link of the robot.
Definition: kdlHelper.cpp:121
int setToolSolvers_old(Eigen::Matrix4d eeTtool_eigen)
old
Definition: kdlHelper.cpp:312
int getToolpose(std::vector< double > jointPos, Eigen::Matrix4d eeTtool_eigen, Eigen::Matrix4d *toolPose_eigen)
debug
Definition: kdlHelper.cpp:274
int setEESolvers()
KDLHelper::setEESolvers Initialize the kinematic solvers (jacob and pose) for the arm End Effector...
Definition: kdlHelper.cpp:55