00001 #include <iostream>
00002 #include <gtest/gtest.h>
00003 #include <boost/shared_ptr.hpp>
00004 #include <boost/make_shared.hpp>
00005 #include "robodyn_mechanisms/WristMechanism.h"
00006 #include <ros/package.h>
00007 #include <stdexcept>
00008
00009 using namespace Eigen;
00010
00011 class LeftWristMechanismTest : public ::testing::Test
00012 {
00013 protected:
00014 virtual void SetUp()
00015 {
00016 leftWrist = boost::make_shared<WristMechanism>();
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00052 A << -26.35, 30, 192.4;
00053 A0 << -28.39, 30, 130.27;
00054 B << -27.47, 31.77, 231;
00055 C << -27.47, -26.43, 246;
00056 D << -25.75, -30, 210.2;
00057 D0 << -27.29, -30, 163.94;
00058 sliderZeroKnown = Vector2d(60, 41.5);
00059 sliderCalKnown = Vector2d(46, 46);
00060
00061 Pitch << 0, 0, 222;
00062 Yaw << 0, 0, 228;
00063 PalmCenter << 0, 0, 281;
00064 M << 0, 1, 0;
00065 N << 1, 0, 0;
00066 maxTravel = 100;
00067 linkLength = 40.8;
00068
00069 leftWrist->loadDesignParams(A, A0, B, C, D, D0, Pitch, Yaw, M, N, linkLength);
00070
00071 upperPitchMax = 0.8;
00072 upperPitchMin = 0.6;
00073 lowerPitchMax = -0.6;
00074 lowerPitchMin = -0.8;
00075 upperYawMax = 0.15;
00076 upperYawMin = -0.05;
00077 lowerYawMax = -0.6;
00078 lowerYawMin = -0.75;
00079
00080 leftWrist->setLimits(upperPitchMin, upperPitchMax, lowerPitchMin, lowerPitchMax, upperYawMin, upperYawMax, lowerYawMin, lowerYawMax);
00081
00082 SliderGain(0) = .003906;
00083 SliderGain(1) = .003906;
00084 leftWrist->setSliderOffsetGain(Vector2d::Zero(), SliderGain);
00085 leftWrist->setAngleOffsetGain(Vector2d::Zero(), Vector2d(1, 1));
00086
00087
00088 angleCalKnown = Vector2d(-0.1473, -0.3136);
00089 encoder = Vector2d::Zero();
00090
00091 angZeroKnown = Vector2d::Zero();
00092
00093 }
00094
00095 virtual void TearDown()
00096 {
00097 }
00098
00099 boost::shared_ptr<WristMechanism> leftWrist;
00100
00101 Vector3d A;
00102 Vector3d A0;
00103 Vector3d B;
00104 Vector3d C;
00105 Vector3d D;
00106 Vector3d D0;
00107 Vector3d Pitch;
00108 Vector3d Yaw;
00109 Vector3d PalmCenter;
00110 Vector3d M;
00111 Vector3d N;
00112 double maxTravel;
00113 double linkLength;
00114
00115 double upperPitchMax;
00116 double upperPitchMin;
00117 double lowerPitchMax;
00118 double lowerPitchMin;
00119 double upperYawMax;
00120 double upperYawMin;
00121 double lowerYawMax;
00122 double lowerYawMin;
00123
00124 Vector2d SliderGain;
00125 Vector2d sliderCalKnown;
00126 Vector2d angleCalKnown;
00127 Vector2d encoder;
00128 Vector2d sliderZeroKnown;
00129 Vector2d angZeroKnown;
00130
00131 };
00132
00133 TEST_F(LeftWristMechanismTest, setBadParamsTest)
00134 {
00135
00136 EXPECT_THROW(leftWrist->loadDesignParams(A, A, B, C, D, D0, Pitch, Yaw, M, N, linkLength), std::runtime_error);
00137
00138
00139 EXPECT_THROW(leftWrist->loadDesignParams(A, A0, B, C, D, D, Pitch, Yaw, M, N, linkLength), std::runtime_error);
00140
00141 Vector3d Zero = Vector3d::Zero();;
00142
00143
00144 EXPECT_THROW(leftWrist->loadDesignParams(A, A0, B, C, D, D0, Pitch, Yaw, Zero, N, linkLength), std::runtime_error);
00145
00146
00147 EXPECT_THROW(leftWrist->loadDesignParams(A, A0, B, C, D, D0, Pitch, Yaw, M, Zero, linkLength), std::runtime_error);
00148
00149 }
00150
00151 TEST_F(LeftWristMechanismTest, limitsTest)
00152 {
00153
00154 double pitch = 0;
00155 double yaw = -0.3;
00156 double upperPitch, upperYaw, lowerPitch, lowerYaw;
00157 leftWrist->getLimits(pitch, yaw, upperPitch, lowerPitch, upperYaw, lowerYaw);
00158 EXPECT_FLOAT_EQ(0.8, upperPitch);
00159 EXPECT_FLOAT_EQ(-0.8, lowerPitch);
00160 EXPECT_FLOAT_EQ(0.15, upperYaw);
00161 EXPECT_FLOAT_EQ(-0.75, lowerYaw);
00162
00163 leftWrist->applyLimits(pitch, yaw);
00164
00165 EXPECT_FLOAT_EQ(0.0, pitch);
00166 EXPECT_FLOAT_EQ(-0.3, yaw);
00167
00168
00169 pitch = 1;
00170 yaw = -0.3;
00171 leftWrist->getLimits(pitch, yaw, upperPitch, lowerPitch, upperYaw, lowerYaw);
00172 EXPECT_FLOAT_EQ(0.8, upperPitch);
00173 EXPECT_FLOAT_EQ(-0.8, lowerPitch);
00174 EXPECT_FLOAT_EQ(0.15, upperYaw);
00175 EXPECT_FLOAT_EQ(-0.75, lowerYaw);
00176
00177 leftWrist->applyLimits(pitch, yaw);
00178
00179 EXPECT_FLOAT_EQ(0.8, pitch);
00180 EXPECT_FLOAT_EQ(-0.3, yaw);
00181
00182 pitch = -1;
00183 leftWrist->getLimits(pitch, yaw, upperPitch, lowerPitch, upperYaw, lowerYaw);
00184 EXPECT_FLOAT_EQ(0.8, upperPitch);
00185 EXPECT_FLOAT_EQ(-0.8, lowerPitch);
00186 EXPECT_FLOAT_EQ(0.15, upperYaw);
00187 EXPECT_FLOAT_EQ(-0.75, lowerYaw);
00188
00189 leftWrist->applyLimits(pitch, yaw);
00190
00191 EXPECT_FLOAT_EQ(-0.8, pitch);
00192 EXPECT_FLOAT_EQ(-0.3, yaw);
00193
00194
00195
00196 pitch = 0;
00197 yaw = 0.25;
00198 leftWrist->getLimits(pitch, yaw, upperPitch, lowerPitch, upperYaw, lowerYaw);
00199 EXPECT_FLOAT_EQ(0.8, upperPitch);
00200 EXPECT_FLOAT_EQ(-0.8, lowerPitch);
00201 EXPECT_FLOAT_EQ(0.15, upperYaw);
00202 EXPECT_FLOAT_EQ(-0.75, lowerYaw);
00203
00204 leftWrist->applyLimits(pitch, yaw);
00205
00206 EXPECT_FLOAT_EQ(0, pitch);
00207 EXPECT_FLOAT_EQ(0.15, yaw);
00208
00209 yaw = -1;
00210 leftWrist->getLimits(pitch, yaw, upperPitch, lowerPitch, upperYaw, lowerYaw);
00211 EXPECT_FLOAT_EQ(0.8, upperPitch);
00212 EXPECT_FLOAT_EQ(-0.8, lowerPitch);
00213 EXPECT_FLOAT_EQ(0.15, upperYaw);
00214 EXPECT_FLOAT_EQ(-0.75, lowerYaw);
00215
00216 leftWrist->applyLimits(pitch, yaw);
00217
00218 EXPECT_FLOAT_EQ(0, pitch);
00219 EXPECT_FLOAT_EQ(-0.75, yaw);
00220
00221
00222 pitch = 1;
00223 yaw = 0.25;
00224 leftWrist->getLimits(pitch, yaw, upperPitch, lowerPitch, upperYaw, lowerYaw);
00225 EXPECT_GE(0.8, upperPitch);
00226 EXPECT_LE(0.6, upperPitch);
00227 EXPECT_LE(-0.05, upperYaw);
00228 EXPECT_GE(0.15, upperYaw);
00229
00230 EXPECT_FLOAT_EQ(-0.8, lowerPitch);
00231 EXPECT_FLOAT_EQ(-0.75, lowerYaw);
00232
00233
00234 pitch = 0.7;
00235 yaw = 0.1;
00236 leftWrist->getLimits(pitch, yaw, upperPitch, lowerPitch, upperYaw, lowerYaw);
00237 EXPECT_GT(0.8, upperPitch);
00238 EXPECT_LT(0.6, upperPitch);
00239 EXPECT_LT(-0.05, upperYaw);
00240 EXPECT_GT(0.15, upperYaw);
00241
00242 EXPECT_FLOAT_EQ(-0.8, lowerPitch);
00243 EXPECT_FLOAT_EQ(-0.75, lowerYaw);
00244
00245
00246 pitch = 1;
00247 yaw = -1;
00248 leftWrist->getLimits(pitch, yaw, upperPitch, lowerPitch, upperYaw, lowerYaw);
00249 EXPECT_GE(0.8, upperPitch);
00250 EXPECT_LE(0.6, upperPitch);
00251 EXPECT_LE(-0.75, lowerYaw);
00252 EXPECT_GE(-0.6, lowerYaw);
00253
00254 EXPECT_FLOAT_EQ(-0.8, lowerPitch);
00255 EXPECT_FLOAT_EQ(0.15, upperYaw);
00256
00257
00258
00259 pitch = 0.7;
00260 yaw = -0.7;
00261 leftWrist->getLimits(pitch, yaw, upperPitch, lowerPitch, upperYaw, lowerYaw);
00262 EXPECT_GT(0.8, upperPitch);
00263 EXPECT_LT(0.6, upperPitch);
00264 EXPECT_LT(-0.75, lowerYaw);
00265 EXPECT_GT(-0.6, lowerYaw);
00266
00267 EXPECT_FLOAT_EQ(-0.8, lowerPitch);
00268 EXPECT_FLOAT_EQ(0.15, upperYaw);
00269
00270
00271 pitch = -1;
00272 yaw = 0.25;
00273 leftWrist->getLimits(pitch, yaw, upperPitch, lowerPitch, upperYaw, lowerYaw);
00274 EXPECT_GE(-0.6, lowerPitch);
00275 EXPECT_LE(-0.8, lowerPitch);
00276 EXPECT_LE(-0.05, upperYaw);
00277 EXPECT_GE(0.15, upperYaw);
00278
00279 EXPECT_FLOAT_EQ(0.8, upperPitch);
00280 EXPECT_FLOAT_EQ(-0.75, lowerYaw);
00281
00282
00283 pitch = -0.7;
00284 yaw = 0.1;
00285 leftWrist->getLimits(pitch, yaw, upperPitch, lowerPitch, upperYaw, lowerYaw);
00286 EXPECT_GT(-0.6, lowerPitch);
00287 EXPECT_LT(-0.8, lowerPitch);
00288 EXPECT_LT(-0.05, upperYaw);
00289 EXPECT_GT(0.15, upperYaw);
00290
00291 EXPECT_FLOAT_EQ(0.8, upperPitch);
00292 EXPECT_FLOAT_EQ(-0.75, lowerYaw);
00293
00294
00295 pitch = -1;
00296 yaw = -1;
00297 leftWrist->getLimits(pitch, yaw, upperPitch, lowerPitch, upperYaw, lowerYaw);
00298 EXPECT_GE(-0.6, lowerPitch);
00299 EXPECT_LE(-0.8, lowerPitch);
00300 EXPECT_LE(-0.75, lowerYaw);
00301 EXPECT_GE(-0.6, lowerYaw);
00302
00303 EXPECT_FLOAT_EQ(0.8, upperPitch);
00304 EXPECT_FLOAT_EQ(0.15, upperYaw);
00305
00306
00307 pitch = -0.7;
00308 yaw = -0.7;
00309 leftWrist->getLimits(pitch, yaw, upperPitch, lowerPitch, upperYaw, lowerYaw);
00310 EXPECT_GT(-0.6, lowerPitch);
00311 EXPECT_LT(-0.8, lowerPitch);
00312 EXPECT_LT(-0.75, lowerYaw);
00313 EXPECT_GT(-0.6, lowerYaw);
00314
00315 EXPECT_FLOAT_EQ(0.8, upperPitch);
00316 EXPECT_FLOAT_EQ(0.15, upperYaw);
00317
00318 }
00319
00320
00321 TEST_F(LeftWristMechanismTest, getSliderFromAngleTest)
00322 {
00323
00324
00325 leftWrist->calWrist(encoder, sliderCalKnown, angleCalKnown);
00326
00327
00328 std::cout << "angleCalKnown: (" << angleCalKnown(0) << "," << angleCalKnown(1) << ")" << std::endl;
00329 Vector2d sliderCalPos = leftWrist->getSliderFromAngle(angleCalKnown);
00330 std::cout << "slider pos:" << std::endl << sliderCalPos << std::endl;
00331 EXPECT_NEAR(sliderCalKnown(0), sliderCalPos(0), 1);
00332 EXPECT_NEAR(sliderCalKnown(1), sliderCalPos(1), 1);
00333
00334
00335 Vector2d sliderZeroPos = leftWrist->getSliderFromAngle(Vector2d::Zero());
00336
00337 std::cout << "slider pos:" << std::endl << sliderZeroPos << std::endl;
00338 EXPECT_NEAR(sliderZeroKnown(0), sliderZeroPos(0), 1);
00339 EXPECT_NEAR(sliderZeroKnown(1), sliderZeroPos(1), 1);
00340
00341 Vector2d ang = Vector2d::Zero();
00342
00343 ang(0) = 0.0872664626;
00344 Vector2d slider = leftWrist->getSliderFromAngle(ang);
00345 std::cout << "slider pos:" << std::endl << slider << std::endl;
00346 EXPECT_LT(sliderZeroKnown(0), slider(0));
00347 EXPECT_LT(sliderZeroKnown(1), slider(1));
00348
00349
00350 ang = Vector2d::Zero();
00351
00352 ang(0) = -0.0872664626;
00353 slider = leftWrist->getSliderFromAngle(ang);
00354 std::cout << "slider pos:" << std::endl << slider << std::endl;
00355 EXPECT_GT(sliderZeroKnown(0), slider(0));
00356 EXPECT_GT(sliderZeroKnown(1), slider(1));
00357
00358 ang = Vector2d::Zero();
00359
00360 ang(1) = 0.0872664626;
00361 slider = leftWrist->getSliderFromAngle(ang);
00362 std::cout << "slider pos:" << std::endl << slider << std::endl;
00363
00364 EXPECT_LT(sliderZeroKnown(0), slider(0));
00365 EXPECT_GT(sliderZeroKnown(1), slider(1));
00366
00367 ang = Vector2d::Zero();
00368
00369 ang(1) = -0.0872664626;
00370 slider = leftWrist->getSliderFromAngle(ang);
00371 std::cout << "slider pos:" << std::endl << slider << std::endl;
00372 EXPECT_GT(sliderZeroKnown(0), slider(0));
00373 EXPECT_LT(sliderZeroKnown(1), slider(1));
00374
00375
00376 }
00377
00379 TEST_F(LeftWristMechanismTest, sliderWristConversionTest)
00380 {
00381
00382
00383 Vector2d ang = Vector2d::Zero();
00384 Vector2d slider = leftWrist->getSliderFromAngle(ang);
00385 Vector2d encoder = Vector2d::Zero();
00386 leftWrist->calWrist(encoder, slider, ang);
00387
00388
00389 Vector2d slider2 = leftWrist->getSliderFromWristEncoder(encoder);
00390 EXPECT_FLOAT_EQ(slider(0), slider2(0));
00391 EXPECT_FLOAT_EQ(slider(1), slider2(1));
00392
00393 Vector2d encoder2 = leftWrist->getWristEncoderFromSlider(slider);
00394 EXPECT_FLOAT_EQ(encoder(0), encoder2(0));
00395 EXPECT_FLOAT_EQ(encoder(1), encoder2(1));
00396
00397
00398 Vector2d constant = Vector2d::Constant(10);
00399 Vector2d encoderInc = encoder + constant;
00400 Vector2d sliderInc = leftWrist->getSliderFromWristEncoder(encoderInc);
00401 EXPECT_GT(sliderInc(0), slider(0));
00402 EXPECT_GT(sliderInc(1), slider(1));
00403
00404
00405 Vector2d encoderDec = encoder - constant;
00406 Vector2d sliderDec = leftWrist->getSliderFromWristEncoder(encoderDec);
00407 EXPECT_LT(sliderDec(0), slider(0));
00408 EXPECT_LT(sliderDec(1), slider(1));
00409
00410
00411 sliderInc = slider + constant;
00412 encoderInc = leftWrist->getWristEncoderFromSlider(sliderInc);
00413 EXPECT_GT(encoderInc(0), encoder(0));
00414 EXPECT_GT(encoderInc(1), encoder(1));
00415
00416
00417 sliderDec = slider - constant;
00418 encoderDec = leftWrist->getWristEncoderFromSlider(sliderDec);
00419 EXPECT_LT(encoderDec(0), encoder(0));
00420 EXPECT_LT(encoderDec(1), encoder(1));
00421
00422 }
00423
00424 TEST_F(LeftWristMechanismTest, newtonsMethodTest)
00425 {
00426 Vector2d angKnown = Vector2d(0.0070703288, 0.00459021593);
00427 Vector2d ang = Vector2d::Zero();
00428
00429 leftWrist->eps = 0.0001;
00430 Vector2d slider = leftWrist->getSliderFromAngle(angKnown);
00431 Vector2d correction;
00432
00433 for (int i = 0; i < 10; ++i)
00434 {
00435 correction = leftWrist->NewtonsMethod(ang, slider);
00436 ang = ang - correction;
00437 }
00438
00439 EXPECT_NEAR(angKnown(0), ang(0), .01);
00440 EXPECT_NEAR(angKnown(1), ang(1), .01);
00441
00442
00443 ang = Vector2d::Zero();
00444
00445 ang(0) = 0.0872664626;
00446
00447 for (int i = 0; i < 1000; ++i)
00448 {
00449 correction = leftWrist->NewtonsMethod(ang, slider);
00450 ang = ang - correction;
00451 }
00452
00453 EXPECT_NEAR(angKnown(0), ang(0), .01);
00454 EXPECT_NEAR(angKnown(1), ang(1), .01);
00455
00456
00457 ang(0) = -0.0872664626;
00458
00459 for (int i = 0; i < 1000; ++i)
00460 {
00461 correction = leftWrist->NewtonsMethod(ang, slider);
00462 ang = ang - correction;
00463 }
00464
00465 EXPECT_NEAR(angKnown(0), ang(0), .01);
00466 EXPECT_NEAR(angKnown(1), ang(1), .01);
00467
00468 ang = Vector2d::Zero();
00469
00470
00471 ang(1) = 0.0872664626;
00472
00473 for (int i = 0; i < 1000; ++i)
00474 {
00475 correction = leftWrist->NewtonsMethod(ang, slider);
00476 ang = ang - correction;
00477 }
00478
00479 EXPECT_NEAR(angKnown(0), ang(0), .01);
00480 EXPECT_NEAR(angKnown(1), ang(1), .01);
00481
00482
00483 ang(1) = -0.0872664626;
00484
00485 for (int i = 0; i < 1000; ++i)
00486 {
00487 correction = leftWrist->NewtonsMethod(ang, slider);
00488 ang = ang - correction;
00489 }
00490
00491 EXPECT_NEAR(angKnown(0), ang(0), .01);
00492 EXPECT_NEAR(angKnown(1), ang(1), .01);
00493
00494 }
00495
00496 TEST_F(LeftWristMechanismTest, getAngleFromSliderTest)
00497 {
00498
00499
00500 EXPECT_NO_THROW(leftWrist->calWrist(encoder, sliderCalKnown, angleCalKnown));
00501 leftWrist->maxIt = 150;
00502 leftWrist->eps = .0001;
00503
00504 Vector2d angOut;
00505
00506 EXPECT_NO_THROW(angOut = leftWrist->getAngleFromSlider(sliderCalKnown));
00507 std::cout << "angle:" << std::endl << angOut << std::endl;
00508 EXPECT_NEAR(angleCalKnown(0), angOut(0), 0.005);
00509 EXPECT_NEAR(angleCalKnown(1), angOut(1), 0.005);
00510
00511
00512 EXPECT_NO_THROW(angOut = leftWrist->getAngleFromSlider(sliderZeroKnown));
00513 std::cout << "angle:" << std::endl << angOut << std::endl;
00514 EXPECT_NEAR(angZeroKnown(0), angOut(0), 0.005);
00515 EXPECT_NEAR(angZeroKnown(1), angOut(1), 0.005);
00516
00517
00518 Vector2d slider = sliderZeroKnown + Vector2d::Constant(10);
00519 EXPECT_NO_THROW(angOut = leftWrist->getAngleFromSlider(slider));
00520 std::cout << "angle:" << std::endl << angOut << std::endl;
00521 EXPECT_LT(angZeroKnown(0), angOut(0));
00522
00523
00524 slider = sliderZeroKnown - Vector2d::Constant(10);
00525 EXPECT_NO_THROW(angOut = leftWrist->getAngleFromSlider(slider));
00526 std::cout << "angle:" << std::endl << angOut << std::endl;
00527 EXPECT_GT(angZeroKnown(0), angOut(0));
00528
00529
00530 slider = sliderZeroKnown + Vector2d(-5, 5);
00531 EXPECT_NO_THROW(angOut = leftWrist->getAngleFromSlider(slider));
00532 std::cout << "angle:" << std::endl << angOut << std::endl;
00533 EXPECT_GT(angZeroKnown(1), angOut(1));
00534
00535
00536 slider = sliderZeroKnown + Vector2d(5, -5);
00537 EXPECT_NO_THROW(angOut = leftWrist->getAngleFromSlider(slider));
00538 std::cout << "angle:" << std::endl << angOut << std::endl;
00539 EXPECT_LT(angZeroKnown(1), angOut(1));
00540
00541 }
00542
00543 TEST_F(LeftWristMechanismTest, designSpaceTest)
00544 {
00545 Vector2d maxSlider1 = Vector2d::Zero();
00546 Vector2d minSlider1 = Vector2d::Zero();
00547 Vector2d maxSlider2 = Vector2d::Zero();
00548 Vector2d minSlider2 = Vector2d::Zero();
00549 Vector2d maxPitch = Vector2d::Zero();
00550 Vector2d minPitch = Vector2d::Zero();
00551 Vector2d maxYaw = Vector2d::Zero();
00552 Vector2d minYaw = Vector2d::Zero();
00553 Vector2d sliderOut = Vector2d::Zero();
00554 Vector2d angOut = Vector2d::Zero();
00555
00556 for (double i = lowerPitchMin; i < upperPitchMax; i += .01)
00557 {
00558 for (double j = lowerYawMin; j < upperYawMax; j += .01)
00559 {
00560 try
00561 {
00562 double pitch = i;
00563 double yaw = j;
00564 leftWrist->applyLimits(pitch, yaw);
00565 sliderOut = leftWrist->getSliderFromAngle(Vector2d(pitch, yaw));
00566
00567
00568
00569
00570
00571
00572 if (maxSlider1(0) < sliderOut(0))
00573 {
00574 maxSlider1 = sliderOut;
00575 }
00576
00577 if (minSlider1(0) > sliderOut(0))
00578 {
00579 minSlider1 = sliderOut;
00580 }
00581
00582 if (maxSlider2(1) < sliderOut(1))
00583 {
00584 maxSlider2 = sliderOut;
00585 }
00586
00587 if (minSlider2(1) > sliderOut(1))
00588 {
00589 minSlider2 = sliderOut;
00590 }
00591 }
00592 catch (std::runtime_error)
00593 {
00594 std::cout << "could not find inv kinematic solution (" << i << "," << j << ")" << std::endl;
00595 std::cin.ignore();
00596 }
00597
00598 try
00599 {
00600 angOut = leftWrist->getAngleFromSlider(sliderOut);
00601 double pitch = i;
00602 double yaw = j;
00603 leftWrist->applyLimits(pitch, yaw);
00604
00605
00606
00608
00609
00610
00611
00613
00614 EXPECT_NEAR(pitch, angOut(0), 0.005);
00615 EXPECT_NEAR(yaw, angOut(1), 0.005);
00616
00617 if (maxPitch(0) < angOut(0))
00618 {
00619 maxPitch = angOut;
00620 }
00621
00622 if (minPitch(0) > angOut(0))
00623 {
00624 minPitch = angOut;
00625 }
00626
00627 if (maxYaw(1) < angOut(1))
00628 {
00629 maxYaw = angOut;
00630 }
00631
00632 if (minYaw(1) > angOut(1))
00633 {
00634 minYaw = angOut;
00635 }
00636 }
00637 catch (std::runtime_error)
00638 {
00639 std::cout << "Fwd Kinematics not valid for (" << i << "," << j << "), slider pos: (" << sliderOut(0) << "," << sliderOut(1) << ")" << std::endl;
00640 std::cin.ignore();
00641 }
00642
00643
00644 }
00645 }
00646
00647 std::cout << "Max Slider1: " << maxSlider1 << std::endl;
00648 std::cout << "Min Slider1: " << minSlider1 << std::endl;
00649 std::cout << "Max Slider2: " << maxSlider2 << std::endl;
00650 std::cout << "Min Slider2: " << minSlider2 << std::endl;
00651 std::cout << "Max Pitch: " << maxPitch << std::endl;
00652 std::cout << "Min Pitch: " << minPitch << std::endl;
00653 std::cout << "Max Yaw: " << maxYaw << std::endl;
00654 std::cout << "Min Yaw: " << minYaw << std::endl;
00655 }
00656
00657 TEST_F(LeftWristMechanismTest, calibration)
00658 {
00659
00660 leftWrist->calWrist(encoder, sliderCalKnown, angleCalKnown);
00661
00662 Vector2d sliderTest = leftWrist->getSliderFromAngle(angleCalKnown);
00663 EXPECT_NEAR(sliderCalKnown(0), sliderTest(0), 1);
00664 EXPECT_NEAR(sliderCalKnown(1), sliderTest(1), 1);
00665
00666 Vector2d angOut = leftWrist->getAngleFromSlider(sliderCalKnown);
00667 EXPECT_NEAR(angleCalKnown(0), angOut(0), 0.005 );
00668 EXPECT_NEAR(angleCalKnown(1), angOut(1), 0.005 );
00669
00670 Vector2d sliderOut = leftWrist->getSliderFromWristEncoder(encoder);
00671 EXPECT_NEAR(sliderCalKnown(0), sliderOut(0), 1);
00672 EXPECT_NEAR(sliderCalKnown(1), sliderOut(1), 1);
00673
00674 }
00675
00676
00677 int main(int argc, char** argv)
00678 {
00679 testing::InitGoogleTest(&argc, argv);
00680 return RUN_ALL_TESTS();
00681 }
00682
00683