Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Modules/BehaviorControl/GT2004BehaviorControl/GT2004BasicBehaviors/GT2004EvolutionBasicBehaviors.cpp

Go to the documentation of this file.
00001 /** 
00002 * @file GT2004EvolutionBasicBehaviors.cpp
00003 *
00004 * Implementation of basic behaviors defined in evolution-basic-behaviors.xml.
00005 *
00006 * @author Uwe Düffert
00007 */
00008 
00009 #include "Tools/Math/PIDsmoothedValue.h"
00010 #include "GT2004EvolutionBasicBehaviors.h"
00011 #include "Tools/Math/Geometry.h"
00012 #include "Tools/Math/Common.h"
00013 #include "Tools/Streams/OutStreams.h"
00014 
00015 #include "Tools/Debugging/Debugging.h"
00016 #include "Platform/GTAssert.h"
00017 
00018 void GT2004EvolutionBasicBehaviors::registerBasicBehaviors(Xabsl2Engine& engine)
00019 {
00020   engine.registerBasicBehavior(basicBehaviorEvolveOmniParameters);
00021   engine.registerBasicBehavior(basicBehaviorMeasureGT2004Parameters);
00022   engine.registerBasicBehavior(basicBehaviorMeasureGT2004ParametersBlind);
00023   engine.registerBasicBehavior(basicBehaviorSendCurrentGT2004ParametersAndChooseNext);
00024   engine.registerBasicBehavior(basicBehaviorNextGT2004ParametersToBeMeasured);
00025 }
00026 
00027 void GT2004BasicBehaviorEvolveOmniParameters::execute()
00028 {
00029   switch ((int)mode)
00030   {
00031   case 0: //walk parcour forward
00032     if (lastMode!=0) forwardTurningParcour.start();
00033     forwardTurningParcour.update(robotPose, robotState.acceleration, robotPose.getValidity()<0.5);
00034     motionRequest.motionType = MotionRequest::walk;
00035     motionRequest.walkRequest.walkType = WalkRequest::normal;
00036     motionRequest.walkRequest.walkParams=forwardTurningParcour.getMotionRequest();
00037     motionRequest.updateRP=false;
00038 /*
00039     if (lastMode!=0)
00040     {
00041       motionRequestX.resetTo(motionRequest.walkRequest.walkParams.translation.x); 
00042       motionRequestY.resetTo(motionRequest.walkRequest.walkParams.translation.y);
00043       motionRequestR.resetTo(motionRequest.walkRequest.walkParams.rotation);
00044     }
00045     else
00046     {
00047       motionRequestX.approximateVal(motionRequest.walkRequest.walkParams.translation.x); 
00048       motionRequestY.approximateVal(motionRequest.walkRequest.walkParams.translation.y);
00049       motionRequestR.approximateVal(motionRequest.walkRequest.walkParams.rotation);
00050     }
00051     motionRequest.walkRequest.walkParams.translation.x=motionRequestX.getVal();
00052     motionRequest.walkRequest.walkParams.translation.y=motionRequestY.getVal();
00053     motionRequest.walkRequest.walkParams.rotation=motionRequestR.getVal();
00054 */
00055     break;
00056   case 1: //walk parcour backward
00057     if (lastMode!=1)
00058     {
00059       if (evolutionMode!=0)
00060       {
00061         GT2004Parameters* param=bPopulation.getNextIndividualWithoutFitness();
00062         //send it to Motion:
00063         gt2004Parameters = *param;
00064         invKinWalkingParameters = gt2004Parameters;
00065         walkParameterTimeStamp=SystemCall::getCurrentSystemTime();
00066         //send it as DebugMessage too to notify RobotControl dialogs:
00067         OUTPUT(idInvKinWalkingParameters,bin,invKinWalkingParameters);
00068         OUTPUT(idGT2004Parameters,bin,gt2004Parameters);
00069       }
00070       simpleBackwardParcour.start();
00071     }
00072     simpleBackwardParcour.update(robotPose, robotState.acceleration, robotPose.getValidity()<0.5);
00073     motionRequest.motionType = MotionRequest::walk;
00074     motionRequest.walkRequest.walkType = WalkRequest::normal;
00075     motionRequest.walkRequest.walkParams=simpleBackwardParcour.getMotionRequest();
00076     motionRequest.updateRP=false;
00077 /*
00078     if (lastMode!=1)
00079     {
00080       motionRequestX.resetTo(motionRequest.walkRequest.walkParams.translation.x); 
00081       motionRequestY.resetTo(motionRequest.walkRequest.walkParams.translation.y);
00082       motionRequestR.resetTo(motionRequest.walkRequest.walkParams.rotation);
00083     }
00084     else
00085     {
00086       motionRequestX.approximateVal(motionRequest.walkRequest.walkParams.translation.x); 
00087       motionRequestY.approximateVal(motionRequest.walkRequest.walkParams.translation.y);
00088       motionRequestR.approximateVal(motionRequest.walkRequest.walkParams.rotation);
00089     }
00090     motionRequest.walkRequest.walkParams.translation.x=motionRequestX.getVal();
00091     motionRequest.walkRequest.walkParams.translation.y=motionRequestY.getVal();
00092     motionRequest.walkRequest.walkParams.rotation=motionRequestR.getVal();
00093 */
00094     break;
00095   case 2: //position
00096     {
00097       if ((lastMode!=2)&&(evolutionMode!=0))
00098       {
00099         //initialize rand(), but only if we dont want direct comparisons anymore
00100         //2do: is this better than in ...next...()?
00101         //srand(SystemCall::getCurrentSystemTime());
00102         
00103         ERS7EvolveWalkingParameters par;
00104         invKinWalkingParameters = par;
00105         gt2004Parameters = invKinWalkingParameters;
00106         walkParameterTimeStamp=SystemCall::getCurrentSystemTime();
00107       }  
00108       //this is good old goToPoint:
00109       Vector2<double> destination(-2600,0);
00110       const double destinationAngle=0;
00111       const double maxSpeed = 300;
00112       const double maxTurnSpeed = fromDegrees(40);
00113       const Vector2<double>& self = robotPose.translation;
00114       double distanceToDestination = Geometry::distanceTo(self,destination);
00115       double angleDifference = normalize(fromDegrees(destinationAngle) - robotPose.rotation);
00116       double angleToDestination = Geometry::angleTo(robotPose,destination);
00117       motionRequest.motionType = MotionRequest::walk;
00118       motionRequest.walkRequest.walkType = WalkRequest::normal;
00119       //this time does not necessarily inclgt2004e time for turning!:
00120       double estimatedTimeToReachDestination;
00121       if (distanceToDestination > 200)
00122       {
00123         estimatedTimeToReachDestination = (distanceToDestination+200)/ maxSpeed;
00124         
00125         motionRequest.walkRequest.walkParams.translation.x = cos(angleToDestination) * maxSpeed;
00126         motionRequest.walkRequest.walkParams.translation.y = sin(angleToDestination) * maxSpeed;
00127       }
00128       else
00129       {
00130         estimatedTimeToReachDestination = 2*distanceToDestination / maxSpeed;
00131         if (distanceToDestination > 10)
00132         {
00133           motionRequest.walkRequest.walkParams.translation.x = 
00134             cos(angleToDestination) * maxSpeed*distanceToDestination/200;
00135           motionRequest.walkRequest.walkParams.translation.y = 
00136             sin(angleToDestination) * maxSpeed*distanceToDestination/200;
00137         }
00138         else
00139         {
00140           motionRequest.walkRequest.walkParams.translation.x = 0;
00141           motionRequest.walkRequest.walkParams.translation.y = 0;
00142         }
00143       }
00144       if (estimatedTimeToReachDestination==0)
00145       {
00146         estimatedTimeToReachDestination = 0.001;
00147       }
00148       if (fabs(toDegrees(angleDifference)) > 20)
00149       {
00150         motionRequest.walkRequest.walkParams.rotation = 
00151           angleDifference / estimatedTimeToReachDestination;
00152         if (motionRequest.walkRequest.walkParams.rotation > maxTurnSpeed)
00153         {
00154           motionRequest.walkRequest.walkParams.rotation = maxTurnSpeed;
00155         }
00156         if (motionRequest.walkRequest.walkParams.rotation < -maxTurnSpeed) 
00157         {
00158           motionRequest.walkRequest.walkParams.rotation = -maxTurnSpeed;
00159         }
00160       }
00161       else
00162       {
00163         motionRequest.walkRequest.walkParams.rotation = 2*angleDifference;
00164       }
00165       if ((fabs(toDegrees(angleDifference))<4)&&(distanceToDestination<25))
00166       {
00167         motionRequest.walkRequest.walkParams.translation.x = 0;
00168         motionRequest.walkRequest.walkParams.translation.y = 0;
00169         motionRequest.walkRequest.walkParams.rotation = 0;
00170       }
00171       if (fabs(motionRequest.walkRequest.walkParams.translation.x) < 10
00172         && fabs(motionRequest.walkRequest.walkParams.translation.y) < 10
00173         && fabs(motionRequest.walkRequest.walkParams.rotation) < fromDegrees(10)
00174         && fabs(distanceToDestination) < 40
00175         && fabs(angleToDestination) < fromDegrees(5))
00176       {
00177         motionRequest.motionType = MotionRequest::stand;
00178       }
00179     }
00180     break;
00181   case 3: //evolve walking parameters (choose next; called when ready)
00182     motionRequest.motionType = MotionRequest::stand;
00183     if ((lastMode!=3)&&(evolutionMode!=0))
00184     {
00185       GT2004Parameters* param=bPopulation.getNextIndividualWithoutFitness();
00186       while (param==0)
00187       {
00188         //there is no unevaluated individual anymore, so lets build the next generation
00189         OUTPUT(idText,text, "Backward_Evolution!");
00190         //the worse half of the population shall be replaced by mutations/crossovers:
00191         bPopulation.evolve(0.5, 0.6, 0.3, 0.12, true);
00192         param=bPopulation.getNextIndividualWithoutFitness();
00193       }
00194       
00195       param=ftPopulation.getNextIndividualWithoutFitness();
00196       while (param==0)
00197       {
00198         //there is no unevaluated individual anymore, so lets build the next generation
00199         OUTPUT(idText,text, "ForwardTurning_Evolution!");
00200         //the worse half of the population shall be replaced by mutations/crossovers:
00201         ftPopulation.evolve(0.5, 0.6, 0.3, 0.12, true);
00202         param=ftPopulation.getNextIndividualWithoutFitness();
00203       }
00204       
00205       //send it to Motion:
00206       gt2004Parameters = *param;
00207       invKinWalkingParameters = gt2004Parameters;
00208       walkParameterTimeStamp=SystemCall::getCurrentSystemTime();
00209       //send it as DebugMessage too to notify RobotControl dialogs:
00210       OUTPUT(idInvKinWalkingParameters,bin,invKinWalkingParameters);
00211       OUTPUT(idGT2004Parameters,bin,gt2004Parameters);
00212     }
00213     break;
00214   case 4: //abort (individual failed)
00215     motionRequest.motionType = MotionRequest::stand;
00216     if (lastMode!=4)
00217     {
00218       GT2004Parameters* param=ftPopulation.getNextIndividualWithoutFitness();
00219       if (param!=0)
00220       {
00221         param->fitness=0;
00222         
00223         OutTextRawFile fitLog("fitness.dat",true);
00224         fitLog << "FTFitness = 0\n";
00225         if (evolutionMode!=0)
00226         {
00227           ftPopulation.outputStatistics(&fitLog);
00228         }
00229         else
00230         {
00231           param->fitness=-1;
00232         }
00233       }
00234       param=bPopulation.getNextIndividualWithoutFitness();
00235       if (param!=0)
00236       {
00237         param->fitness=0;
00238         
00239         OutTextRawFile fitLog("fitness.dat",true);
00240         fitLog << "BFitness = 0\n";
00241         if (evolutionMode!=0)
00242         {
00243           bPopulation.outputStatistics(&fitLog);
00244         }
00245         else
00246         {
00247           param->fitness=-1;
00248         }
00249       }
00250       OUTPUT(idText,text, "Fitness = 0");
00251     }
00252     break;
00253   case 5: //calc fitness (only called after complete run: no abort, no pause)
00254     motionRequest.motionType = MotionRequest::stand;
00255     if (lastMode!=5)
00256     {
00257       GT2004Parameters* param=ftPopulation.getNextIndividualWithoutFitness();
00258       if (param!=0)
00259       {
00260         param->fitness=forwardTurningParcour.getUnifiedSpeed();
00261         OutTextRawFile fitLog("fitness.dat",true);
00262         fitLog << "FTFitness = " << param->fitness << "\n";
00263         if (evolutionMode!=0)
00264         {
00265           ftPopulation.outputStatistics(&fitLog);
00266         
00267           OutTextFile outFile("ft_opt.dat",true);
00268           outFile << *param;
00269           outFile << param->fitness;
00270         }
00271         else
00272         {
00273           param->fitness=-1;
00274         }
00275       }
00276       GT2004Parameters* bparam=bPopulation.getNextIndividualWithoutFitness();
00277       if (bparam!=0)
00278       {
00279         bparam->fitness=simpleBackwardParcour.getUnifiedSpeed();
00280         OutTextRawFile fitLog("fitness.dat",true);
00281         fitLog << "BFitness = " << bparam->fitness << "\n";
00282         if (evolutionMode!=0)
00283         {
00284           bPopulation.outputStatistics(&fitLog);
00285         
00286           OutTextFile outFile("b_opt.dat",true);
00287           outFile << *bparam;
00288           outFile << bparam->fitness;
00289         }
00290         else
00291         {
00292           param->fitness=-1;
00293         }
00294       }
00295       OutTextRawFile fitLog("fitness.dat",true);
00296       fitLog << "Fitness = " << 0.67*param->fitness+0.33*bparam->fitness << "\n";
00297       OUTPUT(idText,text, "Fitness = " << 0.67*param->fitness+0.33*bparam->fitness);
00298 
00299       /*
00300       OutTextFile outFTPopul("ft_pop.dat");
00301       for (int i=0;i<10;i++)
00302       {
00303       outFTPopul << *ftPopulation.individual[i];
00304       outFTPopul << ftPopulation.individual[i]->fitness;
00305       }
00306       OutTextFile outBPopul("b_pop.dat");
00307       for (int i=0;i<10;i++)
00308       {
00309       outBPopul << *bPopulation.individual[i];
00310       outBPopul << bPopulation.individual[i]->fitness;
00311       }
00312       */
00313     }
00314     break;
00315   }
00316   lastMode=(int)mode;
00317 }
00318 
00319 
00320 void GT2004BasicBehaviorMeasureGT2004Parameters::execute()
00321 {
00322   motionRequest.motionType = MotionRequest::walk;
00323   motionRequest.walkRequest.walkType = WalkRequest::normal;
00324   motionRequest.walkRequest.walkParams = measurementRequest;
00325   
00326   if ((robotPose.frameNumber-lastFrameNumber>250)||(robotPose.frameNumber<lastFrameNumber))
00327   {
00328     //if last robot pose is older than 2s, this basic behavior was restarted
00329     startFrameNumber=robotPose.frameNumber;
00330     char txt[512];
00331     sprintf(txt," (%3.1f, %3.1f, %1.3f)",motionRequest.walkRequest.walkParams.translation.x,motionRequest.walkRequest.walkParams.translation.y,motionRequest.walkRequest.walkParams.rotation);
00332     GT2004Parameters* param= gt2004ParametersSet.getParameters(gt2004CurrentIndex);
00333     if ((gt2004CurrentIndex<(int)GT2004ParametersSet::numberOfParameters)&&(evolutionMode!=0))
00334     {
00335       //send the parameters to be measured to motion, just to be sure it has the correct ones
00336       gt2004Parameters = *param;
00337       walkParameterTimeStamp=SystemCall::getCurrentSystemTime();
00338     }
00339     if (gt2004CurrentIndex<(int)GT2004ParametersSet::numberOfParameters)
00340     {
00341       sprintf(txt," (%3.1f, %3.1f, %1.3f), corrected [%3.1f, %3.1f, %1.3f]:",motionRequest.walkRequest.walkParams.translation.x,motionRequest.walkRequest.walkParams.translation.y,motionRequest.walkRequest.walkParams.rotation,param->correctedMotion.translation.x,param->correctedMotion.translation.y,param->correctedMotion.rotation);
00342     }
00343     OUTPUT(idText,text,"measure " << GT2004ParametersSet::getIndexString(gt2004CurrentIndex) << txt);
00344     //send them as debug message too to notify GT2004ParametersDialog
00345     OUTPUT(idGT2004Parameters,bin,((gt2004CurrentIndex<GT2004ParametersSet::numberOfParameters)?*gt2004ParametersSet.getParameters(gt2004CurrentIndex):gt2004ExtraParameters));
00346   }
00347   lastFrameNumber=robotPose.frameNumber;
00348   
00349   //look at MotionRequestResult.nb to understand the following calculation
00350   /*
00351   Step0:
00352   start with (x0,y0,r0) and walk until (xt,yt,r(t)),
00353   the following calculation is only valid for the point the robot turns around!
00354   Use that point for x/y here!
00355   */
00356 
00357   //start point is last valid pose in 2.0s after basic behavior start:
00358   if ((robotPose.frameNumber-startFrameNumber<250)&&(robotPose.getValidity()>0.5))
00359   {
00360     //we have to use COG/point of turn for x/y here:
00361     x0=robotPose.translation.x-100*cos(robotPose.rotation);
00362     y0=robotPose.translation.y-100*sin(robotPose.rotation);
00363     r0=robotPose.rotation;
00364     t0=0.008*robotPose.frameNumber;
00365   }
00366   
00367   //end point is last valid pose after at least 4.0s:
00368   if ((robotPose.frameNumber-startFrameNumber>500)&&(robotPose.getValidity()>0.5))
00369   {
00370     double t=0.008*robotPose.frameNumber-t0;
00371     //we have to use COG/point of turn for x/y here:
00372     double xt=robotPose.translation.x-100*cos(robotPose.rotation);
00373     double yt=robotPose.translation.y-100*sin(robotPose.rotation);
00374     double rt=robotPose.rotation;
00375   
00376     //Step3: calculate dr=(r(t)-r0)/t
00377     double dr,dx,dy;
00378     dr=(rt-r0)/t;
00379 
00380     //2do: ensure dr*t != n*pi
00381     if (fabs(dr)>0.001)
00382     {
00383       //Step4.1 (if dr!=0):
00384       double cdrt2=cos(r0+dr*t/2);
00385       double sdrt2=sin(r0+dr*t/2);
00386       dx=dr/2/sin(dr*t/2)*((xt-x0)*cdrt2+(yt-y0)*sdrt2);
00387       dy=dr*sin(dr*t/2)*((y0-yt)*cdrt2+(xt-x0)*sdrt2)/(cos(dr*t)-1);
00388     }
00389     else
00390     {
00391       //Step4.2 (if dr==0):
00392       dx=((xt-x0)*cos(r0)+(yt-y0)*sin(r0))/t;
00393       dy=((yt-y0)*cos(r0)+(x0-xt)*sin(r0))/t;
00394     }
00395     //CARE!: this is NOT position change of neck but of COG!:
00396     gt2004ParametersCalibration[gt2004CurrentIndex]=Pose2D(dr,dx,dy);
00397   }
00398 }
00399 
00400 
00401 void GT2004BasicBehaviorMeasureGT2004ParametersBlind::execute()
00402 {
00403   motionRequest.motionType = MotionRequest::walk;
00404   motionRequest.walkRequest.walkType = WalkRequest::normal;
00405   motionRequest.walkRequest.walkParams = measurementRequest;
00406   if (fabs(measurementRequest.rotation)>1.2)
00407   {
00408     headControlMode.headControlMode=HeadControlMode::lookParallelToGround;
00409   }
00410   else
00411   {
00412     headControlMode.headControlMode=HeadControlMode::watchOrigin;
00413   }
00414   
00415   char txt[512];
00416   if ((robotPose.frameNumber-lastFrameNumber>250)||(robotPose.frameNumber<lastFrameNumber))
00417   {
00418     //if last robot pose is older than 2s, this basic behavior was restarted
00419     startFrameNumber=robotPose.frameNumber;
00420     sprintf(txt," (%3.1f, %3.1f, %1.3f)",motionRequest.walkRequest.walkParams.translation.x,motionRequest.walkRequest.walkParams.translation.y,motionRequest.walkRequest.walkParams.rotation);
00421     GT2004Parameters* param= gt2004ParametersSet.getParameters(gt2004CurrentIndex);
00422     if ((gt2004CurrentIndex<(int)GT2004ParametersSet::numberOfParameters)&&(evolutionMode!=0))
00423     {
00424       //send the parameters to be measured to motion, just to be sure it has the correct ones
00425       gt2004Parameters = *param;
00426       walkParameterTimeStamp=SystemCall::getCurrentSystemTime();
00427     }
00428     if (gt2004CurrentIndex<(int)GT2004ParametersSet::numberOfParameters)
00429     {
00430       sprintf(txt," (%3.1f, %3.1f, %1.3f), corrected [%3.1f, %3.1f, %1.3f]:",motionRequest.walkRequest.walkParams.translation.x,motionRequest.walkRequest.walkParams.translation.y,motionRequest.walkRequest.walkParams.rotation,param->correctedMotion.translation.x,param->correctedMotion.translation.y,param->correctedMotion.rotation);
00431     }
00432     OUTPUT(idText,text,"measure " << GT2004ParametersSet::getIndexString(gt2004CurrentIndex) << txt);
00433     //send them as debug message too to notify GT2004ParametersDialog
00434     OUTPUT(idGT2004Parameters,bin,((gt2004CurrentIndex<GT2004ParametersSet::numberOfParameters)?*gt2004ParametersSet.getParameters(gt2004CurrentIndex):gt2004ExtraParameters));
00435     
00436     x0=y0=r0=t0=0;
00437     lastRot=-1000;
00438     lastTime=0;
00439     firstNullTime=0;
00440     lastNullTime=0;
00441     nullTime=0;
00442     speed=Pose2D(50*measurementRequest.rotation,0,0);
00443     clusterNumber=0;
00444     dr=dx=dy=0;
00445     goodFrames=0;
00446   }
00447   lastFrameNumber=robotPose.frameNumber;
00448   
00449   //start measuring after 2.0s:
00450   if (robotPose.frameNumber-startFrameNumber>250)
00451   {
00452     double actTime=0.008*robotPose.frameNumber;
00453     if ((robotPose.getValidity()>0.5)&&(fabs(robotPose.rotation)<1.25))
00454     {
00455       if (goodFrames++ >0)
00456       {
00457         //OUTPUT(idText,text,"actTime=" << actTime << ", rotDiff=" << robotPose.rotation-lastRot << ", rotSinceLast0=" << fabs(speed.rotation*(actTime-lastNullTime)-robotPose.rotation));
00458         if (
00459           ((speed.rotation<0)&&(robotPose.rotation-lastRot>0.015)&&(actTime-lastTime>0.2))||
00460           ((speed.rotation>0)&&(robotPose.rotation-lastRot<-0.015)&&(actTime-lastTime>0.2))||
00461           ((lastNullTime!=0)&&(fabs(speed.rotation*(actTime-lastNullTime)-robotPose.rotation)>3.2*pi)&&(actTime-lastTime>1.0))||
00462           ((lastNullTime==0)&&(actTime-lastTime>1.0))
00463           )
00464         {
00465           //a new cluster starts, because measured value is too far away from expected value
00466           
00467           lastNullTime=nullTime;
00468           if (firstNullTime==0)
00469           {
00470             firstNullTime=lastNullTime;
00471           }
00472           else
00473           {
00474             if (clusterFrames>2)
00475             {
00476               //last cluster finished: calc resulting speed:
00477               double rotDiff=(nullTime-firstNullTime)*speed.rotation/2/pi-(clusterNumber-1);
00478               if (rotDiff>1)
00479               {
00480                 //according to last speed we have to be an rotation further,
00481                 //so we missed a cluster. correct that:
00482                 clusterNumber++;
00483                 OUTPUT(idText,text,"!!!rotDiff=" << rotDiff <<" -> clusterNumber++");
00484               }
00485               speed.rotation=(speed.rotation>0)?
00486                 2*pi*(clusterNumber-1)/(nullTime-firstNullTime):
00487               -2*pi*(clusterNumber-1)/(nullTime-firstNullTime);
00488               sprintf(txt,"cluster=%i, goodFrames=%i, clusterSpeed=%.3f, nullTime=%.2f, rotDiff=%.3f, speed=%.2f",clusterNumber,goodFrames,dr,nullTime,rotDiff,speed.rotation);
00489               OUTPUT(idText,text, txt);
00490             }
00491             if ((clusterFrames>10)&&(headControlMode.headControlMode==HeadControlMode::watchOrigin))
00492             {
00493               //incorporate old dx/dy into speed, if it was a 'valid' cluster
00494               speed.translation *= (clusterNumber-2);
00495               speed.translation.x += dx;
00496               speed.translation.y += dy;
00497               speed.translation /= (clusterNumber-1);
00498               sprintf(txt,"dxcluster=%3.1f, dycluster=%3.1f, dx=%3.1f, dy=%3.1f",dx,dy,speed.translation.x,speed.translation.y);
00499               OUTPUT(idText,text, txt);
00500             }
00501           }
00502           
00503           clusterNumber++;
00504           //OUTPUT(idText,text, "starting cluster " << clusterNumber);
00505           clusterFrames=0;
00506 
00507 
00508           t0=actTime;
00509           //we have to use COG/point of turn for x/y here:
00510           x0=robotPose.translation.x-100*cos(robotPose.rotation);
00511           y0=robotPose.translation.y-100*sin(robotPose.rotation);
00512           r0=robotPose.rotation;
00513         }
00514         else
00515         {
00516           clusterFrames++;
00517           //we are still in the same cluster
00518           double t=actTime-t0;
00519           //we have to use COG/point of turn for x/y here:
00520           double xt=robotPose.translation.x-100*cos(robotPose.rotation);
00521           double yt=robotPose.translation.y-100*sin(robotPose.rotation);
00522           double rt=robotPose.rotation;
00523           
00524           dr=(rt-r0)/t;
00525           
00526           if (t>0.2)
00527           {
00528             //only measure dx, dy if we are continously localized at least 0.2 seconds
00529             
00530             if (fabs(dr)<0.001)
00531             {
00532               //this should never happen because
00533               //measure blind is only useful for dr!=0
00534               dr=0.001;
00535             }
00536             //Step4.1 (if dr!=0):
00537             double cdrt2=cos(r0+dr*t/2);
00538             double sdrt2=sin(r0+dr*t/2);
00539             dx=dr/2/sin(dr*t/2)*((xt-x0)*cdrt2+(yt-y0)*sdrt2);
00540             dy=dr*sin(dr*t/2)*((y0-yt)*cdrt2+(xt-x0)*sdrt2)/(cos(dr*t)-1);
00541           }
00542           //CARE: this is not position change of neck but of COG!
00543           
00544           nullTime=(r0*dr>0)?t0-fabs(r0/dr):t0+fabs(r0/dr);
00545           //sprintf(txt,"t0=%.3f, actTime=%.3f, r0=%.3f, rt=%.3f, t=%.3f, dr=%.3f, nullTime=%.2f",t0,actTime,r0,rt,t,dr,nullTime);
00546           //OUTPUT(idText,text, txt);
00547           
00548           if (clusterNumber<=1)
00549           {
00550             speed.rotation=dr;
00551           }
00552           else if (clusterNumber==2)
00553           {
00554             double rotDiff=(nullTime-firstNullTime)*speed.rotation/2/pi-(clusterNumber-1);
00555             if ((rotDiff>1.5)&&(goodFrames>3))
00556             {
00557               //according to last speed we have to be at least an rotation further,
00558               //so we missed a cluster. correct that:
00559               clusterNumber++;
00560               OUTPUT(idText,text,"!!!rotDiff=" << rotDiff <<" -> clusterNumber++");
00561             }
00562             speed.rotation=(speed.rotation>0)?
00563               2*pi*(clusterNumber-1)/(nullTime-firstNullTime):
00564             -2*pi*(clusterNumber-1)/(nullTime-firstNullTime);
00565             if ((headControlMode.headControlMode==HeadControlMode::watchOrigin))
00566             {
00567               speed.translation.x=dx;
00568               speed.translation.y=dy;
00569             }
00570             //sprintf(txt,"cluster=%i, clusterSpeed=%.3f, nullTime=%.2f, rotDiff=%.3f, dx=%.1f, dy=%.1f, rspeed=%.3f",clusterNumber,dr,nullTime,rotDiff,speed.translation.x,speed.translation.y,speed.rotation);
00571             //OUTPUT(idText,text, txt);
00572           }
00573         }
00574         lastRot=robotPose.rotation;
00575         lastTime=actTime;
00576       }
00577     }
00578     else
00579     {
00580       goodFrames=0;
00581     }
00582     gt2004ParametersCalibration[gt2004CurrentIndex]=speed;
00583   }
00584 }
00585 
00586 
00587 void GT2004BasicBehaviorSendCurrentGT2004ParametersAndChooseNext::execute()
00588 {
00589   char txt[512];
00590   sprintf(txt,"  dx=%3.1f, dy=%3.1f, dr=%1.3f",gt2004ParametersCalibration[gt2004CurrentIndex].translation.x, gt2004ParametersCalibration[gt2004CurrentIndex].translation.y, gt2004ParametersCalibration[gt2004CurrentIndex].rotation);
00591   
00592   if (GT2004ParametersSet::getSpeed(gt2004ParametersCalibration[gt2004CurrentIndex])>=2)
00593   {
00594     gt2004ParametersCalibration[gt2004CurrentIndex]=Pose2D(0,0,0);
00595     return;
00596   }
00597 
00598   if ((gt2004CurrentIndex<(int)GT2004ParametersSet::numberOfParameters)&&(evolutionMode!=0))
00599   {
00600     //initialize rand(), but only if we dont want direct comparisons anymore and really use evolution here
00601     //its good to do this here, because in constructor can always be the same time...
00602     srand(SystemCall::getCurrentSystemTime());
00603 
00604     if (((measurementRequest.translation.abs()==0)||(gt2004ParametersCalibration[gt2004CurrentIndex].translation.abs()>0))&&
00605         ((fabs(measurementRequest.rotation)<0.5)||(fabs(gt2004ParametersCalibration[gt2004CurrentIndex].rotation)>0.02))
00606        )
00607     {
00608       if (!gt2004ParametersSet.isMaxSpeedIndex(gt2004CurrentIndex))
00609       {
00610         //correct parameters
00611         if (gt2004ParametersSet.getParameters(gt2004CurrentIndex)->reportRealMotion(gt2004ParametersCalibration[gt2004CurrentIndex]))
00612         {
00613           Pose2D corrected=gt2004ParametersSet.getParameters(gt2004CurrentIndex)->correctedMotion;
00614           sprintf(&txt[strlen(txt)],"    -> corrected [%3.1f, %3.1f, %1.3f]",corrected.translation.x, corrected.translation.y, corrected.rotation);
00615         }
00616       }
00617       else
00618       {
00619         //2do: make max speed stuff better
00620       }
00621     
00622       //mirror the parameters
00623       gt2004ParametersSet.mirrorThis(gt2004CurrentIndex);
00624       int mirror=gt2004ParametersSet.getIndexOfMirror(gt2004CurrentIndex);
00625       if (mirror>=0)
00626       {
00627         gt2004ParametersCalibration[mirror]=gt2004ParametersCalibration[gt2004CurrentIndex];
00628         gt2004ParametersCalibration[mirror].translation.y = -gt2004ParametersCalibration[mirror].translation.y;
00629         gt2004ParametersCalibration[mirror].rotation = -gt2004ParametersCalibration[mirror].rotation;
00630       }
00631       //2do: the mirror is not sent to Motion
00632     }
00633     
00634     //send the corrected parameters to motion
00635     gt2004Parameters = *gt2004ParametersSet.getParameters(gt2004CurrentIndex);
00636     walkParameterTimeStamp=SystemCall::getCurrentSystemTime();
00637     
00638     //send this as debug message too to notify GT2004ParametersDialog
00639     OUTPUT(idGT2004Parameters,bin,gt2004Parameters);
00640     
00641     //2do: while loop. repeat until all parameters are good enough
00642     
00643     //we only need one of the mirrored partners (always the one with the higher index = lturn)
00644     //and no stand here, therefore we only have 66 cases (+default):
00645     switch ((GT2004ParametersSet::IndexName)gt2004CurrentIndex)
00646     {
00647     case GT2004ParametersSet::no_turn_0_fast:        gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_min180_fast; break;
00648     case GT2004ParametersSet::no_turn_min180_fast:   gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_0_med; break;
00649     case GT2004ParametersSet::no_turn_0_med:         gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_min180_med; break;
00650     case GT2004ParametersSet::no_turn_min180_med:    gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_0_slow; break;
00651     case GT2004ParametersSet::no_turn_0_slow:        gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_min180_slow; break;
00652     case GT2004ParametersSet::no_turn_min180_slow:   gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_min45_fast; break;
00653       
00654     case GT2004ParametersSet::no_turn_min45_fast:    gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_min135_fast; break;
00655     case GT2004ParametersSet::no_turn_min135_fast:   gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_min45_med; break;
00656     case GT2004ParametersSet::no_turn_min45_med:     gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_min135_med; break;
00657     case GT2004ParametersSet::no_turn_min135_med:    gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_min45_slow; break;
00658     case GT2004ParametersSet::no_turn_min45_slow:    gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_min135_slow; break;
00659     case GT2004ParametersSet::no_turn_min135_slow:   gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_min90_fast; break;
00660     case GT2004ParametersSet::no_turn_min90_fast:    gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_min90_med; break;
00661     case GT2004ParametersSet::no_turn_min90_med:     gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_min90_slow; break;
00662     case GT2004ParametersSet::no_turn_min90_slow:    gt2004CurrentIndex=(int)GT2004ParametersSet::much_lturn_slow; break;
00663       
00664     case GT2004ParametersSet::much_lturn_slow:       gt2004CurrentIndex=(int)GT2004ParametersSet::much_lturn_med; break;
00665     case GT2004ParametersSet::much_lturn_med:        gt2004CurrentIndex=(int)GT2004ParametersSet::much_lturn_fast; break;
00666     case GT2004ParametersSet::much_lturn_fast:       gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_0_fast; break;
00667       
00668     case GT2004ParametersSet::few_lturn_0_fast:      gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_min180_fast; break;
00669     case GT2004ParametersSet::few_lturn_min180_fast: gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_45_fast; break;
00670     case GT2004ParametersSet::few_lturn_45_fast:     gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_min135_fast; break;
00671     case GT2004ParametersSet::few_lturn_min135_fast: gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_90_fast; break;
00672     case GT2004ParametersSet::few_lturn_90_fast:     gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_min90_fast; break;
00673     case GT2004ParametersSet::few_lturn_min90_fast:  gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_135_fast; break;
00674     case GT2004ParametersSet::few_lturn_135_fast:    gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_min45_fast; break;
00675     case GT2004ParametersSet::few_lturn_min45_fast:  gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_0_med; break;
00676       
00677     case GT2004ParametersSet::few_lturn_0_med:       gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_min180_med; break;
00678     case GT2004ParametersSet::few_lturn_min180_med:  gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_45_med; break;
00679     case GT2004ParametersSet::few_lturn_45_med:      gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_min135_med; break;
00680     case GT2004ParametersSet::few_lturn_min135_med:  gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_90_med; break;
00681     case GT2004ParametersSet::few_lturn_90_med:      gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_min90_med; break;
00682     case GT2004ParametersSet::few_lturn_min90_med:   gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_135_med; break;
00683     case GT2004ParametersSet::few_lturn_135_med:     gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_min45_med; break;
00684     case GT2004ParametersSet::few_lturn_min45_med:   gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_0_slow; break;
00685       
00686     case GT2004ParametersSet::few_lturn_0_slow:      gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_min180_slow; break;
00687     case GT2004ParametersSet::few_lturn_min180_slow: gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_45_slow; break;
00688     case GT2004ParametersSet::few_lturn_45_slow:     gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_min135_slow; break;
00689     case GT2004ParametersSet::few_lturn_min135_slow: gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_90_slow; break;
00690     case GT2004ParametersSet::few_lturn_90_slow:     gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_min90_slow; break;
00691     case GT2004ParametersSet::few_lturn_min90_slow:  gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_135_slow; break;
00692     case GT2004ParametersSet::few_lturn_135_slow:    gt2004CurrentIndex=(int)GT2004ParametersSet::few_lturn_min45_slow; break;
00693     case GT2004ParametersSet::few_lturn_min45_slow:  gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_0_fast; break;
00694       
00695     case GT2004ParametersSet::med_lturn_0_fast:      gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_min180_fast; break;
00696     case GT2004ParametersSet::med_lturn_min180_fast: gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_45_fast; break;
00697     case GT2004ParametersSet::med_lturn_45_fast:     gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_min135_fast; break;
00698     case GT2004ParametersSet::med_lturn_min135_fast: gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_90_fast; break;
00699     case GT2004ParametersSet::med_lturn_90_fast:     gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_min90_fast; break;
00700     case GT2004ParametersSet::med_lturn_min90_fast:  gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_135_fast; break;
00701     case GT2004ParametersSet::med_lturn_135_fast:    gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_min45_fast; break;
00702     case GT2004ParametersSet::med_lturn_min45_fast:  gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_0_med; break;
00703       
00704     case GT2004ParametersSet::med_lturn_0_med:       gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_min180_med; break;
00705     case GT2004ParametersSet::med_lturn_min180_med:  gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_45_med; break;
00706     case GT2004ParametersSet::med_lturn_45_med:      gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_min135_med; break;
00707     case GT2004ParametersSet::med_lturn_min135_med:  gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_90_med; break;
00708     case GT2004ParametersSet::med_lturn_90_med:      gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_min90_med; break;
00709     case GT2004ParametersSet::med_lturn_min90_med:   gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_135_med; break;
00710     case GT2004ParametersSet::med_lturn_135_med:     gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_min45_med; break;
00711     case GT2004ParametersSet::med_lturn_min45_med:   gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_0_slow; break;
00712       
00713     case GT2004ParametersSet::med_lturn_0_slow:      gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_min180_slow; break;
00714     case GT2004ParametersSet::med_lturn_min180_slow: gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_45_slow; break;
00715     case GT2004ParametersSet::med_lturn_45_slow:     gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_min135_slow; break;
00716     case GT2004ParametersSet::med_lturn_min135_slow: gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_90_slow; break;
00717     case GT2004ParametersSet::med_lturn_90_slow:     gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_min90_slow; break;
00718     case GT2004ParametersSet::med_lturn_min90_slow:  gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_135_slow; break;
00719     case GT2004ParametersSet::med_lturn_135_slow:    gt2004CurrentIndex=(int)GT2004ParametersSet::med_lturn_min45_slow; break;
00720     case GT2004ParametersSet::med_lturn_min45_slow:
00721     default:
00722       gt2004CurrentIndex=(int)GT2004ParametersSet::no_turn_0_fast;
00723     }
00724     measurementRequest=gt2004ParametersSet.getParameters(gt2004CurrentIndex)->requestedMotion;
00725   }
00726   OUTPUT(idText,text,txt);
00727 }
00728 
00729 void GT2004BasicBehaviorNextGT2004ParametersToBeMeasured::execute()
00730 {
00731   char txt[512];
00732   sprintf(txt,"  dx=%3.1f, dy=%3.1f, dr=%1.3f",gt2004ParametersCalibration[gt2004CurrentIndex].translation.x, gt2004ParametersCalibration[gt2004CurrentIndex].translation.y, gt2004ParametersCalibration[gt2004CurrentIndex].rotation);
00733   OUTPUT(idText,text,txt);
00734   
00735   double speed=GT2004ParametersSet::getSpeed(measurementRequest);
00736   double direction=GT2004ParametersSet::getDirection(measurementRequest);
00737   double ratio=GT2004ParametersSet::getRatio(measurementRequest);
00738 
00739   double mSpeed=GT2004ParametersSet::getSpeed(gt2004ParametersCalibration[gt2004CurrentIndex]);
00740   
00741   trials++;
00742   if ((speed>0.001)&&(mSpeed<2)&&((mSpeed>0.001)||(trials>2)))
00743   {
00744     requestTable[tableIndex]=measurementRequest;
00745     measureTable[tableIndex]=gt2004ParametersCalibration[gt2004CurrentIndex];
00746     //calc soll/ist ratio and (re)set maxima:
00747     double speedRatio,yRatio,rRatio;
00748     if ((speed<0.4)||(gt2004ParametersCalibration[gt2004CurrentIndex].translation.abs()==0))
00749     {
00750       speedRatio=1;
00751       maxSpeed=0;
00752       maxSpeedRatio=0;
00753     }
00754     else
00755     {
00756       speedRatio=mSpeed/speed;
00757       if (mSpeed>maxSpeed)
00758       {
00759         maxSpeed=mSpeed;
00760       }
00761       if (speedRatio>maxSpeedRatio)
00762       {
00763         maxSpeedRatio=speedRatio;
00764       }
00765     }
00766     if ((fabs(measurementRequest.translation.y)<100)||(gt2004ParametersCalibration[gt2004CurrentIndex].translation.y==0))
00767     {
00768       yRatio=1;
00769       maxYRatio=0;
00770     }
00771     else
00772     {
00773       yRatio=gt2004ParametersCalibration[gt2004CurrentIndex].translation.y/measurementRequest.translation.y;
00774       if (yRatio>maxYRatio)
00775       {
00776         maxYRatio=yRatio;
00777       }
00778     }
00779     if (fabs(measurementRequest.rotation)<0.25)
00780     {
00781       rRatio=1;
00782       maxRRatio=0;
00783     }
00784     else
00785     {
00786       rRatio=gt2004ParametersCalibration[gt2004CurrentIndex].rotation/measurementRequest.rotation;
00787       if (rRatio>maxRRatio)
00788       {
00789         maxRRatio=rRatio;
00790       }
00791       if (fabs(measurementRequest.rotation)>2)
00792       {
00793         //this is to abort fast turning earlier (when rmess/rreq < 0.7(rmess/rreq)_max)
00794         speedRatio=rRatio;
00795         maxSpeedRatio=maxRRatio;
00796       }
00797     }
00798     
00799     trials=0;
00800     if ((tableIndex==0)||((mSpeed>0.92*maxSpeed)&&(mSpeed>maxSpeed-0.1)&&(speedRatio>0.7*maxSpeedRatio)&&(yRatio>0.66*maxYRatio)&&(rRatio>0.5*maxRRatio)&&(tableIndex<39)))
00801     {
00802       tableIndex++;
00803       GT2004ParametersSet::setSpeed(measurementRequest,speed+0.05);
00804     }
00805     else
00806     {
00807       {
00808         OutTextFile file("measure.csv",true);
00809         file << gt2004ExtraParameters;
00810       }
00811       OutTextRawFile file("measure.csv",true);
00812       file << "\nRatio=" << ratio << ", Direction=" << (int)(direction*180.01/pi) <<"\n";
00813       file << "request_x, request_y, request_r, measured_x, measured_y, measured_r, speed_request, speed_measured, speed_ratio\n";
00814       file << "0.0, 0.0, 0.0, 0.0, 0.0, 0.0\n";
00815       for (int i=0; i<=tableIndex; i++)
00816       {
00817         double speedReq=GT2004ParametersSet::getSpeed(requestTable[i]);
00818         double speedMes=GT2004ParametersSet::getSpeed(measureTable[i]);
00819         sprintf(txt,"%3.1f, %3.1f, %1.3f, %3.1f, %3.1f, %1.3f, %1.3f, %1.3f, %1.3f\n",
00820                 requestTable[i].translation.x, requestTable[i].translation.y, requestTable[i].rotation,
00821                 measureTable[i].translation.x, measureTable[i].translation.y, measureTable[i].rotation,
00822                 speedReq,speedMes,speedMes/speedReq);
00823         file << txt;
00824       }
00825       file << "\n";
00826       OUTPUT(idText,text,"last series appended to measure.csv");
00827 
00828       //only clear last measurement here (=when changing ratio or direction), because otherwise adjustment ist useful:
00829       gt2004ParametersCalibration[gt2004CurrentIndex]=Pose2D(0,0,0);
00830       tableIndex=0;
00831       maxSpeed=0;
00832       maxSpeedRatio=0; //care! speed/speed ratio here!
00833       
00834       GT2004ParametersSet::setSpeed(measurementRequest,0.05);
00835       if (fabs(ratio)<0.5)
00836       {
00837         GT2004ParametersSet::setDirection(measurementRequest,direction+pi_4);
00838       }
00839       if (fabs(GT2004ParametersSet::getDirection(measurementRequest))<0.1)
00840       {
00841         if (ratio<-0.5)
00842         {
00843           GT2004ParametersSet::setRatio(measurementRequest,-0.3);
00844         }
00845         else if (ratio<-0.2)
00846         {
00847           GT2004ParametersSet::setRatio(measurementRequest,-0.1);
00848         }
00849         else if (ratio<-0.05)
00850         {
00851           GT2004ParametersSet::setRatio(measurementRequest,0.0);
00852         }
00853         else if (ratio<0.05)
00854         {
00855           GT2004ParametersSet::setRatio(measurementRequest,0.1);
00856         }
00857         else if (ratio<0.2)
00858         {
00859           GT2004ParametersSet::setRatio(measurementRequest,0.3);
00860         }
00861         else if (ratio<0.5)
00862         {
00863           GT2004ParametersSet::setRatio(measurementRequest,1.0);
00864         }
00865         else
00866         {
00867           GT2004ParametersSet::setRatio(measurementRequest,-1.0);
00868         }
00869       }
00870       unsigned int sec=SystemCall::getCurrentSystemTime()/1000;
00871       OUTPUT(idText,text,"Starting Ratio="<<GT2004ParametersSet::getRatio(measurementRequest)<<", Direction="<<(int)(GT2004ParametersSet::getDirection(measurementRequest)*180.01/pi)<<", Time=" <<(sec/60)<<":"<<(sec%60));
00872     }
00873     gt2004ExtraParameters.requestedMotion=measurementRequest;
00874     //send this as debug message to notify GT2004ParametersDialog
00875     OUTPUT(idGT2004Parameters,bin,gt2004ExtraParameters);
00876   }
00877 }
00878 
00879 /*
00880 * Change Log
00881 * 
00882 * $Log: GT2004EvolutionBasicBehaviors.cpp,v $
00883 * Revision 1.7  2004/07/10 00:13:53  spranger
00884 * renaming for coderelease and preparations for gt2005
00885 *
00886 * Revision 1.6  2004/07/07 15:13:00  dueffert
00887 * evolution uses two populations now
00888 *
00889 * Revision 1.5  2004/06/20 18:18:46  dueffert
00890 * goTo(EvolutionStart)Point improved
00891 *
00892 * Revision 1.4  2004/06/14 16:54:56  juengel
00893 * Removed some WalkingEngineParameterSets.
00894 *
00895 * Revision 1.3  2004/06/07 10:16:50  dueffert
00896 * bug fixed
00897 *
00898 * Revision 1.2  2004/06/02 17:18:23  spranger
00899 * MotionRequest cleanup
00900 *
00901 * Revision 1.1  2004/05/29 18:18:19  dueffert
00902 * walk parameter evolution, measurement and calibration stuff ported to GT2004_WM
00903 *
00904 * Revision 1.1  2004/05/27 13:31:26  dueffert
00905 * walking evolution stuff separated
00906 *
00907 * Revision 1.43  2004/05/24 12:48:26  dueffert
00908 * outputs corrected
00909 *
00910 * Revision 1.42  2004/05/23 13:31:10  dueffert
00911 * output improved; mirroring corrected
00912 *
00913 * Revision 1.41  2004/05/20 17:18:35  dueffert
00914 * automatic measurement (hopefully) finalized
00915 *
00916 * Revision 1.40  2004/05/19 07:59:44  dueffert
00917 * automatic walk speed measurement significantly improved
00918 *
00919 * Revision 1.39  2004/05/17 11:16:51  dueffert
00920 * blind measurement improved
00921 *
00922 * Revision 1.38  2004/05/14 22:53:07  roefer
00923 * Warnings removed
00924 *
00925 * Revision 1.37  2004/05/14 10:15:49  dueffert
00926 * exact measurement behavior with logging implemented
00927 *
00928 * Revision 1.36  2004/05/12 14:23:31  dueffert
00929 * measurement basic behavior added
00930 *
00931 * Revision 1.35  2004/05/11 16:33:36  dueffert
00932 * send current parameters even if they were not auto evolved/changed
00933 *
00934 * Revision 1.34  2004/05/04 10:48:58  loetzsch
00935 * replaced all enums
00936 * xxxBehaviorControlTimeAfterWhichCommunicatedBallsAreAccepted
00937 * by
00938 * behaviorControlTimeAfterWhichCommunicatedBallsAreAccepted
00939 * (this mechanism was neither fully implemented nor used)
00940 *
00941 * Revision 1.33  2004/05/03 18:52:38  dueffert
00942 * comments corrected; max speed / rest distinction added
00943 *
00944 * Revision 1.32  2004/04/29 15:15:00  dueffert
00945 * measurement is now frame instead of time based
00946 *
00947 * Revision 1.31  2004/04/19 10:34:55  dueffert
00948 * parameters tuned to allow measurement oft *fast* walking
00949 *
00950 * Revision 1.30  2004/04/07 17:00:19  dueffert
00951 * idea of srand() added
00952 *
00953 * Revision 1.29  2004/03/30 11:54:47  dueffert
00954 * first useful evolutionMode implementation (0=none, 1=auto)
00955 *
00956 * Revision 1.28  2004/03/29 15:27:35  dueffert
00957 * output improved, evolution mode idea added
00958 *
00959 * Revision 1.27  2004/03/26 09:24:17  dueffert
00960 * missing conditions and one UDParameters for everything support added
00961 *
00962 * Revision 1.26  2004/03/24 15:09:39  dueffert
00963 * do not let Motion calculate RobotPose updates during evolution runs
00964 *
00965 * Revision 1.25  2004/03/24 13:45:25  dueffert
00966 * support for uniform noise mutation readded; evolution logic improved
00967 *
00968 * Revision 1.24  2004/03/19 16:37:27  dueffert
00969 * blind measurement works for the first time
00970 *
00971 * Revision 1.23  2004/03/16 10:25:24  dueffert
00972 * headControl for blind measurement changed
00973 *
00974 * Revision 1.22  2004/03/15 12:40:17  dueffert
00975 * measurement of freely choosen MotionRequest allowed; output improved
00976 *
00977 * Revision 1.21  2004/03/12 17:23:36  dueffert
00978 * own bug fixed
00979 *
00980 * Revision 1.20  2004/03/12 17:11:38  dueffert
00981 * omni-evo uses parameters in package now; blind speed calculation improved
00982 *
00983 * Revision 1.19  2004/03/10 15:01:07  dueffert
00984 * first simple fast turn (blind) measurement implemented
00985 *
00986 * Revision 1.18  2004/03/10 10:02:22  dueffert
00987 * population size tweaked; statistics output added
00988 *
00989 * Revision 1.17  2004/03/09 11:40:55  wachter
00990 * included Platform/GTAssert.h
00991 *
00992 * Revision 1.16  2004/03/09 08:46:30  dueffert
00993 * second measurement behavior added
00994 *
00995 * Revision 1.15  2004/03/03 08:34:16  dueffert
00996 * output improved
00997 *
00998 * Revision 1.14  2004/03/01 15:10:04  dueffert
00999 * measurement order defined, measurement output beautified
01000 *
01001 * Revision 1.13  2004/02/29 17:28:22  dueffert
01002 * UDParameters have char* names now
01003 *
01004 * Revision 1.12  2004/02/29 13:42:58  dueffert
01005 * UDParametersSet symmetries handled
01006 *
01007 * Revision 1.11  2004/02/27 16:43:03  dueffert
01008 * UDEvolutionRequest introduced
01009 *
01010 * Revision 1.10  2004/02/23 16:48:11  dueffert
01011 * several improvements for measurement of walking
01012 *
01013 * Revision 1.9  2004/02/18 14:49:20  dueffert
01014 * behavior control can now change walking parameters
01015 *
01016 * Revision 1.8  2004/02/10 11:56:53  dueffert
01017 * typo corrected
01018 *
01019 * Revision 1.7  2004/02/10 11:19:19  dueffert
01020 * simple basic behavior for evolution added, another improved, beautified
01021 *
01022 * Revision 1.6  2004/02/03 13:20:48  spranger
01023 * renamed all references to  class BallPosition to BallModel (possibly changed include files)
01024 *
01025 * Revision 1.5  2003/12/09 16:29:06  jhoffman
01026 * removed OUTPUTs
01027 *
01028 * Revision 1.4  2003/12/09 15:15:20  dueffert
01029 * WalkAccelerationRestrictor replaced by PIDsmoothedValue for evolving
01030 *
01031 * Revision 1.3  2003/11/19 13:49:39  dueffert
01032 * better positioning
01033 *
01034 * Revision 1.2  2003/10/28 13:27:22  dueffert
01035 * spelling and evolution logic improved
01036 *
01037 * Revision 1.1  2003/10/22 22:18:45  loetzsch
01038 * prepared the cloning of the GT2003BehaviorControl
01039 *
01040 * Revision 1.1  2003/10/06 13:39:31  cvsadm
01041 * Created GT2004 (M.J.)
01042 *
01043 * Revision 1.18  2003/09/25 10:14:26  juengel
01044 * Removed some walk-types.
01045 *
01046 * Revision 1.17  2003/09/24 15:29:20  dueffert
01047 * first somehow working automatic walk parameter evolution
01048 *
01049 * Revision 1.16  2003/09/11 15:21:31  dueffert
01050 * starting of evolution added
01051 *
01052 * Revision 1.15  2003/08/08 14:30:04  dueffert
01053 * some evolution implementation added
01054 *
01055 * Revision 1.14  2003/08/04 07:46:39  roefer
01056 * Challenge 2 modifications
01057 *
01058 * Revision 1.13  2003/07/30 14:52:03  dueffert
01059 * walk evolution agent added
01060 *
01061 * Revision 1.12  2003/07/09 11:44:26  jhoffman
01062 * obstacle avoidance simple behavior mode as used in challenge 3
01063 * known bug: sometimes stops in front of obstacle (but eventually the situation is resolved)
01064 *
01065 * Revision 1.11  2003/07/08 06:11:56  dueffert
01066 * further debug output removed
01067 *
01068 * Revision 1.10  2003/07/08 01:27:53  dueffert
01069 * another debug output suppressed
01070 *
01071 * Revision 1.9  2003/07/08 01:21:00  dueffert
01072 * debug output suppressed
01073 *
01074 * Revision 1.8  2003/07/07 07:15:36  jhoffman
01075 * commented out "auto" mode for dribbling
01076 *
01077 * Revision 1.7  2003/07/07 07:08:19  jhoffman
01078 * dribble as a basic behavior added to kicktest
01079 *
01080 * Revision 1.6  2003/07/06 20:34:30  dueffert
01081 * GT2003BasicBehaviorGoToBallWithDirection added
01082 *
01083 * Revision 1.5  2003/07/05 13:35:49  jhoffman
01084 * another bug fixed
01085 *
01086 * Revision 1.3  2003/07/05 13:32:46  jhoffman
01087 * obstacle avoider challenge additions
01088 * plus: kick-off behavior uses "simple-avoidance"
01089 *
01090 * Revision 1.2  2003/07/04 16:24:24  jhoffman
01091 * updated obstacle avoider (simple behavior) to be used in challenge
01092 *
01093 * Revision 1.1.1.1  2003/07/02 09:40:23  cvsadm
01094 * created new repository for the competitions in Padova from the 
01095 * tamara CVS (Tuesday 2:00 pm)
01096 *
01097 * removed unused solutions
01098 *
01099 * Revision 1.9  2003/06/04 00:43:45  loetzsch
01100 * put the GT2003WalkAccelerationRestrictor into two extra files in /Src/Tools
01101 *
01102 * Revision 1.8  2003/06/02 04:45:51  loetzsch
01103 * "get-to-position-and-avoid-obstacles" now faster turns
01104 *
01105 * Revision 1.7  2003/05/14 13:08:38  risler
01106 * removed DefaultObstaclesLocator
01107 * renamed MicroSectorsObstaclesLocator to DefaultObstaclesLocator
01108 * ObstaclesModel contains increased number of sectors
01109 * DefaultObstaclesLocator clean up
01110 *
01111 * Revision 1.6  2003/05/09 15:31:18  loetzsch
01112 * added time-after-which-communicated-ball-are-accepted
01113 *
01114 * Revision 1.5  2003/05/07 13:02:34  risler
01115 * added first continuous basic behaviors to GT2003BehaviorControl
01116 *
01117 * Revision 1.4  2003/05/06 11:18:33  goehring
01118 * Cast bug removed
01119 *
01120 * Revision 1.3  2003/05/06 07:59:19  dueffert
01121 * generating XML symbols in C
01122 *
01123 * Revision 1.2  2003/05/05 19:22:03  risler
01124 * added classes Simple/ContinuousBasicBehaviors for registering basic behaviors
01125 *
01126 * Revision 1.1  2003/05/03 15:14:02  loetzsch
01127 * GT2003BehaviorControl first draft
01128 *
01129 */

Generated on Thu Sep 23 19:57:26 2004 for GT2004 by doxygen 1.3.6