LeftWristMechanism_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 LeftWristMechanismTest : public ::testing::Test
00012 {
00013 protected:
00014     virtual void SetUp()
00015     {
00016         leftWrist = boost::make_shared<WristMechanism>();
00017 
00018 //        //! values for cal = 0
00019 //        A  << -26.40, 30, 191;
00020 //        A0 << -26.93, 30, 174.85;
00021 //        B  << -27.47,31.77,231;
00022 //        C  << -27.47,-26.43,246;
00023 //        D  << -25.75,-30, 210;
00024 //        D0 << -25.93, -30, 204.72;
00025 //        sliderZeroKnown = Vector2d(15.41, 0.667);
00026 //        sliderCalKnown = Vector2d(0, 0);
00027 
00028 
00029 //        //! values for cal = 30
00030 //        A  << -26.40, 30, 191;
00031 //        A0 << -27.91, 30, 144.86;
00032 //        B  << -27.47,31.77,231;
00033 //        C  << -27.47,-26.43,246;
00034 //        D  << -25.92, -30, 205;
00035 //        D0 << -26.93, -30, 174.73;
00036 //        sliderZeroKnown = Vector2d(45.41, 30.67);
00037 //        sliderCalKnown = Vector2d(30, 30);
00038 
00039 //        //! values for cal = 46
00040 //        //! @note 46 is the only value that makes fwd and inv kinematics agree in the range test
00041 //        A  << -26.40, 30, 191;
00042 //        A0 << -28.43, 30, 128.87;
00043 //        B  << -27.47,31.77,231;
00044 //        C  << -27.47,-26.43,246;
00045 //        D  << -25.92, -30, 205;
00046 //        D0 << -27.46, -30, 158.74;
00047 //        sliderZeroKnown = Vector2d(61.4, 46.7);
00048 //        sliderCalKnown = Vector2d(46, 46);
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         //angleCalKnown = Vector2d(-0.27, -0.252);
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     //A and A0 cannot be the same
00136     EXPECT_THROW(leftWrist->loadDesignParams(A, A, B, C, D, D0, Pitch, Yaw, M, N, linkLength), std::runtime_error);
00137 
00138     //D and D0 cannot be the same
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     //M cannot be a zero vector
00144     EXPECT_THROW(leftWrist->loadDesignParams(A, A0, B, C, D, D0, Pitch, Yaw, Zero, N, linkLength), std::runtime_error);
00145 
00146     //N cannot be a zero vector
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     // set value within limits
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     // set pitch outside of limits
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     // set yaw outside of limits
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     // set upper pitch and upper yaw outside limits
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     // set upper pitch and upper yaw between min and max
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     // set upper pitch and lower yaw outside limits
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     // set upper pitch and lower yaw between min and max
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     // set lower pitch and upper yaw outside limits
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     // set lower pitch and upper yaw bewteen min and max
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     // set lower pitch and lower yaw outside limits
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     // set lower pitch and upper yaw bewteen min and max
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     //checks inverse kinematics
00324 
00325     leftWrist->calWrist(encoder,  sliderCalKnown, angleCalKnown);
00326 
00327     //check cal position
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     //check zero position
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     //change pitch -- increase of pitch angle should increase both sliders
00343     ang(0) = 0.0872664626; //5 degrees
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     //change pitch -- decrease of pitch angle should decrease both sliders
00352     ang(0) = -0.0872664626; //-5 degrees
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     //change yaw -- increase of yaw should increase thumbside and decrease littleside
00360     ang(1) = 0.0872664626; //5 degreess
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     //change yaw -- decrease of yaw should decrease thumside and increase littleside
00369     ang(1) = -0.0872664626; // -5 degrees
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     //initialize
00383     Vector2d ang     = Vector2d::Zero();
00384     Vector2d slider  = leftWrist->getSliderFromAngle(ang);
00385     Vector2d encoder = Vector2d::Zero();
00386     leftWrist->calWrist(encoder, slider, ang);
00387 
00388     //test forward and back give same result
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     //test increased encoder is increased sliderpos
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     //test decreased encoder decreases sliderpos
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     //test increasing sliderpos increases encoder
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     //test decreasing sliderpos decreases encoder
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     //change pitch (increase)
00445     ang(0) = 0.0872664626; //5 degrees
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     //change pitch(decrease)
00457     ang(0) = -0.0872664626; //-5 degrees
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     //change yaw (increase)
00471     ang(1) = 0.0872664626; //5 degrees
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     //change yaw (decrease)
00483     ang(1) = -0.0872664626; //-5 degrees
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     //checks fwd kinematics
00499 
00500     EXPECT_NO_THROW(leftWrist->calWrist(encoder,  sliderCalKnown, angleCalKnown));
00501     leftWrist->maxIt = 150;
00502     leftWrist->eps   = .0001;
00503 
00504     Vector2d angOut;
00505     //check calibration point
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     //check zero pos
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     //increasing both sliders should increase pitch
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     //decreasing both sliders should decrease pitch
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     //decreasing thumbside, and increasing littleside should decrease yaw
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     //increasing thumbside, and decreasing littleside should increase yaw
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 //                if(abs(sliderOut(0)-sliderOut(1))>30 || sliderOut(0)<0 || sliderOut(0)>80 || sliderOut(1)<0 || sliderOut(1)>80)
00568 //                {
00569 //                    //std::cout<<"angle ("<<i<<","<<j<<")"<<" violates slider limits: ("<<sliderOut(0)<<","<<sliderOut(1)<<")"<<std::endl;
00570 //                    continue;
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 //                if(fabs(pitch-angOut(0)) > 0.005)
00605 //                {
00606 //                    std::cout<<"angle ("<<pitch<<","<<yaw<<")"<<" and ("<<angOut(0)<<","<<angOut(1)<<") are more than 0.005 apart: ("<<sliderOut(0)<<","<<sliderOut(1)<<")"<<std::endl;
00608 //                }
00609 //                if(fabs(yaw-angOut(1))>0.005)
00610 //                {
00611 //                    std::cout<<"angle ("<<pitch<<","<<yaw<<")"<<" and ("<<angOut(0)<<","<<angOut(1)<<") are more than 0.005 apart: ("<<sliderOut(0)<<","<<sliderOut(1)<<")"<<std::endl;
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 


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