29#include <VirtualRobot/TimeOptimalTrajectory/TimeOptimalTrajectory.h>
48 dataVec.reserve(
dim());
49 for (
const auto& it : *
this)
51 std::vector<DoubleSeqPtr>&
data = it.data;
52 DoubleSeqSeq new2DVec;
53 new2DVec.reserve(
data.size());
58 new2DVec.emplace_back(*subVec);
62 new2DVec.emplace_back(Ice::DoubleSeq());
65 dataVec.emplace_back(new2DVec);
75 for (DoubleSeqSeq& _2DVec : dataVec)
78 double t = timestamps.at(i);
80 for (
auto& vec : _2DVec)
93 Ice::StringSeq columnContent;
97 for (
int col = 0; col < cols; col++)
101 for (
int row = 0; row < rows; row++)
103 ss << m(row, col) << (row < rows - 1 ?
"," :
"");
106 columnContent.push_back(ss.str());
109 obj->setStringArray(
"dimensionData", columnContent);
110 obj->setStringArray(
"dimensionNames", dimensionNames);
118 Ice::StringSeq rowContent;
119 obj->getStringArray(
"dimensionData", rowContent);
121 Ice::DoubleSeq timestamps;
122 obj->getDoubleArray(
"timestamps", timestamps);
123 for (
const auto& row : rowContent)
125 Ice::StringSeq values =
Split(row,
",");
126 Ice::DoubleSeq newRow;
127 newRow.reserve(values.size());
128 for (std::string v : values)
130 newRow.push_back(atof(v.c_str()));
134 obj->getStringArray(
"dimensionNames", dimensionNames);
156 typename ordered_view::const_iterator itMap = ordv.begin();
158 s <<
"Dimensions names: \n";
159 for (
size_t i = 0; i < dimensionNames.size(); i++)
161 s << dimensionNames.at(i)
162 << (i < limitless.size() && limitless.at(i).enabled ?
" Limitless " :
"") <<
"\n";
165 for (; itMap != ordv.end(); itMap++)
167 s << *itMap << std::endl;
192 armarx::Serializable(source),
193 armarx::VariantDataClass(source),
194 TrajectoryBase(source)
201 if (
data.size() == 0)
206 typename std::map<double, Ice::DoubleSeq>::const_iterator it =
data.begin();
208 for (; it !=
data.end(); it++)
212 const Ice::DoubleSeq& dataVec = it->second;
214 for (
double i : dataVec)
217 dataEntry.
data.push_back(std::make_shared<Ice::DoubleSeq>(1, i));
219 dataMap.insert(std::move(dataEntry));
241 throw LocalException() <<
"dimension is to big: " <<
dim <<
" max: " << this->
dim();
244 typename timestamp_view::iterator it =
dataMap.find(t);
246 if (it ==
dataMap.end() ||
dim >= it->data.size() || !it->data.at(
dim) ||
247 it->data.at(
dim)->size() <= derivation)
254 if (it->data.size() <=
dim)
258 throw LocalException() <<
"std::vector ptr is not the correct size!? " <<
VAROUT(
dim)
259 <<
VAROUT(it->data.size());
262 if (!it->data.at(
dim))
265 throw LocalException() <<
"std::vector ptr is NULL!?";
269 std::vector<DoubleSeqPtr>& vec = it->data;
271 if (derivation != 0 && vec.at(
dim)->size() <= derivation)
277 size_t curDeriv = vec.at(
dim)->size();
279 vec.at(
dim)->resize(derivation + 1);
281 while (curDeriv <= derivation)
285 vec.at(
dim)->at(curDeriv) = derivValue;
293 double result = vec.at(
dim)->at(derivation);
304 throw LocalException() <<
"dimension is to big: " <<
dim <<
" max: " << this->
dim();
307 typename timestamp_view::iterator it =
dataMap.find(t);
323 double result = it->data.at(
dim)->at(derivation);
332 std::vector<Ice::DoubleSeq>
335 std::vector<Ice::DoubleSeq> res;
337 for (
size_t i = 0; i <
dim(); i++)
339 Ice::DoubleSeq curdata;
341 for (
int deri = 0; deri <= maxDeriv; deri++)
343 curdata.push_back(
getState(t, i, deri));
346 res.push_back(curdata);
355 if (dimension >=
dim())
357 throw LocalException()
358 <<
"Dimension out of bounds: requested: " << dimension <<
" available: " <<
dim();
361 Ice::DoubleSeq result;
363 for (
size_t i = 0; i <= derivations; i++)
365 result.push_back(
getState(t, dimension, i));
374 return dimensionNames.at(
dim);
377 const Ice::StringSeq&
380 return dimensionNames;
392 if (dimension >=
dim())
394 throw LocalException(
"dimension is out of range: ")
395 << dimension <<
" actual dimensions: " <<
dim();
398 Ice::DoubleSeq result;
401 typename ordered_view::const_iterator itMap = ordv.begin();
403 for (; itMap != ordv.end(); itMap++)
406 result.push_back(itMap->getDeriv(dimension, derivation));
419 dimension, derivation,
begin()->getTimestamp(),
rbegin()->getTimestamp());
426 double endTime)
const
428 if (dimension >=
dim())
430 throw LocalException(
"dimension is out of range: ")
431 << dimension <<
" actual dimensions: " <<
dim();
434 Ice::DoubleSeq result;
437 ordered_view::iterator itO = ordv.lower_bound(startTime);
438 ordered_view::iterator itOEnd = ordv.upper_bound(endTime);
442 for (; itO != itOEnd && i <
size(); itO++, i++)
445 result.push_back(itO->getDeriv(dimension, derivation));
450 Eigen::VectorXd resultVec(result.size());
451 for (
size_t i = 0; i < result.size(); i++)
453 resultVec(i) = result[i];
461 Eigen::MatrixXd result(
size(),
dim());
464 ordered_view::iterator itO = ordv.lower_bound(startTime);
465 ordered_view::iterator itOEnd = ordv.upper_bound(endTime);
469 for (; itO != itOEnd; itO++, i++)
472 for (
size_t d = 0; d < itO->data.size(); d++)
474 result(i, d) = (itO->getDeriv(d, derivation));
486 return Eigen::MatrixXd();
497 ordered_view::iterator itO = ordv.lower_bound(startTime);
498 ordered_view::iterator itOEnd = ordv.upper_bound(endTime);
502 for (; itO != itOEnd; itO++, i++)
505 for (
size_t d = 0; d < itO->data.size(); d++)
507 Ice::DoubleSeq derivs;
508 for (
size_t i = 0; i < numberOfDerivations + 1; i++)
510 derivs.push_back(itO->getDeriv(d, i));
513 result->addDerivationsToDimension(d, itO->getTimestamp(), derivs);
530 return dataMap.begin()->data.size();
545 if (ordView.begin() != ordView.end())
547 return ordView.rbegin()->timestamp - ordView.begin()->timestamp;
570 ordered_view::const_iterator itO = ordv.lower_bound(startTime);
571 ordered_view::const_iterator itOEnd = ordv.upper_bound(endTime);
572 if (itO == ordv.end())
576 size_t dimensions =
dim();
577 Ice::DoubleSeq prevValue(dimensions);
578 for (
size_t d = 0; d < dimensions; ++d)
580 prevValue[d] =
getState(startTime, d, derivation);
585 double segmentLength = 0;
586 for (; itO != itOEnd && itO != ordv.end(); itO++)
588 if (itO->getTimestamp() >= endTime)
594 for (
size_t d = 0; d < dimensions; ++d)
596 value = itO->getDeriv(d, derivation);
597 double diff = value - prevValue[d];
598 segmentLength += diff * diff;
599 prevValue[d] = value;
601 length += sqrt(segmentLength);
605 for (
size_t d = 0; d < dimensions; ++d)
607 double value =
getState(endTime, d, derivation);
608 double diff = value - prevValue[d];
609 segmentLength += diff * diff;
610 prevValue[d] = value;
612 length += sqrt(segmentLength);
630 double endTime)
const
634 ordered_view::iterator itO = ordv.lower_bound(startTime);
635 ordered_view::iterator itOEnd = ordv.upper_bound(endTime);
636 if (itO == ordv.end())
640 double prevValue =
getState(startTime, dimension, derivation);
642 for (; itO != itOEnd && itO != ordv.end(); itO++)
644 if (itO->getTimestamp() >= endTime)
648 length += fabs(prevValue - itO->getDeriv(dimension, derivation));
649 prevValue = itO->getDeriv(dimension, derivation);
651 length += fabs(prevValue -
getState(endTime, dimension, derivation));
659 dimension, derivation,
begin()->getTimestamp(),
rbegin()->getTimestamp());
666 double endTime)
const
670 ordered_view::iterator itO = ordv.lower_bound(startTime);
671 ordered_view::iterator itOEnd = ordv.upper_bound(endTime);
672 if (itO == ordv.end())
677 double prevValue = itO->getDeriv(dimension, derivation);
679 for (; itO != itOEnd; itO++)
681 length += fabs(pow(prevValue, 2.0) - pow(itO->getDeriv(dimension, derivation), 2.0));
682 prevValue = itO->getDeriv(dimension, derivation);
692 -std::numeric_limits<double>::max(),
703 std::numeric_limits<double>::max(),
716 double endTime)
const
718 double bestValue = initValue;
720 ordered_view::iterator itO = ordv.lower_bound(startTime);
721 ordered_view::iterator itOEnd = ordv.upper_bound(endTime);
723 if (itO == ordv.end())
727 for (; itO != itOEnd; itO++)
729 bestValue = foo(bestValue, itO->getDeriv(dimension, derivation));
739 double endTime)
const
741 return getMax(dimension, derivation, startTime, endTime) -
742 getMin(dimension, derivation, startTime, endTime);
749 double endTime)
const
751 Ice::DoubleSeq result;
753 ordered_view::iterator itO = ordv.lower_bound(startTime);
754 ordered_view::iterator itOEnd = ordv.upper_bound(endTime);
756 if (itO == ordv.end())
760 double preValue = itO->getDeriv(dimension, derivation);
761 for (; itO != itOEnd;
766 double cur = itO->getDeriv(dimension, derivation);
768 if (itO == ordv.end())
772 double next = itO->getDeriv(dimension, derivation);
773 if (cur <= preValue && cur <= next)
775 result.push_back(cur);
787 double endTime)
const
789 Ice::DoubleSeq result;
791 ordered_view::iterator itO = ordv.lower_bound(startTime);
792 ordered_view::iterator itOEnd = ordv.upper_bound(endTime);
794 if (itO == ordv.end())
798 double preValue = itO->getDeriv(dimension, derivation);
799 for (; itO != itOEnd;
804 double cur = itO->getDeriv(dimension, derivation);
806 if (itO == ordv.end())
810 double next = itO->getDeriv(dimension, derivation);
811 if (cur <= preValue && cur <= next)
813 result.push_back(itO->getTimestamp());
825 double endTime)
const
827 Ice::DoubleSeq result;
829 ordered_view::iterator itO = ordv.lower_bound(startTime);
830 ordered_view::iterator itOEnd = ordv.upper_bound(endTime);
832 if (itO == ordv.end())
836 double preValue = itO->getDeriv(dimension, derivation);
837 for (; itO != itOEnd;
841 double cur = itO->getDeriv(dimension, derivation);
843 if (itO == ordv.end())
847 double next = itO->getDeriv(dimension, derivation);
848 if (cur >= preValue && cur >= next)
850 result.push_back(cur);
862 double endTime)
const
864 Ice::DoubleSeq result;
866 ordered_view::iterator itO = ordv.lower_bound(startTime);
867 ordered_view::iterator itOEnd = ordv.upper_bound(endTime);
869 if (itO == ordv.end())
873 double preValue = itO->getDeriv(dimension, derivation);
874 for (; itO != itOEnd;
878 double cur = itO->getDeriv(dimension, derivation);
880 if (itO == ordv.end())
884 double next = itO->getDeriv(dimension, derivation);
886 if (cur >= preValue && cur >= next)
888 result.push_back(itO->getTimestamp());
896 std::vector<DoubleSeqPtr>
903 std::vector<DoubleSeqPtr> result;
905 for (
size_t dimension = 0; dimension <
dim(); dimension++)
909 result.push_back(std::make_shared<Ice::DoubleSeq>(1, newValue));
918 typename timestamp_view::iterator it =
dataMap.find(t);
920 if (it ==
dataMap.end() || !it->data.at(dimension) ||
921 it->data.at(dimension)->size() <= derivation)
931 Trajectory::timestamp_view::iterator
934 typename timestamp_view::const_iterator it =
dataMap.find(t);
936 if (it !=
dataMap.end() && it->data.size() ==
dim())
938 bool foundEmpty =
false;
940 for (
auto& i : it->data)
942 if (!i || i->empty())
970 std::vector<DoubleSeqPtr>&
973 typename timestamp_view::const_iterator it =
dataMap.find(t);
985 std::vector<DoubleSeqPtr>
988 typename timestamp_view::const_iterator it =
dataMap.find(t);
1003 size_t dimensions =
dim();
1004 Ice::DoubleSeq result;
1005 result.reserve(dimensions);
1006 for (
size_t i = 0; i < dimensions; i++)
1008 result.push_back(
getState(t, i, derivation));
1014 std::map<double, Ice::DoubleSeq>
1018 std::map<double, Ice::DoubleSeq> res;
1019 typename timestamp_view::iterator itMap =
dataMap.find(t);
1023 for (
size_t i = 0; i <
dim(); i++)
1025 res.insert(std::pair<double, Ice::DoubleSeq>(t, {itMap->data[i]->at(derivation)}));
1033 typename ordered_view::iterator itNext = ordv.upper_bound(t);
1035 typename ordered_view::iterator itPrev = itNext;
1039 if (itPrev == ordv.end())
1042 throw LocalException(
"Cannot find value at timestamp ") << t;
1045 for (
size_t i = 0; i < extend; i++)
1047 Ice::DoubleSeq preData =
getStates(itPrev->timestamp, derivation);
1048 Ice::DoubleSeq nexData =
getStates(itNext->timestamp, derivation);
1050 res.insert(std::pair<double, Ice::DoubleSeq>(itPrev->timestamp, preData));
1051 res.insert(std::pair<double, Ice::DoubleSeq>(itNext->timestamp, nexData));
1053 if (itPrev == ordv.begin() || itNext == ordv.end())
1055 std::cout <<
"Warning: the timestamp is out of the range. "
1056 <<
"The current result will be returned" << std::endl;
1069 size_t dims = traj.
dim();
1072 for (
size_t d = 0; d < dims; ++d)
1083 size_t newDim =
dim() + 1;
1085 typename timestamp_view::iterator itMap =
dataMap.begin();
1087 for (; itMap !=
dataMap.end(); itMap++)
1089 itMap->data.resize(newDim);
1096 typename timestamp_view::iterator itMap =
dataMap.find(t);
1103 newData.
data = std::vector<DoubleSeqPtr>(std::max((
size_t)1,
dim()));
1104 newData.
data[dimIndex] = std::make_shared<Ice::DoubleSeq>(y);
1105 dataMap.insert(std::move(newData));
1111 while (
dim() <= dimIndex)
1116 itMap->data.resize(
dim());
1118 itMap->data.at(dimIndex) = std::make_shared<Ice::DoubleSeq>(y);
1125 typename timestamp_view::iterator itMap =
dataMap.find(t);
1131 newData.
data = std::vector<DoubleSeqPtr>(std::max((
size_t)1,
dim()));
1132 newData.
data[dimIndex] = std::make_shared<Ice::DoubleSeq>(1, y);
1139 while (
dim() <= dimIndex)
1144 itMap->data.resize(
dim());
1145 itMap->data.at(dimIndex) = std::make_shared<Ice::DoubleSeq>(1, y);
1153 typename ordered_view::const_iterator itMap = ordv.begin();
1155 for (; itMap != ordv.end(); itMap++)
1157 for (
size_t dimension = 0; dimension <
dim(); dimension++)
1159 if (!itMap->data[dimension])
1161 itMap->data[dimension] =
1162 std::make_shared<Ice::DoubleSeq>(
__interpolate(itMap, dimension, 0));
1171 Ice::DoubleSeq result;
1172 result.reserve(
size());
1174 typename ordered_view::const_iterator itMap = ordv.begin();
1176 for (; itMap != ordv.end(); itMap++)
1178 result.push_back(itMap->timestamp);
1187 Ice::FloatSeq result;
1188 result.reserve(
size());
1190 typename ordered_view::const_iterator itMap = ordv.begin();
1192 for (; itMap != ordv.end(); itMap++)
1194 result.push_back(itMap->timestamp);
1203 if (trajDimension >=
dim())
1205 throw LocalException(
"dimension is out of range: ")
1206 << trajDimension <<
" actual dimensions: " <<
dim();
1211 typename ordered_view::const_iterator itPrev = ordv.begin();
1213 typename ordered_view::const_iterator itCurrent = itPrev;
1215 typename ordered_view::const_iterator itNext = itCurrent;
1218 Ice::DoubleSeq result;
1220 for (; itCurrent != ordv.end();)
1222 if (itNext == ordv.end())
1229 DoubleSeqPtr prevStatePtr = itPrev->data[trajDimension];
1230 DoubleSeqPtr nextStatePtr = itNext->data[trajDimension];
1232 result.push_back((nextStatePtr->at(derivation) - prevStatePtr->at(derivation)) /
1233 (itNext->timestamp - itPrev->timestamp));
1237 itCurrent++, itPrev++, itNext++;
1239 if (itPrev == itCurrent)
1251 const Ice::DoubleSeq& values,
1252 int derivationCount)
1254 if (derivationCount < 0)
1256 throw LocalException(
"Negative derivation value is not allowed!");
1259 if (derivationCount == 0)
1264 Ice::DoubleSeq result;
1265 int size = std::min(timestamps.size(), values.size());
1272 result.resize(
size);
1275 result[0] = (values.at(1) - values.at(0)) / (timestamps.at(1) - timestamps.at(0));
1276 result[
size - 1] = (values.at(
size - 1) - values.at(
size - 2)) /
1277 (timestamps.at(
size - 1) - timestamps.at(
size - 2));
1280 for (
int i = 1; i <
size - 1; ++i)
1282 result[i] = (values.at(i + 1) - values.at(i - 1)) /
1283 (timestamps.at(i + 1) - timestamps.at(i - 1));
1287 if (derivationCount > 1)
1297 size_t trajDimension,
1298 size_t derivation)
const
1300 if (derivation == 0)
1302 return getState(t, trajDimension, derivation);
1305 typename timestamp_view::iterator it =
dataMap.find(t);
1308 typename ordered_view::iterator itCurrent = ordV.end();
1312 itCurrent = ordV.iterator_to(*it);
1315 typename ordered_view::iterator itNext = ordV.upper_bound(t);
1317 if (it !=
dataMap.end() && itNext == ordV.end())
1321 else if (itNext == ordV.end() && it ==
dataMap.end())
1323 throw LocalException() <<
"Cannot interpolate for t " << t <<
" no data in trajectory";
1326 typename ordered_view::iterator itPrev = itNext;
1329 if (itCurrent != ordV.end())
1334 if (itPrev == ordV.end())
1337 if (itCurrent != ordV.end())
1343 throw LocalException() <<
"Cannot interpolate for t " << t;
1347 if (itNext == ordV.end())
1350 if (itCurrent != ordV.end())
1356 throw LocalException() <<
"Cannot interpolate for t " << t;
1360 if (itNext == itPrev)
1362 throw LocalException()
1363 <<
"Interpolation failed: the next data and the previous are missing.\nInfo:\n"
1371 if (
dataExists(itNext->timestamp, trajDimension, derivation - 1) || derivation > 1)
1373 tNext = itNext->timestamp;
1380 double next =
getState(tNext, trajDimension, derivation - 1);
1384 if (
dataExists(itPrev->timestamp, trajDimension, derivation - 1) || derivation > 1)
1386 tBefore = itPrev->timestamp;
1393 double before =
getState(tBefore, trajDimension, derivation - 1);
1395 if (fabs(tNext - tBefore) < 1e-10)
1397 throw LocalException()
1398 <<
"Interpolation failed: the next data and the previous are missing.\nInfo:\n"
1403 double duration = tNext - tBefore;
1406 if (trajDimension < limitless.size() && limitless.at(trajDimension).enabled)
1409 limitless.at(trajDimension).limitHi - limitless.at(trajDimension).limitLo;
1411 double dist1 = next - before;
1412 double dist2 = next - (before + range);
1413 double dist3 = next - (before - range);
1415 if (fabs(dist1) <= fabs(dist2) && fabs(dist1) <= fabs(dist3))
1421 else if (fabs(dist2) <= fabs(dist3) && fabs(dist2) <= fabs(dist3))
1439 delta = next - before;
1442 delta = delta / duration;
1452 for (
size_t d = 0; d <
dim(); d++)
1462 typename ordered_view::iterator itOrd =
begin();
1464 for (; itOrd !=
end(); itOrd++)
1466 getState(itOrd->timestamp, trajDimension, derivation);
1472 size_t trajDimension,
1473 size_t sourceDimOfSystemState,
1474 size_t targetDimOfSystemState)
1477 typename ordered_view::iterator it = ordv.begin();
1479 if (it == ordv.end())
1484 it->data[trajDimension]->at(targetDimOfSystemState) = valueAtFirstTimestamp;
1485 double previousValue = valueAtFirstTimestamp;
1486 double previousTimestamp = it->timestamp;
1489 for (it++; it != ordv.end(); it++)
1492 if (it->data[trajDimension]->size() > sourceDimOfSystemState)
1494 slope = it->data[trajDimension]->at(sourceDimOfSystemState);
1501 double diff = it->timestamp - previousTimestamp;
1502 it->data[trajDimension]->at(targetDimOfSystemState) = previousValue + diff * slope;
1503 previousTimestamp = it->timestamp;
1504 previousValue = it->data[trajDimension]->at(targetDimOfSystemState);
1511 if (trajDimension >=
dim())
1513 throw LocalException(
"dimension is out of range: ")
1514 << trajDimension <<
" actual dimensions: " <<
dim();
1521 for (
const auto& it : ordv)
1523 (*it.data.at(trajDimension)) *= -1;
1530 typename timestamp_view::const_iterator it =
dataMap.find(t);
1532 if (it !=
dataMap.end() && it->data.size() > dimension && it->data.at(dimension) &&
1533 it->data.at(dimension)->size() > derivation)
1535 return it->data.at(dimension)->at(derivation);
1540 typename ordered_view::iterator itNext = ordv.upper_bound(t);
1542 typename ordered_view::iterator itPrev = itNext;
1546 double result =
__interpolate(t, itPrev, itNext, dimension, derivation);
1556 size_t derivation)
const
1558 typename ordered_view::iterator itPrev = itMap;
1560 typename ordered_view::iterator itNext = itMap;
1562 return __interpolate(itMap->timestamp, itPrev, itNext, dimension, derivation);
1567 typename ordered_view::const_iterator itPrev,
1568 typename ordered_view::const_iterator itNext,
1570 size_t derivation)
const
1573 double previous = 0;
1577 while (itPrev != ordView.end() && (itPrev->data.at(dimension) ==
nullptr ||
1578 itPrev->data.at(dimension)->size() <= derivation))
1583 if (itPrev != ordView.end())
1588 previous =
getState(itPrev->timestamp, dimension, derivation);
1592 while (itNext != ordView.end() &&
1593 (!itNext->data.at(dimension) || itNext->data.at(dimension)->size() <= derivation))
1598 if (itNext != ordView.end())
1602 next =
getState(itNext->timestamp, dimension, derivation);
1606 if (itNext == ordView.end() && itPrev == ordView.end())
1608 throw LocalException()
1609 <<
"Cannot find next or prev values in dim " << dimension <<
" at timestamp " << t;
1612 if (itNext == ordView.end())
1615 return getState(itPrev->timestamp, dimension, derivation) +
1616 getState(itPrev->timestamp, dimension, derivation + 1) * (t - itPrev->timestamp);
1618 else if (itPrev == ordView.end())
1621 return getState(itNext->timestamp, dimension, derivation) -
1622 getState(itNext->timestamp, dimension, derivation + 1) * (itNext->timestamp - t);
1630 if (dimension < limitless.size() && limitless.at(dimension).enabled)
1650 for (
size_t d = 0; d <
dim(); d++)
1652 Ice::DoubleSeq entries;
1654 for (
typename ordered_view::iterator it = ordv.begin(); it != ordv.end(); it++)
1659 filteredTraj.addDimension(entries, timestamps);
1667 typename ordered_view::iterator centerIt,
1672 const double sigma = filterRadiusInTime / 2.5;
1674 double weightedSum = 0;
1675 double sumOfWeight = 0;
1676 ordered_view::iterator start = centerIt;
1678 const double sqrt2PI = sqrt(2 *
M_PI);
1682 for (ordered_view::iterator it = start;
1683 it != ordView.end() &&
1684 fabs(it->timestamp - centerIt->timestamp) <= fabs(filterRadiusInTime * 2);)
1687 value = it->getDeriv(trajNum,
dim);
1688 double diff = (it->timestamp - centerIt->timestamp);
1689 double squared = diff * diff;
1690 const double gaussValue = exp(-squared / (2 * sigma * sigma)) / (sigma * sqrt2PI);
1691 sumOfWeight += gaussValue;
1692 weightedSum += gaussValue * value;
1710 result = weightedSum / sumOfWeight;
1718 if (&source == &destination)
1723 destination.
clear();
1725 Ice::DoubleSeq timestamps = source.getTimestamps();
1727 for (
size_t dim = 0;
dim < source.dim();
dim++)
1748 dimensionNames.clear();
1756 if (startTime >= endTime)
1758 throw LocalException(
"startTime must be smaller than endTime.");
1761 Ice::DoubleSeq result;
1762 size_t size = std::round((endTime - startTime) / stepSize) + 1;
1763 stepSize = (endTime - startTime) / (
size - 1);
1764 result.reserve(
size);
1766 double currentTimestamp = startTime;
1771 result.push_back(currentTimestamp);
1772 currentTimestamp += stepSize;
1782 const double startTime,
1783 const double endTime)
1785 Ice::DoubleSeq normTimestamps;
1786 normTimestamps.resize(timestamps.size());
1787 const double minValue = *timestamps.
begin();
1788 const double maxValue = *timestamps.rbegin();
1789 const double duration = maxValue - minValue;
1791 for (
size_t i = 0; i < timestamps.size(); i++)
1794 startTime + (timestamps.at(i) - minValue) / duration * (endTime - startTime);
1797 return normTimestamps;
1802 const double startTime,
1803 const double endTime)
1806 if (traj.
size() <= 1 ||
1807 (traj.
begin()->timestamp == startTime && traj.
rbegin()->timestamp == endTime))
1822 normExampleTraj.
addDimension(dimensionData, normTimestamps);
1826 return normExampleTraj;
1839 double maxAcceleration,
1840 double maxDeviation,
1841 const IceUtil::Time& timestep)
1843 Eigen::VectorXd maxVelocities = Eigen::VectorXd::Constant(
dim(), maxVelocity);
1844 Eigen::VectorXd maxAccelerations = Eigen::VectorXd::Constant(
dim(), maxAcceleration);
1846 maxVelocities, maxAccelerations, maxDeviation, timestep);
1851 const Eigen::VectorXd& maxAccelerations,
1852 double maxDeviation,
1853 IceUtil::Time
const& timestep)
1856 bool hasLimitlessDimension =
false;
1857 for (
auto l : limitless)
1859 hasLimitlessDimension |= l.enabled;
1863 if (hasLimitlessDimension)
1870 auto timestepValue = timestep.toSecondsDouble();
1871 std::list<Eigen::VectorXd> waypointList;
1872 auto dimensions =
dim();
1873 for (
auto& waypoint : hasLimitlessDimension ? *unfoldedTraj : *
this)
1875 auto positions = waypoint.getPositions();
1876 waypointList.push_back(Eigen::Map<Eigen::VectorXd>(positions.data(), dimensions));
1879 VirtualRobot::TimeOptimalTrajectory timeOptimalTraj(
1880 VirtualRobot::Path(waypointList, maxDeviation),
1889 Ice::DoubleSeq newTimestamps;
1890 double duration = timeOptimalTraj.getDuration();
1891 newTimestamps.reserve(duration / timestepValue + 1);
1892 for (
double t = 0.0; t < duration; t += timestepValue)
1894 newTimestamps.push_back(t);
1896 newTimestamps.push_back(duration);
1898 for (
size_t d = 0; d < dimensionNames.size(); d++)
1900 Ice::DoubleSeq position;
1901 position.reserve(newTimestamps.size());
1902 for (
double t = 0.0; t < duration; t += timestepValue)
1904 position.push_back(timeOptimalTraj.getPosition(t)[d]);
1906 position.push_back(timeOptimalTraj.getPosition(duration)[d]);
1907 newTraj->addDimension(position, newTimestamps, dimensionNames.at(d));
1909 Ice::DoubleSeq derivs;
1910 derivs.reserve(newTimestamps.size());
1912 for (
double t = 0.0; t < duration; t += timestepValue)
1915 derivs.push_back(timeOptimalTraj.getPosition(t)[d]);
1916 derivs.push_back(timeOptimalTraj.getVelocity(t)[d]);
1917 newTraj->addDerivationsToDimension(d, t, derivs);
1920 derivs.push_back(timeOptimalTraj.getPosition(duration)[d]);
1921 derivs.push_back(timeOptimalTraj.getVelocity(duration)[d]);
1922 newTraj->addDerivationsToDimension(d, duration, derivs);
1924 newTraj->setLimitless(limitless);
1925 if (hasLimitlessDimension)
1934 const Ice::DoubleSeq& timestamps,
1935 const std::string name)
1938 const auto& tempTimestamps =
1941 size_t newDimIndex =
dim();
1946 if (newDimIndex < dimensionNames.size())
1948 dimensionNames.at(newDimIndex) = name;
1952 dimensionNames.push_back(name);
1960 typename timestamp_view::iterator itMap =
dataMap.begin();
1962 for (; itMap !=
dataMap.end(); itMap++)
1964 std::vector<DoubleSeqPtr>&
data = itMap->data;
1966 if (dimension <
data.size())
1968 data.erase(
data.begin() + dimension);
1971 if (dimension < dimensionNames.size())
1973 dimensionNames.erase(dimensionNames.begin() + dimension);
1980 typename timestamp_view::iterator itMap =
dataMap.begin();
1982 for (; itMap !=
dataMap.end(); itMap++)
1984 std::vector<DoubleSeqPtr>&
data = itMap->data;
1986 for (
auto& vec :
data)
1988 if (derivation + 1 < vec->size())
1990 vec->resize(derivation);
1999 typename timestamp_view::iterator itMap =
dataMap.begin();
2001 for (; itMap !=
dataMap.end(); itMap++)
2003 std::vector<DoubleSeqPtr>&
data = itMap->data;
2005 if (
data.size() > dimension && derivation + 1 <
data.at(dimension)->size())
2007 data.at(dimension)->resize(derivation);
2012 Trajectory::ordered_view::const_iterator
2018 Trajectory::ordered_view::const_iterator
2024 Trajectory::ordered_view::const_reverse_iterator
2030 Trajectory::ordered_view::const_reverse_iterator
2036 std::vector<DoubleSeqPtr>&
2044 const Ice::DoubleSeq& values,
2045 const Ice::DoubleSeq& timestamps)
2047 if (dimension >=
dim() &&
dim() > 0)
2054 << timestamps.size() <<
", " << values.size();
2056 for (
size_t i = 0; i < timestamps.size(); ++i)
2068 const Ice::DoubleSeq& derivs)
2101 throw LocalException(
"Ptr to trajectory is NULL");
2104 Eigen::VectorXf result(numDim);
2105 for (std::size_t i = 0; i < numDim; ++i)
2117 throw LocalException(
"Ptr to trajectory is NULL");
2120 Eigen::VectorXd result(numDim);
2121 for (std::size_t i = 0; i < numDim; ++i)
2133 throw LocalException(
"Ptr to trajectory is NULL");
2138 const std::vector<DoubleSeqPtr>&
2148 typename ordered_view::const_iterator itMap = ordv.begin();
2152 for (; itMap != ordv.end(); itMap++)
2154 for (
size_t i = 0; i < d; ++i)
2156 shiftedTraj.
setEntries(itMap->timestamp + shift, i, *itMap->getData().at(i));
2160 *
this = shiftedTraj;
2166 if (shift.size() >
dim())
2168 throw LocalException(
"dimension is out of range: ")
2169 << shift.size() <<
" actual dimensions: " <<
dim();
2173 for (
size_t dimension = 0; dimension <
dim(); dimension++)
2176 typename ordered_view::const_iterator itMap = ordv.begin();
2178 for (; itMap != ordv.end(); itMap++)
2180 itMap->data[dimension]->at(0) += shift[dimension];
2188 if (factor.size() >
dim())
2190 throw LocalException(
"dimension is out of range: ")
2191 << factor.size() <<
" actual dimensions: " <<
dim();
2195 for (
size_t dimension = 0; dimension <
dim(); dimension++)
2198 typename ordered_view::const_iterator itMap = ordv.begin();
2200 for (; itMap != ordv.end(); itMap++)
2202 itMap->data[dimension]->at(0) *= factor[dimension];
2210 limitless = limitlessStates;
static void UnfoldLimitlessJointPositions(TrajectoryPtr traj)
static void FoldLimitlessJointPositions(TrajectoryPtr traj)
The Trajectory class represents n-dimensional sampled trajectories.
void shiftValue(const Ice::DoubleSeq &shift)
void negateDim(size_t trajDimension)
negateDim changes the sign of all values of the given dimension.
double getMax(size_t dimension, size_t derivation, double startTime, double endTime) const
double __interpolate(typename ordered_view::const_iterator itMap, size_t dimension, size_t derivation) const
static Ice::DoubleSeq DifferentiateDiscretly(const Ice::DoubleSeq ×tamps, const Ice::DoubleSeq &values, int derivationCount=1)
Trajectory & operator=(const Trajectory &source)
void ice_postUnmarshal() override
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
TrajDataContainer & data()
double getState(double t, size_t dim=0, size_t derivation=0)
void setEntries(const double t, const size_t dimIndex, const Ice::DoubleSeq &y)
size_t size() const
Returns number of data entries (i.e.
Ice::DoubleSeq getMinima(size_t dimension, size_t derivation, double startTime, double endTime) const
Calculate all minima.
std::string output(const Ice::Current &c=Ice::emptyCurrent) const override
void setPositionEntry(const double t, const size_t dimIndex, const double &y)
const Ice::StringSeq & getDimensionNames() const
double getMin(size_t dimension, size_t derivation, double startTime, double endTime) const
void __fillAllEmptyFields()
void removeDerivation(size_t derivation)
double getLength(size_t derivation=0) const
Returns the sum of a all subsequent distances of the entries in the trajectories over all dimensions.
VariantDataClassPtr clone(const Ice::Current &c=Ice::emptyCurrent) const override
void differentiateDiscretly(size_t derivation)
void serialize(const ObjectSerializerBasePtr &obj, const Ice::Current &=Ice::emptyCurrent) const override
ordered_view::const_iterator begin() const
Iterators that iterates in incremental order of the timestamps through the trajectory.
std::vector< DoubleSeqPtr > __calcBaseDataAtTimestamp(const double &t) const
timestamp_view::iterator __fillBaseDataAtTimestamp(const double &t)
std::vector< Ice::DoubleSeq > getAllStates(double t, int maxDeriv=1)
double getTimeLength() const
Difference between biggest and smallest timestamp.
void addPositionsToDimension(size_t dimension, const Ice::DoubleSeq &values, const Ice::DoubleSeq ×tamps)
void addDerivationsToDimension(size_t dimension, const double t, const Ice::DoubleSeq &derivs)
TrajDataContainer dataMap
ordered_view::const_iterator end() const
Ice::DoubleSeq getDerivations(double t, size_t dimension, size_t derivations) const
bool validate(const Ice::Current &c=Ice::emptyCurrent) override
size_t addDimension(const Ice::DoubleSeq &values, const Ice::DoubleSeq ×tamps=Ice::DoubleSeq(), const std::string name="")
double getDiscretDifferentiationForDimAtT(double t, size_t trajDimension, size_t derivation) const
ordered_view::const_reverse_iterator rend() const
void differentiateDiscretlyForDim(size_t trajDimension, size_t derivation)
std::vector< DoubleSeqPtr > & getStates(double t)
LimitlessStateSeq getLimitless() const
static Trajectory NormalizeTimestamps(const Trajectory &traj, const double startTime=0.0, const double endTime=1.0)
void scaleValue(const Ice::DoubleSeq &factor)
Eigen::VectorXd getDimensionDataAsEigen(size_t dimension, size_t derivation) const
void reconstructFromDerivativeForDim(double valueAtFirstTimestamp, size_t trajDimension, size_t sourceDimOfSystemState, size_t targetDimOfSystemState)
Eigen::MatrixXd toEigen(size_t derivation, double startTime, double endTime) const
Ice::DoubleSeq getMinimaTimestamps(size_t dimension, size_t derivation, double startTime, double endTime) const
void clear(bool keepMetaData=false)
size_t dim() const
dim returns the trajectory dimension count for this trajectory (e.g.
double getWithFunc(const double &(*foo)(const double &, const double &), double initValue, size_t dimension, size_t derivation, double startTime, double endTime) const
Ice::Int getType(const Ice::Current &c=Ice::emptyCurrent) const override
Ice::ObjectPtr ice_clone() const override
double getAmplitude(size_t dimension, size_t derivation, double startTime, double endTime) const
Ice::DoubleSeq getMaximaTimestamps(size_t dimension, size_t derivation, double startTime, double endTime) const
std::string getDimensionName(size_t dim) const
void setDimensionNames(const Ice::StringSeq dimNames)
Ice::DoubleSeq getDimensionData(size_t dimension, size_t derivation=0) const
getDimensionData gets all entries for one dimensions with order of increasing timestamps
ordered_view::const_reverse_iterator rbegin() const
double __gaussianFilter(double filterRadius, typename ordered_view::iterator centerIt, size_t trajNum, size_t dim)
Ice::DoubleSeq getDiscreteDifferentiationForDim(size_t trajDimension, size_t derivation) const
Ice::FloatSeq getTimestampsFloat() const
void shiftTime(double shift)
Ice::DoubleSeq getTimestamps() const
void deserialize(const ObjectSerializerBasePtr &, const Ice::Current &=Ice::emptyCurrent) override
TrajectoryPtr calculateTimeOptimalTrajectory(double maxVelocity, double maxAcceleration, double maxDeviation, IceUtil::Time const ×tep)
typename boost::multi_index::index< TrajDataContainer, TagOrdered >::type ordered_view
TrajectoryPtr normalize(const double startTime=0.0, const double endTime=1.0)
void setLimitless(const LimitlessStateSeq &limitlessStates)
void ice_preMarshal() override
static void CopyMetaData(const Trajectory &source, Trajectory &destination)
void removeDimension(size_t dimension)
TrajectoryPtr cloneMetaData() const
static Ice::DoubleSeq GenerateTimestamps(double startTime=0.0, double endTime=1.0, double stepSize=0.001)
TrajectoryPtr getPart(double startTime, double endTime, size_t numberOfDerivations=0) const
std::vector< DoubleSeqPtr > & operator[](double timestamp)
bool dataExists(double t, size_t dimension=0, size_t derivation=0) const
Trajectory & operator+=(const Trajectory traj)
static void CopyData(const Trajectory &source, Trajectory &destination)
double getSquaredLength(size_t dimension, size_t derivation) const
Ice::DoubleSeq getMaxima(size_t dimension, size_t derivation, double startTime, double endTime) const
std::map< double, Ice::DoubleSeq > getStatesAround(double t, size_t derivation, size_t extend) const
void gaussianFilter(double filterRadius)
gaussianFilter smoothes the trajectory
static float Lerp(float a, float b, float f)
static float ILerp(float a, float b, float f)
static float AngleLerp(float a, float b, float f)
#define ARMARX_CHECK_GREATER(lhs, rhs)
This macro evaluates whether lhs is greater (>) than rhs and if it turns out to be false it will thro...
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
#define ARMARX_CHECK_NOT_EQUAL(lhs, rhs)
This macro evaluates whether lhs is inequal (!=) rhs and if it turns out to be false it will throw an...
#define ARMARX_CHECK_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
const VariantTypeId Trajectory
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::shared_ptr< Ice::DoubleSeq > DoubleSeqPtr
std::vector< std::string > Split(const std::string &source, const std::string &splitBy, bool trimElements=false, bool removeEmptyElements=false)
IceInternal::Handle< Trajectory > TrajectoryPtr
void checkValue(const T &value)
IceInternal::Handle< AbstractObjectSerializer > AbstractObjectSerializerPtr
double getTimestamp() const
Eigen::VectorXd getPositionsAsVectorXd() const
std::vector< DoubleSeqPtr > data
double getDeriv(size_t dim, size_t derivation) const
Eigen::VectorXf getPositionsAsVectorXf() const
double getPosition(size_t dim) const
const std::vector< DoubleSeqPtr > & getData() const
DoubleSeqPtr operator[](size_t dim) const