sot-talos-balance  2.0.5
Collection of dynamic-graph entities aimed at implementing balance control on talos.
talos-control-manager.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2014, Andrea Del Prete, LAAS-CNRS
3  *
4  * This file is part of sot-torque-control.
5  * sot-torque-control is free software: you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public License
7  * as published by the Free Software Foundation, either version 3 of
8  * the License, or (at your option) any later version.
9  * sot-torque-control is distributed in the hope that it will be
10  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
11  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU Lesser General Public License for more details. You should
13  * have received a copy of the GNU Lesser General Public License along
14  * with sot-torque-control. If not, see <http://www.gnu.org/licenses/>.
15  */
16 
17 #include <dynamic-graph/all-commands.h>
18 #include <dynamic-graph/factory.h>
19 
20 #include <sot/core/debug.hh>
21 #include <sot/core/stop-watch.hh>
24 
25 namespace dynamicgraph {
26 namespace sot {
27 namespace talos_balance {
28 namespace dynamicgraph = ::dynamicgraph;
29 namespace dg = dynamicgraph;
30 using namespace dynamicgraph;
31 using namespace dynamicgraph::command;
32 using namespace std;
33 using namespace dg::sot::talos_balance;
34 
35 // Size to be aligned "-------------------------------------------------------"
36 #define PROFILE_PWM_DESIRED_COMPUTATION \
37  "Control manager "
38 #define PROFILE_DYNAMIC_GRAPH_PERIOD \
39  "Control period "
40 
41 #define INPUT_SIGNALS m_u_maxSIN
42 #define OUTPUT_SIGNALS m_uSOUT << m_u_safeSOUT
43 
46 typedef TalosControlManager EntityClassName;
47 
48 /* --- DG FACTORY ---------------------------------------------------- */
49 DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(TalosControlManager, "TalosControlManager");
50 
51 /* ------------------------------------------------------------------- */
52 /* --- CONSTRUCTION -------------------------------------------------- */
53 /* ------------------------------------------------------------------- */
55  : Entity(name),
56  CONSTRUCT_SIGNAL_IN(u_max, dynamicgraph::Vector),
57  CONSTRUCT_SIGNAL_OUT(u, dynamicgraph::Vector, m_u_maxSIN),
58  CONSTRUCT_SIGNAL_OUT(u_safe, dynamicgraph::Vector, m_uSOUT << m_u_maxSIN),
59  m_robot_util(RefVoidRobotUtil()),
60  m_initSucceeded(false),
61  m_emergency_stop_triggered(false),
62  m_is_first_iter(true),
63  m_iter(0),
64  m_sleep_time(0.0) {
65  Entity::signalRegistration(INPUT_SIGNALS << OUTPUT_SIGNALS);
66 
67  /* Commands. */
68  addCommand("init",
69  makeCommandVoid2(*this, &TalosControlManager::init,
70  docCommandVoid2("Initialize the entity.",
71  "Time period in seconds (double)",
72  "Robot reference (string)")));
73  addCommand("addCtrlMode",
74  makeCommandVoid1(
76  docCommandVoid1("Create an input signal with name 'ctrl_x' "
77  "where x is the specified name.",
78  "Name (string)")));
79 
80  addCommand(
81  "ctrlModes",
82  makeCommandVoid0(
84  docCommandVoid0("Get a list of all the available control modes.")));
85 
86  addCommand(
87  "setCtrlMode",
88  makeCommandVoid2(
90  docCommandVoid2("Set the control mode for a joint.",
91  "(string) joint name", "(string) control mode")));
92 
93  addCommand(
94  "getCtrlMode",
95  makeCommandVoid1(*this, &TalosControlManager::getCtrlMode,
96  docCommandVoid1("Get the control mode of a joint.",
97  "(string) joint name")));
98 
99  addCommand("resetProfiler",
100  makeCommandVoid0(
102  docCommandVoid0("Reset the statistics computed by the "
103  "profiler (print this entity to see them).")));
104 
105  addCommand(
106  "addEmergencyStopSIN",
107  makeCommandVoid1(
109  docCommandVoid1("Add emergency signal input from another entity that "
110  "can stop the control if necessary.",
111  "(string) signal name : 'emergencyStop_' + name")));
112 
113  addCommand("isEmergencyStopTriggered",
114  makeDirectGetter(
116  docDirectGetter("Check whether emergency stop is triggered",
117  "bool")));
118 }
119 
120 void TalosControlManager::init(const double& dt, const std::string& robotRef) {
121  if (dt <= 0.0) return SEND_MSG("Timestep must be positive", MSG_TYPE_ERROR);
122  m_dt = dt;
124  m_initSucceeded = true;
125  vector<string> package_dirs;
126  std::string localName(robotRef);
127  if (!isNameInRobotUtil(localName)) {
128  SEND_MSG("You should have a robotUtil pointer initialized before",
129  MSG_TYPE_ERROR);
130  } else {
131  m_robot_util = getRobotUtil(localName);
132  }
133  m_numDofs = m_robot_util->m_nbJoints + 6;
134 
135  // TalosControlManager::setLoggerVerbosityLevel((dynamicgraph::LoggerVerbosity)
136  // 4);
140 }
141 
142 /* ------------------------------------------------------------------- */
143 /* --- SIGNALS ------------------------------------------------------- */
144 /* ------------------------------------------------------------------- */
145 
147  if (!m_initSucceeded) {
148  SEND_MSG("Cannot compute signal u before initialization!",
149  MSG_TYPE_WARNING);
150  return s;
151  }
152 
153  if (m_is_first_iter) m_is_first_iter = false;
154 
155  if (s.size() != (Eigen::VectorXd::Index)m_numDofs) s.resize(m_numDofs);
156 
157  {
158  // trigger computation of all ctrl inputs
159  for (unsigned int i = 0; i < m_ctrlInputsSIN.size(); i++)
160  (*m_ctrlInputsSIN[i])(iter);
161 
162  int cm_id, cm_id_prev;
163  for (unsigned int i = 0; i < m_numDofs; i++) {
164  cm_id = m_jointCtrlModes_current[i].id;
165  if (cm_id < 0) {
166  SEND_MSG("You forgot to set the control mode of joint " + toString(i),
167  MSG_TYPE_ERROR_STREAM);
168  continue;
169  }
170 
171  const dynamicgraph::Vector& ctrl = (*m_ctrlInputsSIN[cm_id])(iter);
172  assert(ctrl.size() == m_numDofs);
173 
174  if (m_jointCtrlModesCountDown[i] == 0)
175  s(i) = ctrl(i);
176  else {
177  cm_id_prev = m_jointCtrlModes_previous[i].id;
178  const dynamicgraph::Vector& ctrl_prev =
179  (*m_ctrlInputsSIN[cm_id_prev])(iter);
180  assert(ctrl_prev.size() == m_numDofs);
181 
182  double alpha =
183  m_jointCtrlModesCountDown[i] / CTRL_MODE_TRANSITION_TIME_STEP;
184  // SEND_MSG("Joint "+toString(i)+" changing ctrl mode from
185  // "+toString(cm_id_prev)+
186  // " to "+toString(cm_id)+"
187  // alpha="+toString(alpha),MSG_TYPE_DEBUG);
188  s(i) = alpha * ctrl_prev(i) + (1 - alpha) * ctrl(i);
189  m_jointCtrlModesCountDown[i]--;
190 
191  if (m_jointCtrlModesCountDown[i] == 0) {
192  SEND_MSG("Joint " + toString(i) + " changed ctrl mode from " +
193  toString(cm_id_prev) + " to " + toString(cm_id),
194  MSG_TYPE_INFO);
195  updateJointCtrlModesOutputSignal();
196  }
197  }
198  }
199  }
200 
201  // usleep(1e6*m_sleep_time);
202  // if(m_sleep_time>=0.1)
203  // {
204  // for(unsigned int i=0; i<m_ctrlInputsSIN.size(); i++)
205  // {
206  // const dynamicgraph::Vector& ctrl = (*m_ctrlInputsSIN[i])(iter);
207  // SEND_MSG(toString(iter)+") tau =" +toString(ctrl,1,4,"
208  // ")+m_ctrlModes[i], MSG_TYPE_ERROR);
209  // }
210  // }
211 
212  return s;
213 }
214 
216  if (!m_initSucceeded) {
217  SEND_WARNING_STREAM_MSG(
218  "Cannot compute signal u_safe before initialization!");
219  return s;
220  }
221  if (s.size() != (Eigen::VectorXd::Index)m_numDofs) s.resize(m_numDofs);
222 
223  const dynamicgraph::Vector& u = m_uSOUT(iter);
224  const dynamicgraph::Vector& ctrl_max = m_u_maxSIN(iter);
225 
226  for (size_t i = 0; i < m_emergencyStopVector.size(); i++) {
227  if ((*m_emergencyStopVector[i]).isPlugged() &&
228  (*m_emergencyStopVector[i])(iter)) {
229  m_emergency_stop_triggered = true;
230  SEND_MSG(
231  "t = " + toString(iter) +
232  ": Emergency Stop has been triggered by an external entity: " +
233  (*m_emergencyStopVector[i]).getName(),
234  MSG_TYPE_ERROR);
235  }
236  }
237 
238  if (!m_emergency_stop_triggered) {
239  for (unsigned int i = 0; i < m_numDofs; i++) {
240  if (fabs(u(i)) > ctrl_max(i)) {
241  m_emergency_stop_triggered = true;
242  SEND_MSG("t = " + toString(iter) + ": Joint " + toString(i) +
243  " desired control is too large: " + toString(u(i)) +
244  " > " + toString(ctrl_max(i)),
245  MSG_TYPE_ERROR_STREAM);
246  break;
247  }
248  }
249  }
250 
251  s = u;
252 
253  if (m_emergency_stop_triggered) s.setZero();
254 
255  return s;
256 }
257 
258 /* --- COMMANDS ---------------------------------------------------------- */
259 
261  // check there is no other control mode with the same name
262  for (unsigned int i = 0; i < m_ctrlModes.size(); i++)
263  if (name == m_ctrlModes[i])
264  return SEND_MSG("It already exists a control mode with name " + name,
265  MSG_TYPE_ERROR);
266 
267  // create a new input signal to read the new control
268  m_ctrlInputsSIN.push_back(new SignalPtr<dynamicgraph::Vector, int>(
269  NULL, getClassName() + "(" + getName() +
270  ")::input(dynamicgraph::Vector)::ctrl_" + name));
271 
272  // create a new output signal to specify which joints are controlled with the
273  // new control mode
274  m_jointsCtrlModesSOUT.push_back(new Signal<dynamicgraph::Vector, int>(
275  getClassName() + "(" + getName() +
276  ")::output(dynamicgraph::Vector)::joints_ctrl_mode_" + name));
277 
278  // add the new control mode to the list of available control modes
279  m_ctrlModes.push_back(name);
280 
281  // register the new signals and add the new signal dependecy
282  Eigen::VectorXd::Index i = m_ctrlModes.size() - 1;
283  m_uSOUT.addDependency(*m_ctrlInputsSIN[i]);
284  m_u_safeSOUT.addDependency(*m_ctrlInputsSIN[i]);
285  Entity::signalRegistration(*m_ctrlInputsSIN[i]);
286  Entity::signalRegistration(*m_jointsCtrlModesSOUT[i]);
288 }
289 
291  SEND_MSG(toString(m_ctrlModes), MSG_TYPE_INFO);
292 }
293 
294 void TalosControlManager::setCtrlMode(const string& jointName,
295  const string& ctrlMode) {
296  CtrlMode cm;
297  if (convertStringToCtrlMode(ctrlMode, cm) == false) return;
298 
299  if (jointName == "all") {
300  for (unsigned int i = 0; i < m_numDofs; i++) setCtrlMode(i, cm);
301  } else {
302  // decompose strings like "rk-rhp-lhp-..."
303  std::stringstream ss(jointName);
304  std::string item;
305  std::list<int> jIdList;
306  unsigned int i;
307  while (std::getline(ss, item, '-')) {
308  SEND_MSG("parsed joint : " + item, MSG_TYPE_INFO);
309  if (convertJointNameToJointId(item, i)) jIdList.push_back(i);
310  }
311  for (std::list<int>::iterator it = jIdList.begin(); it != jIdList.end();
312  ++it)
313  setCtrlMode(*it, cm);
314  }
316 }
317 
318 void TalosControlManager::setCtrlMode(const int jid, const CtrlMode& cm) {
319  if (m_jointCtrlModesCountDown[jid] != 0)
320  return SEND_MSG("Cannot change control mode of joint " + toString(jid) +
321  " because its previous ctrl mode transition has not "
322  "terminated yet: " +
323  toString(m_jointCtrlModesCountDown[jid]),
324  MSG_TYPE_ERROR);
325 
326  if (cm.id == m_jointCtrlModes_current[jid].id)
327  return SEND_MSG("Cannot change control mode of joint " + toString(jid) +
328  " because it has already the specified ctrl mode",
329  MSG_TYPE_ERROR);
330 
331  if (m_jointCtrlModes_current[jid].id < 0) {
332  // first setting of the control mode
335  } else {
339  }
340 }
341 
342 void TalosControlManager::getCtrlMode(const std::string& jointName) {
343  if (jointName == "all") {
344  stringstream ss;
345  for (unsigned int i = 0; i < m_numDofs; i++)
346  ss << toString(i) << " " << m_jointCtrlModes_current[i] << "; ";
347  SEND_MSG(ss.str(), MSG_TYPE_INFO);
348  return;
349  }
350 
351  unsigned int i;
352  if (convertJointNameToJointId(jointName, i) == false) return;
353  SEND_MSG("The control mode of joint " + jointName + " is " +
355  MSG_TYPE_INFO);
356 }
357 
359  getProfiler().reset_all();
361 }
362 
363 // void TalosControlManager::setStreamPrintPeriod(const double & s)
364 // {
365 // getLogger().setStreamPrintPeriod(s);
366 // }
367 
368 void TalosControlManager::setSleepTime(const double& seconds) {
369  if (seconds < 0.0)
370  return SEND_MSG("Sleep time cannot be negative!", MSG_TYPE_ERROR);
371  m_sleep_time = seconds;
372 }
373 
375  SEND_MSG("New emergency signal input emergencyStop_" + name + " created",
376  MSG_TYPE_INFO);
377  // create a new input signal
378  m_emergencyStopVector.push_back(new SignalPtr<bool, int>(
379  NULL, getClassName() + "(" + getName() +
380  ")::input(bool)::emergencyStop_" + name));
381 
382  // register the new signals and add the new signal dependecy
383  Eigen::Index i = m_emergencyStopVector.size() - 1;
384  m_u_safeSOUT.addDependency(*m_emergencyStopVector[i]);
385  Entity::signalRegistration(*m_emergencyStopVector[i]);
386 }
387 
388 /* --- PROTECTED MEMBER METHODS
389  * ---------------------------------------------------------- */
390 
392  if (m_numDofs == 0) {
393  SEND_MSG("You should call init first. The size of the vector is unknown.",
394  MSG_TYPE_ERROR);
395  return;
396  }
397 
399  for (unsigned int i = 0; i < m_jointsCtrlModesSOUT.size(); i++) {
400  for (unsigned int j = 0; j < m_numDofs; j++) {
401  cm(j) = 0;
402  if ((unsigned int)m_jointCtrlModes_current[j].id == i) cm(j) = 1;
403 
404  // during the transition between two ctrl modes they both result active
405  if (m_jointCtrlModesCountDown[j] > 0 &&
406  (unsigned int)m_jointCtrlModes_previous[j].id == i)
407  cm(j) = 1;
408  }
409  m_jointsCtrlModesSOUT[i]->setConstant(cm);
410  }
411 }
412 
414  CtrlMode& cm) {
415  // Check if the ctrl mode name exists
416  for (unsigned int i = 0; i < m_ctrlModes.size(); i++)
417  if (name == m_ctrlModes[i]) {
418  cm = CtrlMode(i, name);
419  return true;
420  }
421  SEND_MSG("The specified control mode does not exist", MSG_TYPE_ERROR);
422  SEND_MSG("Possible control modes are: " + toString(m_ctrlModes),
423  MSG_TYPE_INFO);
424  return false;
425 }
426 
428  unsigned int& id) {
429  // Check if the joint name exists
430  int jid = int(m_robot_util->get_id_from_name(
431  name)); // cast needed due to bug in robot-utils
432  jid += 6; // Take into account the FF
433  if (jid < 0) {
434  SEND_MSG("The specified joint name does not exist: " + name,
435  MSG_TYPE_ERROR);
436  std::stringstream ss;
437  for (size_t it = 0; it < m_numDofs; it++) ss << toString(it) << ", ";
438  SEND_MSG("Possible joint names are: " + ss.str(), MSG_TYPE_INFO);
439  return false;
440  }
441  id = (unsigned int)jid;
442  return true;
443 }
444 
445 /*
446  bool TalosControlManager::isJointInRange(unsigned int id, double q)
447  {
448  const JointLimits & JL =
449  m_robot_util->get_joint_limits_from_id((Index)id);
450 
451  double jl= JL.lower;
452  if(q<jl)
453  {
454  SEND_MSG("Desired joint angle "+toString(q)+" is smaller than lower
455  limit: "+toString(jl),MSG_TYPE_ERROR); return false;
456  }
457  double ju = JL.upper;
458  if(q>ju)
459  {
460  SEND_MSG("Desired joint angle "+toString(q)+" is larger than upper
461  limit: "+toString(ju),MSG_TYPE_ERROR); return false;
462  }
463  return true;
464  }
465 */
466 
467 /* ------------------------------------------------------------------- */
468 /* --- ENTITY -------------------------------------------------------- */
469 /* ------------------------------------------------------------------- */
470 
471 void TalosControlManager::display(std::ostream& os) const {
472  os << "TalosControlManager " << getName();
473  try {
474  getProfiler().report_all(3, os);
475  } catch (ExceptionSignal e) {
476  }
477 }
478 
479 } // namespace talos_balance
480 } // namespace sot
481 } // namespace dynamicgraph
OUTPUT_SIGNALS
#define OUTPUT_SIGNALS
Definition: talos-control-manager.cpp:42
dynamicgraph::sot::talos_balance::TalosControlManager::convertJointNameToJointId
bool convertJointNameToJointId(const std::string &name, unsigned int &id)
Definition: talos-control-manager.cpp:427
sot_talos_balance.test.appli_admittance_end_effector.sot
sot
Definition: appli_admittance_end_effector.py:117
talos-control-manager.hh
dynamicgraph::sot::talos_balance::TalosControlManager::resetProfiler
void resetProfiler()
Definition: talos-control-manager.cpp:358
dynamicgraph
Definition: treeview.dox:24
dynamicgraph::sot::talos_balance::TalosControlManager::m_emergency_stop_triggered
bool m_emergency_stop_triggered
control loop time period
Definition: talos-control-manager.hh:137
dynamicgraph::sot::talos_balance::TalosControlManager::display
virtual void display(std::ostream &os) const
Definition: talos-control-manager.cpp:471
dynamicgraph::sot::talos_balance::TalosControlManager::updateJointCtrlModesOutputSignal
void updateJointCtrlModesOutputSignal()
Definition: talos-control-manager.cpp:391
dynamicgraph::sot::talos_balance::TalosControlManager::m_dt
double m_dt
true if the entity has been successfully initialized
Definition: talos-control-manager.hh:136
dynamicgraph::sot::talos_balance::TalosControlManager::m_jointCtrlModesCountDown
std::vector< int > m_jointCtrlModesCountDown
previous control mode of the joints
Definition: talos-control-manager.hh:151
INPUT_SIGNALS
#define INPUT_SIGNALS
Definition: talos-control-manager.cpp:41
dynamicgraph::sot::talos_balance::TalosControlManager::addCtrlMode
void addCtrlMode(const std::string &name)
safe motor control
Definition: talos-control-manager.cpp:260
dynamicgraph::sot::talos_balance::TalosControlManager::m_sleep_time
double m_sleep_time
Definition: talos-control-manager.hh:142
dynamicgraph::sot::talos_balance::TalosControlManager::init
void init(const double &dt, const std::string &robotRef)
Definition: talos-control-manager.cpp:120
dynamicgraph::sot::talos_balance::TalosControlManager::m_initSucceeded
bool m_initSucceeded
Definition: talos-control-manager.hh:135
dynamicgraph::sot::talos_balance::TalosControlManager::m_robot_util
RobotUtilShrPtr m_robot_util
Definition: talos-control-manager.hh:132
dynamicgraph::sot::talos_balance::DEFINE_SIGNAL_OUT_FUNCTION
DEFINE_SIGNAL_OUT_FUNCTION(dq, dynamicgraph::Vector)
Definition: admittance-controller-end-effector.cpp:210
statistics.hh
dynamicgraph::sot::talos_balance::TalosControlManager::m_jointsCtrlModesSOUT
std::vector< dynamicgraph::Signal< dynamicgraph::Vector, int > * > m_jointsCtrlModesSOUT
Definition: talos-control-manager.hh:98
dynamicgraph::sot::talos_balance::TalosControlManager::m_numDofs
size_t m_numDofs
Definition: talos-control-manager.hh:133
dynamicgraph::sot::talos_balance::TalosControlManager::convertStringToCtrlMode
bool convertStringToCtrlMode(const std::string &name, CtrlMode &cm)
Definition: talos-control-manager.cpp:413
dynamicgraph::sot::talos_balance::TalosControlManager::m_jointCtrlModes_current
std::vector< CtrlMode > m_jointCtrlModes_current
existing control modes
Definition: talos-control-manager.hh:147
dynamicgraph::sot::talos_balance::math::Vector
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > Vector
Definition: fwd.hh:36
dynamicgraph::sot::talos_balance::TalosControlManager::m_emergencyStopVector
std::vector< dynamicgraph::SignalPtr< bool, int > * > m_emergencyStopVector
Definition: talos-control-manager.hh:95
sot_talos_balance.test.appli_admittance_single_joint.dt
dt
Definition: appli_admittance_single_joint.py:17
dynamicgraph::sot::talos_balance::TalosControlManager::getCtrlMode
void getCtrlMode(const std::string &jointName)
Definition: talos-control-manager.cpp:342
dynamicgraph::sot::talos_balance::CtrlMode
Definition: talos-control-manager.hh:62
dynamicgraph::sot::talos_balance::math::Index
std::size_t Index
Definition: fwd.hh:54
dynamicgraph::sot::talos_balance::TalosControlManager::setCtrlMode
void setCtrlMode(const std::string &jointName, const std::string &ctrlMode)
dynamicgraph::sot::talos_balance::DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN
DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(AdmittanceControllerEndEffector, "AdmittanceControllerEndEffector")
dynamicgraph::sot::talos_balance::TalosControlManager::m_ctrlModes
std::vector< std::string > m_ctrlModes
Definition: talos-control-manager.hh:145
sot_talos_balance.test.appli_COMTraj.cm
cm
Definition: appli_COMTraj.py:28
dynamicgraph::sot::talos_balance::TalosControlManager::ctrlModes
void ctrlModes()
Definition: talos-control-manager.cpp:290
dynamicgraph::sot::talos_balance::TalosControlManager::TalosControlManager
TalosControlManager(const std::string &name)
Definition: talos-control-manager.cpp:54
dynamicgraph::sot::talos_balance::TalosControlManager::addEmergencyStopSIN
void addEmergencyStopSIN(const std::string &name)
Definition: talos-control-manager.cpp:374
getStatistics
Statistics & getStatistics()
Definition: statistics.cpp:26
dynamicgraph::sot::talos_balance::TalosControlManager::setSleepTime
void setSleepTime(const double &seconds)
Commands related to joint name and joint id.
Definition: talos-control-manager.cpp:368
dynamicgraph::sot::talos_balance::EntityClassName
AdmittanceControllerEndEffector EntityClassName
Definition: admittance-controller-end-effector.cpp:46
Statistics::reset_all
void reset_all()
Definition: statistics.cpp:62
sot_talos_balance.test.appli_dcm_zmp_control.name
name
Definition: appli_dcm_zmp_control.py:298
CTRL_MODE_TRANSITION_TIME_STEP
#define CTRL_MODE_TRANSITION_TIME_STEP
Number of time step to transition from one ctrl mode to another.
Definition: talos-control-manager.hh:60
dynamicgraph::sot::talos_balance::TalosControlManager::m_ctrlInputsSIN
std::vector< dynamicgraph::SignalPtr< dynamicgraph::Vector, int > * > m_ctrlInputsSIN
Definition: talos-control-manager.hh:93
dynamicgraph::sot::talos_balance::TalosControlManager::m_jointCtrlModes_previous
std::vector< CtrlMode > m_jointCtrlModes_previous
control mode of the joints
Definition: talos-control-manager.hh:149