sot-talos-balance  2.0.5
Collection of dynamic-graph entities aimed at implementing balance control on talos.
admittance-controller-end-effector.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2019
3  *
4  * LAAS-CNRS
5  *
6  * Fanny Risbourg
7  * This file is part of sot-talos-balance.
8  * See license file.
9  */
10 
12 
13 #include <dynamic-graph/all-commands.h>
14 #include <dynamic-graph/factory.h>
15 
16 #include <sot/core/debug.hh>
17 #include <sot/core/stop-watch.hh>
18 
19 namespace dynamicgraph {
20 namespace sot {
21 namespace talos_balance {
22 namespace dg = ::dynamicgraph;
23 using namespace dg;
24 using namespace pinocchio;
25 using namespace dg::command;
26 
27 #define PROFILE_ADMITTANCECONTROLLERENDEFFECTOR_WFORCE_COMPUTATION \
28  "AdmittanceControllerEndEffector: w_force computation "
29 
30 #define PROFILE_ADMITTANCECONTROLLERENDEFFECTOR_WDQ_COMPUTATION \
31  "AdmittanceControllerEndEffector: w_dq computation "
32 
33 #define PROFILE_ADMITTANCECONTROLLERENDEFFECTOR_DQ_COMPUTATION \
34  "AdmittanceControllerEndEffector: dq computation "
35 
36 #define INPUT_SIGNALS \
37  m_KpSIN << m_KdSIN << m_dqSaturationSIN << m_forceSIN << m_w_forceDesSIN \
38  << m_qSIN
39 
40 #define INNER_SIGNALS m_w_forceSINNER << m_w_dqSINNER
41 
42 #define OUTPUT_SIGNALS m_dqSOUT
43 
47 
48 /* --- DG FACTORY ---------------------------------------------------- */
50  "AdmittanceControllerEndEffector");
51 
52 /* ------------------------------------------------------------------- */
53 /* --- CONSTRUCTION -------------------------------------------------- */
54 /* ------------------------------------------------------------------- */
56  const std::string &name)
57  : Entity(name),
58  CONSTRUCT_SIGNAL_IN(Kp, dynamicgraph::Vector),
59  CONSTRUCT_SIGNAL_IN(Kd, dynamicgraph::Vector),
60  CONSTRUCT_SIGNAL_IN(dqSaturation, dynamicgraph::Vector),
61  CONSTRUCT_SIGNAL_IN(force, dynamicgraph::Vector),
62  CONSTRUCT_SIGNAL_IN(w_forceDes, dynamicgraph::Vector),
63  CONSTRUCT_SIGNAL_IN(q, dynamicgraph::Vector),
64  CONSTRUCT_SIGNAL_INNER(w_force, dynamicgraph::Vector, m_forceSIN),
65  CONSTRUCT_SIGNAL_INNER(w_dq, dynamicgraph::Vector,
66  INPUT_SIGNALS << m_w_forceSINNER),
67  CONSTRUCT_SIGNAL_OUT(dq, dynamicgraph::Vector, m_w_dqSINNER),
68  m_initSucceeded(false),
69  m_robot_util(),
70  m_model(),
71  m_data(),
72  m_sensorFrameId(),
73  m_endEffectorId() {
74  Entity::signalRegistration(INPUT_SIGNALS << INNER_SIGNALS << OUTPUT_SIGNALS);
75 
76  /* Commands. */
77  addCommand("init",
78  makeCommandVoid3(*this, &AdmittanceControllerEndEffector::init,
79  docCommandVoid3("Initialize the entity.",
80  "time step", "sensor frame name",
81  "end Effector Joint Name")));
82  addCommand("resetDq",
83  makeCommandVoid0(*this, &AdmittanceControllerEndEffector::resetDq,
84  docCommandVoid0("resetDq")));
85 }
86 
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",
92  MSG_TYPE_ERROR);
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",
101  MSG_TYPE_ERROR);
102  if (!m_qSIN.isPlugged())
103  return SEND_MSG("Init failed: signal q is not plugged", MSG_TYPE_ERROR);
104 
105  m_n = 6;
106  m_dt = dt;
107  m_w_dq.setZero(m_n);
108 
109  try {
110  /* Retrieve m_robot_util informations */
111  std::string localName("robot");
112  if (isNameInRobotUtil(localName)) {
113  m_robot_util = getRobotUtil(localName);
114  std::cerr << "m_robot_util:" << m_robot_util << std::endl;
115  } else {
116  SEND_MSG("You should have a robotUtil pointer initialized before",
117  MSG_TYPE_ERROR);
118  return;
119  }
120 
121  pinocchio::urdf::buildModel(m_robot_util->m_urdf_filename,
122  pinocchio::JointModelFreeFlyer(), m_model);
123  m_data = new pinocchio::Data(m_model);
124 
125  m_endEffectorId = m_model.getJointId(endEffectorName);
126  m_sensorFrameId = m_model.getFrameId(sensorFrameName);
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,
130  MSG_TYPE_ERROR);
131  return;
132  }
133 
134  m_initSucceeded = true;
135 }
136 
138  m_w_dq.setZero(m_n);
139  return;
140 }
141 
142 /* ------------------------------------------------------------------- */
143 /* --- SIGNALS ------------------------------------------------------- */
144 /* ------------------------------------------------------------------- */
146  if (!m_initSucceeded) {
147  SEND_WARNING_STREAM_MSG(
148  "Cannot compute signal w_force before initialization!");
149  return s;
150  }
151  if (s.size() != 6) s.resize(6);
152 
153  getProfiler().start(
155 
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");
160 
161  // Get sensorPlacement
162  pinocchio::framesForwardKinematics(m_model, *m_data, q);
163  pinocchio::SE3 sensorPlacement = m_data->oMf[m_sensorFrameId];
164 
165  s = sensorPlacement.act(pinocchio::Force(force)).toVector();
166 
167  getProfiler().stop(
169 
170  return s;
171 }
172 
174  if (!m_initSucceeded) {
175  SEND_WARNING_STREAM_MSG(
176  "Cannot compute signal w_dq before initialization!");
177  return s;
178  }
179  if (s.size() != 6) s.resize(6);
180 
182 
183  const Vector &w_forceDes = m_w_forceDesSIN(iter);
184  const Vector &w_force = m_w_forceSINNER(iter);
185  const Vector &Kp = m_KpSIN(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");
194 
195  m_w_dq = m_w_dq + m_dt * (Kp.cwiseProduct(w_forceDes - w_force)) -
196  Kd.cwiseProduct(m_w_dq);
197 
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];
201  }
202 
203  s = m_w_dq;
204 
206 
207  return s;
208 }
209 
211  if (!m_initSucceeded) {
212  SEND_WARNING_STREAM_MSG("Cannot compute signal dq before initialization!");
213  return s;
214  }
215  if (s.size() != 6) s.resize(6);
216 
218 
219  const Vector &w_dq = m_w_dqSINNER(iter);
220  assert(w_dq.size() == m_n && "Unexpected size of signal w_dq");
221 
222  // Get endEffectorPlacement
223  pinocchio::SE3 placement = m_data->oMi[m_endEffectorId];
224 
225  s = placement.actInv(pinocchio::Motion(w_dq)).toVector();
226 
228 
229  return s;
230 }
231 
232 /* --- COMMANDS ---------------------------------------------------------- */
233 
234 /* ------------------------------------------------------------------- */
235 /* --- ENTITY -------------------------------------------------------- */
236 /* ------------------------------------------------------------------- */
237 void AdmittanceControllerEndEffector::display(std::ostream &os) const {
238  os << "AdmittanceControllerEndEffector " << getName();
239  try {
240  getProfiler().report_all(3, os);
241  } catch (ExceptionSignal e) {
242  }
243 }
244 } // namespace talos_balance
245 } // namespace sot
246 } // namespace dynamicgraph
sot_talos_balance.test.appli_admittance_end_effector.q
list q
Definition: appli_admittance_end_effector.py:30
sot_talos_balance.test.appli_admittance_end_effector.sot
sot
Definition: appli_admittance_end_effector.py:117
dynamicgraph
Definition: treeview.dox:24
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector::m_sensorFrameId
pinocchio::FrameIndex m_sensorFrameId
Id of the force sensor frame.
Definition: admittance-controller-end-effector.hh:136
admittance-controller-end-effector.hh
INPUT_SIGNALS
#define INPUT_SIGNALS
Definition: admittance-controller-end-effector.cpp:36
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector::m_dt
double m_dt
Time step of the control.
Definition: admittance-controller-end-effector.hh:125
INNER_SIGNALS
#define INNER_SIGNALS
Definition: admittance-controller-end-effector.cpp:40
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector::m_robot_util
RobotUtilShrPtr m_robot_util
Robot Util instance to get the sensor frame.
Definition: admittance-controller-end-effector.hh:130
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector::m_w_dq
dynamicgraph::Vector m_w_dq
Internal state.
Definition: admittance-controller-end-effector.hh:123
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector::init
void init(const double &dt, const std::string &sensorFrameName, const std::string &endeffectorName)
Initialize the entity.
Definition: admittance-controller-end-effector.cpp:87
dynamicgraph::sot::talos_balance::DEFINE_SIGNAL_OUT_FUNCTION
DEFINE_SIGNAL_OUT_FUNCTION(dq, dynamicgraph::Vector)
Definition: admittance-controller-end-effector.cpp:210
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector::m_model
pinocchio::Model m_model
Pinocchio robot model.
Definition: admittance-controller-end-effector.hh:132
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector::display
virtual void display(std::ostream &os) const
Definition: admittance-controller-end-effector.cpp:237
PROFILE_ADMITTANCECONTROLLERENDEFFECTOR_WFORCE_COMPUTATION
#define PROFILE_ADMITTANCECONTROLLERENDEFFECTOR_WFORCE_COMPUTATION
Definition: admittance-controller-end-effector.cpp:27
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector::m_endEffectorId
pinocchio::JointIndex m_endEffectorId
Id of the joint of the end-effector.
Definition: admittance-controller-end-effector.hh:138
sot_talos_balance.test.appli_admittance_single_joint.Kp
list Kp
Definition: appli_admittance_single_joint.py:33
dynamicgraph::sot::talos_balance::math::Vector
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > Vector
Definition: fwd.hh:36
sot_talos_balance.test.appli_admittance_single_joint.dt
dt
Definition: appli_admittance_single_joint.py:17
PROFILE_ADMITTANCECONTROLLERENDEFFECTOR_WDQ_COMPUTATION
#define PROFILE_ADMITTANCECONTROLLERENDEFFECTOR_WDQ_COMPUTATION
Definition: admittance-controller-end-effector.cpp:30
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector::m_data
pinocchio::Data * m_data
Pinocchio robot data.
Definition: admittance-controller-end-effector.hh:134
OUTPUT_SIGNALS
#define OUTPUT_SIGNALS
Definition: admittance-controller-end-effector.cpp:42
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector
Admittance controller for an upper body end-effector (right or left wrist)
Definition: admittance-controller-end-effector.hh:65
dynamicgraph::sot::talos_balance::DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN
DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(AdmittanceControllerEndEffector, "AdmittanceControllerEndEffector")
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector::m_n
int m_n
Dimension of the force signals and of the output.
Definition: admittance-controller-end-effector.hh:119
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector::resetDq
void resetDq()
Reset the velocity.
Definition: admittance-controller-end-effector.cpp:137
dynamicgraph::sot::talos_balance::DEFINE_SIGNAL_INNER_FUNCTION
DEFINE_SIGNAL_INNER_FUNCTION(w_force, dynamicgraph::Vector)
Definition: admittance-controller-end-effector.cpp:145
dynamicgraph::sot::talos_balance::EntityClassName
AdmittanceControllerEndEffector EntityClassName
Definition: admittance-controller-end-effector.cpp:46
PROFILE_ADMITTANCECONTROLLERENDEFFECTOR_DQ_COMPUTATION
#define PROFILE_ADMITTANCECONTROLLERENDEFFECTOR_DQ_COMPUTATION
Definition: admittance-controller-end-effector.cpp:33
sot_talos_balance.test.appli_dcm_zmp_control.name
name
Definition: appli_dcm_zmp_control.py:298
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector::m_initSucceeded
bool m_initSucceeded
True if the entity has been successfully initialized.
Definition: admittance-controller-end-effector.hh:121
dynamicgraph::sot::talos_balance::AdmittanceControllerEndEffector::AdmittanceControllerEndEffector
EIGEN_MAKE_ALIGNED_OPERATOR_NEW AdmittanceControllerEndEffector(const std::string &name)
Definition: admittance-controller-end-effector.cpp:55