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

Modules/BehaviorControl/GT2004BehaviorControl/GT2004Symbols/OpenChallengeSymbols.cpp

Go to the documentation of this file.
00001 /** 
00002 * @file OpenChallengeSymbols.cpp
00003 *
00004 * Implementation of class OpenChallengeSymbols.
00005 *
00006 * @author 
00007 */
00008 
00009 #include "OpenChallengeSymbols.h"
00010 #include "Tools/Math/Geometry.h"
00011 #include "Tools/FieldDimensions.h"
00012 
00013 // this will be changed until release...
00014 OCSetStatus2 ocstate(dtt_initial);
00015 bool g_changetorip(false);//hack for swich fast from GT2004 ImgeProcessor to RIP
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   // mapping player numbers to bitePoints
00032   // change mapping here, if u want to
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   // masterdog doesnt use this... just for integrity
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   // set dtt stati
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   // bridge.last-seen-side 
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   // bridge.seen.distance
00080   engine.registerDecimalInputSymbol("open-challenge.bridge.seen.distance",this,
00081     (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSeenDistanceToBridge);
00082 
00083   // bridge.seen.angle
00084   engine.registerDecimalInputSymbol("open-challenge.bridge.seen.angle",this,
00085     (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSeenAngleToBridge);
00086 
00087   // bridge.time-since-last-seen
00088   engine.registerDecimalInputSymbol("open-challenge.bridge.time-since-last-seen",this,
00089     (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getTimeSinceLastSeenBridge);
00090 
00091   // bite-point.position 
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   // bite-point.seen.distance
00101   engine.registerDecimalInputSymbol("open-challenge.bite-point.seen.distance",this,
00102     (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSeenDistanceToBitePoint);
00103 
00104   // bite-point.seen.angle
00105   engine.registerDecimalInputSymbol("open-challenge.bite-point.seen.angle",this,
00106     (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getSeenAngleToBitePoint);
00107 
00108   // bite-point.precise-shift
00109   engine.registerDecimalInputSymbol("open-challenge.bite-point.precise-shift",this,
00110     (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getPreciseShiftToBitePoint);
00111 
00112   // bite-point.time-since-last-seen
00113   engine.registerDecimalInputSymbol("open-challenge.bite-point.time-since-last-seen",this,
00114     (double (Xabsl2FunctionProvider::*)())&OpenChallengeSymbols::getTimeSinceLastSeenBitePoint);
00115 
00116   // open-challenge.status 
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   // "open-challenge.set-status"
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   // RedLine
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   // psd data
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   // acceleration data
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   // learning acceleration data
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   // enable disable RIP
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   // ramp
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   // set-already-moved-bridge
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   // get already-moved-bridge
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   //verdrehung des aibos
00211    m_headrot = toDegrees(fromMicroRad(sensorDataBuffer.lastFrame().data[SensorData::headPan]));
00212   //lernen für die gyros...
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 //  double l(35),b(25);
00222   double l(300),b(350);
00223   // Vorzeichen l,b  hängt vom Hund ab
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 //  sr.x = 1;sr.y = 0;
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   // send ocStatus
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   /** normally the following stuff should be placed inside an BridgeLocator module.. 
00322       so this is near to a hack ;-) */
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  if(ocStatus == initial)
00353  {
00354     //just for fun
00355     int ii = 0;
00356     for (int j = 0; j< Player::numOfPlayerNumbers; j++)
00357     {
00358       if ( teamMessageCollection[j].playerNumberOfSender == masterDog)
00359         ii = j;
00360     }
00361     m_walkRequest.type 
00362       = teamMessageCollection[ii].behaviorTeamMessage.walkRequest.type;
00363     m_walkRequest.x = teamMessageCollection[ii].behaviorTeamMessage.walkRequest.x;
00364     m_walkRequest.y = teamMessageCollection[ii].behaviorTeamMessage.walkRequest.y;
00365     m_walkRequest.rotation = teamMessageCollection[ii].behaviorTeamMessage.walkRequest.rotation;
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 // PSD
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   // from 160 to 170 equals from 1cm to 0cm
00476   if (psdval >= 160)
00477     value = 10-(psdval-160);
00478   else
00479   // from 145 to 160 equals from 2cm to 1cm
00480   if (psdval >= 145)
00481     value = ((15-(psdval-145))/1.5)+10;
00482   else
00483   // from 130 to 145 equals from 4cm to 2cm
00484   if (psdval >= 130)
00485     value = ((15-(psdval-130))/0.75)+20;
00486 
00487   return value;
00488 }
00489 
00490 // acceleration
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 // IMAGE PROCESSSING INPUTS
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 // IMAGE PROCESSSING OUTPUTS
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 // ramp functions
00573 //----------------------------------------------------------------------------
00574 //----------------------------------------------------------------------------
00575 double OpenChallengeSymbols::getAiboOnRamp()
00576 {
00577   xspeed.add(int(getSensorAccelerationX()));
00578   xspeed.trigger();
00579 //  if (xspeed.getAverage()>(groundVal.getAverage()))
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 // dtt stati
00628 //----------------------------------------------------------------------------
00629 //----------------------------------------------------------------------------
00630 void OpenChallengeSymbols::setOCStatusDtt(int aStatus)
00631 {
00632   ocstate = (OCSetStatus2)aStatus;
00633 }
00634 
00635 
00636 
00637 
00638 
00639 /*
00640 * Change Log
00641 * 
00642 * $Log: OpenChallengeSymbols.cpp,v $
00643 * Revision 1.5  2004/08/09 13:51:27  hamerla
00644 * import OpenChallen Behavior to WM
00645 *
00646 * Revision 1.4  2004/07/22 22:38:20  kerdels
00647 * added DTT used by Open Challenge, RIP and Xabsl-Options will follow
00648 *
00649 * Revision 1.3  2004/06/16 14:42:24  risler
00650 * renamed some open challenge symbols
00651 *
00652 * Revision 1.2  2004/06/01 13:58:14  schumann
00653 * special percept type redLine added,
00654 * part 1 of open challenge added
00655 *
00656 * Revision 1.1.1.1  2004/05/22 17:18:04  cvsadm
00657 * created new repository GT2004_WM
00658 *
00659 * Revision 1.7  2004/05/21 16:32:43  hamerla
00660 * no message
00661 *
00662 * Revision 1.6  2004/05/20 16:30:03  kerdels
00663 * further work on open challenge
00664 *
00665 * Revision 1.5  2004/05/17 18:20:00  kerdels
00666 * adjusted symbols for open challenge to enable free mapping of players to bitePoints- and controllerpositions
00667 *
00668 * Revision 1.4  2004/05/17 17:17:50  kerdels
00669 * added symbols for the sequence control of the open challenge,
00670 * fixed a bug concerning 5-dog-mode and distribution of option-ratings,
00671 * set one = 0 in enum Player::playerNumber --> just to be sure ;-)
00672 *
00673 * Revision 1.3  2004/05/17 01:56:15  kerdels
00674 * prepared some symbols for the open challenge bridge detection
00675 *
00676 * Revision 1.2  2004/05/13 22:22:41  hamerla
00677 * OpenChallenge walk with bridge
00678 *
00679 * Revision 1.1  2004/05/08 16:18:14  hamerla
00680 * Open Challenge
00681 *
00682 *
00683 */
00684 

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