info.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "hebi.h"
4 
5 #include <string>
6 
7 #include "color.hpp"
8 #include "gains.hpp"
9 #include "message_helpers.hpp"
10 #include "util.hpp"
11 
12 namespace hebi {
13 
33 class Info final {
34 public:
35  enum class ControlStrategy {
37  Off,
39  DirectPWM,
42  Strategy2,
45  Strategy3,
48  Strategy4,
49  };
50 
51  enum class CalibrationState {
53  Normal,
55  UncalibratedCurrent,
57  UncalibratedPosition,
59  UncalibratedEffort,
60  };
61 
62  enum class MstopStrategy {
64  Disabled,
66  MotorOff,
68  HoldPosition,
69  };
70 
71  enum class PositionLimitStrategy {
73  HoldPosition,
75  DampedSpring,
77  MotorOff,
79  Disabled,
80  };
81 
82 protected:
84  class FloatField final {
85  public:
86 #ifndef DOXYGEN_OMIT_INTERNAL
87  FloatField(const HebiInfoRef& internal, HebiInfoFloatField field);
88 #endif // DOXYGEN_OMIT_INTERNAL
89  explicit operator bool() const { return has(); }
103  bool has() const;
106  float get() const;
107 
109  private:
112  };
113 
119  class HighResAngleField final {
120  public:
121 #ifndef DOXYGEN_OMIT_INTERNAL
123 #endif // DOXYGEN_OMIT_INTERNAL
124  explicit operator bool() const { return has(); }
138  bool has() const;
144  double get() const;
156  void get(int64_t* revolutions, float* radian_offset) const;
157 
159  private:
162  };
163 
165  class BoolField final {
166  public:
167 #ifndef DOXYGEN_OMIT_INTERNAL
168  BoolField(const HebiInfoRef& internal, HebiInfoBoolField field);
169 #endif // DOXYGEN_OMIT_INTERNAL
170  bool has() const;
174  bool get() const;
175 
177  private:
180  };
181 
183  class StringField final {
184  public:
185 #ifndef DOXYGEN_OMIT_INTERNAL
187 #endif // DOXYGEN_OMIT_INTERNAL
188  explicit operator bool() const { return has(); }
202  bool has() const;
205  std::string get() const;
206 
208  private:
211  };
212 
214  class FlagField final {
215  public:
216 #ifndef DOXYGEN_OMIT_INTERNAL
217  FlagField(const HebiInfoRef& internal, HebiInfoFlagField field);
218 #endif // DOXYGEN_OMIT_INTERNAL
219  explicit operator bool() const { return has(); }
233  bool has() const;
234 
236  private:
239  };
240 
242  template<typename T>
243  class EnumField final {
244  public:
245 #ifndef DOXYGEN_OMIT_INTERNAL
246  EnumField(const HebiInfoRef& internal, HebiInfoEnumField field) : internal_(internal), field_(field) {}
247 #endif // DOXYGEN_OMIT_INTERNAL
248  explicit operator bool() const { return has(); }
262  bool has() const {
263  return (enumGetter(internal_, field_, nullptr) == HebiStatusSuccess);
264  }
267  T get() const {
268  int32_t ret{};
269  enumGetter(internal_, field_, &ret);
270  return static_cast<T>(ret);
271  }
272 
274  private:
277  };
278 
280  class LedField final {
281  public:
282 #ifndef DOXYGEN_OMIT_INTERNAL
283  LedField(const HebiInfoRef& internal, HebiInfoLedField field);
284 #endif // DOXYGEN_OMIT_INTERNAL
285  explicit operator bool() const { return hasColor(); }
299  bool hasColor() const;
301  Color getColor() const;
302 
304  private:
307  };
308 
310 
312  class Settings final {
313  protected:
315  class Actuator final {
316  public:
317 #ifndef DOXYGEN_OMIT_INTERNAL
318  Actuator(const HebiInfoRef& internal)
319  : position_gains_(internal, HebiInfoFloatPositionKp, HebiInfoBoolPositionDOnError),
320  velocity_gains_(internal, HebiInfoFloatVelocityKp, HebiInfoBoolVelocityDOnError),
321  effort_gains_(internal, HebiInfoFloatEffortKp, HebiInfoBoolEffortDOnError),
322  spring_constant_(internal, HebiInfoFloatSpringConstant),
323  velocity_limit_min_(internal, HebiInfoFloatVelocityLimitMin),
324  velocity_limit_max_(internal, HebiInfoFloatVelocityLimitMax),
325  effort_limit_min_(internal, HebiInfoFloatEffortLimitMin),
326  effort_limit_max_(internal, HebiInfoFloatEffortLimitMax),
327  position_limit_min_(internal, HebiInfoHighResAnglePositionLimitMin),
328  position_limit_max_(internal, HebiInfoHighResAnglePositionLimitMax),
329  control_strategy_(internal, HebiInfoEnumControlStrategy),
330  mstop_strategy_(internal, HebiInfoEnumMstopStrategy),
331  min_position_limit_strategy_(internal, HebiInfoEnumMinPositionLimitStrategy),
332  max_position_limit_strategy_(internal, HebiInfoEnumMaxPositionLimitStrategy) {}
333 #endif // DOXYGEN_OMIT_INTERNAL
334 
335  // With all submessage and field getters: Note that the returned reference
336  // should not be used after the lifetime of this parent.
337 
338  // Submessages ----------------
339 
341  const InfoGains& positionGains() const { return position_gains_; }
343  const InfoGains& velocityGains() const { return velocity_gains_; }
345  const InfoGains& effortGains() const { return effort_gains_; }
346 
347  // Subfields ----------------
348 
350  const FloatField& springConstant() const { return spring_constant_; }
352  const FloatField& velocityLimitMin() const { return velocity_limit_min_; }
354  const FloatField& velocityLimitMax() const { return velocity_limit_max_; }
356  const FloatField& effortLimitMin() const { return effort_limit_min_; }
358  const FloatField& effortLimitMax() const { return effort_limit_max_; }
360  const HighResAngleField& positionLimitMin() const { return position_limit_min_; }
362  const HighResAngleField& positionLimitMax() const { return position_limit_max_; }
364  const EnumField<ControlStrategy>& controlStrategy() const { return control_strategy_; }
366  const EnumField<MstopStrategy>& mstopStrategy() const { return mstop_strategy_; }
368  const EnumField<PositionLimitStrategy>& minPositionLimitStrategy() const { return min_position_limit_strategy_; }
370  const EnumField<PositionLimitStrategy>& maxPositionLimitStrategy() const { return max_position_limit_strategy_; }
371 
373  private:
377 
389  };
390 
392  class Imu final {
393  public:
394 #ifndef DOXYGEN_OMIT_INTERNAL
395  Imu(const HebiInfoRef& internal)
396  : accel_includes_gravity_(internal, HebiInfoBoolAccelIncludesGravity) {}
397 #endif // DOXYGEN_OMIT_INTERNAL
398 
399  // With all submessage and field getters: Note that the returned reference
400  // should not be used after the lifetime of this parent.
401 
402  // Subfields ----------------
403 
405  const BoolField& accelIncludesGravity() const { return accel_includes_gravity_; }
406 
408  private:
410  };
411 
412  public:
413 #ifndef DOXYGEN_OMIT_INTERNAL
414  Settings(HebiInfoPtr internal_ptr, const HebiInfoRef& internal)
415  : actuator_(internal),
416  imu_(internal),
417  name_(internal_ptr, HebiInfoStringName),
418  family_(internal_ptr, HebiInfoStringFamily),
419  save_current_settings_(internal, HebiInfoFlagSaveCurrentSettings) {}
420 #endif // DOXYGEN_OMIT_INTERNAL
421 
422  // With all submessage and field getters: Note that the returned reference
423  // should not be used after the lifetime of this parent.
424 
425  // Submessages ----------------
426 
428  const Actuator& actuator() const { return actuator_; }
430  const Imu& imu() const { return imu_; }
431 
432  // Subfields ----------------
433 
435  const StringField& name() const { return name_; }
437  const StringField& family() const { return family_; }
439  const FlagField& saveCurrentSettings() const { return save_current_settings_; }
440 
442  private:
445 
449  };
450 
452  class Actuator final {
453  public:
454 #ifndef DOXYGEN_OMIT_INTERNAL
455  Actuator(const HebiInfoRef& internal) : calibration_state_(internal, HebiInfoEnumCalibrationState) {}
456 #endif // DOXYGEN_OMIT_INTERNAL
457 
458  // With all submessage and field getters: Note that the returned reference
459  // should not be used after the lifetime of this parent.
460 
461  // Subfields ----------------
462 
464  const EnumField<CalibrationState>& calibrationState() const { return calibration_state_; }
465 
467  private:
469  };
470 
471 private:
478 
479 public:
480 #ifndef DOXYGEN_OMIT_INTERNAL
481 
485  Info(HebiInfoPtr);
486 #endif // DOXYGEN_OMIT_INTERNAL
487 
490  Info(Info&& other);
491 
492  // With all submessage and field getters: Note that the returned reference
493  // should not be used after the lifetime of this parent.
494 
495  // Submessages -------------------------------------------------------------
496 
498  const Settings& settings() const { return settings_; }
500  const Actuator& actuator() const { return actuator_; }
501 
502  // Subfields -------------------------------------------------------------
503 
505  const StringField& serial() const { return serial_; }
507  const LedField& led() const { return led_; }
508 
513 
514  /* Disable move assigment operator. */
515  Info& operator=(Info&& other) = delete;
516 
517 private:
520 
523 };
524 
525 } // namespace hebi
Actuator(const HebiInfoRef &internal)
Definition: info.hpp:318
const HebiInfoRef & internal_
Definition: info.hpp:110
const FloatField & effortLimitMax() const
The firmware safety limit for the maximum allowed effort.
Definition: info.hpp:358
const FlagField & saveCurrentSettings() const
Indicates if the module should save the current values of all of its settings.
Definition: info.hpp:439
const FloatField & velocityLimitMax() const
The firmware safety limit for the maximum allowed velocity.
Definition: info.hpp:354
Module settings that are typically changed at a slower rate.
Definition: info.hpp:312
A message field for an angle measurement which does not lose precision at very high angles...
Definition: info.hpp:119
#define HEBI_DISABLE_COPY(Class)
Definition: util.hpp:16
Settings(HebiInfoPtr internal_ptr, const HebiInfoRef &internal)
Definition: info.hpp:414
const EnumField< PositionLimitStrategy > & minPositionLimitStrategy() const
The position limit strategy (at the minimum position) for the actuator.
Definition: info.hpp:368
Actuator-specific settings, such as controller gains.
Definition: info.hpp:315
HebiInfoRef internal_ref_
Definition: info.hpp:477
The firmware safety limit for the minimum allowed effort.
Definition: hebi.h:282
const Imu & imu() const
IMU-specific settings.
Definition: info.hpp:430
A simple lowpass filter applied to the controller output; needs to be between 0 and 1...
Definition: hebi.h:278
PositionLimitStrategy
Definition: info.hpp:71
HighResAngleField position_limit_min_
Definition: info.hpp:383
StringField serial_
Definition: info.hpp:521
A simple lowpass filter applied to the controller output; needs to be between 0 and 1...
Definition: hebi.h:265
A message field representable by a bool value.
Definition: info.hpp:165
const BoolField & accelIncludesGravity() const
Whether to include acceleration due to gravity in acceleration feedback.
Definition: info.hpp:405
FloatField velocity_limit_min_
Definition: info.hpp:379
Definition: arm.cpp:5
const FloatField & velocityLimitMin() const
The firmware safety limit for the minimum allowed velocity.
Definition: info.hpp:352
const Settings & settings() const
Module settings that are typically changed at a slower rate.
Definition: info.hpp:498
HebiInfoEnumField const field_
Definition: info.hpp:276
const StringField & name() const
Gets the name for this module.
Definition: info.hpp:435
Actuator-specific information.
Definition: info.hpp:452
const Actuator & actuator() const
Actuator-specific information.
Definition: info.hpp:500
const Actuator & actuator() const
Actuator-specific settings, such as controller gains.
Definition: info.hpp:428
Info objects have various fields representing the module state; which fields are populated depends on...
Definition: info.hpp:33
EnumField< CalibrationState > calibration_state_
Definition: info.hpp:468
The firmware safety limit for the minimum allowed position.
Definition: hebi.h:287
MstopStrategy
Definition: info.hpp:62
CalibrationState
Definition: info.hpp:51
#define HEBI_DISABLE_COPY_MOVE(Class)
Definition: util.hpp:6
The calibration state of the module.
Definition: hebi.h:310
HebiInfoFloatField const field_
Definition: info.hpp:111
Actuator actuator_
Definition: info.hpp:443
EnumField< PositionLimitStrategy > max_position_limit_strategy_
Definition: info.hpp:388
const EnumField< PositionLimitStrategy > & maxPositionLimitStrategy() const
The position limit strategy (at the maximum position) for the actuator.
Definition: info.hpp:370
A two-state message field (either set/true or cleared/false).
Definition: info.hpp:214
const FloatField & springConstant() const
The spring constant of the module.
Definition: info.hpp:350
struct HebiInfo_ * HebiInfoPtr
The C-style&#39;s API representation of info.
Definition: hebi.h:458
HebiInfoFlagField const field_
Definition: info.hpp:238
HighResAngleField position_limit_max_
Definition: info.hpp:384
A message field for interfacing with an LED.
Definition: info.hpp:280
HebiInfoStringField
Definition: hebi.h:297
const InfoGains & effortGains() const
Controller gains for the effort PID loop.
Definition: info.hpp:345
EnumField< ControlStrategy > control_strategy_
Definition: info.hpp:385
FlagField save_current_settings_
Definition: info.hpp:448
HebiInfoHighResAngleField
Definition: hebi.h:285
Settings settings_
Definition: info.hpp:518
HebiInfoFlagField
Definition: hebi.h:303
const EnumField< MstopStrategy > & mstopStrategy() const
The motion stop strategy for the actuator.
Definition: info.hpp:366
const InfoGains & velocityGains() const
Controller gains for the velocity PID loop.
Definition: info.hpp:343
A direct PWM value (-1 to 1) can be sent to the motor (subject to onboard safety limiting).
const EnumField< CalibrationState > & calibrationState() const
The calibration state of the module.
Definition: info.hpp:464
HebiInfoBoolField
Definition: hebi.h:290
bool has() const
True if (and only if) the field has a value.
Definition: info.hpp:262
EnumField< MstopStrategy > mstop_strategy_
Definition: info.hpp:386
HebiInfoLedField
Definition: hebi.h:315
HebiStatusCode enumGetter(const RefT &ref, MetadataT &metadata, int field, int32_t *value)
const StringField & family() const
Gets the family for this module.
Definition: info.hpp:437
The firmware safety limit for the maximum allowed velocity.
Definition: hebi.h:281
const HebiInfoRef & internal_
Definition: info.hpp:275
BoolField accel_includes_gravity_
Definition: info.hpp:409
HebiInfoPtr const internal_
Definition: info.hpp:209
The motor is not given power (equivalent to a 0 PWM value)
How the position, velocity, and effort PID loops are connected in order to control motor PWM...
Definition: hebi.h:309
The spring constant of the module.
Definition: hebi.h:279
Info & operator=(Info &&other)=delete
ControlStrategy
Definition: info.hpp:35
EnumField< PositionLimitStrategy > min_position_limit_strategy_
Definition: info.hpp:387
A message field representable by a std::string.
Definition: info.hpp:183
const HebiInfoRef & internal_
Definition: info.hpp:160
Controls whether the Kd term uses the "derivative of error" or "derivative of measurement." When the setpoints have step inputs or are noisy, setting this to false can eliminate corresponding spikes or noise in the output.
Definition: hebi.h:293
HebiInfoFloatField
Info Enums.
Definition: hebi.h:238
const HebiInfoRef & internal_
Definition: info.hpp:237
const EnumField< ControlStrategy > & controlStrategy() const
How the position, velocity, and effort PID loops are connected in order to control motor PWM...
Definition: info.hpp:364
Controls whether the Kd term uses the "derivative of error" or "derivative of measurement." When the setpoints have step inputs or are noisy, setting this to false can eliminate corresponding spikes or noise in the output.
Definition: hebi.h:294
The position limit strategy (at the minimum position) for the actuator.
Definition: hebi.h:312
const HighResAngleField & positionLimitMax() const
The firmware safety limit for the maximum allowed position.
Definition: info.hpp:362
Info(HebiInfoPtr)
Wraps an existing C-style object that is managed by its parent. NOTE: this should not be used except ...
Definition: info.cpp:93
HebiInfoEnumField
Definition: hebi.h:307
const HebiInfoRef & internal_
Definition: info.hpp:178
HebiInfoPtr internal_
Definition: info.hpp:476
Controls whether the Kd term uses the "derivative of error" or "derivative of measurement." When the setpoints have step inputs or are noisy, setting this to false can eliminate corresponding spikes or noise in the output.
Definition: hebi.h:292
const StringField & serial() const
Gets the serial number for this module (e.g., X5-0001).
Definition: info.hpp:505
const HebiInfoRef & internal_
Definition: info.hpp:305
FloatField velocity_limit_max_
Definition: info.hpp:380
HebiInfoLedField const field_
Definition: info.hpp:306
Imu(const HebiInfoRef &internal)
Definition: info.hpp:395
HebiInfoStringField const field_
Definition: info.hpp:210
const HighResAngleField & positionLimitMin() const
The firmware safety limit for the minimum allowed position.
Definition: info.hpp:360
A simple lowpass filter applied to the controller output; needs to be between 0 and 1...
Definition: hebi.h:252
LedField led_
Definition: info.hpp:522
Actuator actuator_
Definition: info.hpp:519
const LedField & led() const
The module&#39;s LED.
Definition: info.hpp:507
EnumField(const HebiInfoRef &internal, HebiInfoEnumField field)
Definition: info.hpp:246
StringField name_
Definition: info.hpp:446
A message field representable by an enum of a given type.
Definition: info.hpp:243
Structure to describe an RGB color.
Definition: color.hpp:8
IMU-specific settings.
Definition: info.hpp:392
The name for this module. The string must be null-terminated and less than 21 characters.
Definition: hebi.h:299
The motion stop strategy for the actuator.
Definition: hebi.h:311
Actuator(const HebiInfoRef &internal)
Definition: info.hpp:455
The firmware safety limit for the minimum allowed velocity.
Definition: hebi.h:280
A message field representable by a single-precision floating point value.
Definition: info.hpp:84
HebiInfoHighResAngleField const field_
Definition: info.hpp:161
const FloatField & effortLimitMin() const
The firmware safety limit for the minimum allowed effort.
Definition: info.hpp:356
StringField family_
Definition: info.hpp:447
A message field representable by an enum of a given type.
Definition: command.hpp:300
const InfoGains & positionGains() const
Controller gains for the position PID loop.
Definition: info.hpp:341
HebiInfoBoolField const field_
Definition: info.hpp:179


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