00001
00002
00003
00004
00005
00006
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
00130 }
00131
00132 void KickLogger::record()
00133 {
00134 INFO(sendKickRecords, idKickRecord, bin, SpecialActionRequest::getSpecialActionIDName(kickID) << kick);
00135 }