sot-talos-balance  2.0.5
Collection of dynamic-graph entities aimed at implementing balance control on talos.
robot-wrapper.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2017 CNRS
3 //
4 // This file is part of tsid
5 // tsid is free software: you can redistribute it
6 // and/or modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation, either version
8 // 3 of the License, or (at your option) any later version.
9 // tsid 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 GNU
12 // General Lesser Public License for more details. You should have
13 // received a copy of the GNU Lesser General Public License along with
14 // tsid If not, see
15 // <http://www.gnu.org/licenses/>.
16 //
17 
19 
20 #include <pinocchio/algorithm/center-of-mass.hpp>
21 #include <pinocchio/algorithm/compute-all-terms.hpp>
22 #include <pinocchio/algorithm/frames.hpp>
23 #include <pinocchio/algorithm/jacobian.hpp>
24 #include <pinocchio/multibody/model.hpp>
25 #include <pinocchio/parsers/urdf.hpp>
26 
27 using namespace pinocchio;
29 
30 namespace dynamicgraph {
31 namespace sot {
32 namespace talos_balance {
33 namespace robots {
34 
35 RobotWrapper::RobotWrapper(const std::string& filename,
36  const std::vector<std::string>&, bool verbose)
37  : m_verbose(verbose) {
38  pinocchio::urdf::buildModel(filename, m_model, m_verbose);
39  m_model_filename = filename;
40  m_rotor_inertias.setZero(m_model.nv);
41  m_gear_ratios.setZero(m_model.nv);
42  m_Md.setZero(m_model.nv);
43  m_M.setZero(m_model.nv, m_model.nv);
44 }
45 
46 RobotWrapper::RobotWrapper(const std::string& filename,
47  const std::vector<std::string>&,
48  const pinocchio::JointModelVariant& rootJoint,
49  bool verbose)
50  : m_verbose(verbose) {
51  pinocchio::urdf::buildModel(filename, rootJoint, m_model, m_verbose);
52  m_model_filename = filename;
53  m_rotor_inertias.setZero(m_model.nv - 6);
54  m_gear_ratios.setZero(m_model.nv - 6);
55  m_Md.setZero(m_model.nv - 6);
56  m_M.setZero(m_model.nv, m_model.nv);
57 }
58 
59 int RobotWrapper::nq() const { return m_model.nq; }
60 int RobotWrapper::nv() const { return m_model.nv; }
61 
62 const Model& RobotWrapper::model() const { return m_model; }
63 Model& RobotWrapper::model() { return m_model; }
64 
66  const Vector& v) const {
67  pinocchio::computeAllTerms(m_model, data, q, v);
68  data.M.triangularView<Eigen::StrictlyLower>() =
69  data.M.transpose().triangularView<Eigen::StrictlyLower>();
70  // computeAllTerms does not compute the com acceleration, so we need to call
71  // centerOfMass
72  pinocchio::centerOfMass(m_model, data, 2, false);
73  pinocchio::framesForwardKinematics(m_model, data);
74  pinocchio::centerOfMass(m_model, data, q, v, Eigen::VectorXd::Zero(nv()));
75 }
76 
79 
81  assert(rotor_inertias.size() == m_rotor_inertias.size());
83  updateMd();
84  return true;
85 }
86 
88  assert(gear_ratios.size() == m_gear_ratios.size());
90  updateMd();
91  return true;
92 }
93 
95  m_Md =
96  m_gear_ratios.cwiseProduct(m_gear_ratios.cwiseProduct(m_rotor_inertias));
97 }
98 
99 void RobotWrapper::com(const Data& data, RefVector com_pos, RefVector com_vel,
100  RefVector com_acc) const {
101  com_pos = data.com[0];
102  com_vel = data.vcom[0];
103  com_acc = data.acom[0];
104 }
105 
106 const Vector3& RobotWrapper::com(const Data& data) const { return data.com[0]; }
107 
108 const Vector3& RobotWrapper::com_vel(const Data& data) const {
109  return data.vcom[0];
110 }
111 
112 const Vector3& RobotWrapper::com_acc(const Data& data) const {
113  return data.acom[0];
114 }
115 
116 const Matrix3x& RobotWrapper::Jcom(const Data& data) const { return data.Jcom; }
117 
118 const Matrix& RobotWrapper::mass(const Data& data) {
119  m_M = data.M;
120  m_M.diagonal().tail(m_model.nv - 6) += m_Md;
121  return m_M;
122 }
123 
124 const Vector& RobotWrapper::nonLinearEffects(const Data& data) const {
125  return data.nle;
126 }
127 
128 const SE3& RobotWrapper::position(const Data& data,
129  const Model::JointIndex index) const {
130  return data.oMi[index];
131 }
132 
133 const Motion& RobotWrapper::velocity(const Data& data,
134  const Model::JointIndex index) const {
135  return data.v[index];
136 }
137 
139  const Model::JointIndex index) const {
140  return data.a[index];
141 }
142 
144  const Model::JointIndex index,
145  Data::Matrix6x& J) const {
146  return pinocchio::getJointJacobian(m_model, data, index, pinocchio::WORLD, J);
147 }
148 
150  const Model::JointIndex index,
151  Data::Matrix6x& J) const {
152  return pinocchio::getJointJacobian(m_model, data, index, pinocchio::LOCAL, J);
153 }
154 
156  const Model::FrameIndex index) const {
157  const Frame& f = m_model.frames[index];
158  return data.oMi[f.parent].act(f.placement);
159 }
160 
162  const Model::FrameIndex index,
163  SE3& framePosition) const {
164  const Frame& f = m_model.frames[index];
165  framePosition = data.oMi[f.parent].act(f.placement);
166 }
167 
169  const Model::FrameIndex index) const {
170  return pinocchio::getFrameVelocity(m_model, data, index);
171 }
172 
174  const Model::FrameIndex index,
175  Motion& frameVelocity) const {
176  frameVelocity = pinocchio::getFrameVelocity(m_model, data, index);
177 }
178 
180  const Model::FrameIndex index) const {
181  return pinocchio::getFrameAcceleration(m_model, data, index);
182 }
183 
185  const Model::FrameIndex index,
186  Motion& frameAcceleration) const {
187  frameAcceleration = pinocchio::getFrameAcceleration(m_model, data, index);
188 }
189 
191  const Data& data, const Model::FrameIndex index) const {
192  Motion a = pinocchio::getFrameAcceleration(m_model, data, index);
193  Motion v = pinocchio::getFrameVelocity(m_model, data, index);
194  a.linear() += v.angular().cross(v.linear());
195  return a;
196 }
197 
199  const Model::FrameIndex index,
200  Motion& frameAcceleration) const {
201  frameAcceleration = pinocchio::getFrameAcceleration(m_model, data, index);
202  Motion v = pinocchio::getFrameVelocity(m_model, data, index);
203  frameAcceleration.linear() += v.angular().cross(v.linear());
204 }
205 
206 void RobotWrapper::frameJacobianWorld(Data& data, const Model::FrameIndex index,
207  Data::Matrix6x& J) const {
208  return pinocchio::getFrameJacobian(m_model, data, index, pinocchio::WORLD, J);
209 }
210 
211 void RobotWrapper::frameJacobianLocal(Data& data, const Model::FrameIndex index,
212  Data::Matrix6x& J) const {
213  return pinocchio::getFrameJacobian(m_model, data, index, pinocchio::LOCAL, J);
214 }
215 
216 // const Vector3 & com(Data & data,const Vector & q,
217 // const bool computeSubtreeComs = true,
218 // const bool updateKinematics = true)
219 // {
220 // return pinocchio::centerOfMass(m_model, data, q, computeSubtreeComs,
221 // updateKinematics);
222 // }
223 // const Vector3 & com(Data & data, const Vector & q, const Vector & v,
224 // const bool computeSubtreeComs = true,
225 // const bool updateKinematics = true)
226 // {
227 // return pinocchio::centerOfMass(m_model, data, q, v, computeSubtreeComs,
228 // updateKinematics);
229 // }
230 
231 } // namespace robots
232 } // namespace talos_balance
233 } // namespace sot
234 } // namespace dynamicgraph
dynamicgraph::sot::talos_balance::robots::RobotWrapper::Frame
pinocchio::Frame Frame
Definition: robot-wrapper.hh:44
sot_talos_balance.test.appli_admittance_end_effector.q
list q
Definition: appli_admittance_end_effector.py:30
dynamicgraph::sot::talos_balance::robots::RobotWrapper::acceleration
const Motion & acceleration(const Data &data, const Model::JointIndex index) const
Definition: robot-wrapper.cpp:138
dynamicgraph::sot::talos_balance::robots::RobotWrapper::jacobianWorld
void jacobianWorld(const Data &data, const Model::JointIndex index, Data::Matrix6x &J) const
Definition: robot-wrapper.cpp:143
dynamicgraph::sot::talos_balance::robots::RobotWrapper::com_acc
const Vector3 & com_acc(const Data &data) const
Definition: robot-wrapper.cpp:112
dynamicgraph::sot::talos_balance::robots::RobotWrapper::m_gear_ratios
Vector m_gear_ratios
Definition: robot-wrapper.hh:147
sot_talos_balance.test.appli_admittance_end_effector.sot
sot
Definition: appli_admittance_end_effector.py:117
dynamicgraph::sot::talos_balance::robots::RobotWrapper::framePosition
SE3 framePosition(const Data &data, const Model::FrameIndex index) const
Definition: robot-wrapper.cpp:155
dynamicgraph::sot::talos_balance::robots::RobotWrapper::m_model
Model m_model
Robot model.
Definition: robot-wrapper.hh:142
dynamicgraph::sot::talos_balance::robots::RobotWrapper::frameVelocity
Motion frameVelocity(const Data &data, const Model::FrameIndex index) const
Definition: robot-wrapper.cpp:168
dynamicgraph::sot::talos_balance::robots::RobotWrapper::Matrix3x
math::Matrix3x Matrix3x
Definition: robot-wrapper.hh:50
dynamicgraph::sot::talos_balance::robots::RobotWrapper::SE3
pinocchio::SE3 SE3
Definition: robot-wrapper.hh:45
dynamicgraph::sot::talos_balance::robots::RobotWrapper::RefVector
math::RefVector RefVector
Definition: robot-wrapper.hh:51
dynamicgraph
Definition: treeview.dox:24
dynamicgraph::sot::talos_balance::robots::RobotWrapper::Motion
pinocchio::Motion Motion
Definition: robot-wrapper.hh:43
dynamicgraph::sot::talos_balance::robots::RobotWrapper::mass
const Matrix & mass(const Data &data)
Definition: robot-wrapper.cpp:118
dynamicgraph::sot::talos_balance::robots::RobotWrapper::com
void com(const Data &data, RefVector com_pos, RefVector com_vel, RefVector com_acc) const
Definition: robot-wrapper.cpp:99
dynamicgraph::sot::talos_balance::robots::RobotWrapper::nq
virtual int nq() const
Definition: robot-wrapper.cpp:59
dynamicgraph::sot::talos_balance::robots::RobotWrapper::m_verbose
bool m_verbose
Definition: robot-wrapper.hh:144
dynamicgraph::sot::talos_balance::robots::RobotWrapper::jacobianLocal
void jacobianLocal(const Data &data, const Model::JointIndex index, Data::Matrix6x &J) const
Definition: robot-wrapper.cpp:149
dynamicgraph::sot::talos_balance::robots::RobotWrapper::Matrix
math::Matrix Matrix
Definition: robot-wrapper.hh:49
dynamicgraph::sot::talos_balance::robots::RobotWrapper::m_rotor_inertias
Vector m_rotor_inertias
Definition: robot-wrapper.hh:146
dynamicgraph::sot::talos_balance::robots::RobotWrapper::ConstRefVector
math::ConstRefVector ConstRefVector
Definition: robot-wrapper.hh:52
robot-wrapper.hh
dynamicgraph::sot::talos_balance::robots::RobotWrapper::rotor_inertias
const Vector & rotor_inertias() const
Definition: robot-wrapper.cpp:77
dynamicgraph::sot::talos_balance::robots::RobotWrapper::Jcom
const Matrix3x & Jcom(const Data &data) const
Definition: robot-wrapper.cpp:116
dynamicgraph::sot::talos_balance::robots::RobotWrapper::Vector
math::Vector Vector
Definition: robot-wrapper.hh:46
dynamicgraph::sot::talos_balance::robots::RobotWrapper::RobotWrapper
RobotWrapper(const std::string &filename, const std::vector< std::string > &package_dirs, bool verbose=false)
Definition: robot-wrapper.cpp:35
dynamicgraph::sot::talos_balance::robots::RobotWrapper::com_vel
const Vector3 & com_vel(const Data &data) const
Definition: robot-wrapper.cpp:108
dynamicgraph::sot::talos_balance::robots::RobotWrapper::Vector3
math::Vector3 Vector3
Definition: robot-wrapper.hh:47
dynamicgraph::sot::talos_balance::robots::RobotWrapper::frameClassicAcceleration
Motion frameClassicAcceleration(const Data &data, const Model::FrameIndex index) const
Definition: robot-wrapper.cpp:190
dynamicgraph::sot::talos_balance::robots::RobotWrapper::updateMd
void updateMd()
Definition: robot-wrapper.cpp:94
dynamicgraph::sot::talos_balance::robots::RobotWrapper::nv
virtual int nv() const
Definition: robot-wrapper.cpp:60
dynamicgraph::sot::talos_balance::robots::RobotWrapper::model
const Model & model() const
Accessor to model.
Definition: robot-wrapper.cpp:62
dynamicgraph::sot::talos_balance::robots::RobotWrapper::m_model_filename
std::string m_model_filename
Definition: robot-wrapper.hh:143
dynamicgraph::sot::talos_balance::robots::RobotWrapper::frameAcceleration
Motion frameAcceleration(const Data &data, const Model::FrameIndex index) const
Definition: robot-wrapper.cpp:179
dynamicgraph::sot::talos_balance::robots::RobotWrapper::computeAllTerms
void computeAllTerms(Data &data, const Vector &q, const Vector &v) const
Definition: robot-wrapper.cpp:65
dynamicgraph::sot::talos_balance::math
Definition: fwd.hh:33
dynamicgraph::sot::talos_balance::robots::RobotWrapper::frameJacobianLocal
void frameJacobianLocal(Data &data, const Model::FrameIndex index, Data::Matrix6x &J) const
Definition: robot-wrapper.cpp:211
dynamicgraph::sot::talos_balance::robots::RobotWrapper::nonLinearEffects
const Vector & nonLinearEffects(const Data &data) const
Definition: robot-wrapper.cpp:124
dynamicgraph::sot::talos_balance::robots::RobotWrapper::m_M
Matrix m_M
diagonal part of inertia matrix due to rotor inertias
Definition: robot-wrapper.hh:149
dynamicgraph::sot::talos_balance::robots::RobotWrapper::velocity
const Motion & velocity(const Data &data, const Model::JointIndex index) const
Definition: robot-wrapper.cpp:133
dynamicgraph::sot::talos_balance::robots::RobotWrapper::m_Md
Vector m_Md
Definition: robot-wrapper.hh:148
dynamicgraph::sot::talos_balance::robots::RobotWrapper::gear_ratios
const Vector & gear_ratios() const
Definition: robot-wrapper.cpp:78
dynamicgraph::sot::talos_balance::robots::RobotWrapper::Model
pinocchio::Model Model
Definition: robot-wrapper.hh:41
dynamicgraph::sot::talos_balance::robots::RobotWrapper::position
const SE3 & position(const Data &data, const Model::JointIndex index) const
Definition: robot-wrapper.cpp:128
dynamicgraph::sot::talos_balance::robots::RobotWrapper::frameJacobianWorld
void frameJacobianWorld(Data &data, const Model::FrameIndex index, Data::Matrix6x &J) const
Definition: robot-wrapper.cpp:206
dynamicgraph::sot::talos_balance::robots::RobotWrapper::Data
pinocchio::Data Data
Definition: robot-wrapper.hh:42