integrator-euler.hh
Go to the documentation of this file.
1 /*
2  * Copyright 2010,
3  * François Bleibel,
4  * Olivier Stasse,
5  *
6  * CNRS/AIST
7  *
8  */
9 
10 #ifndef __SOT_INTEGRATOR_EULER_H__
11 #define __SOT_INTEGRATOR_EULER_H__
12 
13 /* --------------------------------------------------------------------- */
14 /* --- INCLUDE --------------------------------------------------------- */
15 /* --------------------------------------------------------------------- */
16 
17 /* SOT */
20 
22 
23 /* --------------------------------------------------------------------- */
24 /* --- CLASS ----------------------------------------------------------- */
25 /* --------------------------------------------------------------------- */
26 
27 namespace dynamicgraph {
28 namespace sot {
29 
30 namespace internal {
31 template <class coefT>
32 bool integratorEulerCoeffIsIdentity(const coefT c) {
33  return c == 1;
34 }
35 
36 bool integratorEulerCoeffIsIdentity(const Vector c) { return c.isOnes(); }
37 
38 bool integratorEulerCoeffIsIdentity(const Matrix c) { return c.isIdentity(); }
39 } // namespace internal
40 
50 template <class sigT, class coefT>
51 class IntegratorEuler : public IntegratorAbstract<sigT, coefT> {
52  public:
53  virtual const std::string &getClassName(void) const;
54  static std::string getTypeName(void) { return "Unknown"; }
55  static const std::string CLASS_NAME;
56 
57  public:
62 
63  public:
64  IntegratorEuler(const std::string &name)
65  : IntegratorAbstract<sigT, coefT>(name),
66  derivativeSOUT(boost::bind(&IntegratorEuler<sigT, coefT>::derivative,
67  this, _1, _2),
68  SOUT,
69  "sotIntegratorEuler(" + name +
70  ")::output(vector)::derivativesout") {
72 
73  using namespace dynamicgraph::command;
74 
75  setSamplingPeriod(0.005);
76 
77  this->addCommand("setSamplingPeriod",
80  "Set the time during two sampling."));
81  this->addCommand("getSamplingPeriod",
84  "Get the time during two sampling."));
85 
86  this->addCommand(
87  "initialize",
91  "Initialize internal memory from current value of input")));
92  }
93 
94  virtual ~IntegratorEuler(void) {}
95 
96  protected:
97  std::vector<sigT> inputMemory;
98  std::vector<sigT> outputMemory;
99 
101 
102  double dt;
103  double invdt;
104 
105  public:
106  sigT &integrate(sigT &res, sigtime_t time) {
107  sotDEBUG(15) << "# In {" << std::endl;
108 
109  sigT sum;
110  sigT tmp1, tmp2;
111  const std::vector<coefT> &num = numerator;
112  const std::vector<coefT> &denom = denominator;
113 
114  // Step 1
115  tmp1 = inputMemory[0];
116  inputMemory[0] = SIN.access(time);
117  sum = num[0] * inputMemory[0];
118  // End of step 1. Here, sum is b_0 X
119 
120  // Step 2
121  size_type numsize = (size_type)num.size();
122  for (size_type i = 1; i < numsize; ++i) {
123  tmp2 = inputMemory[i - 1] - tmp1;
124  tmp2 *= invdt;
125  tmp1 = inputMemory[i];
126  inputMemory[i] = tmp2;
127  sum += (num[i] * inputMemory[i]);
128  }
129  // End of step 2. Here, sum is b_m * d(m)X / dt^m + ... + b_0 X
130 
131  // Step 3
132  size_type denomsize = (size_type)denom.size() - 1;
133  for (size_type i = 0; i < denomsize; ++i) {
134  sum -= (denom[i] * outputMemory[i]);
135  }
136  // End of step 3. Here, sum is b_m * d(m)X / dt^m + ... + b_0 X
137  // - a_0 Y - ... a_n-1 d(n-1)Y / dt^(n-1)
138 
139  // Step 4
140  outputMemory[denomsize] = sum;
141  for (size_type i = denomsize - 1; i >= 0; --i) {
142  outputMemory[i] += (outputMemory[i + 1] * dt);
143  }
144  // End of step 4. The ODE is integrated
145 
146  inputMemory[0] = SIN.access(time);
147  res = outputMemory[0];
148 
149  sotDEBUG(15) << "# Out }" << std::endl;
150  return res;
151  }
152 
153  sigT &derivative(sigT &res, sigtime_t time) {
154  if (outputMemory.size() < 2)
157  "Integrator does not compute the derivative.");
158 
159  SOUT.recompute(time);
160  res = outputMemory[1];
161  return res;
162  }
163 
164  void setSamplingPeriod(const double &period) {
165  dt = period;
166  invdt = 1 / period;
167  }
168 
169  double getSamplingPeriod() const { return dt; }
170 
171  void initialize() {
172  if (denominator.empty() || numerator.empty())
175  "The numerator or the denominator is empty.");
176 
177  // Check that denominator.back is the identity
181  "The coefficient of the highest order derivative of denominator "
182  "should be 1 (the last pushDenomCoef should be the identity).");
183 
184  std::size_t numsize = numerator.size();
185  inputMemory.resize(numsize);
186 
187  inputMemory[0] = SIN.accessCopy();
188  for (std::size_t i = 1; i < numsize; ++i) {
189  inputMemory[i] = inputMemory[0];
190  }
191 
192  std::size_t denomsize = denominator.size();
193  outputMemory.resize(denomsize);
194  for (std::size_t i = 0; i < denomsize; ++i) {
195  outputMemory[i] = inputMemory[0];
196  }
197  }
198 };
199 
200 } /* namespace sot */
201 } /* namespace dynamicgraph */
202 
203 #endif
dynamicgraph::sot::IntegratorEuler::getClassName
virtual const std::string & getClassName(void) const
dynamicgraph::sot::IntegratorAbstract::SOUT
dynamicgraph::SignalTimeDependent< sigT, sigtime_t > SOUT
Definition: integrator-abstract.hh:103
dynamicgraph::sot::IntegratorAbstract::denominator
std::vector< coefT > denominator
Definition: integrator-abstract.hh:121
dynamicgraph::SignalPtr::accessCopy
virtual const T & accessCopy() const
dynamicgraph::sot::IntegratorEuler::integrate
sigT & integrate(sigT &res, sigtime_t time)
Definition: integrator-euler.hh:106
dynamicgraph::sot::IntegratorEuler::getTypeName
static std::string getTypeName(void)
Definition: integrator-euler.hh:54
dynamicgraph::sot::IntegratorAbstract::SIN
dynamicgraph::SignalPtr< sigT, sigtime_t > SIN
Definition: integrator-abstract.hh:101
dynamicgraph::sot::IntegratorEuler::CLASS_NAME
static const std::string CLASS_NAME
Definition: integrator-euler.hh:55
dynamicgraph::sot::IntegratorEuler::derivative
sigT & derivative(sigT &res, sigtime_t time)
Definition: integrator-euler.hh:153
dynamicgraph
c
Vec3f c
dynamicgraph::sot::IntegratorEuler
integrates an ODE using a naive Euler integration. TODO: change the integration method....
Definition: integrator-euler.hh:51
dynamicgraph::command
i
int i
command-getter.h
dynamicgraph::sot::IntegratorEuler::getSamplingPeriod
double getSamplingPeriod() const
Definition: integrator-euler.hh:169
dynamicgraph::sot::IntegratorEuler::IntegratorEuler
IntegratorEuler(const std::string &name)
Definition: integrator-euler.hh:64
boost
docCommandVoid0
std::string docCommandVoid0(const std::string &doc)
dynamicgraph::Entity::name
std::string name
dynamicgraph::Matrix
Eigen::MatrixXd Matrix
dynamicgraph::sot::IntegratorEuler::setSamplingPeriod
void setSamplingPeriod(const double &period)
Definition: integrator-euler.hh:164
dynamicgraph::sot::IntegratorEuler::~IntegratorEuler
virtual ~IntegratorEuler(void)
Definition: integrator-euler.hh:94
integrator-abstract.hh
makeCommandVoid0
CommandVoid0< E > * makeCommandVoid0(E &entity, boost::function< void(E *)> function, const std::string &docString)
res
res
dynamicgraph::SignalPtr::access
virtual const T & access(const Time &t)
command-setter.h
dynamicgraph::sigtime_t
int64_t sigtime_t
dynamicgraph::sot::IntegratorAbstract::numerator
std::vector< coefT > numerator
Definition: integrator-abstract.hh:120
dynamicgraph::sot::IntegratorEuler::inputMemory
std::vector< sigT > inputMemory
Definition: integrator-euler.hh:97
dynamicgraph::sot::IntegratorEuler::outputMemory
std::vector< sigT > outputMemory
Definition: integrator-euler.hh:98
dynamicgraph::sot::IntegratorAbstract
integrates an ODE. If Y is the output and X the input, the following equation is integrated: a_p * d(...
Definition: integrator-abstract.hh:46
dynamicgraph::size_type
Matrix::Index size_type
dynamicgraph::Vector
Eigen::VectorXd Vector
dynamicgraph::ExceptionSignal::GENERIC
GENERIC
dynamicgraph::ExceptionSignal
dynamicgraph::sot::IntegratorEuler::derivativeSOUT
dynamicgraph::SignalTimeDependent< sigT, sigtime_t > derivativeSOUT
Definition: integrator-euler.hh:100
dynamicgraph::SignalTimeDependent< sigT, sigtime_t >
dynamicgraph::sot::IntegratorEuler::dt
double dt
Definition: integrator-euler.hh:102
dynamicgraph::Entity::addCommand
void addCommand(const std::string &name, command::Command *command)
dynamicgraph::command::Setter
dynamicgraph::sot::IntegratorEuler::initialize
void initialize()
Definition: integrator-euler.hh:171
dynamicgraph::sot::IntegratorEuler::invdt
double invdt
Definition: integrator-euler.hh:103
dynamicgraph::command::Getter
dynamicgraph::Entity::signalRegistration
void signalRegistration(const SignalArray< sigtime_t > &signals)
dynamicgraph::sot::internal::integratorEulerCoeffIsIdentity
bool integratorEulerCoeffIsIdentity(const coefT c)
Definition: integrator-euler.hh:32
sotDEBUG
#define sotDEBUG(level)
Definition: debug.hh:168


sot-core
Author(s): Olivier Stasse, ostasse@laas.fr
autogenerated on Tue Oct 24 2023 02:26:31