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

Modules/BehaviorControl/KickLogger.cpp

Go to the documentation of this file.
00001 /**
00002 * @file KickLogger.cpp
00003 * 
00004 * Implementation of class KickLogger.
00005 *
00006 * @author Martin Lötzsch
00007 */
00008 
00009 #include "KickLogger.h"
00010 #include "Platform/SystemCall.h"
00011 #include "Platform/GTAssert.h"
00012 #include "Tools/Math/Geometry.h"
00013 
00014 KickLogger::KickLogger(BehaviorControlInterfaces& interfaces)
00015 : timeOfLastStateChange(SystemCall::getCurrentSystemTime()),
00016 BehaviorControlInterfaces(interfaces), state(initial)
00017 {
00018 }
00019 
00020 KickLogger::~KickLogger()
00021 {
00022 }
00023 
00024 void KickLogger::execute()
00025 {
00026   switch (state)
00027   {
00028   case initial:
00029     if (motionRequest.motionType == MotionRequest::specialAction
00030       && SystemCall::getTimeSince(ballModel.seen.timeWhenLastSeen) < 500
00031       && Geometry::distanceTo(robotPose.getPose(),ballModel.seen.positionField) < 350)
00032     {
00033       kick.ballXR = getBallX(robotPose);
00034       kick.ballYR = getBallY(robotPose);
00035       kick.ballTR = SystemCall::getTimeSince(ballModel.seen.timeWhenLastSeen);
00036       kickID = motionRequest.specialActionRequest.specialActionType;
00037       odometryDataWhenKickWasStarted = odometryData;
00038       changeState(kickRequested);
00039     }
00040     break;
00041 
00042   case kickRequested:
00043     if (motionInfo.executedMotionRequest.motionType == MotionRequest::specialAction)
00044     {
00045       Pose2D odometryDiff = odometryData- odometryDataWhenKickWasStarted;
00046       Pose2D relativePoseWhenStarted = robotPose.minusDiff(odometryDiff);
00047 
00048       kick.ballXS = getBallX(relativePoseWhenStarted);
00049       kick.ballYS = getBallY(relativePoseWhenStarted);
00050       kick.ballTS = SystemCall::getTimeSince(ballModel.seen.timeWhenLastSeen);
00051       changeState(kickStarted);
00052     }
00053     break;
00054 
00055   case kickStarted:
00056     if (motionInfo.executedMotionRequest.motionType != MotionRequest::specialAction)
00057     {
00058       changeState(kickFinished);
00059     }
00060     break;
00061 
00062   case kickFinished:
00063     if (motionInfo.executedMotionRequest.motionType == MotionRequest::specialAction)
00064     {
00065       changeState(wait);
00066     }
00067     if (SystemCall::getTimeSince(timeOfLastStateChange) > 2000)
00068     {
00069       changeState(waitingForBall);
00070     }
00071     break;
00072 
00073   case waitingForBall:
00074     if (motionInfo.executedMotionRequest.motionType == MotionRequest::specialAction)
00075     {
00076       changeState(wait);
00077     }
00078     if (SystemCall::getTimeSince(ballModel.seen.timeWhenLastSeen) < 100)
00079     {
00080 #ifdef USE_CEILING_CAM
00081       kick.ballXA = gtCamWorldState.getBallModel().seen.positionRobot.x;
00082       kick.ballYA = gtCamWorldState.getBallModel().seen.positionRobot.x;
00083 #else
00084       Pose2D odometryDiff = odometryData - odometryDataWhenKickWasStarted;
00085       Pose2D relativePoseWhenStarted = robotPose.minusDiff(odometryDiff);
00086       kick.ballXA = getBallX(relativePoseWhenStarted);
00087       kick.ballYA = getBallY(relativePoseWhenStarted);
00088 #endif
00089       kick.tA = SystemCall::getTimeSince(timeOfLastStateChange) + 2000;
00090       record();
00091       changeState(wait);
00092     }
00093     if (SystemCall::getTimeSince(timeOfLastStateChange) > 4000)
00094     {
00095       changeState(wait);
00096     }
00097     break;
00098 
00099   case wait:
00100     if (SystemCall::getTimeSince(timeOfLastStateChange) > 3000
00101       && (motionInfo.executedMotionRequest.motionType == MotionRequest::walk
00102       || motionInfo.executedMotionRequest.motionType == MotionRequest::stand))
00103     {
00104       changeState(initial);
00105     }
00106     break;
00107 
00108   default:
00109     ASSERT(false);
00110   }
00111 }
00112 
00113 double KickLogger::getBallX(Pose2D from)
00114 {
00115   return Geometry::distanceTo(from,ballModel.seen.positionField) 
00116     * cos(Geometry::angleTo(from,ballModel.seen.positionField));
00117 }
00118 
00119 double KickLogger::getBallY(Pose2D from)
00120 {
00121   return Geometry::distanceTo(from,ballModel.seen.positionField) 
00122     * sin(Geometry::angleTo(from,ballModel.seen.positionField));
00123 }
00124 
00125 void KickLogger::changeState(State newState)
00126 {
00127   timeOfLastStateChange = SystemCall::getCurrentSystemTime();
00128   state = newState;
00129 //  OUTPUT(idText,text,"KickLogger: changed state to " << state << ".");
00130 }
00131 
00132 void KickLogger::record()
00133 {
00134   INFO(sendKickRecords, idKickRecord, bin, SpecialActionRequest::getSpecialActionIDName(kickID) << kick);
00135 }

Generated on Mon Mar 20 21:59:43 2006 for GT2005 by doxygen 1.3.6