ocra-recipes
Doxygen documentation for the ocra-recipes repository
ControlFrame.cpp
Go to the documentation of this file.
2 
3 #include "ocra/control/Model.h"
4 #include <iostream>
5 
6 namespace ocra
7 {
8  // --- ABSTRACT -----------------------------------------------
9 
10  ControlFrame::ControlFrame(const std::string& name)
11  : NamedInstance(name)
12  {
13  }
14 
16  {
17  }
18 
19 
20  // --- EXTERNAL INPUT -----------------------------------------
21 
23  {
24  const Model& model;
25  Eigen::Displacementd H;
26  Eigen::Twistd T;
27  Eigen::Twistd gamma;
28  Eigen::Wrenchd W;
30 
31  Pimpl(const Model& m)
32  : model(m)
33  , H(Displacementd::Identity())
34  , T(Twistd::Zero())
35  , gamma(Twistd::Zero())
36  , W(Wrenchd::Zero())
37  , J(MatrixXd::Zero(6, m.nbDofs()))
38  {}
39  };
40 
41  TargetFrame::TargetFrame(const std::string& name, const Model& model)
42  : ControlFrame(name)
43  , pimpl(new Pimpl(model))
44  {
45  }
46 
47  Eigen::Displacementd TargetFrame::getPosition() const
48  {
49  return pimpl->H;
50  }
51 
52  Eigen::Twistd TargetFrame::getVelocity() const
53  {
54  return pimpl->T;
55  }
56 
57  Eigen::Twistd TargetFrame::getAcceleration() const
58  {
59  return pimpl->gamma;
60  }
61 
62  Eigen::Wrenchd TargetFrame::getWrench() const
63  {
64  return pimpl->W;
65  }
66 
68  {
69  return pimpl->J;
70  }
71 
73  {
74  return false;
75  }
76 
78  {
79  return pimpl->model;
80  }
81 
82  void TargetFrame::setPosition(const Eigen::Displacementd& H)
83  {
84  pimpl->H = H;
85  }
86 
87  void TargetFrame::setVelocity(const Eigen::Twistd& T)
88  {
89  pimpl->T = T;
90  }
91 
92  void TargetFrame::setAcceleration(const Eigen::Twistd& gamma)
93  {
94  pimpl->gamma = gamma;
95  }
96 
97  void TargetFrame::setWrench(const Eigen::Wrenchd& W)
98  {
99  pimpl->W = W;
100  }
101 
102 
103  // --- ATTACHED TO A SEGMENT ----------------------------------
104 
106  {
107  const Model& model;
108  int index;
109  Eigen::Displacementd H_localFrame;
110  MatrixXd Adj_H_segment_in_controlledFrame; // TODO [minor]: fixed size matrix
111 
112  Pimpl(const Model& m, const std::string& segname)
113  : model(m)
114  , index(model.getSegmentIndex(segname))
115  , H_localFrame(Displacementd::Identity())
116  , Adj_H_segment_in_controlledFrame(MatrixXd::Identity(6, 6))
117  {}
118 
119  Pimpl(const Model& m, const std::string& segname, const Eigen::Displacementd& H_local)
120  : model(m)
121  , index(model.getSegmentIndex(segname))
122  , H_localFrame(H_local)
123  , Adj_H_segment_in_controlledFrame(H_local.inverse().adjoint())
124  {}
125 
126  Pimpl(const Model& m, int segmentId)
127  : model(m)
128  , index(segmentId)
129  , H_localFrame(Displacementd::Identity())
130  , Adj_H_segment_in_controlledFrame(MatrixXd::Identity(6, 6))
131  {}
132 
133  Pimpl(const Model& m, int segmentId, const Eigen::Displacementd& H_local)
134  : model(m)
135  , index(segmentId)
136  , H_localFrame(H_local)
137  , Adj_H_segment_in_controlledFrame(H_local.inverse().adjoint())
138  {}
139  };
140 
141  SegmentFrame::SegmentFrame(const std::string& name, const Model& model, const std::string& segname)
142  : ControlFrame(name)
143  , pimpl(new Pimpl(model, segname))
144  {
145  }
146 
147  SegmentFrame::SegmentFrame(const std::string& name, const Model& model, const std::string& segname, const Eigen::Displacementd& H_local)
148  : ControlFrame(name)
149  , pimpl(new Pimpl(model, segname, H_local))
150  {
151  }
152 
153  SegmentFrame::SegmentFrame(const std::string& name, const Model& model, int segmentId)
154  : ControlFrame(name)
155  , pimpl(new Pimpl(model, segmentId))
156  {
157  }
158 
159  SegmentFrame::SegmentFrame(const std::string& name, const Model& model, int segmentId, const Eigen::Displacementd& H_local)
160  : ControlFrame(name)
161  , pimpl(new Pimpl(model, segmentId, H_local))
162  {
163  }
164 
165  Eigen::Displacementd SegmentFrame::getPosition() const
166  {
167  return pimpl->model.getSegmentPosition(pimpl->index) * pimpl->H_localFrame;
168  }
169 
170  Eigen::Twistd SegmentFrame::getVelocity() const
171  {
172  return pimpl->Adj_H_segment_in_controlledFrame * pimpl->model.getSegmentVelocity(pimpl->index);
173  }
174 
175  Eigen::Twistd SegmentFrame::getAcceleration() const
176  {
177  return Eigen::Twistd::Zero();
178  }
179 
180  Eigen::Wrenchd SegmentFrame::getWrench() const
181  {
182  return Eigen::Wrenchd::Zero();
183  }
184 
186  {
187  return pimpl->Adj_H_segment_in_controlledFrame * pimpl->model.getSegmentJacobian(pimpl->index);
188  }
189 
191  {
192  return true;
193  }
194 
196  {
197  return pimpl->model;
198  }
199 
201  {
202  return pimpl->index;
203  }
204 
205 
206  // --- ATTACHED TO THE COM ------------------------------------
207 
209  {
210  const Model& model;
211 
212  Pimpl(const Model& m): model(m) {}
213  };
214 
215  CoMFrame::CoMFrame(const std::string& name, const Model& model)
216  : ControlFrame(name)
217  , pimpl(new Pimpl(model))
218  {
219  }
220 
221  Eigen::Displacementd CoMFrame::getPosition() const
222  {
223  Eigen::Vector3d tmp = pimpl->model.getCoMPosition();
224  return Eigen::Displacementd(tmp, Quaterniond::Identity());
225  }
226 
227  Eigen::Twistd CoMFrame::getVelocity() const
228  {
229  return Eigen::Twistd(Twistd::AngularVelocity(0., 0., 0.), pimpl->model.getCoMVelocity());
230  }
231 
232  Eigen::Twistd CoMFrame::getAcceleration() const
233  {
234  return Eigen::Twistd::Zero();
235  }
236 
237  Eigen::Wrenchd CoMFrame::getWrench() const
238  {
239  return Eigen::Wrenchd::Zero();
240  }
241 
243  {
244  Jacobian6d result(6, pimpl->model.nbDofs());
245  result.setZero();
246  result.block(3, 0, 3, pimpl->model.nbDofs()) = pimpl->model.getCoMJacobian();
247  return result;
248  }
249 
251  {
252  return true;
253  }
254 
255  const Model& CoMFrame::getModel() const
256  {
257  return pimpl->model;
258  }
259 }
260 
261 // cmake:sourcegroup=Api
Eigen::Wrenchd getWrench() const
Classes that represent frames.
virtual ~ControlFrame()=0
Eigen::Twistd getAcceleration() const
Eigen::Matrix< double, 6, Eigen::Dynamic > Jacobian6d
Definition: MathTypes.h:39
bool dependsOnModelConfiguration() const
Declaration file of the Model class.
Pimpl(const Model &m, const std::string &segname, const Eigen::Displacementd &H_local)
bool dependsOnModelConfiguration() const
Eigen::Twistd getVelocity() const
Eigen::Matrix< double, 6, Eigen::Dynamic > getJacobian() const
TargetFrame(const std::string &name, const Model &model)
Model class.
Definition: Model.h:38
Eigen::Displacementd getPosition() const
Eigen::Matrix< double, 6, Eigen::Dynamic > getJacobian() const
Eigen::Matrix< double, 6, Eigen::Dynamic > getJacobian() const
Optimization-based Robot Controller namespace. a library of classes to write and solve optimization p...
Eigen::Wrenchd getWrench() const
Eigen::Wrenchd getWrench() const
Eigen::Displacementd getPosition() const
void setWrench(const Eigen::Wrenchd &W)
SegmentFrame(const std::string &name, const Model &model, const std::string &segname)
void setPosition(const Eigen::Displacementd &H)
Eigen::Displacementd H_localFrame
Eigen::Twistd getVelocity() const
MatrixXd Adj_H_segment_in_controlledFrame
Pimpl(const Model &m, int segmentId)
void setAcceleration(const Eigen::Twistd &gamma)
Eigen::Twistd getAcceleration() const
bool dependsOnModelConfiguration() const
Pimpl(const Model &m, int segmentId, const Eigen::Displacementd &H_local)
void setVelocity(const Eigen::Twistd &T)
Eigen::Displacementd getPosition() const
Eigen::Displacementd H
Pimpl(const Model &m, const std::string &segname)
ControlFrame(const std::string &name)
CoMFrame(const std::string &name, const Model &model)
const Model & getModel() const
const Model & getModel() const
int getSegmentIndex() const
const Model & getModel() const
Eigen::Twistd getVelocity() const
Eigen::Twistd getAcceleration() const
Pimpl(const Model &m)
Generic representation of a frame: gives access to its position, velocity, jacobian...
Definition: ControlFrame.h:43