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) < 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       Pose2D odometryDiff = odometryData - odometryDataWhenKickWasStarted;
00081       Pose2D relativePoseWhenStarted = robotPose.minusDiff(odometryDiff);
00082 
00083       kick.ballXA = getBallX(relativePoseWhenStarted);
00084       kick.ballYA = getBallY(relativePoseWhenStarted);
00085       kick.tA = SystemCall::getTimeSince(timeOfLastStateChange) + 2000;
00086       record();
00087       changeState(wait);
00088     }
00089     if (SystemCall::getTimeSince(timeOfLastStateChange) > 4000)
00090     {
00091       changeState(wait);
00092     }
00093     break;
00094 
00095   case wait:
00096     if (SystemCall::getTimeSince(timeOfLastStateChange) > 3000
00097       && (motionInfo.executedMotionRequest.motionType == MotionRequest::walk
00098       || motionInfo.executedMotionRequest.motionType == MotionRequest::stand))
00099     {
00100       changeState(initial);
00101     }
00102     break;
00103 
00104   default:
00105     ASSERT(false);
00106   }
00107 }
00108 
00109 double KickLogger::getBallX(Pose2D from)
00110 {
00111   return Geometry::distanceTo(from,ballModel.seen) 
00112     * cos(Geometry::angleTo(from,ballModel.seen));
00113 }
00114 
00115 double KickLogger::getBallY(Pose2D from)
00116 {
00117   return Geometry::distanceTo(from,ballModel.seen) 
00118     * sin(Geometry::angleTo(from,ballModel.seen));
00119 }
00120 
00121 void KickLogger::changeState(State newState)
00122 {
00123   timeOfLastStateChange = SystemCall::getCurrentSystemTime();
00124   state = newState;
00125 //  OUTPUT(idText,text,"KickLogger: changed state to " << state << ".");
00126 }
00127 
00128 void KickLogger::record()
00129 {
00130   INFO(sendKickRecords, idKickRecord, bin, SpecialActionRequest::getSpecialActionIDName(kickID) << kick);
00131 }
00132 
00133 /*
00134  * Change log :
00135  * 
00136  * $Log: KickLogger.cpp,v $
00137  * Revision 1.5  2004/06/24 18:32:59  risler
00138  * bugfix: odometry calculation corrected
00139  *
00140  * Revision 1.4  2004/06/23 18:18:27  risler
00141  * also log failed kicks
00142  *
00143  * Revision 1.3  2004/06/20 15:22:35  risler
00144  * increased kick editor usability:
00145  * KickLogger now sends kick record via debug key instead of writing to file
00146  * KickEditor automatically displays sent kick records
00147  * KickCase moved to KickSelectionTable
00148  *
00149  * Revision 1.2  2004/06/02 17:18:24  spranger
00150  * MotionRequest cleanup
00151  *
00152  * Revision 1.1  2004/05/27 16:48:08  loetzsch
00153  * added the kick logger
00154  *
00155  * Revision 1.3  2004/03/20 00:20:18  kerdels
00156  * removed some errors
00157  *
00158  * Revision 1.1  2004/03/16 14:00:17  juengel
00159  * Integrated Improvments from "Günne"
00160  * -ATH2004ERS7Behavior
00161  * -ATHHeadControl
00162  * -KickSelectionTable
00163  * -KickEditor
00164  *
00165  * Revision 1.1  2004/03/06 12:52:11  loetzsch
00166  * cloned ATH2004BehaviorControl into ATH2004ERS7BehaviorControl
00167  *
00168  * Revision 1.1.1.1  2004/03/05 10:10:11  loetzsch
00169  * created local cvs for Günne
00170  *
00171  * Revision 1.6  2004/03/04 18:30:53  loetzsch
00172  * bug fix
00173  *
00174  * Revision 1.5  2004/02/09 16:45:04  loetzsch
00175  * bug fix (missing break in switch statement)
00176  *
00177  * Revision 1.4  2004/02/04 14:09:56  loetzsch
00178  * improved
00179  *
00180  * Revision 1.3  2004/02/03 23:16:46  loetzsch
00181  * added debug key sendShootRecords
00182  *
00183  * Revision 1.2  2004/01/30 13:25:28  loetzsch
00184  * using odometry data in shoot logger,
00185  * first draft of visualization
00186  *
00187  * Revision 1.1  2004/01/28 21:16:56  loetzsch
00188  * added KickLogger
00189  *
00190  */

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