00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "OpenChallengeSymbols.h"
00010 #include "Tools/Math/Geometry.h"
00011 #include "Tools/FieldDimensions.h"
00012
00013
00014 OCSetStatus2 ocstate(dtt_initial);
00015 bool g_changetorip(false);
00016
00017 OpenChallengeSymbols::OpenChallengeSymbols(const BehaviorControlInterfaces& interfaces)
00018 : BehaviorControlInterfaces(interfaces)
00019 {
00020 ocStatus = initial;
00021
00022 m_walkRequest.type = 0;
00023 m_walkRequest.x = 0;
00024 m_walkRequest.y = 0;
00025 m_walkRequest.rotation = 0;
00026
00027 int i;
00028 for (i = 0; i < BitePoint::numOfPositions; ++i)
00029 bitePointReady[i] = false;
00030
00031
00032
00033 bitePointToUse[Player::one] = BitePoint::frontleft;
00034 bitePointToUse[Player::two] = BitePoint::frontright;
00035 bitePointToUse[Player::three] = BitePoint::behindleft;
00036 bitePointToUse[Player::four] = BitePoint::behindright;
00037
00038 bitePointToUse[Player::five] = BitePoint::master;
00039 masterDog = Player::five;
00040 bitePointReady[BitePoint::master] = true;
00041
00042 learnAcc = 0;
00043 groundVal.reset(50);
00044 ambVal = 0;
00045
00046 }
00047
00048
00049 void OpenChallengeSymbols::registerSymbols(Xabsl2Engine& engine)
00050 {
00051 engine.registerDecimalInputSymbol("open-challenge.walk-request.type",&(m_walkRequest.type));
00052 engine.registerDecimalInputSymbol("open-challenge.walk-request.x",&(m_walkRequest.x));
00053 engine.registerDecimalInputSymbol("open-challenge.walk-request.y",&(m_walkRequest.y));
00054 engine.registerDecimalInputSymbol("open-challenge.walk-request.rotation",&(m_walkRequest.rotation));
00055
00056 engine.registerDecimalInputSymbol("open-challenge.headrot",&(m_headrot));
00057
00058
00059 engine.registerEnumeratedOutputSymbol("open-challenge.set-status-dtt",this, (void (Xabsl2FunctionProvider::*)(int))&OpenChallengeSymbols::setOCStatusDtt);
00060 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status-dtt","open-challenge.set-dtt-initial", dtt_initial);
00061 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status-dtt","open-challenge.set-dtt-start",dtt_start);
00062 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status-dtt","open-challenge.set-dtt-finishedIntro",dtt_finishedIntro);
00063 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status-dtt","open-challenge.set-dtt-finishedGoToBridge",dtt_finishedGoToBridge);
00064 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status-dtt","open-challenge.set-dtt-finishedClimbBridge",dtt_finishedClimbBridge);
00065 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status-dtt","open-challenge.set-dtt-finishedWalkWithBridge",dtt_finishedWalkWithBridge);
00066 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status-dtt","open-challenge.set-dtt-finishedGoToBitePoint",dtt_finishedGoToBitePoint);
00067 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status-dtt","open-challenge.set-dtt-finishedBite",dtt_finishedBite);
00068 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status-dtt","open-challenge.set-dtt-LoseBitePoints",dtt_loseBitePoints);
00069 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status-dtt","open-challenge.set-dtt-finishedExtro",dtt_finishedExtro);
00070 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status-dtt","open-challenge.set-dtt-finished",dtt_finished);
00071
00072
00073 engine.registerEnumeratedInputSymbol("open-challenge.bridge.last-seen-side", this,
00074 (int (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getLastSeenSide);
00075 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.bridge.last-seen-side", "open-challenge.bridge.seen-none", OCBridge::none);
00076 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.bridge.last-seen-side", "open-challenge.bridge.seen-left", OCBridge::left);
00077 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.bridge.last-seen-side", "open-challenge.bridge.seen-right", OCBridge::right);
00078
00079
00080 engine.registerDecimalInputSymbol("open-challenge.bridge.seen.distance",this,
00081 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSeenDistanceToBridge);
00082
00083
00084 engine.registerDecimalInputSymbol("open-challenge.bridge.seen.angle",this,
00085 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSeenAngleToBridge);
00086
00087
00088 engine.registerDecimalInputSymbol("open-challenge.bridge.time-since-last-seen",this,
00089 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getTimeSinceLastSeenBridge);
00090
00091
00092 engine.registerEnumeratedInputSymbol("open-challenge.bite-point.position", this,
00093 (int (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getBitePointPosition);
00094 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.bite-point.position", "open-challenge.bite-point.frontleft", BitePoint::frontleft);
00095 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.bite-point.position", "open-challenge.bite-point.frontright", BitePoint::frontright);
00096 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.bite-point.position", "open-challenge.bite-point.behindleft", BitePoint::behindleft);
00097 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.bite-point.position", "open-challenge.bite-point.behindright", BitePoint::behindright);
00098 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.bite-point.position", "open-challenge.bite-point.master", BitePoint::master);
00099
00100
00101 engine.registerDecimalInputSymbol("open-challenge.bite-point.seen.distance",this,
00102 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSeenDistanceToBitePoint);
00103
00104
00105 engine.registerDecimalInputSymbol("open-challenge.bite-point.seen.angle",this,
00106 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSeenAngleToBitePoint);
00107
00108
00109 engine.registerDecimalInputSymbol("open-challenge.bite-point.precise-shift",this,
00110 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getPreciseShiftToBitePoint);
00111
00112
00113 engine.registerDecimalInputSymbol("open-challenge.bite-point.time-since-last-seen",this,
00114 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getTimeSinceLastSeenBitePoint);
00115
00116
00117 engine.registerEnumeratedInputSymbol("open-challenge.status",(int*)&ocStatus);
00118 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.status", "open-challenge.initial", initial);
00119 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.status", "open-challenge.intro", intro);
00120 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.status", "open-challenge.goToBridge", goToBridge);
00121 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.status", "open-challenge.goToBitePoint", goToBitePoint);
00122 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.status", "open-challenge.allBitePointsReady", allBitePointsReady);
00123 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.status", "open-challenge.walkWithBridge", walkWithBridge);
00124 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.status", "open-challenge.extro", extro);
00125 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.status", "open-challenge.finished", finished);
00126
00127
00128 engine.registerEnumeratedOutputSymbol("open-challenge.set-status",this,
00129 (void (Xabsl2FunctionProvider::*)(int))&OpenChallengeSymbols::setOCStatus);
00130 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status","open-challenge.set-initial", setInitial);
00131 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status","open-challenge.set-intro", setIntro);
00132 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status","open-challenge.set-goToBridge", setGoToBridge);
00133 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status","open-challenge.set-goToBitePoint", setGoToBitePoint);
00134 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status","open-challenge.set-myBitePointIsReady", setMyBitePointIsReady);
00135 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status","open-challenge.set-lostMyBitePoint", setLostMyBitePoint);
00136 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status","open-challenge.set-walkWithBridge", setWalkWithBridge);
00137 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status","open-challenge.set-extro", setExtro);
00138 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-status","open-challenge.set-finished", setFinished);
00139
00140
00141 engine.registerDecimalInputSymbol("open-challenge.time-since-red-line-last-seen",this,
00142 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getTimeSinceLastSeenRedLine);
00143 engine.registerDecimalInputSymbol("open-challenge.red-line-angle-in-image", this,
00144 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::redLineInImageAngle);
00145 engine.registerDecimalInputSymbol("open-challenge.red-line-angle", this,
00146 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::redLineAngle);
00147 engine.registerDecimalInputSymbol("open-challenge.ramp.lowest-line-point.distance", this,
00148 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSeenDistanceToRedLine);
00149
00150
00151 engine.registerDecimalInputSymbol("open-challenge.headpsd.near",this,
00152 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSensorPSDNear);
00153 engine.registerDecimalInputSymbol("open-challenge.headpsd.far",this,
00154 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSensorPSDFar);
00155 engine.registerDecimalInputSymbol("open-challenge.distance-to-sifoc",this,
00156 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getDistanceToSIFOC);
00157
00158
00159 engine.registerDecimalInputSymbol("open-challenge.accelerator.x",this,
00160 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSensorAccelerationX);
00161 engine.registerDecimalInputSymbol("open-challenge.accelerator.y",this,
00162 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSensorAccelerationY);
00163 engine.registerDecimalInputSymbol("open-challenge.accelerator.z",this,
00164 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSensorAccelerationZ);
00165
00166
00167 engine.registerEnumeratedOutputSymbol("open-challenge.learning", (int*)&learnAcc);
00168 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.learning","open-challenge.learn-on", 1);
00169 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.learning","open-challenge.learn-none", 0);
00170
00171
00172 engine.registerEnumeratedOutputSymbol("open-challenge.set-image",this, (void (Xabsl2FunctionProvider::*)(int))&OpenChallengeSymbols::setRIP);
00173 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-image","open-challenge.disable-RIP", unchanged);
00174 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-image","open-challenge.enable-RIP",rip);
00175
00176
00177 engine.registerDecimalInputSymbol("open-challenge.on-ramp",this,
00178 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getAiboOnRamp);
00179 engine.registerDecimalInputSymbol("ramp.angle-of-line",this,
00180 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getRampAngleOfRedLine);
00181 engine.registerDecimalInputSymbol("ramp.lowest-line-point.x",this,
00182 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getRampLowestLinePointX);
00183 engine.registerDecimalInputSymbol("open-challenge.ramp.lowest-line-point.y",this,
00184 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getRampLowestLinePointY);
00185 engine.registerDecimalInputSymbol("ramp.highest-line-point.x",this,
00186 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getRampHighestLinePointX);
00187 engine.registerDecimalInputSymbol("ramp.highest-line-point.y",this,
00188 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getRampHighestLinePointY);
00189 engine.registerDecimalInputSymbol("ramp.lowest-line-point.distance",this,
00190 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getRampDistanceToStartPoint);
00191 engine.registerDecimalInputSymbol("open-challenge.ramp.time-since-last-seen",this,
00192 (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getRampTimeSinceLastSeen);
00193
00194
00195 engine.registerEnumeratedOutputSymbol("open-challenge.set-already-moved-bridge", (int*)&ambVal);
00196 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-already-moved-bridge","open-challenge.set-amb-yes", 1);
00197 engine.registerEnumeratedOutputSymbolEnumElement("open-challenge.set-already-moved-bridge","open-challenge.set-amb-no" , 0);
00198
00199
00200 engine.registerEnumeratedInputSymbol("open-challenge.already-moved-bridge",(int*)&ambVal);
00201 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.already-moved-bridge", "open-challenge.amb-yes", 1);
00202 engine.registerEnumeratedInputSymbolEnumElement("open-challenge.already-moved-bridge", "open-challenge.amb-no", 0);
00203
00204
00205
00206 }
00207
00208 void OpenChallengeSymbols::update()
00209 {
00210
00211 m_headrot = toDegrees(fromMicroRad(sensorDataBuffer.lastFrame().data[SensorData::headPan]));
00212
00213 if (learnAcc == 1)
00214 {
00215 groundVal.add(xspeed.getAverage());
00216 groundVal.trigger();
00217 }
00218
00219 double phi(0);
00220 double x,y,r;
00221
00222 double l(300),b(350);
00223
00224
00225 int playnum = getPlayer().getPlayerNumber();
00226 bool left = (bitePointToUse[playnum] == BitePoint::frontleft)
00227 | (bitePointToUse[playnum] == BitePoint::behindleft);
00228 bool front = (bitePointToUse[playnum] == BitePoint::frontleft)
00229 | (bitePointToUse[playnum] == BitePoint::frontright);
00230
00231 Vector2<double> pos, nexpos;
00232
00233 if (!left)
00234 b *= -1;
00235 if (!front)
00236 l *= -1;
00237
00238 int ii = 0;
00239 for (int j = 0; j< Player::numOfPlayerNumbers; j++)
00240 {
00241 if ( teamMessageCollection[j].playerNumberOfSender == masterDog)
00242 ii = j;
00243 }
00244
00245 m_walkRequest.type
00246 = teamMessageCollection[ii].behaviorTeamMessage.walkRequest.type;
00247 x = teamMessageCollection[ii].behaviorTeamMessage.walkRequest.x;
00248 y = teamMessageCollection[ii].behaviorTeamMessage.walkRequest.y;
00249 r = -(teamMessageCollection[ii].behaviorTeamMessage.walkRequest.rotation);
00250
00251 r = fromDegrees(r);
00252
00253 Vector2<double> s(0,0),srtmp(1,0), sr(1,0);
00254 sr.normalize();
00255
00256 phi = sr.angle();
00257 pos = s+(sr*l+sr.rotateLeft()*b);
00258 sr.rotateRight();
00259
00260
00261 s.x = x;
00262 s.y = y;
00263 srtmp.x = sr.x * cos(r)+sr.y*sin(r);
00264 srtmp.y = sr.y * cos(r)-sr.x*sin(r);
00265 sr = srtmp;
00266 nexpos = s+(sr*l+sr.rotateLeft()*b);
00267 sr.rotateRight();
00268
00269 pos = nexpos-pos;
00270
00271 if (left)
00272 pos.rotateLeft();
00273 else
00274 pos.rotateRight();
00275
00276 r = sr.angle()-phi;
00277
00278 r = toDegrees(r);
00279
00280 m_walkRequest.x = pos.x;
00281 m_walkRequest.y = pos.y;
00282 m_walkRequest.rotation = r;
00283
00284
00285
00286 {
00287 for (int i = 0; i < Player::numOfPlayerNumbers-1; ++i)
00288 if ((teamMessageCollection[i].isActual()) &&
00289 (teamMessageCollection[i].playerNumberOfSender != Player::undefinedPlayerNumber))
00290 {
00291 if (teamMessageCollection[i].playerNumberOfSender == masterDog)
00292 switch (teamMessageCollection[i].behaviorTeamMessage.ocStatus)
00293 {
00294 case setInitial : ocStatus = initial; break;
00295 case setIntro : ocStatus = intro; break;
00296 case setGoToBridge : ocStatus = goToBridge; break;
00297 case setGoToBitePoint : ocStatus = goToBitePoint; break;
00298 case setWalkWithBridge : ocStatus = walkWithBridge; break;
00299 case setExtro : ocStatus = extro; break;
00300 case setFinished : ocStatus = finished; break;
00301 }
00302
00303 if (teamMessageCollection[i].behaviorTeamMessage.ocStatus == setMyBitePointIsReady)
00304 bitePointReady[bitePointToUse[teamMessageCollection[i].playerNumberOfSender]] = true;
00305 if (teamMessageCollection[i].behaviorTeamMessage.ocStatus == setLostMyBitePoint)
00306 bitePointReady[bitePointToUse[teamMessageCollection[i].playerNumberOfSender]] = false;
00307 }
00308 }
00309
00310 int allReady = 1;
00311 int k;
00312 for (k = 0; k < BitePoint::numOfPositions; ++k)
00313 allReady *= bitePointReady[k];
00314 if ((allReady) &&
00315 (ocStatus == goToBitePoint))
00316 ocStatus = allBitePointsReady;
00317 if ((!allReady) &&
00318 ((ocStatus == allBitePointsReady) || (ocStatus == walkWithBridge)))
00319 ocStatus = goToBitePoint;
00320
00321
00322
00323
00324 SpecialPercept& sp = const_cast<SpecialPercept&>(specialPercept);
00325 if (sp.ocBridge.fresh) {
00326 sp.ocBridge.fresh = false;
00327 } else {
00328 sp.ocBridge.relPos =
00329 (sp.ocBridge.lastOdometry + Pose2D(sp.ocBridge.relPos) - odometryData).translation;
00330 sp.ocBridge.distanceTo = sp.ocBridge.relPos.abs();
00331 sp.ocBridge.angleTo =
00332 (sgn(sp.ocBridge.relPos.y) * asin(fabs(sp.ocBridge.relPos.y)/(fabs(sp.ocBridge.distanceTo)+1))) +
00333 (odometryData.rotation - sp.ocBridge.lastOdometry.rotation);
00334 }
00335 sp.ocBridge.lastOdometry = odometryData;
00336 for (k = 0; k < BitePoint::numOfPositions; ++k)
00337 {
00338 if (sp.ocBridge.bitePoint[k].fresh) {
00339 sp.ocBridge.bitePoint[k].fresh = false;
00340 } else {
00341 sp.ocBridge.bitePoint[k].relPos =
00342 (sp.ocBridge.bitePoint[k].lastOdometry + Pose2D(sp.ocBridge.bitePoint[k].relPos) - odometryData).translation;
00343 sp.ocBridge.bitePoint[k].distanceTo = sp.ocBridge.bitePoint[k].relPos.abs();
00344 sp.ocBridge.bitePoint[k].angleTo =
00345 (sgn(sp.ocBridge.bitePoint[k].relPos.y) * asin(fabs(sp.ocBridge.bitePoint[k].relPos.y)/(fabs(sp.ocBridge.bitePoint[k].distanceTo)+1))) +
00346 (odometryData.rotation - sp.ocBridge.bitePoint[k].lastOdometry.rotation);
00347
00348 }
00349 sp.ocBridge.bitePoint[k].lastOdometry = odometryData;
00350 }
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368 }
00369
00370 OCBridge::Side OpenChallengeSymbols::getLastSeenSide()
00371 {
00372 return specialPercept.ocBridge.lastSeenSide;
00373 }
00374
00375 double OpenChallengeSymbols::getSeenDistanceToBridge()
00376 {
00377 return specialPercept.ocBridge.distanceTo;
00378 }
00379
00380 double OpenChallengeSymbols::getSeenAngleToBridge()
00381 {
00382 return toDegrees(specialPercept.ocBridge.angleTo);
00383 }
00384
00385 double OpenChallengeSymbols::getTimeSinceLastSeenBridge()
00386 {
00387 return SystemCall::getTimeSince(specialPercept.ocBridge.timeWhenLastSeen);
00388 }
00389
00390 BitePoint::Position OpenChallengeSymbols::getBitePointPosition()
00391 {
00392 return specialPercept.ocBridge.bitePoint[bitePointToUse[getPlayer().getPlayerNumber()]].position;
00393 }
00394
00395 double OpenChallengeSymbols::getSeenDistanceToBitePoint()
00396 {
00397 return specialPercept.ocBridge.bitePoint[bitePointToUse[getPlayer().getPlayerNumber()]].distanceTo;
00398 }
00399
00400 double OpenChallengeSymbols::getSeenAngleToBitePoint()
00401 {
00402 return toDegrees(specialPercept.ocBridge.bitePoint[bitePointToUse[getPlayer().getPlayerNumber()]].angleTo);
00403 }
00404
00405 double OpenChallengeSymbols::getPreciseShiftToBitePoint()
00406 {
00407 return specialPercept.ocBridge.bitePoint[bitePointToUse[getPlayer().getPlayerNumber()]].preciseShift;
00408 }
00409
00410 double OpenChallengeSymbols::getTimeSinceLastSeenBitePoint()
00411 {
00412 return SystemCall::getTimeSince(specialPercept.ocBridge.bitePoint[bitePointToUse[getPlayer().getPlayerNumber()]].timeWhenLastSeen);
00413 }
00414
00415 void OpenChallengeSymbols::setOCStatus(int aStatus)
00416 {
00417 outgoingBehaviorTeamMessage.ocStatus = aStatus;
00418 if (getPlayer().getPlayerNumber() == masterDog)
00419 switch (aStatus)
00420 {
00421 case setInitial : ocStatus = initial; break;
00422 case setIntro : ocStatus = intro; break;
00423 case setGoToBridge : ocStatus = goToBridge; break;
00424 case setGoToBitePoint : ocStatus = goToBitePoint; break;
00425 case setWalkWithBridge : ocStatus = walkWithBridge; break;
00426 case setExtro : ocStatus = extro; break;
00427 case setFinished : ocStatus = finished; break;
00428 }
00429 else
00430 switch (aStatus)
00431 {
00432 case setMyBitePointIsReady : bitePointReady[bitePointToUse[getPlayer().getPlayerNumber()]] = true; break;
00433 case setLostMyBitePoint : bitePointReady[bitePointToUse[getPlayer().getPlayerNumber()]] = false; break;
00434 }
00435 }
00436
00437
00438
00439 double OpenChallengeSymbols::getSensorPSDNear()
00440 {
00441 double tmpdata = 0;
00442 for (int i = 0; i < sensorDataBuffer.numOfFrames; ++i)
00443 tmpdata += sensorDataBuffer.frame[i].data[SensorData::headPsdNear];
00444 if (sensorDataBuffer.numOfFrames !=0)
00445 tmpdata /= sensorDataBuffer.numOfFrames;
00446 else
00447 tmpdata=0;
00448 return tmpdata;
00449 }
00450
00451
00452 double OpenChallengeSymbols::getSensorPSDFar()
00453 {
00454 double tmpdata = 0;
00455 for (int i = 0; i < sensorDataBuffer.numOfFrames; ++i)
00456 tmpdata += sensorDataBuffer.frame[i].data[SensorData::headPsdFar];
00457 if (sensorDataBuffer.numOfFrames !=0)
00458 tmpdata /= sensorDataBuffer.numOfFrames;
00459 else
00460 tmpdata=0;
00461 return tmpdata;
00462 }
00463
00464
00465 double OpenChallengeSymbols::getDistanceToSIFOC()
00466 {
00467 double value = 50;
00468 double psdval = 0;
00469 for (int i = 0; i < psdPercept.numOfPercepts; ++i)
00470 psdval += psdPercept[i].body;
00471 psdval /= (double)(psdPercept.numOfPercepts);
00472 if (psdval >= 170)
00473 psdval = 170;
00474
00475
00476 if (psdval >= 160)
00477 value = 10-(psdval-160);
00478 else
00479
00480 if (psdval >= 145)
00481 value = ((15-(psdval-145))/1.5)+10;
00482 else
00483
00484 if (psdval >= 130)
00485 value = ((15-(psdval-130))/0.75)+20;
00486
00487 return value;
00488 }
00489
00490
00491
00492 double OpenChallengeSymbols::getSensorAccelerationX()
00493 {
00494 double tmpdata = 0;
00495 for (int i = 0; i < sensorDataBuffer.numOfFrames; ++i)
00496 tmpdata += toDegrees(fromMicroRad(sensorDataBuffer.frame[i].data[SensorData::accelerationX]));
00497 if (sensorDataBuffer.numOfFrames !=0)
00498 tmpdata /= sensorDataBuffer.numOfFrames;
00499 else
00500 tmpdata=0;
00501 return tmpdata;
00502 }
00503
00504
00505 double OpenChallengeSymbols::getSensorAccelerationY()
00506 {
00507 double tmpdata = 0;
00508 for (int i = 0; i < sensorDataBuffer.numOfFrames; ++i)
00509 tmpdata += toDegrees(fromMicroRad(sensorDataBuffer.frame[i].data[SensorData::accelerationY]));
00510 if (sensorDataBuffer.numOfFrames !=0)
00511 tmpdata /= sensorDataBuffer.numOfFrames;
00512 else
00513 tmpdata=0;
00514 return tmpdata;
00515 }
00516
00517
00518 double OpenChallengeSymbols::getSensorAccelerationZ()
00519 {
00520 double tmpdata = 0;
00521 for (int i = 0; i < sensorDataBuffer.numOfFrames; ++i)
00522 tmpdata += toDegrees(fromMicroRad(sensorDataBuffer.frame[i].data[SensorData::accelerationZ]));
00523 if (sensorDataBuffer.numOfFrames !=0)
00524 tmpdata /= sensorDataBuffer.numOfFrames;
00525 else
00526 tmpdata=0;
00527 return tmpdata;
00528 return toDegrees(fromMicroRad(sensorDataBuffer.lastFrame().data[SensorData::accelerationZ]));
00529 }
00530
00531
00532
00533
00534 double OpenChallengeSymbols::redLineInImageAngle()
00535 {
00536 return specialPercept.ocRedLine.angleInImage-90;
00537 }
00538
00539
00540 double OpenChallengeSymbols::redLineAngle()
00541 {
00542 return toDegrees(specialPercept.ocRedLine.lineStart.angle());
00543 }
00544
00545
00546 double OpenChallengeSymbols::getTimeSinceLastSeenRedLine()
00547 {
00548 return SystemCall::getCurrentSystemTime()-specialPercept.ocRedLine.timeWhenLastSeen;
00549 }
00550
00551
00552 double OpenChallengeSymbols::getSeenDistanceToRedLine()
00553 {
00554 return specialPercept.ocRedLine.lineStart.abs();
00555 }
00556
00557
00558
00559
00560 void OpenChallengeSymbols::setRIP(int t)
00561 {
00562 switch(t)
00563 {
00564 case rip:
00565 g_changetorip = true;
00566 break;
00567 default:
00568 g_changetorip = false;
00569 }
00570 }
00571
00572
00573
00574
00575 double OpenChallengeSymbols::getAiboOnRamp()
00576 {
00577 xspeed.add(int(getSensorAccelerationX()));
00578 xspeed.trigger();
00579
00580 if (xspeed.getAverage() > 40 )
00581 return 1;
00582 return 0;
00583 }
00584
00585
00586 double OpenChallengeSymbols::getRampAngleOfRedLine()
00587 {
00588 return specialPercept.ocRedLine.angleInImage;
00589 }
00590
00591
00592 double OpenChallengeSymbols::getRampLowestLinePointX()
00593 {
00594 return specialPercept.ocRedLine.lineStart.x;
00595 }
00596
00597
00598 double OpenChallengeSymbols::getRampLowestLinePointY()
00599 {
00600 return specialPercept.ocRedLine.lineStart.y;
00601 }
00602
00603
00604 double OpenChallengeSymbols::getRampHighestLinePointX()
00605 {
00606 return specialPercept.ocRedLine.lineEnd.x;
00607 }
00608
00609
00610 double OpenChallengeSymbols::getRampHighestLinePointY()
00611 {
00612 return specialPercept.ocRedLine.lineEnd.y;
00613 }
00614
00615
00616 double OpenChallengeSymbols::getRampDistanceToStartPoint()
00617 {
00618 return specialPercept.ocRedLine.lineStart.abs();
00619 }
00620
00621
00622 double OpenChallengeSymbols::getRampTimeSinceLastSeen()
00623 {
00624 return SystemCall::getTimeSince(specialPercept.ocRedLine.timeWhenLastSeen);
00625 }
00626
00627
00628
00629
00630 void OpenChallengeSymbols::setOCStatusDtt(int aStatus)
00631 {
00632 ocstate = (OCSetStatus2)aStatus;
00633 }
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684