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;
33 #define PROFILE_ANKLEADMITTANCECONTROLLER_DRP_COMPUTATION \
34 "AnkleAdmittanceController: dRP computation "
36 #define INPUT_SIGNALS m_gainsXYSIN << m_wrenchSIN << m_pRefSIN
38 #define OUTPUT_SIGNALS m_dRPSOUT << m_vDesSOUT
46 "AnkleAdmittanceController");
58 m_initSucceeded(false) {
64 docCommandVoid0(
"Initialize the entity.")));
69 if (!m_gainsXYSIN.isPlugged())
70 return SEND_MSG(
"Init failed: signal gainsXY is not plugged",
72 if (!m_wrenchSIN.isPlugged())
73 return SEND_MSG(
"Init failed: signal wrench is not plugged",
75 if (!m_pRefSIN.isPlugged())
76 return SEND_MSG(
"Init failed: signal pRef is not plugged", MSG_TYPE_ERROR);
86 if (!m_initSucceeded) {
87 SEND_WARNING_STREAM_MSG(
"Can't compute dqRef before initialization!");
90 if (s.size() != 2) s.resize(2);
94 const Eigen::Vector3d pRef = m_pRefSIN(iter);
96 const Vector& gainsXY = m_gainsXYSIN(iter);
98 assert(pRef.size() == 3 &&
"Unexpected size of signal pRef");
99 assert(
wrench.size() == 6 &&
"Unexpected size of signal wrench");
100 assert(gainsXY.size() == 2 &&
"Unexpected size of signal gainsXY");
102 const Eigen::Vector3d error =
wrench.tail<3>() - pRef.cross(
wrench.head<3>());
105 dRP[0] = gainsXY[0] * error[0];
106 dRP[1] = gainsXY[1] * error[1];
116 if (!m_initSucceeded) {
117 SEND_WARNING_STREAM_MSG(
"Can't compute vDes before initialization!");
120 if (s.size() != 6) s.resize(6);
122 const Vector& dRP = m_dRPSOUT(iter);
124 s.head<3>().setZero();
125 s.segment<2>(3) = dRP;
138 os <<
"AnkleAdmittanceController " << getName();
140 getProfiler().report_all(3, os);
141 }
catch (ExceptionSignal e) {