00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _RFieldStateMachine_h_
00009 #define _RFieldStateMachine_h_
00010
00011
00012 #include "Modules/ImageProcessor/RasterImageProcessor/REdgeDetection.h"
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 class RFieldStateMachine
00035 {
00036
00037 public:
00038
00039
00040 enum PointTypes {
00041 nothing = 0,
00042 blueRobot,
00043 redRobot,
00044 border,
00045 line,
00046 ball,
00047 skyblueGoal,
00048 yellowGoal,
00049 unknown,
00050 numberOfPointTypes
00051 };
00052
00053
00054 enum FIELD_STATES{
00055 START = 0,
00056 FOUND_WHITE,
00057 FOUND_FIELD,
00058 FOUND_BORDER,
00059 LINE_IN,
00060 LINE_OUT,
00061 YELLOW_GOAL,
00062 YELLOW_FINISHED,
00063 SKYBLUE_GOAL,
00064 SKYBLUE_FINISHED,
00065 FOUND_RED_ROBOT,
00066 FOUND_BLUE_ROBOT,
00067 FINISHED_BLUE_ROBOT,
00068 FINISHED_RED_ROBOT,
00069 FOUND_BALL,
00070 FINISHED_BALL,
00071 FOUND_UNKNOWN,
00072 FINISHED_UNKNOWN
00073 };
00074
00075
00076 RFieldStateMachine();
00077
00078 ~RFieldStateMachine();
00079
00080
00081
00082
00083
00084
00085
00086 void update(int x,int y,REdgeDetection& scanner);
00087
00088
00089
00090
00091
00092 void reset(int x,int y);
00093
00094
00095
00096
00097
00098 inline Vector2<int> getEdge(int index){
00099 return edgeBuffer[index];
00100 }
00101
00102
00103
00104
00105
00106 inline PointTypes getType(int index){
00107 return types[index];
00108 }
00109
00110
00111
00112 inline int size(){
00113 return numberOfEdges;
00114 }
00115
00116
00117
00118 inline bool foundObstacle(){
00119 return obstacleNearPoint != -1 && obstacleFarPoint != -1;
00120 }
00121
00122
00123
00124 inline Vector2<int>& nearPoint(){
00125 return edgeBuffer[obstacleNearPoint];
00126 }
00127
00128
00129
00130 inline Vector2<int>& farPoint(){
00131 return edgeBuffer[obstacleFarPoint];
00132 }
00133
00134
00135
00136 inline ObstaclesPercept::ObstacleType getObstacleType(){
00137 switch (types[obstacleFarPoint]){
00138 case blueRobot:
00139 if(getPlayer().getTeamColor() == Player::blue)
00140 return ObstaclesPercept::teammate;
00141 else
00142 return ObstaclesPercept::opponent;
00143
00144 case redRobot:
00145 if(getPlayer().getTeamColor() == Player::red)
00146 return ObstaclesPercept::teammate;
00147 else
00148 return ObstaclesPercept::opponent;
00149 case border: return ObstaclesPercept::border;
00150 case yellowGoal: return ObstaclesPercept::goal;
00151 case skyblueGoal: return ObstaclesPercept::goal;
00152 case unknown: return ObstaclesPercept::unknown;
00153 default: return ObstaclesPercept::unknown;
00154 }
00155 }
00156
00157 private :
00158
00159
00160 void findNextState();
00161
00162 void executeState();
00163
00164 colorClass color;
00165
00166 int range;
00167
00168 int rangeSum;
00169
00170 int greenRange;
00171
00172 int whiteRange;
00173
00174 int grayRange;
00175
00176 bool isUnknownBot;
00177
00178 Vector2<int> edgeBuffer[20];
00179
00180 Vector2<int> start;
00181
00182 PointTypes types[20];
00183
00184 FIELD_STATES state;
00185
00186 int numberOfEdges;
00187
00188 int obstacleFarPoint;
00189
00190 int obstacleNearPoint;
00191
00192 };
00193
00194 #endif // _RFieldStateMachine_h_
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224