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; }
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
const Model & model() const
Accessor to model.
Motion frameAcceleration(const Data &data, const Model::FrameIndex index) const
void frameJacobianWorld(Data &data, const Model::FrameIndex index, Data::Matrix6x &J) const
const Vector3 & com_vel(const Data &data) const
void computeAllTerms(Data &data, const Vector &q, const Vector &v) const
const Vector & nonLinearEffects(const Data &data) const
void jacobianLocal(const Data &data, const Model::JointIndex index, Data::Matrix6x &J) const
const Vector3 & com_acc(const Data &data) const
const Motion & acceleration(const Data &data, const Model::JointIndex index) const
const Motion & velocity(const Data &data, const Model::JointIndex index) const
const SE3 & position(const Data &data, const Model::JointIndex index) const
SE3 framePosition(const Data &data, const Model::FrameIndex index) const
const Matrix3x & Jcom(const Data &data) const
Motion frameClassicAcceleration(const Data &data, const Model::FrameIndex index) const
void jacobianWorld(const Data &data, const Model::JointIndex index, Data::Matrix6x &J) const
void frameJacobianLocal(Data &data, const Model::FrameIndex index, Data::Matrix6x &J) const
RobotWrapper(const std::string &filename, const std::vector< std::string > &package_dirs, bool verbose=false)
Motion frameVelocity(const Data &data, const Model::FrameIndex index) const
void com(const Data &data, RefVector com_pos, RefVector com_vel, RefVector com_acc) const
Matrix m_M
diagonal part of inertia matrix due to rotor inertias