13 #include <dynamic-graph/all-commands.h>
14 #include <dynamic-graph/factory.h>
16 #include <sot/core/debug.hh>
17 #include <sot/core/stop-watch.hh>
21 namespace talos_balance {
22 namespace dg = ::dynamicgraph;
24 using namespace pinocchio;
25 using namespace dg::command;
27 #define PROFILE_ADMITTANCECONTROLLERENDEFFECTOR_WFORCE_COMPUTATION \
28 "AdmittanceControllerEndEffector: w_force computation "
30 #define PROFILE_ADMITTANCECONTROLLERENDEFFECTOR_WDQ_COMPUTATION \
31 "AdmittanceControllerEndEffector: w_dq computation "
33 #define PROFILE_ADMITTANCECONTROLLERENDEFFECTOR_DQ_COMPUTATION \
34 "AdmittanceControllerEndEffector: dq computation "
36 #define INPUT_SIGNALS \
37 m_KpSIN << m_KdSIN << m_dqSaturationSIN << m_forceSIN << m_w_forceDesSIN \
40 #define INNER_SIGNALS m_w_forceSINNER << m_w_dqSINNER
42 #define OUTPUT_SIGNALS m_dqSOUT
50 "AdmittanceControllerEndEffector");
56 const std::string &
name)
68 m_initSucceeded(false),
79 docCommandVoid3(
"Initialize the entity.",
80 "time step",
"sensor frame name",
81 "end Effector Joint Name")));
84 docCommandVoid0(
"resetDq")));
88 const std::string &sensorFrameName,
89 const std::string &endEffectorName) {
90 if (!m_dqSaturationSIN.isPlugged())
91 return SEND_MSG(
"Init failed: signal dqSaturation is not plugged",
93 if (!m_KpSIN.isPlugged())
94 return SEND_MSG(
"Init failed: signal Kp is not plugged", MSG_TYPE_ERROR);
95 if (!m_KdSIN.isPlugged())
96 return SEND_MSG(
"Init failed: signal Kd is not plugged", MSG_TYPE_ERROR);
97 if (!m_forceSIN.isPlugged())
98 return SEND_MSG(
"Init failed: signal force is not plugged", MSG_TYPE_ERROR);
99 if (!m_w_forceDesSIN.isPlugged())
100 return SEND_MSG(
"Init failed: signal w_forceDes is not plugged",
102 if (!m_qSIN.isPlugged())
103 return SEND_MSG(
"Init failed: signal q is not plugged", MSG_TYPE_ERROR);
111 std::string localName(
"robot");
112 if (isNameInRobotUtil(localName)) {
114 std::cerr <<
"m_robot_util:" <<
m_robot_util << std::endl;
116 SEND_MSG(
"You should have a robotUtil pointer initialized before",
121 pinocchio::urdf::buildModel(
m_robot_util->m_urdf_filename,
122 pinocchio::JointModelFreeFlyer(),
m_model);
127 }
catch (
const std::exception &e) {
128 std::cout << e.what();
129 SEND_MSG(
"Init failed: Could load URDF :" +
m_robot_util->m_urdf_filename,
146 if (!m_initSucceeded) {
147 SEND_WARNING_STREAM_MSG(
148 "Cannot compute signal w_force before initialization!");
151 if (s.size() != 6) s.resize(6);
156 const Vector &force = m_forceSIN(iter);
157 const Vector &
q = m_qSIN(iter);
158 assert(force.size() == m_n &&
"Unexpected size of signal force");
159 assert(
q.size() == m_model.nq &&
"Unexpected size of signal q");
162 pinocchio::framesForwardKinematics(m_model, *m_data,
q);
163 pinocchio::SE3 sensorPlacement = m_data->oMf[m_sensorFrameId];
165 s = sensorPlacement.act(pinocchio::Force(force)).toVector();
174 if (!m_initSucceeded) {
175 SEND_WARNING_STREAM_MSG(
176 "Cannot compute signal w_dq before initialization!");
179 if (s.size() != 6) s.resize(6);
183 const Vector &w_forceDes = m_w_forceDesSIN(iter);
184 const Vector &w_force = m_w_forceSINNER(iter);
186 const Vector &Kd = m_KdSIN(iter);
187 const Vector &dqSaturation = m_dqSaturationSIN(iter);
188 assert(w_force.size() == m_n &&
"Unexpected size of signal force");
189 assert(w_forceDes.size() == m_n &&
"Unexpected size of signal w_forceDes");
190 assert(
Kp.size() == m_n &&
"Unexpected size of signal Kp");
191 assert(Kd.size() == m_n &&
"Unexpected size of signal Kd");
192 assert(dqSaturation.size() == m_n &&
193 "Unexpected size of signal dqSaturation");
195 m_w_dq = m_w_dq + m_dt * (
Kp.cwiseProduct(w_forceDes - w_force)) -
196 Kd.cwiseProduct(m_w_dq);
198 for (
int i = 0; i < m_n; i++) {
199 if (m_w_dq[i] > dqSaturation[i]) m_w_dq[i] = dqSaturation[i];
200 if (m_w_dq[i] < -dqSaturation[i]) m_w_dq[i] = -dqSaturation[i];
211 if (!m_initSucceeded) {
212 SEND_WARNING_STREAM_MSG(
"Cannot compute signal dq before initialization!");
215 if (s.size() != 6) s.resize(6);
219 const Vector &w_dq = m_w_dqSINNER(iter);
220 assert(w_dq.size() == m_n &&
"Unexpected size of signal w_dq");
223 pinocchio::SE3 placement = m_data->oMi[m_endEffectorId];
225 s = placement.actInv(pinocchio::Motion(w_dq)).toVector();
238 os <<
"AdmittanceControllerEndEffector " << getName();
240 getProfiler().report_all(3, os);
241 }
catch (ExceptionSignal e) {