sot-talos-balance  2.0.5
Collection of dynamic-graph entities aimed at implementing balance control on talos.
com-admittance-controller.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2018, Gepetto team, LAAS-CNRS
3  *
4  * This file is part of sot-talos-balance.
5  * sot-talos-balance 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-talos-balance 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-talos-balance. If not, see <http://www.gnu.org/licenses/>.
15  */
16 
18 
19 #include <dynamic-graph/all-commands.h>
20 #include <dynamic-graph/command-bind.h>
21 #include <dynamic-graph/factory.h>
22 
23 #include <sot/core/debug.hh>
24 #include <sot/core/stop-watch.hh>
25 
26 namespace dynamicgraph {
27 namespace sot {
28 namespace talos_balance {
29 namespace dg = ::dynamicgraph;
30 using namespace dg;
31 using namespace dg::command;
32 
33 // Size to be aligned "-------------------------------------------------------"
34 #define PROFILE_COMADMITTANCECONTROLLER_DDCOMREF_COMPUTATION \
35  "ComAdmittanceController: ddcomRef computation "
36 #define PROFILE_COMADMITTANCECONTROLLER_STATEREF_COMPUTATION \
37  "ComAdmittanceController: stateRef computation "
38 #define PROFILE_COMADMITTANCECONTROLLER_DCOMREF_COMPUTATION \
39  "ComAdmittanceController: dcomRef computation "
40 #define PROFILE_COMADMITTANCECONTROLLER_COMREF_COMPUTATION \
41  "ComAdmittanceController: comRef computation "
42 
43 #define INPUT_SIGNALS m_KpSIN << m_zmpSIN << m_zmpDesSIN << m_ddcomDesSIN
44 
45 #define INNER_SIGNALS m_stateRefSINNER
46 
47 #define OUTPUT_SIGNALS m_comRefSOUT << m_dcomRefSOUT << m_ddcomRefSOUT
48 
51 typedef ComAdmittanceController EntityClassName;
52 
53 /* --- DG FACTORY ---------------------------------------------------- */
54 DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(ComAdmittanceController,
55  "ComAdmittanceController");
56 
57 /* ------------------------------------------------------------------- */
58 /* --- CONSTRUCTION -------------------------------------------------- */
59 /* ------------------------------------------------------------------- */
61  : Entity(name),
62  CONSTRUCT_SIGNAL_IN(Kp, dynamicgraph::Vector),
63  CONSTRUCT_SIGNAL_IN(zmp, dynamicgraph::Vector),
64  CONSTRUCT_SIGNAL_IN(zmpDes, dynamicgraph::Vector),
65  CONSTRUCT_SIGNAL_IN(ddcomDes, dynamicgraph::Vector),
66  CONSTRUCT_SIGNAL_OUT(ddcomRef, dynamicgraph::Vector, INPUT_SIGNALS),
67  CONSTRUCT_SIGNAL_INNER(stateRef, dynamicgraph::Vector, m_ddcomRefSOUT),
68  CONSTRUCT_SIGNAL_OUT(comRef, dynamicgraph::Vector, m_stateRefSINNER),
69  CONSTRUCT_SIGNAL_OUT(dcomRef, dynamicgraph::Vector, m_stateRefSINNER)
70  // dcomRef is set to depend from comRefSOUT to ensure position is updated
71  // before velocity
72  ,
73  m_initSucceeded(false) {
74  Entity::signalRegistration(INPUT_SIGNALS << INNER_SIGNALS << OUTPUT_SIGNALS);
75 
76  /* Commands. */
77  addCommand("init", makeCommandVoid1(*this, &ComAdmittanceController::init,
78  docCommandVoid1("Initialize the entity.",
79  "time step")));
80  addCommand("setPosition",
81  makeCommandVoid1(*this, &ComAdmittanceController::setPosition,
82  docCommandVoid1("Set initial reference position.",
83  "Initial position")));
84  addCommand("setVelocity",
85  makeCommandVoid1(*this, &ComAdmittanceController::setVelocity,
86  docCommandVoid1("Set initial reference velocity.",
87  "Initial velocity")));
88  addCommand("setState",
89  makeCommandVoid2(
91  docCommandVoid2("Set initial reference position and velocity.",
92  "Initial position", "Initial velocity")));
93 }
94 
95 void ComAdmittanceController::init(const double& dt) {
96  if (!m_KpSIN.isPlugged())
97  return SEND_MSG("Init failed: signal Kp is not plugged", MSG_TYPE_ERROR);
98  if (!m_ddcomDesSIN.isPlugged())
99  return SEND_MSG("Init failed: signal ddcomDes is not plugged",
100  MSG_TYPE_ERROR);
101  if (!m_zmpSIN.isPlugged())
102  return SEND_MSG("Init failed: signal zmp is not plugged", MSG_TYPE_ERROR);
103  if (!m_zmpDesSIN.isPlugged())
104  return SEND_MSG("Init failed: signal zmpDes is not plugged",
105  MSG_TYPE_ERROR);
106 
107  m_dt = dt;
108  m_state.setZero(6);
109  m_initSucceeded = true;
110 }
111 
113  m_state.head<3>() = com;
114 }
115 
117  m_state.tail<3>() = dcom;
118 }
119 
121  const dynamicgraph::Vector& dcom) {
122  setPosition(com);
123  setVelocity(dcom);
124 }
125 
126 /* ------------------------------------------------------------------- */
127 /* --- SIGNALS ------------------------------------------------------- */
128 /* ------------------------------------------------------------------- */
129 
131  if (!m_initSucceeded) {
132  SEND_WARNING_STREAM_MSG(
133  "Cannot compute signal ddcomRef before initialization!");
134  return s;
135  }
136  if (s.size() != 3) s.resize(3);
137 
139 
140  const Vector& ddcomDes = m_ddcomDesSIN(iter);
141  const Vector& zmp = m_zmpSIN(iter);
142  const Vector& zmpDes = m_zmpDesSIN(iter);
143  const Vector& Kp = m_KpSIN(iter);
144 
145  assert(ddcomDes.size() == 3 && "Unexpected size of signal ddcomDes");
146  assert(zmp.size() == 3 && "Unexpected size of signal zmp");
147  assert(zmpDes.size() == 3 && "Unexpected size of signal zmpDes");
148  assert(Kp.size() == 3 && "Unexpected size of signal Kp");
149 
150  s = ddcomDes + Kp.cwiseProduct(zmp - zmpDes);
151 
153 
154  return s;
155 }
156 
158  if (!m_initSucceeded) {
159  SEND_WARNING_STREAM_MSG(
160  "Cannot compute signal stateRef before initialization!");
161  return s;
162  }
163  if (s.size() != 6) s.resize(6);
164 
166 
167  const Vector& ddcomRef = m_ddcomRefSOUT(iter);
168 
169  assert(ddcomRef.size() == 3 && "Unexpected size of signal ddcomRef");
170 
171  const Eigen::Vector3d dcomRef = m_state.tail<3>();
172 
173  m_state.head<3>() += dcomRef * m_dt + 0.5 * ddcomRef * m_dt * m_dt;
174  m_state.tail<3>() += ddcomRef * m_dt;
175 
176  s = m_state;
177 
179 
180  return s;
181 }
182 
184  if (!m_initSucceeded) {
185  SEND_WARNING_STREAM_MSG(
186  "Cannot compute signal dcomRef before initialization!");
187  return s;
188  }
189  if (s.size() != 3) s.resize(3);
190 
192 
193  const Vector& stateRef = m_stateRefSINNER(iter);
194 
195  assert(stateRef.size() == 6 && "Unexpected size of signal stateRef");
196 
197  s = stateRef.head<3>();
198 
200 
201  return s;
202 }
203 
205  if (!m_initSucceeded) {
206  SEND_WARNING_STREAM_MSG(
207  "Cannot compute signal dcomRef before initialization!");
208  return s;
209  }
210  if (s.size() != 3) s.resize(3);
211 
213 
214  const Vector& stateRef = m_stateRefSINNER(iter);
215 
216  assert(stateRef.size() == 6 && "Unexpected size of signal stateRef");
217 
218  s = stateRef.tail<3>();
219 
221 
222  return s;
223 }
224 
225 /* --- COMMANDS ---------------------------------------------------------- */
226 
227 /* ------------------------------------------------------------------- */
228 /* --- ENTITY -------------------------------------------------------- */
229 /* ------------------------------------------------------------------- */
230 
231 void ComAdmittanceController::display(std::ostream& os) const {
232  os << "ComAdmittanceController " << getName();
233  try {
234  getProfiler().report_all(3, os);
235  } catch (ExceptionSignal e) {
236  }
237 }
238 } // namespace talos_balance
239 } // namespace sot
240 } // namespace dynamicgraph
PROFILE_COMADMITTANCECONTROLLER_COMREF_COMPUTATION
#define PROFILE_COMADMITTANCECONTROLLER_COMREF_COMPUTATION
Definition: com-admittance-controller.cpp:40
sot_talos_balance.test.appli_admittance_end_effector.sot
sot
Definition: appli_admittance_end_effector.py:117
dynamicgraph
Definition: treeview.dox:24
INPUT_SIGNALS
#define INPUT_SIGNALS
Definition: com-admittance-controller.cpp:43
sot_talos_balance.test.appli_dcmZmpControl.ddcomDes
tuple ddcomDes
Definition: appli_dcmZmpControl.py:31
dynamicgraph::sot::talos_balance::ComAdmittanceController::display
virtual void display(std::ostream &os) const
Definition: com-admittance-controller.cpp:231
dynamicgraph::sot::talos_balance::ComAdmittanceController::m_state
dynamicgraph::Vector m_state
true if the entity has been successfully initialized
Definition: com-admittance-controller.hh:88
dynamicgraph::sot::talos_balance::ComAdmittanceController::init
void init(const double &dt)
Definition: com-admittance-controller.cpp:95
dynamicgraph::sot::talos_balance::DEFINE_SIGNAL_OUT_FUNCTION
DEFINE_SIGNAL_OUT_FUNCTION(dq, dynamicgraph::Vector)
Definition: admittance-controller-end-effector.cpp:210
com-admittance-controller.hh
PROFILE_COMADMITTANCECONTROLLER_STATEREF_COMPUTATION
#define PROFILE_COMADMITTANCECONTROLLER_STATEREF_COMPUTATION
Definition: com-admittance-controller.cpp:36
PROFILE_COMADMITTANCECONTROLLER_DCOMREF_COMPUTATION
#define PROFILE_COMADMITTANCECONTROLLER_DCOMREF_COMPUTATION
Definition: com-admittance-controller.cpp:38
sot_talos_balance.test.appli_admittance_single_joint.Kp
list Kp
Definition: appli_admittance_single_joint.py:33
PROFILE_COMADMITTANCECONTROLLER_DDCOMREF_COMPUTATION
#define PROFILE_COMADMITTANCECONTROLLER_DDCOMREF_COMPUTATION
Definition: com-admittance-controller.cpp:34
OUTPUT_SIGNALS
#define OUTPUT_SIGNALS
Definition: com-admittance-controller.cpp:47
dynamicgraph::sot::talos_balance::math::Vector
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > Vector
Definition: fwd.hh:36
sot_talos_balance.test.appli_dcmZmpControl.zmpDes
zmpDes
Definition: appli_dcmZmpControl.py:30
sot_talos_balance.test.appli_admittance_single_joint.dt
dt
Definition: appli_admittance_single_joint.py:17
dynamicgraph::sot::talos_balance::ComAdmittanceController::m_initSucceeded
bool m_initSucceeded
Definition: com-admittance-controller.hh:87
INNER_SIGNALS
#define INNER_SIGNALS
Definition: com-admittance-controller.cpp:45
dynamicgraph::sot::talos_balance::DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN
DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(AdmittanceControllerEndEffector, "AdmittanceControllerEndEffector")
dynamicgraph::sot::talos_balance::ComAdmittanceController::setPosition
void setPosition(const dynamicgraph::Vector &)
Definition: com-admittance-controller.cpp:112
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::ComAdmittanceController::setState
void setState(const dynamicgraph::Vector &, const dynamicgraph::Vector &)
Definition: com-admittance-controller.cpp:120
dynamicgraph::sot::talos_balance::ComAdmittanceController::setVelocity
void setVelocity(const dynamicgraph::Vector &)
Definition: com-admittance-controller.cpp:116
dynamicgraph::sot::talos_balance::EntityClassName
AdmittanceControllerEndEffector EntityClassName
Definition: admittance-controller-end-effector.cpp:46
sot_talos_balance.test.appli_dcm_zmp_control.name
name
Definition: appli_dcm_zmp_control.py:298
dynamicgraph::sot::talos_balance::ComAdmittanceController::ComAdmittanceController
EIGEN_MAKE_ALIGNED_OPERATOR_NEW ComAdmittanceController(const std::string &name)
Definition: com-admittance-controller.cpp:60
dynamicgraph::sot::talos_balance::ComAdmittanceController::m_dt
double m_dt
Definition: com-admittance-controller.hh:89