trajectory_collection
ElementInterpolation.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <SpaceVecAlg/SpaceVecAlg>
4 
5 namespace TrajColl
6 {
13 template<class T>
14 inline T interpolate(const T & start, const T & end, double ratio)
15 {
16  return (1 - ratio) * start + ratio * end;
17 }
18 
24 template<>
25 inline Eigen::Quaterniond interpolate(const Eigen::Quaterniond & start, const Eigen::Quaterniond & end, double ratio)
26 {
27  return start.slerp(ratio, end);
28 }
29 
35 template<>
36 inline Eigen::Matrix3d interpolate(const Eigen::Matrix3d & start, const Eigen::Matrix3d & end, double ratio)
37 {
38  return interpolate<Eigen::Quaterniond>(Eigen::Quaterniond(start), Eigen::Quaterniond(end), ratio).toRotationMatrix();
39 }
40 
46 template<>
47 inline sva::PTransformd interpolate(const sva::PTransformd & start, const sva::PTransformd & end, double ratio)
48 {
49  return sva::interpolate(start, end, ratio);
50 }
51 
60 template<class T, class U = T>
61 inline U interpolateDerivative(const T & start,
62  const T & end,
63  double, // ratio
64  int order = 1)
65 {
66  if(order == 1)
67  {
68  return end - start;
69  }
70  else
71  {
72  T ret = start; // Dummy initialization for dynamic size class
73  ret.setZero();
74  return ret;
75  }
76 }
77 
84 template<>
85 inline double interpolateDerivative(const double & start,
86  const double & end,
87  double, // ratio
88  int order)
89 {
90  if(order == 1)
91  {
92  return end - start;
93  }
94  else
95  {
96  return 0.0;
97  }
98 }
99 
106 template<>
107 inline Eigen::Vector3d interpolateDerivative(const Eigen::Quaterniond & start,
108  const Eigen::Quaterniond & end,
109  double, // ratio
110  int order)
111 {
112  if(order == 1)
113  {
114  Eigen::AngleAxisd aa(start.inverse() * end);
115  return aa.angle() * aa.axis();
116  }
117  else
118  {
119  return Eigen::Vector3d::Zero();
120  }
121 }
122 
129 template<>
130 inline Eigen::Vector3d interpolateDerivative(const Eigen::Matrix3d & start,
131  const Eigen::Matrix3d & end,
132  double, // ratio
133  int order)
134 {
135  if(order == 1)
136  {
137  Eigen::AngleAxisd aa(start.transpose() * end);
138  return aa.angle() * aa.axis();
139  }
140  else
141  {
142  return Eigen::Vector3d::Zero();
143  }
144 }
145 
152 template<>
153 inline sva::MotionVecd interpolateDerivative(const sva::PTransformd & start,
154  const sva::PTransformd & end,
155  double, // ratio
156  int order)
157 {
158  if(order == 1)
159  {
160  return sva::transformError(start, end);
161  }
162  else
163  {
164  return sva::MotionVecd::Zero();
165  }
166 }
167 
174 template<>
175 inline sva::ForceVecd interpolateDerivative(const sva::ForceVecd & start,
176  const sva::ForceVecd & end,
177  double, // ratio
178  int order)
179 {
180  if(order == 1)
181  {
182  return end - start;
183  }
184  else
185  {
186  return sva::ForceVecd::Zero();
187  }
188 }
189 } // namespace TrajColl
TrajColl
Definition: BangBangInterpolator.h:7
TrajColl::interpolate
T interpolate(const T &start, const T &end, double ratio)
Calculate the value interpolating from start to end.
Definition: ElementInterpolation.h:14
TrajColl::interpolate
sva::PTransformd interpolate(const sva::PTransformd &start, const sva::PTransformd &end, double ratio)
Calculate the pose interpolating from start to end.
Definition: ElementInterpolation.h:47
TrajColl::interpolateDerivative
U interpolateDerivative(const T &start, const T &end, double, int order=1)
Calculate the derivative value interpolating from start to end.
Definition: ElementInterpolation.h:61