kinematic_limits.h
Go to the documentation of this file.
1 
26 #ifndef TESSERACT_COMMON_KINEMATIC_LIMITS_H
27 #define TESSERACT_COMMON_KINEMATIC_LIMITS_H
30 #include <Eigen/Core>
31 #include <Eigen/Geometry>
32 #include <boost/serialization/export.hpp>
33 #include <boost/serialization/base_object.hpp>
35 
36 namespace tesseract_common
37 {
38 struct Serialization;
39 
42 {
43  // LCOV_EXCL_START
44  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
45  // LCOV_EXCL_STOP
46 
48  Eigen::MatrixX2d joint_limits;
49 
51  Eigen::MatrixX2d velocity_limits;
52 
54  Eigen::MatrixX2d acceleration_limits;
55 
57  Eigen::MatrixX2d jerk_limits;
58 
59  void resize(Eigen::Index size);
60 
61  bool operator==(const KinematicLimits& rhs) const;
62  bool operator!=(const KinematicLimits& rhs) const;
63 
64 private:
67  template <class Archive>
68  void serialize(Archive& ar, const unsigned int version); // NOLINT
69 };
70 
77 template <typename FloatType>
78 bool isWithinLimits(const Eigen::Ref<const Eigen::Matrix<FloatType, Eigen::Dynamic, 1>>& values,
79  const Eigen::Ref<const Eigen::Matrix<FloatType, Eigen::Dynamic, 2>>& limits)
80 {
81  auto p = values.array();
82  auto l0 = limits.col(0).array();
83  auto l1 = limits.col(1).array();
84  return (!(p > l1).any() && !(p < l0).any());
85 }
86 
97 template <typename FloatType>
98 bool satisfiesLimits(const Eigen::Ref<const Eigen::Matrix<FloatType, Eigen::Dynamic, 1>>& values,
99  const Eigen::Ref<const Eigen::Matrix<FloatType, Eigen::Dynamic, 2>>& limits,
100  const Eigen::Ref<const Eigen::Matrix<FloatType, Eigen::Dynamic, 1>>& max_diff,
101  const Eigen::Ref<const Eigen::Matrix<FloatType, Eigen::Dynamic, 1>>& max_rel_diff)
102 {
103  auto p = values.array();
104  auto l0 = limits.col(0).array();
105  auto l1 = limits.col(1).array();
106  auto md = max_diff.array();
107  auto mrd = max_rel_diff.array();
108 
109  auto lower_diff_abs = (p - l0).abs();
110  auto lower_diff = (lower_diff_abs <= md);
111  auto lower_relative_diff = (lower_diff_abs <= mrd * (p.abs().max)(l0.abs()));
112  auto lower_check = p > l0 || lower_diff || lower_relative_diff;
113 
114  auto upper_diff_abs = (p - l1).abs();
115  auto upper_diff = (upper_diff_abs <= md);
116  auto upper_relative_diff = (upper_diff_abs <= mrd * (p.abs().max)(l1.abs()));
117  auto upper_check = p < l1 || upper_diff || upper_relative_diff;
118 
119  return (lower_check.all() && upper_check.all());
120 }
121 
132 template <typename FloatType>
133 bool satisfiesLimits(const Eigen::Ref<const Eigen::Matrix<FloatType, Eigen::Dynamic, 1>>& values,
134  const Eigen::Ref<const Eigen::Matrix<FloatType, Eigen::Dynamic, 2>>& limits,
135  FloatType max_diff = static_cast<FloatType>(1e-6),
136  FloatType max_rel_diff = std::numeric_limits<FloatType>::epsilon())
137 {
138  const auto eigen_max_diff = Eigen::Matrix<FloatType, Eigen::Dynamic, 1>::Constant(values.size(), max_diff);
139  const auto eigen_max_rel_diff = Eigen::Matrix<FloatType, Eigen::Dynamic, 1>::Constant(values.size(), max_rel_diff);
140  // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
141  return satisfiesLimits<FloatType>(values, limits, eigen_max_diff, eigen_max_rel_diff);
142 }
143 
149 template <typename FloatType>
150 void enforceLimits(Eigen::Ref<Eigen::Matrix<FloatType, Eigen::Dynamic, 1>> values,
151  const Eigen::Ref<const Eigen::Matrix<FloatType, Eigen::Dynamic, 2>>& limits)
152 {
153  values = ((values.array().min)(limits.col(1).array()).max)(limits.col(0).array());
154 }
155 } // namespace tesseract_common
156 
157 BOOST_CLASS_EXPORT_KEY(tesseract_common::KinematicLimits)
158 
159 #endif // TESSERACT_COMMON_KINEMATIC_LIMITS_H
tesseract_common::KinematicLimits::serialize
void serialize(Archive &ar, const unsigned int version)
Definition: kinematic_limits.cpp:58
tesseract_common::enforceLimits
void enforceLimits(Eigen::Ref< Eigen::Matrix< FloatType, Eigen::Dynamic, 1 >> values, const Eigen::Ref< const Eigen::Matrix< FloatType, Eigen::Dynamic, 2 >> &limits)
Enforce values to be within the provided limits.
Definition: kinematic_limits.h:150
tesseract_common
Definition: allowed_collision_matrix.h:19
tesseract_common::KinematicLimits::resize
void resize(Eigen::Index size)
Definition: kinematic_limits.cpp:37
tesseract_common::isWithinLimits
bool isWithinLimits(const Eigen::Ref< const Eigen::Matrix< FloatType, Eigen::Dynamic, 1 >> &values, const Eigen::Ref< const Eigen::Matrix< FloatType, Eigen::Dynamic, 2 >> &limits)
Check if within limits.
Definition: kinematic_limits.h:78
tesseract_common::KinematicLimits::operator==
bool operator==(const KinematicLimits &rhs) const
Definition: kinematic_limits.cpp:45
tesseract_common::KinematicLimits
Store kinematic limits.
Definition: kinematic_limits.h:41
macros.h
Common Tesseract Macros.
tesseract_common::KinematicLimits::access
friend class boost::serialization::access
Definition: kinematic_limits.h:65
tesseract_common::satisfiesLimits
bool satisfiesLimits(const Eigen::Ref< const Eigen::Matrix< FloatType, Eigen::Dynamic, 1 >> &values, const Eigen::Ref< const Eigen::Matrix< FloatType, Eigen::Dynamic, 2 >> &limits, const Eigen::Ref< const Eigen::Matrix< FloatType, Eigen::Dynamic, 1 >> &max_diff, const Eigen::Ref< const Eigen::Matrix< FloatType, Eigen::Dynamic, 1 >> &max_rel_diff)
Check if values are within bounds or relatively equal to a limit.
Definition: kinematic_limits.h:98
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
Definition: macros.h:71
tesseract_common::Serialization
Definition: serialization.h:97
tesseract_common::KinematicLimits::jerk_limits
Eigen::MatrixX2d jerk_limits
The jerk limits.
Definition: kinematic_limits.h:57
tesseract_common::KinematicLimits::operator!=
bool operator!=(const KinematicLimits &rhs) const
Definition: kinematic_limits.cpp:55
TESSERACT_COMMON_IGNORE_WARNINGS_POP
#define TESSERACT_COMMON_IGNORE_WARNINGS_POP
Definition: macros.h:72
tesseract_common::KinematicLimits::acceleration_limits
Eigen::MatrixX2d acceleration_limits
The acceleration limits.
Definition: kinematic_limits.h:54
tesseract_common::KinematicLimits::velocity_limits
Eigen::MatrixX2d velocity_limits
The velocity limits.
Definition: kinematic_limits.h:51
tesseract_common::KinematicLimits::joint_limits
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Eigen::MatrixX2d joint_limits
The position limits.
Definition: kinematic_limits.h:48


tesseract_common
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:01:40