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 #include "DualCoding.h"
00009 #include "VRmixin.h"
00010
00011 namespace DualCoding {
00012
00013 class LookoutRequest {
00014 public:
00015 enum HeadMotionType_t {
00016 none,
00017 pointAt,
00018 scan,
00019 track
00020 };
00021 virtual HeadMotionType_t getHeadMotionType() const = 0;
00022
00023 LookoutRequest() : requestID((unsigned int) -1) {}
00024 virtual ~LookoutRequest() {}
00025
00026 unsigned int requestID;
00027 protected:
00028
00029 LookoutRequest(const LookoutRequest& req) : requestID(req.requestID) {}
00030 private:
00031 LookoutRequest& operator=(const LookoutRequest& req);
00032 };
00033
00034
00035 class PointAtBase : public LookoutRequest {
00036 protected:
00037
00038 PointAtBase(unsigned int _joint, unsigned int _duration)
00039 : joint(_joint), toBaseMatrix(), duration(_duration) {}
00040
00041
00042 PointAtBase(const PointAtBase& base)
00043 : LookoutRequest(base), joint(base.joint),
00044 toBaseMatrix(base.toBaseMatrix), duration(base.duration) {}
00045
00046 public:
00047 enum PointAtRequestType_t { none, storeImage, measureDist };
00048 virtual PointAtRequestType_t getPointAtType() const = 0;
00049 virtual HeadMotionType_t getHeadMotionType() const { return LookoutRequest::none; }
00050 unsigned int joint;
00051 NEWMAT::Matrix toBaseMatrix;
00052
00053 unsigned int duration;
00054 };
00055
00056 class PointAtRequest : virtual public PointAtBase {
00057 public:
00058
00059 PointAtRequest(const Point& pt, unsigned int dur=1000)
00060 : PointAtBase(CameraFrameOffset,dur), gazePt(pt) {};
00061
00062
00063 PointAtRequest(const PointAtRequest& req)
00064 : PointAtBase(req), gazePt(req.gazePt) {}
00065
00066 virtual PointAtRequestType_t getPointAtType() const { return none; }
00067 virtual HeadMotionType_t getHeadMotionType() const { return pointAt; }
00068 Point gazePt;
00069 };
00070
00071 class StoreImageRequest : virtual public PointAtBase {
00072 public:
00073
00074 StoreImageRequest(Sketch<uchar> (&func)()=VRmixin::sketchFromSeg,
00075 unsigned int dur=1000)
00076 : PointAtBase(CameraFrameOffset,dur), image(), sketchFunc(func) {};
00077
00078 StoreImageRequest(const StoreImageRequest& req)
00079 : PointAtBase(req), image(req.image), sketchFunc(req.sketchFunc) {}
00080
00081 virtual PointAtRequestType_t getPointAtType() const { return storeImage; }
00082 Sketch<uchar> image;
00083 Sketch<uchar> (*sketchFunc)();
00084 private:
00085 StoreImageRequest& operator=(const StoreImageRequest&);
00086 };
00087
00088 class StoreImageAtRequest : public PointAtRequest, public StoreImageRequest {
00089 public:
00090
00091 StoreImageAtRequest(const Point& pt, Sketch<uchar> (&func)()=VRmixin::sketchFromSeg,
00092 unsigned int dur=1000)
00093 : PointAtBase(CameraFrameOffset,dur), PointAtRequest(pt,dur), StoreImageRequest(func,dur) {}
00094
00095 StoreImageAtRequest(const StoreImageAtRequest& req)
00096 : PointAtBase(req), PointAtRequest(req), StoreImageRequest(req) {}
00097
00098 virtual PointAtRequestType_t getPointAtType() const { return storeImage; }
00099 virtual HeadMotionType_t getHeadMotionType() const { return pointAt; }
00100 private:
00101 StoreImageAtRequest& operator=(const StoreImageAtRequest&);
00102 };
00103
00104 class StoreModeImageRequest : public StoreImageRequest {
00105 public:
00106
00107 StoreModeImageRequest(unsigned int num, unsigned int _interval=100,
00108 Sketch<uchar> (&func)()=VRmixin::sketchFromSeg,
00109 unsigned int dur=1000)
00110 : PointAtBase(CameraFrameOffset,dur), StoreImageRequest(func,dur),
00111 numImages(num), interval(_interval) {};
00112
00113
00114 StoreModeImageRequest(const StoreModeImageRequest& req)
00115 : PointAtBase(req), StoreImageRequest(req),
00116 numImages(req.numImages), interval(req.interval) {}
00117
00118 unsigned int numImages;
00119 unsigned int interval;
00120 };
00121
00122 class StoreModeImageAtRequest : public PointAtRequest, public StoreModeImageRequest {
00123 public:
00124
00125 StoreModeImageAtRequest (const Point& pt, unsigned int num, unsigned int _interval=100,
00126 Sketch<uchar> (&func)()=VRmixin::sketchFromSeg, unsigned int dur=1000)
00127 : PointAtBase(CameraFrameOffset,dur), PointAtRequest(pt,dur),
00128 StoreModeImageRequest(num,_interval,func) {}
00129
00130 StoreModeImageAtRequest(const StoreModeImageAtRequest& req)
00131 : PointAtBase(req), PointAtRequest(req), StoreModeImageRequest(req) {}
00132
00133 virtual PointAtRequestType_t getPointAtType() const { return storeImage; }
00134 virtual HeadMotionType_t getHeadMotionType() const { return pointAt; }
00135 private:
00136 StoreModeImageAtRequest& operator=(const StoreModeImageAtRequest&);
00137 };
00138
00139 class MeasureDistanceRequest : virtual public PointAtBase {
00140 public:
00141
00142 MeasureDistanceRequest(unsigned int dur=1000)
00143 : PointAtBase(
00144 #ifdef TGT_ERS7
00145 NearIRFrameOffset
00146 #else
00147 IRFrameOffset
00148 #endif
00149 ,dur), val() {};
00150
00151 MeasureDistanceRequest(const MeasureDistanceRequest& req)
00152 : PointAtBase(req), val(req.val) {}
00153
00154 virtual PointAtRequestType_t getPointAtType() const { return measureDist; }
00155 float val;
00156 };
00157
00158 class MeasureDistanceAtRequest : public PointAtRequest, public MeasureDistanceRequest {
00159 public:
00160
00161 MeasureDistanceAtRequest(const Point& pt, unsigned int dur=1000)
00162 : PointAtBase(0,dur),
00163 PointAtRequest(pt,dur), MeasureDistanceRequest(dur) {};
00164
00165 MeasureDistanceAtRequest(const MeasureDistanceAtRequest& req)
00166 : PointAtBase(req), PointAtRequest(req), MeasureDistanceRequest(req) {}
00167 virtual PointAtRequestType_t getPointAtType() const { return measureDist; }
00168 virtual HeadMotionType_t getHeadMotionType() const { return pointAt; }
00169 };
00170
00171
00172
00173
00174 class ScanRequest : public LookoutRequest {
00175 public:
00176 class Task;
00177 virtual HeadMotionType_t getHeadMotionType() const { return scan; }
00178 enum ScanType_t { line,area };
00179 virtual ScanType_t getScanType() const = 0;
00180 vector<Task*> tasks;
00181 float scanSpeed;
00182 static const float defSpd;
00183 ScanRequest(const ScanRequest& req)
00184 : LookoutRequest(req), tasks(), scanSpeed(req.scanSpeed) {
00185 for (vector<Task*>::const_iterator it = req.tasks.begin();
00186 it != req.tasks.end(); it++)
00187 addTask(**it);
00188 }
00189 ScanRequest(float _speed=defSpd)
00190 : tasks(), scanSpeed(_speed) {}
00191 ScanRequest(const Task& _task, float _speed=defSpd)
00192 : tasks(), scanSpeed(_speed) { addTask(_task); }
00193 void addTask(const Task& t) {
00194 switch (t.getTaskType()) {
00195 case Task::visReg:
00196 tasks.push_back(new VisionRegionTask(*dynamic_cast<const VisionRegionTask*>(&t))); break;
00197 case Task::visObj:
00198 tasks.push_back(new VisionObjectTask(*dynamic_cast<const VisionObjectTask*>(&t))); break;
00199 case Task::ir:
00200 tasks.push_back(new IRTask(*dynamic_cast<const IRTask*>(&t))); break;
00201 default: return;
00202 };
00203 }
00204 virtual ~ScanRequest() {
00205 for (vector<Task*>::const_iterator it = tasks.begin();
00206 it != tasks.end(); it++)
00207 delete *it;
00208 }
00209
00210
00211 class Task {
00212 public:
00213 enum taskType_t { none, visObj, visReg, ir };
00214 virtual taskType_t getTaskType() const = 0;
00215 virtual ~Task() {}
00216 AngPi interval;
00217 vector<Point> data;
00218 Task(const Task& t) : interval(t.interval), data(t.data) {}
00219 protected:
00220 Task(AngPi _interval) : interval(_interval), data() {}
00221 private:
00222 Task& operator=(const Task&);
00223 };
00224
00225 class IRTask : public Task {
00226 public:
00227 IRTask(AngPi _interval) : Task(_interval) {}
00228 IRTask(const IRTask& t) : Task(t) {}
00229 virtual taskType_t getTaskType() const { return ir; }
00230
00231 };
00232
00233
00234 class VisionTask : public Task {
00235 public:
00236 virtual taskType_t getTaskType() const { return none; }
00237 set<int> index;
00238 VisionTask(const VisionTask& vt) : Task(vt), index(vt.index) {}
00239 protected:
00240 VisionTask(const set<int>& _index, AngPi _interval)
00241 : Task(_interval), index(_index) {}
00242 VisionTask(int _index, AngPi _interval)
00243 : Task(_interval), index() { index.insert(_index); }
00244 };
00245
00246
00247 class VisionObjectTask : public VisionTask {
00248 public:
00249 VisionObjectTask(const set<int>& sid, AngPi _interval)
00250 : VisionTask(sid,_interval) {}
00251 VisionObjectTask(const VisionObjectTask& vot) : VisionTask(vot) {}
00252 virtual taskType_t getTaskType() const { return visObj; }
00253 };
00254
00255
00256 class VisionRegionTask : public VisionTask {
00257 public:
00258 VisionRegionTask(const set<int>& colorIndex, AngPi _interval,
00259 unsigned int _minArea=200)
00260 : VisionTask(colorIndex,_interval), minArea(_minArea) {}
00261 VisionRegionTask(int colorIndex, AngPi _interval,
00262 unsigned int _minArea=200)
00263 : VisionTask(colorIndex,_interval), minArea(_minArea) {}
00264 VisionRegionTask(const VisionRegionTask& vrt)
00265 : VisionTask(vrt), minArea(vrt.minArea) {}
00266 virtual taskType_t getTaskType() const { return visReg; }
00267 unsigned int minArea;
00268 };
00269
00270 };
00271
00272 class ScanAlongLineRequest : public ScanRequest {
00273 public:
00274 ScanAlongLineRequest(const Point& bPt, const Point& ePt, float _speed=defSpd)
00275 : ScanRequest(_speed), beginPt(bPt), endPt(ePt) {}
00276 ScanAlongLineRequest(const ScanAlongLineRequest& req)
00277 : ScanRequest(req), beginPt(req.beginPt), endPt(req.endPt) {}
00278
00279 virtual ScanType_t getScanType() const { return line; }
00280 Point beginPt, endPt;
00281 };
00282
00283 class ScanAreaRequest : public ScanRequest {
00284 public:
00285 ScanAreaRequest(coordinate_t _left, coordinate_t _right,
00286 coordinate_t _far, coordinate_t _near,
00287 float _speed=defSpd)
00288 : ScanRequest(_speed),left(_left),
00289 right(_right),far(_far),near(_near) {}
00290 ScanAreaRequest(const ScanAreaRequest& req)
00291 : ScanRequest(req), left(req.left),
00292 right(req.right), far(req.far), near(req.near) {}
00293
00294 virtual ScanType_t getScanType() const { return area; }
00295 coordinate_t left,right,far,near;
00296 };
00297
00298
00299
00300
00301 class TrackRequest : public LookoutRequest {
00302 public:
00303 TrackRequest(const vector<ScanRequest::VisionTask>& _landmarks, const ShapeRoot& _area)
00304 : landmarks(_landmarks), area(_area), lmLocation(), lmInView(false) {}
00305 TrackRequest(const vector<ScanRequest::VisionTask>& _landmarks, const Point& pt, const ShapeRoot& _area)
00306 : landmarks(_landmarks), area(_area), lmLocation(pt), lmInView(false) {}
00307 virtual HeadMotionType_t getHeadMotionType() const { return track; }
00308 vector<ScanRequest::VisionTask> landmarks;
00309 ShapeRoot area;
00310 Point lmLocation;
00311 bool lmInView;
00312 };
00313
00314
00315 }
00316
00317 #endif