foot_trajectory.hpp
Go to the documentation of this file.
1 #ifndef MEMMO_FEET_TRAJECTORIES
2 #define MEMMO_FEET_TRAJECTORIES
3 
4 #include <ndcurves/bezier_curve.h>
5 #include <ndcurves/exact_cubic.h>
6 #include <ndcurves/fwd.h>
7 #include <ndcurves/piecewise_curve.h>
8 #include <ndcurves/se3_curve.h>
9 #include <ndcurves/so3_linear.h>
10 
11 #include <Eigen/Dense>
12 #include <Eigen/StdVector>
13 #include <memory>
14 #include <pinocchio/spatial/se3.hpp>
15 
16 namespace sobec {
17 
18 // Eigen typedef
19 typedef Eigen::Quaternion<double> eQuaternion;
20 typedef Eigen::Vector2d eVector2;
21 typedef Eigen::Vector3d eVector3;
22 typedef Eigen::Matrix<double, 6, 1> eVector6;
23 
24 typedef Eigen::Matrix2d eMatrixRot2d;
25 typedef Eigen::Matrix3d eMatrixRot;
26 typedef Eigen::AngleAxisd eAngleAxis;
27 } // namespace sobec
28 
29 namespace ndcurves {
30 typedef Eigen::Matrix<double, 1, 1> point1_t;
31 
32 typedef piecewise_curve<double, double, true, matrix3_t, point3_t,
33  curve_rotation_t>
35 typedef polynomial<double, double, true, point1_t> polynomial1_t;
36 typedef bezier_curve<double, double, true, point1_t> bezier1_t;
37 typedef piecewise_curve<double, double, true, point1_t> piecewise1_t;
38 typedef piecewise_curve<double, double, true, sobec::eVector2> piecewise2_t;
39 typedef polynomial<double, double, true, sobec::eVector2> polynomial2_t;
40 typedef constant_curve<double, double, true, sobec::eVector2> constant2_t;
41 typedef constant_curve<double, double, true, point1_t> constant1_t;
42 
43 // Template
44 typedef Eigen::VectorXd pointX_t;
45 typedef std::vector<pointX_t, Eigen::aligned_allocator<pointX_t> > t_pointX_t;
46 typedef double time_t;
47 typedef double num_t;
48 typedef ndcurves::exact_cubic<double, double, true, pointX_t> exact_cubic_t;
49 // Example with vector of dimension 3
50 typedef Eigen::Vector3d point3_t;
51 // Creation of waypoint container
52 typedef std::pair<double, pointX_t> Waypoint;
53 typedef std::vector<Waypoint> T_Waypoint;
54 } // namespace ndcurves
55 
56 namespace sobec {
57 
58 const double EPSILON_TIME = 1e-9;
59 
60 // helper geometry struct
61 struct Spatial {
62  static inline double extractYaw(eMatrixRot const& matrix) {
63  return atan2(matrix.data()[1], matrix.data()[0]);
64  }
65 
66  static inline double extractYaw(eQuaternion const& q) {
67  return extractYaw(q.toRotationMatrix());
68  }
69 
70  static inline double extractYaw(pinocchio::SE3 const& matrix) {
71  return extractYaw(matrix.rotation());
72  }
73 
75  static inline eMatrixRot matrixRollPitchYaw(const double& roll,
76  const double& pitch,
77  const double& yaw) {
78  double ca(cos(yaw));
79  double sa(sin(yaw));
80 
81  double cb(cos(pitch));
82  double sb(sin(pitch));
83 
84  double cc(cos(roll));
85  double sc(sin(roll));
86 
87  eMatrixRot temp;
88  temp << ca * cb, ca * sb * sc - sa * cc, ca * sb * cc + sa * sc, sa * cb,
89  sa * sb * sc + ca * cc, sa * sb * cc - ca * sc, -sb, cb * sc, cb * cc;
90  return temp;
91  }
92 
93  static inline eQuaternion quaternionRollPitchYaw(const eVector3& rpy) {
94  return eQuaternion(matrixRollPitchYaw(rpy[0], rpy[1], rpy[2]));
95  }
96 
97  static inline eQuaternion quaternionRollPitchYaw(const double& roll,
98  const double& pitch,
99  const double& yaw) {
100  return eQuaternion(matrixRollPitchYaw(roll, pitch, yaw));
101  }
102 
103  static inline pinocchio::SE3 createMatrix(eQuaternion const& quat,
104  eVector3 const& trans) {
105  pinocchio::SE3 temp;
106  temp.setIdentity();
107  temp.rotation(quat.matrix());
108  temp.translation() = trans;
109  return temp;
110  }
111 };
112 
114  private:
115  typedef ndcurves::Waypoint Waypoint_t;
116 
117  public:
118  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
119 
120  public:
128  FootTrajectory(const double& swing_leg_height,
129  const double swing_pose_penetration = 0.,
130  const double landing_advance = 0.);
131  void generate(const double& t_init, const double& t_end,
132  const pinocchio::SE3& pose_init, const pinocchio::SE3& pose_end,
133  const bool& constant = false);
134  void update(const double time, const pinocchio::SE3& pose_end);
135 
136  double min();
137  double max();
138  double compute_dt(const double& time);
139  pinocchio::SE3 compute(const double& time);
140  pinocchio::SE3 start();
141  pinocchio::SE3 end();
142  eVector3 linear_vel(const double& time);
143  eVector3 angular_vel(const double& time);
144  eVector3 linear_acc(const double& time);
145  eVector3 angular_acc(const double& time);
146 
147  const bool is_constant() { return constant_; }
148 
149  private:
150  pinocchio::SE3 average(const pinocchio::SE3& a, const pinocchio::SE3& b);
151 
152  ndcurves::polynomial1_t build_height_predef_trajectory(const double p,
153  const double t_init,
154  const double t_end,
155  const double offset,
156  const bool up);
157 
158  ndcurves::bezier1_t build_height_predef_lift(const double p,
159  const double t_init,
160  const double t_end);
161 
162  ndcurves::bezier1_t build_height_predef_landing(const double p,
163  const double t_init,
164  const double t_end);
165 
166  void build_height_trajectory(const double& t_init, const double& t_end,
167  const double& z_init, const double& z_end,
168  const double& v_init = 0.,
169  const double& a_init = 0.,
170  const double& j_init = 0.);
171 
172  void build_height_trajectory_minjerk(
173  const double& t_init, const double& t_end, const double& z_init,
174  const double& z_end, const double& v_init = 0., const double& a_init = 0.,
175  const double& j_init = 0.);
176 
177  void build_translation_trajectory(const double& t_init, const double& t_end,
178  const eVector2& p_init,
179  const eVector2& p_end,
180  const eVector2& v_init = eVector2::Zero(),
181  const eVector2& a_init = eVector2::Zero());
182 
183  void build_yaw_trajectory(const double& t_init, const double& t_end,
184  const double& yaw_init, const double& yaw_end,
185  const double& delta_yaw_init = 0.,
186  const double& v_init = 0.,
187  const double& a_init = 0.);
188 
189  ndcurves::bezier1_t build_height_middle_trajectory(
190  const double& t_init, const double& t_end, const double p0,
191  const double v0, const double a0, const double j0, const double p1,
192  const double v1, const double a1, const double j1);
193 
194  ndcurves::polynomial2_t build_translation_middle_trajectory(
195  const double& t_init, const double& t_end, const eVector2& p_init,
196  const eVector2& p_end, const eVector2& v_init, const eVector2& a_init);
197 
198  ndcurves::polynomial1_t build_yaw_middle_trajectory(
199  const double& t_init, const double& t_end, const double& yaw_init,
200  const double& yaw_end, const double& delta_yaw_init, const double& v_init,
201  const double& a_init);
202 
203  private:
204  // Original paramters before end position update.
205  pinocchio::SE3 pose_init_, pose_end_;
206  double t_init_;
207  double t_end_;
208 
209  bool constant_;
210 
211  pinocchio::SE3 previous_pose_end_;
212 
213  // Curves.
214  ndcurves::piecewise1_t yaw_traj_;
215  ndcurves::piecewise2_t translation_traj_;
216  ndcurves::piecewise1_t height_traj_;
217 
218  double swing_leg_height_;
219  double swing_pose_penetration_;
220  double landing_advance_;
221  double lift_factor_;
222  double land_factor_;
223  double lift_offset_;
224  double land_offset_;
225  double lift_end_time_, land_begin_time_;
226  ndcurves::point3_t normal_;
227 };
228 
229 typedef std::shared_ptr<FootTrajectory> FootTrajectory_ptr;
230 
231 } // namespace sobec
232 
233 #endif // MEMMO_FEET_TRAJECTORIES
sobec::eQuaternion
Eigen::Quaternion< double > eQuaternion
Definition: foot_trajectory.hpp:19
sobec::eAngleAxis
Eigen::AngleAxisd eAngleAxis
Definition: foot_trajectory.hpp:26
ndcurves::num_t
double num_t
Definition: foot_trajectory.hpp:47
ndcurves::constant1_t
constant_curve< double, double, true, point1_t > constant1_t
Definition: foot_trajectory.hpp:41
sobec::FootTrajectory
Definition: foot_trajectory.hpp:113
ndcurves::time_t
double time_t
Definition: foot_trajectory.hpp:46
sobec::eVector2
Eigen::Vector2d eVector2
Definition: fwd.hpp:144
sobec::FootTrajectory::start
pinocchio::SE3 start()
Definition: foot_trajectory.cpp:534
sobec::FootTrajectory::compute_dt
double compute_dt(const double &time)
Definition: foot_trajectory.cpp:498
sobec::FootTrajectory::is_constant
const bool is_constant()
Definition: foot_trajectory.hpp:147
sobec::EPSILON_TIME
const double EPSILON_TIME
Definition: foot_trajectory.hpp:58
sobec::FootTrajectory::linear_vel
eVector3 linear_vel(const double &time)
Definition: foot_trajectory.cpp:544
sobec::FootTrajectory::linear_acc
eVector3 linear_acc(const double &time)
Definition: foot_trajectory.cpp:563
ndcurves::t_pointX_t
std::vector< pointX_t, Eigen::aligned_allocator< pointX_t > > t_pointX_t
Definition: foot_trajectory.hpp:45
ndcurves::piecewise2_t
piecewise_curve< double, double, true, sobec::eVector2 > piecewise2_t
Definition: foot_trajectory.hpp:38
sobec::Spatial::extractYaw
static double extractYaw(pinocchio::SE3 const &matrix)
Definition: foot_trajectory.hpp:70
sobec::Spatial::quaternionRollPitchYaw
static eQuaternion quaternionRollPitchYaw(const double &roll, const double &pitch, const double &yaw)
Definition: foot_trajectory.hpp:97
sobec
Definition: activation-quad-ref.hpp:19
ndcurves::polynomial1_t
polynomial< double, double, true, point1_t > polynomial1_t
Definition: foot_trajectory.hpp:35
ndcurves
Definition: foot_trajectory.hpp:29
sobec::FootTrajectory::update
void update(const double time, const pinocchio::SE3 &pose_end)
Definition: foot_trajectory.cpp:426
ndcurves::exact_cubic_t
ndcurves::exact_cubic< double, double, true, pointX_t > exact_cubic_t
Definition: foot_trajectory.hpp:48
ndcurves::Waypoint
std::pair< double, pointX_t > Waypoint
Definition: foot_trajectory.hpp:52
ndcurves::T_Waypoint
std::vector< Waypoint > T_Waypoint
Definition: foot_trajectory.hpp:53
ndcurves::piecewise_SO3_t
piecewise_curve< double, double, true, matrix3_t, point3_t, curve_rotation_t > piecewise_SO3_t
Definition: foot_trajectory.hpp:34
sobec::FootTrajectory::generate
void generate(const double &t_init, const double &t_end, const pinocchio::SE3 &pose_init, const pinocchio::SE3 &pose_end, const bool &constant=false)
Definition: foot_trajectory.cpp:372
sobec::Spatial::quaternionRollPitchYaw
static eQuaternion quaternionRollPitchYaw(const eVector3 &rpy)
Definition: foot_trajectory.hpp:93
sobec::Spatial::createMatrix
static pinocchio::SE3 createMatrix(eQuaternion const &quat, eVector3 const &trans)
Definition: foot_trajectory.hpp:103
ndcurves::point3_t
Eigen::Vector3d point3_t
Definition: foot_trajectory.hpp:50
sobec::FootTrajectory::end
pinocchio::SE3 end()
Definition: foot_trajectory.cpp:539
sobec::eVector6
Eigen::Matrix< double, 6, 1 > eVector6
Definition: fwd.hpp:141
sobec::FootTrajectory::max
double max()
Definition: foot_trajectory.cpp:491
sobec::eMatrixRot
Eigen::Matrix3d eMatrixRot
Definition: flexibility_compensation.hpp:11
sobec::FootTrajectory::angular_vel
eVector3 angular_vel(const double &time)
Definition: foot_trajectory.cpp:555
sobec::Spatial
Definition: foot_trajectory.hpp:61
ndcurves::pointX_t
Eigen::VectorXd pointX_t
Definition: foot_trajectory.hpp:44
ndcurves::piecewise1_t
piecewise_curve< double, double, true, point1_t > piecewise1_t
Definition: foot_trajectory.hpp:37
ndcurves::polynomial2_t
polynomial< double, double, true, sobec::eVector2 > polynomial2_t
Definition: foot_trajectory.hpp:39
ndcurves::bezier1_t
bezier_curve< double, double, true, point1_t > bezier1_t
Definition: foot_trajectory.hpp:36
sobec::Spatial::matrixRollPitchYaw
static eMatrixRot matrixRollPitchYaw(const double &roll, const double &pitch, const double &yaw)
see http://planning.cs.uiuc.edu/node102.html
Definition: foot_trajectory.hpp:75
ndcurves::point1_t
Eigen::Matrix< double, 1, 1 > point1_t
Definition: foot_trajectory.hpp:30
sobec::eMatrixRot2d
Eigen::Matrix2d eMatrixRot2d
Definition: foot_trajectory.hpp:24
sobec::FootTrajectory::angular_acc
eVector3 angular_acc(const double &time)
Definition: foot_trajectory.cpp:574
sobec::FootTrajectory::FootTrajectory
FootTrajectory(const double &swing_leg_height, const double swing_pose_penetration=0., const double landing_advance=0.)
FootTrajectory.
Definition: foot_trajectory.cpp:4
sobec::FootTrajectory_ptr
std::shared_ptr< FootTrajectory > FootTrajectory_ptr
Definition: foot_trajectory.hpp:229
sobec::Spatial::extractYaw
static double extractYaw(eQuaternion const &q)
Definition: foot_trajectory.hpp:66
ndcurves::constant2_t
constant_curve< double, double, true, sobec::eVector2 > constant2_t
Definition: foot_trajectory.hpp:40
sobec::Spatial::extractYaw
static double extractYaw(eMatrixRot const &matrix)
Definition: foot_trajectory.hpp:62
sobec::eVector3
Eigen::Vector3d eVector3
Definition: fwd.hpp:143
sobec::FootTrajectory::min
double min()
Definition: foot_trajectory.cpp:484
sobec::FootTrajectory::compute
pinocchio::SE3 compute(const double &time)
Definition: foot_trajectory.cpp:509