43 const std::string docstring1 =
45 " Set the parameters for the Planner.\n"
48 " - INT: Number of Time Steps in one 1.6 s \n"
49 " - INT: Number of periodic sources 1 \n"
50 " - INT: Number of periodic sources 2 \n"
51 " - STRING: Path of the directory from where parameters can be "
58 const std::string docstring2 =
60 " Run the Planner to generate upper joint trajectories \n"
93 template <
typename Derived>
94 void writeToFile(Eigen::DenseBase<Derived>& inMatrix, std::string& filePath) {
95 std::ofstream file(filePath.c_str());
102 template <
typename Derived>
104 Eigen::DenseBase<Derived>& outArr) {
106 std::ifstream fileStream(fileName.c_str());
109 std::string _dblString;
111 while (std::getline(fileStream, curLine)) {
112 std::istringstream iss(curLine);
114 while (std::getline(iss, _dblString,
'\t')) {
115 _dbl = atof(_dblString.c_str());
116 outArr(_row, _col) = _dbl;
126 const double& _objectPositionInDrawer,
127 const std::string& dir) {
180 Eigen::ArrayXd& mwwn,
double& sigma2,
182 Eigen::Vector3d sigmaSqNK;
183 std::string fileName = dir +
"/" +
"sigmaSqNK";
184 read2DArray<Eigen::Vector3d>(fileName, sigmaSqNK);
185 assert(sigmaSqNK.cols() == 1);
186 assert(sigmaSqNK.rows() == 3);
188 sigma2 = sigmaSqNK(0);
189 N = (int)sigmaSqNK(1);
190 K = (int)sigmaSqNK(2);
192 fileName = dir +
"/" +
"q";
193 read2DArray<dynamicgraph::Matrix>(fileName,
q);
194 assert(
q.cols() == 2);
195 assert(
q.rows() ==
N);
197 fileName = dir +
"/" +
"mwwn";
198 read2DArray<Eigen::ArrayXd>(fileName, mwwn);
199 assert(mwwn.cols() == 1);
200 assert(mwwn.rows() == K);
202 fileName = dir +
"/" +
"beta3";
203 read2DArray<dynamicgraph::Matrix>(fileName, beta3);
204 assert(beta3.cols() == K);
205 assert(beta3.rows() ==
N);
215 std::string fileName = dir +
"/" +
"pSource1";
216 read2DArray<Eigen::ArrayXXd>(fileName,
pSource1);
221 fileName = dir +
"/" +
"pSource2";
222 read2DArray<Eigen::ArrayXXd>(fileName,
pSource2);
227 fileName = dir +
"/" +
"npSource";
228 read2DArray<Eigen::ArrayXd>(fileName,
npSource);
233 fileName = dir +
"/" +
"pDelay1";
234 read2DArray<Eigen::ArrayXXd>(fileName,
pDelay1);
239 fileName = dir +
"/" +
"pDelay2";
240 read2DArray<Eigen::ArrayXXd>(fileName,
pDelay2);
297 Eigen::FFT<double> fft;
298 double pi = std::acos(-1);
301 for (
int cur_time = 0; cur_time <
nTimeSteps; cur_time++) {
302 std::complex<double> pi_freq;
304 pi_freq.imag(cur_time);
305 V(cur_time) = pi_freq;
311 for (
int cur_src = 0; cur_src <
nSources1; cur_src++) {
312 pSourceInFreq.matrix().col(cur_src) =
313 fft.fwd(
pSource1.matrix().col(cur_src));
317 for (
int cJ = 0; cJ <
nJoints; cJ++) {
319 for (
int cur_src = 0; cur_src <
nSources1; cur_src++) {
321 const Eigen::ArrayXcd delayedFT =
322 pSourceInFreq.col(cur_src) * (
V *
pDelay1(cJ, cur_src)).
exp();
326 pSourceDelayedJoint.matrix().col(cur_src) = fft.inv(delayedFT.matrix());
332 pSourceInFreq.resize(Eigen::NoChange,
nSources2);
333 for (
int cur_src = 0; cur_src <
nSources2; cur_src++) {
334 pSourceInFreq.matrix().col(cur_src) =
335 fft.fwd(
pSource2.matrix().col(cur_src));
339 for (
int cJ = 0; cJ <
nJoints; cJ++) {
341 for (
int cur_src = 0; cur_src <
nSources2; cur_src++) {
343 const Eigen::ArrayXcd delayedFT =
344 pSourceInFreq.col(cur_src) * (
V *
pDelay2(cJ, cur_src)).
exp();
348 pSourceDelayedJoint.matrix().col(cur_src) = fft.inv(delayedFT.matrix());
359 Eigen::ArrayXd wCurrent;
360 Eigen::ArrayXd mJointAngleCurrent;
362 double pi = std::acos(-1);
364 bool specialInterpolatedWeight =
false;
368 allJointsOneGaitCycle.setZero();
369 allJointsAllGaitCycle.setZero();
380 specialInterpolatedWeight =
true;
383 Eigen::ArrayXd wnpbeg =
388 double ww = (std::sin(
t / (
nTimeSteps / 10) * pi / 2) + 1) / 2;
390 (2 * ww - 1) *
wNonPeriodic.col(cG) + (1 - (2 * ww - 1)) * wnpbeg;
394 for (
int cSrc1 = 0; cSrc1 <
nSources1; cSrc1++) {
395 Eigen::ArrayXd intWeightCSrc =
398 currentWeight1.push_back(intWeightCSrc);
401 for (
int cSrc2 = 0; cSrc2 <
nSources2; cSrc2++) {
402 Eigen::ArrayXd intWeightCSrc =
405 currentWeight2.push_back(intWeightCSrc);
414 specialInterpolatedWeight =
true;
415 Eigen::ArrayXd wnpEnd =
421 wCurrent = (1 - 2 * ww) *
wNonPeriodic.col(cG) + 2 * ww * wnpEnd;
425 for (
int cSrc1 = 0; cSrc1 <
nSources1; cSrc1++) {
426 Eigen::ArrayXd intWeightCSrc =
430 currentWeight1.push_back(intWeightCSrc);
433 for (
int cSrc2 = 0; cSrc2 <
nSources2; cSrc2++) {
434 Eigen::ArrayXd intWeightCSrc =
437 currentWeight2.push_back(intWeightCSrc);
443 for (
int cJ = 0; cJ <
nJoints; cJ++) {
444 if (specialInterpolatedWeight) {
445 for (
int cSrc1 = 0; cSrc1 <
nSources1; cSrc1++)
446 allJointsOneGaitCycle(
t, cJ) +=
448 for (
int cSrc2 = 0; cSrc2 <
nSources2; cSrc2++)
449 allJointsOneGaitCycle(
t, cJ) +=
452 allJointsOneGaitCycle(
t, cJ) +=
npSource(
t) * wCurrent(cJ);
453 allJointsOneGaitCycle(
t, cJ) += mJointAngleCurrent(cJ);
456 for (
int cSrc1 = 0; cSrc1 <
nSources1; cSrc1++)
457 allJointsOneGaitCycle(
t, cJ) +=
459 for (
int cSrc2 = 0; cSrc2 <
nSources2; cSrc2++)
460 allJointsOneGaitCycle(
t, cJ) +=
468 specialInterpolatedWeight =
false;
473 for (
int cJ = 0; cJ <
nJoints; cJ++) {
474 allJointsOneGaitCycle.col(cJ).head(halfTime).reverseInPlace();
475 smoothEnds(allJointsOneGaitCycle.col(cJ).head(halfTime));
476 allJointsOneGaitCycle.col(cJ).head(halfTime).reverseInPlace();
480 for (
int cJ = 0; cJ <
nJoints; cJ++) {
481 smoothEnds(allJointsOneGaitCycle.col(cJ).tail(halfTime));
486 allJointsOneGaitCycle;
487 allJointsOneGaitCycle.setZero();
494 allJointsAllGaitCycleNew.col(0) = Eigen::ArrayXd::LinSpaced(
498 allJointsAllGaitCycleNew.col(1) = allJointsAllGaitCycle.col(0);
499 allJointsAllGaitCycleNew.col(2) = allJointsAllGaitCycle.col(1);
500 allJointsAllGaitCycleNew.col(3).setZero();
501 allJointsAllGaitCycleNew.col(4) = allJointsAllGaitCycle.col(2);
502 allJointsAllGaitCycleNew.col(5) = allJointsAllGaitCycle.col(3);
503 allJointsAllGaitCycleNew.col(6).setZero();
504 allJointsAllGaitCycleNew.col(7).setZero();
505 allJointsAllGaitCycleNew.col(8) = allJointsAllGaitCycle.col(4);
506 allJointsAllGaitCycleNew.col(9) = allJointsAllGaitCycle.col(5);
507 allJointsAllGaitCycleNew.col(10) = allJointsAllGaitCycle.col(6);
508 allJointsAllGaitCycleNew.col(11) = allJointsAllGaitCycle.col(7);
509 allJointsAllGaitCycleNew.col(12) = allJointsAllGaitCycle.col(8);
510 allJointsAllGaitCycleNew.col(13) = allJointsAllGaitCycle.col(9);
511 allJointsAllGaitCycleNew.col(14).setZero();
512 allJointsAllGaitCycleNew.col(15) = allJointsAllGaitCycle.col(10);
513 allJointsAllGaitCycleNew.col(16) = allJointsAllGaitCycle.col(11);
514 allJointsAllGaitCycleNew.col(17) = allJointsAllGaitCycle.col(12);
515 allJointsAllGaitCycleNew.col(18) = allJointsAllGaitCycle.col(13);
516 allJointsAllGaitCycleNew.col(19) = allJointsAllGaitCycle.col(14);
517 allJointsAllGaitCycleNew.col(20) = allJointsAllGaitCycle.col(15);
518 allJointsAllGaitCycleNew.col(21).setZero();
520 allJointsAllGaitCycleNew.middleCols<18>(4) *= 180 / pi;
521 allJointsAllGaitCycleNew.col(14).setConstant(10);
522 allJointsAllGaitCycleNew.col(21).setConstant(10);
525 for (
int i = 0;
i < allJointsAllGaitCycleNew.rows() - 1;
i++)
526 allJointsAllGaitCycleNew.row(
i).segment<18>(22) =
527 allJointsAllGaitCycleNew.row(
i + 1).segment<18>(4) -
528 allJointsAllGaitCycleNew.row(
i).segment<18>(4);
537 for (
int i = 0;
i < allJointsAllGaitCycleNew.rows() - 1;
i++)
538 allJointsAllGaitCycleNew.row(
i).segment<18>(40) =
539 (allJointsAllGaitCycleNew.row(
i + 1).segment<18>(22) -
540 allJointsAllGaitCycleNew.row(
i).segment<18>(22)) *
551 double pi = std::acos(-1);
552 int N = (int)tr.size();
553 Eigen::ArrayXd shiftedTr(
N);
555 shiftedTr.tail(
N - 1) = tr.head(
N - 1);
559 for (
int i = 1;
i <
N;
i++) {
560 tr(
i) *= (std::cos((
i - 1) / (
N - 1) * pi) + 1) / 2;
567 const int splDeg = 3;
568 const int splDim = 1;
569 Eigen::MatrixXd trCopy = tr;
580 for (
int cJ = 0; cJ <
nJoints; cJ++) {
581 Eigen::Spline<double, splDim> spl =
582 Eigen::SplineFitting<Eigen::Spline<double, splDim> >::Interpolate(
583 trCopy.col(cJ).transpose(), splDeg, x_vec);
585 tr(
t, cJ) = spl(x_vec_new(
t))(0);
591 const std::string& dir) {
599 const std::string dir01 = dir +
"/adaption/01";
602 Eigen::ArrayXd mwwn(288);
609 Eigen::ArrayXd test_point(2);
610 test_point << goals(0), goals(1);
611 for (
int k = 0; k < K; k++) {
612 Eigen::MatrixXd
X(
q.rows(), 3);
613 X.col(0) =
q.col(0) - Eigen::MatrixXd::Ones(
q.rows(), 1) * test_point(0);
614 X.col(1) =
q.col(1) - Eigen::MatrixXd::Ones(
q.rows(), 1) * test_point(1);
615 X.col(2) = Eigen::MatrixXd::Ones(
q.rows(), 1);
616 Eigen::VectorXd _expdiag =
617 (-(((
X *
X.transpose()).diagonal().matrix()) / sigma2)).
exp();
618 Eigen::MatrixXd Wkern = _expdiag.asDiagonal();
619 M(k) = (((
X.transpose() * Wkern *
X) *
X.transpose() * Wkern).
inverse() *
620 beta3.col(k))(
q.cols());
623 Eigen::ArrayXd wwn =
M + mwwn;
627 for (
int j = 0; j < 2; j++) {
628 for (
int cs1 = 0; cs1 <
nSources1; cs1++) {
633 for (
int cs2 = 0; cs2 <
nSources2; cs2++) {
653 const std::string dir3 = dir +
"/adaption/2";
656 Eigen::ArrayXd mwwn(144);
666 Eigen::ArrayXd test_point(2);
667 test_point << goals(1), goals(2);
668 for (
int k = 0; k < K; k++) {
669 Eigen::MatrixXd
X(
q.rows(), 3);
670 X.col(0) =
q.col(0) - Eigen::MatrixXd::Ones(
q.rows(), 1) * test_point(0);
671 X.col(1) =
q.col(1) - Eigen::MatrixXd::Ones(
q.rows(), 1) * test_point(1);
672 X.col(2) = Eigen::MatrixXd::Ones(
q.rows(), 1);
673 Eigen::VectorXd _expdiag =
674 (-(((
X *
X.transpose()).diagonal().matrix()) / sigma2)).
exp();
675 Eigen::MatrixXd Wkern = _expdiag.asDiagonal();
676 M(k) = (((
X.transpose() * Wkern *
X) *
X.transpose() * Wkern).
inverse() *
677 beta3.col(k))(
q.cols());
680 Eigen::ArrayXd wwn =
M + mwwn;
684 for (
int cs1 = 0; cs1 <
nSources1; cs1++) {
687 for (
int cs2 = 0; cs2 <
nSources2; cs2++) {
702 const std::string dir4 = dir +
"/adaption/3";
705 Eigen::ArrayXd mwwn(144);
713 Eigen::ArrayXd test_point(2);
714 test_point << goals(2), goals(3);
716 for (
int k = 0; k < K; k++) {
717 Eigen::MatrixXd
X(
q.rows(), 3);
718 X.col(0) =
q.col(0) - Eigen::MatrixXd::Ones(
q.rows(), 1) * test_point(0);
719 X.col(1) =
q.col(1) - Eigen::MatrixXd::Ones(
q.rows(), 1) * test_point(1);
720 X.col(2) = Eigen::MatrixXd::Ones(
q.rows(), 1);
721 Eigen::VectorXd _expdiag =
722 (-(((
X *
X.transpose()).diagonal().matrix()) / sigma2)).
exp();
723 Eigen::MatrixXd Wkern = _expdiag.asDiagonal();
725 M(k) = (((
X.transpose() * Wkern *
X) *
X.transpose() * Wkern).
inverse() *
726 beta3.col(k))(
q.cols());
729 Eigen::ArrayXd wwn =
M + mwwn;
732 for (
int cs1 = 0; cs1 <
nSources1; cs1++) {
735 for (
int cs2 = 0; cs2 <
nSources2; cs2++) {
747 Eigen::Ref<Eigen::ArrayXXd> allJointTraj,
int polyOrder,
int frameSize) {
748 assert(polyOrder < frameSize);
750 allJointTraj.rows());
751 assert(frameSize % 2 == 1);
756 Eigen::ArrayXXd vanderArr(frameSize, polyOrder + 1);
757 vanderArr.col(0).setOnes();
758 vanderArr.col(1) = Eigen::ArrayXd::LinSpaced(frameSize, -(frameSize - 1) / 2,
759 (frameSize - 1) / 2);
760 for (
int i = 2;
i < polyOrder + 1;
i++)
761 vanderArr.col(
i) = vanderArr.col(
i - 1) * vanderArr.col(1);
762 sotDEBUG(15) <<
"Printing the VanderArr" << std::endl;
763 sotDEBUG(15) << vanderArr << std::endl;
766 Eigen::MatrixXd upperT =
767 (vanderArr.matrix().transpose() * vanderArr.matrix()).
llt().matrixU();
768 sotDEBUG(15) <<
"Printing the Cholesky decomp" << std::endl;
769 sotDEBUG(15) << upperT << std::endl;
770 Eigen::MatrixXd
A = vanderArr.matrix() * upperT.inverse();
772 sotDEBUG(15) <<
"Printing A" << std::endl;
775 Eigen::MatrixXd proj =
A *
A.transpose();
777 for (
int cJ = 0; cJ < allJointTraj.cols(); cJ++) {
779 Eigen::VectorXd yit =
780 (proj.bottomRows((frameSize + 1) / 2) *
781 allJointTraj.matrix().col(cJ).head(frameSize).reverse())
785 Eigen::MatrixXd xb(frameSize, allJointTraj.rows() - frameSize + 1);
786 for (
int i = 0;
i < allJointTraj.rows() - frameSize + 1;
i++)
787 xb.col(
i) = allJointTraj.col(cJ).segment(
i, frameSize);
788 Eigen::VectorXd yss =
789 (proj.row((frameSize - 1) / 2) * xb.middleCols(1, xb.cols() - 2))
793 Eigen::VectorXd yot =
794 (proj.topRows((frameSize + 1) / 2) *
795 allJointTraj.matrix().col(cJ).tail(frameSize).reverse())
798 allJointTraj.col(cJ) << yit, yss, yot;
805 goalsNew(1) = (
D - 1.75) * 0.532 + 0.1;
806 goalsNew(2) = (
D - goalsNew(1) - 1.64) / 2 + 0.636;
807 goalsNew(0) = (
D - goalsNew(1) - 1.64) / 4 + 0.5;
813 assert(
parametersSet &&
"Set Parameters via setParams first");