diff --git a/src/ZMPRefTrajectoryGeneration/AnalyticalMorisawaCompact.cpp b/src/ZMPRefTrajectoryGeneration/AnalyticalMorisawaCompact.cpp index 9a53b81cdd2697225bb771c12b8fbc6edb9d86b7..c135903d3b0d6258956069d6be45675668ca6161 100644 --- a/src/ZMPRefTrajectoryGeneration/AnalyticalMorisawaCompact.cpp +++ b/src/ZMPRefTrajectoryGeneration/AnalyticalMorisawaCompact.cpp @@ -803,7 +803,7 @@ computing the analytical trajectories. */ static int iteration = 0; /// \brief Debug Purpose /// -------------------- - oss.str("ZMPDiscretisationBuffer.dat"); + oss.str("/home/mnaveau/Desktop/mehdi_data/walkstraight20cmperstep.dat"); aFileName = oss.str(); aof.open(aFileName.c_str(),ofstream::out); aof.close(); diff --git a/src/ZMPRefTrajectoryGeneration/OrientationsPreview.cpp b/src/ZMPRefTrajectoryGeneration/OrientationsPreview.cpp index f9c8f396d1eea5c94336148903fee2a4527bb62e..efd8302b4b51596f6766097971333b61a60e0474 100644 --- a/src/ZMPRefTrajectoryGeneration/OrientationsPreview.cpp +++ b/src/ZMPRefTrajectoryGeneration/OrientationsPreview.cpp @@ -62,9 +62,15 @@ OrientationsPreview::OrientationsPreview(CjrlHumanoidDynamicRobot *aHS) uLimitRightHipYaw_ = 45.0/180.0*M_PI; } + cout << "lLimitLeftHipYaw_ = " << lLimitLeftHipYaw_ * 180/M_PI << endl + << "uLimitLeftHipYaw_ = " << uLimitLeftHipYaw_ * 180/M_PI << endl + << "lLimitRightHipYaw_ = " << lLimitRightHipYaw_ * 180/M_PI << endl + << "uLimitRightHipYaw_ = " << uLimitRightHipYaw_ * 180/M_PI << endl ; uvLimitFoot_ = fabs(leftHip->upperVelocityBound(0)); + cout << "upper velocity Limit Foot_ = " << uvLimitFoot_ << endl ; + //Acceleration limit not given by HRP2JRLmain.wrl uaLimitHipYaw_ = 0.1; //Maximal cross angle between the feet diff --git a/src/ZMPRefTrajectoryGeneration/ZMPVelocityReferencedQP.cpp b/src/ZMPRefTrajectoryGeneration/ZMPVelocityReferencedQP.cpp index 64bdabc10ae829985a44593705c9a150687a2704..183d3912bb3c2d0e873d776b76bf072e1ea788dc 100644 --- a/src/ZMPRefTrajectoryGeneration/ZMPVelocityReferencedQP.cpp +++ b/src/ZMPRefTrajectoryGeneration/ZMPVelocityReferencedQP.cpp @@ -526,6 +526,31 @@ void } VRQPGenerator_->LastFootSol(Solution_); + +// Problem_.dump(MATRIX_Q,"/home/mnaveau/devel/Walking-Pattern-Generator-Prototype/tests/data/Q.dat"); +// Problem_.dump(VECTOR_D,"/home/mnaveau/devel/Walking-Pattern-Generator-Prototype/tests/data/P.dat"); +// +// Problem_.dump(MATRIX_DU,"/home/mnaveau/devel/Walking-Pattern-Generator-Prototype/tests/data/A.dat"); +// Problem_.dump(VECTOR_DS,"/home/mnaveau/devel/Walking-Pattern-Generator-Prototype/tests/data/lbA.dat"); +// +// Problem_.dump(VECTOR_XL,"/home/mnaveau/devel/Walking-Pattern-Generator-Prototype/tests/data/LB.dat"); +// Problem_.dump(VECTOR_XU,"/home/mnaveau/devel/Walking-Pattern-Generator-Prototype/tests/data/UB.dat"); +// +// Problem_.dump(MATRIX_Q,cout); +// Problem_.dump(VECTOR_D,cout); +// +// Problem_.dump(MATRIX_DU,cout); +// Problem_.dump(VECTOR_DS,cout); +// +// Problem_.dump(VECTOR_XL,cout); +// Problem_.dump(VECTOR_XU,cout); + + static int patate = 0 ; + if (patate == 50) + int stop = 0 ; + + ++patate; + // INITIALIZE INTERPOLATION: // ------------------------ CurrentIndex_ = FinalCOMTraj_deq.size(); @@ -613,8 +638,8 @@ void { filteredCoM[i].x[j] += outputDeltaCOMTraj_deq[i].x[j] ; filteredCoM[i].y[j] += outputDeltaCOMTraj_deq[i].y[j] ; - FinalCOMTraj_deq[i].x[j] += outputDeltaCOMTraj_deq[i].x[j] ; - FinalCOMTraj_deq[i].y[j] += outputDeltaCOMTraj_deq[i].y[j] ; + //FinalCOMTraj_deq[i].x[j] += outputDeltaCOMTraj_deq[i].x[j] ; + //FinalCOMTraj_deq[i].y[j] += outputDeltaCOMTraj_deq[i].y[j] ; } dynamicFilter_->ComputeZMPMB(m_SamplingPeriod, filteredCoM[i], FinalLeftFootTraj_deq[i], FinalRightFootTraj_deq[i], @@ -867,7 +892,48 @@ void } aof.close(); - + /// \brief Debug Purpose + /// -------------------- + oss.str("/home/mnaveau/devel/Walking-Pattern-Generator-Prototype/tests/data/walkSideward2m_s.dat"); + aFileName = oss.str(); + 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); + int nstep = Solution_.SupportStates_deq.back().StepNumber ; + for (unsigned int i = 0 ; i < QP_N_ ; ++i ) + { + aof << filterprecision( Solution_.Solution_vec[i] ) << " " ; // 1 + } + for (unsigned int i = 0 ; i < 2 ; ++i ) + { + if (i >= nstep) + { + aof << filterprecision( 0.0 ) << " " ; // 1 + }else{ + aof << filterprecision( Solution_.Solution_vec[2*QP_N_+i] ) << " " ; // 1 + } + } + for (unsigned int i = 0 ; i < QP_N_ ; ++i ) + { + aof << filterprecision( Solution_.Solution_vec[QP_N_+i] ) << " " ; // 1 + } + for (unsigned int i = 0 ; i < 2 ; ++i ) + { + if (i >= nstep) + { + aof << filterprecision( 0.0 ) << " " ; // 1 + }else{ + aof << filterprecision( Solution_.Solution_vec[2*QP_N_+nstep+i] ) << " " ; // 1 + } + } + aof << endl ; + aof.close(); diff --git a/src/ZMPRefTrajectoryGeneration/generator-vel-ref.cpp b/src/ZMPRefTrajectoryGeneration/generator-vel-ref.cpp index 38de469a59b1136bc1872fcb95935f2fb503e663..7a6f6d3107b80269923895902b7fef07ddf279e5 100644 --- a/src/ZMPRefTrajectoryGeneration/generator-vel-ref.cpp +++ b/src/ZMPRefTrajectoryGeneration/generator-vel-ref.cpp @@ -299,12 +299,12 @@ GeneratorVelRef::build_inequalities_cop(linear_inequality_t & Inequalities, { if( prwSS_it->StateChanged ){ RFI_->set_vertices( CoPHull, *prwSS_it, INEQ_COP ); - if( prwSS_it->Foot == LEFT ) - cout << "LEFT \n" ; - else - cout << "RIGHT \n" ; - for(unsigned int k = 0 ; k < CoPHull.X_vec.size() ; ++k) - cout << CoPHull.X_vec[k] << " " << CoPHull.Y_vec[k] << endl ; +// if( prwSS_it->Foot == LEFT ) +// cout << "LEFT \n" ; +// else +// cout << "RIGHT \n" ; +// for(unsigned int k = 0 ; k < CoPHull.X_vec.size() ; ++k) +// cout << CoPHull.X_vec[k] << " " << CoPHull.Y_vec[k] << endl ; } RFI_->compute_linear_system( CoPHull, *prwSS_it ); @@ -345,12 +345,12 @@ GeneratorVelRef::build_inequalities_feet( linear_inequality_t & Inequalities, RFI_->set_vertices( FeetHull, *prwSS_it, INEQ_FEET ); prwSS_it++; - if( prwSS_it->Foot == LEFT ) - cout << "LEFT \n" ; - else - cout << "RIGHT \n" ; - for(unsigned int k = 0 ; k < FeetHull.X_vec.size() ; ++k) - cout << FeetHull.X_vec[k] << " " << FeetHull.Y_vec[k] << endl ; +// if( prwSS_it->Foot == LEFT ) +// cout << "LEFT \n" ; +// else +// cout << "RIGHT \n" ; +// for(unsigned int k = 0 ; k < FeetHull.X_vec.size() ; ++k) +// cout << FeetHull.X_vec[k] << " " << FeetHull.Y_vec[k] << endl ; RFI_->compute_linear_system( FeetHull, *prwSS_it ); @@ -364,7 +364,7 @@ GeneratorVelRef::build_inequalities_feet( linear_inequality_t & Inequalities, prwSS_it++; } - cout << "############################################################\n"; + //cout << "############################################################\n"; } @@ -417,10 +417,10 @@ GeneratorVelRef::build_constraints_cop(const linear_inequality_t & IneqCoP, compute_term ( MM_, -1.0, IneqCoP.D.Y_mat, Robot_->DynamicsCoPJerk().U ); Pb.add_term_to( MATRIX_DU, MM_, NbConstraints, N_ ); - cout << "IneqCoP.D.X_mat = " << IneqCoP.D.X_mat << endl ; - cout << "Robot_->DynamicsCoPJerk().U = " << Robot_->DynamicsCoPJerk().U << endl ; - cout << "IneqCoP.D.Y_mat = " << IneqCoP.D.Y_mat << endl ; - cout << "Robot_->DynamicsCoPJerk().U = " << Robot_->DynamicsCoPJerk().U << endl ; +// cout << "IneqCoP.D.X_mat = " << IneqCoP.D.X_mat << endl ; +// cout << "Robot_->DynamicsCoPJerk().U = " << Robot_->DynamicsCoPJerk().U << endl ; +// cout << "IneqCoP.D.Y_mat = " << IneqCoP.D.Y_mat << endl ; +// cout << "Robot_->DynamicsCoPJerk().U = " << Robot_->DynamicsCoPJerk().U << endl ; // +D*V @@ -428,7 +428,7 @@ GeneratorVelRef::build_constraints_cop(const linear_inequality_t & IneqCoP, // + Robot_->LeftFoot().Dynamics(COP).U + Robot_->RightFoot().Dynamics(COP).U ); Pb.add_term_to( MATRIX_DU, MM_, NbConstraints, 2*N_ ); - cout << "IntermedData_->State().V = " << IntermedData_->State().V << endl ; +// cout << "IntermedData_->State().V = " << IntermedData_->State().V << endl ; compute_term ( MM_, 1.0, IneqCoP.D.Y_mat, IntermedData_->State().V ); // + Robot_->LeftFoot().Dynamics(COP).U + Robot_->RightFoot().Dynamics(COP).U ); Pb.add_term_to( MATRIX_DU, MM_, NbConstraints, 2*N_+NbStepsPreviewed ); @@ -706,6 +706,8 @@ GeneratorVelRef::update_problem( QPProblem & Pb, const std::deque<support_state_ compute_term ( MV_, -InstVel.weight, VelDynamics.UT, State.Ref.Global.Y_vec ); Pb.add_term_to( VECTOR_D, MV_, N_ ); + + // COP - centering terms const IntermedQPMat::objective_variant_t & COPCent = IntermedData_->Objective( COP_CENTERING ); const linear_dynamics_t & CoPDynamics = Robot_->DynamicsCoPJerk( ); @@ -737,7 +739,6 @@ GeneratorVelRef::update_problem( QPProblem & Pb, const std::deque<support_state_ Pb.add_term_to( VECTOR_D, MV_, 2*N_ ); compute_term ( MV_, COPCent.weight, State.VT, State.VcY ); Pb.add_term_to( VECTOR_D, MV_, 2*N_+nbStepsPreviewed ); - } diff --git a/tests/CommonTools.cpp b/tests/CommonTools.cpp index 51f0dd63c1a560b478aa9d6abaa653b4977b36f3..3c7e625cbbf09b7bd958a7f8c0c884c2f83cdf2a 100644 --- a/tests/CommonTools.cpp +++ b/tests/CommonTools.cpp @@ -59,8 +59,8 @@ namespace PatternGeneratorJRL { ":previewcontroltime 1.6", ":omega 0.0", ":stepheight 0.07", - ":singlesupporttime 1.56", - ":doublesupporttime 0.04", + ":singlesupporttime 0.78", + ":doublesupporttime 0.02", ":armparameters 0.5", ":LimitsFeasibility 0.0", ":ZMPShiftParameters 0.015 0.015 0.015 0.015", diff --git a/tests/TestHerdt2010DynamicFilter.cpp b/tests/TestHerdt2010DynamicFilter.cpp index ace4498025da2a89c655c4c61664c1d2b3b10556..6ac9212883984bce57ead7811cb7013708f7d2d6 100644 --- a/tests/TestHerdt2010DynamicFilter.cpp +++ b/tests/TestHerdt2010DynamicFilter.cpp @@ -269,11 +269,23 @@ protected: void fillInDebugFiles( ) { + static int cleanFiles = 0 ; + if (cleanFiles == 0){ + ofstream aof; + string aFileName; + string path = "/home/mnaveau/devel/Walking-Pattern-Generator-Prototype/tests/data/" ; + aFileName = path + m_TestName; + aFileName += "TestFGPI.dat"; + aof.open(aFileName.c_str(),ofstream::out); + aof.close(); + } + cleanFiles = 1 ; if (m_DebugFGPI) { ofstream aof; string aFileName; - aFileName = m_TestName; + string path = "/home/mnaveau/devel/Walking-Pattern-Generator-Prototype/tests/data/" ; + aFileName = path + m_TestName; aFileName += "TestFGPI.dat"; aof.open(aFileName.c_str(),ofstream::app); aof.precision(8); @@ -286,45 +298,37 @@ protected: << 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 - } - + << filterprecision(m_OneStep.finalCOMPosition.yaw[1] ) << " " // 9 + << filterprecision(m_OneStep.finalCOMPosition.x[2] ) << " " // 10 + << filterprecision(m_OneStep.finalCOMPosition.y[2] ) << " " // 11 + << filterprecision(m_OneStep.finalCOMPosition.z[2] ) << " " // 12 + << filterprecision(m_OneStep.finalCOMPosition.yaw[2] ) << " " // 13 + << filterprecision(m_OneStep.ZMPTarget(0) ) << " " // 14 + << filterprecision(m_OneStep.ZMPTarget(1) ) << " " // 15 + << filterprecision(m_OneStep.LeftFootPosition.x ) << " " // 16 + << filterprecision(m_OneStep.LeftFootPosition.y ) << " " // 17 + << filterprecision(m_OneStep.LeftFootPosition.z ) << " " // 18 + << filterprecision(m_OneStep.LeftFootPosition.dx ) << " " // 19 + << filterprecision(m_OneStep.LeftFootPosition.dy ) << " " // 20 + << filterprecision(m_OneStep.LeftFootPosition.dz ) << " " // 21 + << filterprecision(m_OneStep.LeftFootPosition.ddx ) << " " // 22 + << filterprecision(m_OneStep.LeftFootPosition.ddy ) << " " // 23 + << filterprecision(m_OneStep.LeftFootPosition.ddz ) << " " // 24 + << filterprecision(m_OneStep.LeftFootPosition.theta*M_PI/180 ) << " " // 25 + << filterprecision(m_OneStep.LeftFootPosition.omega ) << " " // 26 + << filterprecision(m_OneStep.LeftFootPosition.omega2 ) << " " // 27 + << filterprecision(m_OneStep.RightFootPosition.x ) << " " // 28 + << filterprecision(m_OneStep.RightFootPosition.y ) << " " // 29 + << filterprecision(m_OneStep.RightFootPosition.z ) << " " // 30 + << filterprecision(m_OneStep.RightFootPosition.dx ) << " " // 31 + << filterprecision(m_OneStep.RightFootPosition.dy ) << " " // 32 + << filterprecision(m_OneStep.RightFootPosition.dz ) << " " // 33 + << filterprecision(m_OneStep.RightFootPosition.ddx ) << " " // 34 + << filterprecision(m_OneStep.RightFootPosition.ddy ) << " " // 35 + << filterprecision(m_OneStep.RightFootPosition.ddz ) << " " // 36 + << filterprecision(m_OneStep.RightFootPosition.theta*M_PI/180 ) << " " // 37 + << filterprecision(m_OneStep.RightFootPosition.omega ) << " " // 38 + << filterprecision(m_OneStep.RightFootPosition.omega2 ) << " " ;// 39 aof << endl; aof.close(); } @@ -748,21 +752,12 @@ protected: localeventHandler_t Handler ; }; -#define localNbOfEvents 12 +#define localNbOfEvents 3 struct localEvent events [localNbOfEvents] = { - { 5*200,&TestHerdt2010::walkForward}, - {10*200,&TestHerdt2010::walkSidewards}, - {25*200,&TestHerdt2010::startTurningRightOnSpot}, - {35*200,&TestHerdt2010::walkForward}, - {45*200,&TestHerdt2010::startTurningLeftOnSpot}, - {55*200,&TestHerdt2010::walkForward}, - {65*200,&TestHerdt2010::startTurningRightOnSpot}, - {75*200,&TestHerdt2010::walkForward}, - {85*200,&TestHerdt2010::startTurningLeft}, - {95*200,&TestHerdt2010::startTurningRight}, - {105*200,&TestHerdt2010::stop}, - {110*200,&TestHerdt2010::stopOnLineWalking} + { 5*200,&TestHerdt2010::walkForward}, + {30*200,&TestHerdt2010::stop}, + {35*200,&TestHerdt2010::stopOnLineWalking} }; // Test when triggering event. @@ -778,12 +773,12 @@ protected: void generateEventEmergencyStop() { -#define localNbOfEventsEMS 5 +#define localNbOfEventsEMS 3 struct localEvent events [localNbOfEventsEMS] = - { {5*200,&TestHerdt2010::startTurningLeft2}, - {10*200,&TestHerdt2010::startTurningRight2}, - {15.2*200,&TestHerdt2010::stop}, - {20.8*200,&TestHerdt2010::stopOnLineWalking} + { + { 5*200,&TestHerdt2010::walkSidewards}, + {30*200,&TestHerdt2010::stop}, + {35*200,&TestHerdt2010::stopOnLineWalking} }; // Test when triggering event. diff --git a/tests/TestMorisawa2007.cpp b/tests/TestMorisawa2007.cpp index 55b0a36a8f49432d6693bdb86eff3bf18453898a..05b619d97761e94997887a78ffa27c897ac92bac 100644 --- a/tests/TestMorisawa2007.cpp +++ b/tests/TestMorisawa2007.cpp @@ -705,18 +705,49 @@ protected: { istringstream strm2(":stepstairseq\ 0.0 -0.105 0.0 0.0\ - 0.0 0.19 0.0 0.0\ - 0.0 -0.19 0.0 0.0\ - 0.0 0.19 0.0 0.0\ - 0.0 -0.19 0.0 0.0\ - 0.0 0.19 0.0 0.0\ - 0.0 -0.19 0.0 0.0\ - 0.0 0.19 0.0 0.0\ - 0.0 -0.19 0.0 0.0\ - 0.0 0.19 0.0 0.0\ - 0.0 -0.19 0.0 0.0\ + 0.2 0.19 0.0 0.0\ + 0.2 -0.19 0.0 0.0\ + 0.2 0.19 0.0 0.0\ + 0.2 -0.19 0.0 0.0\ + 0.2 0.19 0.0 0.0\ + 0.2 -0.19 0.0 0.0\ + 0.2 0.19 0.0 0.0\ + 0.2 -0.19 0.0 0.0\ + 0.2 0.19 0.0 0.0\ + 0.2 -0.19 0.0 0.0\ 0.0 0.19 0.0 0.0\ "); + +// istringstream strm2(":stepstairseq\ +// 0.0 -0.105 0.0 0.0\ +// 0.1 0.19 0.0 0.0\ +// 0.1 -0.19 0.0 0.0\ +// 0.1 0.19 0.0 0.0\ +// 0.1 -0.19 0.0 0.0\ +// 0.1 0.19 0.0 0.0\ +// 0.1 -0.19 0.0 0.0\ +// 0.1 0.19 0.0 0.0\ +// 0.1 -0.19 0.0 0.0\ +// 0.1 0.19 0.0 0.0\ +// 0.1 -0.19 0.0 0.0\ +// 0.0 0.19 0.0 0.0\ +// "); + +// istringstream strm2(":stepstairseq\ +// 0.0 -0.105 0.0 0.0\ +// 0.0 0.19 0.0 0.0\ +// 0.0 -0.19 0.0 0.0\ +// 0.0 0.19 0.0 0.0\ +// 0.0 -0.19 0.0 0.0\ +// 0.0 0.19 0.0 0.0\ +// 0.0 -0.19 0.0 0.0\ +// 0.0 0.19 0.0 0.0\ +// 0.0 -0.19 0.0 0.0\ +// 0.0 0.19 0.0 0.0\ +// 0.0 -0.19 0.0 0.0\ +// 0.0 0.19 0.0 0.0\ +// "); + aPGI.ParseCmd(strm2); }