YARP
Yet Another Robot Platform
FakeMotor.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2006-2020 Istituto Italiano di Tecnologia (IIT)
3  * Copyright (C) 2006-2010 RobotCub Consortium
4  * All rights reserved.
5  *
6  * This software may be modified and distributed under the terms of the
7  * BSD-3-Clause license. See the accompanying LICENSE file for details.
8  */
9 
10 #ifndef YARP_FAKEMOTOR_FAKEMOTOR_H
11 #define YARP_FAKEMOTOR_FAKEMOTOR_H
12 
13 #include <cstdio>
14 
16 #include <yarp/dev/Drivers.h>
17 #include <yarp/dev/PolyDriver.h>
18 
19 #include <yarp/os/Time.h>
20 #include <yarp/os/Log.h>
21 #include <yarp/os/LogComponent.h>
22 #include <yarp/sig/Vector.h>
23 
25 
26 
32 class FakeMotor :
33  public yarp::dev::DeviceDriver,
34  public yarp::dev::IPositionControl,
35  public yarp::dev::IEncodersTimed,
36  public yarp::dev::IVelocityControl
37 {
38 private:
39  int njoints{1};
41  yarp::sig::Vector speed;
44  double delay{0};
45  double last{-1};
46  bool posMode{true};
47 
48  void update();
49 
50 public:
51  FakeMotor() = default;
52  FakeMotor(const FakeMotor&) = delete;
53  FakeMotor(FakeMotor&&) = delete;
54  FakeMotor& operator=(const FakeMotor&) = delete;
56  ~FakeMotor() override = default;
57 
58  bool getAxes(int *ax) override
59  {
60  *ax = njoints;
61  yCInfo(FAKEMOTOR, "FakeMotor reporting %d axes present", *ax);
62  return true;
63  }
64 
65  bool open(yarp::os::Searchable& config) override
66  {
67  njoints = config.check("axes",yarp::os::Value(4),"number of axes to pretend to have").asInt32();
68  pos.resize(njoints);
69  speed.resize(njoints);
70  acc.resize(njoints);
71  vel.resize(njoints);
72  for (int i=0; i<njoints; i++) {
73  pos[i] = 0;
74  speed[i] = 0;
75  acc[i] = 0;
76  vel[i] = 0;
77  }
78 
79  delay=config.check("delay",yarp::os::Value(0), "delay in each call for debugging purpose, in ms").asInt32();
80  return true;
81  }
82 
83 
84  bool positionMove(int j, double ref) override
85  {
86  posMode = true;
87  if (j<njoints) {
88  pos[j] = ref;
89  }
90  return true;
91  }
92 
93 
94  bool positionMove(const double *refs) override
95  {
96  posMode = true;
97  for (int i=0; i<njoints; i++) {
98  pos[i] = refs[i];
99  }
100  return true;
101  }
102 
103 
104  bool relativeMove(int j, double delta) override
105  {
106  posMode = true;
107  if (j<njoints) {
108  pos[j] += delta;
109  }
110  return true;
111  }
112 
113 
114  bool relativeMove(const double *deltas) override
115  {
116  posMode = true;
117  for (int i=0; i<njoints; i++) {
118  pos[i] += deltas[i];
119  }
120  return true;
121  }
122 
123 
124  bool checkMotionDone(int j, bool *flag) override
125  {
127  return true;
128  }
129 
130 
131  bool checkMotionDone(bool *flag) override
132  {
133  return true;
134  }
135 
136 
137  bool setRefSpeed(int j, double sp) override
138  {
139  if (j<njoints) {
140  speed[j] = sp;
141  }
142  return true;
143  }
144 
145 
146  bool setRefSpeeds(const double *spds) override
147  {
148  for (int i=0; i<njoints; i++) {
149  speed[i] = spds[i];
150  }
151  return true;
152  }
153 
154 
155  bool setRefAcceleration(int j, double acc) override
156  {
157  if (j<njoints) {
158  this->acc[j] = acc;
159  }
160  return true;
161  }
162 
163 
164  bool setRefAccelerations(const double *accs) override
165  {
166  for (int i=0; i<njoints; i++) {
167  acc[i] = accs[i];
168  }
169  return true;
170  }
171 
172 
173  bool getRefSpeed(int j, double *ref) override
174  {
175  if (j<njoints) {
176  (*ref) = speed[j];
177  }
178  return true;
179  }
180 
181 
182  bool getRefSpeeds(double *spds) override
183  {
184  for (int i=0; i<njoints; i++) {
185  spds[i] = speed[i];
186  }
187  return true;
188  }
189 
190 
191  bool getRefAcceleration(int j, double *acc) override
192  {
193  if (j<njoints) {
194  (*acc) = this->acc[j];
195  }
196  return true;
197  }
198 
199 
200  bool getRefAccelerations(double *accs) override
201  {
202  for (int i=0; i<njoints; i++) {
203  accs[i] = acc[i];
204  }
205  return true;
206  }
207 
208 
209  bool stop(int j) override
210  {
211  return true;
212  }
213 
214 
215  bool stop() override
216  {
217  return true;
218  }
219 
220  bool positionMove(const int n_joint, const int *joints, const double *refs) override
221  {
222  return false;
223  }
224 
225  bool relativeMove(const int n_joint, const int *joints, const double *deltas) override
226  {
227  return false;
228  }
229 
230  bool checkMotionDone(const int n_joint, const int *joints, bool *flags) override
231  {
232  return false;
233  }
234 
235  bool setRefSpeeds(const int n_joint, const int *joints, const double *spds) override
236  {
237  return false;
238  }
239 
240  bool setRefAccelerations(const int n_joint, const int *joints, const double *accs) override
241  {
242  return false;
243  }
244 
245  bool getRefSpeeds(const int n_joint, const int *joints, double *spds) override
246  {
247  return false;
248  }
249 
250  bool getRefAccelerations(const int n_joint, const int *joints, double *accs) override
251  {
252  return false;
253  }
254 
255  bool stop(const int n_joint, const int *joints) override
256  {
257  return false;
258  }
259 
260  bool getTargetPosition(const int joint, double *ref) override
261  {
262  return false;
263  }
264 
265  bool getTargetPositions(double *refs) override
266  {
267  return false;
268  }
269 
270  bool getTargetPositions(const int n_joint, const int *joints, double *refs) override
271  {
272  return false;
273  }
274 
275  bool velocityMove(const int n_joint, const int *joints, const double *spds) override
276  {
277  return false;
278  }
279 
280  bool close() override
281  {
282  return true;
283  }
284 
285  bool resetEncoder(int j) override
286  {
287  if (j<njoints) {
288  pos[j] = 0;
289  }
290  return true;
291  }
292 
293  bool resetEncoders() override
294  {
295  for (int i=0; i<njoints; i++) {
296  pos[i] = 0;
297  }
298  last = yarp::os::Time::now();
299  return true;
300  }
301 
302  bool setEncoder(int j, double val) override
303  {
304  if (j<njoints) {
305  pos[j] = val;
306  }
307  last = yarp::os::Time::now(); // not quite right, but ok for test
308  return true;
309  }
310 
311  bool setEncoders(const double *vals) override
312  {
313  for (int i=0; i<njoints; i++) {
314  pos[i] = vals[i];
315  }
316  last = yarp::os::Time::now();
317  return true;
318  }
319 
320  bool getEncoder(int j, double *v) override
321  {
322  update();
323  if (j<njoints) {
324  (*v) = pos[j];
325  }
326  return true;
327  }
328 
329  bool getEncoders(double *encs) override
330  {
331  update();
332  for (int i=0; i<njoints; i++) {
333  encs[i] = pos[i];
334  }
335  return true;
336  }
337 
338 
339  bool getEncoderTimed(int j, double *encs, double *time) override
340  {
341  bool ret = getEncoder(j, encs);
342  *time = yarp::os::Time::now();
343  return ret;
344  }
345 
346  bool getEncodersTimed(double *encs, double *time) override
347  {
348  for (int i=0; i<njoints; i++)
349  {
350  getEncoderTimed(i, &encs[i], &time[i]);
351  }
352  return true;
353  }
354 
355  bool getEncoderSpeed(int j, double *sp) override
356  {
357  if (j<njoints) {
358  (*sp) = 0;
359  }
360  return true;
361  }
362 
363  bool getEncoderSpeeds(double *spds) override
364  {
365  for (int i=0; i<njoints; i++) {
366  spds[i] = 0;
367  }
368  return true;
369  }
370 
371  bool getEncoderAcceleration(int j, double *spds) override
372  {
373  if (j<njoints) {
374  (*spds) = 0;
375  }
376  return true;
377  }
378 
379  bool getEncoderAccelerations(double *accs) override
380  {
381  for (int i=0; i<njoints; i++) {
382  accs[i] = 0;
383  }
384  return true;
385  }
386 
387  bool velocityMove(int j, double sp) override
388  {
389  posMode = false;
390  if (j<njoints) {
391  vel[j] = sp;
392  }
393  return true;
394  }
395 
396  bool velocityMove(const double *sp) override
397  {
398  posMode = false;
399  for (int i=0; i<njoints; i++) {
400  vel[i] = sp[i];
401  }
402  return true;
403  }
404 
405 };
406 
407 
408 class TestMotor : public FakeMotor
409 {
410 public:
411  bool open(yarp::os::Searchable& config) override;
412 };
413 
414 
415 #endif // YARP_FAKEMOTOR_FAKEMOTOR_H
define control board standard interfaces
const yarp::os::LogComponent & FAKEMOTOR()
Definition: FakeMotor.cpp:12
bool ret
contains the definition of a Vector type
A fake motor control board for testing.
Definition: FakeMotor.h:37
bool checkMotionDone(bool *flag) override
Check if the current trajectory is terminated.
Definition: FakeMotor.h:131
FakeMotor(const FakeMotor &)=delete
bool setEncoders(const double *vals) override
Set the value of all encoders.
Definition: FakeMotor.h:311
bool setRefAccelerations(const double *accs) override
Set reference acceleration on all joints.
Definition: FakeMotor.h:164
bool setEncoder(int j, double val) override
Set the value of the encoder for a given joint.
Definition: FakeMotor.h:302
bool positionMove(int j, double ref) override
Set new reference point for a single axis.
Definition: FakeMotor.h:84
bool getRefSpeeds(const int n_joint, const int *joints, double *spds) override
Get reference speed of all joints.
Definition: FakeMotor.h:245
bool setRefAccelerations(const int n_joint, const int *joints, const double *accs) override
Set reference acceleration on all joints.
Definition: FakeMotor.h:240
~FakeMotor() override=default
bool relativeMove(const int n_joint, const int *joints, const double *deltas) override
Set relative position for a subset of joints.
Definition: FakeMotor.h:225
bool stop(int j) override
Stop motion, single joint.
Definition: FakeMotor.h:209
bool velocityMove(const int n_joint, const int *joints, const double *spds) override
Start motion at a given speed for a subset of joints.
Definition: FakeMotor.h:275
bool getEncodersTimed(double *encs, double *time) override
Read the instantaneous acceleration of all axes.
Definition: FakeMotor.h:346
bool setRefSpeeds(const double *spds) override
Set reference speed on all joints.
Definition: FakeMotor.h:146
bool resetEncoders() override
Reset encoders.
Definition: FakeMotor.h:293
bool getRefAccelerations(double *accs) override
Get reference acceleration of all joints.
Definition: FakeMotor.h:200
bool getEncoder(int j, double *v) override
Read the value of an encoder.
Definition: FakeMotor.h:320
bool getRefSpeeds(double *spds) override
Get reference speed of all joints.
Definition: FakeMotor.h:182
bool getEncoderAcceleration(int j, double *spds) override
Read the instantaneous acceleration of an axis.
Definition: FakeMotor.h:371
bool setRefAcceleration(int j, double acc) override
Set reference acceleration for a joint.
Definition: FakeMotor.h:155
bool setRefSpeeds(const int n_joint, const int *joints, const double *spds) override
Set reference speed on all joints.
Definition: FakeMotor.h:235
bool getTargetPositions(double *refs) override
Get the last position reference for all axes.
Definition: FakeMotor.h:265
bool setRefSpeed(int j, double sp) override
Set reference speed for a joint, this is the speed used during the interpolation of the trajectory.
Definition: FakeMotor.h:137
bool getEncoderSpeed(int j, double *sp) override
Read the istantaneous speed of an axis.
Definition: FakeMotor.h:355
bool relativeMove(int j, double delta) override
Set relative position.
Definition: FakeMotor.h:104
FakeMotor & operator=(const FakeMotor &)=delete
FakeMotor & operator=(FakeMotor &&)=delete
bool getRefAcceleration(int j, double *acc) override
Get reference acceleration for a joint.
Definition: FakeMotor.h:191
bool checkMotionDone(const int n_joint, const int *joints, bool *flags) override
Check if the current trajectory is terminated.
Definition: FakeMotor.h:230
bool checkMotionDone(int j, bool *flag) override
Check if the current trajectory is terminated.
Definition: FakeMotor.h:124
bool getAxes(int *ax) override
Get the number of controlled axes.
Definition: FakeMotor.h:58
bool stop() override
Stop motion, multiple joints.
Definition: FakeMotor.h:215
FakeMotor(FakeMotor &&)=delete
bool getTargetPosition(const int joint, double *ref) override
Get the last position reference for the specified axis.
Definition: FakeMotor.h:260
bool positionMove(const int n_joint, const int *joints, const double *refs) override
Set new reference point for a subset of joints.
Definition: FakeMotor.h:220
bool getEncoderAccelerations(double *accs) override
Read the instantaneous acceleration of all axes.
Definition: FakeMotor.h:379
bool open(yarp::os::Searchable &config) override
Open the DeviceDriver.
Definition: FakeMotor.h:65
FakeMotor()=default
bool velocityMove(int j, double sp) override
Start motion at a given speed, single joint.
Definition: FakeMotor.h:387
bool getRefAccelerations(const int n_joint, const int *joints, double *accs) override
Get reference acceleration for a joint.
Definition: FakeMotor.h:250
bool positionMove(const double *refs) override
Set new reference point for all axes.
Definition: FakeMotor.h:94
bool velocityMove(const double *sp) override
Start motion at a given speed, multiple joints.
Definition: FakeMotor.h:396
bool getEncoderTimed(int j, double *encs, double *time) override
Read the instantaneous acceleration of all axes.
Definition: FakeMotor.h:339
bool getTargetPositions(const int n_joint, const int *joints, double *refs) override
Get the last position reference for the specified group of axes.
Definition: FakeMotor.h:270
bool getRefSpeed(int j, double *ref) override
Get reference speed for a joint.
Definition: FakeMotor.h:173
bool stop(const int n_joint, const int *joints) override
Stop motion for subset of joints.
Definition: FakeMotor.h:255
bool resetEncoder(int j) override
Reset encoder, single joint.
Definition: FakeMotor.h:285
bool getEncoderSpeeds(double *spds) override
Read the instantaneous speed of all axes.
Definition: FakeMotor.h:363
bool getEncoders(double *encs) override
Read the position of all axes.
Definition: FakeMotor.h:329
bool relativeMove(const double *deltas) override
Set relative position, all joints.
Definition: FakeMotor.h:114
bool close() override
Close the DeviceDriver.
Definition: FakeMotor.h:280
bool open(yarp::os::Searchable &config) override
Open the DeviceDriver.
Definition: FakeMotor.cpp:32
A base class for nested structures that can be searched.
Definition: Searchable.h:69
virtual bool check(const std::string &key) const =0
Check if there exists a property of the given name.
A single value (typically within a Bottle).
Definition: Value.h:47
void resize(size_t size) override
Resize the vector.
Definition: Vector.h:254
#define yCInfo(component,...)
Definition: LogComponent.h:135
#define YARP_DECLARE_LOG_COMPONENT(name)
Definition: LogComponent.h:77
double now()
Return the current time in seconds, relative to an arbitrary starting point.
Definition: Time.cpp:124
void delay(double seconds)
Wait for a certain number of seconds.
Definition: Time.cpp:114
The main, catch-all namespace for YARP.
Definition: environment.h:18