7 manage_pointer_lifetime_(true),
8 number_of_modules_(number_of_modules) {
31 static constexpr
double SEC_TO_US = 1.0 / 1000000.0;
36 return std::numeric_limits<double>::quiet_NaN();
37 res = std::max(res, static_cast<double>(fbk.get()) * SEC_TO_US);
48 res = std::max(res, fbk.get());
57 res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
64 auto& fbk =
feedbacks_[i].processorTemperature();
65 res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
73 res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
81 auto& cmd =
feedbacks_[i].actuator().deflection();
82 res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
89 auto& cmd =
feedbacks_[i].actuator().deflectionVelocity();
90 res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
97 auto& cmd =
feedbacks_[i].actuator().motorVelocity();
98 res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
105 auto& fbk =
feedbacks_[i].actuator().motorCurrent();
106 res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
113 auto& fbk =
feedbacks_[i].actuator().motorSensorTemperature();
114 res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
121 auto& fbk =
feedbacks_[i].actuator().motorWindingCurrent();
122 res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
130 auto& cmd =
feedbacks_[i].actuator().motorWindingTemperature();
131 res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
138 auto& cmd =
feedbacks_[i].actuator().motorHousingTemperature();
139 res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
147 auto& fbk =
feedbacks_[i].actuator().position();
148 res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
155 auto& fbk =
feedbacks_[i].actuator().velocity();
156 res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
163 auto& fbk =
feedbacks_[i].actuator().effort();
164 res[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
172 auto& cmd =
feedbacks_[i].actuator().positionCommand();
173 res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
180 auto& cmd =
feedbacks_[i].actuator().velocityCommand();
181 res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
188 auto& cmd =
feedbacks_[i].actuator().effortCommand();
189 res[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
197 auto& fbk =
feedbacks_[i].imu().accelerometer();
199 auto vec = fbk.get();
200 res(i, 0) = vec.getX();
201 res(i, 1) = vec.getY();
202 res(i, 2) = vec.getZ();
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();
216 auto vec = fbk.get();
217 res(i, 0) = vec.getX();
218 res(i, 1) = vec.getY();
219 res(i, 2) = vec.getZ();
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();
236 out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
245 auto& fbk =
feedbacks_[i].processorTemperature();
246 out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
256 out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
266 auto& cmd =
feedbacks_[i].actuator().deflection();
267 out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
276 auto& cmd =
feedbacks_[i].actuator().deflectionVelocity();
277 out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
286 auto& cmd =
feedbacks_[i].actuator().motorVelocity();
287 out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
296 auto& fbk =
feedbacks_[i].actuator().motorCurrent();
297 out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
306 auto& fbk =
feedbacks_[i].actuator().motorSensorTemperature();
307 out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
316 auto& fbk =
feedbacks_[i].actuator().motorWindingCurrent();
317 out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
327 auto& cmd =
feedbacks_[i].actuator().motorWindingTemperature();
328 out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
337 auto& cmd =
feedbacks_[i].actuator().motorHousingTemperature();
338 out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
348 auto& fbk =
feedbacks_[i].actuator().position();
349 out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
358 auto& fbk =
feedbacks_[i].actuator().velocity();
359 out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
368 auto& fbk =
feedbacks_[i].actuator().effort();
369 out[i] = (fbk) ? fbk.get() : std::numeric_limits<float>::quiet_NaN();
379 auto& cmd =
feedbacks_[i].actuator().positionCommand();
380 out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
389 auto& cmd =
feedbacks_[i].actuator().velocityCommand();
390 out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
399 auto& cmd =
feedbacks_[i].actuator().effortCommand();
400 out[i] = (cmd) ? cmd.get() : std::numeric_limits<float>::quiet_NaN();
410 auto& fbk =
feedbacks_[i].imu().accelerometer();
412 auto vec = fbk.get();
413 out(i, 0) = vec.getX();
414 out(i, 1) = vec.getY();
415 out(i, 2) = vec.getZ();
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();
431 auto vec = fbk.get();
432 out(i, 0) = vec.getX();
433 out(i, 1) = vec.getY();
434 out(i, 2) = vec.getZ();
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();
Eigen::VectorXd getVelocity() const
Convenience function for returning feedback velocity values.
Eigen::MatrixX3d getGyro() const
Convenience function for returning feedback gyroscope values.
size_t hebiGroupFeedbackGetSize(HebiGroupFeedbackPtr feedback)
Return the number of modules in this group Feedback.
Eigen::VectorXd getDeflection() const
Convenience function for returning feedback deflection values.
Eigen::VectorXd getVelocityCommand() const
Convenience function for returning commanded velocity values.
Eigen::VectorXd getMotorCurrent() const
Convenience function for returning feedback motor current values.
HebiGroupFeedbackPtr hebiGroupFeedbackCreate(size_t size)
Creates a GroupFeedback for a group with the specified number of modules.
Eigen::VectorXd getBoardTemperature() const
Convenience function for returning feedback board temperature values.
Eigen::VectorXd getPosition() const
Convenience function for returning feedback position values.
Eigen::VectorXd getEffort() const
Convenience function for returning feedback effort values.
Eigen::VectorXd getMotorWindingTemperature() const
Convenience function for returning feedback motor winding temperature values.
double getTime() const
Gets a single wall-clock timestamp (in seconds since the epoch) associated with the entire group feed...
Eigen::MatrixX3d getAccelerometer() const
Convenience function for returning feedback accelerometer values.
Feedback objects have various fields representing feedback from modules; which fields are populated d...
void hebiGroupFeedbackRelease(HebiGroupFeedbackPtr feedback)
Frees resources created by the GroupFeedback object.
const bool manage_pointer_lifetime_
Eigen::VectorXd getEffortCommand() const
Convenience function for returning commanded effort values.
Eigen::VectorXd getVoltage() const
Convenience function for returning feedback voltage values.
const Feedback & operator[](size_t index) const
Access the feedback for an individual module.
Eigen::VectorXd getMotorHousingTemperature() const
Convenience function for returning feedback motor housing temperature values.
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...
std::vector< Feedback > feedbacks_
HebiFeedbackPtr hebiGroupFeedbackGetModuleFeedback(HebiGroupFeedbackPtr feedback, size_t module_index)
Get an individual feedback for a particular module at index module_index.
size_t size() const
Returns the number of module feedbacks in this group feedback.
Eigen::VectorXd getPositionCommand() const
Convenience function for returning commanded position values.
HebiGroupFeedbackPtr internal_
const size_t number_of_modules_
struct HebiGroupFeedback_ * HebiGroupFeedbackPtr
The C-style's API representation of a feedback object for a group of modules.
Eigen::VectorXd getProcessorTemperature() const
Convenience function for returning feedback processor temperature values.
Eigen::VectorXd getMotorWindingCurrent() const
Convenience function for returning feedback motor winding current values.
~GroupFeedback() noexcept
Destructor cleans up group feedback object as necessary.
Eigen::VectorXd getMotorVelocity() const
Convenience function for returning feedback motor velocity values.
Eigen::VectorXd getDeflectionVelocity() const
Convenience function for returning feedback deflection velocity values.
Eigen::VectorXd getMotorSensorTemperature() const
Convenience function for returning feedback motor sensor temperature values.