00001
00002
00003
00004
00005
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
00028 delete ctg;
00029 delete jtg;
00030 }
00031
00032 TrapezoidalVelocityCartesianTrajectoryFactory* ctg;
00033 TrapezoidalVelocityJointTrajectoryFactory* jtg;
00034 boost::shared_ptr<CartesianTrajectory> ctptr;
00035 boost::shared_ptr<JointTrajectory> jtptr;
00036 };
00037
00038
00039
00040 TEST_F(TrapVelTrajectoryGeneratorTest, TrapezoidalVelocityCartGetSetTest)
00041 {
00042
00043
00044
00045
00046
00047
00048
00049 const double linVel = 0.05;
00050 const double rotVel = 0.3;
00051
00052
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
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
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
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
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
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
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
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
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()));
00248 EXPECT_ANY_THROW(jtg->getAccelerationLimit(jntLimits.size()));
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
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
00346 EXPECT_LE(fabs(testPose.q(j) - testPose2.q(j)) / timeStep, jntLimits.at(j) + eps);
00347
00348
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
00408 EXPECT_THROW(jtg->getTrajectory(jntStart, jntEnd), std::runtime_error);
00409
00410
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 }