manipulator_h_kinematics_dynamics.cpp
Go to the documentation of this file.
1 /*******************************************************************************
2 * Copyright 2018 ROBOTIS CO., LTD.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *******************************************************************************/
16 
17 /*
18  * Link.cpp
19  *
20  * Created on: Jan 11, 2016
21  * Author: SCH
22  */
23 
24 #include <iostream>
26 
27 namespace robotis_manipulator_h
28 {
29 
31 {
32 }
34 {
35 }
36 
38 {
39  for (int id = 0; id <= ALL_JOINT_ID; id++)
40  manipulator_link_data_[id] = new LinkData();
41 
42  if (tree == ARM)
43  {
44  manipulator_link_data_[0]->name_ = "base";
48  manipulator_link_data_[0]->mass_ = 0.0;
54  manipulator_link_data_[0]->inertia_ = robotis_framework::getInertiaXYZ(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
55 
56  manipulator_link_data_[1]->name_ = "joint1";
60  manipulator_link_data_[1]->mass_ = 0.85644;
65  manipulator_link_data_[1]->joint_limit_min_ = -0.5 * M_PI;
66  manipulator_link_data_[1]->inertia_ = robotis_framework::getInertiaXYZ(1.0, 0.0, 0.0, 1.0, 0.0, 1.0);
67 
68  manipulator_link_data_[2]->name_ = "joint2";
72  manipulator_link_data_[2]->mass_ = 0.94658;
77  manipulator_link_data_[2]->joint_limit_min_ = -0.5 * M_PI;
78  manipulator_link_data_[2]->inertia_ = robotis_framework::getInertiaXYZ(1.0, 0.0, 0.0, 1.0, 0.0, 1.0);
79 
80  manipulator_link_data_[3]->name_ = "joint3";
84  manipulator_link_data_[3]->mass_ = 1.30260;
89  manipulator_link_data_[3]->joint_limit_min_ = -0.5 * M_PI;
90  manipulator_link_data_[3]->inertia_ = robotis_framework::getInertiaXYZ(1.0, 0.0, 0.0, 1.0, 0.0, 1.0);
91 
92  manipulator_link_data_[4]->name_ = "joint4";
96  manipulator_link_data_[4]->mass_ = 1.236;
100  manipulator_link_data_[4]->joint_limit_max_ = 0.5 * M_PI;
101  manipulator_link_data_[4]->joint_limit_min_ = -0.5 * M_PI;
102  manipulator_link_data_[4]->inertia_ = robotis_framework::getInertiaXYZ(1.0, 0.0, 0.0, 1.0, 0.0, 1.0);
103 
104  manipulator_link_data_[5]->name_ = "joint5";
108  manipulator_link_data_[5]->mass_ = 0.491;
112  manipulator_link_data_[5]->joint_limit_max_ = 0.5 * M_PI;
113  manipulator_link_data_[5]->joint_limit_min_ = -0.5 * M_PI;
114  manipulator_link_data_[5]->inertia_ = robotis_framework::getInertiaXYZ(1.0, 0.0, 0.0, 1.0, 0.0, 1.0);
115 
116  manipulator_link_data_[6]->name_ = "joint6";
120  manipulator_link_data_[6]->mass_ = 0.454;
124  manipulator_link_data_[6]->joint_limit_max_ = 0.5 * M_PI;
125  manipulator_link_data_[6]->joint_limit_min_ = -0.5 * M_PI;
126  manipulator_link_data_[6]->inertia_ = robotis_framework::getInertiaXYZ(1.0, 0.0, 0.0, 1.0, 0.0, 1.0);
127 
128  manipulator_link_data_[7]->name_ = "end";
132  manipulator_link_data_[7]->mass_ = 0.0;
138  manipulator_link_data_[7]->inertia_ = robotis_framework::getInertiaXYZ(1.0, 0.0, 0.0, 1.0, 0.0, 1.0);
139  }
140 }
141 
143 {
144  int id = manipulator_link_data_[to]->parent_;
145 
146  std::vector<int> idx;
147 
148  if (id == 0)
149  {
150  idx.push_back(0);
151  idx.push_back(to);
152  }
153  else
154  {
155  idx = findRoute(id);
156  idx.push_back(to);
157  }
158 
159  return idx;
160 }
161 
162 std::vector<int> ManipulatorKinematicsDynamics::findRoute(int from, int to)
163 {
164  int id = manipulator_link_data_[to]->parent_;
165 
166  std::vector<int> idx;
167 
168  if (id == from)
169  {
170  idx.push_back(from);
171  idx.push_back(to);
172  }
173  else if (id != 0)
174  {
175  idx = findRoute(from, id);
176  idx.push_back(to);
177  }
178 
179  return idx;
180 }
181 
183 {
184  double mass;
185 
186  if (joint_ID == -1)
187  mass = 0.0;
188  else
189  mass = manipulator_link_data_[joint_ID]->mass_ + totalMass(manipulator_link_data_[joint_ID]->sibling_)
190  + totalMass(manipulator_link_data_[joint_ID]->child_);
191 
192  return mass;
193 }
194 
195 Eigen::MatrixXd ManipulatorKinematicsDynamics::calcMC(int joint_ID)
196 {
197  Eigen::MatrixXd mc(3, 1);
198 
199  if (joint_ID == -1)
200  mc = Eigen::MatrixXd::Zero(3, 1);
201  else
202  {
205  mc = mc + calcMC(manipulator_link_data_[joint_ID]->sibling_) + calcMC(manipulator_link_data_[joint_ID]->child_);
206  }
207 
208  return mc;
209 }
210 
211 Eigen::MatrixXd ManipulatorKinematicsDynamics::calcCOM(Eigen::MatrixXd MC)
212 {
213  double mass;
214  Eigen::MatrixXd COM(3, 1);
215 
216  mass = totalMass(0);
217 
218  COM = MC / mass;
219 
220  return COM;
221 }
222 
224 {
225  if (joint_ID == -1)
226  return;
227 
228  manipulator_link_data_[0]->position_ = Eigen::MatrixXd::Zero(3, 1);
231  manipulator_link_data_[0]->joint_angle_
232  );
233 
234  if (joint_ID != 0)
235  {
236  int parent = manipulator_link_data_[joint_ID]->parent_;
237 
243  manipulator_link_data_[joint_ID]->joint_angle_);
244 
245  manipulator_link_data_[joint_ID]->transformation_.block<3, 1>(0, 3) = manipulator_link_data_[joint_ID]->position_;
246  manipulator_link_data_[joint_ID]->transformation_.block<3, 3>(0, 0) = manipulator_link_data_[joint_ID]->orientation_;
247  }
248 
249  forwardKinematics(manipulator_link_data_[joint_ID]->sibling_);
250  forwardKinematics(manipulator_link_data_[joint_ID]->child_);
251 }
252 
253 Eigen::MatrixXd ManipulatorKinematicsDynamics::calcJacobian(std::vector<int> idx)
254 {
255  int idx_size = idx.size();
256  int end = idx_size - 1;
257 
258  Eigen::MatrixXd tar_position = manipulator_link_data_[idx[end]]->position_;
259  Eigen::MatrixXd Jacobian = Eigen::MatrixXd::Zero(6, idx_size);
260 
261  for (int index = 0; index < idx_size; index++)
262  {
263  int id = idx[index];
264 
265  Eigen::MatrixXd tar_orientation = manipulator_link_data_[id]->orientation_ * manipulator_link_data_[id]->joint_axis_;
266 
267  Jacobian.block(0, index, 3, 1) = robotis_framework::calcCross(tar_orientation,
268  tar_position - manipulator_link_data_[id]->position_);
269  Jacobian.block(3, index, 3, 1) = tar_orientation;
270  }
271 
272  return Jacobian;
273 }
274 
275 Eigen::MatrixXd ManipulatorKinematicsDynamics::calcJacobianCOM(std::vector<int> idx)
276 {
277  int idx_size = idx.size();
278  int end = idx_size - 1;
279 
280  Eigen::MatrixXd target_position = manipulator_link_data_[idx[end]]->position_;
281  Eigen::MatrixXd jacobianCOM = Eigen::MatrixXd::Zero(6, idx_size);
282 
283  for (int index = 0; index < idx_size; index++)
284  {
285  int id = idx[index];
286  double mass = totalMass(id);
287 
288  Eigen::MatrixXd og = calcMC(id) / mass - manipulator_link_data_[id]->position_;
289  Eigen::MatrixXd target_orientation = manipulator_link_data_[id]->orientation_ * manipulator_link_data_[id]->joint_axis_;
290 
291  jacobianCOM.block(0, index, 3, 1) = robotis_framework::calcCross(target_orientation, og);
292  jacobianCOM.block(3, index, 3, 1) = target_orientation;
293  }
294 
295  return jacobianCOM;
296 }
297 
298 Eigen::MatrixXd ManipulatorKinematicsDynamics::calcVWerr(Eigen::MatrixXd tar_position, Eigen::MatrixXd curr_position,
299  Eigen::MatrixXd tar_orientation, Eigen::MatrixXd curr_orientation)
300 {
301  Eigen::MatrixXd pos_err = tar_position - curr_position;
302  Eigen::MatrixXd ori_err1 = curr_orientation.inverse() * tar_orientation;
303  Eigen::MatrixXd ori_err2 = curr_orientation * robotis_framework::convertRotToOmega(ori_err1);
304 
305  Eigen::MatrixXd err = Eigen::MatrixXd::Zero(6, 1);
306  err.block(0, 0, 3, 1) = pos_err;
307  err.block(3, 0, 3, 1) = ori_err2;
308 
309  return err;
310 }
311 
312 bool ManipulatorKinematicsDynamics::inverseKinematics(int to, Eigen::MatrixXd tar_position,
313  Eigen::MatrixXd tar_orientation, int max_iter, double ik_err)
314 {
315  bool ik_success = false;
316  bool limit_success = false;
317 
319 
320  std::vector<int> idx = findRoute(to);
321 
322  for (int iter = 0; iter < max_iter; iter++)
323  {
324  Eigen::MatrixXd jacobian = calcJacobian(idx);
325 
326  Eigen::MatrixXd curr_position = manipulator_link_data_[to]->position_;
327  Eigen::MatrixXd curr_orientation = manipulator_link_data_[to]->orientation_;
328 
329  Eigen::MatrixXd err = calcVWerr(tar_position, curr_position, tar_orientation, curr_orientation);
330 
331  if (err.norm() < ik_err)
332  {
333  ik_success = true;
334  break;
335  }
336  else
337  ik_success = false;
338 
339  Eigen::MatrixXd jacobian2 = jacobian * jacobian.transpose();
340  Eigen::MatrixXd jacobian3 = jacobian.transpose() * jacobian2.inverse();
341 
342  Eigen::MatrixXd _delta_angle = jacobian3 * err;
343 
344  for (int id = 0; id < idx.size(); id++)
345  {
346  int joint_num = idx[id];
347  manipulator_link_data_[joint_num]->joint_angle_ += _delta_angle.coeff(id);
348  }
349 
351  }
352 
353  for (int id = 0; id < idx.size(); id++)
354  {
355  int joint_num = idx[id];
356 
357  if (manipulator_link_data_[joint_num]->joint_angle_ >= manipulator_link_data_[joint_num]->joint_limit_max_)
358  {
359  limit_success = false;
360  break;
361  }
362  else if (manipulator_link_data_[joint_num]->joint_angle_ <= manipulator_link_data_[joint_num]->joint_limit_min_)
363  {
364  limit_success = false;
365  break;
366  }
367  else
368  limit_success = true;
369  }
370 
371  if (ik_success == true && limit_success == true)
372  return true;
373  else
374  return false;
375 }
376 
377 bool ManipulatorKinematicsDynamics::inverseKinematics(int from, int to, Eigen::MatrixXd tar_position,
378  Eigen::MatrixXd tar_orientation, int max_iter, double ik_err)
379 {
380  bool ik_success = false;
381  bool limit_success = false;
382 
384 
385  std::vector<int> idx = findRoute(from, to);
386 
387  for (int iter = 0; iter < max_iter; iter++)
388  {
389  Eigen::MatrixXd jacobian = calcJacobian(idx);
390 
391  Eigen::MatrixXd curr_position = manipulator_link_data_[to]->position_;
392  Eigen::MatrixXd curr_orientation = manipulator_link_data_[to]->orientation_;
393 
394  Eigen::MatrixXd err = calcVWerr(tar_position, curr_position, tar_orientation, curr_orientation);
395 
396  if (err.norm() < ik_err)
397  {
398  ik_success = true;
399  break;
400  }
401  else
402  {
403  ik_success = false;
404  }
405 
406  Eigen::MatrixXd jacobian2 = jacobian * jacobian.transpose();
407  Eigen::MatrixXd jacobian3 = jacobian.transpose() * jacobian2.inverse();
408 
409  Eigen::MatrixXd delta_angle = jacobian3 * err;
410 
411  for (int id = 0; id < idx.size(); id++)
412  {
413  int joint_num = idx[id];
414  manipulator_link_data_[joint_num]->joint_angle_ += delta_angle.coeff(id);
415  }
416 
418  }
419 
420  for (int id = 0; id < idx.size(); id++)
421  {
422  int joint_num = idx[id];
423 
424  if (manipulator_link_data_[joint_num]->joint_angle_ >= manipulator_link_data_[joint_num]->joint_limit_max_)
425  {
426  limit_success = false;
427  break;
428  }
429  else if (manipulator_link_data_[joint_num]->joint_angle_ <= manipulator_link_data_[joint_num]->joint_limit_min_)
430  {
431  limit_success = false;
432  break;
433  }
434  else
435  limit_success = true;
436  }
437 
438  if (ik_success == true && limit_success == true)
439  return true;
440  else
441  return false;
442 }
443 
444 }
Eigen::MatrixXd center_of_mass_
Definition: link_data.h:41
bool inverseKinematics(int to, Eigen::MatrixXd tar_position, Eigen::MatrixXd tar_orientation, int max_iter, double ik_err)
Eigen::MatrixXd relative_position_
Definition: link_data.h:39
Eigen::Matrix3d calcHatto(const Eigen::Vector3d &matrix3d)
Eigen::Matrix3d calcRodrigues(const Eigen::Matrix3d &hat_matrix, double angle)
Eigen::Vector3d convertRotToOmega(const Eigen::Matrix3d &rotation)
Eigen::MatrixXd joint_axis_
Definition: link_data.h:40
Eigen::Vector3d getTransitionXYZ(double position_x, double position_y, double position_z)
Eigen::Vector3d calcCross(const Eigen::Vector3d &vector3d_a, const Eigen::Vector3d &vector3d_b)
Eigen::MatrixXd orientation_
Definition: link_data.h:52
Eigen::Matrix3d getInertiaXYZ(double ixx, double ixy, double ixz, double iyy, double iyz, double izz)
Eigen::MatrixXd transformation_
Definition: link_data.h:53
Eigen::MatrixXd calcVWerr(Eigen::MatrixXd tar_position, Eigen::MatrixXd curr_position, Eigen::MatrixXd tar_orientation, Eigen::MatrixXd curr_orientation)


manipulator_h_kinematics_dynamics
Author(s): SCH
autogenerated on Mon Jun 10 2019 14:02:57