YARP
Yet Another Robot Platform
ControlBoardWrapperPidControl.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2006-2020 Istituto Italiano di Tecnologia (IIT)
3  * All rights reserved.
4  *
5  * This software may be modified and distributed under the terms of the
6  * BSD-3-Clause license. See the accompanying LICENSE file for details.
7  */
8 
10 
12 
13 using yarp::dev::Pid;
15 
16 
17 bool ControlBoardWrapperPidControl::setPid(const PidControlTypeEnum& pidtype, int j, const Pid& p)
18 {
19  size_t off;
20  try {
21  off = device.lut.at(j).offset;
22  } catch (...) {
24  "Joint number %d out of bound [0-%zu] for part %s",
25  j,
27  partName.c_str());
28  return false;
29  }
30  size_t subIndex = device.lut[j].deviceEntry;
31 
32  SubDevice* s = device.getSubdevice(subIndex);
33  if (!s) {
34  return false;
35  }
36 
37  if (s->pid) {
38  return s->pid->setPid(pidtype, static_cast<int>(off + s->base), p);
39  }
40  return false;
41 }
42 
43 
45 {
46  bool ret = true;
47 
48  for (size_t l = 0; l < controlledJoints; l++) {
49  int off = device.lut[l].offset;
50  size_t subIndex = device.lut[l].deviceEntry;
51 
52  SubDevice* p = device.getSubdevice(subIndex);
53  if (!p) {
54  return false;
55  }
56 
57  if (p->pid) {
58  ret = ret && p->pid->setPid(pidtype, static_cast<int>(off + p->base), ps[l]);
59  } else {
60  ret = false;
61  }
62  }
63  return ret;
64 }
65 
66 
68 {
69  size_t off;
70  try {
71  off = device.lut.at(j).offset;
72  } catch (...) {
74  "Joint number %d out of bound [0-%zu] for part %s",
75  j,
77  partName.c_str());
78  return false;
79  }
80  size_t subIndex = device.lut[j].deviceEntry;
81 
82  SubDevice* p = device.getSubdevice(subIndex);
83  if (!p) {
84  return false;
85  }
86 
87  if (p->pid) {
88  return p->pid->setPidReference(pidtype, static_cast<int>(off + p->base), ref);
89  }
90  return false;
91 }
92 
93 
95 {
96  bool ret = true;
97 
98  for (size_t l = 0; l < controlledJoints; l++) {
99  int off = device.lut[l].offset;
100  size_t subIndex = device.lut[l].deviceEntry;
101 
102  SubDevice* p = device.getSubdevice(subIndex);
103  if (!p) {
104  return false;
105  }
106 
107  if (p->pid) {
108  ret = ret && p->pid->setPidReference(pidtype, static_cast<int>(off + p->base), refs[l]);
109  } else {
110  ret = false;
111  }
112  }
113  return ret;
114 }
115 
116 
118 {
119  size_t off;
120  try {
121  off = device.lut.at(j).offset;
122  } catch (...) {
123  yCError(CONTROLBOARDWRAPPER, "Joint number %d out of bound [0-%zu] for part %s", j, controlledJoints, partName.c_str());
124  return false;
125  }
126  size_t subIndex = device.lut[j].deviceEntry;
127 
128  SubDevice* p = device.getSubdevice(subIndex);
129  if (!p) {
130  return false;
131  }
132 
133  if (p->pid) {
134  return p->pid->setPidErrorLimit(pidtype, static_cast<int>(off + p->base), limit);
135  }
136  return false;
137 }
138 
139 
141 {
142  bool ret = true;
143 
144  for (size_t l = 0; l < controlledJoints; l++) {
145  int off = device.lut[l].offset;
146  size_t subIndex = device.lut[l].deviceEntry;
147 
148  SubDevice* p = device.getSubdevice(subIndex);
149  if (!p) {
150  return false;
151  }
152 
153  if (p->pid) {
154  ret = ret && p->pid->setPidErrorLimit(pidtype, static_cast<int>(off + p->base), limits[l]);
155  } else {
156  ret = false;
157  }
158  }
159  return ret;
160 }
161 
162 
163 bool ControlBoardWrapperPidControl::getPidError(const PidControlTypeEnum& pidtype, int j, double* err)
164 {
165  size_t off;
166  try {
167  off = device.lut.at(j).offset;
168  } catch (...) {
169  yCError(CONTROLBOARDWRAPPER, "Joint number %d out of bound [0-%zu] for part %s", j, controlledJoints, partName.c_str());
170  return false;
171  }
172  size_t subIndex = device.lut[j].deviceEntry;
173 
174  SubDevice* p = device.getSubdevice(subIndex);
175  if (!p) {
176  return false;
177  }
178 
179  if (p->pid) {
180  return p->pid->getPidError(pidtype, static_cast<int>(off + p->base), err);
181  }
182  *err = 0.0;
183  return false;
184 }
185 
186 
188 {
189  auto* errors = new double[device.maxNumOfJointsInDevices];
190 
191  bool ret = true;
192  for (size_t d = 0; d < device.subdevices.size(); d++) {
193  SubDevice* p = device.getSubdevice(d);
194  if (!p) {
195  ret = false;
196  break;
197  }
198  if ((p->pid) && (ret = p->pid->getPidErrors(pidtype, errors))) {
199  for (size_t juser = p->wbase, jdevice = p->base; juser <= p->wtop; juser++, jdevice++) {
200  errs[juser] = errors[jdevice];
201  }
202  } else {
203  printError("getPidErrors", p->id, ret);
204  ret = false;
205  break;
206  }
207  }
208 
209  delete[] errors;
210  return ret;
211 }
212 
213 
214 bool ControlBoardWrapperPidControl::getPidOutput(const PidControlTypeEnum& pidtype, int j, double* out)
215 {
216  size_t off;
217  try {
218  off = device.lut.at(j).offset;
219  } catch (...) {
220  yCError(CONTROLBOARDWRAPPER, "Joint number %d out of bound [0-%zu] for part %s", j, controlledJoints, partName.c_str());
221  return false;
222  }
223  size_t subIndex = device.lut[j].deviceEntry;
224 
225  SubDevice* p = device.getSubdevice(subIndex);
226  if (!p) {
227  return false;
228  }
229 
230  if (p->pid) {
231  return p->pid->getPidOutput(pidtype, static_cast<int>(off + p->base), out);
232  }
233  *out = 0.0;
234  return false;
235 }
236 
237 
239 {
240  auto* outputs = new double[device.maxNumOfJointsInDevices];
241  bool ret = true;
242  for (size_t d = 0; d < device.subdevices.size(); d++) {
243  SubDevice* p = device.getSubdevice(d);
244  if (!p) {
245  ret = false;
246  break;
247  }
248 
249  if ((p->pid) && (ret = p->pid->getPidOutputs(pidtype, outputs))) {
250  for (size_t juser = p->wbase, jdevice = p->base; juser <= p->wtop; juser++, jdevice++) {
251  outs[juser] = outputs[jdevice];
252  }
253  } else {
254  printError("getPidOutouts", p->id, ret);
255  ret = false;
256  break;
257  }
258  }
259 
260  delete[] outputs;
261  return ret;
262 }
263 
264 
266 {
267  size_t off;
268  try {
269  off = device.lut.at(j).offset;
270  } catch (...) {
271  yCError(CONTROLBOARDWRAPPER, "Joint number %d out of bound [0-%zu] for part %s", j, controlledJoints, partName.c_str());
272  return false;
273  }
274  size_t subIndex = device.lut[j].deviceEntry;
275 
276  SubDevice* p = device.getSubdevice(subIndex);
277  if (!p) {
278  return false;
279  }
280 
281  if (p->pid) {
282  return p->pid->setPidOffset(pidtype, static_cast<int>(off + p->base), v);
283  }
284  return false;
285 }
286 
287 
289 {
290  //#warning "check for max number of joints!?!?!"
291  size_t off;
292  try {
293  off = device.lut.at(j).offset;
294  } catch (...) {
295  yCError(CONTROLBOARDWRAPPER, "Joint number %d out of bound [0-%zu] for part %s", j, controlledJoints, partName.c_str());
296  return false;
297  }
298  size_t subIndex = device.lut[j].deviceEntry;
299 
300  SubDevice* s = device.getSubdevice(subIndex);
301  if (!s) {
302  return false;
303  }
304 
305  if (s->pid) {
306  return s->pid->getPid(pidtype, static_cast<int>(off + s->base), p);
307  }
308  return false;
309 }
310 
311 
313 {
314  Pid* pids_device = new Pid[device.maxNumOfJointsInDevices];
315  bool ret = true;
316  for (size_t d = 0; d < device.subdevices.size(); d++) {
317  SubDevice* p = device.getSubdevice(d);
318  if (!p) {
319  ret = false;
320  break;
321  }
322 
323  if ((p->pid) && (ret = p->pid->getPids(pidtype, pids_device))) {
324  for (size_t juser = p->wbase, jdevice = p->base; juser <= p->wtop; juser++, jdevice++) {
325  pids[juser] = pids_device[jdevice];
326  }
327  } else {
328  printError("getPids", p->id, ret);
329  ret = false;
330  break;
331  }
332  }
333 
334  delete[] pids_device;
335  return ret;
336 }
337 
338 
340 {
341  size_t off;
342  try {
343  off = device.lut.at(j).offset;
344  } catch (...) {
345  yCError(CONTROLBOARDWRAPPER, "Joint number %d out of bound [0-%zu] for part %s", j, controlledJoints, partName.c_str());
346  return false;
347  }
348  size_t subIndex = device.lut[j].deviceEntry;
349 
350  SubDevice* p = device.getSubdevice(subIndex);
351  if (!p) {
352  return false;
353  }
354  if (p->pid) {
355  return p->pid->getPidReference(pidtype, static_cast<int>(off + p->base), ref);
356  }
357  return false;
358 }
359 
360 
362 {
363  auto* references = new double[device.maxNumOfJointsInDevices];
364  bool ret = true;
365  for (size_t d = 0; d < device.subdevices.size(); d++) {
366  SubDevice* p = device.getSubdevice(d);
367  if (!p) {
368  ret = false;
369  break;
370  }
371 
372  if ((p->pid) && (ret = p->pid->getPidReferences(pidtype, references))) {
373  for (size_t juser = p->wbase, jdevice = p->base; juser <= p->wtop; juser++, jdevice++) {
374  refs[juser] = references[jdevice];
375  }
376  } else {
377  printError("getPidReferences", p->id, ret);
378  ret = false;
379  break;
380  }
381  }
382 
383  delete[] references;
384  return ret;
385 }
386 
387 
388 bool ControlBoardWrapperPidControl::getPidErrorLimit(const PidControlTypeEnum& pidtype, int j, double* limit)
389 {
390  size_t off;
391  try {
392  off = device.lut.at(j).offset;
393  } catch (...) {
394  yCError(CONTROLBOARDWRAPPER, "Joint number %d out of bound [0-%zu] for part %s", j, controlledJoints, partName.c_str());
395  return false;
396  }
397  size_t subIndex = device.lut[j].deviceEntry;
398 
399  SubDevice* p = device.getSubdevice(subIndex);
400  if (!p) {
401  return false;
402  }
403 
404  if (p->pid) {
405  return p->pid->getPidErrorLimit(pidtype, static_cast<int>(off + p->base), limit);
406  }
407  return false;
408 }
409 
410 
412 {
413  auto* lims = new double[device.maxNumOfJointsInDevices];
414  bool ret = true;
415  for (size_t d = 0; d < device.subdevices.size(); d++) {
416  SubDevice* p = device.getSubdevice(d);
417  if (!p) {
418  ret = false;
419  break;
420  }
421 
422  if ((p->pid) && (ret = p->pid->getPidErrorLimits(pidtype, lims))) {
423  for (size_t juser = p->wbase, jdevice = p->base; juser <= p->wtop; juser++, jdevice++) {
424  limits[juser] = lims[jdevice];
425  }
426  } else {
427  printError("getPidErrorLimits", p->id, ret);
428  ret = false;
429  break;
430  }
431  }
432 
433  delete[] lims;
434  return ret;
435 }
436 
437 
439 {
440  size_t off;
441  try {
442  off = device.lut.at(j).offset;
443  } catch (...) {
444  yCError(CONTROLBOARDWRAPPER, "Joint number %d out of bound [0-%zu] for part %s", j, controlledJoints, partName.c_str());
445  return false;
446  }
447  size_t subIndex = device.lut[j].deviceEntry;
448 
449  SubDevice* p = device.getSubdevice(subIndex);
450  if (!p) {
451  return false;
452  }
453 
454  if (p->pid) {
455  return p->pid->resetPid(pidtype, static_cast<int>(off + p->base));
456  }
457  return false;
458 }
459 
460 
462 {
463  size_t off;
464  try {
465  off = device.lut.at(j).offset;
466  } catch (...) {
467  yCError(CONTROLBOARDWRAPPER, "Joint number %d out of bound [0-%zu] for part %s", j, controlledJoints, partName.c_str());
468  return false;
469  }
470  size_t subIndex = device.lut[j].deviceEntry;
471 
472  SubDevice* p = device.getSubdevice(subIndex);
473  if (!p) {
474  return false;
475  }
476 
477  if (p->pid) {
478  return p->pid->disablePid(pidtype, static_cast<int>(off + p->base));
479  }
480  return false;
481 }
482 
483 
485 {
486  size_t off;
487  try {
488  off = device.lut.at(j).offset;
489  } catch (...) {
490  yCError(CONTROLBOARDWRAPPER, "Joint number %d out of bound [0-%zu] for part %s", j, controlledJoints, partName.c_str());
491  return false;
492  }
493  size_t subIndex = device.lut[j].deviceEntry;
494 
495  SubDevice* p = device.getSubdevice(subIndex);
496  if (!p) {
497  return false;
498  }
499 
500  if (p->pid) {
501  return p->pid->enablePid(pidtype, static_cast<int>(off + p->base));
502  }
503  return false;
504 }
505 
506 
507 bool ControlBoardWrapperPidControl::isPidEnabled(const PidControlTypeEnum& pidtype, int j, bool* enabled)
508 {
509  size_t off;
510  try {
511  off = device.lut.at(j).offset;
512  } catch (...) {
513  yCError(CONTROLBOARDWRAPPER, "Joint number %d out of bound [0-%zu] for part %s", j, controlledJoints, partName.c_str());
514  return false;
515  }
516  size_t subIndex = device.lut[j].deviceEntry;
517 
518  SubDevice* p = device.getSubdevice(subIndex);
519  if (!p) {
520  return false;
521  }
522 
523  if (p->pid) {
524  return p->pid->isPidEnabled(pidtype, static_cast<int>(off + p->base), enabled);
525  }
526 
527  return false;
528 }
ControlBoardWrapperPidControl::getPids
bool getPids(const yarp::dev::PidControlTypeEnum &pidtype, yarp::dev::Pid *pids) override
Get current pid value for a specific joint.
Definition: ControlBoardWrapperPidControl.cpp:312
ControlBoardWrapperLogComponent.h
yarp::dev::IPidControl::getPidErrorLimits
virtual bool getPidErrorLimits(const PidControlTypeEnum &pidtype, double *limits)=0
Get the error limit for all controllers.
ControlBoardWrapperPidControl::setPids
bool setPids(const yarp::dev::PidControlTypeEnum &pidtype, const yarp::dev::Pid *ps) override
Set new pid value on multiple axes.
Definition: ControlBoardWrapperPidControl.cpp:44
yarp::dev::IPidControl::setPid
virtual bool setPid(const PidControlTypeEnum &pidtype, int j, const Pid &pid)=0
Set new pid value for a joint axis.
yarp::dev::IPidControl::disablePid
virtual bool disablePid(const PidControlTypeEnum &pidtype, int j)=0
Disable the pid computation for a joint.
ControlBoardWrapperPidControl::getPidError
bool getPidError(const yarp::dev::PidControlTypeEnum &pidtype, int j, double *err) override
Get the current error for a joint.
Definition: ControlBoardWrapperPidControl.cpp:163
yarp::dev::IPidControl::enablePid
virtual bool enablePid(const PidControlTypeEnum &pidtype, int j)=0
Enable the pid computation for a joint.
ControlBoardWrapperPidControl::setPidErrorLimit
bool setPidErrorLimit(const yarp::dev::PidControlTypeEnum &pidtype, int j, double limit) override
Set the error limit for the controller on a specifi joint.
Definition: ControlBoardWrapperPidControl.cpp:117
ControlBoardWrapperPidControl::getPidReference
bool getPidReference(const yarp::dev::PidControlTypeEnum &pidtype, int j, double *ref) override
Get the current reference of the pid controller for a specific joint.
Definition: ControlBoardWrapperPidControl.cpp:339
ControlBoardWrapperPidControl::setPid
bool setPid(const yarp::dev::PidControlTypeEnum &pidtype, int j, const yarp::dev::Pid &p) override
Set new pid value for a joint axis.
Definition: ControlBoardWrapperPidControl.cpp:17
yarp::dev::IPidControl::getPids
virtual bool getPids(const PidControlTypeEnum &pidtype, Pid *pids)=0
Get current pid value for a specific joint.
ControlBoardWrapperPidControl::getPidErrorLimits
bool getPidErrorLimits(const yarp::dev::PidControlTypeEnum &pidtype, double *limits) override
Get the error limit for all controllers.
Definition: ControlBoardWrapperPidControl.cpp:411
ControlBoardWrapperPidControl::setPidReference
bool setPidReference(const yarp::dev::PidControlTypeEnum &pidtype, int j, double ref) override
Set the controller reference for a given axis.
Definition: ControlBoardWrapperPidControl.cpp:67
ret
bool ret
Definition: ImplementAxisInfo.cpp:72
yarp::dev::IPidControl::getPidOutputs
virtual bool getPidOutputs(const PidControlTypeEnum &pidtype, double *outs)=0
Get the output of the controllers (e.g.
ControlBoardWrapperPidControl::resetPid
bool resetPid(const yarp::dev::PidControlTypeEnum &pidtype, int j) override
Reset the controller of a given joint, usually sets the current status of the joint as the reference ...
Definition: ControlBoardWrapperPidControl.cpp:438
ControlBoardWrapperPidControl::getPidOutputs
bool getPidOutputs(const yarp::dev::PidControlTypeEnum &pidtype, double *outs) override
Get the output of the controllers (e.g.
Definition: ControlBoardWrapperPidControl.cpp:238
yarp::dev::IPidControl::setPidOffset
virtual bool setPidOffset(const PidControlTypeEnum &pidtype, int j, double v)=0
Set offset value for a given controller.
yarp::dev::IPidControl::getPidErrors
virtual bool getPidErrors(const PidControlTypeEnum &pidtype, double *errs)=0
Get the error of all joints.
ControlBoardWrapperPidControl::setPidOffset
bool setPidOffset(const yarp::dev::PidControlTypeEnum &pidtype, int j, double v) override
Set offset value for a given controller.
Definition: ControlBoardWrapperPidControl.cpp:265
ControlBoardWrapperPidControl::setPidErrorLimits
bool setPidErrorLimits(const yarp::dev::PidControlTypeEnum &pidtype, const double *limits) override
Get the error limit for the controller on all joints.
Definition: ControlBoardWrapperPidControl.cpp:140
ControlBoardWrapperPidControl::setPidReferences
bool setPidReferences(const yarp::dev::PidControlTypeEnum &pidtype, const double *refs) override
Set the controller reference, multiple axes.
Definition: ControlBoardWrapperPidControl.cpp:94
yarp::dev::IPidControl::getPidReferences
virtual bool getPidReferences(const PidControlTypeEnum &pidtype, double *refs)=0
Get the current reference of all pid controllers.
yarp::dev::IPidControl::setPidReference
virtual bool setPidReference(const PidControlTypeEnum &pidtype, int j, double ref)=0
Set the controller reference for a given axis.
ControlBoardWrapperPidControl::getPidReferences
bool getPidReferences(const yarp::dev::PidControlTypeEnum &pidtype, double *refs) override
Get the current reference of all pid controllers.
Definition: ControlBoardWrapperPidControl.cpp:361
CONTROLBOARDWRAPPER
const yarp::os::LogComponent & CONTROLBOARDWRAPPER()
Definition: ControlBoardWrapperLogComponent.cpp:11
yarp::dev::PidControlTypeEnum
PidControlTypeEnum
Definition: PidEnums.h:21
yarp::dev::IPidControl::getPidErrorLimit
virtual bool getPidErrorLimit(const PidControlTypeEnum &pidtype, int j, double *limit)=0
Get the error limit for the controller on a specific joint.
ControlBoardWrapperCommon::partName
std::string partName
Definition: ControlBoardWrapperCommon.h:24
ControlBoardWrapperCommon::controlledJoints
size_t controlledJoints
Definition: ControlBoardWrapperCommon.h:23
SubDevice::id
std::string id
Definition: SubDevice.h:57
WrappedDevice::getSubdevice
SubDevice * getSubdevice(size_t i)
Definition: SubDevice.h:129
yarp::dev::IPidControl::getPidOutput
virtual bool getPidOutput(const PidControlTypeEnum &pidtype, int j, double *out)=0
Get the output of the controller (e.g.
WrappedDevice::subdevices
SubDeviceVector subdevices
Definition: SubDevice.h:125
yarp::dev::IPidControl::resetPid
virtual bool resetPid(const PidControlTypeEnum &pidtype, int j)=0
Reset the controller of a given joint, usually sets the current status of the joint as the reference ...
yarp::dev::IPidControl::getPid
virtual bool getPid(const PidControlTypeEnum &pidtype, int j, Pid *pid)=0
Get current pid value for a specific joint.
yarp::dev::IPidControl::getPidReference
virtual bool getPidReference(const PidControlTypeEnum &pidtype, int j, double *ref)=0
Get the current reference of the pid controller for a specific joint.
yarp::dev::IPidControl::getPidError
virtual bool getPidError(const PidControlTypeEnum &pidtype, int j, double *err)=0
Get the current error for a joint.
ControlBoardWrapperPidControl::enablePid
bool enablePid(const yarp::dev::PidControlTypeEnum &pidtype, int j) override
Enable the pid computation for a joint.
Definition: ControlBoardWrapperPidControl.cpp:484
ControlBoardWrapperCommon::device
WrappedDevice device
Definition: ControlBoardWrapperCommon.h:22
ControlBoardWrapperPidControl::getPidOutput
bool getPidOutput(const yarp::dev::PidControlTypeEnum &pidtype, int j, double *out) override
Get the output of the controller (e.g.
Definition: ControlBoardWrapperPidControl.cpp:214
ControlBoardWrapperPidControl::getPidErrors
bool getPidErrors(const yarp::dev::PidControlTypeEnum &pidtype, double *errs) override
Get the error of all joints.
Definition: ControlBoardWrapperPidControl.cpp:187
ControlBoardWrapperPidControl::isPidEnabled
bool isPidEnabled(const yarp::dev::PidControlTypeEnum &pidtype, int j, bool *enabled) override
Get the current status (enabled/disabled) of the pid.
Definition: ControlBoardWrapperPidControl.cpp:507
yCError
#define yCError(component,...)
Definition: LogComponent.h:157
ControlBoardWrapperPidControl.h
SubDevice::base
size_t base
Definition: SubDevice.h:58
WrappedDevice::lut
std::vector< DevicesLutEntry > lut
Definition: SubDevice.h:126
ControlBoardWrapperPidControl::disablePid
bool disablePid(const yarp::dev::PidControlTypeEnum &pidtype, int j) override
Disable the pid computation for a joint.
Definition: ControlBoardWrapperPidControl.cpp:461
ControlBoardWrapperPidControl::getPid
bool getPid(const yarp::dev::PidControlTypeEnum &pidtype, int j, yarp::dev::Pid *p) override
Get current pid value for a specific joint.
Definition: ControlBoardWrapperPidControl.cpp:288
yarp::dev::IPidControl::setPidErrorLimit
virtual bool setPidErrorLimit(const PidControlTypeEnum &pidtype, int j, double limit)=0
Set the error limit for the controller on a specifi joint.
ControlBoardWrapperPidControl::getPidErrorLimit
bool getPidErrorLimit(const yarp::dev::PidControlTypeEnum &pidtype, int j, double *limit) override
Get the error limit for the controller on a specific joint.
Definition: ControlBoardWrapperPidControl.cpp:388
yarp::dev::Pid
Contains the parameters for a PID.
Definition: ControlBoardPid.h:29
SubDevice::wbase
size_t wbase
Definition: SubDevice.h:60
SubDevice
Definition: SubDevice.h:55
WrappedDevice::maxNumOfJointsInDevices
size_t maxNumOfJointsInDevices
Definition: SubDevice.h:127
SubDevice::pid
yarp::dev::IPidControl * pid
Definition: SubDevice.h:70
ControlBoardWrapperCommon::printError
void printError(const std::string &func_name, const std::string &info, bool result)
Definition: ControlBoardWrapperCommon.h:72
yarp::dev::IPidControl::isPidEnabled
virtual bool isPidEnabled(const PidControlTypeEnum &pidtype, int j, bool *enabled)=0
Get the current status (enabled/disabled) of the pid.