RightWristMechanism_Test.cpp
Go to the documentation of this file.
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     //A and A0 cannot be the same
00104     EXPECT_THROW(rightWrist->loadDesignParams(A, A, B, C, D, D0, Pitch, Yaw, M, N, linkLength), std::runtime_error);
00105 
00106     //D and D0 cannot be the same
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     //M cannot be a zero vector
00112     EXPECT_THROW(rightWrist->loadDesignParams(A, A0, B, C, D, D0, Pitch, Yaw, Zero, N, linkLength), std::runtime_error);
00113 
00114     //N cannot be a zero vector
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     // set value within limits
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     // set pitch outside of limits
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     // set yaw outside of limits
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     // set upper pitch and upper yaw outside limits
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     // set upper pitch and upper yaw between min and max
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     // set upper pitch and lower yaw outside limits
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     // set upper pitch and lower yaw between min and max
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     // set lower pitch and upper yaw outside limits
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     // set lower pitch and upper yaw bewteen min and max
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     // set lower pitch and lower yaw outside limits
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     // set lower pitch and lower yaw bewteen min and max
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     //checks inverse kinematics
00277 
00278     rightWrist->calWrist(encoder,  sliderCalKnown, angleCalKnown);
00279 
00280     //check cal position
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     //check zero position
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     //change pitch -- increase of pitch angle should increase both sliders
00296     ang(0) = 0.0872664626; //5 degrees
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     //change pitch -- decrease of pitch angle should decrease both sliders
00305     ang(0) = -0.0872664626; //-5 degrees
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     //change yaw -- increase of yaw should decrease thumbside and increase littleside
00313     ang(1) = 0.0872664626; //5 degreess
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     //change yaw -- decrease of yaw should increase thumside and decrease littleside
00322     ang(1) = -0.0872664626; // -5 degrees
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     //initialize
00335     Vector2d ang     = Vector2d::Zero();
00336     Vector2d slider  = rightWrist->getSliderFromAngle(ang);
00337     Vector2d encoder = Vector2d::Zero();
00338     rightWrist->calWrist(encoder, slider, ang);
00339 
00340     //test forward and back give same result
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     //test increased encoder is increased sliderpos
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     //test decreased encoder decreases sliderpos
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     //test increasing sliderpos increases encoder
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     //test decreasing sliderpos decreases encoder
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     //change pitch (increase)
00397     ang(0) = 0.0872664626; //5 degrees
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     //change pitch(decrease)
00409     ang(0) = -0.0872664626; //-5 degrees
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     //change yaw (increase)
00423     ang(1) = 0.0872664626; //5 degrees
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     //change yaw (decrease)
00435     ang(1) = -0.0872664626; //-5 degrees
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     //checks fwd kinematics
00451 
00452     EXPECT_NO_THROW(rightWrist->calWrist(encoder,  sliderCalKnown, angleCalKnown));
00453     rightWrist->maxIt = 150;
00454     rightWrist->eps = .0001;
00455 
00456     Vector2d angOut;
00457     //check calibration point
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     //check zero pos
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     //increasing both sliders should increase pitch
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     //decreasing both sliders should decrease pitch
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     //decreasing thumbside, and increasing littleside should increase yaw
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     //increasing thumbside, and decreasing littleside should decrease yaw
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                     //std::cout<<"angle ("<<i<<","<<j<<")"<<" violates slider limits: ("<<sliderOut(0)<<","<<sliderOut(1)<<")"<<std::endl;
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                 //std::cin.ignore();
00549             }
00550 
00551             try
00552             {
00553                 angOut      = rightWrist->getAngleFromSlider(sliderOut);
00554                 double pitch = i;
00555                 double yaw   = j;
00556                 rightWrist->applyLimits(pitch, yaw);
00557 //                if(fabs(pitch-angOut(0)) > 0.005)
00558 //                {
00559 //                    std::cout<<"angle ("<<pitch<<","<<yaw<<")"<<" and ("<<angOut(0)<<","<<angOut(1)<<") are more than 0.005 apart: ("<<sliderOut(0)<<","<<sliderOut(1)<<")"<<std::endl;
00561 //                }
00562 //                if(fabs(yaw-angOut(1))>0.005)
00563 //                {
00564 //                    std::cout<<"angle ("<<pitch<<","<<yaw<<")"<<" and ("<<angOut(0)<<","<<angOut(1)<<") are more than 0.005 apart: ("<<sliderOut(0)<<","<<sliderOut(1)<<")"<<std::endl;
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 


robodyn_mechanisms
Author(s):
autogenerated on Thu Jun 6 2019 21:22:49