9 #ifndef CROCODDYL_CORE_SQUASHING_SMOOTH_SAT_HPP_
10 #define CROCODDYL_CORE_SQUASHING_SMOOTH_SAT_HPP_
16 #include "crocoddyl/core/actuation/squashing-base.hpp"
17 #include "crocoddyl/core/fwd.hpp"
18 #include "crocoddyl/core/utils/exception.hpp"
22 template <
typename _Scalar>
25 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
27 typedef _Scalar Scalar;
31 typedef typename MathBase::VectorXs VectorXs;
34 const Eigen::Ref<const VectorXs>& u_ub,
43 smooth_ = Scalar(0.1);
45 d_ = (u_ub_ - u_lb_) * smooth_;
46 a_ = d_.array() * d_.array();
51 virtual void calc(
const boost::shared_ptr<SquashingDataAbstract>& data,
52 const Eigen::Ref<const VectorXs>& s) {
56 data->u = Scalar(0.5) *
57 (Eigen::sqrt(Eigen::pow((s - u_lb_).array(), 2) + a_.array()) -
58 Eigen::sqrt(Eigen::pow((s - u_ub_).array(), 2) + a_.array()) +
59 u_lb_.array() + u_ub_.array());
62 virtual void calcDiff(
const boost::shared_ptr<SquashingDataAbstract>& data,
63 const Eigen::Ref<const VectorXs>& s) {
64 data->du_ds.diagonal() =
66 (Eigen::pow(a_.array() + Eigen::pow((s - u_lb_).array(), 2),
70 Eigen::pow(a_.array() + Eigen::pow((s - u_ub_).array(), 2),
76 const Scalar get_smooth()
const {
return smooth_; };
77 void set_smooth(
const Scalar smooth) {
79 throw_pretty(
"Invalid argument: "
80 <<
"Smooth value has to be positive");
84 d_ = (u_ub_ - u_lb_) * smooth_;
85 a_ = d_.array() * d_.array();
91 const VectorXs& get_d()
const {
return d_; };