10 #include <mpark/variant.hpp>
24 template<
class TD,
class TDImpl =
typename TD::Impl>
28 using Bounds = mpark::variant<double, Eigen::VectorXd>;
33 template<
typename... Args>
36 const Eigen::VectorXd & rhs,
44 const Eigen::VectorXd &
min()
const {
return min_; }
51 Eigen::VectorXd &
min() {
return min_; }
53 const Eigen::VectorXd &
max()
const {
return max_; }
60 Eigen::VectorXd &
max() {
return max_; }
73 template<
typename... Args>
74 Clamped(
double max, Args &&... args);
83 template<
typename... Args>
84 Clamped(
const std::pair<double, double> & minMax, Args &&... args);
92 template<
typename... Args>
102 template<
typename... Args>
103 Clamped(
const std::pair<VectorConstRef, VectorConstRef> & minMax, Args &&... args);
110 const Eigen::VectorXd & rhs)
const override
111 {
return TD::template impl_<Impl>(f, t, rhs, min_, max_); }
120 template<
class TD,
class TDImpl>
121 template<
typename... Args>
123 :
Clamped<TD, TDImpl>({-max, max}, std::forward<Args>(args)...)
126 template<
class TD,
class TDImpl>
127 template<
typename... Args>
129 : TD(
std::forward<Args>(args)...), min_(minMax.first), max_(minMax.second)
131 const auto & [min, max] = minMax;
134 throw std::runtime_error(
"[task_dynamics::Clamped] Minimum values must be negative.");
138 throw std::runtime_error(
"[task_dynamics::Clamped] Maximum values must be positive.");
142 template<
class TD,
class TDImpl>
143 template<
typename... Args>
145 :
Clamped<TD>({-max, max}, std::forward<Args>(args)...)
148 template<
class TD,
class TDImpl>
149 template<
typename... Args>
151 : TD(
std::forward<Args>(args)...), min_(minMax.first), max_(minMax.second)
153 const auto & [min, max] = minMax;
154 if(min.size() != max.size())
156 throw std::runtime_error(
"[task_dynamics::Clamped] The minimum and maximum must have the same size.");
158 if((min.array() > 0).any())
160 throw std::runtime_error(
"[task_dynamics::Clamped] Minimum values must be negative.");
162 if((max.array() < 0).any())
164 throw std::runtime_error(
"[task_dynamics::Clamped] Maximum values must be positive.");
168 template<
class TD,
class TDImpl>
169 template<
typename... Args>
172 const Eigen::VectorXd & rhs,
176 : TDImpl(f, t, rhs,
std::forward<Args>(args)...),
177 min_(min.index() == 1 ? mpark::get<
Eigen::VectorXd>(min)
178 :
Eigen::VectorXd::
Constant(f->size(), mpark::get<double>(min))),
179 max_(max.index() == 1 ? mpark::get<
Eigen::VectorXd>(max)
180 :
Eigen::VectorXd::
Constant(f->size(), mpark::get<double>(max)))
182 if(min_.size() != f->size() || max_.size() != f->size())
184 throw std::runtime_error(
185 "[task_dynamics::Clamped::Impl] Sizes of the minimum, maximum and function must be the same.");
187 if((min_.array() > 0).any())
189 throw std::runtime_error(
"[task_dynamics::Clamped::Impl] Minimum values must be negative.");
191 if((max_.array() < 0).any())
193 throw std::runtime_error(
"[task_dynamics::Clamped::Impl] Maximum values must be positive.");
197 template<
class TD,
class TDImpl>
200 TDImpl::updateValue();
202 for(
int i = 0; i < this->
function().size(); ++i)
204 if(this->value_[i] > max_[i])
207 s = std::min(s, max_[i] / this->value_[i]);
209 else if(this->value_[i] < min_[i])
212 s = std::min(s, min_[i] / this->value_[i]);
#define COMPOSABLE_TASK_DYNAMICS_DERIVED_FACTORY(T,...)
Definition: TaskDynamics.h:82
const Eigen::VectorXd & min() const
Definition: Clamped.h:44
const Eigen::VectorXd & max() const
Definition: Clamped.h:53
Eigen::VectorXd & min()
Definition: Clamped.h:51
Impl(FunctionPtr f, constraint::Type t, const Eigen::VectorXd &rhs, const Bounds &min, const Bounds &max, Args &&... args)
Definition: Clamped.h:170
void updateValue() override
Definition: Clamped.h:198
Eigen::VectorXd & max()
Definition: Clamped.h:60
mpark::variant< double, Eigen::VectorXd > Bounds
Definition: Clamped.h:28
~Clamped() override=default
Clamped(double max, Args &&... args)
Definition: Clamped.h:122
std::unique_ptr< abstract::TaskDynamicsImpl > impl_(FunctionPtr f, constraint::Type t, const Eigen::VectorXd &rhs) const override
Definition: Clamped.h:108
Definition: Constant.h:16
Definition: AffineExprDetail.h:95
Type
Definition: enums.h:15
std::shared_ptr< function::abstract::Function > FunctionPtr
Definition: defs.h:57
Eigen::Ref< const Eigen::VectorXd > VectorConstRef
Definition: defs.h:50