00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "Parcour.h"
00010 #include "Platform/SystemCall.h"
00011 #include "Tools/Debugging/Debugging.h"
00012 #include "Tools/Streams/OutStreams.h"
00013
00014 void Parcour::start()
00015 {
00016 updateCount=0;
00017 startTime=SystemCall::getCurrentSystemTime();
00018 lastTime=startTime;
00019 minX=-1000;
00020 maxX=-1000;
00021 yDiffIntegral=0;
00022 arcDiffIntegral=0;
00023 blindCount=0;
00024 zAccelIntegral=0;
00025 }
00026
00027 void Parcour::update(Pose2D robotPose, Vector3<double> accel, bool blind)
00028 {
00029
00030 unsigned long time = SystemCall::getCurrentSystemTime();
00031 Pose2D pos=getTargetPose(time);
00032 yDiffIntegral += fabs((pos.translation-robotPose.translation).y);
00033 arcDiffIntegral += fabs(normalize(pos.rotation-robotPose.rotation));
00034 blindCount += (int)(blind);
00035 zAccelIntegral += fabs(accel.z);
00036 lastRobotPose = robotPose;
00037 lastTime = time;
00038 updateCount++;
00039 if (robotPose.translation.x<minX) { minX=robotPose.translation.x; }
00040 else if ((robotPose.translation.x>maxX)&&(robotPose.translation.x!=-300)) { maxX=robotPose.translation.x; }
00041 }
00042
00043 Pose2D Parcour::getMotionRequest()
00044 {
00045
00046 Pose2D target=getTargetPose(lastTime+850);
00047
00048 Pose2D targetCOG=target.minusDiff(Pose2D(0, 90,0));
00049 Pose2D lastCOG=lastRobotPose.minusDiff(Pose2D(0, 90,0));
00050
00051 targetCOG.translation.y += (lastCOG.translation.y-targetCOG.translation.y)/7;
00052
00053 Pose2D diff=targetCOG-lastCOG;
00054
00055
00056 diff.translation /= 0.85;
00057 diff.rotation /= 0.85;
00058 return diff;
00059 }
00060
00061 double Parcour::getUnifiedSpeed()
00062 {
00063 if (lastTime==startTime)
00064 {
00065 return 0;
00066 }
00067 else
00068 {
00069 double speed=1000*(maxX-minX)/(lastTime-startTime);
00070 double yDiffAvg=yDiffIntegral/updateCount;
00071 double arcDiffAvg=arcDiffIntegral/updateCount;
00072 double zAccelAvg=zAccelIntegral/updateCount;
00073 double blindTime=(double)blindCount/updateCount;
00074
00075
00076
00077
00078
00079 double fitness=speed-yDiffAvg/6-arcDiffAvg/0.03-(zAccelAvg-500000)/100000-40*blindTime;
00080 OUTPUT(idText,text,"speed:" << speed << ", yDiffAvg:" << yDiffAvg << ", arcDiffAvg:" << arcDiffAvg << ", zAccelAvg:" << zAccelAvg << ", blindTime:" << blindTime << " -> fitness:" << fitness);
00081 OutTextRawFile fitLog("fitness.dat",true);
00082 fitLog << "speed:" << speed << ", yDiffAvg:" << yDiffAvg << ", arcDiffAvg:" << arcDiffAvg << ", zAccelAvg:" << zAccelAvg << ", blindTime:" << blindTime << " -> fitness:" << fitness << "\n";
00083 return fitness;
00084
00085
00086
00087 }
00088 }
00089
00090
00091 Pose2D ForwardTurningParcour::getTargetPose(unsigned long targetTime)
00092 {
00093 Pose2D target;
00094 target.translation.x=lastRobotPose.translation.x+0.4*(targetTime-lastTime);
00095 target.rotation=sin((target.translation.x+2600)/200/pi*4)*pi_4;
00096 if (target.translation.x>-900)
00097 {
00098 target.rotation*=max(0,(target.translation.x+550)/(-450));
00099 }
00100
00101
00102 target.translation.y=45*sin(target.rotation);
00103 return target;
00104 }
00105
00106 Pose2D SimpleBackwardParcour::getTargetPose(unsigned long targetTime)
00107 {
00108 Pose2D target;
00109 target.translation.x=lastRobotPose.translation.x-0.4*(targetTime-lastTime);
00110 target.translation.y=0;
00111 target.rotation=0;
00112 return target;
00113 }
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
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