DMP_BBO library
DynamicalSystem.hpp
Go to the documentation of this file.
1 
24 #ifndef _DYNAMICALSYSTEM_H_
25 #define _DYNAMICALSYSTEM_H_
26 
27 #include "eigen_realtime/eigen_realtime_check.hpp" // Include this before Eigen header files
28 
29 #include <string>
30 #include <vector>
31 #include <eigen3/Eigen/Core>
32 
34 
35 namespace DmpBbo {
36 
63 {
64 
65 public:
66 
79  DynamicalSystem(int order, double tau, Eigen::VectorXd initial_state, Eigen::VectorXd attractor_state, std::string name);
80 
82  virtual ~DynamicalSystem(void);
83 
87  virtual DynamicalSystem* clone(void) const = 0;
88 
105  virtual void differentialEquation(
106  const Eigen::Ref<const Eigen::VectorXd>& x,
107  Eigen::Ref<Eigen::VectorXd> xd
108  ) const = 0;
109 
110 
120  virtual void analyticalSolution(const Eigen::VectorXd& ts, Eigen::MatrixXd& xs, Eigen::MatrixXd& xds) const = 0;
121 
130  virtual void integrateStart(Eigen::Ref<Eigen::VectorXd> x, Eigen::Ref<Eigen::VectorXd> xd) const;
131 
139  void integrateStart(const Eigen::VectorXd& x_init, Eigen::Ref<Eigen::VectorXd> x, Eigen::Ref<Eigen::VectorXd> xd);
140 
152  virtual void integrateStep(double dt, const Eigen::Ref<const Eigen::VectorXd> x, Eigen::Ref<Eigen::VectorXd> x_updated, Eigen::Ref<Eigen::VectorXd> xd_updated) const;
153 
169  friend std::ostream& operator<<(std::ostream& output, const DynamicalSystem& dyn_sys) {
170  output << dyn_sys.toString();
171  return output;
172  }
173 
177  virtual std::string toString(void) const = 0;
178 
190  enum IntegrationMethod { EULER, RUNGE_KUTTA };
191 
195  inline void set_integration_method(IntegrationMethod integration_method) {
196  integration_method_ = integration_method;
197  }
198 
203  inline int dim(void) const {
204  return dim_;
205  }
206 
221  inline int dim_orig(void) const {
222  return dim_orig_;
223  }
224 
229  inline double tau(void) const { return tau_; }
230 
235  inline virtual void set_tau(double tau) {
236  assert(tau>0.0);
237  tau_ = tau;
238  }
239 
244  inline Eigen::VectorXd initial_state(void) const { return initial_state_; }
245 
250  inline void initial_state(Eigen::VectorXd& initial_state) const
251  {
252  initial_state=initial_state_;
253  }
254 
258  inline virtual void set_initial_state(const Eigen::VectorXd& initial_state) {
259  assert(initial_state.size()==dim_orig_);
260  initial_state_ = initial_state;
261  }
262 
267  inline Eigen::VectorXd attractor_state(void) const { return attractor_state_; }
268 
273  inline void attractor_state(Eigen::VectorXd& attractor_state) const
274  {
275  attractor_state=attractor_state_;
276  }
277 
281  inline virtual void set_attractor_state(const Eigen::Ref<const Eigen::VectorXd>& attractor_state) {
282  assert(attractor_state.size()==dim_orig_);
283  attractor_state_ = attractor_state;
284  }
285 
290  inline std::string name(void) const { return name_; }
291 
295  inline virtual void set_name(std::string name) {
296  name_ = name;
297  }
298 
299 protected:
304  inline void set_dim(int dim) {
305  dim_ = dim;
306  }
307 
310 private:
311 
320  void integrateStepEuler(double dt, const Eigen::Ref<const Eigen::VectorXd> x, Eigen::Ref<Eigen::VectorXd> x_updated, Eigen::Ref<Eigen::VectorXd> xd_updated) const;
321 
330  void integrateStepRungeKutta(double dt, const Eigen::Ref<const Eigen::VectorXd> x, Eigen::Ref<Eigen::VectorXd> x_updated, Eigen::Ref<Eigen::VectorXd> xd_updated) const;
331 
335  int dim_;
336 
339  int dim_orig_;
340 
346  double tau_;
347 
351  Eigen::VectorXd initial_state_;
352 
359  Eigen::VectorXd attractor_state_;
360 
364  std::string name_;
365 
367  IntegrationMethod integration_method_;
368 
369 
370 protected:
375  DynamicalSystem(void) {};
376 
377 private:
379  friend class boost::serialization::access;
380 
386  template<class Archive>
387  void serialize(Archive & ar, const unsigned int version)
388  {
389  ar & BOOST_SERIALIZATION_NVP(dim_);
390  ar & BOOST_SERIALIZATION_NVP(dim_orig_);
391  // Const doesn't work, see sec_boost_serialization_ugliness in the docu
392  //ar & boost::serialization::make_nvp("dim_orig_", const_cast<int&>(dim_orig_));
393  ar & BOOST_SERIALIZATION_NVP(tau_);
394  ar & BOOST_SERIALIZATION_NVP(initial_state_);
395  ar & BOOST_SERIALIZATION_NVP(attractor_state_);
396  ar & BOOST_SERIALIZATION_NVP(name_);
397  ar & BOOST_SERIALIZATION_NVP(integration_method_);
398  }
399 
400 };
401 
402 }
403 
404 #include <boost/serialization/assume_abstract.hpp>
407 
408 #include <boost/serialization/export.hpp>
410 BOOST_CLASS_IMPLEMENTATION(DmpBbo::DynamicalSystem,boost::serialization::object_serializable);
411 
412 #endif // _DYNAMICALSYSTEM_H_
413 
414 
415 
double tau(void) const
Accessor function for the time constant.
void set_dim(int dim)
Set the dimensionality of the dynamical system, i.e.
virtual void analyticalSolution(const Eigen::VectorXd &ts, Eigen::MatrixXd &xs, Eigen::MatrixXd &xds) const =0
Return analytical solution of the system at certain times.
IntegrationMethod
The possible integration methods that can be used.
virtual void set_attractor_state(const Eigen::Ref< const Eigen::VectorXd > &attractor_state)
Mutator function for the attractor state of the dynamical system.
int dim_orig(void) const
Get the dimensionality of the dynamical system, i.e.
BOOST_CLASS_IMPLEMENTATION(DmpBbo::DynamicalSystem, boost::serialization::object_serializable)
Don&#39;t add version information to archives.
void set_integration_method(IntegrationMethod integration_method)
Choose the integration method.
void initial_state(Eigen::VectorXd &initial_state) const
Accessor function for the initial state of the dynamical system.
Eigen::VectorXd initial_state(void) const
Accessor function for the initial state of the dynamical system.
virtual void integrateStep(double dt, const Eigen::Ref< const Eigen::VectorXd > x, Eigen::Ref< Eigen::VectorXd > x_updated, Eigen::Ref< Eigen::VectorXd > xd_updated) const
Integrate the system one time step.
DynamicalSystem(void)
Default constructor.
virtual void set_initial_state(const Eigen::VectorXd &initial_state)
Mutator function for the initial state of the dynamical system.
int dim(void) const
Get the dimensionality of the dynamical system, i.e.
virtual DynamicalSystem * clone(void) const =0
Return a pointer to a deep copy of the DynamicalSystem object.
virtual void differentialEquation(const Eigen::Ref< const Eigen::VectorXd > &x, Eigen::Ref< Eigen::VectorXd > xd) const =0
The differential equation which defines the system.
BOOST_SERIALIZATION_ASSUME_ABSTRACT(DmpBbo::DynamicalSystem)
Don&#39;t add version information to archives.
std::string name(void) const
Accessor function for the name of the dynamical system.
virtual ~DynamicalSystem(void)
Destructor.
Interface for implementing dynamical systems.
Header file for adding real-time debugging using several macros.
virtual std::string toString(void) const =0
Returns a string representation of the object.
virtual void integrateStart(Eigen::Ref< Eigen::VectorXd > x, Eigen::Ref< Eigen::VectorXd > xd) const
Start integrating the system.
friend class boost::serialization::access
Give boost serialization access to private members.
virtual void set_name(std::string name)
Mutator function for the name of the dynamical system.
Eigen::VectorXd attractor_state(void) const
Accessor function for the attractor state of the dynamical system.
void attractor_state(Eigen::VectorXd &attractor_state) const
Accessor function for the attractor state of the dynamical system.
virtual void set_tau(double tau)
Mutator function for the time constant.
Header file for serialization of Eigen matrices.
friend std::ostream & operator<<(std::ostream &output, const DynamicalSystem &dyn_sys)
Write a DynamicalSystem to an output stream.