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) < 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
00126 }
00127
00128 void KickLogger::record()
00129 {
00130 INFO(sendKickRecords, idKickRecord, bin, SpecialActionRequest::getSpecialActionIDName(kickID) << kick);
00131 }
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190