25 #ifndef SRC_CORE_INCLUDE_CORBO_CORE_REFERENCE_TRAJECTORY_H_ 26 #define SRC_CORE_INCLUDE_CORBO_CORE_REFERENCE_TRAJECTORY_H_ 34 #ifdef MESSAGE_SUPPORT 35 #include <corbo-communication/messages/core/reference_trajectories.pb.h> 63 using Ptr = std::shared_ptr<ReferenceTrajectoryInterface>;
74 virtual bool isZero()
const {
return false; }
78 virtual void precompute(
const std::vector<double>& dt,
Time t) = 0;
86 virtual bool isCached(
double dt,
int n,
Time t)
const = 0;
87 virtual bool isCached(
const std::vector<double>& dt,
Time t)
const = 0;
89 #ifdef MESSAGE_SUPPORT 90 virtual void toMessage(corbo::messages::ReferenceTrajectory& message)
const {}
93 virtual void fromMessage(
const corbo::messages::ReferenceTrajectory& message, std::stringstream* issues =
nullptr) {}
98 #define FACTORY_REGISTER_REFERENCE_TRAJECTORY(type) FACTORY_REGISTER_OBJECT(type, ReferenceTrajectoryInterface) 115 using Ptr = std::shared_ptr<StaticReference>;
123 bool isZero()
const override {
return _ref.isZero(); }
138 bool isCached(
const std::vector<double>& ,
Time )
const override {
return true; }
141 #ifdef MESSAGE_SUPPORT 142 void toMessage(corbo::messages::ReferenceTrajectory& message)
const override;
143 void fromMessage(
const corbo::messages::ReferenceTrajectory& message, std::stringstream* issues =
nullptr)
override;
165 using Ptr = std::shared_ptr<ZeroReference>;
172 bool isZero()
const override {
return true; }
174 void setDimension(
int dimension) { setReference(Eigen::VectorXd::Zero(dimension)); }
176 #ifdef MESSAGE_SUPPORT 178 void toMessage(corbo::messages::ReferenceTrajectory& message)
const override;
179 void fromMessage(
const corbo::messages::ReferenceTrajectory& message, std::stringstream* issues =
nullptr)
override;
197 using Ptr = std::shared_ptr<SineReferenceTrajectory>;
201 : _amplitude(amplitude), _omega(omega), _offset(offset)
204 _cached_trajectory.resize(1);
212 bool isZero()
const override {
return false; }
217 if (_cached_dt.empty() || dt != _cached_dt[0] || n != _cached_trajectory.size() || t != _cached_t)
return false;
223 if (_cached_dt.empty() || dt.size() != _cached_dt.size() || t != _cached_t)
return false;
224 for (
int i = 0; i < dt.size(); ++i)
226 if (
std::abs(dt[i] - _cached_dt[i]) < 1e-15)
return false;
233 _cached_trajectory.resize(n);
237 for (
int i = 0; i <
n; ++i)
242 _cached_dt.resize(1);
249 _cached_trajectory.resize(dt.size() + 1);
254 for (
int i = 0; i < dt.size(); ++i)
266 ref(0) = _amplitude *
std::sin(_omega * t.
toSec() + _offset);
271 if (k >= _cached_trajectory.size())
273 PRINT_ERROR(
"SineReferenceTrajectory::getReferenceCached: k is not a valid index for cached reference. Returning zero value");
277 return _cached_trajectory.at(k);
282 PRINT_ERROR_ONCE(
"SineReferenceTrajectory: No steady state in periodic reference. Returning zero value.");
287 void setParameters(
const double& amplitude,
const double& omega,
const double offset)
289 _amplitude = amplitude;
295 double _amplitude = 1;
303 #ifdef MESSAGE_SUPPORT 305 void toMessage(corbo::messages::ReferenceTrajectory& message)
const override;
306 void fromMessage(
const corbo::messages::ReferenceTrajectory& message, std::stringstream* issues =
nullptr)
override;
324 using Ptr = std::shared_ptr<DiscreteTimeReferenceTrajectory>;
329 setTrajectory(trajectory);
334 bool isStatic()
const override {
return _trajectory && _trajectory->getTimeDimension() == 1; }
337 if (!_trajectory || _trajectory->getValueDimension() == 0)
return false;
339 return std::all_of(_trajectory->getValues().begin(), _trajectory->getValues().end(), [](
double i) {
return (i < 1e-9 && i > -1e-9); });
341 int getDimension()
const override {
return _trajectory ? _trajectory->getValueDimension() : 0; }
345 if (_cached_dt.empty() || dt != _cached_dt[0] || n != _cached_trajectory.size() || t != _cached_t)
return false;
351 if (_cached_dt.empty() || dt.size() != _cached_dt.size() || t != _cached_t)
return false;
352 for (
int i = 0; i < dt.size(); ++i)
354 if (
std::abs(dt[i] - _cached_dt[i]) < 1e-15)
return false;
361 _cached_trajectory.resize(n);
365 for (
int i = 0; i <
n; ++i)
370 _cached_dt.resize(1);
377 _cached_trajectory.resize(dt.size() + 1);
382 for (
int i = 0; i < dt.size(); ++i)
393 if (!_trajectory || _trajectory->getValueDimension() == 0)
395 PRINT_ERROR(
"DiscreteTimeReferenceTrajectory: trajectory is empty.");
399 double time = t.
toSec() - _trajectory->getTimeFromStart();
401 ref.resize(_trajectory->getValueDimension());
403 if (time <= 0 || _trajectory->getTimeDimension() ==
405 ref = _trajectory->getValuesMap(0);
406 else if (time >= _trajectory->getFinalTime())
407 ref = _trajectory->getValuesMap(_trajectory->getTimeDimension() - 1);
414 if (k >= _cached_trajectory.size())
417 "DiscreteTimeReferenceTrajectory::getReferenceCached: k is not a valid index for cached reference. Returning next steady state");
418 return _next_steady_state;
421 return _cached_trajectory[k];
428 setTrajectory(trajectory);
429 _interpolation = interpolation;
434 if (!trajectory || trajectory->getValueDimension() == 0)
436 PRINT_ERROR(
"DiscreteTimeReferenceTrajectory must be initialized with at least one point in trajectory");
440 _trajectory = trajectory;
441 _next_steady_state = trajectory->getValuesMap(trajectory->getTimeDimension() - 1);
444 _cached_trajectory.resize(1);
445 _cached_trajectory[0] = trajectory->getValuesMap(0);
450 if (_trajectory) _trajectory->setTimeFromStart(time_from_start.
toSec());
457 #ifdef MESSAGE_SUPPORT 459 void toMessage(corbo::messages::ReferenceTrajectory& message)
const override;
460 void fromMessage(
const corbo::messages::ReferenceTrajectory& message, std::stringstream* issues =
nullptr)
override;
486 using Ptr = std::shared_ptr<BlindDiscreteTimeReferenceTrajectory>;
491 setTrajectory(trajectory);
496 bool isStatic()
const override {
return _trajectory && _trajectory->getTimeDimension() == 1; }
499 if (!_trajectory || _trajectory->getValueDimension() == 0)
return false;
501 return std::all_of(_trajectory->getValues().begin(), _trajectory->getValues().end(), [](
double i) {
return (i < 1e-9 && i > -1e-9); });
503 int getDimension()
const override {
return _trajectory ? _trajectory->getValueDimension() : 0; }
507 if (_output_cache.size() !=
getDimension() || t != _cached_t)
return false;
513 if (_output_cache.size() !=
getDimension() || t != _cached_t)
return false;
531 if (!_trajectory || _trajectory->getValueDimension() == 0)
533 PRINT_ERROR(
"BlindDiscreteTimeReferenceTrajectory: trajectory is empty.");
537 double time = t.
toSec() - _trajectory->getTimeFromStart();
539 ref.resize(_trajectory->getValueDimension());
541 if (time <= 0 || _trajectory->getTimeDimension() == 1)
542 ref = _trajectory->getValuesMap(0);
543 else if (time >= _trajectory->getFinalTime())
544 ref = _trajectory->getValuesMap(_trajectory->getTimeDimension() - 1);
555 setTrajectory(trajectory);
556 _interpolation = interpolation;
561 if (!trajectory || trajectory->getValueDimension() == 0)
563 PRINT_ERROR(
"BlindDiscreteTimeReferenceTrajectory must be initialized with at least one point in trajectory");
567 _trajectory = trajectory;
568 _next_steady_state = trajectory->getValuesMap(trajectory->getTimeDimension() - 1);
573 if (_trajectory) _trajectory->setTimeFromStart(time_from_start.
toSec());
580 #ifdef MESSAGE_SUPPORT 582 void toMessage(corbo::messages::ReferenceTrajectory& message)
const override;
583 void fromMessage(
const corbo::messages::ReferenceTrajectory& message, std::stringstream* issues =
nullptr)
override;
597 #endif // SRC_CORE_INCLUDE_CORBO_CORE_REFERENCE_TRAJECTORY_H_ ReferenceTrajectoryInterface::Ptr getInstance() const override
const OutputVector & getReferenceCached(int k) const override
int getDimension() const override
Time Series (trajectory resp. sequence of values w.r.t. time)
SineReferenceTrajectory()
void setTrajectory(TimeSeries::Ptr trajectory, TimeSeries::Interpolation interpolation)
void setDimension(int dimension)
bool isCached(double dt, int n, Time t) const override
TimeSeries::Ptr _trajectory
bool isCached(const std::vector< double > &dt, Time t) const override
bool isStatic() const override
void precompute(double dt, int n, Time t) override
void precompute(double dt, int n, Time t) override
void setTrajectory(TimeSeries::Ptr trajectory, TimeSeries::Interpolation interpolation)
void precompute(const std::vector< double > &, Time) override
void precompute(double dt, int n, Time t) override
Interpolation
List of available interpolation methods.
void fromSec(double t)
Set duration from seconds (see Duration(double t))
bool isStatic() const override
const OutputVector & getNextSteadyState(const Time &t) override
void getReference(const Time &t, OutputVector &ref) const override
bool isCached(const std::vector< double > &dt, Time t) const override
BlindDiscreteTimeReferenceTrajectory(TimeSeries::Ptr trajectory, TimeSeries::Interpolation interpolation)
virtual int getDimension() const =0
void precompute(double, int, Time) override
void setTrajectory(TimeSeries::Ptr trajectory)
virtual bool isStatic() const =0
const TimeSeries::Ptr & getReferenceTrajectory()
Sine reference trajectory.
void setTimeFromStart(const Time &time_from_start)
OutputVector _output_cache
Representation of time stamps.
std::vector< double > _cached_dt
void getReference(const Time &t, OutputVector &ref) const override
bool isCached(double dt, int n, Time t) const override
bool isCached(double dt, int n, Time t) const override
virtual const OutputVector & getReferenceCached(int k) const =0
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const AbsReturnType abs() const
void precompute(const std::vector< double > &dt, Time t) override
ReferenceTrajectoryInterface::Ptr getInstance() const override
TimeSeries::Ptr _trajectory
#define PRINT_ERROR_ONCE(msg)
Print msg-stream only once.
#define FACTORY_REGISTER_REFERENCE_TRAJECTORY(type)
const OutputVector & getNextSteadyState(const Time &t) override
void getReference(const Time &, OutputVector &ref) const override
const OutputVector & getReferenceCached(int) const override
DiscreteTimeReferenceTrajectory()
const OutputVector & getNextSteadyState(const Time &t) override
const OutputVector & getReferenceCached(int k) const override
bool isZero() const override
void setParameters(const double &litude, const double &omega, const double offset)
void getReference(const Time &t, OutputVector &ref) const override
ReferenceTrajectoryInterface::Ptr getInstance() const override
Zero reference trajectory.
SineReferenceTrajectory(const double &litude, const double &omega, const double offset)
void setInterpolationMethod(TimeSeries::Interpolation interpolation)
void setTimeFromStart(const Time &time_from_start)
std::vector< double > _cached_dt
StaticReference(const Eigen::Ref< const OutputVector > &ref)
static Factory & instance()
< Retrieve static instance of the factory
const TimeSeries::Ptr & getReferenceTrajectory()
bool isZero() const override
bool isZero() const override
bool isCached(const std::vector< double > &dt, Time t) const override
bool isStatic() const override
Eigen::VectorXd OutputVector
A matrix or vector expression mapping an existing expression.
void setInterpolationMethod(TimeSeries::Interpolation interpolation)
std::vector< OutputVector > _cached_trajectory
virtual bool isZero() const
bool isStatic() const override
bool isCached(const std::vector< double > &, Time) const override
ReferenceTrajectoryInterface::Ptr getInstance() const override
BlindDiscreteTimeReferenceTrajectory()
double toSec() const
Cast time stamp to seconds.
int getDimension() const override
OutputVector _next_steady_state
Interface class for reference trajectories.
bool isCached(double, int, Time) const override
ZeroReference(int dimension)
void precompute(const std::vector< double > &dt, Time t) override
OutputVector _next_steady_state
bool isZero() const override
std::shared_ptr< ReferenceTrajectoryInterface > Ptr
discrete time reference trajectory in which the precompute step is not aware of the trajectory ...
virtual bool isCached(double dt, int n, Time t) const =0
void precompute(const std::vector< double > &dt, Time t) override
virtual const OutputVector & getNextSteadyState(const Time &t)=0
virtual void getReference(const Time &t, OutputVector &ref) const =0
static Factory< ReferenceTrajectoryInterface > & getFactory()
Get access to the associated factory.
ReferenceTrajectoryInterface::Ptr getInstance() const override
Static reference trajectory.
std::shared_ptr< TimeSeries > Ptr
discrete time reference trajectory
virtual void precompute(double dt, int n, Time t)=0
void setTrajectory(TimeSeries::Ptr trajectory)
virtual ~ReferenceTrajectoryInterface()=default
void setReference(const Eigen::Ref< const OutputVector > &ref)
Representation of time durations.
bool isZero() const override
DiscreteTimeReferenceTrajectory(TimeSeries::Ptr trajectory, TimeSeries::Interpolation interpolation)
int getDimension() const override
const OutputVector & getNextSteadyState(const Time &t) override
virtual Ptr getInstance() const =0
const OutputVector & getReferenceCached(int k) const override
std::vector< OutputVector > _cached_trajectory
EIGEN_DEVICE_FUNC const SinReturnType sin() const
#define PRINT_ERROR(msg)
Print msg-stream as error msg.
int getDimension() const override