robotis_manipulator_trajectory_generator.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 /* Authors: Darby Lim, Hye-Jong KIM, Ryan Shim, Yong-Ho Na */
18 
19 #include "../../include/robotis_manipulator/robotis_manipulator_trajectory_generator.h"
20 
21 using namespace robotis_manipulator;
22 
24 {
25  coefficient_ = Eigen::VectorXd::Zero(6);
26 }
27 
29 
31  Point goal,
32  double move_time)
33 {
34  Eigen::Matrix3d A = Eigen::Matrix3d::Identity(3, 3);
35  Eigen::Vector3d x = Eigen::Vector3d::Zero();
36  Eigen::Vector3d b = Eigen::Vector3d::Zero();
37 
38  A << pow(move_time, 3), pow(move_time, 4), pow(move_time, 5),
39  3 * pow(move_time, 2), 4 * pow(move_time, 3), 5 * pow(move_time, 4),
40  6 * pow(move_time, 1), 12 * pow(move_time, 2), 20 * pow(move_time, 3);
41 
42  coefficient_(0) = start.position;
43  coefficient_(1) = start.velocity;
44  coefficient_(2) = 0.5 * start.acceleration;
45 
46  b << (goal.position - start.position - (start.velocity * move_time + 0.5 * start.acceleration * pow(move_time, 2))),
47  (goal.velocity - start.velocity - (start.acceleration * move_time)),
48  (goal.acceleration - start.acceleration);
49 
50  Eigen::ColPivHouseholderQR<Eigen::Matrix3d> dec(A);
51  x = dec.solve(b);
52 
53  coefficient_(3) = x(0);
54  coefficient_(4) = x(1);
55  coefficient_(5) = x(2);
56 }
57 
58 Eigen::VectorXd MinimumJerk::getCoefficient()
59 {
60  return coefficient_;
61 }
62 
63 //-------------------- Joint trajectory --------------------//
64 
66 {}
67 
69 
71  JointWaypoint goal)
72 {
73  coefficient_size_ = start.size();
74  minimum_jerk_coefficient_.resize(6,coefficient_size_);
75  for (uint8_t index = 0; index < coefficient_size_; index++)
76  {
77  minimum_jerk_trajectory_generator_.calcCoefficient(start.at(index),
78  goal.at(index),
79  move_time);
80 
81  minimum_jerk_coefficient_.col(index) = minimum_jerk_trajectory_generator_.getCoefficient();
82  }
83  return true;
84 }
85 
87 {
88  JointWaypoint joint_way_point;
89  for (uint8_t index = 0; index < coefficient_size_; index++)
90  {
91  JointValue single_joint_way_point;
92 
93  single_joint_way_point.position = minimum_jerk_coefficient_(0, index) +
94  minimum_jerk_coefficient_(1, index) * pow(tick, 1) +
95  minimum_jerk_coefficient_(2, index) * pow(tick, 2) +
96  minimum_jerk_coefficient_(3, index) * pow(tick, 3) +
97  minimum_jerk_coefficient_(4, index) * pow(tick, 4) +
98  minimum_jerk_coefficient_(5, index) * pow(tick, 5);
99 
100  single_joint_way_point.velocity = minimum_jerk_coefficient_(1, index) +
101  2 * minimum_jerk_coefficient_(2, index) * pow(tick, 1) +
102  3 * minimum_jerk_coefficient_(3, index) * pow(tick, 2) +
103  4 * minimum_jerk_coefficient_(4, index) * pow(tick, 3) +
104  5 * minimum_jerk_coefficient_(5, index) * pow(tick, 4);
105 
106  single_joint_way_point.acceleration = 2 * minimum_jerk_coefficient_(2, index) +
107  6 * minimum_jerk_coefficient_(3, index) * pow(tick, 1) +
108  12 * minimum_jerk_coefficient_(4, index) * pow(tick, 2) +
109  20 * minimum_jerk_coefficient_(5, index) * pow(tick, 3);
110 
111  single_joint_way_point.effort = 0.0;
112 
113  joint_way_point.push_back(single_joint_way_point);
114  }
115 
116  return joint_way_point;
117 }
118 
120 {
121  return minimum_jerk_coefficient_;
122 }
123 
124 //-------------------- Task trajectory --------------------//
125 
127 {
128  minimum_jerk_coefficient_ = Eigen::MatrixXd::Identity(6, 4);
129 }
131 
133  TaskWaypoint goal)
134 {
135  std::vector<Point> start_way_point;
136  std::vector<Point> goal_way_point;
137 
139  for(uint8_t i = 0; i < 3; i++) //x, y, z
140  {
141  Point position_temp;
142  position_temp.position = start.kinematic.position[i];
143  position_temp.velocity = start.dynamic.linear.velocity[i];
144  position_temp.acceleration = start.dynamic.linear.acceleration[i];
145  position_temp.effort = 0.0;
146  start_way_point.push_back(position_temp);
147 
148  position_temp.position = goal.kinematic.position[i];
149  position_temp.velocity = goal.dynamic.linear.velocity[i];
150  position_temp.acceleration = goal.dynamic.linear.acceleration[i];
151  position_temp.effort = 0.0;
152  goal_way_point.push_back(position_temp);
153  }
155 
157 
158  Eigen::Vector3d start_orientation_rpy;
159  Eigen::Vector3d start_ang_vel_rpy;
160  Eigen::Vector3d start_ang_acc_rpy;
161 
162  start_orientation_rpy = math::convertRotationMatrixToRPYVector(start.kinematic.orientation);
163  start_ang_vel_rpy = math::convertOmegaToRPYVelocity(start_orientation_rpy, start.dynamic.angular.velocity);
164  start_ang_acc_rpy = math::convertOmegaDotToRPYAcceleration(start_orientation_rpy, start_ang_vel_rpy, start.dynamic.angular.acceleration);
165 
166  Eigen::Vector3d goal_orientation_rpy;
167  Eigen::Vector3d goal_ang_vel_rpy;
168  Eigen::Vector3d goal_ang_acc_rpy;
169 
170  goal_orientation_rpy = math::convertRotationMatrixToRPYVector(goal.kinematic.orientation);
171  goal_ang_vel_rpy = math::convertOmegaToRPYVelocity(goal_orientation_rpy, goal.dynamic.angular.velocity);
172  start_ang_acc_rpy = math::convertOmegaDotToRPYAcceleration(goal_orientation_rpy, goal_ang_vel_rpy, goal.dynamic.angular.acceleration);
173 
174  for(uint8_t i = 0; i < 3; i++) //roll, pitch, yaw
175  {
176  Point orientation_temp;
177  orientation_temp.position = start_orientation_rpy[i];
178  orientation_temp.velocity = start_ang_vel_rpy[i];
179  orientation_temp.acceleration = start_ang_acc_rpy[i];
180  orientation_temp.effort = 0.0;
181  start_way_point.push_back(orientation_temp);
182 
183  orientation_temp.position = goal_orientation_rpy[i];
184  orientation_temp.velocity = goal_ang_vel_rpy[i];
185  orientation_temp.acceleration = goal_ang_acc_rpy[i];
186  orientation_temp.effort = 0.0;
187  goal_way_point.push_back(orientation_temp);
188  }
190 
191  coefficient_size_ = start_way_point.size();
192  minimum_jerk_coefficient_.resize(6,coefficient_size_);
193  for (uint8_t index = 0; index < coefficient_size_; index++)
194  {
195  minimum_jerk_trajectory_generator_.calcCoefficient(start_way_point.at(index),
196  goal_way_point.at(index),
197  move_time);
198 
199  minimum_jerk_coefficient_.col(index) = minimum_jerk_trajectory_generator_.getCoefficient();
200  }
201  return true;
202 }
203 
205 {
206  std::vector<Point> result_point;
207  for (uint8_t index = 0; index < coefficient_size_; index++)
208  {
209  Point single_task_way_point;
210 
211  single_task_way_point.position = minimum_jerk_coefficient_(0, index) +
212  minimum_jerk_coefficient_(1, index) * pow(tick, 1) +
213  minimum_jerk_coefficient_(2, index) * pow(tick, 2) +
214  minimum_jerk_coefficient_(3, index) * pow(tick, 3) +
215  minimum_jerk_coefficient_(4, index) * pow(tick, 4) +
216  minimum_jerk_coefficient_(5, index) * pow(tick, 5);
217 
218  single_task_way_point.velocity = minimum_jerk_coefficient_(1, index) +
219  2 * minimum_jerk_coefficient_(2, index) * pow(tick, 1) +
220  3 * minimum_jerk_coefficient_(3, index) * pow(tick, 2) +
221  4 * minimum_jerk_coefficient_(4, index) * pow(tick, 3) +
222  5 * minimum_jerk_coefficient_(5, index) * pow(tick, 4);
223 
224  single_task_way_point.acceleration = 2 * minimum_jerk_coefficient_(2, index) +
225  6 * minimum_jerk_coefficient_(3, index) * pow(tick, 1) +
226  12 * minimum_jerk_coefficient_(4, index) * pow(tick, 2) +
227  20 * minimum_jerk_coefficient_(5, index) * pow(tick, 3);
228 
229  single_task_way_point.effort = 0.0;
230 
231  result_point.push_back(single_task_way_point);
232  }
233 
234  TaskWaypoint task_way_point;
236  for(uint8_t i = 0; i < 3; i++) //x ,y ,z
237  {
238  task_way_point.kinematic.position[i] = result_point.at(i).position;
239  task_way_point.dynamic.linear.velocity[i] = result_point.at(i).velocity;
240  task_way_point.dynamic.linear.acceleration[i] = result_point.at(i).acceleration;
241  }
243 
245  Eigen::Vector3d rpy_orientation;
246  rpy_orientation << result_point.at(3).position, result_point.at(4).position, result_point.at(5).position;
247  task_way_point.kinematic.orientation = math::convertRPYToRotationMatrix(result_point.at(3).position, //roll
248  result_point.at(4).position, //pitch
249  result_point.at(5).position); //yaw
250 
251  Eigen::Vector3d rpy_velocity;
252  rpy_velocity << result_point.at(3).velocity, result_point.at(4).velocity, result_point.at(5).velocity;
253  task_way_point.dynamic.angular.velocity = math::convertRPYVelocityToOmega(rpy_orientation, rpy_velocity);
254 
255  Eigen::Vector3d rpy_acceleration;
256  rpy_acceleration << result_point.at(3).acceleration, result_point.at(4).acceleration, result_point.at(5).acceleration;
257  task_way_point.dynamic.angular.acceleration = math::convertRPYAccelerationToOmegaDot(rpy_orientation, rpy_velocity, rpy_acceleration);
258 
259  return task_way_point;
260 }
261 
263 {
264  return minimum_jerk_coefficient_;
265 }
266 
267 
268 /*****************************************************************************
269 ** Trajectory Class
270 *****************************************************************************/
271 void Trajectory::setMoveTime(double move_time)
272 {
273  trajectory_time_.total_move_time = move_time;
274 }
275 
276 void Trajectory::setPresentTime(double present_time)
277 {
278  trajectory_time_.present_time = present_time;
279 }
280 
282 {
283  trajectory_time_.start_time = trajectory_time_.present_time;
284 }
285 
286 void Trajectory::setStartTime(double start_time)
287 {
288  trajectory_time_.start_time = start_time;
289 }
290 
292 {
293  return trajectory_time_.total_move_time;
294 }
295 
297 {
298  return trajectory_time_.present_time - trajectory_time_.start_time;
299 }
300 
302 {
303  manipulator_= manipulator;
304 }
305 
307 {
308  return &manipulator_;
309 }
310 
312 {
313  return joint_;
314 }
315 
317 {
318  return task_;
319 }
320 
322 {
323  return cus_joint_.at(name);
324 }
325 
327 {
328  return cus_task_.at(name);
329 }
330 
331 void Trajectory::addCustomTrajectory(Name trajectory_name, CustomJointTrajectory *custom_trajectory)
332 {
333  cus_joint_.insert(std::make_pair(trajectory_name, custom_trajectory));
334 }
335 
336 void Trajectory::addCustomTrajectory(Name trajectory_name, CustomTaskTrajectory *custom_trajectory)
337 {
338  cus_task_.insert(std::make_pair(trajectory_name, custom_trajectory));
339 }
340 
341 void Trajectory::setCustomTrajectoryOption(Name trajectory_name, const void* arg)
342 {
343  if(cus_joint_.find(trajectory_name) != cus_joint_.end())
344  cus_joint_.at(trajectory_name)->setOption(arg);
345  else if(cus_task_.find(trajectory_name) != cus_task_.end())
346  cus_task_.at(trajectory_name)->setOption(arg);
347 }
348 
349 void Trajectory::setPresentControlToolName(Name present_control_tool_name)
350 {
351  present_control_tool_name_ = present_control_tool_name;
352 }
353 
355 {
356  return present_custom_trajectory_name_;
357 }
358 
360 {
361  return present_control_tool_name_;
362 }
363 
364 void Trajectory::initTrajectoryWaypoint(Manipulator actual_manipulator, Kinematics *kinematics)
365 {
366  setManipulator(actual_manipulator);
367  JointWaypoint joint_way_point_vector;
368  joint_way_point_vector = getManipulator()->getAllActiveJointValue();
369 
370  setPresentJointWaypoint(joint_way_point_vector);
371  if(kinematics != nullptr)
372  updatePresentWaypoint(kinematics);
373 }
374 
376 {
377  //kinematics
378  kinematics->solveForwardKinematics(&manipulator_);
379 }
380 
382 {
383  manipulator_.setAllActiveJointValue(joint_value_vector);
384 }
385 
386 void Trajectory::setPresentTaskWaypoint(Name tool_name, TaskWaypoint tool_value_vector)
387 {
388  manipulator_.setComponentPoseFromWorld(tool_name, tool_value_vector);
389 }
390 
392 {
393  return manipulator_.getAllActiveJointValue();
394 }
395 
397 {
398  return manipulator_.getComponentPoseFromWorld(tool_name);
399 }
400 
402 {
403  for(uint32_t index =0; index < value.size(); index++)
404  {
405  value.at(index).velocity = 0.0;
406  value.at(index).acceleration = 0.0;
407  value.at(index).effort = 0.0;
408  }
409  return value;
410 }
411 
413 {
414  value.dynamic.linear.velocity = Eigen::Vector3d::Zero(3);
415  value.dynamic.linear.acceleration = Eigen::Vector3d::Zero(3);
416  value.dynamic.angular.velocity = Eigen::Vector3d::Zero(3);
417  value.dynamic.angular.acceleration = Eigen::Vector3d::Zero(3);
418  return value;
419 }
420 
421 
422 //Trajectory
424 {
425  trajectory_type_ = trajectory_type;
426 }
427 
429 {
430  if(trajectory_type_==trajectory_type)
431  return true;
432  else
433  return false;
434 }
435 
436 bool Trajectory::makeJointTrajectory(JointWaypoint start_way_point, JointWaypoint goal_way_point)
437 {
438  return joint_.makeJointTrajectory(trajectory_time_.total_move_time, start_way_point, goal_way_point);
439 }
440 
441 bool Trajectory::makeTaskTrajectory(TaskWaypoint start_way_point, TaskWaypoint goal_way_point)
442 {
443  return task_.makeTaskTrajectory(trajectory_time_.total_move_time, start_way_point, goal_way_point);
444 }
445 
446 bool Trajectory::makeCustomTrajectory(Name trajectory_name, JointWaypoint start_way_point, const void *arg)
447 {
448  if(cus_joint_.find(trajectory_name) != cus_joint_.end())
449  {
450  present_custom_trajectory_name_ = trajectory_name;
451  cus_joint_.at(trajectory_name)->makeJointTrajectory(trajectory_time_.total_move_time, start_way_point, arg);
452  return true;
453  }
454  else
455  {
456  log::error("[makeCustomTrajectory] Wrong way point type.");
457  return false;
458  }
459 }
460 
461 bool Trajectory::makeCustomTrajectory(Name trajectory_name, TaskWaypoint start_way_point, const void *arg)
462 {
463  if(cus_task_.find(trajectory_name) != cus_task_.end())
464  {
465  present_custom_trajectory_name_ = trajectory_name;
466  cus_task_.at(trajectory_name)->makeTaskTrajectory(trajectory_time_.total_move_time, start_way_point, arg);
467  return true;
468  }
469  else
470  {
471  log::error("[makeCustomTrajectory] Wrong way point type.");
472  return false;
473  }
474 }
475 
476 //tool
477 bool Trajectory::setToolGoalPosition(Name tool_name, double tool_goal_position)
478 {
479  manipulator_.setJointPosition(tool_name, tool_goal_position);
480  return true;
481 }
482 
483 
484 bool Trajectory::setToolGoalValue(Name tool_name, JointValue tool_goal_value)
485 {
486  manipulator_.setJointValue(tool_name, tool_goal_value);
487  return true;
488 }
489 
491 {
492  return manipulator_.getJointPosition(tool_name);
493 }
494 
496 {
497  return manipulator_.getJointValue(tool_name);
498 }
bool makeJointTrajectory(JointWaypoint start_way_point, JointWaypoint goal_way_point)
makeJointTrajectory
void setPresentJointWaypoint(JointWaypoint joint_value_vector)
bool setToolGoalValue(Name tool_name, JointValue tool_goal_value)
setToolGoalValue
enum robotis_manipulator::_TrajectoryType TrajectoryType
virtual void solveForwardKinematics(Manipulator *manipulator)=0
void setPresentControlToolName(Name present_control_tool_name)
void addCustomTrajectory(Name trajectory_name, CustomJointTrajectory *custom_trajectory)
void calcCoefficient(Point start, Point goal, double move_time)
void initTrajectoryWaypoint(Manipulator actual_manipulator, Kinematics *kinematics=nullptr)
bool checkTrajectoryType(TrajectoryType trajectory_type)
Eigen::Vector3d convertRPYVelocityToOmega(Eigen::Vector3d rpy_vector, Eigen::Vector3d rpy_velocity)
void setPresentTaskWaypoint(Name tool_name, TaskWaypoint tool_position_value_vector)
void setTrajectoryType(TrajectoryType trajectory_type)
CustomJointTrajectory * getCustomJointTrajectory(Name name)
std::vector< JointValue > JointWaypoint
bool makeCustomTrajectory(Name trajectory_name, JointWaypoint start_way_point, const void *arg)
makeCustomTrajectory
Eigen::Vector3d convertRPYAccelerationToOmegaDot(Eigen::Vector3d rpy_vector, Eigen::Vector3d rpy_velocity, Eigen::Vector3d rpy_acceleration)
Eigen::Vector3d convertOmegaToRPYVelocity(Eigen::Vector3d rpy_vector, Eigen::Vector3d omega)
double getToolGoalPosition(Name tool_name)
getToolGoalPosition
bool makeTaskTrajectory(TaskWaypoint start_way_point, TaskWaypoint goal_way_point)
makeTaskTrajectory
bool setToolGoalPosition(Name tool_name, double tool_goal_position)
setToolGoalPosition
Eigen::Vector3d convertRotationMatrixToRPYVector(const Eigen::Matrix3d &rotation_matrix)
JointWaypoint removeWaypointDynamicData(JointWaypoint value)
bool makeTaskTrajectory(double move_time, TaskWaypoint start, TaskWaypoint goal)
makeTaskTrajectory
Eigen::Vector3d convertOmegaDotToRPYAcceleration(Eigen::Vector3d rpy_vector, Eigen::Vector3d rpy_velocity, Eigen::Vector3d omega_dot)
void setCustomTrajectoryOption(Name trajectory_name, const void *arg)
bool makeJointTrajectory(double move_time, JointWaypoint start, JointWaypoint goal)
makeJointTrajectory
Eigen::Matrix3d convertRPYToRotationMatrix(double roll, double pitch, double yaw)


robotis_manipulator
Author(s): Hye-Jong KIM , Darby Lim , Yong-Ho Na , Ryan Shim
autogenerated on Sat Oct 3 2020 03:14:51