Homepage Demos Overview Downloads Tutorials Reference
Credits

PostureMC.h

Go to the documentation of this file.
00001 //-*-c++-*-
00002 #ifndef INCLUDED_PostureMC_h
00003 #define INCLUDED_PostureMC_h
00004 
00005 #include "MotionCommand.h"
00006 #include "PostureEngine.h"
00007 #include "MotionManager.h"
00008 
00009 //! a MotionCommand shell for PostureEngine
00010 class PostureMC : public MotionCommand, public PostureEngine {
00011 public:
00012   //!constructor
00013   PostureMC() : MotionCommand(),PostureEngine(),dirty(true),tolerance(.01) { }
00014   //!constructor, loads from @a filename
00015   PostureMC(const char* filename) : MotionCommand(),PostureEngine(filename),dirty(true),tolerance(.01) { }
00016   //!destructor
00017   virtual ~PostureMC() {}
00018   
00019   //!@name New Stuff
00020   /*!@brief call this if you call PostureEngine::setOutputCmd(), that doesn't know about dirty flags */
00021   /* This is the downside of making setOutputCmd() not virtual - if you pass this around as just a
00022    * PostureEngine, calls made to that won't be able to update the dirty flag automatically.  However,
00023    * if the object is typed as a PostureMC at the time the call is made, then you don't have to worry.\n
00024    * These are also not virtual - otherwise you'd have to still check the motion out and it would make
00025    * this all pointless! @return @c *this */
00026   PostureMC& setDirty(bool d=true) { dirty=d; return *this; } 
00027   bool isDirty() const {return dirty;} //!< if you want to check the dirty flag
00028   virtual PostureMC& setTolerance(float t) { tolerance=t; return *this; } //!< sets #tolerance, returns @c *this
00029   virtual float getTolerance() { return tolerance; } //!< returns #tolerance
00030   //@}
00031 
00032 
00033   //!@name MotionCommand Stuff
00034   virtual int updateOutputs() {
00035     for(unsigned int i=0; i<NumOutputs; i++)
00036       if(cmds[i].weight>0)
00037         motman->setOutput(this,i,cmds[i]);
00038     bool r=dirty; dirty=false; return r;
00039   }
00040   virtual int isDirty() { return dirty; }
00041 
00042   //! returns non-zero (true) if PostureEngine::maxdiff() between this and the current position is over #tolerance
00043   /*! This is handy so you can set to have the robot go to a position and then automatically remove
00044    *  the MotionCommand when it gets there - but beware fighting Postures which average out and neither
00045    *  succeeds */
00046   virtual int isAlive() {
00047     if(dirty || getAutoPrune()==false) //doesn't bother computing if we're staying alive anyway
00048       return true;
00049     PostureEngine tmp; 
00050     tmp.takeSnapshot(); 
00051     return (maxdiff(tmp)>tolerance);
00052   }
00053   //@}
00054 
00055   //!Had to override stuff to manage a dirty flag
00056   //!@name PostureEngine Stuff
00057   inline virtual void takeSnapshot() { dirty=true; PostureEngine::takeSnapshot(); }
00058   inline virtual void clear() { dirty=true; PostureEngine::clear(); }
00059   inline virtual PostureMC& setOverlay(const PostureEngine& pe) { dirty=true; PostureEngine::setOverlay(pe); return *this; }
00060   inline virtual PostureMC& setUnderlay(const PostureEngine& pe) { dirty=true; PostureEngine::setUnderlay(pe); return *this; }
00061   inline virtual PostureMC& setAverage(const PostureEngine& pe,float w=0.5) { dirty=true; PostureEngine::setAverage(pe,w); return *this; }
00062   inline virtual PostureMC& setCombine(const PostureEngine& pe) { dirty=true; PostureEngine::setCombine(pe); return *this; }
00063   inline PostureMC& setOutputCmd(unsigned int i, const OutputCmd& c) { dirty=true; PostureEngine::setOutputCmd(i,c); return *this; }
00064   inline virtual unsigned int LoadBuffer(const char buf[], unsigned int len) { dirty=true; return PostureEngine::LoadBuffer(buf,len); }
00065   //@}
00066 
00067 protected:
00068   bool dirty; //!< true if changes have been made since last updateOutputs()
00069   float tolerance; //!< when autopruning, if the maxdiff() of this posture and the robot's current position is below this value, isAlive() will be false, defaults to 0.01 (5.7 degree error)
00070 
00071   //!defines Registerable stuff
00072   /*  REGDEFCUSTOMMEM(PostureMC) {
00073     MotionCommand::registerDataRegions(regions);
00074     registerRegion(regions,&cmds,&cmds,sizeof(cmds));//for PostureEngine, LoadSave doesn't have any (nonstatic) members
00075     registerRegion(regions,&dirty,&tolerance,sizeof(tolerance));
00076     }*/
00077 };
00078 
00079 /*! @file
00080  * @brief Defines PostureMC, a MotionCommand shell for PostureEngine
00081  * @author ejt (Creator)
00082  *
00083  * $Author: ejt $
00084  * $Name: tekkotsu-2_0 $
00085  * $Revision: 1.5 $
00086  * $State: Exp $
00087  * $Date: 2004/01/06 01:01:50 $
00088  */
00089 
00090 #endif

Tekkotsu v2.0
Generated Wed Jan 21 03:20:29 2004 by Doxygen 1.3.4