00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "SpecialPercept.h"
00010
00011 #include "Platform/SystemCall.h"
00012
00013 BitePoint::BitePoint()
00014 {
00015 position = none;
00016 angleTo = 0;
00017 distanceTo = 0;
00018 relPos.x = 0;
00019 relPos.y = 0;
00020 preciseShift = 0;
00021 timeWhenLastSeen = 0;
00022 fresh = false;
00023 }
00024
00025 void BitePoint::addPercept(double aAngleTo, double aDistanceTo, double aPreciseShift)
00026 {
00027 angleTo = aAngleTo;
00028 distanceTo = aDistanceTo;
00029 relPos.x = sgn(pi_2 - fabs(aAngleTo)) * (cos(fabs(aAngleTo))*aDistanceTo);
00030 relPos.y = sgn(aAngleTo) * (sin(fabs(aAngleTo))*aDistanceTo);
00031 preciseShift = aPreciseShift;
00032
00033 timeWhenLastSeen = SystemCall::getCurrentSystemTime();
00034
00035 fresh = true;
00036 }
00037
00038 In& operator>>(In& stream,BitePoint& bitePoint)
00039 {
00040 stream.read(&(bitePoint.position), sizeof(BitePoint::Position));
00041 stream.read(&(bitePoint.angleTo), sizeof(double));
00042 stream.read(&(bitePoint.distanceTo), sizeof(double));
00043 stream.read(&(bitePoint.relPos), sizeof(Vector2<double>));
00044 stream.read(&(bitePoint.preciseShift), sizeof(double));
00045 stream.read(&(bitePoint.timeWhenLastSeen), sizeof(unsigned long));
00046 stream.read(&(bitePoint.fresh), sizeof(bool));
00047
00048 return stream;
00049 }
00050
00051 Out& operator<<(Out& stream, const BitePoint& bitePoint)
00052 {
00053 stream.write(&(bitePoint.position), sizeof(BitePoint::Position));
00054 stream.write(&(bitePoint.angleTo), sizeof(double));
00055 stream.write(&(bitePoint.distanceTo), sizeof(double));
00056 stream.write(&(bitePoint.relPos), sizeof(Vector2<double>));
00057 stream.write(&(bitePoint.preciseShift), sizeof(double));
00058 stream.write(&(bitePoint.timeWhenLastSeen), sizeof(unsigned long));
00059 stream.write(&(bitePoint.fresh), sizeof(bool));
00060
00061 return stream;
00062 }
00063
00064
00065 OCRedLine::OCRedLine(){
00066 this->seen = false;
00067 this->angleInImage =0;
00068 this->lineStart.x =0;
00069 this->lineStart.y =0;
00070 this->lineEnd.x =0;
00071 this->lineEnd.y =0;
00072 this->timeWhenLastSeen =0;
00073
00074 }
00075 void OCRedLine::addPercept(Vector2<int> lineStart, Vector2<int> lineEnd, Vector2<int> pointStart,Vector2<int> pointEnd,int angleInImage){
00076 this->seen = true;
00077 this->lineStart=lineStart;
00078 this->lineEnd=lineEnd;
00079 this->pointStart=pointStart;
00080 this->pointEnd=pointEnd;
00081 this->angleInImage=angleInImage;
00082 this->timeWhenLastSeen = SystemCall::getCurrentSystemTime();
00083 }
00084
00085
00086 In& operator>>(In& stream,OCRedLine& ocRedLine)
00087 {
00088 stream.read(&(ocRedLine.lineStart), sizeof(Vector2<int>));
00089 stream.read(&(ocRedLine.lineEnd), sizeof(Vector2<int>));
00090 stream.read(&(ocRedLine.angleInImage), sizeof(int));
00091 stream.read(&(ocRedLine.timeWhenLastSeen), sizeof(unsigned long));
00092
00093 return stream;
00094 }
00095
00096 Out& operator<<(Out& stream, const OCRedLine& ocRedLine)
00097 {
00098 stream.write(&(ocRedLine.lineStart), sizeof(Vector2<int>));
00099 stream.write(&(ocRedLine.lineEnd), sizeof(Vector2<int>));
00100 stream.write(&(ocRedLine.angleInImage), sizeof(int));
00101 stream.write(&(ocRedLine.timeWhenLastSeen), sizeof(unsigned long));
00102
00103 return stream;
00104 }
00105
00106
00107 OCBridge::OCBridge()
00108 {
00109 lastSeenSide = none;
00110 angleTo = 0;
00111 distanceTo = 0;
00112 relPos.x = 0;
00113 relPos.y = 0;
00114 timeWhenLastSeen = 0;
00115 fresh = false;
00116
00117 for (int i=0; i < BitePoint::numOfPositions; ++i)
00118 bitePoint[i].position = BitePoint::Position(i);
00119 }
00120
00121 void OCBridge::addPercept(double aAngleTo, double aDistanceTo)
00122 {
00123 angleTo = aAngleTo;
00124 distanceTo = aDistanceTo;
00125 relPos.x = sgn(pi_2 - fabs(aAngleTo)) * (cos(fabs(aAngleTo))*aDistanceTo);
00126 relPos.y = sgn(aAngleTo) * (sin(fabs(aAngleTo))*aDistanceTo);
00127
00128 timeWhenLastSeen = SystemCall::getCurrentSystemTime();
00129
00130 fresh = true;
00131 }
00132
00133 In& operator>>(In& stream,OCBridge& ocBridge)
00134 {
00135 stream.read(&(ocBridge.lastSeenSide), sizeof(OCBridge::Side));
00136 stream.read(&(ocBridge.angleTo), sizeof(double));
00137 stream.read(&(ocBridge.distanceTo), sizeof(double));
00138 stream.read(&(ocBridge.relPos), sizeof(Vector2<double>));
00139 stream.read(&(ocBridge.timeWhenLastSeen), sizeof(unsigned long));
00140 stream.read(&(ocBridge.fresh), sizeof(bool));
00141
00142 for (int i=0; i < BitePoint::numOfPositions; ++i)
00143 stream >> ocBridge.bitePoint[i];
00144
00145 return stream;
00146 }
00147
00148 Out& operator<<(Out& stream, const OCBridge& ocBridge)
00149 {
00150 stream.write(&(ocBridge.lastSeenSide), sizeof(OCBridge::Side));
00151 stream.write(&(ocBridge.angleTo), sizeof(double));
00152 stream.write(&(ocBridge.distanceTo), sizeof(double));
00153 stream.write(&(ocBridge.relPos), sizeof(Vector2<double>));
00154 stream.write(&(ocBridge.timeWhenLastSeen), sizeof(unsigned long));
00155 stream.write(&(ocBridge.fresh), sizeof(bool));
00156
00157 for (int i=0; i < BitePoint::numOfPositions; ++i)
00158 stream << ocBridge.bitePoint[i];
00159
00160 return stream;
00161 }
00162
00163
00164
00165
00166 SpecialPercept::SpecialPercept()
00167 {
00168 reset();
00169 }
00170
00171 void SpecialPercept::reset(unsigned long frameNum)
00172 {
00173 type = none;
00174 pan = tilt = 0;
00175 mostMovement = Vector2<long>(0,0);
00176 leastMovement = Vector2<long>(0,0);
00177 checkerPose = Pose2D(0,0,0);
00178 barCodeId = -1;
00179 orientation = 0;
00180 frameNumber = frameNum;
00181 shutterSelected = false;
00182
00183 countAngleOfPinkFlags = 0;
00184 }
00185
00186 In& operator>>(In& stream,SpecialPercept& specialPercept)
00187 {
00188 specialPercept.reset();
00189 stream >> specialPercept.frameNumber;
00190 char temp;
00191 stream >> temp;
00192 specialPercept.type = (SpecialPercept::Type)temp;
00193 switch(specialPercept.type)
00194 {
00195 case SpecialPercept::motionDetection: stream >> specialPercept.mostMovement.x >> specialPercept.mostMovement.y >> specialPercept.leastMovement.x >> specialPercept.leastMovement.y;
00196 break;
00197 case SpecialPercept::checkerboard: stream >> specialPercept.checkerPose.translation.x >> specialPercept.checkerPose.translation.y >> specialPercept.checkerPose.rotation;
00198 break;
00199 case SpecialPercept::barCode: stream >> specialPercept.barCodeId;
00200 break;
00201 case SpecialPercept::autoShutter: stream.read(&(specialPercept.shutterSelected), sizeof(bool));
00202 break;
00203 case SpecialPercept::openChallengeBridge: stream >> specialPercept.ocBridge;
00204 break;
00205 case SpecialPercept::openChallengeRedLine: stream >> specialPercept.ocRedLine;
00206 break;
00207 case SpecialPercept::challengeOrientation: stream >> specialPercept.orientation;
00208 break;
00209 case SpecialPercept::none: break;
00210 }
00211
00212 return stream;
00213 }
00214
00215 Out& operator<<(Out& stream, const SpecialPercept& specialPercept)
00216 {
00217 stream << specialPercept.frameNumber;
00218 stream << (char)specialPercept.type;
00219 switch(specialPercept.type)
00220 {
00221 case SpecialPercept::motionDetection: stream << specialPercept.mostMovement.x << specialPercept.mostMovement.y << specialPercept.leastMovement.x << specialPercept.leastMovement.y;
00222 break;
00223 case SpecialPercept::checkerboard: stream << specialPercept.checkerPose.translation.x << specialPercept.checkerPose.translation.y << specialPercept.checkerPose.rotation;
00224 break;
00225 case SpecialPercept::barCode: stream << specialPercept.barCodeId;
00226 break;
00227 case SpecialPercept::autoShutter: stream.write(&(specialPercept.shutterSelected), sizeof(bool));
00228 break;
00229 case SpecialPercept::openChallengeBridge: stream << specialPercept.ocBridge;
00230 break;
00231 case SpecialPercept::openChallengeRedLine: stream << specialPercept.ocRedLine;
00232 break;
00233 case SpecialPercept::challengeOrientation: stream << specialPercept.orientation;
00234 case SpecialPercept::none: break;
00235 }
00236
00237 return stream;
00238 }
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340