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)
126 Ice::DoubleSeq newRow;
127 newRow.reserve(
values.size());
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;
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)
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);
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);
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);
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;
1272 result.resize(
size);
1275 result[0] = (
values.at(1) -
values.at(0)) / (timestamps.at(1) - timestamps.at(0));
1277 (timestamps.at(
size - 1) - timestamps.at(
size - 2));
1280 for (
int i = 1; i <
size - 1; ++i)
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();
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,
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,
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(
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)
2093 return getDeriv(
dim, 0);
2101 throw LocalException(
"Ptr to trajectory is NULL");
2103 size_t numDim = trajectory->dim();
2104 Eigen::VectorXf result(numDim);
2105 for (std::size_t i = 0; i < numDim; ++i)
2107 result(i) = getPosition(i);
2117 throw LocalException(
"Ptr to trajectory is NULL");
2119 size_t numDim = trajectory->dim();
2120 Eigen::VectorXd result(numDim);
2121 for (std::size_t i = 0; i < numDim; ++i)
2123 result(i) = getPosition(i);
2133 throw LocalException(
"Ptr to trajectory is NULL");
2135 return trajectory->getState(timestamp,
dim, derivation);
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;