Forked from
Stack Of Tasks / jrl-walkgen
466 commits behind the upstream repository.
TestKajita2003.cpp 13.46 KiB
/*
* Copyright 2010,
*
* Olivier Stasse
*
* JRL, CNRS/AIST
*
* This file is part of walkGenJrl.
* walkGenJrl is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* walkGenJrl is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Lesser Public License for more details.
* You should have received a copy of the GNU Lesser General Public License
* along with walkGenJrl. If not, see <http://www.gnu.org/licenses/>.
*
* Research carried out within the scope of the
* Joint Japanese-French Robotics Laboratory (JRL)
*/
/* \file This file tests A. Herdt's walking algorithm for
* automatic foot placement giving an instantaneous CoM velocity reference.
*/
#include "CommonTools.hh"
#include "TestObject.hh"
#include <Debug.hh>
#include <hrp2-dynamics/hrp2OptHumanoidDynamicRobot.h>
using namespace::PatternGeneratorJRL;
using namespace::PatternGeneratorJRL::TestSuite;
using namespace std;
enum Profiles_t {
PROFIL_CIRCLE, // 1
PROFIL_STRAIGHT_WALKING, // 2
PROFIL_PB_FLORENT_SEQ1, // 3
PROFIL_PB_FLORENT_SEQ2 // 4
};
class TestKajita2003: public TestObject
{
private:
public:
TestKajita2003(int argc, char *argv[], string &aString, int TestProfile):
TestObject(argc,argv,aString)
{
m_TestProfile = TestProfile;
}
protected:
virtual void SpecializedRobotConstructor( CjrlHumanoidDynamicRobot *& aHDR,
CjrlHumanoidDynamicRobot *& aDebugHDR)
{
dynamicsJRLJapan::ObjectFactory aRobotDynamicsObjectConstructor;
Chrp2OptHumanoidDynamicRobot *aHRP2HDR= new Chrp2OptHumanoidDynamicRobot(&aRobotDynamicsObjectConstructor);
aHDR = aHRP2HDR;
aDebugHDR = new Chrp2OptHumanoidDynamicRobot(&aRobotDynamicsObjectConstructor);
}
void fillInDebugFiles( )
{
if (m_DebugFGPI)
{
ofstream aof;
string aFileName;
aFileName = m_TestName;
aFileName += "TestFGPI.dat";
aof.open(aFileName.c_str(),ofstream::app);
aof.precision(8);
aof.setf(ios::scientific, ios::floatfield);
aof << filterprecision(m_OneStep.NbOfIt*0.005 ) << " " // 1
<< filterprecision(m_OneStep.finalCOMPosition.x[0] ) << " " // 2
<< filterprecision(m_OneStep.finalCOMPosition.y[0] ) << " " // 3
<< filterprecision(m_OneStep.finalCOMPosition.z[0] ) << " " // 4
<< filterprecision(m_OneStep.finalCOMPosition.yaw[0] ) << " " // 5
<< filterprecision(m_OneStep.finalCOMPosition.x[1] ) << " " // 6
<< filterprecision(m_OneStep.finalCOMPosition.y[1] ) << " " // 7
<< filterprecision(m_OneStep.finalCOMPosition.z[1] ) << " " // 8
<< filterprecision(m_OneStep.ZMPTarget(0) ) << " " // 9
<< filterprecision(m_OneStep.ZMPTarget(1) ) << " " // 10
<< filterprecision(m_OneStep.LeftFootPosition.x ) << " " // 11
<< filterprecision(m_OneStep.LeftFootPosition.y ) << " " // 12
<< filterprecision(m_OneStep.LeftFootPosition.z ) << " " // 13
<< filterprecision(m_OneStep.LeftFootPosition.dx ) << " " // 14
<< filterprecision(m_OneStep.LeftFootPosition.dy ) << " " // 15
<< filterprecision(m_OneStep.LeftFootPosition.dz ) << " " // 16
<< filterprecision(m_OneStep.LeftFootPosition.ddx ) << " " // 17
<< filterprecision(m_OneStep.LeftFootPosition.ddy ) << " " // 18
<< filterprecision(m_OneStep.LeftFootPosition.ddz ) << " " // 19
<< filterprecision(m_OneStep.LeftFootPosition.theta*M_PI/180 ) << " " // 20
<< filterprecision(m_OneStep.LeftFootPosition.omega ) << " " // 21
<< filterprecision(m_OneStep.LeftFootPosition.omega2 ) << " " // 22
<< filterprecision(m_OneStep.RightFootPosition.x ) << " " // 23
<< filterprecision(m_OneStep.RightFootPosition.y ) << " " // 24
<< filterprecision(m_OneStep.RightFootPosition.z ) << " " // 25
<< filterprecision(m_OneStep.RightFootPosition.dx ) << " " // 26
<< filterprecision(m_OneStep.RightFootPosition.dy ) << " " // 27
<< filterprecision(m_OneStep.RightFootPosition.dz ) << " " // 28
<< filterprecision(m_OneStep.RightFootPosition.ddx ) << " " // 29
<< filterprecision(m_OneStep.RightFootPosition.ddy ) << " " // 30
<< filterprecision(m_OneStep.RightFootPosition.ddz ) << " " // 31
<< filterprecision(m_OneStep.RightFootPosition.theta*M_PI/180 ) << " " // 32
<< filterprecision(m_OneStep.RightFootPosition.omega ) << " " // 33
<< filterprecision(m_OneStep.RightFootPosition.omega2 ) << " " // 34
<< filterprecision(m_OneStep.ZMPTarget(0)*cos(m_CurrentConfiguration(5)) -
m_OneStep.ZMPTarget(1)*sin(m_CurrentConfiguration(5))
+m_CurrentConfiguration(0) ) << " " // 35
<< filterprecision(m_OneStep.ZMPTarget(0)*sin(m_CurrentConfiguration(5)) +
m_OneStep.ZMPTarget(1)*cos(m_CurrentConfiguration(5))
+m_CurrentConfiguration(1) ) << " " // 36
<< filterprecision(m_CurrentConfiguration(0) ) << " " // 37
<< filterprecision(m_CurrentConfiguration(1) ) << " "; // 38
for (unsigned int i = 0 ; i < m_HDR->currentConfiguration().size() ; i++)
{
aof << filterprecision(m_HDR->currentConfiguration()(i)) << " " ; // 39 - 74
}
aof << endl;
aof.close();
}
/// \brief Debug Purpose
/// --------------------
ofstream aof;
string aFileName;
ostringstream oss(std::ostringstream::ate);
static int iteration = 0;
if ( iteration == 0 ){
oss.str("/tmp/walk_Kajita.pos");
aFileName = oss.str();
aof.open(aFileName.c_str(),ofstream::out);
aof.close();
}
///----
oss.str("/tmp/walk_Kajita.pos");
aFileName = oss.str();
aof.open(aFileName.c_str(),ofstream::app);
aof.precision(8);
aof.setf(ios::scientific, ios::floatfield);
aof << filterprecision( iteration * 0.1 ) << " " ; // 1
for(unsigned int i = 6 ; i < m_CurrentConfiguration.size() ; i++){
aof << filterprecision( m_CurrentConfiguration(i) ) << " " ; // 1
}
for(unsigned int i = 0 ; i < 10 ; i++){
aof << 0.0 << " " ;
}
aof << endl ;
aof.close();
if ( iteration == 0 ){
oss.str("/tmp/walk_Kajita.hip");
aFileName = oss.str();
aof.open(aFileName.c_str(),ofstream::out);
aof.close();
}
oss.str("/tmp/walk_Kajita.hip");
aFileName = oss.str();
aof.open(aFileName.c_str(),ofstream::app);
aof.precision(8);
aof.setf(ios::scientific, ios::floatfield);
for(unsigned int j = 0 ; j < 20 ; j++){
aof << filterprecision( iteration * 0.5 ) << " " ; // 1
aof << filterprecision( 0.0 ) << " " ; // 1
aof << filterprecision( 0.0 ) << " " ; // 1
aof << filterprecision( m_OneStep.finalCOMPosition.yaw[0] ) << " " ; // 1
aof << endl ;
}
aof.close();
iteration++;
}
void TurningOnTheCircle(PatternGeneratorInterface &aPGI)
{
CommonInitialization(aPGI);
{
istringstream strm2(":supportfoot 1");
aPGI.ParseCmd(strm2);
}
{
istringstream strm2(":arc 0.0 0.75 30.0 -1");
aPGI.ParseCmd(strm2);
}
{
istringstream strm2(":lastsupport");
aPGI.ParseCmd(strm2);
}
{
istringstream strm2(":finish");
aPGI.ParseCmd(strm2);
}
}
void StraightWalking(PatternGeneratorInterface &aPGI)
{
CommonInitialization(aPGI);
{
istringstream strm2(":SetAlgoForZmpTrajectory Kajita");
aPGI.ParseCmd(strm2);
}
{
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.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.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);
}
}
void PbFlorentSeq1(PatternGeneratorInterface &aPGI)
{
CommonInitialization(aPGI);
{
istringstream strm2(":SetAlgoForZmpTrajectory Kajita");
aPGI.ParseCmd(strm2);
}
{
istringstream strm2(":stepseq 0 0.1 0 \
-0.0398822 -0.232351 4.6646 \
-0.0261703 0.199677 4.6646 \
-0.0471999 -0.256672 4.6646 \
-0.0305785 0.200634 4.6646 \
-0.0507024 -0.245393 4.6646 \
-0.0339626 0.197227 4.6646 \
-0.0527259 -0.228579 4.6646 \
-0.0362332 0.199282 4.6646 \
-0.0540087 -0.21638 4.6646 \
-0.0373302 0.196611 4.6646 \
-0.0536928 -0.199019 4.6646 \
-0.0372245 0.204021 4.6646 \
-0.0529848 -0.196642 4.6646 \
-0.0355124 0.2163 4.6646 \
-0.000858977 -0.204807 0.0767924 \
0 0.2 0");
aPGI.ParseCmd(strm2);
}
}
void PbFlorentSeq2(PatternGeneratorInterface &aPGI)
{
CommonInitialization(aPGI);
{
istringstream strm2(":SetAlgoForZmpTrajectory Kajita");
aPGI.ParseCmd(strm2);
}
{
istringstream strm2(":stepseq \
0 -0.1 0 \
-0.0512076 0.207328 -1.15414 \
-0.0473172 -0.218623 -1.15414 \
-0.0515644 0.21034 -1.15414 \
-0.0475332 -0.215615 -1.15414 \
-0.0516395 0.203345 -1.15414 \
-0.0476688 -0.217615 -1.15414 \
-0.0517348 0.201344 -1.15414 \
-0.0477237 -0.219617 -1.15414 \
-0.0517494 0.21934 -1.15414 \
-0.047698 -0.201621 -1.15414 \
-0.0516832 0.217337 -1.15414 \
-0.0475915 -0.203622 -1.15414 \
-0.0515365 0.215339 -1.15414 \
-0.0474046 -0.205617 -1.15414 \
-0.0513094 0.213348 -1.15414 \
-0.0471374 -0.207603 -1.15414 \
-0.0510024 0.216368 -1.15414 \
-0.0466898 -0.214575 -1.15414 \
-0.0506158 0.214402 -1.15414 \
-0.0462637 -0.216533 -1.15414 \
-0.0501503 0.217453 -1.15414 \
-0.0456584 -0.223471 -1.15414 \
-0.0366673 0.212742 1.62857 \
-0.0360079 -0.201543 4.21944 \
-0.0154622 0.279811 4.21944 \
-0.0300936 -0.217751 4.21944 \
-0.00928506 0.283157 4.21944 \
-0.0236871 -0.219869 4.21944 \
-0.00231593 0.290546 4.21944 \
-0.0169269 -0.202959 4.21944 \
0.00493436 0.296941 4.21944 \
-0.00995958 -0.202061 4.21944 \
0.0119489 0.297324 4.21944 \
-0.00293587 -0.202195 4.21944 \
0.0189437 0.296673 4.21944 \
0.00399208 -0.203358 4.21944 \
0.0257673 0.295003 4.21944 \
0.0106743 -0.200526 4.21944 \
0.031904 0.287363 4.21944 \
0.016966 -0.203651 4.21944 \
0.0379487 0.283784 4.21944 \
0.141438 -0.212069 3.6834 \
0.204562 0.216453 2.64204 \
0.200635 -0.218747 -0.366254 \
0.216228 0.204108 -2.13008 \
0.206583 -0.212425 -3.87382 \
0.187966 0.211947 -6.61811 \
0.219749 -0.17341 -12.4824 \
0.146814 0.240465 -26.5643 \
0.247166 -0.119114 -37.1489 \
0.163211 0.222722 -19.7198 \
0.208825 -0.213706 -5.15242 \
0.0285368 0.200005 -0.0337318 \
0 -0.2 0 ");
aPGI.ParseCmd(strm2);
}
}
void chooseTestProfile()
{
switch(m_TestProfile)
{
case PROFIL_CIRCLE:
TurningOnTheCircle(*m_PGI);
break;
case PROFIL_STRAIGHT_WALKING:
StraightWalking(*m_PGI);
break;
case PROFIL_PB_FLORENT_SEQ1:
PbFlorentSeq1(*m_PGI);
break;
case PROFIL_PB_FLORENT_SEQ2:
PbFlorentSeq2(*m_PGI);
break;
default:
throw("No correct test profile");
break;
}
}
void generateEvent()
{
}
};
int PerformTests(int argc, char *argv[])
{
std::string TestNames[4] = { "TestKajita2003StraightWalking",
"TestKajita2003Circle",
"TestKajita2003PbFlorentSeq1",
"TestKajita2003PbFlorentSeq2"};
int TestProfiles[4] = { PROFIL_STRAIGHT_WALKING,
PROFIL_CIRCLE,
PROFIL_PB_FLORENT_SEQ1,
PROFIL_PB_FLORENT_SEQ2};
for (unsigned int i=0;i<4;i++)
{
TestKajita2003 aTK2003(argc,argv,
TestNames[i],
TestProfiles[i]);
aTK2003.init();
try
{
if (!aTK2003.doTest(std::cout))
{
cout << "Failed test " << i << endl;
return -1;
}
else
cout << "Passed test " << i << 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;
}