00001
00002
00003
00004
00005
00006
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:
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
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 break;
00056 case 1:
00057 if (lastMode!=1)
00058 {
00059 if (evolutionMode!=0)
00060 {
00061 GT2004Parameters* param=bPopulation.getNextIndividualWithoutFitness();
00062
00063 gt2004Parameters = *param;
00064 invKinWalkingParameters = gt2004Parameters;
00065 walkParameterTimeStamp=SystemCall::getCurrentSystemTime();
00066
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
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 break;
00095 case 2:
00096 {
00097 if ((lastMode!=2)&&(evolutionMode!=0))
00098 {
00099
00100
00101
00102
00103 ERS7EvolveWalkingParameters par;
00104 invKinWalkingParameters = par;
00105 gt2004Parameters = invKinWalkingParameters;
00106 walkParameterTimeStamp=SystemCall::getCurrentSystemTime();
00107 }
00108
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
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:
00182 motionRequest.motionType = MotionRequest::stand;
00183 if ((lastMode!=3)&&(evolutionMode!=0))
00184 {
00185 GT2004Parameters* param=bPopulation.getNextIndividualWithoutFitness();
00186 while (param==0)
00187 {
00188
00189 OUTPUT(idText,text, "Backward_Evolution!");
00190
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
00199 OUTPUT(idText,text, "ForwardTurning_Evolution!");
00200
00201 ftPopulation.evolve(0.5, 0.6, 0.3, 0.12, true);
00202 param=ftPopulation.getNextIndividualWithoutFitness();
00203 }
00204
00205
00206 gt2004Parameters = *param;
00207 invKinWalkingParameters = gt2004Parameters;
00208 walkParameterTimeStamp=SystemCall::getCurrentSystemTime();
00209
00210 OUTPUT(idInvKinWalkingParameters,bin,invKinWalkingParameters);
00211 OUTPUT(idGT2004Parameters,bin,gt2004Parameters);
00212 }
00213 break;
00214 case 4:
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:
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
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
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
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
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
00345 OUTPUT(idGT2004Parameters,bin,((gt2004CurrentIndex<GT2004ParametersSet::numberOfParameters)?*gt2004ParametersSet.getParameters(gt2004CurrentIndex):gt2004ExtraParameters));
00346 }
00347 lastFrameNumber=robotPose.frameNumber;
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358 if ((robotPose.frameNumber-startFrameNumber<250)&&(robotPose.getValidity()>0.5))
00359 {
00360
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
00368 if ((robotPose.frameNumber-startFrameNumber>500)&&(robotPose.getValidity()>0.5))
00369 {
00370 double t=0.008*robotPose.frameNumber-t0;
00371
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
00377 double dr,dx,dy;
00378 dr=(rt-r0)/t;
00379
00380
00381 if (fabs(dr)>0.001)
00382 {
00383
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
00392 dx=((xt-x0)*cos(r0)+(yt-y0)*sin(r0))/t;
00393 dy=((yt-y0)*cos(r0)+(x0-xt)*sin(r0))/t;
00394 }
00395
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
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
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
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
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
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
00466
00467 lastNullTime=nullTime;
00468 if (firstNullTime==0)
00469 {
00470 firstNullTime=lastNullTime;
00471 }
00472 else
00473 {
00474 if (clusterFrames>2)
00475 {
00476
00477 double rotDiff=(nullTime-firstNullTime)*speed.rotation/2/pi-(clusterNumber-1);
00478 if (rotDiff>1)
00479 {
00480
00481
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
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
00505 clusterFrames=0;
00506
00507
00508 t0=actTime;
00509
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
00518 double t=actTime-t0;
00519
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
00529
00530 if (fabs(dr)<0.001)
00531 {
00532
00533
00534 dr=0.001;
00535 }
00536
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
00543
00544 nullTime=(r0*dr>0)?t0-fabs(r0/dr):t0+fabs(r0/dr);
00545
00546
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
00558
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
00571
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
00601
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
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
00620 }
00621
00622
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
00632 }
00633
00634
00635 gt2004Parameters = *gt2004ParametersSet.getParameters(gt2004CurrentIndex);
00636 walkParameterTimeStamp=SystemCall::getCurrentSystemTime();
00637
00638
00639 OUTPUT(idGT2004Parameters,bin,gt2004Parameters);
00640
00641
00642
00643
00644
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
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
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
00829 gt2004ParametersCalibration[gt2004CurrentIndex]=Pose2D(0,0,0);
00830 tableIndex=0;
00831 maxSpeed=0;
00832 maxSpeedRatio=0;
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
00875 OUTPUT(idGT2004Parameters,bin,gt2004ExtraParameters);
00876 }
00877 }
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129