Homepage Demos Overview Downloads Tutorials Reference
Credits

LookoutRequests.h

Go to the documentation of this file.
00001 //-*-c++-*-
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   //! Constructor
00023   LookoutRequest() : requestID((unsigned int) -1) {}
00024   virtual ~LookoutRequest() {}
00025   //! Lookout assigns non-zero value when added to queue
00026   unsigned int requestID; 
00027 protected:
00028   //! Copy constructor
00029   LookoutRequest(const LookoutRequest& req) : requestID(req.requestID) {}
00030 private:
00031   LookoutRequest& operator=(const LookoutRequest& req);
00032 };
00033 
00034 // ---------- pointAt requests ----------
00035 class PointAtBase : public LookoutRequest {
00036 protected:
00037   //! Constructor
00038   PointAtBase(unsigned int _joint, unsigned int _duration)
00039     : joint(_joint), toBaseMatrix(), duration(_duration) {}
00040 
00041   //! Copy constructor
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;//const { return none; }
00049   virtual HeadMotionType_t getHeadMotionType() const { return LookoutRequest::none; }
00050   unsigned int joint; //!< frame from which base frame transformation matrix is created, e.g., Camera, IR, etc.
00051   NEWMAT::Matrix toBaseMatrix; //!< transformation matrix from joint frame to base frame
00052   //! how much time to wait before taking measurements or throw completion event after head reaches gazePt.
00053   unsigned int duration;
00054 };
00055 
00056 class PointAtRequest : virtual public PointAtBase {
00057 public:
00058   //! Constructor
00059   PointAtRequest(const Point& pt, unsigned int dur=1000)
00060     : PointAtBase(CameraFrameOffset,dur), gazePt(pt) {};
00061 
00062   //! Copy constructor
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; //!< point to look at in base frame coordinates
00069 };
00070 
00071 class StoreImageRequest : virtual public PointAtBase {
00072 public:
00073   //! Constructor
00074   StoreImageRequest(Sketch<uchar> (&func)()=VRmixin::sketchFromSeg, 
00075         unsigned int dur=1000)
00076     : PointAtBase(CameraFrameOffset,dur), image(), sketchFunc(func) {};
00077   //! Copy constructor
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; //<! stores image here
00083   Sketch<uchar> (*sketchFunc)(); //<! function used to generate image
00084 private:
00085   StoreImageRequest& operator=(const StoreImageRequest&);
00086 };
00087 
00088 class StoreImageAtRequest : public PointAtRequest, public StoreImageRequest {
00089 public:
00090   //! Constructor
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   //! Copy constructor
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   //! Constructor
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   //! Copy constructor
00114   StoreModeImageRequest(const StoreModeImageRequest& req)
00115     : PointAtBase(req), StoreImageRequest(req), 
00116       numImages(req.numImages), interval(req.interval) {}
00117 
00118   unsigned int numImages; //!< number of image(sketch) over which to take mode
00119   unsigned int interval; //!< interval between storing images
00120 };
00121 
00122 class StoreModeImageAtRequest : public PointAtRequest, public StoreModeImageRequest {
00123 public:
00124   //! Constructor
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   //! Copy constructor
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   //! Constructor
00142   MeasureDistanceRequest(unsigned int dur=1000)
00143     : PointAtBase(
00144 #ifdef TGT_ERS7 
00145      NearIRFrameOffset
00146 #else 
00147      IRFrameOffset
00148 #endif
00149      ,dur), val() {};
00150   //! Copy Constructor
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   //! Constructor
00161   MeasureDistanceAtRequest(const Point& pt, unsigned int dur=1000)
00162     : PointAtBase(0/*overwritten by MeasureDistanceRequest constructor*/,dur), 
00163       PointAtRequest(pt,dur), MeasureDistanceRequest(dur) {};
00164   //! Copy constructor
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 // ------------SCAN requests-------------------
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; // in rad/msec
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   // ------------Tasks may be implemented during scan -------------------
00211   class Task {
00212   public:
00213     enum taskType_t { none, visObj, visReg, ir };
00214     virtual taskType_t getTaskType() const = 0;// { return none; }
00215     virtual ~Task() {}
00216     AngPi interval; //!< interval of measurements
00217     vector<Point> data; //!< measured data stored here in base frame coordinates
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     //  virtual ~IRTask() { cout << "deleting IRTask " << this << endl; }
00231   };
00232 
00233   //base class for vision tasks, should not be instantiated
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   //! Uses bult-in object detectors (like pink ball detector) via VisionObjectEvent stream
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   //! Uses built-in colored region detectors via Region event stream
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   //  virtual HeadMotionType_t getHeadMotionType() const { return scanLine; }
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   //  virtual HeadMotionType_t getHeadMotionType() const { return scanArea; }
00294   virtual ScanType_t getScanType() const { return area; }
00295   coordinate_t left,right,far,near;
00296 };
00297 //--------------------------------------------
00298 
00299 
00300 // ------------TRACK requests-------------------
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 } // namespace
00316 
00317 #endif

DualCoding 3.0beta
Generated Wed Oct 4 00:01:53 2006 by Doxygen 1.4.7