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>
24 #include <sot/core/stop-watch.hh>
28 namespace talos_balance {
29 namespace dg = ::dynamicgraph;
31 using namespace dg::command;
34 #define PROFILE_DCMCONTROLLER_ZMPREF_COMPUTATION \
35 "DcmController: zmpRef computation "
36 #define PROFILE_DCMCONTROLLER_WRENCHREF_COMPUTATION \
37 "DcmController: wrenchRef computation "
39 #define INPUT_SIGNALS \
40 m_KpSIN << m_KiSIN << m_KzSIN << m_decayFactorSIN << m_omegaSIN << m_massSIN \
41 << m_comSIN << m_dcmSIN << m_dcmDesSIN << m_zmpDesSIN << m_zmpSIN
43 #define OUTPUT_SIGNALS m_zmpRefSOUT << m_wrenchRefSOUT
60 CONSTRUCT_SIGNAL_IN(decayFactor, double),
61 CONSTRUCT_SIGNAL_IN(
omega, double),
62 CONSTRUCT_SIGNAL_IN(
mass, double),
70 m_zmpRefSOUT << m_comSIN << m_omegaSIN << m_massSIN)
74 m_initSucceeded(false) {
79 docCommandVoid1(
"Initialize the entity.",
82 "resetDcmIntegralError",
84 docCommandVoid0(
"Set dcm integral error to zero.")));
88 if (!m_KpSIN.isPlugged())
89 return SEND_MSG(
"Init failed: signal Kp is not plugged", MSG_TYPE_ERROR);
90 if (!m_KiSIN.isPlugged())
91 return SEND_MSG(
"Init failed: signal Ki is not plugged", MSG_TYPE_ERROR);
92 if (!m_decayFactorSIN.isPlugged())
93 return SEND_MSG(
"Init failed: signal decayFactor is not plugged",
95 if (!m_omegaSIN.isPlugged())
96 return SEND_MSG(
"Init failed: signal omega is not plugged", MSG_TYPE_ERROR);
97 if (!m_massSIN.isPlugged())
98 return SEND_MSG(
"Init failed: signal mass is not plugged", MSG_TYPE_ERROR);
99 if (!m_comSIN.isPlugged())
100 return SEND_MSG(
"Init failed: signal com is not plugged", MSG_TYPE_ERROR);
101 if (!m_dcmSIN.isPlugged())
102 return SEND_MSG(
"Init failed: signal dcm is not plugged", MSG_TYPE_ERROR);
103 if (!m_dcmDesSIN.isPlugged())
104 return SEND_MSG(
"Init failed: signal dcmDes is not plugged",
106 if (!m_zmpDesSIN.isPlugged())
107 return SEND_MSG(
"Init failed: signal zmpDes is not plugged",
122 if (!m_initSucceeded) {
123 SEND_WARNING_STREAM_MSG(
124 "Cannot compute signal zmpRef before initialization!");
127 if (s.size() != 3) s.resize(3);
132 const Vector& Ki = m_KiSIN(iter);
133 const double& decayFactor = m_decayFactorSIN(iter);
134 const double&
omega = m_omegaSIN(iter);
135 const Vector& dcm = m_dcmSIN(iter);
139 assert(
Kp.size() == 3 &&
"Unexpected size of signal Kp");
140 assert(Ki.size() == 3 &&
"Unexpected size of signal Ki");
141 assert(dcm.size() == 3 &&
"Unexpected size of signal dcm");
142 assert(
dcmDes.size() == 3 &&
"Unexpected size of signal dcmDes");
143 assert(
zmpDes.size() == 3 &&
"Unexpected size of signal zmpDes");
145 const Eigen::Vector3d dcmError =
dcmDes - dcm;
147 Eigen::Vector3d zmpRef =
149 (Eigen::Vector3d::Constant(1.0) +
Kp /
omega).cwiseProduct(dcmError) -
150 Ki.cwiseProduct(m_dcmIntegralError) /
omega;
151 if (m_zmpSIN.isPlugged()) {
152 const Vector& zmp = m_zmpSIN(iter);
153 const Vector& Kz = m_KzSIN(iter);
154 assert(Kz.size() == 3 &&
"Unexpected size of signal Kz");
155 assert(zmp.size() == 3 &&
"Unexpected size of signal zmp");
161 m_dcmIntegralError += (dcmError - decayFactor * m_dcmIntegralError) * m_dt;
171 if (!m_initSucceeded) {
172 SEND_WARNING_STREAM_MSG(
173 "Cannot compute signal wrenchRef before initialization!");
176 if (s.size() != 6) s.resize(6);
180 const double&
omega = m_omegaSIN(iter);
181 const double&
mass = m_massSIN(iter);
182 const Vector& com = m_comSIN(iter);
184 const Vector& zmpRef = m_zmpRefSOUT(iter);
186 assert(com.size() == 3 &&
"Unexpected size of signal com");
189 forceRef[2] =
mass * 9.81;
191 Eigen::Matrix<double, 6, 1> wrenchRef;
192 wrenchRef.head<3>() = forceRef;
193 const Eigen::Vector3d com3 = com;
194 wrenchRef.tail<3>() = com3.cross(forceRef);
210 os <<
"DcmController " << getName();
212 getProfiler().report_all(3, os);
213 }
catch (ExceptionSignal e) {