ocra-recipes
Doxygen documentation for the ocra-recipes repository
PartialState.cpp
Go to the documentation of this file.
1 
10 
11 #include "ocra/control/FullState.h"
12 
13 #include <iostream>
14 
15 namespace ocra
16 {
17 
19 {
20  const Model& model;
21  int size;
22  Eigen::MatrixXd J;
23  Eigen::VectorXi dofs;
24  int part;
25 
26  Pimpl(const Model& m, const Eigen::VectorXi& selectedDofs, int whichPart)
27  : model(m)
28  , dofs(selectedDofs.size())
29  , size(selectedDofs.size())
30  , part(whichPart)
31  {
32  J = Eigen::MatrixXd::Zero(size, model.nbDofs());
33 
34  for (int i=0; i<size; i++)
35  {
36  if (selectedDofs(i)<0)
37  throw std::runtime_error("[PartialState::PartialState] some selected dofs are negative");
38  }
39 
40 
41  switch(part)
42  {
44  {
45  for (int i=0; i<size; i++)
46  {
47  dofs(i) = selectedDofs(i);
48  J(i, dofs(i)) = 1;
49  }
50  break;
51  }
53  {
54  int decal = model.hasFixedRoot() ? 0 : 6;
55  for (int i=0; i<size; i++)
56  {
57  dofs(i) = decal+selectedDofs(i);
58  J(i, dofs(i)) = 1;
59  }
60  break;
61  }
62  default:
63  {
64  throw std::runtime_error("[PartialState::PartialState] invalid specified part (specify FULL_STATE, or INTERNAL)");
65  }
66  }
67 
68  }
69 };
70 
71 PartialState::PartialState(const std::string& name, const Model& model, const Eigen::VectorXi& selectedDofs, int whichPart)
72  : NamedInstance(name)
73  , pimpl( new PartialState::Pimpl(model, selectedDofs, whichPart) )
74 {
75 }
76 
78 {
79 }
80 
82 {
83  return pimpl->model;
84 }
85 
87 {
88  return pimpl->size;
89 }
90 
91 const MatrixXd& PartialState::getJacobian() const
92 {
93  return pimpl->J;
94 }
95 
96 Eigen::VectorXi& PartialState::getDofs() const
97 {
98  return pimpl->dofs;
99 }
100 
101 
102 
103 
104 //====================================================================
105 
107 {
108  Eigen::MatrixXd M;
109  Eigen::MatrixXd Minv;
110  Eigen::VectorXd tau;
111  Eigen::VectorXd q;
112  Eigen::VectorXd qdot;
113  Eigen::VectorXd qddot;
114 };
115 
116 
117 
118 PartialModelState::PartialModelState(const std::string& name, const Model& model, const Eigen::VectorXi& selectedDofs, int whichPart)
119  : PartialState(name, model, selectedDofs, whichPart)
120  , pimpl( new Pimpl )
121 {
122  pimpl->tau = VectorXd::Zero(getSize());
123  pimpl->q = VectorXd::Zero(getSize());
124  pimpl->qdot = VectorXd::Zero(getSize());
125  pimpl->qddot = VectorXd::Zero(getSize());
126 }
127 
129 {
130 
131 }
132 
133 const Eigen::VectorXd& PartialModelState::q() const
134 {
135  Eigen::VectorXd tmp = getModel().getConfigurationVariable().getValue();
136 
137  for (int i=0; i<getSize(); i++)
138  pimpl->q(i) = tmp(getDofs()(i));
139 
140  return pimpl->q;
141 }
142 
143 const Eigen::VectorXd& PartialModelState::qdot() const
144 {
145  Eigen::VectorXd tmp = getModel().getVelocityVariable().getValue();
146 
147  for (int i=0; i<getSize(); i++)
148  pimpl->qdot(i) = tmp(getDofs()(i));
149 
150  return pimpl->qdot;
151 }
152 
153  const Eigen::VectorXd& PartialModelState::qddot() const
154  {
155  return pimpl->qddot;
156  }
157 
158  const Eigen::VectorXd& PartialModelState::tau() const
159  {
160  return pimpl->tau;
161  }
162 
163 const MatrixXd& PartialModelState::getInertiaMatrix() const
164 {
165  throw std::runtime_error("[PartialModelState::getInertiaMatrix] Not Implemented");
166 
167 // switch(whichPart())
168 // {
169 // case FREE_FLYER:
170 // pimpl->M = getModel().getInertiaMatrix().block(0, 0, getSize(), getSize());
171 // return pimpl->M;
172 // break;
173 // case INTERNAL:
174 // pimpl->M = getModel().getInertiaMatrix().block(getModel().nbDofs()-getSize(), getModel().nbDofs()-getSize(), getSize(), getSize());
175 // return pimpl->M;
176 // break;
177 // default:
178 // return getModel().getInertiaMatrix();
179 // }
180 }
181 
183 {
184  throw std::runtime_error("[PartialModelState::getInertiaMatrixInverse] Not Implemented");
185 
186 // switch(whichPart())
187 // {
188 // case FREE_FLYER:
189 // pimpl->Minv = getModel().getInertiaMatrixInverse().block(0, 0, getSize(), getSize());
190 // return pimpl->Minv;
191 // break;
192 // case INTERNAL:
193 // pimpl->Minv = getModel().getInertiaMatrixInverse().block(getModel().nbDofs()-getSize(), getModel().nbDofs()-getSize(), getSize(), getSize());
194 // return pimpl->Minv;
195 // break;
196 // default:
197 // return getModel().getInertiaMatrixInverse();
198 // }
199 }
200 
201 
202 //====================================================================
203 
205 {
206  Eigen::MatrixXd M;
207  Eigen::MatrixXd Minv;
208  Eigen::VectorXd tau;
209  Eigen::VectorXd q;
210  Eigen::VectorXd qdot;
211  Eigen::VectorXd qddot;
212 };
213 
214 
215 
216 PartialTargetState::PartialTargetState(const std::string& name, const Model& model, const Eigen::VectorXi& selectedDofs, int whichPart)
217  : PartialState(name, model, selectedDofs, whichPart)
218  , pimpl( new Pimpl )
219 {
220  pimpl->tau = VectorXd::Zero(getSize());
221  pimpl->q = VectorXd::Zero(getSize());
222  pimpl->qdot = VectorXd::Zero(getSize());
223  pimpl->qddot = VectorXd::Zero(getSize());
224 }
225 
227 {
228 
229 }
230 
231 const Eigen::VectorXd& PartialTargetState::q() const
232 {
233  return pimpl->q;
234 }
235 
236 const Eigen::VectorXd& PartialTargetState::qdot() const
237 {
238  return pimpl->qdot;
239 }
240 
241  const Eigen::VectorXd& PartialTargetState::qddot() const
242  {
243  return pimpl->qddot;
244  }
245 
246  const Eigen::VectorXd& PartialTargetState::tau() const
247  {
248  return pimpl->tau;
249  }
250 
252 {
253  throw std::runtime_error("[PartialModelState::getInertiaMatrix] Not Implemented");
254 }
255 
257 {
258  throw std::runtime_error("[PartialModelState::getInertiaMatrixInverse] Not Implemented");
259 }
260 
261 
262 void PartialTargetState::set_q(const Eigen::VectorXd& q)
263 {
264  pimpl->q = q;
265 }
266 
267 void PartialTargetState::set_qdot(const Eigen::VectorXd& qdot)
268 {
269  pimpl->qdot = qdot;
270 }
271 
272 void PartialTargetState::set_qddot(const Eigen::VectorXd& qddot)
273 {
274  pimpl->qddot = qddot;
275 }
276 
277 void PartialTargetState::set_tau(const Eigen::VectorXd& tau)
278 {
279  pimpl->tau = tau;
280 }
281 
282 
283 
284 
285 } // end namespace ocra
Eigen::VectorXi & getDofs() const
const VectorXd & getValue() const
Definition: Variable.cpp:94
virtual const Eigen::VectorXd & qdot() const
void set_tau(const Eigen::VectorXd &tau)
virtual const Eigen::VectorXd & qddot() const
virtual const Eigen::VectorXd & tau() const
virtual const Eigen::VectorXd & qdot() const
PartialTargetState(const std::string &name, const Model &model, const Eigen::VectorXi &selectedDofs, int whichPart)
Define partial state classes that can be used to control some joints of the robot.
Model class.
Definition: Model.h:38
const Model & getModel() const
Optimization-based Robot Controller namespace. a library of classes to write and solve optimization p...
Variable & getConfigurationVariable() const
Definition: Model.cpp:123
const Eigen::MatrixXd & getJacobian() const
virtual const Eigen::MatrixXd & getInertiaMatrixInverse() const
A abstract partial state.
Definition: PartialState.h:33
virtual const Eigen::VectorXd & q() const
virtual const Eigen::MatrixXd & getInertiaMatrixInverse() const
PartialState(const std::string &name, const Model &model, const Eigen::VectorXi &selectedDofs, int whichPart)
void set_q(const Eigen::VectorXd &q)
int nbDofs() const
Definition: Model.cpp:54
virtual const Eigen::MatrixXd & getInertiaMatrix() const
PartialModelState(const std::string &name, const Model &model, const Eigen::VectorXi &selectedDofs, int whichPart)
virtual const Eigen::VectorXd & q() const
void set_qddot(const Eigen::VectorXd &qddot)
bool hasFixedRoot() const
Definition: Model.cpp:67
void set_qdot(const Eigen::VectorXd &qdot)
virtual const Eigen::MatrixXd & getInertiaMatrix() const
virtual ~PartialState()=0
virtual const Eigen::VectorXd & tau() const
Pimpl(const Model &m, const Eigen::VectorXi &selectedDofs, int whichPart)
int getSize() const
virtual const Eigen::VectorXd & qddot() const
Variable & getVelocityVariable() const
Definition: Model.cpp:128