Go to the documentation of this file.
26 #include <boost/multi_index/hashed_index.hpp>
27 #include <boost/multi_index/member.hpp>
28 #include <boost/multi_index/ordered_index.hpp>
29 #include <boost/multi_index/random_access_index.hpp>
30 #include <boost/multi_index_container.hpp>
39 #include <RobotAPI/interface/core/Trajectory.h>
82 using TrajMap = std::map<double, std::vector<DoubleSeqPtr>>;
97 data.resize(
s.data.size());
99 for (
auto& elem :
s.data)
101 data[i++].reset(
new Ice::DoubleSeq(*elem));
110 template <
class T =
double>
116 throw LocalException(
"Ptr to trajectory is NULL");
119 std::vector<T> result;
120 result.reserve(numDim);
121 for (std::size_t i = 0; i < numDim; ++i)
131 return getPositionsAs<double>();
143 throw LocalException(
"Ptr to trajectory is NULL");
146 for (std::size_t i = 0; i < numDim; ++i)
153 std::map<std::string, T>
156 std::map<std::string, T> result;
161 double getDeriv(
size_t dim,
size_t derivation)
const;
162 const std::vector<DoubleSeqPtr>&
getData()
const;
168 for (
size_t d = 0; d < rhs.
data.size(); ++d)
170 stream << (rhs.
data[d] && rhs.
data[d]->size() > 0
173 if (d <= rhs.
data.size() - 1)
182 mutable std::vector<DoubleSeqPtr>
data;
198 typedef boost::multi_index::multi_index_container<
200 boost::multi_index::indexed_by<
201 boost::multi_index::hashed_unique<
202 boost::multi_index::tag<TagTimestamp>,
203 boost::multi_index::member<TrajData, double, &TrajData::timestamp>>,
204 boost::multi_index::ordered_unique<
205 boost::multi_index::tag<TagOrdered>,
206 boost::multi_index::member<
213 typename boost::multi_index::index<TrajDataContainer, TagTimestamp>::type;
215 typename boost::multi_index::index<TrajDataContainer, TagOrdered>::type;
223 template <
typename T>
225 const Ice::DoubleSeq timestamps = Ice::DoubleSeq(),
226 const std::string& dimensionName =
"",
227 typename std::enable_if_t<std::is_arithmetic_v<T>>* t = 0)
229 if (
data.size() == 0)
233 Ice::DoubleSeq dvec(
data.begin(),
data.end());
244 template <
typename T>
246 const Ice::DoubleSeq timestamps = Ice::DoubleSeq(),
247 const Ice::StringSeq& dimensionNames = {})
249 if (
data.size() == 0)
253 const auto& tempTimestamps =
256 for (
const auto& subvec :
data)
258 Ice::DoubleSeq dvec(subvec.begin(), subvec.end());
260 dvec, tempTimestamps, i < dimensionNames.size() ? dimensionNames.at(i++) :
"");
264 template <
typename T>
266 const Ice::DoubleSeq timestamps = Ice::DoubleSeq(),
267 const Ice::StringSeq& dimensionNames = {})
269 this->dataVec =
data;
270 this->timestamps = timestamps;
271 this->dimensionNames = dimensionNames;
283 const Ice::DoubleSeq& timestamps = Ice::DoubleSeq(),
284 const std::string name =
"");
286 const Ice::DoubleSeq&
values,
287 const Ice::DoubleSeq& timestamps);
301 typename ordered_view::const_iterator
begin()
const;
302 typename ordered_view::const_iterator
end()
const;
303 typename ordered_view::const_reverse_iterator
rbegin()
const;
304 typename ordered_view::const_reverse_iterator
rend()
const;
307 std::vector<DoubleSeqPtr>&
operator[](
double timestamp);
310 std::vector<DoubleSeqPtr>&
getStates(
double t);
311 std::vector<DoubleSeqPtr>
getStates(
double t)
const;
312 Ice::DoubleSeq
getStates(
double t,
size_t derivation)
const;
314 template <
typename T>
315 std::map<std::string, T>
318 std::map<std::string, T> result;
319 size_t dimensions =
dim();
321 for (
size_t dim = 0;
dim < dimensions;
dim++)
329 double getState(
double t,
size_t dim = 0,
size_t derivation = 0);
330 double getState(
double t,
size_t dim = 0,
size_t derivation = 0)
const;
331 std::vector<Ice::DoubleSeq>
getAllStates(
double t,
int maxDeriv = 1);
332 Ice::DoubleSeq
getDerivations(
double t,
size_t dimension,
size_t derivations)
const;
344 Ice::DoubleSeq
getDimensionData(
size_t dimension,
size_t derivation = 0)
const;
349 double endTime)
const;
350 Eigen::MatrixXd
toEigen(
size_t derivation,
double startTime,
double endTime)
const;
351 Eigen::MatrixXd
toEigen(
size_t derivation = 0)
const;
353 getPart(
double startTime,
double endTime,
size_t numberOfDerivations = 0)
const;
374 double getLength(
size_t derivation = 0)
const;
375 double getLength(
size_t derivation,
double startTime,
double endTime)
const;
376 double getLength(
size_t dimension,
size_t derivation)
const;
378 getLength(
size_t dimension,
size_t derivation,
double startTime,
double endTime)
const;
383 double endTime)
const;
384 double getMax(
size_t dimension,
size_t derivation,
double startTime,
double endTime)
const;
385 double getMin(
size_t dimension,
size_t derivation,
double startTime,
double endTime)
const;
386 double getWithFunc(
const double& (*foo)(
const double&,
const double&),
391 double endTime)
const;
393 getAmplitude(
size_t dimension,
size_t derivation,
double startTime,
double endTime)
const;
404 getMinima(
size_t dimension,
size_t derivation,
double startTime,
double endTime)
const;
406 getMaxima(
size_t dimension,
size_t derivation,
double startTime,
double endTime)
const;
410 double endTime)
const;
414 double endTime)
const;
419 size_t derivation)
const;
421 const Ice::DoubleSeq&
values,
422 int derivationCount = 1);
429 size_t trajDimension,
430 size_t sourceDimOfSystemState,
431 size_t targetDimOfSystemState);
446 const double startTime = 0.0,
447 const double endTime = 1.0);
450 double maxAcceleration,
454 const Eigen::VectorXd& maxAccelerations,
458 const double startTime = 0.0,
459 const double endTime = 1.0);
460 static Ice::DoubleSeq
461 GenerateTimestamps(
double startTime = 0.0,
double endTime = 1.0,
double stepSize = 0.001);
463 template <
typename T>
464 static Ice::DoubleSeq
472 void scaleValue(
const Ice::DoubleSeq& factor);
478 void clear(
bool keepMetaData =
false);
479 void setPositionEntry(
const double t,
const size_t dimIndex,
const double& y);
480 void setEntries(
const double t,
const size_t dimIndex,
const Ice::DoubleSeq& y);
481 bool dataExists(
double t,
size_t dimension = 0,
size_t derivation = 0)
const;
484 std::map<double, Ice::DoubleSeq>
493 void serialize(
const ObjectSerializerBasePtr& obj,
494 const Ice::Current& = Ice::emptyCurrent)
const override;
496 const Ice::Current& = Ice::emptyCurrent)
override;
499 VariantDataClassPtr
clone(
const Ice::Current&
c = Ice::emptyCurrent)
const override;
501 std::string
output(
const Ice::Current&
c = Ice::emptyCurrent)
const override;
503 bool validate(
const Ice::Current&
c = Ice::emptyCurrent)
override;
510 dimensionNames = dimNames;
513 void setLimitless(
const LimitlessStateSeq& limitlessStates);
519 double __interpolate(
typename ordered_view::const_iterator itMap,
521 size_t derivation)
const;
523 typename ordered_view::iterator centerIt,
533 ordered_view::const_iterator itPrev,
534 ordered_view::const_iterator itNext,
536 size_t derivation)
const;
537 double __interpolate(
double t,
size_t dimension,
size_t derivation)
const;
VariantDataClassPtr clone(const Ice::Current &c=Ice::emptyCurrent) const override
double getTimestamp() const
TrajectoryPtr cloneMetaData() const
static void CopyMetaData(const Trajectory &source, Trajectory &destination)
Ice::DoubleSeq getMinimaTimestamps(size_t dimension, size_t derivation, double startTime, double endTime) const
double getMin(size_t dimension, size_t derivation, double startTime, double endTime) const
void gaussianFilter(double filterRadius)
gaussianFilter smoothes the trajectory
void scaleValue(const Ice::DoubleSeq &factor)
Eigen::VectorXd getPositionsAsVectorXd() const
double getSquaredLength(size_t dimension, size_t derivation) const
void addDerivationsToDimension(size_t dimension, const double t, const Ice::DoubleSeq &derivs)
TrajectoryPtr normalize(const double startTime=0.0, const double endTime=1.0)
friend std::ostream & operator<<(std::ostream &stream, const TrajData &rhs)
std::vector< Ice::DoubleSeq > getAllStates(double t, int maxDeriv=1)
void setLimitless(const LimitlessStateSeq &limitlessStates)
std::map< std::string, T > getPositionsAsNameValueMap() const
void negateDim(size_t trajDimension)
negateDim changes the sign of all values of the given dimension.
void clear(bool keepMetaData=false)
typename boost::multi_index::index< TrajDataContainer, TagTimestamp >::type timestamp_view
Ice::ObjectPtr ice_clone() const override
TrajDataContainer & data()
static Ice::DoubleSeq GenerateTimestamps(double startTime=0.0, double endTime=1.0, double stepSize=0.001)
std::vector< DoubleSeqPtr > data
TrajData & operator=(const TrajData &s)
void __fillAllEmptyFields()
Ice::DoubleSeq getDiscreteDifferentiationForDim(size_t trajDimension, size_t derivation) const
std::map< double, Ice::DoubleSeq > getStatesAround(double t, size_t derivation, size_t extend) const
double getState(double t, size_t dim=0, size_t derivation=0)
ordered_view::const_reverse_iterator rbegin() const
double getDiscretDifferentiationForDimAtT(double t, size_t trajDimension, size_t derivation) const
size_t addDimension(const Ice::DoubleSeq &values, const Ice::DoubleSeq ×tamps=Ice::DoubleSeq(), const std::string name="")
ordered_view::const_iterator end() const
std::vector< DoubleSeqPtr > & operator[](double timestamp)
Eigen::VectorXd getDimensionDataAsEigen(size_t dimension, size_t derivation) const
double getLength(size_t derivation=0) const
Returns the sum of a all subsequent distances of the entries in the trajectories over all dimensions.
std::vector< T > getPositionsAs() const
void writePositionsToNameValueMap(std::map< std::string, T > &map) const
ordered_view::const_reverse_iterator rend() const
TrajectoryPtr calculateTimeOptimalTrajectory(double maxVelocity, double maxAcceleration, double maxDeviation, IceUtil::Time const ×tep)
Ice::Int getType(const Ice::Current &c=Ice::emptyCurrent) const override
void ice_preMarshal() override
TrajectoryPtr getPart(double startTime, double endTime, size_t numberOfDerivations=0) const
TrajDataContainer dataMap
double getMax(size_t dimension, size_t derivation, double startTime, double endTime) const
void shiftValue(const Ice::DoubleSeq &shift)
ordered_view::const_iterator begin() const
Iterators that iterates in incremental order of the timestamps through the trajectory.
void removeDerivation(size_t derivation)
void reconstructFromDerivativeForDim(double valueAtFirstTimestamp, size_t trajDimension, size_t sourceDimOfSystemState, size_t targetDimOfSystemState)
double __gaussianFilter(double filterRadius, typename ordered_view::iterator centerIt, size_t trajNum, size_t dim)
static Ice::DoubleSeq GenerateTimestamps(const std::vector< T > &values)
void ice_postUnmarshal() override
std::string output(const Ice::Current &c=Ice::emptyCurrent) const override
std::map< double, std::vector< DoubleSeqPtr > > TrajMap
void differentiateDiscretly(size_t derivation)
Eigen::VectorXf getPositionsAsVectorXf() const
Ice::DoubleSeq getMinima(size_t dimension, size_t derivation, double startTime, double endTime) const
Calculate all minima.
std::string getDimensionName(size_t dim) const
void setDimensionNames(const Ice::StringSeq dimNames)
DoubleSeqPtr operator[](size_t dim) const
static Trajectory NormalizeTimestamps(const Trajectory &traj, const double startTime=0.0, const double endTime=1.0)
const Ice::StringSeq & getDimensionNames() const
void setEntries(const double t, const size_t dimIndex, const Ice::DoubleSeq &y)
std::vector< DoubleSeqPtr > __calcBaseDataAtTimestamp(const double &t) const
void differentiateDiscretlyForDim(size_t trajDimension, size_t derivation)
std::vector< DoubleSeqPtr > & getStates(double t)
typename boost::multi_index::index< TrajDataContainer, TagOrdered >::type ordered_view
std::map< std::string, T > getStatesMap(double t, size_t derivation=0) const
size_t size() const
Returns number of data entries (i.e.
Ice::DoubleSeq getDimensionData(size_t dimension, size_t derivation=0) const
getDimensionData gets all entries for one dimensions with order of increasing timestamps
Vertex source(const detail::edge_base< Directed, Vertex > &e, const PCG &)
void shiftTime(double shift)
armarx::core::time::DateTime Time
const std::string & to_string(const std::string &s)
void removeDimension(size_t dimension)
Ice::DoubleSeq getMaxima(size_t dimension, size_t derivation, double startTime, double endTime) const
Trajectory(const std::vector< std::vector< std::vector< T >>> &data, const Ice::DoubleSeq timestamps=Ice::DoubleSeq(), const Ice::StringSeq &dimensionNames={})
void addPositionsToDimension(size_t dimension, const Ice::DoubleSeq &values, const Ice::DoubleSeq ×tamps)
double getDeriv(size_t dim, size_t derivation) const
Trajectory & operator+=(const Trajectory traj)
static Ice::DoubleSeq DifferentiateDiscretly(const Ice::DoubleSeq ×tamps, const Ice::DoubleSeq &values, int derivationCount=1)
timestamp_view::iterator __fillBaseDataAtTimestamp(const double &t)
Eigen::MatrixXd toEigen(size_t derivation, double startTime, double endTime) const
boost::multi_index::multi_index_container< TrajData, boost::multi_index::indexed_by< boost::multi_index::hashed_unique< boost::multi_index::tag< TagTimestamp >, boost::multi_index::member< TrajData, double, &TrajData::timestamp > >, boost::multi_index::ordered_unique< boost::multi_index::tag< TagOrdered >, boost::multi_index::member< TrajData, double, &TrajData::timestamp > > > > TrajDataContainer
double getAmplitude(size_t dimension, size_t derivation, double startTime, double endTime) const
Ice::FloatSeq getTimestampsFloat() const
The Trajectory class represents n-dimensional sampled trajectories.
Trajectory & operator=(const Trajectory &source)
std::vector< double > getPositions() const
std::shared_ptr< Object > ObjectPtr
bool validate(const Ice::Current &c=Ice::emptyCurrent) override
size_t dim() const
dim returns the trajectory dimension count for this trajectory (e.g.
void serialize(const ObjectSerializerBasePtr &obj, const Ice::Current &=Ice::emptyCurrent) const override
double getTimeLength() const
Difference between biggest and smallest timestamp.
bool dataExists(double t, size_t dimension=0, size_t derivation=0) const
Ice::DoubleSeq getTimestamps() const
double getWithFunc(const double &(*foo)(const double &, const double &), double initValue, size_t dimension, size_t derivation, double startTime, double endTime) const
static void CopyData(const Trajectory &source, Trajectory &destination)
Ice::DoubleSeq getMaximaTimestamps(size_t dimension, size_t derivation, double startTime, double endTime) const
double getPosition(size_t dim) const
double s(double t, double s0, double v0, double a0, double j)
double __interpolate(typename ordered_view::const_iterator itMap, size_t dimension, size_t derivation) const
Ice::DoubleSeq getDerivations(double t, size_t dimension, size_t derivations) const
This file offers overloads of toIce() and fromIce() functions for STL container types.
Trajectory(const std::vector< std::vector< T >> &data, const Ice::DoubleSeq timestamps=Ice::DoubleSeq(), const Ice::StringSeq &dimensionNames={})
Constructor to add n-dimensions with m-values.
static VariantTypeId addTypeName(const std::string &typeName)
Register a new type for the use in a Variant.
std::shared_ptr< Ice::DoubleSeq > DoubleSeqPtr
const std::vector< DoubleSeqPtr > & getData() const
void deserialize(const ObjectSerializerBasePtr &, const Ice::Current &=Ice::emptyCurrent) override
LimitlessStateSeq getLimitless() const
void setPositionEntry(const double t, const size_t dimIndex, const double &y)
Trajectory(const std::vector< T > &data, const Ice::DoubleSeq timestamps=Ice::DoubleSeq(), const std::string &dimensionName="", typename std::enable_if_t< std::is_arithmetic_v< T >> *t=0)