diff --git a/unitTesting/CMakeLists.txt b/unitTesting/CMakeLists.txt index 01290511a6e1340330940f55bfba62b26d7e77be..fd65ed469b2d9dd52f67d6c25a22ec9e408a111c 100644 --- a/unitTesting/CMakeLists.txt +++ b/unitTesting/CMakeLists.txt @@ -167,6 +167,8 @@ ADD_EXECUTABLE( TestHerdt2010 ../src/TimeUtilsWindows.cpp TestHerdt2010.cpp CommonTools.cpp + TestObject.cpp + ClockCPUTime.cpp ) SET_TARGET_PROPERTIES( TestHerdt2010 PROPERTIES @@ -176,6 +178,8 @@ SET_TARGET_PROPERTIES( TestHerdt2010 target_link_libraries (TestHerdt2010 ${PROJECT_NAME}) ADD_DEPENDENCIES (TestHerdt2010 ${PROJECT_NAME}) +ADD_TEST(TestHerdt2010 TestHerdt2010 ${samplemodelpath} sample.wrl ${samplespec} ${sampleljr} ${sampleinitconfig}) + ##################### # Add user examples # ##################### diff --git a/unitTesting/TestHerdt2010.cpp b/unitTesting/TestHerdt2010.cpp index 4b95711630404ac460d03a2ce9f0d9af0803f856..a0de12066beb336e06a779859ffaef2b846a5cb5 100644 --- a/unitTesting/TestHerdt2010.cpp +++ b/unitTesting/TestHerdt2010.cpp @@ -25,351 +25,129 @@ /* \file This file tests A. Herdt's walking algorithm for * automatic foot placement giving an instantaneous CoM velocity reference. */ -#include "TestFootPrintPGInterfaceData.h" #include "CommonTools.h" +#include "TestObject.h" using namespace::PatternGeneratorJRL; using namespace::PatternGeneratorJRL::TestSuite; using namespace std; -void Herdt(PatternGeneratorInterface &aPGI) -{ - CommonInitialization(aPGI); +enum Profiles_t { + PROFIL_HERDT_ONLINE_WALKING, // 1 +}; - { - istringstream strm2(":setVelReference 0.2 0.0 0.0"); - aPGI.ParseCmd(strm2); - } - { - istringstream strm2(":singlesupporttime 0.7"); - aPGI.ParseCmd(strm2); - } - { - istringstream strm2(":SetAlgoForZmpTrajectory Herdt"); - aPGI.ParseCmd(strm2); - } +class TestHerdt2010: public TestObject +{ - if (0) +private: +public: + TestHerdt2010(int argc, char *argv[], string &aString, int TestProfile): + TestObject(argc,argv,aString) { - istringstream strm2(":setdimitrovconstraint XY 0.07 0.05"); - aPGI.ParseCmd(strm2); - } + m_TestProfile = TestProfile; + }; + +protected: + + + void startOnLineWalking(PatternGeneratorInterface &aPGI) { - istringstream strm2(":stepseq 0.0 -0.105 0.0 \ - 0.2 0.21 0.0 \ - 0.2 -0.21 0.0 \ - 0.2 0.21 0.0 \ - 0.2 -0.21 0.0 \ - 0.2 0.21 0.0 \ - 0.0 -0.21 0.0"); - aPGI.ParseCmd(strm2); + CommonInitialization(aPGI); + + { + istringstream strm2(":SetAlgoForZmpTrajectory Herdt"); + aPGI.ParseCmd(strm2); + + } + { + istringstream strm2(":singlesupporttime 0.7"); + aPGI.ParseCmd(strm2); + } + { + istringstream strm2(":HerdtOnline 0.2 0.0 0.0"); + aPGI.ParseCmd(strm2); + } + { + istringstream strm2(":numberstepsbeforestop 2"); + aPGI.ParseCmd(strm2); + } } -} - -void Herdt_Stop(PatternGeneratorInterface &aPGI) -{ + void stopOnLineWalking(PatternGeneratorInterface &aPGI) { - istringstream strm2(":setVelReference 0.0 0.0 0.0"); - aPGI.ParseCmd(strm2); + { + istringstream strm2(":setVelReference 0.0 0.0 0.0"); + aPGI.ParseCmd(strm2); + } } -} - - -void HerdtOnline(PatternGeneratorInterface &aPGI) -{ - CommonInitialization(aPGI); + void chooseTestProfile() { - istringstream strm2(":SetAlgoForZmpTrajectory Herdt"); - aPGI.ParseCmd(strm2); - - } - { - istringstream strm2(":singlesupporttime 0.7"); - aPGI.ParseCmd(strm2); - } - { - istringstream strm2(":HerdtOnline 0.2 0.0 0.0"); - aPGI.ParseCmd(strm2); + + switch(m_TestProfile) + { + + case PROFIL_HERDT_ONLINE_WALKING: + startOnLineWalking(*m_PGI); + break; + default: + throw("No correct test profile"); + break; + } } + + void generateEvent() { - istringstream strm2(":numberstepsbeforestop 2"); - aPGI.ParseCmd(strm2); - } -} + unsigned int StoppingTime = 11*200; + if (m_OneStep.NbOfIt>StoppingTime) + { + stopOnLineWalking(*m_PGI); + } + } +}; -int main(int argc, char *argv[]) +int PerformTests(int argc, char *argv[]) { - unsigned int TestProfil=PROFIL_HERDT_ONLINE; - - string VRMLPath; - string VRMLFileName; - string SpecificitiesFileName; - string LinkJointRank; - string InitConfig; - - MAL_VECTOR_DIM(CurrentConfiguration,double,46); - MAL_VECTOR_DIM(CurrentVelocity,double,46); - MAL_VECTOR_DIM(CurrentAcceleration,double,46); - MAL_VECTOR_DIM(PreviousConfiguration,double,46) ; - MAL_VECTOR_DIM(PreviousVelocity,double,46); - MAL_VECTOR_DIM(PreviousAcceleration,double,46); - - getOptions(argc,argv, - VRMLPath, VRMLFileName, - SpecificitiesFileName, LinkJointRank, - InitConfig, - TestProfil); - // Humanoids - CjrlHumanoidDynamicRobot * aHDR = 0, * aDebugHDR = 0; - // Create Pattern Generator Interface - PatternGeneratorInterface * aPGI=0; - - // Instanciate and initialize. - string RobotFileName = VRMLPath + VRMLFileName; - CreateAndInitializeHumanoidRobot(RobotFileName, - SpecificitiesFileName, - LinkJointRank, InitConfig, - aHDR, aDebugHDR, aPGI); - - // Specify the walking mode: here the default one. - istringstream strm2(":walkmode 0"); - aPGI->ParseCmd(strm2); - - MAL_VECTOR_DIM(ZMPTarget,double,3); - - //COMPosition CurrentWaistPosition; - struct timeval begin,end,startingtime; - unsigned long int NbOfIt=0, NbOfItToCompute=0; - COMPosition finalCOMPosition; - FootAbsolutePosition LeftFootPosition; - FootAbsolutePosition RightFootPosition; + std::string TestNames[1] = { "TestHerdt2010OnLine"}; + int TestProfiles[1] = { PROFIL_HERDT_ONLINE_WALKING}; - - bool DebugFGPI = true; - bool DebugZMP2 = true; - unsigned int PGIInterface = 0; - - double TimeProfile[200*620]; - bool bTimeProfile=true; - double TimeProfileTS[200*620]; - unsigned int TimeProfileIndex = 0; - unsigned int TimeProfileUpperLimit=200*620; - - ofstream aofzmpmb2; - if (DebugZMP2) - aofzmpmb2.open("ZMPMBSTAGE2.dat",ofstream::out); - - - ofstream aof; - if (DebugFGPI) - { - aof.open("TestFGPI_description.dat",ofstream::out); - string Titles[26] = - { "Time", - "Com X", - "Com Y" , - "Com Z" , - "Com Yaw", - "Com dX" , - "Com dY" , - "Com dZ" , - "ZMP X (waist ref.)" , - "ZMP Y (waist ref.)" , - "Left Foot X" , - "Left Foot Y" , - "Left Foot Z" , - "Left Foot Theta" , - "Left Foot Omega" , - "Left Foot Omega2" , - "Right Foot X" , - "Right Foot Y" , - "Right Foot Z" , - "Right Foot Theta" , - "Right Foot Omega" , - "Right Foot Omega2" , - "ZMP X (world ref.)" , - "ZMP Y (world ref.)" , - "Waist X (world ref.)" , - "Waist Y (world ref.)" }; - for(unsigned int i=0;i<26;i++) - aof << i+1 << ". " <<Titles[i] <<std::endl; - - aof.close(); - aof.open("TestFGPI.dat",ofstream::out); - } - - double totaltime=0,maxtime=0; - double totaltimemodif=0, timemodif = 0; - double totaltimeinplanning=0; - unsigned long int nbofmodifs=0; - - gettimeofday(&startingtime,0); - // Number of sequences added. - unsigned int lNbItMax = 1; - - for (unsigned int lNbIt=0;lNbIt<lNbItMax;lNbIt++) + for (unsigned int i=0;i<1;i++) { - //StrangeStartingPosition(*aPGI); - cout << "<===============================================================>"<<endl; - cout << "Iteration nb: " << lNbIt << endl; - gettimeofday(&begin,0); - switch (TestProfil) - { - - case PROFIL_HERDT: - Herdt(*aPGI); - break; - - case PROFIL_HERDT_ONLINE: - HerdtOnline(*aPGI); - break; - - default: - break; - }; - - - // Should generate the same than the one previous (but shorter to specify). - - gettimeofday(&end,0); - double ltime = end.tv_sec-begin.tv_sec + 0.000001 * (end.tv_usec - begin.tv_usec); - totaltimeinplanning+=ltime; - - aDebugHDR->currentConfiguration(PreviousConfiguration); - aDebugHDR->currentVelocity(PreviousVelocity); - aDebugHDR->currentAcceleration(PreviousAcceleration); - aDebugHDR->computeForwardKinematics(); - - bool ok = true; - while(ok) + TestHerdt2010 aTH2010(argc,argv, + TestNames[i], + TestProfiles[i]); + try { - gettimeofday(&begin,0); - - if (PGIInterface==0) - { - ok = aPGI->RunOneStepOfTheControlLoop(CurrentConfiguration, - CurrentVelocity, - CurrentAcceleration, - ZMPTarget, - finalCOMPosition, - LeftFootPosition, - RightFootPosition); - } - else if (PGIInterface==1) - { - ok = aPGI->RunOneStepOfTheControlLoop(CurrentConfiguration, - CurrentVelocity, - CurrentAcceleration, - ZMPTarget); - } - - gettimeofday(&end,0); - double ltime = end.tv_sec-begin.tv_sec + 0.000001 * (end.tv_usec - begin.tv_usec); - if (maxtime<ltime) - maxtime = ltime; - NbOfIt++; - - if (ltime>0.000300) - { - totaltime += ltime; - NbOfItToCompute++; - } - - PreviousConfiguration = CurrentConfiguration; - PreviousVelocity = CurrentVelocity; - PreviousAcceleration = CurrentAcceleration; - - timemodif =0; - if (TestProfil==PROFIL_HERDT_ONLINE) + if (!aTH2010.doTest(std::cout)) { - if (NbOfIt>11*200) /* 200 iterations per second */ - { - Herdt_Stop(*aPGI); - if(NbOfIt > 10*200) - ok=false; - } - - if ((NbOfIt>2.5*200) && (NbOfIt<2.75*200)) /* */ - { - // aPGI->setCoMPerturbationForce(50,0.0); - } - } - - TimeProfile[TimeProfileIndex] = ltime + timemodif; - TimeProfileTS[TimeProfileIndex] = begin.tv_sec + 0.000001 * begin.tv_usec; - TimeProfileIndex++; - if (TimeProfileIndex>TimeProfileUpperLimit) - TimeProfileIndex = 0; - - if (DebugFGPI) - { - aof << NbOfIt*0.005 << " " - << finalCOMPosition.x[0] << " " - << finalCOMPosition.y[0] << " " - << finalCOMPosition.z[0] << " " - << finalCOMPosition.yaw << " " - << finalCOMPosition.x[1] << " " - << finalCOMPosition.y[1] << " " - << finalCOMPosition.z[1] << " " - << ZMPTarget(0) << " " << ZMPTarget(1) << " " - << LeftFootPosition.x << " " << LeftFootPosition.y << " " - << LeftFootPosition.z << " " << LeftFootPosition.theta << " " - << LeftFootPosition.omega << " " << LeftFootPosition.omega2 << " " - << RightFootPosition.x << " " << RightFootPosition.y << " " - << RightFootPosition.z << " " << RightFootPosition.theta << " " - << RightFootPosition.omega << " " << RightFootPosition.omega2 << " " - << ZMPTarget(0)*cos(CurrentConfiguration(5)) - - ZMPTarget(1)*sin(CurrentConfiguration(5)) - +CurrentConfiguration(0) << " " - << ZMPTarget(0)*sin(CurrentConfiguration(5)) + - ZMPTarget(1)*cos(CurrentConfiguration(5)) - +CurrentConfiguration(1) << " " - << CurrentConfiguration(0) << " " - << CurrentConfiguration(1) << " " - << begin.tv_sec + 0.000001 * begin.tv_usec - << endl; + cout << "Failed test " << i << endl; + return -1; } - + else + cout << "Passed test " << i << endl; } - - cout << "End of iteration " << lNbIt << endl; - cout << "<===============================================================>"<<endl; + catch (const char * astr) + { cerr << "Failed on following error " << astr << std::endl; + return -1; } } + return 0; +} +int main(int argc, char *argv[]) +{ + try + { + return PerformTests(argc,argv); + } + catch (const std::string& msg) + { + std::cerr << msg << std::endl; + } + return 1; +} - aofzmpmb2.close(); - - if (bTimeProfile) - { - ofstream lProfileOutput("TimeProfile.dat",ofstream::out); - double dST = startingtime.tv_sec + 0.000001 * startingtime.tv_usec; - for(unsigned int i=0;i<TimeProfileIndex;i++) - lProfileOutput << " " << TimeProfileTS[i] - dST - << " " << TimeProfile[i] << std::endl; - - lProfileOutput.close(); - } - - - if (DebugFGPI) - aof.close(); - - - delete aPGI; - - cout << "Number of iterations " << NbOfIt << " " << NbOfItToCompute << endl; - cout << "Time consumption: " << (double)totaltime/(double)NbOfItToCompute - << " max time: " << maxtime <<endl; - cout << "Time for modif: " << (double)totaltimemodif/(double)nbofmodifs - << " nb of modifs: " << nbofmodifs << endl ; - cout << "Time on ZMP ref planning (Kajita policy): " - << totaltimeinplanning<< " " - << totaltimeinplanning*4/(double)NbOfIt<< endl; -}