group_feedback.cpp
Go to the documentation of this file.
1 #include "group_feedback.hpp"
2 
3 namespace hebi {
4 
5 GroupFeedback::GroupFeedback(size_t number_of_modules)
6  : internal_(hebiGroupFeedbackCreate(number_of_modules)),
7  manage_pointer_lifetime_(true),
8  number_of_modules_(number_of_modules) {
9  for (size_t i = 0; i < number_of_modules_; i++)
11 }
12 
14  : internal_(group_feedback),
17  for (size_t i = 0; i < number_of_modules_; i++)
19 }
20 
22  if (manage_pointer_lifetime_ && internal_ != nullptr)
24 }
25 
26 size_t GroupFeedback::size() const { return number_of_modules_; }
27 
28 const Feedback& GroupFeedback::operator[](size_t index) const { return feedbacks_[index]; }
29 
30 double GroupFeedback::getTime() const {
31  static constexpr double SEC_TO_US = 1.0 / 1000000.0;
32  double res = 0.0;
33  for (size_t i = 0; i < number_of_modules_; ++i) {
34  auto& fbk = feedbacks_[i].receiveTimeUs();
35  if (!fbk)
36  return std::numeric_limits<double>::quiet_NaN();
37  res = std::max(res, static_cast<double>(fbk.get()) * SEC_TO_US);
38  }
39  return res;
40 }
41 
42 uint64_t GroupFeedback::getTimeUs() const {
43  uint64_t res = 0;
44  for (size_t i = 0; i < number_of_modules_; ++i) {
45  auto& fbk = feedbacks_[i].receiveTimeUs();
46  if (!fbk)
47  return 0;
48  res = std::max(res, fbk.get());
49  }
50  return res;
51 }
52 
53 Eigen::VectorXd GroupFeedback::getBoardTemperature() const {
54  Eigen::VectorXd res(number_of_modules_);
55  for (size_t i = 0; i < number_of_modules_; ++i) {
56  auto& fbk = feedbacks_[i].boardTemperature();
57  res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
58  }
59  return res;
60 }
61 Eigen::VectorXd GroupFeedback::getProcessorTemperature() const {
62  Eigen::VectorXd res(number_of_modules_);
63  for (size_t i = 0; i < number_of_modules_; ++i) {
64  auto& fbk = feedbacks_[i].processorTemperature();
65  res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
66  }
67  return res;
68 }
69 Eigen::VectorXd GroupFeedback::getVoltage() const {
70  Eigen::VectorXd res(number_of_modules_);
71  for (size_t i = 0; i < number_of_modules_; ++i) {
72  auto& fbk = feedbacks_[i].voltage();
73  res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
74  }
75  return res;
76 }
77 
78 Eigen::VectorXd GroupFeedback::getDeflection() const {
79  Eigen::VectorXd res(number_of_modules_);
80  for (size_t i = 0; i < number_of_modules_; ++i) {
81  auto& cmd = feedbacks_[i].actuator().deflection();
82  res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
83  }
84  return res;
85 }
86 Eigen::VectorXd GroupFeedback::getDeflectionVelocity() const {
87  Eigen::VectorXd res(number_of_modules_);
88  for (size_t i = 0; i < number_of_modules_; ++i) {
89  auto& cmd = feedbacks_[i].actuator().deflectionVelocity();
90  res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
91  }
92  return res;
93 }
94 Eigen::VectorXd GroupFeedback::getMotorVelocity() const {
95  Eigen::VectorXd res(number_of_modules_);
96  for (size_t i = 0; i < number_of_modules_; ++i) {
97  auto& cmd = feedbacks_[i].actuator().motorVelocity();
98  res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
99  }
100  return res;
101 }
102 Eigen::VectorXd GroupFeedback::getMotorCurrent() const {
103  Eigen::VectorXd res(number_of_modules_);
104  for (size_t i = 0; i < number_of_modules_; ++i) {
105  auto& fbk = feedbacks_[i].actuator().motorCurrent();
106  res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
107  }
108  return res;
109 }
111  Eigen::VectorXd res(number_of_modules_);
112  for (size_t i = 0; i < number_of_modules_; ++i) {
113  auto& fbk = feedbacks_[i].actuator().motorSensorTemperature();
114  res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
115  }
116  return res;
117 }
118 Eigen::VectorXd GroupFeedback::getMotorWindingCurrent() const {
119  Eigen::VectorXd res(number_of_modules_);
120  for (size_t i = 0; i < number_of_modules_; ++i) {
121  auto& fbk = feedbacks_[i].actuator().motorWindingCurrent();
122  res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
123  }
124  return res;
125 }
126 
128  Eigen::VectorXd res(number_of_modules_);
129  for (size_t i = 0; i < number_of_modules_; ++i) {
130  auto& cmd = feedbacks_[i].actuator().motorWindingTemperature();
131  res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
132  }
133  return res;
134 }
136  Eigen::VectorXd res(number_of_modules_);
137  for (size_t i = 0; i < number_of_modules_; ++i) {
138  auto& cmd = feedbacks_[i].actuator().motorHousingTemperature();
139  res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
140  }
141  return res;
142 }
143 
144 Eigen::VectorXd GroupFeedback::getPosition() const {
145  Eigen::VectorXd res(number_of_modules_);
146  for (size_t i = 0; i < number_of_modules_; ++i) {
147  auto& fbk = feedbacks_[i].actuator().position();
148  res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
149  }
150  return res;
151 }
152 Eigen::VectorXd GroupFeedback::getVelocity() const {
153  Eigen::VectorXd res(number_of_modules_);
154  for (size_t i = 0; i < number_of_modules_; ++i) {
155  auto& fbk = feedbacks_[i].actuator().velocity();
156  res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
157  }
158  return res;
159 }
160 Eigen::VectorXd GroupFeedback::getEffort() const {
161  Eigen::VectorXd res(number_of_modules_);
162  for (size_t i = 0; i < number_of_modules_; ++i) {
163  auto& fbk = feedbacks_[i].actuator().effort();
164  res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
165  }
166  return res;
167 }
168 
169 Eigen::VectorXd GroupFeedback::getPositionCommand() const {
170  Eigen::VectorXd res(number_of_modules_);
171  for (size_t i = 0; i < number_of_modules_; ++i) {
172  auto& cmd = feedbacks_[i].actuator().positionCommand();
173  res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
174  }
175  return res;
176 }
177 Eigen::VectorXd GroupFeedback::getVelocityCommand() const {
178  Eigen::VectorXd res(number_of_modules_);
179  for (size_t i = 0; i < number_of_modules_; ++i) {
180  auto& cmd = feedbacks_[i].actuator().velocityCommand();
181  res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
182  }
183  return res;
184 }
185 Eigen::VectorXd GroupFeedback::getEffortCommand() const {
186  Eigen::VectorXd res(number_of_modules_);
187  for (size_t i = 0; i < number_of_modules_; ++i) {
188  auto& cmd = feedbacks_[i].actuator().effortCommand();
189  res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
190  }
191  return res;
192 }
193 
194 Eigen::MatrixX3d GroupFeedback::getAccelerometer() const {
195  Eigen::MatrixX3d res(number_of_modules_, 3);
196  for (size_t i = 0; i < number_of_modules_; ++i) {
197  auto& fbk = feedbacks_[i].imu().accelerometer();
198  if (fbk) {
199  auto vec = fbk.get();
200  res(i, 0) = vec.getX();
201  res(i, 1) = vec.getY();
202  res(i, 2) = vec.getZ();
203  } else {
204  res(i, 0) = std::numeric_limits<double>::quiet_NaN();
205  res(i, 1) = std::numeric_limits<double>::quiet_NaN();
206  res(i, 2) = std::numeric_limits<double>::quiet_NaN();
207  }
208  }
209  return res;
210 }
211 Eigen::MatrixX3d GroupFeedback::getGyro() const {
212  Eigen::MatrixX3d res(number_of_modules_, 3);
213  for (size_t i = 0; i < number_of_modules_; ++i) {
214  auto& fbk = feedbacks_[i].imu().gyro();
215  if (fbk) {
216  auto vec = fbk.get();
217  res(i, 0) = vec.getX();
218  res(i, 1) = vec.getY();
219  res(i, 2) = vec.getZ();
220  } else {
221  res(i, 0) = std::numeric_limits<double>::quiet_NaN();
222  res(i, 1) = std::numeric_limits<double>::quiet_NaN();
223  res(i, 2) = std::numeric_limits<double>::quiet_NaN();
224  }
225  }
226  return res;
227 }
228 
229 void GroupFeedback::getBoardTemperature(Eigen::VectorXd& out) const {
230  if (out.size() != number_of_modules_) {
231  out.resize(number_of_modules_);
232  }
233 
234  for (size_t i = 0; i < number_of_modules_; ++i) {
235  auto& fbk = feedbacks_[i].boardTemperature();
236  out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
237  }
238 }
239 void GroupFeedback::getProcessorTemperature(Eigen::VectorXd& out) const {
240  if (out.size() != number_of_modules_) {
241  out.resize(number_of_modules_);
242  }
243 
244  for (size_t i = 0; i < number_of_modules_; ++i) {
245  auto& fbk = feedbacks_[i].processorTemperature();
246  out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
247  }
248 }
249 void GroupFeedback::getVoltage(Eigen::VectorXd& out) const {
250  if (out.size() != number_of_modules_) {
251  out.resize(number_of_modules_);
252  }
253 
254  for (size_t i = 0; i < number_of_modules_; ++i) {
255  auto& fbk = feedbacks_[i].voltage();
256  out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
257  }
258 }
259 
260 void GroupFeedback::getDeflection(Eigen::VectorXd& out) const {
261  if (out.size() != number_of_modules_) {
262  out.resize(number_of_modules_);
263  }
264 
265  for (size_t i = 0; i < number_of_modules_; ++i) {
266  auto& cmd = feedbacks_[i].actuator().deflection();
267  out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
268  }
269 }
270 void GroupFeedback::getDeflectionVelocity(Eigen::VectorXd& out) const {
271  if (out.size() != number_of_modules_) {
272  out.resize(number_of_modules_);
273  }
274 
275  for (size_t i = 0; i < number_of_modules_; ++i) {
276  auto& cmd = feedbacks_[i].actuator().deflectionVelocity();
277  out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
278  }
279 }
280 void GroupFeedback::getMotorVelocity(Eigen::VectorXd& out) const {
281  if (out.size() != number_of_modules_) {
282  out.resize(number_of_modules_);
283  }
284 
285  for (size_t i = 0; i < number_of_modules_; ++i) {
286  auto& cmd = feedbacks_[i].actuator().motorVelocity();
287  out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
288  }
289 }
290 void GroupFeedback::getMotorCurrent(Eigen::VectorXd& out) const {
291  if (out.size() != number_of_modules_) {
292  out.resize(number_of_modules_);
293  }
294 
295  for (size_t i = 0; i < number_of_modules_; ++i) {
296  auto& fbk = feedbacks_[i].actuator().motorCurrent();
297  out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
298  }
299 }
300 void GroupFeedback::getMotorSensorTemperature(Eigen::VectorXd& out) const {
301  if (out.size() != number_of_modules_) {
302  out.resize(number_of_modules_);
303  }
304 
305  for (size_t i = 0; i < number_of_modules_; ++i) {
306  auto& fbk = feedbacks_[i].actuator().motorSensorTemperature();
307  out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
308  }
309 }
310 void GroupFeedback::getMotorWindingCurrent(Eigen::VectorXd& out) const {
311  if (out.size() != number_of_modules_) {
312  out.resize(number_of_modules_);
313  }
314 
315  for (size_t i = 0; i < number_of_modules_; ++i) {
316  auto& fbk = feedbacks_[i].actuator().motorWindingCurrent();
317  out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
318  }
319 }
320 
321 void GroupFeedback::getMotorWindingTemperature(Eigen::VectorXd& out) const {
322  if (out.size() != number_of_modules_) {
323  out.resize(number_of_modules_);
324  }
325 
326  for (size_t i = 0; i < number_of_modules_; ++i) {
327  auto& cmd = feedbacks_[i].actuator().motorWindingTemperature();
328  out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
329  }
330 }
331 void GroupFeedback::getMotorHousingTemperature(Eigen::VectorXd& out) const {
332  if (out.size() != number_of_modules_) {
333  out.resize(number_of_modules_);
334  }
335 
336  for (size_t i = 0; i < number_of_modules_; ++i) {
337  auto& cmd = feedbacks_[i].actuator().motorHousingTemperature();
338  out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
339  }
340 }
341 
342 void GroupFeedback::getPosition(Eigen::VectorXd& out) const {
343  if (out.size() != number_of_modules_) {
344  out.resize(number_of_modules_);
345  }
346 
347  for (size_t i = 0; i < number_of_modules_; ++i) {
348  auto& fbk = feedbacks_[i].actuator().position();
349  out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
350  }
351 }
352 void GroupFeedback::getVelocity(Eigen::VectorXd& out) const {
353  if (out.size() != number_of_modules_) {
354  out.resize(number_of_modules_);
355  }
356 
357  for (size_t i = 0; i < number_of_modules_; ++i) {
358  auto& fbk = feedbacks_[i].actuator().velocity();
359  out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
360  }
361 }
362 void GroupFeedback::getEffort(Eigen::VectorXd& out) const {
363  if (out.size() != number_of_modules_) {
364  out.resize(number_of_modules_);
365  }
366 
367  for (size_t i = 0; i < number_of_modules_; ++i) {
368  auto& fbk = feedbacks_[i].actuator().effort();
369  out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
370  }
371 }
372 
373 void GroupFeedback::getPositionCommand(Eigen::VectorXd& out) const {
374  if (out.size() != number_of_modules_) {
375  out.resize(number_of_modules_);
376  }
377 
378  for (size_t i = 0; i < number_of_modules_; ++i) {
379  auto& cmd = feedbacks_[i].actuator().positionCommand();
380  out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
381  }
382 }
383 void GroupFeedback::getVelocityCommand(Eigen::VectorXd& out) const {
384  if (out.size() != number_of_modules_) {
385  out.resize(number_of_modules_);
386  }
387 
388  for (size_t i = 0; i < number_of_modules_; ++i) {
389  auto& cmd = feedbacks_[i].actuator().velocityCommand();
390  out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
391  }
392 }
393 void GroupFeedback::getEffortCommand(Eigen::VectorXd& out) const {
394  if (out.size() != number_of_modules_) {
395  out.resize(number_of_modules_);
396  }
397 
398  for (size_t i = 0; i < number_of_modules_; ++i) {
399  auto& cmd = feedbacks_[i].actuator().effortCommand();
400  out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
401  }
402 }
403 
404 void GroupFeedback::getAccelerometer(Eigen::MatrixX3d& out) const {
405  if (out.rows() != number_of_modules_ || out.cols() != 3) {
406  out.resize(number_of_modules_, 3);
407  }
408 
409  for (size_t i = 0; i < number_of_modules_; ++i) {
410  auto& fbk = feedbacks_[i].imu().accelerometer();
411  if (fbk) {
412  auto vec = fbk.get();
413  out(i, 0) = vec.getX();
414  out(i, 1) = vec.getY();
415  out(i, 2) = vec.getZ();
416  } else {
417  out(i, 0) = std::numeric_limits<double>::quiet_NaN();
418  out(i, 1) = std::numeric_limits<double>::quiet_NaN();
419  out(i, 2) = std::numeric_limits<double>::quiet_NaN();
420  }
421  }
422 }
423 void GroupFeedback::getGyro(Eigen::MatrixX3d& out) const {
424  if (out.rows() != number_of_modules_ || out.cols() != 3) {
425  out.resize(number_of_modules_, 3);
426  }
427 
428  for (size_t i = 0; i < number_of_modules_; ++i) {
429  auto& fbk = feedbacks_[i].imu().gyro();
430  if (fbk) {
431  auto vec = fbk.get();
432  out(i, 0) = vec.getX();
433  out(i, 1) = vec.getY();
434  out(i, 2) = vec.getZ();
435  } else {
436  out(i, 0) = std::numeric_limits<double>::quiet_NaN();
437  out(i, 1) = std::numeric_limits<double>::quiet_NaN();
438  out(i, 2) = std::numeric_limits<double>::quiet_NaN();
439  }
440  }
441 }
442 
443 } // namespace hebi
size_t hebiGroupFeedbackGetSize(HebiGroupFeedbackPtr feedback)
Return the number of modules in this group Feedback.
const Feedback & operator[](size_t index) const
Access the feedback for an individual module.
Eigen::VectorXd getVelocityCommand() const
Convenience function for returning commanded velocity values.
Eigen::VectorXd getBoardTemperature() const
Convenience function for returning feedback board temperature values.
Eigen::VectorXd getEffort() const
Convenience function for returning feedback effort values.
HebiGroupFeedbackPtr hebiGroupFeedbackCreate(size_t size)
Creates a GroupFeedback for a group with the specified number of modules.
Definition: arm.cpp:5
Eigen::VectorXd getDeflection() const
Convenience function for returning feedback deflection values.
size_t size() const
Returns the number of module feedbacks in this group feedback.
Eigen::VectorXd getVelocity() const
Convenience function for returning feedback velocity values.
Eigen::VectorXd getProcessorTemperature() const
Convenience function for returning feedback processor temperature values.
Feedback objects have various fields representing feedback from modules; which fields are populated d...
Definition: feedback.hpp:32
Eigen::MatrixX3d getGyro() const
Convenience function for returning feedback gyroscope values.
void hebiGroupFeedbackRelease(HebiGroupFeedbackPtr feedback)
Frees resources created by the GroupFeedback object.
const bool manage_pointer_lifetime_
GroupFeedback(size_t number_of_modules)
Create a group feedback with the specified number of modules.
uint64_t getTimeUs() const
Gets a single wall-clock timestamp (in microseconds since the epoch) associated with the entire group...
Eigen::VectorXd getMotorSensorTemperature() const
Convenience function for returning feedback motor sensor temperature values.
std::vector< Feedback > feedbacks_
HebiFeedbackPtr hebiGroupFeedbackGetModuleFeedback(HebiGroupFeedbackPtr feedback, size_t module_index)
Get an individual feedback for a particular module at index module_index.
Eigen::VectorXd getDeflectionVelocity() const
Convenience function for returning feedback deflection velocity values.
Eigen::VectorXd getVoltage() const
Convenience function for returning feedback voltage values.
HebiGroupFeedbackPtr internal_
const size_t number_of_modules_
Eigen::VectorXd getMotorWindingCurrent() const
Convenience function for returning feedback motor winding current values.
struct HebiGroupFeedback_ * HebiGroupFeedbackPtr
The C-style&#39;s API representation of a feedback object for a group of modules.
Definition: hebi.h:476
Eigen::VectorXd getMotorVelocity() const
Convenience function for returning feedback motor velocity values.
Eigen::MatrixX3d getAccelerometer() const
Convenience function for returning feedback accelerometer values.
Eigen::VectorXd getMotorHousingTemperature() const
Convenience function for returning feedback motor housing temperature values.
double getTime() const
Gets a single wall-clock timestamp (in seconds since the epoch) associated with the entire group feed...
Eigen::VectorXd getMotorCurrent() const
Convenience function for returning feedback motor current values.
~GroupFeedback() noexcept
Destructor cleans up group feedback object as necessary.
Eigen::VectorXd getPositionCommand() const
Convenience function for returning commanded position values.
Eigen::VectorXd getEffortCommand() const
Convenience function for returning commanded effort values.
Eigen::VectorXd getPosition() const
Convenience function for returning feedback position values.
Eigen::VectorXd getMotorWindingTemperature() const
Convenience function for returning feedback motor winding temperature values.


hebi_cpp_api_ros
Author(s): Chris Bollinger , Matthew Tesch
autogenerated on Thu May 28 2020 03:14:44