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