19 #include <dynamic-graph/all-commands.h>
20 #include <dynamic-graph/command-bind.h>
21 #include <dynamic-graph/factory.h>
23 #include <sot/core/debug.hh>
25 #include "sot/core/stop-watch.hh"
29 namespace talos_balance {
30 namespace dg = ::dynamicgraph;
32 using namespace dg::command;
35 #define PROFILE_SIMPLE_PIDD_DDX_REF_COMPUTATION \
36 "SimplePIDD: ddx_ref computation "
38 #define INPUT_SIGNALS \
39 m_KpSIN << m_KiSIN << m_KdSIN << m_decayFactorSIN << m_xSIN << m_x_desSIN \
40 << m_dxSIN << m_dx_desSIN << m_ddx_desSIN
42 #define OUTPUT_SIGNALS m_ddx_refSOUT << m_dx_refSOUT
59 CONSTRUCT_SIGNAL_IN(decayFactor, double),
67 m_initSucceeded(false) {
71 addCommand(
"init", makeCommandVoid2(
73 docCommandVoid2(
"Initialize the entity.",
"time step",
74 "number of elements")));
75 addCommand(
"resetIntegralError",
77 docCommandVoid0(
"Set integral error to zero.")));
81 docCommandVoid0(
"Set reference velocity to zero.")));
100 if (!m_initSucceeded) {
101 SEND_WARNING_STREAM_MSG(
102 "Cannot compute signal ddx_ref before initialization!");
109 const Vector& Ki = m_KiSIN(iter);
110 const Vector& Kd = m_KiSIN(iter);
111 const double& decayFactor = m_decayFactorSIN(iter);
113 const Vector&
x = m_xSIN(iter);
114 const Vector& x_des = m_x_desSIN(iter);
116 const Vector& dx = m_dxSIN(iter);
117 const Vector& dx_des = m_dx_desSIN(iter);
119 const Vector& ddx_des = m_ddx_desSIN(iter);
122 Vector dx_err = dx_des - dx;
124 Vector ddx_ref = ddx_des + Kd.cwiseProduct(dx_err) +
Kp.cwiseProduct(x_err) +
125 Ki.cwiseProduct(m_integralError);
128 m_integralError += (x_err - decayFactor * m_integralError) * m_dt;
138 if (!m_initSucceeded) {
139 SEND_WARNING_STREAM_MSG(
140 "Cannot compute signal dx_ref before initialization!");
144 const Vector& ddx_ref = m_ddx_refSOUT(iter);
146 m_dx_ref += ddx_ref * m_dt;
160 os <<
"SimplePIDD " << getName();
162 getProfiler().report_all(3, os);
163 }
catch (ExceptionSignal e) {