00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "EvolutionSymbols.h"
00010 #include "Tools/FieldDimensions.h"
00011 #include "Tools/Math/Pose2D.h"
00012
00013 EvolutionSymbols::EvolutionSymbols(const BehaviorControlInterfaces& interfaces,
00014 GT2004ParametersSet& gt2004ParametersSet,
00015 Pose2D* gt2004ParametersCalibration,
00016 int& gt2004CurrentIndex,
00017 Pose2D& measurementRequest,
00018 int& evolutionMode):
00019 BehaviorControlInterfaces(interfaces),
00020 gt2004ParametersSet(gt2004ParametersSet),
00021 gt2004ParametersCalibration(gt2004ParametersCalibration),
00022 gt2004CurrentIndex(gt2004CurrentIndex),
00023 measurementRequest(measurementRequest),
00024 evolutionMode(evolutionMode),
00025 timeWhenBallWasStartedToCatch(0), timeUntilBallWasCaught(0),
00026 role(BehaviorTeamMessage::goalie),
00027 estimatedTimeToReachBall(0.0),
00028 timeOfLastGoodSelfLocalization(SystemCall::getCurrentSystemTime())
00029 {
00030 }
00031
00032
00033 void EvolutionSymbols::registerSymbols(Xabsl2Engine& engine)
00034 {
00035
00036 engine.registerDecimalInputSymbol("duration-of-bad-self-localization", &durationOfBadSelfLocalization);
00037
00038
00039 engine.registerDecimalInputSymbol("current-gt2004-parameters-start-position.x", ¤tGT2004ParametersStartPosition.x);
00040 engine.registerDecimalInputSymbol("current-gt2004-parameters-start-position.y", ¤tGT2004ParametersStartPosition.y);
00041 engine.registerDecimalInputSymbol("current-gt2004-parameters-start-position.angle", ¤tGT2004ParametersStartDirection);
00042
00043 engine.registerBooleanInputSymbol("current-gt2004-parameters-measure-blind",
00044 this,(bool(Xabsl2FunctionProvider::*)())&EvolutionSymbols::getCurrentGT2004ParametersMeasureBlind);
00045
00046 engine.registerDecimalInputSymbol("quality-of-current-gt2004-parameters",this,
00047 (double (Xabsl2FunctionProvider::*)())&EvolutionSymbols::getQualityOfCurrentGT2004Parameters);
00048 }
00049
00050 void EvolutionSymbols::update()
00051 {
00052 if (robotPose.getValidity()>0.5)
00053 {
00054 timeOfLastGoodSelfLocalization=SystemCall::getCurrentSystemTime();
00055 }
00056 durationOfBadSelfLocalization=0.001*SystemCall::getTimeSince(timeOfLastGoodSelfLocalization);
00057
00058
00059
00060 Pose2D motReq=measurementRequest;
00061 if (gt2004ParametersCalibration[gt2004CurrentIndex].translation.abs()!=0)
00062 {
00063 motReq.translation += gt2004ParametersCalibration[gt2004CurrentIndex].translation;
00064 motReq.translation /= 2;
00065 motReq.rotation += gt2004ParametersCalibration[gt2004CurrentIndex].rotation;
00066 motReq.rotation /= 2;
00067 }
00068 double N=4.75;
00069 Pose2D afterNs;
00070 Pose2D afterN2s;
00071 afterNs.rotation=motReq.rotation*N;
00072 afterN2s.rotation=afterNs.rotation/2;
00073 if (fabs(afterNs.rotation)<0.0001)
00074 {
00075 afterNs.translation=motReq.translation*N;
00076 afterN2s.translation=afterNs.translation/2;
00077 }
00078 else
00079 {
00080 double dx=motReq.translation.x;
00081 double dy=motReq.translation.y;
00082 double dr=motReq.rotation;
00083 afterNs.translation.x=(dy*(cos(dr*N)-1)+dx*sin(dr*N))/dr;
00084 afterNs.translation.y=(dx*(1-cos(dr*N))+dy*sin(dr*N))/dr;
00085 afterN2s.translation.x=(dy*(cos(dr*N/2)-1)+dx*sin(dr*N/2))/dr;
00086 afterN2s.translation.y=(dx*(1-cos(dr*N/2))+dy*sin(dr*N/2))/dr;
00087 }
00088
00089 if (fabs(afterNs.rotation)>2.8)
00090 {
00091 currentGT2004ParametersStartPosition=Vector2<double>(-1400,0);
00092
00093 currentGT2004ParametersStartDirection=afterNs.rotation<0?80:-80;
00094 if (fabs(motReq.rotation)>1.5)
00095 {
00096 currentGT2004ParametersStartDirection=0;
00097 }
00098 }
00099 else if (fabs(afterNs.rotation)<1.0)
00100 {
00101 if (afterNs.translation.x>=fabs(afterNs.translation.y))
00102 {
00103 Pose2D start=Pose2D(0,-700,0).minusDiff(afterNs);
00104 currentGT2004ParametersStartPosition=start.translation;
00105 currentGT2004ParametersStartDirection=start.rotation*180/pi;
00106
00107 if (currentGT2004ParametersStartPosition.y>1350)
00108 {
00109 currentGT2004ParametersStartPosition.y=1350;
00110 currentGT2004ParametersStartDirection+=15;
00111 }
00112 else if (currentGT2004ParametersStartPosition.y<-1350)
00113 {
00114 currentGT2004ParametersStartPosition.y=-1350;
00115 currentGT2004ParametersStartDirection-=15;
00116 }
00117 }
00118 else if (afterNs.translation.x<=-fabs(afterNs.translation.y))
00119 {
00120 currentGT2004ParametersStartPosition=Vector2<double>(-700,0);
00121 currentGT2004ParametersStartDirection=0;
00122 if (afterNs.translation.y>1350)
00123 {
00124 currentGT2004ParametersStartDirection=20;
00125 }
00126 else if (afterNs.translation.y<-1350)
00127 {
00128 currentGT2004ParametersStartDirection=20;
00129 }
00130 }
00131 else
00132 {
00133 Pose2D start=Pose2D(0,-1500,0).minusDiff(afterN2s);
00134 currentGT2004ParametersStartPosition=start.translation;
00135 currentGT2004ParametersStartDirection=start.rotation*180/pi;
00136 }
00137 }
00138 else
00139 {
00140 double rat=fabs(GT2004ParametersSet::getRatio(motReq));
00141 if ((afterNs.translation.x>=fabs(afterNs.translation.y))&&(rat<0.2))
00142 {
00143 Pose2D start=Pose2D(afterNs.rotation/2.1,-900,0).minusDiff(afterNs);
00144 currentGT2004ParametersStartPosition=start.translation;
00145 currentGT2004ParametersStartDirection=start.rotation*180/pi;
00146 }
00147 else if ((afterNs.translation.x<=-fabs(afterNs.translation.y))&&(rat<0.2))
00148 {
00149 currentGT2004ParametersStartPosition=Vector2<double>(-800,0);
00150 currentGT2004ParametersStartDirection=-afterNs.rotation/2*180/pi;
00151 }
00152 else
00153 {
00154 Pose2D start=Pose2D(0,-1500,0).minusDiff(afterN2s);
00155 currentGT2004ParametersStartPosition=start.translation;
00156 currentGT2004ParametersStartDirection=start.rotation*180/pi;
00157 }
00158 }
00159 }
00160
00161 bool EvolutionSymbols::getCurrentGT2004ParametersMeasureBlind()
00162 {
00163 return (gt2004ParametersCalibration[gt2004CurrentIndex].translation.abs()==0)?
00164 fabs(measurementRequest.rotation)>0.55:
00165 fabs(measurementRequest.rotation+gt2004ParametersCalibration[gt2004CurrentIndex].rotation)>1.1;
00166 }
00167
00168 double EvolutionSymbols::getQualityOfCurrentGT2004Parameters()
00169 {
00170 if (gt2004CurrentIndex>=0)
00171 {
00172 Pose2D fiction=measurementRequest;
00173 Pose2D reality=gt2004ParametersCalibration[gt2004CurrentIndex];
00174
00175 return 20000.0/(200+(fiction-reality).translation.abs());
00176 }
00177 else
00178 {
00179 return 0;
00180 }
00181 }
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370