From ecb1ccdc5665219f9ee5eff0d8b26cdaa8e91f53 Mon Sep 17 00:00:00 2001 From: mnaveau <maximilien.naveau@laas.fr> Date: Thu, 19 Jun 2014 20:53:40 +0200 Subject: [PATCH] debugging the dynamic filter --- .../ComAndFootRealizationByGeometry.hh | 13 + .../AnalyticalMorisawaCompact.cpp | 63 ++- .../DynamicFilter.cpp | 425 ++++++++++-------- .../DynamicFilter.hh | 48 +- .../ZMPVelocityReferencedQP.cpp | 11 +- tests/TestMorisawa2007.cpp | 396 ++++++++-------- 6 files changed, 525 insertions(+), 431 deletions(-) diff --git a/src/MotionGeneration/ComAndFootRealizationByGeometry.hh b/src/MotionGeneration/ComAndFootRealizationByGeometry.hh index c2655db3..bf4518ac 100644 --- a/src/MotionGeneration/ComAndFootRealizationByGeometry.hh +++ b/src/MotionGeneration/ComAndFootRealizationByGeometry.hh @@ -258,6 +258,19 @@ namespace PatternGeneratorJRL inline void SetPreviousVelocityStage1(MAL_VECTOR_TYPE(double) & prev_Velocity1) { m_prev_Velocity1 = prev_Velocity1 ;}; + /*! \brief Getter and setter for the previous configurations and velocities */ + inline void SetPreviousConfigurationStage0(const MAL_VECTOR_TYPE(double) & prev_Configuration) + { m_prev_Configuration = prev_Configuration ;}; + + inline void SetPreviousConfigurationStage1(const MAL_VECTOR_TYPE(double) & prev_Configuration1) + { m_prev_Configuration1 = prev_Configuration1 ;}; + + inline void SetPreviousVelocityStage0(const MAL_VECTOR_TYPE(double) & prev_Velocity) + { m_prev_Velocity = prev_Velocity ;}; + + inline void SetPreviousVelocityStage1(const MAL_VECTOR_TYPE(double) & prev_Velocity1) + { m_prev_Velocity1 = prev_Velocity1 ;}; + /*! \brief Getter and setter for the previous configurations and velocities */ inline MAL_VECTOR_TYPE(double) & GetPreviousConfigurationStage0() { return m_prev_Configuration ;}; diff --git a/src/ZMPRefTrajectoryGeneration/AnalyticalMorisawaCompact.cpp b/src/ZMPRefTrajectoryGeneration/AnalyticalMorisawaCompact.cpp index 003fffdb..2a21ccaf 100644 --- a/src/ZMPRefTrajectoryGeneration/AnalyticalMorisawaCompact.cpp +++ b/src/ZMPRefTrajectoryGeneration/AnalyticalMorisawaCompact.cpp @@ -712,9 +712,12 @@ namespace PatternGeneratorJRL for (unsigned i = 0 ; i < N ; ++i) { current_time += m_kajitaDynamicFilter->getInterpolationPeriod() ; - - if (m_AnalyticalZMPCoGTrajectoryX->GetIntervalIndexFromTime(current_time,lIndexInterval,lPrevIndexInterval)) + bool setTime = !m_AnalyticalZMPCoGTrajectoryX->GetIntervalIndexFromTime(current_time,lIndexInterval,lPrevIndexInterval); + if( setTime == 1 ) { + current_time -= m_kajitaDynamicFilter->getInterpolationPeriod(); + m_AnalyticalZMPCoGTrajectoryX->GetIntervalIndexFromTime(time,lIndexInterval); + } /*! Feed the ZMPPositions. */ m_AnalyticalZMPCoGTrajectoryX->ComputeZMP(current_time,ZMPPos_deq[i].px,lIndexInterval); m_AnalyticalZMPCoGTrajectoryY->ComputeZMP(current_time,ZMPPos_deq[i].py,lIndexInterval); @@ -734,32 +737,52 @@ namespace PatternGeneratorJRL /*! Left */ m_FeetTrajectoryGenerator->ComputeAnAbsoluteFootPosition(1,current_time,LeftFootAbsPos_deq[i],lIndexInterval); m_FeetTrajectoryGenerator->ComputeAnAbsoluteFootPosition(-1,current_time,RightFootAbsPos_deq[i],lIndexInterval); - }else - { - ZMPPos_deq[i]=ZMPPos_deq[i-1]; - COMPos_deq[i]=COMPos_deq[i-1]; - LeftFootAbsPos_deq[i]=LeftFootAbsPos_deq[i-1]; - RightFootAbsPos_deq[i]=RightFootAbsPos_deq[i-1]; - LeftFootAbsPos_deq[i].time = RightFootAbsPos_deq[i].time = ZMPPos_deq[i].time = current_time ; - } } + m_AnalyticalZMPCoGTrajectoryX->GetIntervalIndexFromTime(time,lIndexInterval); + COMState lastCtrlCoMState; memset(&lastCtrlCoMState,0,sizeof(lastCtrlCoMState)); + ZMPPosition lastCtrlZMP ; memset(&lastCtrlZMP,0,sizeof(lastCtrlZMP)); + FootAbsolutePosition lastCtrlLeftFoot; memset(&lastCtrlLeftFoot,0,sizeof(lastCtrlLeftFoot)); + FootAbsolutePosition lastCtrlRightFoot; memset(&lastCtrlRightFoot,0,sizeof(lastCtrlRightFoot)); + + m_AnalyticalZMPCoGTrajectoryX->ComputeZMP(time,lastCtrlZMP.px,lIndexInterval); + m_AnalyticalZMPCoGTrajectoryY->ComputeZMP(time,lastCtrlZMP.py,lIndexInterval); + + m_AnalyticalZMPCoGTrajectoryX->ComputeCOM(time,lastCtrlCoMState.x[0],lIndexInterval); + m_AnalyticalZMPCoGTrajectoryX->ComputeCOMSpeed(time,lastCtrlCoMState.x[1],lIndexInterval); + m_AnalyticalZMPCoGTrajectoryX->ComputeCOMAcceleration(time,lastCtrlCoMState.x[2],lIndexInterval); + + m_AnalyticalZMPCoGTrajectoryY->ComputeCOM(time,lastCtrlCoMState.y[0],lIndexInterval); + m_AnalyticalZMPCoGTrajectoryY->ComputeCOMSpeed(time,lastCtrlCoMState.y[1],lIndexInterval); + m_AnalyticalZMPCoGTrajectoryY->ComputeCOMAcceleration(time,lastCtrlCoMState.y[2],lIndexInterval); + lastCtrlCoMState.z[0] = m_InitialPoseCoMHeight; + + m_FeetTrajectoryGenerator->ComputeAnAbsoluteFootPosition(1,time,lastCtrlLeftFoot,lIndexInterval); + m_FeetTrajectoryGenerator->ComputeAnAbsoluteFootPosition(-1,time,lastCtrlRightFoot,lIndexInterval); std::deque<COMState> deltaCoMTraj_deq (1); memset(&deltaCoMTraj_deq[0],0,sizeof(deltaCoMTraj_deq[0])); - m_kajitaDynamicFilter->filter(COMPos_deq,ZMPPos_deq,LeftFootAbsPos_deq,RightFootAbsPos_deq,deltaCoMTraj_deq); + + m_kajitaDynamicFilter->filter( + lastCtrlCoMState, + lastCtrlLeftFoot, + lastCtrlRightFoot, + COMPos_deq, + ZMPPos_deq, + LeftFootAbsPos_deq, + RightFootAbsPos_deq, + deltaCoMTraj_deq); - COMState aCOMState (COMPos_deq[0]) ; for(unsigned i = 0 ; i < 3 ; ++i) { - aCOMState.x[i] += deltaCoMTraj_deq[0].x[i] ; - aCOMState.y[i] += deltaCoMTraj_deq[0].y[i] ; + lastCtrlCoMState.x[i] += deltaCoMTraj_deq[0].x[i] + aCOMStateToFilter.x[i] ; + lastCtrlCoMState.y[i] += deltaCoMTraj_deq[0].y[i] + aCOMStateToFilter.y[i] ; } - ZMPPos_deq[0].px += aZMPPositionToFilter.px; - ZMPPos_deq[0].py += aZMPPositionToFilter.py; - FinalZMPPositions.push_back(ZMPPos_deq[0]); - FinalCOMStates.push_back(aCOMState); - FinalLeftFootAbsolutePositions.push_back(LeftFootAbsPos_deq[0]); - FinalRightFootAbsolutePositions.push_back(RightFootAbsPos_deq[0]); + lastCtrlZMP.px += aZMPPositionToFilter.px; + lastCtrlZMP.py += aZMPPositionToFilter.py; + FinalZMPPositions.push_back(lastCtrlZMP); + FinalCOMStates.push_back(lastCtrlCoMState); + FinalLeftFootAbsolutePositions.push_back(lastCtrlLeftFoot); + FinalRightFootAbsolutePositions.push_back(lastCtrlRightFoot); } } else diff --git a/src/ZMPRefTrajectoryGeneration/DynamicFilter.cpp b/src/ZMPRefTrajectoryGeneration/DynamicFilter.cpp index 7a28653e..d31fd240 100644 --- a/src/ZMPRefTrajectoryGeneration/DynamicFilter.cpp +++ b/src/ZMPRefTrajectoryGeneration/DynamicFilter.cpp @@ -7,8 +7,7 @@ using namespace metapod; DynamicFilter::DynamicFilter( SimplePluginManager *SPM, - CjrlHumanoidDynamicRobot *aHS - ) + CjrlHumanoidDynamicRobot *aHS) { currentTime_ = 0.0 ; controlPeriod_ = 0.0 ; @@ -79,8 +78,7 @@ void DynamicFilter::init( double interpolationPeriod, double PG_T, double previewWindowSize, - double CoMHeight - ) + double CoMHeight) { currentTime_ = currentTime ; controlPeriod_ = controlPeriod ; @@ -88,10 +86,10 @@ void DynamicFilter::init( PG_T_ = PG_T ; previewWindowSize_ = previewWindowSize ; - if (PG_T>interpolationPeriod_) + if (interpolationPeriod_>PG_T) {NbI_=1;} else - {NbI_ = PG_T/interpolationPeriod_;} + {NbI_ = (int)(PG_T/interpolationPeriod_);} NCtrl_ = (int)(PG_T_/controlPeriod_) ; PG_N_ = (int)(previewWindowSize_/interpolationPeriod_) ; @@ -126,150 +124,156 @@ void DynamicFilter::init( } int DynamicFilter::filter( + COMState & lastCtrlCoMState, + FootAbsolutePosition & lastCtrlLeftFoot, + FootAbsolutePosition & lastCtrlRightFoot, deque<COMState> & inputCOMTraj_deq_, deque<ZMPPosition> inputZMPTraj_deq_, deque<FootAbsolutePosition> & inputLeftFootTraj_deq_, deque<FootAbsolutePosition> & inputRightFootTraj_deq_, - deque<COMState> & outputDeltaCOMTraj_deq_ - ) + deque<COMState> & outputDeltaCOMTraj_deq_) { InverseKinematics( + lastCtrlCoMState, + lastCtrlLeftFoot, + lastCtrlRightFoot, inputCOMTraj_deq_, inputLeftFootTraj_deq_, inputRightFootTraj_deq_); + InverseDynamics(inputZMPTraj_deq_); - //InverseDynamics(inputZMPTraj_deq_); - - //int error = OptimalControl(outputDeltaCOMTraj_deq_); + int error = OptimalControl(outputDeltaCOMTraj_deq_); printBuffers(inputCOMTraj_deq_, inputZMPTraj_deq_, inputLeftFootTraj_deq_, inputRightFootTraj_deq_, outputDeltaCOMTraj_deq_); - int error = 0 ; + printAlongTime(inputCOMTraj_deq_, + inputZMPTraj_deq_, + inputLeftFootTraj_deq_, + inputRightFootTraj_deq_, + outputDeltaCOMTraj_deq_); return error ; } void DynamicFilter::InverseKinematics( + COMState & lastCtrlCoMState, + FootAbsolutePosition & lastCtrlLeftFoot, + FootAbsolutePosition & lastCtrlRightFoot, deque<COMState> & inputCOMTraj_deq_, deque<FootAbsolutePosition> & inputLeftFootTraj_deq_, deque<FootAbsolutePosition> & inputRightFootTraj_deq_) { - const int stage0 = 0 ; - int iteration = 2 ; - comAndFootRealization_->SetPreviousConfigurationStage0( - previousConfiguration_); - comAndFootRealization_->SetPreviousVelocityStage0( - previousVelocity_); + int stage0 = 0 ; + int stage1 = 1 ; + comAndFootRealization_->SetPreviousConfigurationStage0(previousConfiguration_); + comAndFootRealization_->SetPreviousVelocityStage0(previousVelocity_); + comAndFootRealization_->setSamplingPeriod(interpolationPeriod_); for(unsigned int i = 0 ; i < PG_N_ ; i++ ) { - const COMState & acomp = inputCOMTraj_deq_[i] ; - const FootAbsolutePosition & aLeftFAP = - inputLeftFootTraj_deq_ [i] ; - const FootAbsolutePosition & aRightFAP = - inputRightFootTraj_deq_ [i] ; - - aCoMState_(0) = acomp.x[0]; aCoMSpeed_(0) = acomp.x[1]; - aCoMState_(1) = acomp.y[0]; aCoMSpeed_(1) = acomp.y[1]; - aCoMState_(2) = acomp.z[0]; aCoMSpeed_(2) = acomp.z[1]; - aCoMState_(3) = acomp.roll[0]; aCoMSpeed_(3) = acomp.roll[1]; - aCoMState_(4) = acomp.pitch[0]; aCoMSpeed_(4) = acomp.pitch[1]; - aCoMState_(5) = acomp.yaw[0]; aCoMSpeed_(5) = acomp.yaw[1]; - - aCoMAcc_(0) = acomp.x[2]; aLeftFootPosition_(0) = aLeftFAP.x; - aCoMAcc_(1) = acomp.y[2]; aLeftFootPosition_(1) = aLeftFAP.y; - aCoMAcc_(2) = acomp.z[2]; aLeftFootPosition_(2) = aLeftFAP.z; - aCoMAcc_(3) = acomp.roll[2]; aLeftFootPosition_(3) = aLeftFAP.theta; - aCoMAcc_(4) = acomp.pitch[2];aLeftFootPosition_(4) = aLeftFAP.omega; - aCoMAcc_(5) = acomp.yaw[2]; - - aRightFootPosition_(0) = aRightFAP.x; - aRightFootPosition_(1) = aRightFAP.y; - aRightFootPosition_(2) = aRightFAP.z; - aRightFootPosition_(3) = aRightFAP.theta; - aRightFootPosition_(4) = aRightFAP.omega; - - comAndFootRealization_->ComputePostureForGivenCoMAndFeetPosture( - aCoMState_, aCoMSpeed_, aCoMAcc_, - aLeftFootPosition_, aRightFootPosition_, - configurationTraj_[i], - velocityTraj_[i], - accelerationTraj_[i], - iteration, stage0); + InverseKinematics(inputCOMTraj_deq_[i],inputLeftFootTraj_deq_ [i], inputRightFootTraj_deq_ [i], + configurationTraj_[i],velocityTraj_[i],accelerationTraj_[i], + interpolationPeriod_, stage0); } -// tmpConfigurationTraj_[0] = ( ConfigurationTraj_[1]+ConfigurationTraj_[0]+PreviousConfiguration_ )/3; -// tmpVelocityTraj_[0] = ( VelocityTraj_[1]+VelocityTraj_[0]+PreviousVelocity_ )/3; -// tmpAccelerationTraj_[0] = ( AccelerationTraj_[1]+AccelerationTraj_[0]+PreviousAcceleration_ )/3; - - // saving the precedent state of the next QP_ computation - previousConfiguration_ = configurationTraj_[NbI_-1] ; - previousVelocity_ = velocityTraj_[NbI_-1] ; - previousAcceleration_ = accelerationTraj_[NbI_-1] ; - -// for (unsigned int i = 1 ; i < N-1 ; ++i ) -// { -// tmpConfigurationTraj_[i] = ( ConfigurationTraj_[i+1] + ConfigurationTraj_[i] + ConfigurationTraj_[i-1] )/3; -// tmpVelocityTraj_[i] = ( VelocityTraj_[i+1] + VelocityTraj_[i] + VelocityTraj_[i-1] )/3; -// tmpAccelerationTraj_[i] = ( AccelerationTraj_[i+1] + AccelerationTraj_[i] + AccelerationTraj_[i-1] )/3; -// } -// -// tmpConfigurationTraj_[N-1] = ( ConfigurationTraj_[N-1]+ConfigurationTraj_[N-2] )*0.5; -// tmpVelocityTraj_[N-1] = ( VelocityTraj_[N-1]+VelocityTraj_[N-2] )*0.5; -// tmpAccelerationTraj_[N-1] = ( AccelerationTraj_[N-1]+AccelerationTraj_[N-2] )*0.5; -// -// -// ConfigurationTraj_ = tmpConfigurationTraj_ ; -// VelocityTraj_ = tmpVelocityTraj_ ; -// AccelerationTraj_ = tmpAccelerationTraj_ ; - + InverseKinematics(lastCtrlCoMState, lastCtrlLeftFoot, lastCtrlRightFoot, + previousConfiguration_,previousVelocity_,previousAcceleration_, + controlPeriod_, stage1); return ; } -void DynamicFilter::InverseDynamics( - deque<ZMPPosition> inputZMPTraj_deq_) +void DynamicFilter::InverseKinematics( + COMState & inputCoMState, + FootAbsolutePosition & inputLeftFoot, + FootAbsolutePosition & inputRightFoot, + MAL_VECTOR_TYPE(double)& configuration, + MAL_VECTOR_TYPE(double)& velocity, + MAL_VECTOR_TYPE(double)& acceleration, + double samplingPeriod, + int stage) +{ + int iteration = 2 ; + aCoMState_(0) = inputCoMState.x[0]; aCoMSpeed_(0) = inputCoMState.x[1]; + aCoMState_(1) = inputCoMState.y[0]; aCoMSpeed_(1) = inputCoMState.y[1]; + aCoMState_(2) = inputCoMState.z[0]; aCoMSpeed_(2) = inputCoMState.z[1]; + aCoMState_(3) = inputCoMState.roll[0]; aCoMSpeed_(3) = inputCoMState.roll[1]; + aCoMState_(4) = inputCoMState.pitch[0]; aCoMSpeed_(4) = inputCoMState.pitch[1]; + aCoMState_(5) = inputCoMState.yaw[0]; aCoMSpeed_(5) = inputCoMState.yaw[1]; + + aCoMAcc_(0) = inputCoMState.x[2]; aLeftFootPosition_(0) = inputLeftFoot.x; + aCoMAcc_(1) = inputCoMState.y[2]; aLeftFootPosition_(1) = inputLeftFoot.y; + aCoMAcc_(2) = inputCoMState.z[2]; aLeftFootPosition_(2) = inputLeftFoot.z; + aCoMAcc_(3) = inputCoMState.roll[2]; aLeftFootPosition_(3) = inputLeftFoot.theta; + aCoMAcc_(4) = inputCoMState.pitch[2];aLeftFootPosition_(4) = inputLeftFoot.omega; + aCoMAcc_(5) = inputCoMState.yaw[2]; + + aRightFootPosition_(0) = inputRightFoot.x; + aRightFootPosition_(1) = inputRightFoot.y; + aRightFootPosition_(2) = inputRightFoot.z; + aRightFootPosition_(3) = inputRightFoot.theta; + aRightFootPosition_(4) = inputRightFoot.omega; + + comAndFootRealization_->setSamplingPeriod(samplingPeriod); + comAndFootRealization_->ComputePostureForGivenCoMAndFeetPosture( + aCoMState_, aCoMSpeed_, aCoMAcc_, + aLeftFootPosition_, aRightFootPosition_, + configuration, velocity, acceleration, + iteration, stage); + return; +} + +void DynamicFilter::InverseDynamics(deque<ZMPPosition> inputZMPTraj_deq) { for (unsigned int i = 0 ; i < PG_N_ ; i++ ) { - // Copy the angular trajectory data from "Boost" to "Eigen" - for(unsigned int j = 0 ; j < configurationTraj_[i].size() ; j++ ) - { - m_q(j,0) = configurationTraj_[i](j) ; - m_dq(j,0) = velocityTraj_[i](j) ; - m_ddq(j,0) = accelerationTraj_[i](j) ; - } - - // Apply the RNEA on the robot model - metapod::rnea< Robot_Model, true >::run(m_robot, m_q, m_dq, m_ddq); - - Node & node = - boost::fusion::at_c<Robot_Model::BODY>(m_robot.nodes); - m_force = node.body.iX0.applyInv (node.joint.f); + ComputeZMPMB(configurationTraj_[i],velocityTraj_[i],accelerationTraj_[i],ZMPMB_vec_[i]); if (Once_){ - DInitX_ = inputZMPTraj_deq_[0].px - - ( - m_force.n()[1] / m_force.f()[2] ) ; - DInitY_ = inputZMPTraj_deq_[0].py - - ( m_force.n()[0] / m_force.f()[2] ) ; + DInitX_ = inputZMPTraj_deq[0].px - ZMPMB_vec_[i][0]; + DInitY_ = inputZMPTraj_deq[0].py - ZMPMB_vec_[i][1]; Once_ = false ; } - ZMPMB_vec_[i][0] = - m_force.n()[1] / m_force.f()[2] + DInitX_ ; - ZMPMB_vec_[i][1] = m_force.n()[0] / m_force.f()[2] + DInitY_ ; - - deltaZMP_deq_[i].px = inputZMPTraj_deq_[i].px - ZMPMB_vec_[i][0] ; - deltaZMP_deq_[i].py = inputZMPTraj_deq_[i].py - ZMPMB_vec_[i][1] ; + deltaZMP_deq_[i].px = inputZMPTraj_deq[i].px - ZMPMB_vec_[i][0] - DInitX_ ; + deltaZMP_deq_[i].py = inputZMPTraj_deq[i].py - ZMPMB_vec_[i][1] - DInitY_ ; deltaZMP_deq_[i].pz = 0.0 ; deltaZMP_deq_[i].theta = 0.0 ; deltaZMP_deq_[i].time = currentTime_ + i * interpolationPeriod_ ; - deltaZMP_deq_[i].stepType = inputZMPTraj_deq_[i].stepType ; + deltaZMP_deq_[i].stepType = inputZMPTraj_deq[i].stepType ; } return ; } +void DynamicFilter::ComputeZMPMB( + MAL_VECTOR_TYPE(double) & configuration, + MAL_VECTOR_TYPE(double) & velocity, + MAL_VECTOR_TYPE(double) & acceleration, + vector<double> & ZMPMB) +{ + // Copy the angular trajectory data from "Boost" to "Eigen" + for(unsigned int j = 0 ; j < configuration.size() ; j++ ) + { + m_q(j,0) = configuration(j) ; + m_dq(j,0) = velocity(j) ; + m_ddq(j,0) = acceleration(j) ; + } + + // Apply the RNEA on the robot model + metapod::rnea< Robot_Model, true >::run(m_robot, m_q, m_dq, m_ddq); + + Node & node = boost::fusion::at_c<Robot_Model::BODY>(m_robot.nodes); + m_force = node.body.iX0.applyInv (node.joint.f); + + ZMPMB.resize(2); + ZMPMB[0] = - m_force.n()[1] / m_force.f()[2] ; + ZMPMB[1] = m_force.n()[0] / m_force.f()[2] ; + + return ; +} + int DynamicFilter::OptimalControl( deque<COMState> & outputDeltaCOMTraj_deq_) { @@ -332,8 +336,7 @@ void DynamicFilter::printAlongTime(deque<COMState> & inputCOMTraj_deq_, deque<ZMPPosition> inputZMPTraj_deq_, deque<FootAbsolutePosition> & inputLeftFootTraj_deq_, deque<FootAbsolutePosition> & inputRightFootTraj_deq_, - deque<COMState> & outputDeltaCOMTraj_deq_ - ) + deque<COMState> & outputDeltaCOMTraj_deq_) { // Debug Purpose // ------------- @@ -341,12 +344,9 @@ void DynamicFilter::printAlongTime(deque<COMState> & inputCOMTraj_deq_, string aFileName; ostringstream oss(std::ostringstream::ate); static int iteration = 0; -// int iteration100 = (int)iteration/100; -// int iteration10 = (int)(iteration - iteration100*100)/10; -// int iteration1 = (int)(iteration - iteration100*100 - iteration10*10 ); // -------------------- - oss.str("DynamicFilterAllVariablesAlongInTime.dat"); + oss.str("DynamicFilterAllVariablesNoisyAlongInTime.dat"); aFileName = oss.str(); if(iteration == 0) { @@ -357,88 +357,83 @@ void DynamicFilter::printAlongTime(deque<COMState> & inputCOMTraj_deq_, aof.open(aFileName.c_str(),ofstream::app); aof.precision(8); aof.setf(ios::scientific, ios::floatfield); - for (unsigned int i = 0 ; i < NbI_ ; ++i ) - { - aof << filterprecision( iteration*controlPeriod_ + i*interpolationPeriod_ ) << " " // 0 - << filterprecision( inputCOMTraj_deq_[i].x[0] ) << " " // 1 - << filterprecision( inputCOMTraj_deq_[i].x[1] ) << " " // 2 - << filterprecision( inputCOMTraj_deq_[i].x[2] ) << " " // 3 - << filterprecision( inputCOMTraj_deq_[i].y[0] ) << " " // 4 - << filterprecision( inputCOMTraj_deq_[i].y[1] ) << " " // 5 - << filterprecision( inputCOMTraj_deq_[i].y[2] ) << " " // 6 - << filterprecision( inputCOMTraj_deq_[i].z[0] ) << " " // 7 - << filterprecision( inputCOMTraj_deq_[i].z[1] ) << " " // 8 - << filterprecision( inputCOMTraj_deq_[i].z[2] ) << " " // 9 - << filterprecision( inputCOMTraj_deq_[i].roll[0] ) << " " // 10 - << filterprecision( inputCOMTraj_deq_[i].roll[1] ) << " " // 11 - << filterprecision( inputCOMTraj_deq_[i].roll[2] ) << " " // 12 - << filterprecision( inputCOMTraj_deq_[i].pitch[0] ) << " "// 13 - << filterprecision( inputCOMTraj_deq_[i].pitch[1] ) << " "// 14 - << filterprecision( inputCOMTraj_deq_[i].pitch[2] ) << " "// 15 - << filterprecision( inputCOMTraj_deq_[i].yaw[0] ) << " " // 16 - << filterprecision( inputCOMTraj_deq_[i].yaw[1] ) << " " // 17 - << filterprecision( inputCOMTraj_deq_[i].yaw[2] ) << " " // 18 - - << filterprecision( inputZMPTraj_deq_[i].px ) << " " // 19 - << filterprecision( inputZMPTraj_deq_[i].py ) << " " // 20 - - << filterprecision( ZMPMB_vec_[i][0] ) << " " // 21 - << filterprecision( ZMPMB_vec_[i][1] ) << " " // 22 - - << filterprecision( inputLeftFootTraj_deq_[i].x ) << " " // 23 - << filterprecision( inputLeftFootTraj_deq_[i].y ) << " " // 24 - << filterprecision( inputLeftFootTraj_deq_[i].z ) << " " // 25 - << filterprecision( inputLeftFootTraj_deq_[i].theta ) << " " // 26 - << filterprecision( inputLeftFootTraj_deq_[i].omega ) << " " // 27 - << filterprecision( inputLeftFootTraj_deq_[i].dx ) << " " // 28 - << filterprecision( inputLeftFootTraj_deq_[i].dy ) << " " // 29 - << filterprecision( inputLeftFootTraj_deq_[i].dz ) << " " // 30 - << filterprecision( inputLeftFootTraj_deq_[i].dtheta ) << " " // 31 - << filterprecision( inputLeftFootTraj_deq_[i].domega ) << " " // 32 - << filterprecision( inputLeftFootTraj_deq_[i].ddx ) << " " // 33 - << filterprecision( inputLeftFootTraj_deq_[i].ddy ) << " " // 34 - << filterprecision( inputLeftFootTraj_deq_[i].ddz ) << " " // 35 - << filterprecision( inputLeftFootTraj_deq_[i].ddtheta ) << " " // 36 - << filterprecision( inputLeftFootTraj_deq_[i].ddomega ) << " " // 37 - - << filterprecision( inputRightFootTraj_deq_[i].x ) << " " // 38 - << filterprecision( inputRightFootTraj_deq_[i].y ) << " " // 39 - << filterprecision( inputRightFootTraj_deq_[i].z ) << " " // 40 - << filterprecision( inputRightFootTraj_deq_[i].theta ) << " " // 41 - << filterprecision( inputRightFootTraj_deq_[i].omega ) << " " // 42 - << filterprecision( inputRightFootTraj_deq_[i].dx ) << " " // 43 - << filterprecision( inputRightFootTraj_deq_[i].dy ) << " " // 44 - << filterprecision( inputRightFootTraj_deq_[i].dz ) << " " // 45 - << filterprecision( inputRightFootTraj_deq_[i].dtheta ) << " " // 46 - << filterprecision( inputRightFootTraj_deq_[i].domega ) << " " // 47 - << filterprecision( inputRightFootTraj_deq_[i].ddx ) << " " // 48 - << filterprecision( inputRightFootTraj_deq_[i].ddy ) << " " // 49 - << filterprecision( inputRightFootTraj_deq_[i].ddz ) << " " // 50 - << filterprecision( inputRightFootTraj_deq_[i].ddtheta ) << " "// 51 - << filterprecision( inputRightFootTraj_deq_[i].ddomega ) << " ";// 52 - - for(unsigned int j = 0 ; j < configurationTraj_[i].size() ; j++ ) - aof << filterprecision( configurationTraj_[i](j) ) << " " ; - for(unsigned int j = 0 ; j < velocityTraj_[i].size() ; j++ ) - aof << filterprecision( velocityTraj_[i](j) ) << " " ; - for(unsigned int j = 0 ; j < accelerationTraj_[i].size() ; j++ ) - aof << filterprecision( accelerationTraj_[i](j) ) << " " ; - aof << endl ; - } + aof << filterprecision( iteration*controlPeriod_) << " " // 0 + << filterprecision( inputCOMTraj_deq_[0].x[0] ) << " " // 1 + << filterprecision( inputCOMTraj_deq_[0].x[1] ) << " " // 2 + << filterprecision( inputCOMTraj_deq_[0].x[2] ) << " " // 3 + << filterprecision( inputCOMTraj_deq_[0].y[0] ) << " " // 4 + << filterprecision( inputCOMTraj_deq_[0].y[1] ) << " " // 5 + << filterprecision( inputCOMTraj_deq_[0].y[2] ) << " " // 6 + << filterprecision( inputCOMTraj_deq_[0].z[0] ) << " " // 7 + << filterprecision( inputCOMTraj_deq_[0].z[1] ) << " " // 8 + << filterprecision( inputCOMTraj_deq_[0].z[2] ) << " " // 9 + << filterprecision( inputCOMTraj_deq_[0].roll[0] ) << " " // 10 + << filterprecision( inputCOMTraj_deq_[0].roll[1] ) << " " // 11 + << filterprecision( inputCOMTraj_deq_[0].roll[2] ) << " " // 12 + << filterprecision( inputCOMTraj_deq_[0].pitch[0] ) << " "// 13 + << filterprecision( inputCOMTraj_deq_[0].pitch[1] ) << " "// 14 + << filterprecision( inputCOMTraj_deq_[0].pitch[2] ) << " "// 15 + << filterprecision( inputCOMTraj_deq_[0].yaw[0] ) << " " // 16 + << filterprecision( inputCOMTraj_deq_[0].yaw[1] ) << " " // 17 + << filterprecision( inputCOMTraj_deq_[0].yaw[2] ) << " " // 18 + + << filterprecision( inputZMPTraj_deq_[0].px ) << " " // 19 + << filterprecision( inputZMPTraj_deq_[0].py ) << " " // 20 + + << filterprecision( ZMPMB_vec_[0][0] ) << " " // 21 + << filterprecision( ZMPMB_vec_[0][1] ) << " " // 22 + + << filterprecision( inputLeftFootTraj_deq_[0].x ) << " " // 23 + << filterprecision( inputLeftFootTraj_deq_[0].y ) << " " // 24 + << filterprecision( inputLeftFootTraj_deq_[0].z ) << " " // 25 + << filterprecision( inputLeftFootTraj_deq_[0].theta ) << " " // 26 + << filterprecision( inputLeftFootTraj_deq_[0].omega ) << " " // 27 + << filterprecision( inputLeftFootTraj_deq_[0].dx ) << " " // 28 + << filterprecision( inputLeftFootTraj_deq_[0].dy ) << " " // 29 + << filterprecision( inputLeftFootTraj_deq_[0].dz ) << " " // 30 + << filterprecision( inputLeftFootTraj_deq_[0].dtheta ) << " " // 31 + << filterprecision( inputLeftFootTraj_deq_[0].domega ) << " " // 32 + << filterprecision( inputLeftFootTraj_deq_[0].ddx ) << " " // 33 + << filterprecision( inputLeftFootTraj_deq_[0].ddy ) << " " // 34 + << filterprecision( inputLeftFootTraj_deq_[0].ddz ) << " " // 35 + << filterprecision( inputLeftFootTraj_deq_[0].ddtheta ) << " " // 36 + << filterprecision( inputLeftFootTraj_deq_[0].ddomega ) << " " // 37 + + << filterprecision( inputRightFootTraj_deq_[0].x ) << " " // 38 + << filterprecision( inputRightFootTraj_deq_[0].y ) << " " // 39 + << filterprecision( inputRightFootTraj_deq_[0].z ) << " " // 40 + << filterprecision( inputRightFootTraj_deq_[0].theta ) << " " // 41 + << filterprecision( inputRightFootTraj_deq_[0].omega ) << " " // 42 + << filterprecision( inputRightFootTraj_deq_[0].dx ) << " " // 43 + << filterprecision( inputRightFootTraj_deq_[0].dy ) << " " // 44 + << filterprecision( inputRightFootTraj_deq_[0].dz ) << " " // 45 + << filterprecision( inputRightFootTraj_deq_[0].dtheta ) << " " // 46 + << filterprecision( inputRightFootTraj_deq_[0].domega ) << " " // 47 + << filterprecision( inputRightFootTraj_deq_[0].ddx ) << " " // 48 + << filterprecision( inputRightFootTraj_deq_[0].ddy ) << " " // 49 + << filterprecision( inputRightFootTraj_deq_[0].ddz ) << " " // 50 + << filterprecision( inputRightFootTraj_deq_[0].ddtheta ) << " "// 51 + << filterprecision( inputRightFootTraj_deq_[0].ddomega ) << " ";// 52 + + for(unsigned int j = 0 ; j < previousConfiguration_.size() ; j++ ) + aof << filterprecision( previousConfiguration_(j) ) << " " ; + for(unsigned int j = 0 ; j < previousVelocity_.size() ; j++ ) + aof << filterprecision( previousVelocity_(j) ) << " " ; + for(unsigned int j = 0 ; j < previousAcceleration_.size() ; j++ ) + aof << filterprecision( accelerationTraj_[0](j) ) << " " ; + + aof << filterprecision( outputDeltaCOMTraj_deq_[0].x[0] ) << " " + << filterprecision( outputDeltaCOMTraj_deq_[0].x[1] ) << " " + << filterprecision( outputDeltaCOMTraj_deq_[0].x[2] ) << " " + << filterprecision( outputDeltaCOMTraj_deq_[0].y[0] ) << " " + << filterprecision( outputDeltaCOMTraj_deq_[0].y[1] ) << " " + << filterprecision( outputDeltaCOMTraj_deq_[0].y[2] ) << " "; + + aof << endl ; aof.close(); ++iteration; - static double ecartmaxX = 0 ; - static double ecartmaxY = 0 ; - for (unsigned int i = 0 ; i < deltaZMP_deq_.size() ; i++ ) - { - if ( abs(deltaZMP_deq_[i].px) > ecartmaxX ) - ecartmaxX = abs(deltaZMP_deq_[i].px) ; - if ( abs(deltaZMP_deq_[i].py) > ecartmaxY ) - ecartmaxY = abs(deltaZMP_deq_[i].py) ; - } - return ; } @@ -446,8 +441,7 @@ void DynamicFilter::printBuffers(deque<COMState> & inputCOMTraj_deq_, deque<ZMPPosition> inputZMPTraj_deq_, deque<FootAbsolutePosition> & inputLeftFootTraj_deq_, deque<FootAbsolutePosition> & inputRightFootTraj_deq_, - deque<COMState> & outputDeltaCOMTraj_deq_ - ) + deque<COMState> & outputDeltaCOMTraj_deq_) { // Debug Purpose // ------------- @@ -527,10 +521,6 @@ void DynamicFilter::printBuffers(deque<COMState> & inputCOMTraj_deq_, << filterprecision( inputRightFootTraj_deq_[i].ddtheta ) << " " // 49 << filterprecision( inputRightFootTraj_deq_[i].ddomega ) << " ";// 50 - // << filterprecision( ZMPMB_vec_[i][0] ) << " " // 21 - // << filterprecision( ZMPMB_vec_[i][1] ) << " " // 22 - - for(unsigned int j = 0 ; j < configurationTraj_[i].size() ; j++ ) aof << filterprecision( configurationTraj_[i](j) ) << " " ; for(unsigned int j = 0 ; j < velocityTraj_[i].size() ; j++ ) @@ -538,11 +528,62 @@ void DynamicFilter::printBuffers(deque<COMState> & inputCOMTraj_deq_, for(unsigned int j = 0 ; j < accelerationTraj_[i].size() ; j++ ) aof << filterprecision( accelerationTraj_[i](j) ) << " " ; + aof << filterprecision( ZMPMB_vec_[i][0] ) << " " // 159 + << filterprecision( ZMPMB_vec_[i][1] ) << " "; // 160 + + aof << filterprecision( deltaZMP_deq_[i].px ) << " " // 161 + << filterprecision( deltaZMP_deq_[i].py ) << " "; // 162 + + aof << endl ; } aof.close(); + static double maxErrX = 0 ; + static double maxErrY = 0 ; + for (unsigned int i = 0 ; i < deltaZMP_deq_.size() ; ++i ) + { + if ( deltaZMP_deq_[i].px > maxErrX ) + { + maxErrX = deltaZMP_deq_[i].px ; + } + if ( deltaZMP_deq_[i].py > maxErrY ) + { + maxErrY = deltaZMP_deq_[i].py ; + } + } + + static double moyErrX = 0 ; + static double moyErrY = 0 ; + static double sumErrX = 0 ; + static double sumErrY = 0 ; + static int nbRNEAcomputed = 0 ; + for (unsigned int i = 0 ; i < deltaZMP_deq_.size(); ++i) + { + sumErrX += deltaZMP_deq_[i].px ; + sumErrY += deltaZMP_deq_[i].py ; + } + nbRNEAcomputed += deltaZMP_deq_.size() ; + moyErrX = sumErrX / nbRNEAcomputed ; + moyErrY = sumErrY / nbRNEAcomputed ; + + aFileName = "TestMorisawa2007OnLine32MoyNoisyZMP.dat" ; + if(iteration==0){ + aof.open(aFileName.c_str(),ofstream::out); + aof.close(); + } + aof.open(aFileName.c_str(),ofstream::app); + aof.precision(8); + aof.setf(ios::scientific, ios::floatfield); + aof << filterprecision(moyErrX ) << " " // 1 + << filterprecision(moyErrY ) << " " // 2 + << filterprecision(maxErrX ) << " " // 3 + << filterprecision(maxErrY ) << " " // 4 + << endl ; + aof.close(); + + ++iteration; return ; } diff --git a/src/ZMPRefTrajectoryGeneration/DynamicFilter.hh b/src/ZMPRefTrajectoryGeneration/DynamicFilter.hh index 0df47c46..6f87f7d7 100644 --- a/src/ZMPRefTrajectoryGeneration/DynamicFilter.hh +++ b/src/ZMPRefTrajectoryGeneration/DynamicFilter.hh @@ -29,6 +29,9 @@ namespace PatternGeneratorJRL ~DynamicFilter(); /// \brief int filter( + COMState & lastCtrlCoMState, + FootAbsolutePosition & lastCtrlLeftFoot, + FootAbsolutePosition & lastCtrlRightFoot, deque<COMState> & inputCOMTraj_deq_, deque<ZMPPosition> inputZMPTraj_deq_, deque<FootAbsolutePosition> & inputLeftFootTraj_deq_, @@ -45,37 +48,60 @@ namespace PatternGeneratorJRL double CoMHeight ); + /// \brief atomic function + void InverseKinematics( + COMState & inputCoMState, + FootAbsolutePosition & inputLeftFoot, + FootAbsolutePosition & inputRightFoot, + MAL_VECTOR_TYPE(double)& configuration, + MAL_VECTOR_TYPE(double)& velocity, + MAL_VECTOR_TYPE(double)& acceleration, + double samplingPeriod, + int stage); + + /// \brief atomic function + void ComputeZMPMB( + MAL_VECTOR_TYPE(double)& configuration, + MAL_VECTOR_TYPE(double)& velocity, + MAL_VECTOR_TYPE(double)& acceleration, + vector<double> & ZMPMB); + private: // Private methods - // \brief calculate, from the CoM computed by the preview control, - // the corresponding articular position, velocity and acceleration + /// \brief calculate, from the CoM computed by the preview control, + /// the corresponding articular position, velocity and acceleration void InverseKinematics( + COMState & lastCtrlCoMState, + FootAbsolutePosition & lastCtrlLeftFoot, + FootAbsolutePosition & lastCtrlRightFoot, deque<COMState> & inputCOMTraj_deq_, deque<FootAbsolutePosition> & inputLeftFootTraj_deq_, - deque<FootAbsolutePosition> & inputRightFootTraj_deq_ - ); + deque<FootAbsolutePosition> & inputRightFootTraj_deq_); - // Apply the RNEA on the robot model - void InverseDynamics(deque<ZMPPosition> inputZMPTraj_deq_); + /// \brief Apply the RNEA on the robot model and over the whole trajectory + /// given by the function "filter" + void InverseDynamics(deque<ZMPPosition> inputZMPTraj_deq); - /// Preview control on the ZMPMBs computed - /// -------------------------------------- + /// \brief Preview control on the ZMPMBs computed int OptimalControl(std::deque<COMState> & outputDeltaCOMTraj_deq_); + // ------------------------------------------------------------------- + + /// \brief Debug function void printAlongTime(deque<COMState> & inputCOMTraj_deq_, deque<ZMPPosition> inputZMPTraj_deq_, deque<FootAbsolutePosition> & inputLeftFootTraj_deq_, deque<FootAbsolutePosition> & inputRightFootTraj_deq_, deque<COMState> & outputDeltaCOMTraj_deq_ ); - + /// \brief Debug function void printBuffers(deque<COMState> & inputCOMTraj_deq_, deque<ZMPPosition> inputZMPTraj_deq_, deque<FootAbsolutePosition> & inputLeftFootTraj_deq_, deque<FootAbsolutePosition> & inputRightFootTraj_deq_, deque<COMState> & outputDeltaCOMTraj_deq_ ); - + /// \brief Debug function double filterprecision(double adb); @@ -98,7 +124,7 @@ namespace PatternGeneratorJRL { previewWindowSize_ = previewWindowSize; } /// \brief getter : - inline ComAndFootRealization * getComAndFootRealization() + inline ComAndFootRealizationByGeometry * getComAndFootRealization() { return comAndFootRealization_;}; inline double getCurrentTime() diff --git a/src/ZMPRefTrajectoryGeneration/ZMPVelocityReferencedQP.cpp b/src/ZMPRefTrajectoryGeneration/ZMPVelocityReferencedQP.cpp index f6aba5d0..36583b43 100644 --- a/src/ZMPRefTrajectoryGeneration/ZMPVelocityReferencedQP.cpp +++ b/src/ZMPRefTrajectoryGeneration/ZMPVelocityReferencedQP.cpp @@ -555,8 +555,15 @@ void // DYNAMIC FILTER // -------------- //DynamicFilter( time, tmp ); - dynamicFilter_->filter(COMTraj_deq_,ZMPTraj_deq_,LeftFootTraj_deq_, - RightFootTraj_deq_,deltaCOMTraj_deq_); + dynamicFilter_->filter( + FinalCOMTraj_deq.back(), + FinalLeftFootTraj_deq.back(), + FinalRightFootTraj_deq.back(), + COMTraj_deq_, + ZMPTraj_deq_, + LeftFootTraj_deq_, + RightFootTraj_deq_, + deltaCOMTraj_deq_); for (unsigned int i = 0 ; i < deltaCOMTraj_deq_.size() ; ++i ) diff --git a/tests/TestMorisawa2007.cpp b/tests/TestMorisawa2007.cpp index da442ba6..b9ff8494 100644 --- a/tests/TestMorisawa2007.cpp +++ b/tests/TestMorisawa2007.cpp @@ -27,26 +27,8 @@ #include "CommonTools.hh" #include "TestObject.hh" - #include <hrp2-dynamics/hrp2OptHumanoidDynamicRobot.h> -#include <MotionGeneration/ComAndFootRealizationByGeometry.hh> -#include <metapod/models/hrp2_14/hrp2_14.hh> -#ifndef METAPOD_INCLUDES -#define METAPOD_INCLUDES -// metapod includes -#include <metapod/tools/print.hh> -#include <metapod/tools/initconf.hh> -#include <metapod/algos/rnea.hh> -#include <Eigen/StdVector> -#endif - -#ifndef METAPOD_TYPEDEF2 -#define METAPOD_TYPEDEF2 -typedef double LocalFloatType2; -typedef metapod::Spatial::ForceTpl<LocalFloatType2> Force2; -typedef metapod::hrp2_14<LocalFloatType2> Robot_Model2; -typedef metapod::Nodes< Robot_Model2, Robot_Model2::BODY >::type Node2; -#endif +#include <ZMPRefTrajectoryGeneration/DynamicFilter.hh> using namespace::PatternGeneratorJRL; using namespace::PatternGeneratorJRL::TestSuite; @@ -84,35 +66,40 @@ private: double m_deltatime; // buffer to save all the zmps positions - vector< vector<double> > errZMP_ ; - Robot_Model2 robot_ ; - ComAndFootRealization * ComAndFootRealization_; - SimplePluginManager * SPM ; - double dInitX, dInitY; + vector< vector<double> > deltaZMP_vec ; + vector< vector<double> > ZMPMB_vec ; + SimplePluginManager * SPM_ ; + DynamicFilter* dynamicfilter_; + double dInitX_, dInitY_; int iteration,iteration_zmp ; bool once ; + double samplingPeriod_; public: TestMorisawa2007(int argc, char*argv[], string &aString, int TestProfile): - TestObject(argc, argv, aString) + TestObject(argc, argv, aString) { m_TestProfile = TestProfile; m_TestChangeFoot = true; m_NbStepsModified = 0; m_deltatime = 0; - ComAndFootRealization_ = 0 ; - dInitX = 0 ; - dInitY = 0 ; + SPM_ = NULL ; + dynamicfilter_ = NULL ; + dInitX_ = 0 ; + dInitY_ = 0 ; iteration_zmp = 0 ; iteration = 0 ; once = true ; + ZMPMB_vec.resize(2); + deltaZMP_vec.clear(); + samplingPeriod_ = 0.005 ; }; ~TestMorisawa2007() { - delete ComAndFootRealization_ ; - delete SPM ; + delete dynamicfilter_ ; + delete SPM_ ; } bool doTest(ostream &os) @@ -149,30 +136,30 @@ public: if (m_PGIInterface==0) { ok = m_PGI->RunOneStepOfTheControlLoop(m_CurrentConfiguration, - m_CurrentVelocity, - m_CurrentAcceleration, - m_OneStep.ZMPTarget, - m_OneStep.finalCOMPosition, - m_OneStep.LeftFootPosition, - m_OneStep.RightFootPosition); + m_CurrentVelocity, + m_CurrentAcceleration, + m_OneStep.ZMPTarget, + m_OneStep.finalCOMPosition, + m_OneStep.LeftFootPosition, + m_OneStep.RightFootPosition); } else if (m_PGIInterface==1) { ok = m_PGI->RunOneStepOfTheControlLoop( m_CurrentConfiguration, - m_CurrentVelocity, - m_CurrentAcceleration, - m_OneStep.ZMPTarget); + m_CurrentVelocity, + m_CurrentAcceleration, + m_OneStep.ZMPTarget); } - m_OneStep.NbOfIt++; + m_OneStep.NbOfIt++; - m_clock.stopOneIteration(); + m_clock.stopOneIteration(); - m_PreviousConfiguration = m_CurrentConfiguration; - m_PreviousVelocity = m_CurrentVelocity; - m_PreviousAcceleration = m_CurrentAcceleration; + m_PreviousConfiguration = m_CurrentConfiguration; + m_PreviousVelocity = m_CurrentVelocity; + m_PreviousAcceleration = m_CurrentAcceleration; /*! Call the reimplemented method to generate events. */ - if (ok) + if (ok) { m_clock.startModification(); generateEvent(); @@ -182,10 +169,9 @@ public: /*! Fill the debug files with appropriate information. */ ComparingZMPs(); - ComputeAndDisplayAverageError(false); fillInDebugFiles(); } - else + else { cerr << "Nothing to dump after " << m_OneStep.NbOfIt << endl; } @@ -234,16 +220,10 @@ public: MAL_VECTOR_RESIZE(m_PreviousVelocity, m_HDR->numberDof()); MAL_VECTOR_RESIZE(m_PreviousAcceleration, m_HDR->numberDof()); - SPM = new SimplePluginManager(); - - ComAndFootRealization_ = new ComAndFootRealizationByGeometry( (PatternGeneratorInterfacePrivate*) SPM ); - ComAndFootRealization_->setHumanoidDynamicRobot(m_HDR); - ComAndFootRealization_->SetStepStackHandler(new StepStackHandler(SPM)); - ComAndFootRealization_->SetHeightOfTheCoM(0.814); - ComAndFootRealization_->setSamplingPeriod(0.005); - ComAndFootRealization_->Initialization(); - - initIK(); + SPM_ = new SimplePluginManager(); + dynamicfilter_ = new DynamicFilter(SPM_,m_HDR); + dynamicfilter_->init(0.0,samplingPeriod_,samplingPeriod_,samplingPeriod_,samplingPeriod_,0.814); + initIK(); } protected: @@ -275,14 +255,17 @@ protected: lStartingCOMState(0) = m_OneStep.finalCOMPosition.x[0] ; lStartingCOMState(1) = m_OneStep.finalCOMPosition.y[0] ; lStartingCOMState(2) = m_OneStep.finalCOMPosition.z[0] ; - ComAndFootRealization_->SetHeightOfTheCoM(0.814); - ComAndFootRealization_->setSamplingPeriod(0.005); - ComAndFootRealization_->Initialization(); - - ComAndFootRealization_->InitializationCoM(BodyAngles,lStartingCOMState, - waist, - m_OneStep.LeftFootPosition, m_OneStep.RightFootPosition); - ComAndFootRealization_->Initialization(); + ComAndFootRealizationByGeometry * CaFR = dynamicfilter_->getComAndFootRealization() ; + CaFR->SetHeightOfTheCoM(0.814); + CaFR->setSamplingPeriod(samplingPeriod_); + CaFR->SetStepStackHandler(new StepStackHandler(SPM_)); + CaFR->Initialization(); + CaFR->InitializationCoM(BodyAngles,lStartingCOMState, + waist, m_OneStep.LeftFootPosition, + m_OneStep.RightFootPosition); + CaFR->Initialization(); + CaFR->SetPreviousConfigurationStage0(m_HDR->currentConfiguration()); + CaFR->SetPreviousVelocityStage0(m_HDR->currentVelocity()); } void fillInDebugFiles( ) @@ -296,7 +279,7 @@ protected: aof.open(aFileName.c_str(),ofstream::app); aof.precision(8); aof.setf(ios::scientific, ios::floatfield); - aof << filterprecision(m_OneStep.NbOfIt*0.005 ) << " " // 1 + aof << filterprecision(m_OneStep.NbOfIt*samplingPeriod_ ) << " " // 1 << filterprecision(m_OneStep.finalCOMPosition.x[0] ) << " " // 2 << filterprecision(m_OneStep.finalCOMPosition.y[0] ) << " " // 3 << filterprecision(m_OneStep.finalCOMPosition.z[0] ) << " " // 4 @@ -327,7 +310,7 @@ protected: << 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.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)) - @@ -409,10 +392,13 @@ protected: void ComparingZMPs() { - const int stage0 = 0 ; - /// \brief calculate, from the CoM of computed by the preview control, - /// the corresponding articular position, velocity and acceleration - /// ------------------------------------------------------------------ + // Debug Purpose + // ------------- + ofstream aof; + string aFileName; + ostringstream oss(std::ostringstream::ate); + static int iteration = 0; + MAL_VECTOR(CurrentConfiguration,double); MAL_VECTOR(CurrentVelocity,double); MAL_VECTOR(CurrentAcceleration,double); @@ -421,172 +407,170 @@ protected: MAL_VECTOR_RESIZE(CurrentVelocity, m_HDR->numberDof()); MAL_VECTOR_RESIZE(CurrentAcceleration, m_HDR->numberDof()); - MAL_VECTOR_DIM(aCOMState,double,6); - MAL_VECTOR_DIM(aCOMSpeed,double,6); - MAL_VECTOR_DIM(aCOMAcc,double,6); - MAL_VECTOR_DIM(aLeftFootPosition,double,5); - MAL_VECTOR_DIM(aRightFootPosition,double,5); - - aCOMState(0) = m_OneStep.finalCOMPosition.x[0]; aCOMSpeed(0) = m_OneStep.finalCOMPosition.x[1]; aCOMAcc(0) = m_OneStep.finalCOMPosition.x[2]; - aCOMState(1) = m_OneStep.finalCOMPosition.y[0]; aCOMSpeed(1) = m_OneStep.finalCOMPosition.y[1]; aCOMAcc(1) = m_OneStep.finalCOMPosition.y[2]; - aCOMState(2) = m_OneStep.finalCOMPosition.z[0]; aCOMSpeed(2) = m_OneStep.finalCOMPosition.z[1]; aCOMAcc(2) = m_OneStep.finalCOMPosition.z[2]; - aCOMState(3) = m_OneStep.finalCOMPosition.roll[0]; aCOMSpeed(3) = m_OneStep.finalCOMPosition.roll[1]; aCOMAcc(3) = m_OneStep.finalCOMPosition.roll[2]; - aCOMState(4) = m_OneStep.finalCOMPosition.pitch[0]; aCOMSpeed(4) = m_OneStep.finalCOMPosition.pitch[1]; aCOMAcc(4) = m_OneStep.finalCOMPosition.pitch[2]; - aCOMState(5) = m_OneStep.finalCOMPosition.yaw[0]; aCOMSpeed(5) = m_OneStep.finalCOMPosition.yaw[1]; aCOMAcc(5) = m_OneStep.finalCOMPosition.yaw[2]; - - aLeftFootPosition(0) = m_OneStep.LeftFootPosition.x; aRightFootPosition(0) = m_OneStep.RightFootPosition.x; - aLeftFootPosition(1) = m_OneStep.LeftFootPosition.y; aRightFootPosition(1) = m_OneStep.RightFootPosition.y; - aLeftFootPosition(2) = m_OneStep.LeftFootPosition.z; aRightFootPosition(2) = m_OneStep.RightFootPosition.z; - aLeftFootPosition(3) = m_OneStep.LeftFootPosition.theta; aRightFootPosition(3) = m_OneStep.RightFootPosition.theta; - aLeftFootPosition(4) = m_OneStep.LeftFootPosition.omega; aRightFootPosition(4) = m_OneStep.RightFootPosition.omega; - ComAndFootRealization_->setSamplingPeriod(0.005); - ComAndFootRealization_->ComputePostureForGivenCoMAndFeetPosture(aCOMState, aCOMSpeed, aCOMAcc, - aLeftFootPosition, - aRightFootPosition, - CurrentConfiguration, - CurrentVelocity, - CurrentAcceleration, - m_OneStep.NbOfIt, - stage0); - - /// \brief Debug Purpose - /// -------------------- - ofstream aof; - string aFileName; - ostringstream oss(std::ostringstream::ate); - oss.str("TestHerdt2010DynamicART2.dat"); - aFileName = oss.str(); - if ( iteration_zmp == 0 ) - { - aof.open(aFileName.c_str(),ofstream::out); - aof.close(); - } - ///---- - aof.open(aFileName.c_str(),ofstream::app); - aof.precision(8); - aof.setf(ios::scientific, ios::floatfield); - for (unsigned int j = 0 ; j < CurrentConfiguration.size() ; ++j) - { - aof << filterprecision(CurrentConfiguration(j)) << " " ; - } - for (unsigned int j = 0 ; j < CurrentVelocity.size() ; ++j) - { - aof << filterprecision(CurrentVelocity(j)) << " " ; - } - for (unsigned int j = 0 ; j < CurrentAcceleration.size() ; ++j) - { - aof << filterprecision(CurrentAcceleration(j)) << " " ; - } - aof << endl ; - - - /// \brief rnea, calculation of the multi body ZMP - /// ---------------------------------------------- - Robot_Model2::confVector q, dq, ddq; - for(unsigned int j = 0 ; j < CurrentConfiguration.size() ; j++ ) - { - q(j,0) = CurrentConfiguration[j] ; - dq(j,0) = CurrentVelocity[j] ; - ddq(j,0) = CurrentAcceleration[j] ; - } - metapod::rnea< Robot_Model2, true >::run(robot_, q, dq, ddq); - - Node2 anode = boost::fusion::at_c<Robot_Model2::BODY>(robot_.nodes); - Force2 aforce = anode.body.iX0.applyInv (anode.joint.f) ; - - double ZMPMB[2]; - - ZMPMB[0] = - aforce.n()[1] / aforce.f()[2] ; - ZMPMB[1] = aforce.n()[0] / aforce.f()[2] ; + dynamicfilter_->InverseKinematics( + m_OneStep.finalCOMPosition,m_OneStep.LeftFootPosition,m_OneStep.RightFootPosition, + CurrentConfiguration,CurrentVelocity,CurrentAcceleration,samplingPeriod_,iteration); + vector<double> dZMPtmp (2); + vector<double> ZMPMBtmp (2); + dynamicfilter_->ComputeZMPMB(CurrentConfiguration,CurrentVelocity,CurrentAcceleration,ZMPMBtmp); if (m_OneStep.NbOfIt<=10){ - dInitX = m_OneStep.ZMPTarget(0) - ZMPMB[0] ; - dInitY = m_OneStep.ZMPTarget(1) - ZMPMB[1] ; - { - vector<double> tmp_zmp(2) ; - tmp_zmp[0] =0.0 ; - tmp_zmp[1] =0.0 ; - errZMP_.push_back(tmp_zmp); - } + dInitX_ = m_OneStep.ZMPTarget(0) - ZMPMBtmp[0] ; + dInitY_ = m_OneStep.ZMPTarget(1) - ZMPMBtmp[1] ; } - if (m_OneStep.NbOfIt >= 10) - { - double errx = sqrt( ( m_OneStep.ZMPTarget(0) - ZMPMB[0] - dInitX )*( m_OneStep.ZMPTarget(0) - ZMPMB[0] - dInitX ) ) ; - double erry = sqrt( ( m_OneStep.ZMPTarget(1) - ZMPMB[1] - dInitY )*( m_OneStep.ZMPTarget(1) - ZMPMB[1] - dInitY ) ) ; - { - vector<double> tmp_zmp(2) ; - tmp_zmp[0] = errx ; - tmp_zmp[1] = erry ; - errZMP_.push_back(tmp_zmp); - } - } + dZMPtmp[0] = m_OneStep.ZMPTarget(0) - ZMPMBtmp[0] - dInitX_ ; + dZMPtmp[1] = m_OneStep.ZMPTarget(1) - ZMPMBtmp[1] - dInitY_ ; + deltaZMP_vec.push_back(dZMPtmp); + ZMPMB_vec.push_back(ZMPMBtmp); - static double ecartmaxX = 0 ; - static double ecartmaxY = 0 ; - if ( abs(errZMP_.back()[0]) > ecartmaxX ) - ecartmaxX = abs(errZMP_.back()[0]) ; - if ( abs(errZMP_.back()[1]) > ecartmaxY ) - ecartmaxY = abs(errZMP_.back()[1]) ; -// cout << "ecartmaxX :" << ecartmaxX << endl ; -// cout << "ecartmaxY :" << ecartmaxY << endl ; + // -------------------- + oss.str("DynamicFilterAllVariablesFiltered.dat"); + aFileName = oss.str(); - // Writing of the two zmps and the error. - if (once) + if ( iteration == 0 ) { - aof.open("TestHerdt2010ErrorZMP.dat",ofstream::out); + aof.open(aFileName.c_str(),ofstream::out); aof.close(); - once = false ; } - aof.open("TestHerdt2010ErrorZMP.dat",ofstream::app); + ///---- + aof.open(aFileName.c_str(),ofstream::app); aof.precision(8); aof.setf(ios::scientific, ios::floatfield); - aof << filterprecision( iteration_zmp ) << " " // 1 - << filterprecision( ZMPMB[0] + dInitX ) << " " // 2 - << filterprecision( ZMPMB[1] + dInitY ) << " " // 3 - << filterprecision(m_OneStep.ZMPTarget(0) ) << " " // 4 - << filterprecision(m_OneStep.ZMPTarget(1) ) << " " // 5 - << endl ; + aof << filterprecision( iteration*samplingPeriod_ ) << " " // 0 + << filterprecision( m_OneStep.finalCOMPosition.x[0] ) << " " // 1 + << filterprecision( m_OneStep.finalCOMPosition.x[1] ) << " " // 2 + << filterprecision( m_OneStep.finalCOMPosition.x[2] ) << " " // 3 + << filterprecision( m_OneStep.finalCOMPosition.y[0] ) << " " // 4 + << filterprecision( m_OneStep.finalCOMPosition.y[1] ) << " " // 5 + << filterprecision( m_OneStep.finalCOMPosition.y[2] ) << " " // 6 + << filterprecision( m_OneStep.finalCOMPosition.z[0] ) << " " // 7 + << filterprecision( m_OneStep.finalCOMPosition.z[1] ) << " " // 8 + << filterprecision( m_OneStep.finalCOMPosition.z[2] ) << " " // 9 + << filterprecision( m_OneStep.finalCOMPosition.roll[0] ) << " " // 10 + << filterprecision( m_OneStep.finalCOMPosition.roll[1] ) << " " // 11 + << filterprecision( m_OneStep.finalCOMPosition.roll[2] ) << " " // 12 + << filterprecision( m_OneStep.finalCOMPosition.pitch[0] ) << " "// 13 + << filterprecision( m_OneStep.finalCOMPosition.pitch[1] ) << " "// 14 + << filterprecision( m_OneStep.finalCOMPosition.pitch[2] ) << " "// 15 + << filterprecision( m_OneStep.finalCOMPosition.yaw[0] ) << " " // 16 + << filterprecision( m_OneStep.finalCOMPosition.yaw[1] ) << " " // 17 + << filterprecision( m_OneStep.finalCOMPosition.yaw[2] ) << " " // 18 + + << filterprecision( m_OneStep.ZMPTarget[0] ) << " " // 19 + << filterprecision( m_OneStep.ZMPTarget[1] ) << " " // 20 + + << filterprecision( m_OneStep.LeftFootPosition.x ) << " " // 21 + << filterprecision( m_OneStep.LeftFootPosition.y ) << " " // 22 + << filterprecision( m_OneStep.LeftFootPosition.z ) << " " // 23 + << filterprecision( m_OneStep.LeftFootPosition.theta ) << " " // 24 + << filterprecision( m_OneStep.LeftFootPosition.omega ) << " " // 25 + << filterprecision( m_OneStep.LeftFootPosition.dx ) << " " // 26 + << filterprecision( m_OneStep.LeftFootPosition.dy ) << " " // 27 + << filterprecision( m_OneStep.LeftFootPosition.dz ) << " " // 28 + << filterprecision( m_OneStep.LeftFootPosition.dtheta ) << " " // 29 + << filterprecision( m_OneStep.LeftFootPosition.domega ) << " " // 30 + << filterprecision( m_OneStep.LeftFootPosition.ddx ) << " " // 31 + << filterprecision( m_OneStep.LeftFootPosition.ddy ) << " " // 32 + << filterprecision( m_OneStep.LeftFootPosition.ddz ) << " " // 33 + << filterprecision( m_OneStep.LeftFootPosition.ddtheta ) << " " // 34 + << filterprecision( m_OneStep.LeftFootPosition.ddomega ) << " " // 35 + + << filterprecision( m_OneStep.RightFootPosition.x ) << " " // 36 + << filterprecision( m_OneStep.RightFootPosition.y ) << " " // 37 + << filterprecision( m_OneStep.RightFootPosition.z ) << " " // 38 + << filterprecision( m_OneStep.RightFootPosition.theta ) << " " // 39 + << filterprecision( m_OneStep.RightFootPosition.omega ) << " " // 40 + << filterprecision( m_OneStep.RightFootPosition.dx ) << " " // 41 + << filterprecision( m_OneStep.RightFootPosition.dy ) << " " // 42 + << filterprecision( m_OneStep.RightFootPosition.dz ) << " " // 43 + << filterprecision( m_OneStep.RightFootPosition.dtheta ) << " " // 44 + << filterprecision( m_OneStep.RightFootPosition.domega ) << " " // 45 + << filterprecision( m_OneStep.RightFootPosition.ddx ) << " " // 46 + << filterprecision( m_OneStep.RightFootPosition.ddy ) << " " // 47 + << filterprecision( m_OneStep.RightFootPosition.ddz ) << " " // 48 + << filterprecision( m_OneStep.RightFootPosition.ddtheta ) << " " // 49 + << filterprecision( m_OneStep.RightFootPosition.ddomega ) << " ";// 50 + + for(unsigned int j = 0 ; j < CurrentConfiguration.size() ; j++ ) + aof << filterprecision( CurrentConfiguration(j) ) << " " ; + for(unsigned int j = 0 ; j < CurrentVelocity.size() ; j++ ) + aof << filterprecision( CurrentVelocity(j) ) << " " ; + for(unsigned int j = 0 ; j < CurrentAcceleration.size() ; j++ ) + aof << filterprecision( CurrentAcceleration(j) ) << " " ; + + aof << filterprecision( ZMPMB_vec.back()[0] ) << " " // 159 + << filterprecision( ZMPMB_vec.back()[1] ) << " "; // 160 + + aof << filterprecision( deltaZMP_vec.back()[0] ) << " " // 161 + << filterprecision( deltaZMP_vec.back()[1] ) << " "; // 162 + + + aof << endl ; + aof.close(); - iteration_zmp++; + ++iteration; return ; } void ComputeAndDisplayAverageError(bool display){ static int plot_it = 0 ; - double moyErrX = 0 ; - double moyErrY = 0 ; - for (unsigned int i = 0 ; i < errZMP_.size(); ++i) + + static double maxErrX = 0 ; + static double maxErrY = 0 ; + for (unsigned int i = 0 ; i < deltaZMP_vec.size() ; ++i ) + { + if ( abs(deltaZMP_vec[i][0]) > maxErrX ) + { + maxErrX = abs(deltaZMP_vec[i][0]) ; + } + if ( abs(deltaZMP_vec[i][1]) > maxErrY ) + { + maxErrY = abs(deltaZMP_vec[i][1]) ; + } + } + + static double moyErrX = 0 ; + static double moyErrY = 0 ; + static double sumErrX = 0 ; + static double sumErrY = 0 ; + for (unsigned int i = 0 ; i < deltaZMP_vec.size(); ++i) { - moyErrX += errZMP_[i][0] ; - moyErrY += errZMP_[i][1] ; + sumErrX += abs(deltaZMP_vec[i][0]) ; + sumErrY += abs(deltaZMP_vec[i][1]) ; } - moyErrX = moyErrX / errZMP_.size() ; - moyErrY = moyErrY / errZMP_.size() ; - if ( display ) + moyErrX = sumErrX / deltaZMP_vec.size() ; + moyErrY = sumErrY / deltaZMP_vec.size() ; + + if(display) { - cout << "moyErrX = " << moyErrX << endl - << "moyErrY = " << moyErrY << endl ; + cout << "moyErrX = " << moyErrX ; + cout << "moyErrY = " << moyErrY ; + cout << "maxErrX = " << maxErrX ; + cout << "maxErrY = " << maxErrY ; } + ofstream aof; - string aFileName; - aFileName = m_TestName; - aFileName += "MoyZMP.dat"; - if(plot_it==0){ + string aFileName; + aFileName = "TestMorisawa2007OnLine32MoyFilteredZMP.dat" ; + if(plot_it==0){ aof.open(aFileName.c_str(),ofstream::out); aof.close(); - } - aof.open(aFileName.c_str(),ofstream::app); - aof.precision(8); - aof.setf(ios::scientific, ios::floatfield); - aof << filterprecision(moyErrX ) << " " // 1 + } + aof.open(aFileName.c_str(),ofstream::app); + aof.precision(8); + aof.setf(ios::scientific, ios::floatfield); + aof << filterprecision(moyErrX ) << " " // 1 << filterprecision(moyErrY ) << " " // 2 + << filterprecision(maxErrX ) << " " // 3 + << filterprecision(maxErrY ) << " " // 4 << endl ; aof.close(); + plot_it++; } -- GitLab