DMP_BBO library
Dmp.hpp
Go to the documentation of this file.
1 
24 #ifndef _DMP_H_
25 #define _DMP_H_
26 
27 // This must be included before any Eigen header files are included
29 
32 
34 #include <boost/serialization/assume_abstract.hpp>
35 
36 #include <boost/random.hpp>
37 #include <boost/random/variate_generator.hpp>
38 #include <boost/random/normal_distribution.hpp>
39 
40 #include <set>
41 
42 namespace DmpBbo {
43 
44 // forward declaration
45 class FunctionApproximator;
46 class SpringDamperSystem;
47 class Trajectory;
48 
56 class Dmp : public DynamicalSystem, public Parameterizable
57 {
58 public:
59 
61  enum DmpType { IJSPEERT_2002_MOVEMENT, KULVICIUS_2012_JOINING, COUNTDOWN_2013 };
62 
64  enum ForcingTermScaling { NO_SCALING, G_MINUS_Y0_SCALING, AMPLITUDE_SCALING };
65 
78  Dmp(double tau, Eigen::VectorXd y_init, Eigen::VectorXd y_attr,
79  std::vector<FunctionApproximator*> function_approximators,
80  double alpha_spring_damper, DynamicalSystem* goal_system,
81  DynamicalSystem* phase_system, DynamicalSystem* gating_system,
82  ForcingTermScaling scaling=NO_SCALING);
83 
95  Dmp(int n_dims_dmp, std::vector<FunctionApproximator*> function_approximators,
96  double alpha_spring_damper, DynamicalSystem* goal_system,
97  DynamicalSystem* phase_system, DynamicalSystem* gating_system,
98  ForcingTermScaling scaling=NO_SCALING);
99 
109  Dmp(double tau, Eigen::VectorXd y_init, Eigen::VectorXd y_attr,
110  std::vector<FunctionApproximator*> function_approximators,
111  DmpType dmp_type=KULVICIUS_2012_JOINING,
112  ForcingTermScaling scaling=NO_SCALING);
113 
114 
123  Dmp(int n_dims_dmp, std::vector<FunctionApproximator*> function_approximators,
124  DmpType dmp_type=KULVICIUS_2012_JOINING, ForcingTermScaling scaling=NO_SCALING);
125 
134  Dmp(double tau, Eigen::VectorXd y_init, Eigen::VectorXd y_attr, double alpha_spring_damper, DynamicalSystem* goal_system);
135 
137  ~Dmp(void);
138 
142  Dmp* clone(void) const;
143 
144 
145  virtual void integrateStart(Eigen::Ref<Eigen::VectorXd> x, Eigen::Ref<Eigen::VectorXd> xd) const;
146 
148  const Eigen::Ref<const Eigen::VectorXd>& x,
149  Eigen::Ref<Eigen::VectorXd> xd) const;
150 
162  void analyticalSolution(const Eigen::VectorXd& ts, Eigen::MatrixXd& xs, Eigen::MatrixXd& xds, Eigen::MatrixXd& forcing_terms, Eigen::MatrixXd& fa_output) const;
163 
174  inline void analyticalSolution(const Eigen::VectorXd& ts, Eigen::MatrixXd& xs, Eigen::MatrixXd& xds, Eigen::MatrixXd& forcing_terms) const
175  {
176  Eigen::MatrixXd fa_output;
177  analyticalSolution(ts, xs, xds, forcing_terms, fa_output);
178  }
179 
180  inline void analyticalSolution(const Eigen::VectorXd& ts, Eigen::MatrixXd& xs, Eigen::MatrixXd& xds) const
181  {
182  Eigen::MatrixXd forcing_terms, fa_output;
183  analyticalSolution(ts, xs, xds, forcing_terms, fa_output);
184  }
185 
192  virtual void analyticalSolution(const Eigen::VectorXd& ts, Trajectory& trajectory) const
193  {
194  Eigen::MatrixXd xs, xds;
195  analyticalSolution(ts, xs, xds);
196  statesAsTrajectory(ts, xs, xds, trajectory);
197  }
198 
206  inline void analyticalSolution(const Eigen::VectorXd& ts, Trajectory& trajectory, Eigen::MatrixXd& forcing_terms) const
207  {
208  Eigen::MatrixXd xs, xds;
209  analyticalSolution(ts, xs, xds, forcing_terms);
210  statesAsTrajectory(ts, xs, xds, trajectory);
211  }
212 
213 
214 
215 
230  virtual void statesAsTrajectory(const Eigen::MatrixXd& x_in, const Eigen::MatrixXd& xd_in, Eigen::MatrixXd& y_out, Eigen::MatrixXd& yd_out, Eigen::MatrixXd& ydd_out) const;
231 
245  virtual void statesAsTrajectory(const Eigen::VectorXd& ts, const Eigen::MatrixXd& x_in, const Eigen::MatrixXd& xd_in, Trajectory& trajectory) const;
246 
251  virtual void train(const Trajectory& trajectory);
252 
259  virtual void train(const Trajectory& trajectory, std::string save_directory, bool overwrite=false);
260 
267  virtual void set_tau(double tau);
268 
274  virtual void set_initial_state(const Eigen::VectorXd& y_init);
275 
279  virtual void set_attractor_state(const Eigen::VectorXd& y_attr);
280 
281 
286  void set_damping_coefficient(double damping_coefficient);
287 
292  void set_spring_constant(double spring_constant);
293 
294  std::string toString(void) const;
295 
296  //virtual bool isTrained(void) const;
297 
298  void getSelectableParameters(std::set<std::string>& selectable_values_labels) const;
299  void setSelectedParameters(const std::set<std::string>& selected_values_labels);
300 
301  int getParameterVectorAllSize(void) const;
302  void getParameterVectorAll(Eigen::VectorXd& values) const;
303  void setParameterVectorAll(const Eigen::VectorXd& values);
304  void getParameterVectorMask(const std::set<std::string> selected_values_labels, Eigen::VectorXi& selected_mask) const;
305 
313  void computeFunctionApproximatorInputsAndTargets(const Trajectory& trajectory, Eigen::VectorXd& fa_inputs_phase, Eigen::MatrixXd& fa_targets) const;
314 
320  const Eigen::Ref<const Eigen::MatrixXd>& phase_state, Eigen::MatrixXd& fa_output) const;
321 
328  void set_perturbation_analytical_solution(double perturbation_standard_deviation);
329 
335  {
336  return perturbation_standard_deviation_;
337  }
338 
339 protected:
340 
346  {
347  assert(i_dim<(int)function_approximators_.size());
348  return function_approximators_[i_dim];
349  }
350 
351 
352 private:
357  DynamicalSystem* goal_system_;
359  SpringDamperSystem* spring_system_; // end of group_linear
361 
366  DynamicalSystem* phase_system_;
368  DynamicalSystem* gating_system_;
369 
371  std::vector<FunctionApproximator*> function_approximators_;
372 
374  ForcingTermScaling forcing_term_scaling_;
375 
377  Eigen::VectorXd trajectory_amplitudes_;
378 
380  double perturbation_standard_deviation_ = 0.0;
381  // end of group_nonlinear
383 
385  mutable Eigen::VectorXd attractor_state_prealloc_;
386 
388  mutable Eigen::VectorXd initial_state_prealloc_;
389 
391  mutable Eigen::MatrixXd fa_outputs_one_prealloc_;
392 
394  mutable Eigen::MatrixXd fa_outputs_prealloc_;
395 
397  mutable Eigen::MatrixXd fa_output_prealloc_;
398 
400  mutable Eigen::VectorXd forcing_term_prealloc_;
401 
403  mutable Eigen::VectorXd g_minus_y0_prealloc_;
404 
413  void initSubSystems(double alpha_spring_system, DynamicalSystem* goal_system,
414  DynamicalSystem* phase_system, DynamicalSystem* gating_system);
415 
416  void initSubSystems(DmpType dmp_type);
417 
418  void initFunctionApproximators(std::vector<FunctionApproximator*> function_approximators);
419 
421  static boost::mt19937 rng;
422  mutable boost::variate_generator<boost::mt19937&, boost::normal_distribution<> > *analytical_solution_perturber_ = NULL;
423 
424 protected:
425  Dmp(void) {};
426 
427 private:
429  friend class boost::serialization::access;
430 
436  template<class Archive>
437  void serialize(Archive & ar, const unsigned int version);
438 
439 };
440 
441 }
442 
443 #include <boost/serialization/export.hpp>
444 
447 
449 BOOST_CLASS_IMPLEMENTATION(DmpBbo::Dmp,boost::serialization::object_serializable);
450 
451 #endif // _DMP_H_
452 
453 
double tau(void) const
Accessor function for the time constant.
Parameterizable class header file.
void getParameterVectorMask(const std::set< std::string > selected_values_labels, Eigen::VectorXi &selected_mask) const
Get a mask for selecting parameters.
Definition: Dmp.cpp:757
DynamicalSystem class header file.
BOOST_SERIALIZATION_ASSUME_ABSTRACT(DmpBbo::Dmp)
Don&#39;t add version information to archives.
virtual void set_attractor_state(const Eigen::VectorXd &y_attr)
Accessor function for the attractor state of the system.
Definition: Dmp.cpp:873
void getParameterVectorAll(Eigen::VectorXd &values) const
Return a vector that returns all available parameter values.
Definition: Dmp.cpp:813
void analyticalSolution(const Eigen::VectorXd &ts, Eigen::MatrixXd &xs, Eigen::MatrixXd &xds) const
Return analytical solution of the system at certain times.
Definition: Dmp.hpp:180
Implementation of Dynamical Movement Primitives.
Definition: Dmp.hpp:56
virtual void set_tau(double tau)
Accessor function for the time constant.
Definition: Dmp.cpp:853
void computeFunctionApproximatorInputsAndTargets(const Trajectory &trajectory, Eigen::VectorXd &fa_inputs_phase, Eigen::MatrixXd &fa_targets) const
Given a trajectory, compute the inputs and targets for the function approximators.
Definition: Dmp.cpp:583
A class for storing trajectories: positions, velocities and accelerations of variables over time...
Definition: Trajectory.hpp:48
virtual void statesAsTrajectory(const Eigen::MatrixXd &x_in, const Eigen::MatrixXd &xd_in, Eigen::MatrixXd &y_out, Eigen::MatrixXd &yd_out, Eigen::MatrixXd &ydd_out) const
Get the output of a DMP dynamical system as a trajectory.
Definition: Dmp.cpp:410
Class for providing access to a model&#39;s parameters as a vector.
double get_perturbation_analytical_solution() const
Get the perturbation to the forcing term when computing the analytical solution.
Definition: Dmp.hpp:334
int getParameterVectorAllSize(void) const
Get the size of the parameter values vector when it contains all available parameter values...
Definition: Dmp.cpp:801
virtual void analyticalSolution(const Eigen::VectorXd &ts, Trajectory &trajectory) const
Return analytical solution of the system at certain times.
Definition: Dmp.hpp:192
Base class for all function approximators.
void analyticalSolution(const Eigen::VectorXd &ts, Eigen::MatrixXd &xs, Eigen::MatrixXd &xds, Eigen::MatrixXd &forcing_terms) const
Return analytical solution of the system at certain times (and return forcing terms) ...
Definition: Dmp.hpp:174
void differentialEquation(const Eigen::Ref< const Eigen::VectorXd > &x, Eigen::Ref< Eigen::VectorXd > xd) const
The differential equation which defines the system.
Definition: Dmp.cpp:344
void setSelectedParameters(const std::set< std::string > &selected_values_labels)
Determine which subset of parameters is represented in the vector returned by Parameterizable::getPar...
Definition: Dmp.cpp:731
DmpType
Different types of DMPs that can be initialized.
Definition: Dmp.hpp:61
virtual void train(const Trajectory &trajectory)
Train a DMP with a trajectory.
Definition: Dmp.cpp:643
virtual void computeFunctionApproximatorOutput(const Eigen::Ref< const Eigen::MatrixXd > &phase_state, Eigen::MatrixXd &fa_output) const
Compute the outputs of the function approximators.
Definition: Dmp.cpp:313
Dmp * clone(void) const
Return a deep copy of this object.
Definition: Dmp.cpp:252
void setParameterVectorAll(const Eigen::VectorXd &values)
Set all available parameter values with one vector.
Definition: Dmp.cpp:830
FunctionApproximator * function_approximator(int i_dim) const
Get a pointer to the function approximator for a certain dimension.
Definition: Dmp.hpp:345
Interface for implementing dynamical systems.
Header file for adding real-time debugging using several macros.
BOOST_CLASS_IMPLEMENTATION(DmpBbo::Dmp, boost::serialization::object_serializable)
Don&#39;t add version information to archives.
void analyticalSolution(const Eigen::VectorXd &ts, Trajectory &trajectory, Eigen::MatrixXd &forcing_terms) const
Return analytical solution of the system at certain times.
Definition: Dmp.hpp:206
friend class boost::serialization::access
Give boost serialization access to private members.
Definition: Dmp.hpp:425
void set_spring_constant(double spring_constant)
Accessor function for spring constant of spring-damper system.
Definition: Dmp.cpp:219
ForcingTermScaling
Different ways to scale the forcing term.
Definition: Dmp.hpp:64
virtual void integrateStart(Eigen::Ref< Eigen::VectorXd > x, Eigen::Ref< Eigen::VectorXd > xd) const
Start integrating the system.
Definition: Dmp.cpp:263
void set_perturbation_analytical_solution(double perturbation_standard_deviation)
Add a perturbation to the forcing term when computing the analytical solution.
Definition: Dmp.cpp:886
virtual void set_initial_state(const Eigen::VectorXd &y_init)
Accessor function for the initial state of the system.
Definition: Dmp.cpp:864
std::string toString(void) const
Returns a string representation of the object.
Definition: Dmp.cpp:893
Dynamical System modelling the evolution of a spring-damper system: .
void analyticalSolution(const Eigen::VectorXd &ts, Eigen::MatrixXd &xs, Eigen::MatrixXd &xds, Eigen::MatrixXd &forcing_terms, Eigen::MatrixXd &fa_output) const
Return analytical solution of the system at certain times (and return forcing terms) ...
Definition: Dmp.cpp:449
~Dmp(void)
Destructor.
Definition: Dmp.cpp:242
void getSelectableParameters(std::set< std::string > &selectable_values_labels) const
Return all the names of the parameter types that can be selected.
Definition: Dmp.cpp:708
Header file for serialization of Eigen matrices.
void set_damping_coefficient(double damping_coefficient)
Accessor function for damping coefficient of spring-damper system.
Definition: Dmp.cpp:215