00001
00002 #ifndef INCLUDED_LookoutRequests_h_
00003 #define INCLUDED_LookoutRequests_h_
00004
00005 #include "Shared/newmat/newmat.h"
00006 #include "Shared/ProjectInterface.h"
00007 #include "Shared/WorldState.h"
00008
00009 #include "Sketch.h"
00010 #include "Point.h"
00011 #include "ShapeRoot.h"
00012 #include "VRmixin.h"
00013
00014 namespace DualCoding {
00015
00016
00017
00018 class LookoutRequest {
00019 public:
00020 enum HeadMotionType_t {
00021 noMotion,
00022 pointAt,
00023 scan,
00024 track,
00025 search,
00026 numHeadMotionTypes
00027 };
00028
00029 static const char* const headMotionTypeNames[numHeadMotionTypes];
00030
00031 HeadMotionType_t getHeadMotionType() const { return headMotionType; }
00032 void setHeadMotionType(const HeadMotionType_t htype) { headMotionType = htype; }
00033
00034 enum LookoutResultType_t {
00035 noResult,
00036 imageResult,
00037 #ifdef TGT_HAS_IR_DISTANCE
00038 distanceResult,
00039 #endif
00040 interestPoints
00041 };
00042
00043 LookoutResultType_t getResultType() const { return resultType; }
00044 void setResultType(const LookoutResultType_t rtype) { resultType = rtype; }
00045
00046
00047 LookoutRequest(HeadMotionType_t htype=noMotion, LookoutResultType_t rtype=noResult) :
00048 headMotionType(htype), resultType(rtype), requestID(0) {}
00049
00050
00051 virtual ~LookoutRequest() {}
00052
00053
00054 LookoutRequest(const LookoutRequest &req) :
00055 headMotionType(req.headMotionType),
00056 resultType(req.resultType),
00057 requestID(req.requestID) {}
00058
00059 HeadMotionType_t headMotionType;
00060 LookoutResultType_t resultType;
00061 unsigned int requestID;
00062
00063 private:
00064 LookoutRequest& operator=(const LookoutRequest&);
00065
00066 public:
00067
00068
00069 class Task {
00070 public:
00071 enum TaskType_t { noTask, visObjTask, visRegTask, irTask };
00072
00073 virtual TaskType_t getTaskType() const = 0;
00074 virtual Task* clone() const = 0;
00075
00076
00077 Task(AngPi _dTheta) : dTheta(_dTheta), data() {}
00078
00079
00080 Task(const Task& t) : dTheta(t.dTheta), data(t.data) {}
00081
00082
00083 virtual ~Task() {}
00084
00085 AngPi dTheta;
00086 std::vector<Point> data;
00087 Task& operator=(const Task&);
00088 };
00089
00090 class IRTask : public Task {
00091 public:
00092 IRTask(AngPi _dTheta) : Task(_dTheta) {}
00093 IRTask(const IRTask& t) : Task(t) {}
00094 virtual TaskType_t getTaskType() const { return irTask; }
00095 virtual Task* clone() const { return new IRTask(*this); }
00096 };
00097
00098
00099 class VisionTask : public Task {
00100 public:
00101 virtual TaskType_t getTaskType() const { return noTask; }
00102 std::set<color_index> index;
00103 VisionTask(const VisionTask& vt) : Task(vt), index(vt.index) {}
00104 VisionTask(const std::set<color_index>& _index, AngPi _dTheta)
00105 : Task(_dTheta), index(_index) {}
00106 VisionTask(int _index, AngPi _dTheta)
00107 : Task(_dTheta), index() { index.insert(_index); }
00108 virtual Task* clone() const { return new VisionTask(*this); }
00109 };
00110
00111
00112 class VisionObjectTask : public VisionTask {
00113 public:
00114 VisionObjectTask(const std::set<color_index>& sid, AngPi _dTheta=0)
00115 : VisionTask(sid,_dTheta) {}
00116 VisionObjectTask(const VisionObjectTask& vot) : VisionTask(vot) {}
00117 virtual TaskType_t getTaskType() const { return visObjTask; }
00118 virtual Task* clone() const { return new VisionObjectTask(*this); }
00119 };
00120
00121
00122 class VisionRegionTask : public VisionTask {
00123 public:
00124 VisionRegionTask(const std::set<color_index>& colorIndex, AngPi _dTheta=0,
00125 unsigned int _minArea=200)
00126 : VisionTask(colorIndex,_dTheta), minArea(_minArea) {}
00127 VisionRegionTask(int colorIndex, AngPi _dTheta,
00128 unsigned int _minArea=200)
00129 : VisionTask(colorIndex,_dTheta), minArea(_minArea) {}
00130 VisionRegionTask(const VisionRegionTask& vrt)
00131 : VisionTask(vrt), minArea(vrt.minArea) {}
00132 virtual TaskType_t getTaskType() const { return visRegTask; }
00133 virtual Task* clone() const { return new VisionRegionTask(*this); }
00134 unsigned int minArea;
00135 };
00136
00137
00138
00139 };
00140
00141
00142
00143
00144 class LookoutPointRequest : public LookoutRequest {
00145 public:
00146
00147 LookoutPointRequest() :
00148 LookoutRequest(noMotion,imageResult),
00149 #ifdef TGT_HAS_CAMERA
00150 joint(CameraFrameOffset),
00151 #else
00152 joint(0),
00153 #endif
00154 toBaseMatrix(),
00155 gazePt(), motionSettleTime(1000),
00156 numSamples(1), sampleCounter(0), sampleInterval(0),
00157 image(), sketchFunc(VRmixin::sketchFromSeg)
00158 {}
00159
00160
00161 LookoutPointRequest(const LookoutPointRequest &p)
00162 : LookoutRequest(p), joint(p.joint), toBaseMatrix(p.toBaseMatrix),
00163 gazePt(p.gazePt), motionSettleTime(p.motionSettleTime),
00164 numSamples(p.numSamples), sampleCounter(p.sampleCounter), sampleInterval(p.sampleInterval),
00165 image(p.image), sketchFunc(p.sketchFunc)
00166 {}
00167
00168 public:
00169 void setTarget(const Point &target) {
00170 gazePt = target;
00171 headMotionType = pointAt;
00172 }
00173
00174 unsigned int joint;
00175 NEWMAT::Matrix toBaseMatrix;
00176 Point gazePt;
00177 unsigned int motionSettleTime;
00178 int numSamples;
00179 int sampleCounter;
00180 int sampleInterval;
00181 Sketch<uchar> image;
00182 Sketch<uchar> (*sketchFunc)();
00183
00184 private:
00185 LookoutPointRequest& operator=(const LookoutPointRequest&);
00186 };
00187
00188
00189
00190
00191 class LookoutScanRequest : public LookoutRequest {
00192 public:
00193
00194 std::vector<Task*> tasks;
00195 float scanSpeed;
00196 ShapeRoot searchArea;
00197 unsigned int motionSettleTime;
00198
00199 static const float defSpd;
00200
00201
00202 LookoutScanRequest(float _speed=defSpd):
00203 LookoutRequest(scan,interestPoints),
00204 tasks(), scanSpeed(_speed), searchArea(), motionSettleTime(1000) {}
00205
00206
00207 LookoutScanRequest(const Task& _task, float _speed=defSpd) :
00208 LookoutRequest(scan,interestPoints), tasks(), scanSpeed(_speed), searchArea(), motionSettleTime(1000)
00209 { addTask(_task); }
00210
00211
00212 LookoutScanRequest(const LookoutScanRequest& req)
00213 : LookoutRequest(req), tasks(), scanSpeed(req.scanSpeed), searchArea(req.searchArea), motionSettleTime(req.motionSettleTime)
00214 {
00215 for (std::vector<Task*>::const_iterator it = req.tasks.begin();
00216 it != req.tasks.end(); it++)
00217 addTask(**it);
00218 }
00219
00220
00221 virtual ~LookoutScanRequest();
00222
00223 void addTask(const Task& t) { tasks.push_back(t.clone()); }
00224
00225 };
00226
00227
00228
00229
00230
00231
00232 class LookoutTrackRequest : public LookoutRequest {
00233 public:
00234
00235 friend class Lookout;
00236
00237
00238 LookoutTrackRequest(const ShapeRoot& target=ShapeRoot())
00239 : LookoutRequest(track), targetShape(target),
00240 minBlobArea(80), exitTest(NULL), cindex(0) {}
00241
00242
00243 LookoutTrackRequest(const LookoutTrackRequest& req)
00244 : LookoutRequest(req), targetShape(req.targetShape),
00245 minBlobArea(req.minBlobArea), exitTest(req.exitTest), cindex(req.cindex) {}
00246
00247 ShapeRoot targetShape;
00248 int minBlobArea;
00249 bool (*exitTest)();
00250
00251 private:
00252 color_index cindex;
00253
00254 LookoutTrackRequest& operator=(const LookoutTrackRequest&);
00255 };
00256
00257
00258
00259
00260
00261 class LookoutSearchRequest : public LookoutRequest {
00262 public:
00263
00264 friend class Lookout;
00265
00266
00267 LookoutSearchRequest(const ShapeRoot& target=ShapeRoot())
00268 : LookoutRequest(search,imageResult), targetShape(target),
00269 minBlobArea(80), exitTest(NULL), cindex(0) {}
00270
00271
00272 LookoutSearchRequest(const LookoutSearchRequest& req)
00273 : LookoutRequest(req), targetShape(req.targetShape),
00274 minBlobArea(req.minBlobArea), exitTest(req.exitTest), cindex(req.cindex) {}
00275
00276 ShapeRoot targetShape;
00277 int minBlobArea;
00278 bool (*exitTest)();
00279
00280 private:
00281 color_index cindex;
00282
00283 LookoutSearchRequest& operator=(const LookoutSearchRequest&);
00284 };
00285
00286
00287 }
00288
00289 #endif