TrapezoidalVelocityTrajectory_Test.cpp
Go to the documentation of this file.
00001 /*
00002  * TrajectoryGenerator_Test.cpp
00003  *
00004  *  Created on: Aug 16, 2012
00005  *      Author: Ross Taylor
00006  */
00007 
00008 #include <iostream>
00009 #include <gtest/gtest.h>
00010 #include "robodyn_controllers/TrapezoidalVelocityTrajectoryFactory.h"
00011 #include <tf/tf.h>
00012 #include <fstream>
00013 
00014 bool outputFlag = false;
00015 
00016 class TrapVelTrajectoryGeneratorTest : public ::testing::Test
00017 {
00018 protected:
00019     virtual void SetUp()
00020     {
00021         ctg = new TrapezoidalVelocityCartesianTrajectoryFactory();
00022         jtg = new TrapezoidalVelocityJointTrajectoryFactory();
00023     }
00024 
00025     virtual void TearDown()
00026     {
00027         // delete stuff, etc.
00028         delete ctg;
00029         delete jtg;
00030     }
00031 
00032     TrapezoidalVelocityCartesianTrajectoryFactory* ctg; // pointer for easy destruction between tests
00033     TrapezoidalVelocityJointTrajectoryFactory*     jtg; // pointer for easy destruction between tests
00034     boost::shared_ptr<CartesianTrajectory>         ctptr;
00035     boost::shared_ptr<JointTrajectory>             jtptr;
00036 };
00037 
00038 // TEST_F uses SetUp/TearDown in Test above
00039 // second argument describes the test (make descriptive)
00040 TEST_F(TrapVelTrajectoryGeneratorTest, TrapezoidalVelocityCartGetSetTest)
00041 {
00042     // EXPECT_EQ (test equality)
00043     // EXPECT_FLOAT_EQ (test equality, with roundoff allowed)
00044     // EXPECT_TRUE
00045     // EXPECT_FALSE
00046     // EXPECT_THROW
00047     // google google test for more
00048 
00049     const double linVel = 0.05;
00050     const double rotVel = 0.3;
00051 
00052     // check set/get methods
00053     EXPECT_THROW(ctg->setVelocityLimits(-linVel, rotVel), std::invalid_argument);
00054     EXPECT_THROW(ctg->setVelocityLimits(linVel, -rotVel), std::invalid_argument);
00055     EXPECT_THROW(ctg->setAccelerationLimits(-linVel, rotVel), std::invalid_argument);
00056     EXPECT_THROW(ctg->setAccelerationLimits(linVel, -rotVel), std::invalid_argument);
00057 
00058     ctg->setVelocityLimits(linVel, rotVel);
00059     ctg->setAccelerationLimits(linVel, rotVel);
00060     EXPECT_EQ(linVel, ctg->getLinearVelocityLimit());
00061     EXPECT_EQ(rotVel, ctg->getRotationalVelocityLimit());
00062     EXPECT_EQ(linVel, ctg->getLinearAccelerationLimit());
00063     EXPECT_EQ(rotVel, ctg->getRotationalAccelerationLimit());
00064 }
00065 
00066 TEST_F(TrapVelTrajectoryGeneratorTest, TrapezoidalVelocityCartTrajTest)
00067 {
00068     const double linVel = 0.045;
00069     const double rotVel = 0.31;
00070 
00071     ctg->setVelocityLimits(linVel, rotVel);
00072     ctg->setAccelerationLimits(linVel, rotVel);
00073 
00074     // check trajectory
00075     KDL::FrameAcc currPose, desPose, startTest, endTest, testPose, testPose2;
00076     currPose.p.p.x(0.);
00077     currPose.p.p.y(0.);
00078     currPose.p.p.z(0.);
00079     currPose.M.R = KDL::Rotation::Quaternion(0, 0, 0, 1);
00080     currPose.M.w.x(0.);
00081     desPose.p.p.x(1.);
00082     desPose.p.p.y(2.);
00083     desPose.p.p.z(3.);
00084     desPose.M.R = currPose.M.R;
00085     desPose.M.R.DoRotX(.3);
00086     desPose.M.R.DoRotY(0.);
00087     desPose.M.R.DoRotZ(0.);
00088     double x, y, z, w;
00089     desPose.M.R.GetQuaternion(x, y, z, w);
00090     std::cout << "x,y,z,w: " << x << ", " << y << ", " << z << ", " << w << std::endl;
00091 
00092     ctptr = ctg->getTrajectory(currPose, desPose);
00093     ctptr->getPose(ctptr->getDuration(), endTest);
00094     EXPECT_EQ(desPose.GetFrame(), endTest.GetFrame());
00095     ctptr->getPose(0., startTest);
00096     EXPECT_EQ(currPose.GetFrame(), startTest.GetFrame());
00097 
00098     double prevLinDist = 0.;
00099     double totLinDist  = (endTest.p.p - startTest.p.p).Norm();
00100     startTest.M.R.GetQuaternion(x, y, z, w);
00101     tf::Quaternion startQuat(x, y, z, w);
00102     endTest.M.R.GetQuaternion(x, y, z, w);
00103     tf::Quaternion endQuat(x, y, z, w);
00104     double totRotDist  = std::fabs(endQuat.angleShortestPath(startQuat));
00105     double prevRotDist = 0.;
00106 
00107     double timeStep = 0.01;
00108     ctptr->getPose(0., testPose);
00109     std::ofstream file;
00110 
00111     if (outputFlag)
00112     {
00113         file.open("testCart.csv");
00114         file << 0.;
00115         file << ", " << testPose.p.p.x();
00116         file << ", " << testPose.p.p.y();
00117         file << ", " << testPose.p.p.z();
00118         file << ", " << startQuat.x() << ", " << startQuat.y() << ", " << startQuat.z() << ", " << startQuat.w();
00119         file << std::endl;
00120     }
00121 
00122     for (double time = timeStep; time < ctptr->getDuration(); time += timeStep)
00123     {
00124         // check lin velocity
00125         testPose2 = testPose;
00126         ctptr->getPose(time, testPose);
00127 
00128         if (outputFlag)
00129         {
00130             file << time;
00131             file << ", " << testPose.p.p.x();
00132             file << ", " << testPose.p.p.y();
00133             file << ", " << testPose.p.p.z();
00134         }
00135 
00136         EXPECT_LE((testPose.p.p - testPose2.p.p).Norm() / timeStep, sqrt(linVel * linVel * 3));
00137 
00138         // check rot velocity
00139         testPose2.M.R.GetQuaternion(x, y, z, w);
00140         tf::Quaternion quat1(x, y, z, w);
00141         testPose.M.R.GetQuaternion(x, y, z, w);
00142         tf::Quaternion quat2(x, y, z, w);
00143         EXPECT_LE(std::fabs(quat2.angleShortestPath(quat1) / timeStep), rotVel);
00144 
00145         if (outputFlag)
00146         {
00147             file << ", " << quat2.x() << ", " << quat2.y() << ", " << quat2.z() << ", " << quat2.w();
00148             file << std::endl;
00149         }
00150 
00151         // check distance along path
00152         double linDist = (testPose.p.p - startTest.p.p).Norm();
00153         EXPECT_GE(linDist, prevLinDist);
00154 
00155         if (totLinDist > 0)
00156         {
00157             EXPECT_GE(linDist / totLinDist, 0);
00158             EXPECT_LE(linDist / totLinDist, 1);
00159         }
00160 
00161         double linDistToEnd = (endTest.p.p - testPose.p.p).Norm();
00162         EXPECT_LE(totLinDist - linDistToEnd - linDist, 0.0001);
00163         prevLinDist = linDist;
00164 
00165         // check angle along path
00166         double rotDist = std::fabs(quat2.angleShortestPath(startQuat));
00167         EXPECT_GE(rotDist, prevRotDist);
00168 
00169         if (totRotDist > 0)
00170         {
00171             EXPECT_GE(rotDist / totRotDist, 0);
00172             EXPECT_LE(rotDist / totRotDist, 1);
00173         }
00174 
00175         double rotDistToEnd = std::fabs(quat2.angleShortestPath(endQuat));
00176         EXPECT_LE(totRotDist - rotDistToEnd - rotDist, 0.0001);
00177         prevRotDist = rotDist;
00178     }
00179 
00180     ctptr->getPose(ctptr->getDuration(), testPose);
00181 
00182     if (outputFlag)
00183     {
00184         file << ctptr->getDuration();
00185         file << ", " << testPose.p.p.x();
00186         file << ", " << testPose.p.p.y();
00187         file << ", " << testPose.p.p.z();
00188         file << ", " << endQuat.x() << ", " << endQuat.y() << ", " << endQuat.z() << ", " << endQuat.w();
00189         file << std::endl;
00190         file.close();
00191     }
00192 
00193     // give a longer time and make sure it takes longer
00194     double timeToFinish = ctptr->getDuration() * 2.;
00195     ctptr = ctg->getTrajectory(currPose, desPose, timeToFinish);
00196     EXPECT_EQ(timeToFinish, ctptr->getDuration());
00197 }
00198 
00199 TEST_F(TrapVelTrajectoryGeneratorTest, TrapezoidalVelocityCartZeroVelTrajTest)
00200 {
00201     const double linVel = 0.05;
00202     const double rotVel = 0.3;
00203 
00204     ctg->setVelocityLimits(0., rotVel);
00205     ctg->setAccelerationLimits(0., rotVel);
00206 
00207     // check trajectory
00208     KDL::FrameAcc currPose, desPose;
00209     currPose.p.p.x(0.);
00210     currPose.p.p.y(0.);
00211     currPose.p.p.z(0.);
00212     currPose.M.R = KDL::Rotation::Quaternion(0, 0, 0, 1);
00213     desPose.p.p.x(1.);
00214     desPose.p.p.y(2.);
00215     desPose.p.p.z(3.);
00216     desPose.M.R = currPose.M.R;
00217     desPose.M.R.DoRotX(.3);
00218     desPose.M.R.DoRotY(.2);
00219     desPose.M.R.DoRotZ(.1);
00220     std::vector<KDL::FrameAcc> traj;
00221 
00222     EXPECT_THROW(ctg->getTrajectory(currPose, desPose), std::runtime_error);
00223 
00224     ctg->setVelocityLimits(linVel, 0.);
00225 
00226     EXPECT_THROW(ctg->getTrajectory(currPose, desPose), std::runtime_error);
00227 }
00228 
00229 TEST_F(TrapVelTrajectoryGeneratorTest, TrapezoidalVelocityJointGetSetTest)
00230 {
00231     std::vector<double> jntLimits(3);
00232     jntLimits.at(0) = .1;
00233     jntLimits.at(1) = .2;
00234     jntLimits.at(2) = .3;
00235 
00236     // check set/get methods
00237     jtg->setLimits(jntLimits, jntLimits);
00238     EXPECT_EQ(jntLimits, jtg->getVelocityLimits());
00239     EXPECT_EQ(jntLimits, jtg->getAccelerationLimits());
00240 
00241     for (unsigned int i = 0; i < jntLimits.size(); ++i)
00242     {
00243         EXPECT_EQ(jntLimits.at(i), jtg->getVelocityLimit(i));
00244         EXPECT_EQ(jntLimits.at(i), jtg->getAccelerationLimit(i));
00245     }
00246 
00247     EXPECT_ANY_THROW(jtg->getVelocityLimit(jntLimits.size())); // one past the end
00248     EXPECT_ANY_THROW(jtg->getAccelerationLimit(jntLimits.size())); // one past the end
00249 }
00250 
00251 TEST_F(TrapVelTrajectoryGeneratorTest, TrapezoidalVelocityJointTrajTest)
00252 {
00253     double eps = std::numeric_limits<float>::epsilon();
00254 
00255     std::vector<double> jntLimits(5);
00256     jntLimits.at(0) = .1;
00257     jntLimits.at(1) = .2;
00258     jntLimits.at(2) = .3;
00259     jntLimits.at(3) = .15;
00260     jntLimits.at(4) = .25;
00261 
00262     KDL::JntArrayAcc jntStart(5);
00263     jntStart.q(0)    = 0;
00264     jntStart.q(1)    = 0;
00265     jntStart.q(2)    = 0;
00266     jntStart.q(3)    = 0;
00267     jntStart.q(4)    = 0;
00268     jntStart.qdot(0) = 0;
00269     jntStart.qdot(1) = -.01;
00270     jntStart.qdot(2) = .03;
00271     jntStart.qdot(3) = -.05;
00272     jntStart.qdot(4) = 0;
00273 
00274     KDL::JntArrayAcc jntEnd(5);
00275     jntEnd.q(0)    = 15.*3.14 / 180;
00276     jntEnd.q(1)    = -20.*3.14 / 180;
00277     jntEnd.q(2)    = 30.*3.14 / 180;
00278     jntEnd.q(3)    = -25.*3.14 / 180;
00279     jntEnd.q(4)    = 10.*3.14 / 180;
00280     jntEnd.qdot(0) = 0;
00281     jntEnd.qdot(1) = .01;
00282     jntEnd.qdot(2) = .03;
00283     jntEnd.qdot(3) = 0;
00284     jntEnd.qdot(4) = .02;
00285 
00286     jtg->setLimits(jntLimits, jntLimits);
00287 
00288     // check trajectory
00289     KDL::JntArrayAcc startTest, endTest, testPose, testPose2;
00290     jtptr = jtg->getTrajectory(jntStart, jntEnd);
00291     jtptr->getPose(0., startTest);
00292     jtptr->getPose(jtptr->getDuration(), endTest);
00293 
00294     for (unsigned int i = 0; i < endTest.q.rows(); ++i)
00295     {
00296         EXPECT_FLOAT_EQ(jntEnd.q(i), endTest.q(i));
00297         EXPECT_FLOAT_EQ(jntStart.q(i), startTest.q(i));
00298     }
00299 
00300     KDL::JntArray prevDist(5);
00301     KDL::JntArray totDist(jntStart.q.rows());
00302 
00303     for (unsigned int i = 0; i < totDist.rows(); ++i)
00304     {
00305         totDist(i) = std::fabs(endTest.q(i) - startTest.q(i));
00306     }
00307 
00308     double timeStep = 0.01;
00309     jtptr->getPose(0., testPose);
00310 
00311     std::ofstream file;
00312 
00313     if (outputFlag)
00314     {
00315         file.open("test.csv");
00316         file << 0.;
00317 
00318         for (unsigned int i = 0; i < testPose.q.rows(); ++i)
00319         {
00320             file << ", " << testPose.q(i) << ", " << testPose.qdot(i) << ", " << testPose.qdotdot(i);
00321         }
00322 
00323         file << std::endl;
00324     }
00325 
00326     for (double time = timeStep; time < jtptr->getDuration(); time += timeStep)
00327     {
00328         testPose2 = testPose;
00329         jtptr->getPose(time, testPose);
00330 
00331         if (outputFlag)
00332         {
00333             file << time;
00334 
00335             for (unsigned int i = 0; i < testPose.q.rows(); ++i)
00336             {
00337                 file << ", " << testPose.q(i) << ", " << testPose.qdot(i) << ", " << testPose.qdotdot(i);
00338             }
00339 
00340             file << std::endl;
00341         }
00342 
00343         for (unsigned int j = 0; j < jntStart.q.rows(); ++j)
00344         {
00345             // check velocity
00346             EXPECT_LE(fabs(testPose.q(j) - testPose2.q(j)) / timeStep, jntLimits.at(j) + eps);
00347 
00348             // check distance along path
00349             if (jntStart.qdot(j) == 0. && jntEnd.qdot(j) == 0.)
00350             {
00351                 double dist = std::fabs(testPose.q(j) - jntStart.q(j));
00352                 EXPECT_GE(dist, prevDist(j));
00353 
00354                 if (totDist(j) > 0)
00355                 {
00356                     EXPECT_GE(dist / totDist(j), 0);
00357                     EXPECT_LE(dist / totDist(j), 1);
00358                 }
00359 
00360                 double distToEnd = std::fabs(endTest.q(j) - testPose.q(j));
00361                 EXPECT_FLOAT_EQ(dist, totDist(j) - distToEnd);
00362                 prevDist(j) = dist;
00363             }
00364         }
00365     }
00366 
00367     jtptr->getPose(jtptr->getDuration(), testPose);
00368 
00369     if (outputFlag)
00370     {
00371         file << jtptr->getDuration();
00372 
00373         for (unsigned int i = 0; i < testPose.q.rows(); ++i)
00374         {
00375             file << ", " << testPose.q(i) << ", " << testPose.qdot(i) << ", " << testPose.qdotdot(i);
00376         }
00377 
00378         file << std::endl;
00379         file.close();
00380     }
00381 }
00382 
00383 TEST_F(TrapVelTrajectoryGeneratorTest, TrapezoidalVelocityJointZeroVelTrajTest)
00384 {
00385     std::vector<double> jntLimits(5);
00386     jntLimits.at(0) = .1;
00387     jntLimits.at(1) = .2;
00388     jntLimits.at(2) = .3;
00389     jntLimits.at(3) = .15;
00390     jntLimits.at(4) = .25;
00391 
00392     KDL::JntArrayAcc jntStart(5);
00393     jntStart.q(0) = 0;
00394     jntStart.q(1) = 0;
00395     jntStart.q(2) = 0;
00396     jntStart.q(3) = 0;
00397     jntStart.q(4) = 0;
00398 
00399     KDL::JntArrayAcc jntEnd(4);
00400     jntEnd.q(0) = 15.*3.14 / 180;
00401     jntEnd.q(1) = 20.*3.14 / 180;
00402     jntEnd.q(2) = 30.*3.14 / 180;
00403     jntEnd.q(3) = 25.*3.14 / 180;
00404 
00405     jtg->setLimits(jntLimits, jntLimits);
00406 
00407     // mismatched lengths
00408     EXPECT_THROW(jtg->getTrajectory(jntStart, jntEnd), std::runtime_error);
00409 
00410     // zero vel
00411     jntEnd.resize(5);
00412     jntEnd.q(0)     = 15.*3.14 / 180;
00413     jntEnd.q(1)     = 20.*3.14 / 180;
00414     jntEnd.q(2)     = 30.*3.14 / 180;
00415     jntEnd.q(3)     = 25.*3.14 / 180;
00416     jntEnd.q(4)     = 10.*3.14 / 180;
00417     jntLimits.at(3) = 0.;
00418     jtg->setLimits(jntLimits, jntLimits);
00419     EXPECT_THROW(jtg->getTrajectory(jntStart, jntEnd), std::runtime_error);
00420 }
00421 
00422 
00423 TEST_F(TrapVelTrajectoryGeneratorTest, TrapezoidalVelocityUtilityDurationTest)
00424 {
00425     TrapezoidalVelocityUtility tvu;
00426     double t1, t2, t3;
00427 
00429     tvu.setConstraints(0, 1.5, 0, 0, 0, 0);
00430     tvu.duration(1.0, 1.0);
00431     tvu.getTimes(t1, t2, t3);
00432 
00433     EXPECT_FLOAT_EQ(1.0, t1);
00434     EXPECT_FLOAT_EQ(1.5, t2);
00435     EXPECT_FLOAT_EQ(2.5, t3);
00436 
00437     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00438     EXPECT_FLOAT_EQ(0.5, tvu.p(1.0));
00439     EXPECT_FLOAT_EQ(1.0, tvu.p(1.5));
00440     EXPECT_FLOAT_EQ(1.5, tvu.p(2.5));
00441 
00442     EXPECT_FLOAT_EQ(0.0, tvu.v(0.0));
00443     EXPECT_FLOAT_EQ(1.0, tvu.v(1.0));
00444     EXPECT_FLOAT_EQ(1.0, tvu.v(1.5));
00445     EXPECT_FLOAT_EQ(0.0, tvu.v(2.5));
00446 
00447     EXPECT_FLOAT_EQ(1.0, tvu.a(0.0));
00448     EXPECT_FLOAT_EQ(1.0, tvu.a(1.0));
00449     EXPECT_FLOAT_EQ(0.0, tvu.a(1.5));
00450     EXPECT_FLOAT_EQ(-1.0, tvu.a(2.5));
00451 
00452     tvu.setDuration(2.5);
00453     tvu.getTimes(t1, t2, t3);
00454 
00455     EXPECT_FLOAT_EQ(1.0, t1);
00456     EXPECT_FLOAT_EQ(1.5, t2);
00457     EXPECT_FLOAT_EQ(2.5, t3);
00458 
00459     EXPECT_FLOAT_EQ(1.5, tvu.p(2.5));
00460     EXPECT_FLOAT_EQ(0, tvu.v(2.5));
00461 
00463     tvu.setConstraints(0, -1.5, 0, 0, 0, 0);
00464     tvu.duration(1.0, 1.0);
00465     tvu.getTimes(t1, t2, t3);
00466 
00467     EXPECT_FLOAT_EQ(1.0, t1);
00468     EXPECT_FLOAT_EQ(1.5, t2);
00469     EXPECT_FLOAT_EQ(2.5, t3);
00470 
00471     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00472     EXPECT_FLOAT_EQ(-0.5, tvu.p(1.0));
00473     EXPECT_FLOAT_EQ(-1.0, tvu.p(1.5));
00474     EXPECT_FLOAT_EQ(-1.5, tvu.p(2.5));
00475 
00476     EXPECT_FLOAT_EQ(0.0, tvu.v(0.0));
00477     EXPECT_FLOAT_EQ(-1.0, tvu.v(1.0));
00478     EXPECT_FLOAT_EQ(-1.0, tvu.v(1.5));
00479     EXPECT_FLOAT_EQ(0.0, tvu.v(2.5));
00480 
00481     EXPECT_FLOAT_EQ(-1.0, tvu.a(0.0));
00482     EXPECT_FLOAT_EQ(-1.0, tvu.a(1.0));
00483     EXPECT_FLOAT_EQ(0.0, tvu.a(1.5));
00484     EXPECT_FLOAT_EQ(1.0, tvu.a(2.5));
00485 
00487     tvu.setConstraints(0, 1.5, 1.0, 0, 0, 0);
00488     tvu.duration(1.0, 1.0);
00489     tvu.getTimes(t1, t2, t3);
00490 
00491     EXPECT_FLOAT_EQ(0, t1);
00492     EXPECT_FLOAT_EQ(1.0, t2);
00493     EXPECT_FLOAT_EQ(2.0, t3);
00494 
00495     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00496     EXPECT_FLOAT_EQ(1.0, tvu.p(1.0));
00497     EXPECT_FLOAT_EQ(1.5, tvu.p(2.0));
00498 
00499     EXPECT_FLOAT_EQ(1.0, tvu.v(0.0));
00500     EXPECT_FLOAT_EQ(1.0, tvu.v(1.0));
00501     EXPECT_FLOAT_EQ(0.0, tvu.v(2.0));
00502 
00503     EXPECT_FLOAT_EQ(0.0, tvu.a(0.0));
00504     EXPECT_FLOAT_EQ(0.0, tvu.a(1.0));
00505     EXPECT_FLOAT_EQ(-1.0, tvu.a(2.0));
00506 
00508     tvu.setConstraints(0, -1.5, -1.0, 0, 0, 0);
00509     tvu.duration(1.0, 1.0);
00510     tvu.getTimes(t1, t2, t3);
00511 
00512     EXPECT_FLOAT_EQ(0, t1);
00513     EXPECT_FLOAT_EQ(1.0, t2);
00514     EXPECT_FLOAT_EQ(2.0, t3);
00515 
00516     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00517     EXPECT_FLOAT_EQ(-1.0, tvu.p(1.0));
00518     EXPECT_FLOAT_EQ(-1.5, tvu.p(2.0));
00519 
00520     EXPECT_FLOAT_EQ(-1.0, tvu.v(0.0));
00521     EXPECT_FLOAT_EQ(-1.0, tvu.v(1.0));
00522     EXPECT_FLOAT_EQ(0.0, tvu.v(2.0));
00523 
00524     EXPECT_FLOAT_EQ(0.0, tvu.a(0.0));
00525     EXPECT_FLOAT_EQ(0.0, tvu.a(1.0));
00526     EXPECT_FLOAT_EQ(1.0, tvu.a(2.0));
00527 
00529     tvu.setConstraints(0, 1.5, -1.0, 0, 0, 0);
00530     tvu.duration(1.0, 1.0);
00531     tvu.getTimes(t1, t2, t3);
00532 
00533     EXPECT_FLOAT_EQ(2.0, t1);
00534     EXPECT_FLOAT_EQ(3.0, t2);
00535     EXPECT_FLOAT_EQ(4.0, t3);
00536 
00537     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00538     EXPECT_FLOAT_EQ(0.0, tvu.p(2.0));
00539     EXPECT_FLOAT_EQ(1.0, tvu.p(3.0));
00540     EXPECT_FLOAT_EQ(1.5, tvu.p(4.0));
00541 
00542     EXPECT_FLOAT_EQ(-1.0, tvu.v(0.0));
00543     EXPECT_FLOAT_EQ(1.0, tvu.v(2.0));
00544     EXPECT_FLOAT_EQ(1.0, tvu.v(3.0));
00545     EXPECT_FLOAT_EQ(0.0, tvu.v(4.0));
00546 
00547     EXPECT_FLOAT_EQ(1.0, tvu.a(0.0));
00548     EXPECT_FLOAT_EQ(1.0, tvu.a(2.0));
00549     EXPECT_FLOAT_EQ(0.0, tvu.a(3.0));
00550     EXPECT_FLOAT_EQ(-1.0, tvu.a(4.0));
00551 
00553     tvu.setConstraints(0, -1.5, 1.0, 0, 0, 0);
00554     tvu.duration(1.0, 1.0);
00555     tvu.getTimes(t1, t2, t3);
00556 
00557     EXPECT_FLOAT_EQ(2.0, t1);
00558     EXPECT_FLOAT_EQ(3.0, t2);
00559     EXPECT_FLOAT_EQ(4.0, t3);
00560 
00561     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00562     EXPECT_FLOAT_EQ(0.0, tvu.p(2.0));
00563     EXPECT_FLOAT_EQ(-1.0, tvu.p(3.0));
00564     EXPECT_FLOAT_EQ(-1.5, tvu.p(4.0));
00565 
00566     EXPECT_FLOAT_EQ(1.0, tvu.v(0.0));
00567     EXPECT_FLOAT_EQ(-1.0, tvu.v(2.0));
00568     EXPECT_FLOAT_EQ(-1.0, tvu.v(3.0));
00569     EXPECT_FLOAT_EQ(0.0, tvu.v(4.0));
00570 
00571     EXPECT_FLOAT_EQ(-1.0, tvu.a(0.0));
00572     EXPECT_FLOAT_EQ(-1.0, tvu.a(2.0));
00573     EXPECT_FLOAT_EQ(0.0, tvu.a(3.0));
00574     EXPECT_FLOAT_EQ(1.0, tvu.a(4.0));
00575 
00577     tvu.setConstraints(0, 1.5, 0.0, 1.0, 0, 0);
00578     tvu.duration(1.0, 1.0);
00579     tvu.getTimes(t1, t2, t3);
00580 
00581     EXPECT_FLOAT_EQ(1.0, t1);
00582     EXPECT_FLOAT_EQ(2.0, t2);
00583     EXPECT_FLOAT_EQ(2.0, t3);
00584 
00585     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00586     EXPECT_FLOAT_EQ(0.5, tvu.p(1.0));
00587     EXPECT_FLOAT_EQ(1.5, tvu.p(2.0));
00588 
00589     EXPECT_FLOAT_EQ(0.0, tvu.v(0.0));
00590     EXPECT_FLOAT_EQ(1.0, tvu.v(1.0));
00591     EXPECT_FLOAT_EQ(1.0, tvu.v(2.0));
00592 
00593     EXPECT_FLOAT_EQ(1.0, tvu.a(0.0));
00594     EXPECT_FLOAT_EQ(1.0, tvu.a(1.0));
00595     EXPECT_FLOAT_EQ(0.0, tvu.a(2.0));
00596 
00598     tvu.setConstraints(0, -1.5, 0.0, -1.0, 0, 0);
00599     tvu.duration(1.0, 1.0);
00600     tvu.getTimes(t1, t2, t3);
00601 
00602     EXPECT_FLOAT_EQ(1.0, t1);
00603     EXPECT_FLOAT_EQ(2.0, t2);
00604     EXPECT_FLOAT_EQ(2.0, t3);
00605 
00606     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00607     EXPECT_FLOAT_EQ(-0.5, tvu.p(1.0));
00608     EXPECT_FLOAT_EQ(-1.5, tvu.p(2.0));
00609 
00610     EXPECT_FLOAT_EQ(0.0, tvu.v(0.0));
00611     EXPECT_FLOAT_EQ(-1.0, tvu.v(1.0));
00612     EXPECT_FLOAT_EQ(-1.0, tvu.v(2.0));
00613 
00614     EXPECT_FLOAT_EQ(-1.0, tvu.a(0.0));
00615     EXPECT_FLOAT_EQ(-1.0, tvu.a(1.0));
00616     EXPECT_FLOAT_EQ(0.0, tvu.a(2.0));
00617 
00619     tvu.setConstraints(0, 1.5, 0.0, -1.0, 0, 0);
00620     tvu.duration(1.0, 1.0);
00621     tvu.getTimes(t1, t2, t3);
00622 
00623     EXPECT_FLOAT_EQ(1.0, t1);
00624     EXPECT_FLOAT_EQ(2.0, t2);
00625     EXPECT_FLOAT_EQ(4.0, t3);
00626 
00627     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00628     EXPECT_FLOAT_EQ(0.5, tvu.p(1.0));
00629     EXPECT_FLOAT_EQ(1.5, tvu.p(2.0));
00630     EXPECT_FLOAT_EQ(1.5, tvu.p(4.0));
00631 
00632     EXPECT_FLOAT_EQ(0.0, tvu.v(0.0));
00633     EXPECT_FLOAT_EQ(1.0, tvu.v(1.0));
00634     EXPECT_FLOAT_EQ(1.0, tvu.v(2.0));
00635     EXPECT_FLOAT_EQ(-1.0, tvu.v(4.0));
00636 
00637     EXPECT_FLOAT_EQ(1.0, tvu.a(0.0));
00638     EXPECT_FLOAT_EQ(1.0, tvu.a(1.0));
00639     EXPECT_FLOAT_EQ(0.0, tvu.a(2.0));
00640     EXPECT_FLOAT_EQ(-1.0, tvu.a(4.0));
00641 
00643     tvu.setConstraints(0, -1.5, 0.0, 1.0, 0, 0);
00644     tvu.duration(1.0, 1.0);
00645     tvu.getTimes(t1, t2, t3);
00646 
00647     EXPECT_FLOAT_EQ(1.0, t1);
00648     EXPECT_FLOAT_EQ(2.0, t2);
00649     EXPECT_FLOAT_EQ(4.0, t3);
00650 
00651     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00652     EXPECT_FLOAT_EQ(-0.5, tvu.p(1.0));
00653     EXPECT_FLOAT_EQ(-1.5, tvu.p(2.0));
00654     EXPECT_FLOAT_EQ(-1.5, tvu.p(4.0));
00655 
00656     EXPECT_FLOAT_EQ(0.0, tvu.v(0.0));
00657     EXPECT_FLOAT_EQ(-1.0, tvu.v(1.0));
00658     EXPECT_FLOAT_EQ(-1.0, tvu.v(2.0));
00659     EXPECT_FLOAT_EQ(1.0, tvu.v(4.0));
00660 
00661     EXPECT_FLOAT_EQ(-1.0, tvu.a(0.0));
00662     EXPECT_FLOAT_EQ(-1.0, tvu.a(1.0));
00663     EXPECT_FLOAT_EQ(0.0, tvu.a(2.0));
00664     EXPECT_FLOAT_EQ(1.0, tvu.a(4.0));
00665 
00667     tvu.setConstraints(0, 1.5, 2.0, 1.0, 0, 0);
00668     tvu.duration(2.0, 1.0);
00669     tvu.getTimes(t1, t2, t3);
00670 
00671     EXPECT_FLOAT_EQ(0.0, t1);
00672     EXPECT_FLOAT_EQ(0.0, t2);
00673     EXPECT_FLOAT_EQ(1.0, t3);
00674 
00675     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00676     EXPECT_FLOAT_EQ(1.5, tvu.p(1.0));
00677 
00678     EXPECT_FLOAT_EQ(2.0, tvu.v(0.0));
00679     EXPECT_FLOAT_EQ(1.0, tvu.v(1.0));
00680 
00681     EXPECT_FLOAT_EQ(0.0, tvu.a(0.0));
00682     EXPECT_FLOAT_EQ(-1.0, tvu.a(1.0));
00683 
00685     tvu.setConstraints(0, 1.5, 1.0, 2.0, 0, 0);
00686     tvu.duration(2.0, 1.0);
00687     tvu.getTimes(t1, t2, t3);
00688 
00689     EXPECT_FLOAT_EQ(1.0, t1);
00690     EXPECT_FLOAT_EQ(1.0, t2);
00691     EXPECT_FLOAT_EQ(1.0, t3);
00692 
00693     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00694     EXPECT_FLOAT_EQ(1.5, tvu.p(1.0));
00695 
00696     EXPECT_FLOAT_EQ(1.0, tvu.v(0.0));
00697     EXPECT_FLOAT_EQ(2.0, tvu.v(1.0));
00698 
00699     EXPECT_FLOAT_EQ(1.0, tvu.a(0.0));
00700     EXPECT_FLOAT_EQ(1.0, tvu.a(1.0));
00701 
00703     tvu.setConstraints(0, -1.5, -1.0, -2.0, 0, 0);
00704     tvu.duration(2.0, 1.0);
00705     tvu.getTimes(t1, t2, t3);
00706 
00707     EXPECT_FLOAT_EQ(1.0, t1);
00708     EXPECT_FLOAT_EQ(1.0, t2);
00709     EXPECT_FLOAT_EQ(1.0, t3);
00710 
00711     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00712     EXPECT_FLOAT_EQ(-1.5, tvu.p(1.0));
00713 
00714     EXPECT_FLOAT_EQ(-1.0, tvu.v(0.0));
00715     EXPECT_FLOAT_EQ(-2.0, tvu.v(1.0));
00716 
00717     EXPECT_FLOAT_EQ(-1.0, tvu.a(0.0));
00718     EXPECT_FLOAT_EQ(-1.0, tvu.a(1.0));
00719 
00721     tvu.setConstraints(0, -1.5, -2.0, -1.0, 0, 0);
00722     tvu.duration(2.0, 1.0);
00723     tvu.getTimes(t1, t2, t3);
00724 
00725     EXPECT_FLOAT_EQ(0.0, t1);
00726     EXPECT_FLOAT_EQ(0.0, t2);
00727     EXPECT_FLOAT_EQ(1.0, t3);
00728 
00729     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00730     EXPECT_FLOAT_EQ(-1.5, tvu.p(1.0));
00731 
00732     EXPECT_FLOAT_EQ(-2.0, tvu.v(0.0));
00733     EXPECT_FLOAT_EQ(-1.0, tvu.v(1.0));
00734 
00735     EXPECT_FLOAT_EQ(0.0, tvu.a(0.0));
00736     EXPECT_FLOAT_EQ(1.0, tvu.a(1.0));
00737 
00741 
00744     tvu.setConstraints(0, 0.5, 0, 0);
00745     tvu.duration(2.0, 1.0);
00746     tvu.getTimes(t1, t2, t3);
00747 
00748     EXPECT_FLOAT_EQ(0.70710678, t1);
00749     EXPECT_FLOAT_EQ(0.70710678, t2);
00750     EXPECT_FLOAT_EQ(1.4142135623, t3);
00751 
00752     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00753     EXPECT_FLOAT_EQ(0.25, tvu.p(0.70710678));
00754     EXPECT_FLOAT_EQ(0.5, tvu.p(1.4142135623));
00755 
00756     EXPECT_FLOAT_EQ(0.0, tvu.v(0.0));
00757     EXPECT_FLOAT_EQ(0.70710678, tvu.v(0.70710678));
00758     EXPECT_NEAR(0.0, tvu.v(1.4142135623), 1e-10);
00759 
00760     EXPECT_FLOAT_EQ(1.0, tvu.a(0.0));
00761     EXPECT_FLOAT_EQ(1.0, tvu.a(0.70710678));
00762     EXPECT_FLOAT_EQ(-1.0, tvu.a(1.4142135623));
00763 
00765     tvu.setConstraints(0, - 0.5, 0, 0);
00766     tvu.duration(2.0, 1.0);
00767     tvu.getTimes(t1, t2, t3);
00768 
00769     EXPECT_FLOAT_EQ(0.70710678, t1);
00770     EXPECT_FLOAT_EQ(0.70710678, t2);
00771     EXPECT_FLOAT_EQ(1.4142135623, t3);
00772 
00773     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00774     EXPECT_FLOAT_EQ(-0.25, tvu.p(0.70710678));
00775     EXPECT_FLOAT_EQ(-0.5, tvu.p(1.4142135623));
00776 
00777     EXPECT_FLOAT_EQ(0.0, tvu.v(0.0));
00778     EXPECT_FLOAT_EQ(-0.70710678, tvu.v(0.70710678));
00779     EXPECT_NEAR(0.0, tvu.v(1.4142135623), 1e-10);
00780 
00781     EXPECT_FLOAT_EQ(-1.0, tvu.a(0.0));
00782     EXPECT_FLOAT_EQ(-1.0, tvu.a(0.70710678));
00783     EXPECT_FLOAT_EQ(1.0, tvu.a(1.4142135623));
00784 
00787     tvu.setConstraints(0, 0.5, 1.0, 0);
00788     tvu.duration(2.0, 1.0);
00789     tvu.getTimes(t1, t2, t3);
00790 
00791     EXPECT_FLOAT_EQ(0.0, t1);
00792     EXPECT_FLOAT_EQ(0.0, t2);
00793     EXPECT_FLOAT_EQ(1.0, t3);
00794 
00795     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00796     EXPECT_FLOAT_EQ(0.5, tvu.p(1.0));
00797 
00798     EXPECT_FLOAT_EQ(1.0, tvu.v(0.0));
00799     EXPECT_FLOAT_EQ(0.0, tvu.v(1.0));
00800 
00801     EXPECT_FLOAT_EQ(0.0, tvu.a(0.0));
00802     EXPECT_FLOAT_EQ(-1.0, tvu.a(1.0));
00803 
00805     tvu.setConstraints(0, 0.5, -1.0, 0);
00806     tvu.duration(2.0, 1.0);
00807     tvu.getTimes(t1, t2, t3);
00808 
00809     EXPECT_FLOAT_EQ(2.0, t1);
00810     EXPECT_FLOAT_EQ(2.0, t2);
00811     EXPECT_FLOAT_EQ(3.0, t3);
00812 
00813     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00814     EXPECT_FLOAT_EQ(0.0, tvu.p(2.0));
00815     EXPECT_FLOAT_EQ(0.5, tvu.p(3.0));
00816 
00817     EXPECT_FLOAT_EQ(-1.0, tvu.v(0.0));
00818     EXPECT_FLOAT_EQ(1.0, tvu.v(2.0));
00819     EXPECT_FLOAT_EQ(0.0, tvu.v(3.0));
00820 
00821     EXPECT_FLOAT_EQ(1.0, tvu.a(0.0));
00822     EXPECT_FLOAT_EQ(1.0, tvu.a(2.0));
00823     EXPECT_FLOAT_EQ(-1.0, tvu.a(3.0));
00824 
00826     tvu.setConstraints(0, -0.5, -1.0, 0);
00827     tvu.duration(2.0, 1.0);
00828     tvu.getTimes(t1, t2, t3);
00829 
00830     EXPECT_FLOAT_EQ(0.0, t1);
00831     EXPECT_FLOAT_EQ(0.0, t2);
00832     EXPECT_FLOAT_EQ(1.0, t3);
00833 
00834     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00835     EXPECT_FLOAT_EQ(-0.5, tvu.p(1.0));
00836 
00837     EXPECT_FLOAT_EQ(-1.0, tvu.v(0.0));
00838     EXPECT_FLOAT_EQ(0.0, tvu.v(1.0));
00839 
00840     EXPECT_FLOAT_EQ(0.0, tvu.a(0.0));
00841     EXPECT_FLOAT_EQ(1.0, tvu.a(1.0));
00842 
00844     tvu.setConstraints(0, -0.5, 1.0, 0);
00845     tvu.duration(2.0, 1.0);
00846     tvu.getTimes(t1, t2, t3);
00847 
00848     EXPECT_FLOAT_EQ(2.0, t1);
00849     EXPECT_FLOAT_EQ(2.0, t2);
00850     EXPECT_FLOAT_EQ(3.0, t3);
00851 
00852     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00853     EXPECT_FLOAT_EQ(0.0, tvu.p(2.0));
00854     EXPECT_FLOAT_EQ(-0.5, tvu.p(3.0));
00855 
00856     EXPECT_FLOAT_EQ(1.0, tvu.v(0.0));
00857     EXPECT_FLOAT_EQ(-1.0, tvu.v(2.0));
00858     EXPECT_FLOAT_EQ(0.0, tvu.v(3.0));
00859 
00860     EXPECT_FLOAT_EQ(-1.0, tvu.a(0.0));
00861     EXPECT_FLOAT_EQ(-1.0, tvu.a(2.0));
00862     EXPECT_FLOAT_EQ(1.0, tvu.a(3.0));
00863 
00866     tvu.setConstraints(0, 0.5, 0.0, 1.0);
00867     tvu.duration(2.0, 1.0);
00868     tvu.getTimes(t1, t2, t3);
00869 
00870     EXPECT_FLOAT_EQ(1.0, t1);
00871     EXPECT_FLOAT_EQ(1.0, t2);
00872     EXPECT_FLOAT_EQ(1.0, t3);
00873 
00874     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00875     EXPECT_FLOAT_EQ(0.5, tvu.p(1.0));
00876 
00877     EXPECT_FLOAT_EQ(0.0, tvu.v(0.0));
00878     EXPECT_FLOAT_EQ(1.0, tvu.v(1.0));
00879 
00880     EXPECT_FLOAT_EQ(1.0, tvu.a(0.0));
00881     EXPECT_FLOAT_EQ(1.0, tvu.a(1.0));
00882 
00884     tvu.setConstraints(0, 0.5, 0, -1.0);
00885     tvu.duration(2.0, 1.0);
00886     tvu.getTimes(t1, t2, t3);
00887 
00888     EXPECT_FLOAT_EQ(1.0, t1);
00889     EXPECT_FLOAT_EQ(1.0, t2);
00890     EXPECT_FLOAT_EQ(3.0, t3);
00891 
00892     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00893     EXPECT_FLOAT_EQ(0.5, tvu.p(1.0));
00894     EXPECT_FLOAT_EQ(0.5, tvu.p(3.0));
00895 
00896     EXPECT_FLOAT_EQ(0.0, tvu.v(0.0));
00897     EXPECT_FLOAT_EQ(1.0, tvu.v(1.0));
00898     EXPECT_FLOAT_EQ(-1.0, tvu.v(3.0));
00899 
00900     EXPECT_FLOAT_EQ(1.0, tvu.a(0.0));
00901     EXPECT_FLOAT_EQ(1.0, tvu.a(1.0));
00902     EXPECT_FLOAT_EQ(-1.0, tvu.a(3.0));
00903 
00905     tvu.setConstraints(0, -0.5, 0.0, -1.0);
00906     tvu.duration(2.0, 1.0);
00907     tvu.getTimes(t1, t2, t3);
00908 
00909     EXPECT_FLOAT_EQ(1.0, t1);
00910     EXPECT_FLOAT_EQ(1.0, t2);
00911     EXPECT_FLOAT_EQ(1.0, t3);
00912 
00913     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00914     EXPECT_FLOAT_EQ(-0.5, tvu.p(1.0));
00915 
00916     EXPECT_FLOAT_EQ(0.0, tvu.v(0.0));
00917     EXPECT_FLOAT_EQ(-1.0, tvu.v(1.0));
00918 
00919     EXPECT_FLOAT_EQ(-1.0, tvu.a(0.0));
00920     EXPECT_FLOAT_EQ(-1.0, tvu.a(1.0));
00921 
00923     tvu.setConstraints(0, -0.5, 0.0, 1.0);
00924     tvu.duration(2.0, 1.0);
00925     tvu.getTimes(t1, t2, t3);
00926 
00927     EXPECT_FLOAT_EQ(1.0, t1);
00928     EXPECT_FLOAT_EQ(1.0, t2);
00929     EXPECT_FLOAT_EQ(3.0, t3);
00930 
00931     EXPECT_FLOAT_EQ(0.0, tvu.p(0.0));
00932     EXPECT_FLOAT_EQ(-0.5, tvu.p(1.0));
00933     EXPECT_FLOAT_EQ(-0.5, tvu.p(3.0));
00934 
00935     EXPECT_FLOAT_EQ(0.0, tvu.v(0.0));
00936     EXPECT_FLOAT_EQ(-1.0, tvu.v(1.0));
00937     EXPECT_FLOAT_EQ(1.0, tvu.v(3.0));
00938 
00939     EXPECT_FLOAT_EQ(-1.0, tvu.a(0.0));
00940     EXPECT_FLOAT_EQ(-1.0, tvu.a(1.0));
00941     EXPECT_FLOAT_EQ(1.0, tvu.a(3.0));
00942 
00945     tvu.setConstraints(0, 0.5, 0.5, 1.0);
00946     tvu.duration(2.0, 1.0);
00947     tvu.getTimes(t1, t2, t3);
00948 
00949     EXPECT_FLOAT_EQ(0.56066017, t1);
00950     EXPECT_FLOAT_EQ(0.56066017, t2);
00951     EXPECT_FLOAT_EQ(0.62132034, t3);
00952 
00954     tvu.setConstraints(0, 0.5, 1.0, 0.5);
00955     tvu.duration(2.0, 1.0);
00956     tvu.getTimes(t1, t2, t3);
00957 
00958     EXPECT_FLOAT_EQ(0.06066017, t1);
00959     EXPECT_FLOAT_EQ(0.06066017, t2);
00960     EXPECT_FLOAT_EQ(0.62132034, t3);
00961 
00963     tvu.setConstraints(0, -0.5, -0.5, -1.0);
00964     tvu.duration(2.0, 1.0);
00965     tvu.getTimes(t1, t2, t3);
00966 
00967     EXPECT_FLOAT_EQ(0.56066017, t1);
00968     EXPECT_FLOAT_EQ(0.56066017, t2);
00969     EXPECT_FLOAT_EQ(0.62132034, t3);
00970 
00972     tvu.setConstraints(0, -0.5, -1.0, -0.5);
00973     tvu.duration(2.0, 1.0);
00974     tvu.getTimes(t1, t2, t3);
00975 
00976     EXPECT_FLOAT_EQ(0.06066017, t1);
00977     EXPECT_FLOAT_EQ(0.06066017, t2);
00978     EXPECT_FLOAT_EQ(0.62132034, t3);
00979 
00981     tvu.setConstraints(0, -0.5, -1.0, -2.0);
00982     EXPECT_NO_THROW(tvu.duration(2.0, 1.0));
00983     EXPECT_THROW(tvu.duration(2.0, 1.0, false), std::runtime_error);
00984     EXPECT_NO_THROW(tvu.duration(2.0, 3.0, false));
00985 
00987     tvu.setConstraints(0, 0.5, 1.0, 2.0);
00988     EXPECT_NO_THROW(tvu.duration(2.0, 1.0));
00989     EXPECT_THROW(tvu.duration(2.0, 1.0, false), std::runtime_error);
00990     EXPECT_NO_THROW(tvu.duration(2.0, 3.0, false));
00991 
00993     tvu.setConstraints(0, 0.5, 1.0, 1.0);
00994     tvu.duration(2.0, 1.0);
00995     tvu.getTimes(t1, t2, t3);
00996 
00997     EXPECT_FLOAT_EQ(0.22474487, t1);
00998     EXPECT_FLOAT_EQ(0.22474487, t2);
00999     EXPECT_FLOAT_EQ(0.44948974, t3);
01000 
01002     tvu.setConstraints(0.175526947621374, 0.12247641320582009, -0.6514631803290432, -0.5641836637951542);
01003     tvu.duration(1.0, 1.0);
01004     tvu.getTimes(t1, t2, t3);
01005 
01006     EXPECT_NEAR(0, t1, 1e-7);
01007     EXPECT_NEAR(0, t2, 1e-7);
01008     EXPECT_FLOAT_EQ(0.0872795, t3);
01009 
01011     tvu.setConstraints(0.512156, 0.512156, -5.48252e-07, 0);
01012     tvu.duration(1, 0.00872665);
01013     tvu.setDuration(3.74166);
01014     tvu.getTimes(t1, t2, t3);
01015 
01016     EXPECT_NEAR(6.2825e-5, t1, 1e-7);
01017     EXPECT_NEAR(3.74166, t2, 1e-7);
01018     EXPECT_NEAR(3.74166, t3, 1e-7);
01019 
01021     tvu.setConstraints(1.35736215114594, 1.15844341219664, -0.772499978542328, 0);
01022     tvu.duration(0.4, 1.5);
01023     tvu.getTimes(t1, t2, t3);
01024 
01025     EXPECT_NEAR(0, t1, 1e-7);
01026     EXPECT_NEAR(0, t2, 1e-7);
01027     EXPECT_NEAR(0.515, t3, 1e-7);
01028 
01029 }
01030 
01031 TEST_F(TrapVelTrajectoryGeneratorTest, TrapezoidalVelocityUtilitySetDurationTest)
01032 {
01033     TrapezoidalVelocityUtility tvu;
01034     double t1, t2, t3;
01035 
01037     tvu.setConstraints(0, 1.5, 0, 0, 0, 0);
01038     tvu.duration(1.0, 1.0);
01039     tvu.getTimes(t1, t2, t3);
01040 
01041     EXPECT_FLOAT_EQ(1.0, t1);
01042     EXPECT_FLOAT_EQ(1.5, t2);
01043     EXPECT_FLOAT_EQ(2.5, t3);
01044 
01045     EXPECT_FLOAT_EQ(1.5, tvu.p(2.5));
01046     EXPECT_NEAR(0, tvu.v(2.5), 1e-10);
01047 
01048     tvu.setDuration(2.5);
01049     tvu.getTimes(t1, t2, t3);
01050 
01051     EXPECT_FLOAT_EQ(1.0, t1);
01052     EXPECT_FLOAT_EQ(1.5, t2);
01053     EXPECT_FLOAT_EQ(2.5, t3);
01054 
01055     EXPECT_FLOAT_EQ(1.5, tvu.p(2.5));
01056     EXPECT_FLOAT_EQ(0, tvu.v(2.5));
01057 
01058     tvu.setDuration(5);
01059     tvu.getTimes(t1, t2, t3);
01060 
01061     EXPECT_FLOAT_EQ(0.32055053, t1);
01062     EXPECT_FLOAT_EQ(4.6794496, t2);
01063     EXPECT_FLOAT_EQ(5.0, t3);
01064 
01065     EXPECT_FLOAT_EQ(1.5, tvu.p(5));
01066     EXPECT_NEAR(0, tvu.v(5), 1e-10);
01067 
01068     EXPECT_THROW(tvu.setDuration(1), std::runtime_error);
01069 
01071     tvu.setConstraints(0, -1.5, 0, 0, 0, 0);
01072     tvu.duration(1.0, 1.0);
01073     tvu.getTimes(t1, t2, t3);
01074 
01075     EXPECT_FLOAT_EQ(1.0, t1);
01076     EXPECT_FLOAT_EQ(1.5, t2);
01077     EXPECT_FLOAT_EQ(2.5, t3);
01078 
01079     EXPECT_FLOAT_EQ(-1.5, tvu.p(2.5));
01080     EXPECT_FLOAT_EQ(0.0, tvu.v(2.5));
01081 
01082     tvu.setDuration(5);
01083     tvu.getTimes(t1, t2, t3);
01084 
01085     EXPECT_FLOAT_EQ(0.32055053, t1);
01086     EXPECT_FLOAT_EQ(4.6794496, t2);
01087     EXPECT_FLOAT_EQ(5.0, t3);
01088 
01089     EXPECT_FLOAT_EQ(-1.5, tvu.p(5));
01090     EXPECT_NEAR(0.0, tvu.v(5), 1e-10);
01091 
01093     tvu.setConstraints(0, 1.5, 1.0, 0, 0, 0);
01094     tvu.duration(1.0, 1.0);
01095     tvu.getTimes(t1, t2, t3);
01096 
01097     EXPECT_FLOAT_EQ(0, t1);
01098     EXPECT_FLOAT_EQ(1.0, t2);
01099     EXPECT_FLOAT_EQ(2.0, t3);
01100 
01101     tvu.setDuration(3);
01102     tvu.getTimes(t1, t2, t3);
01103 
01104     EXPECT_FLOAT_EQ(0.5, t1);
01105     EXPECT_FLOAT_EQ(2.5, t2);
01106     EXPECT_FLOAT_EQ(3.0, t3);
01107 
01108     EXPECT_FLOAT_EQ(0.375, tvu.p(0.5));
01109     EXPECT_FLOAT_EQ(0.5, tvu.v(0.5));
01110 
01111     EXPECT_FLOAT_EQ(1.375, tvu.p(2.5));
01112     EXPECT_FLOAT_EQ(0.5, tvu.v(1.5));
01113 
01114     EXPECT_FLOAT_EQ(1.5, tvu.p(3.0));
01115     EXPECT_FLOAT_EQ(0.0, tvu.v(3.0));
01116 
01117     tvu.setDuration(5);
01118     tvu.getTimes(t1, t2, t3);
01119 
01120     EXPECT_FLOAT_EQ(0.75, t1);
01121     EXPECT_FLOAT_EQ(4.75, t2);
01122     EXPECT_FLOAT_EQ(5.0, t3);
01123 
01124     EXPECT_FLOAT_EQ(0.46875, tvu.p(0.75));
01125     EXPECT_FLOAT_EQ(0.25, tvu.v(0.75));
01126 
01127     EXPECT_FLOAT_EQ(1.46875, tvu.p(4.75));
01128     EXPECT_FLOAT_EQ(0.25, tvu.v(0.75));
01129 
01130     EXPECT_FLOAT_EQ(1.5, tvu.p(5.0));
01131     EXPECT_FLOAT_EQ(0.0, tvu.v(5.0));
01132 
01134     tvu.setConstraints(0, 1.5, 0.0, 1.0, 0, 0);
01135     tvu.duration(1.0, 1.0);
01136     tvu.getTimes(t1, t2, t3);
01137 
01138     EXPECT_FLOAT_EQ(1.0, t1);
01139     EXPECT_FLOAT_EQ(2.0, t2);
01140     EXPECT_FLOAT_EQ(2.0, t3);
01141 
01142     EXPECT_FLOAT_EQ(1.5, tvu.p(2.0));
01143     EXPECT_FLOAT_EQ(1.0, tvu.v(2.0));
01144 
01145     tvu.setDuration(5);
01146     tvu.getTimes(t1, t2, t3);
01147 
01148     EXPECT_FLOAT_EQ(0.25, t1);
01149     EXPECT_FLOAT_EQ(4.25, t2);
01150     EXPECT_FLOAT_EQ(5.0, t3);
01151 
01152     EXPECT_FLOAT_EQ(0.03125, tvu.p(0.25));
01153     EXPECT_FLOAT_EQ(0.25, tvu.v(0.25));
01154 
01155     EXPECT_FLOAT_EQ(1.03125, tvu.p(4.25));
01156     EXPECT_FLOAT_EQ(0.25, tvu.v(4.25));
01157 
01158     EXPECT_FLOAT_EQ(1.5, tvu.p(5.0));
01159     EXPECT_FLOAT_EQ(1.0, tvu.v(5.0));
01160 
01163 
01164     tvu.setConstraints(0, 0.5, 0.5, 1.0);
01165     tvu.duration(2.0, 1.0);
01166     tvu.getTimes(t1, t2, t3);
01167 
01168     EXPECT_FLOAT_EQ(0.56066017, t1);
01169     EXPECT_FLOAT_EQ(0.56066017, t2);
01170     EXPECT_FLOAT_EQ(0.62132034, t3);
01171 
01172     EXPECT_NO_THROW(tvu.setDuration(5));
01173 
01174     tvu.setConstraints(0, 0.5, 0.5, 1.0);
01175     tvu.duration(2.0, 1.25);
01176 
01177     EXPECT_NO_THROW(tvu.setDuration(5));
01178 
01179     tvu.getTimes(t1, t2, t3);
01180 
01181     EXPECT_FLOAT_EQ(0.4, t1);
01182     EXPECT_FLOAT_EQ(4.2, t2);
01183     EXPECT_FLOAT_EQ(5.0, t3);
01184 
01185     EXPECT_FLOAT_EQ(0.5, tvu.p(5.0));
01186     EXPECT_FLOAT_EQ(1.0, tvu.v(5.0));
01187 
01189     tvu.setConstraints(0, 0.5, 0.5, 0.866);
01190     tvu.duration(2.0, 1.0);
01191 
01192     EXPECT_NO_THROW(tvu.setDuration(5));
01193 
01194     tvu.getTimes(t1, t2, t3);
01195 
01196     EXPECT_NEAR(0.5, t1, 1e-5);
01197     EXPECT_NEAR(4.134, t2, 1e-5);
01198     EXPECT_FLOAT_EQ(5.0, t3);
01199 
01200 
01202     tvu.setConstraints(1.5, 1.5, 1.5, 1.5);
01203     tvu.duration(0.25, 0.5);
01204     EXPECT_THROW(tvu.setDuration(5), std::runtime_error);
01205 
01207     tvu.setConstraints(1.5, 1.5, 0.0, 0.0);
01208     tvu.duration(0.25, 0.5);
01209     EXPECT_NO_THROW(tvu.setDuration(5));
01210 
01211     tvu.getTimes(t1, t2, t3);
01212     EXPECT_FLOAT_EQ(0.0, t1);
01213     EXPECT_FLOAT_EQ(5.0, t2);
01214     EXPECT_FLOAT_EQ(5.0, t3);
01215 
01216 }
01217 
01218 int main(int argc, char** argv)
01219 {
01220     testing::InitGoogleTest(&argc, argv);
01221 
01222     for (int i = 0; i < argc; ++i)
01223     {
01224         std::cout << argv[i] << std::endl;
01225 
01226         if (strcmp(argv[i], "--outputTraj") == 0)
01227         {
01228             outputFlag = true;
01229         }
01230     }
01231 
01232     return RUN_ALL_TESTS();
01233 }


robodyn_controllers
Author(s):
autogenerated on Sat Jun 8 2019 20:20:53