Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

ArActionDesired.h

00001 /*
00002 ActivMedia Robotics Interface for Applications (ARIA)
00003 Copyright (C) 2004,2005 ActivMedia Robotics, LLC
00004 
00005 
00006      This program is free software; you can redistribute it and/or modify
00007      it under the terms of the GNU General Public License as published by
00008      the Free Software Foundation; either version 2 of the License, or
00009      (at your option) any later version.
00010 
00011      This program is distributed in the hope that it will be useful,
00012      but WITHOUT ANY WARRANTY; without even the implied warranty of
00013      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014      GNU General Public License for more details.
00015 
00016      You should have received a copy of the GNU General Public License
00017      along with this program; if not, write to the Free Software
00018      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 
00020 If you wish to redistribute ARIA under different terms, contact 
00021 ActivMedia Robotics for information about a commercial version of ARIA at 
00022 robots@activmedia.com or 
00023 ActivMedia Robotics, 19 Columbia Drive, Amherst, NH 03031; 800-639-9481
00024 
00025 */
00026 
00027 #ifndef ARACTIONDESIRED_H
00028 #define ARACTIONDESIRED_H
00029 
00030 #include "ariaUtil.h"
00031 
00033 class ArActionDesiredChannel
00034 {
00035 public:
00036   static const double NO_STRENGTH;
00037   static const double MIN_STRENGTH;
00038   static const double MAX_STRENGTH;
00039   
00040   ArActionDesiredChannel() { reset(); }
00041   ~ArActionDesiredChannel() {}
00042   void setDesired(double desired, double desiredStrength) 
00043     {
00044       myDesired = desired;
00045       myStrength = desiredStrength; 
00046       if (myStrength > MAX_STRENGTH)
00047         myStrength = MAX_STRENGTH;
00048       if (myStrength < MIN_STRENGTH)
00049         myStrength = NO_STRENGTH;
00050     }
00051   double getDesired(void)  { return myDesired; }
00052   double getStrength(void)  { return myStrength; }
00053   void reset(void) { myDesired = 0; myStrength = NO_STRENGTH;}
00054   void merge(ArActionDesiredChannel *desiredChannel)
00055     {
00056       double otherStrength = desiredChannel->getStrength();
00057       double oldStrength = myStrength;
00058       if (myStrength + otherStrength > MAX_STRENGTH)
00059         otherStrength = MAX_STRENGTH - myStrength;
00060       myStrength = myStrength + otherStrength;
00061       if (myStrength >= MIN_STRENGTH)
00062         myDesired = (((oldStrength * myDesired) + 
00063                       (desiredChannel->getDesired() * otherStrength)) 
00064                      / (myStrength));
00065     }
00066   void startAverage(void)
00067     {
00068       myDesiredTotal = myDesired * myStrength;
00069       myStrengthTotal = myStrength;
00070     }
00071   void addAverage(ArActionDesiredChannel *desiredChannel)
00072     {
00073       myDesiredTotal += (desiredChannel->getDesired() * 
00074                          desiredChannel->getStrength());
00075       myStrengthTotal += desiredChannel->getStrength();
00076     }
00077   void endAverage(void)
00078     {
00079       if (myStrengthTotal < MIN_STRENGTH)
00080       {
00081         myStrength = NO_STRENGTH;
00082         return;
00083       }
00084       myDesired = (myDesiredTotal / myStrengthTotal);
00085       myStrength = myStrengthTotal;
00086       if (myStrength > MAX_STRENGTH)
00087         myStrength = MAX_STRENGTH;
00088     }
00089 protected:
00090   double myDesired;
00091   double myStrength;
00092   double myDesiredTotal;
00093   double myStrengthTotal;
00094 };
00095 
00097 
00117 class ArActionDesired
00118 {
00119 public:
00120   static const double NO_STRENGTH;
00121   static const double MIN_STRENGTH;
00122   static const double MAX_STRENGTH;
00124   ArActionDesired() { myHeadingSet = false; }
00126   virtual ~ArActionDesired() {}
00127   
00129 
00133   virtual void setVel(double vel, double strength = MAX_STRENGTH)
00134     { myVelDes.setDesired(vel, strength); }
00136 
00141   virtual void setDeltaHeading(double deltaHeading, double strength = MAX_STRENGTH)
00142     { myDeltaHeadingDes.setDesired(deltaHeading, strength); }
00144 
00153   virtual void setHeading(double heading, double strength = MAX_STRENGTH)
00154     { myHeading = heading; myHeadingStrength = strength; myHeadingSet = true; }
00155 
00157 
00162   virtual void setRotVel(double rotVel, double strength = MAX_STRENGTH)
00163     { myRotVelDes.setDesired(rotVel, strength); }
00164 
00165 
00167 
00176   virtual void setMaxVel(double maxVel, double strength = MAX_STRENGTH)
00177     { myMaxVelDes.setDesired(maxVel, strength); }
00179 
00187   virtual void setMaxNegVel(double maxVel, double strength = MAX_STRENGTH)
00188     { myMaxNegVelDes.setDesired(maxVel, strength); }
00189 
00191 
00199   virtual void setTransAccel(double transAccel, double strength = MAX_STRENGTH)
00200     { myTransAccelDes.setDesired(transAccel, strength);  }
00201 
00203 
00211   virtual void setTransDecel(double transDecel, double strength = MAX_STRENGTH)
00212     { myTransDecelDes.setDesired(transDecel, strength);  }
00213 
00215 
00223   virtual void setMaxRotVel(double maxVel, double strength = MAX_STRENGTH)
00224     { myMaxRotVelDes.setDesired(maxVel, strength); }
00225 
00227 
00235   virtual void setRotAccel(double rotAccel, double strength = MAX_STRENGTH)
00236     { myRotAccelDes.setDesired(rotAccel, strength);  }
00237 
00239 
00247   virtual void setRotDecel(double rotDecel, double strength = MAX_STRENGTH)
00248     { myRotDecelDes.setDesired(rotDecel, strength);  }
00249 
00251   virtual void reset(void) 
00252     {
00253       myVelDes.reset(); myDeltaHeadingDes.reset(); 
00254       myMaxVelDes.reset(); myMaxNegVelDes.reset(); myMaxRotVelDes.reset(); 
00255       myRotVelDes.reset();
00256       myTransAccelDes.reset(); myTransDecelDes.reset();
00257       myRotAccelDes.reset(); myRotDecelDes.reset();
00258       myHeadingSet = false;
00259     }
00260 
00262   virtual double getVel(void)  
00263     { return myVelDes.getDesired(); }
00265   virtual double getVelStrength(void) 
00266     { return myVelDes.getStrength(); }
00268   virtual double getHeading(void)
00269     { return myHeading; }
00271   virtual double getHeadingStrength(void)
00272     { return myHeadingStrength; }
00274   virtual double getDeltaHeading(void)
00275     { return myDeltaHeadingDes.getDesired(); }
00277   virtual double getDeltaHeadingStrength(void)
00278     { return myDeltaHeadingDes.getStrength(); }
00280   virtual double getRotVelStrength(void) { return myRotVelDes.getStrength(); }
00282   virtual double getRotVel(void) { return myRotVelDes.getDesired(); }
00283 
00284 
00286   virtual double getMaxVel(void)
00287     { return myMaxVelDes.getDesired(); }
00289   virtual double getMaxVelStrength(void)
00290     { return myMaxVelDes.getStrength(); }
00292   virtual double getMaxNegVel(void)
00293     { return myMaxNegVelDes.getDesired(); }
00295   virtual double getMaxNegVelStrength(void)
00296     { return myMaxNegVelDes.getStrength(); }
00298   virtual double getTransAccel(void)
00299     { return myTransAccelDes.getDesired(); }
00301   virtual double getTransAccelStrength(void)
00302     { return myTransAccelDes.getStrength(); }
00304   virtual double getTransDecel(void)
00305     { return myTransDecelDes.getDesired(); }
00307   virtual double getTransDecelStrength(void)
00308     { return myTransDecelDes.getStrength(); }
00309 
00311   virtual double getMaxRotVel(void)
00312     { return myMaxRotVelDes.getDesired(); }
00314   virtual double getMaxRotVelStrength(void)
00315     { return myMaxRotVelDes.getStrength(); }
00317   virtual double getRotAccel(void)
00318     { return myRotAccelDes.getDesired(); }
00320   virtual double getRotAccelStrength(void)
00321     { return myRotAccelDes.getStrength(); }
00323   virtual double getRotDecel(void)
00324     { return myRotDecelDes.getDesired(); }
00326   virtual double getRotDecelStrength(void)
00327     { return myRotDecelDes.getStrength(); }
00328 
00331 
00338   virtual void merge(ArActionDesired *actDesired)
00339     {
00340       if (actDesired == NULL)
00341         return;
00342       myVelDes.merge(&actDesired->myVelDes);
00343       // if we're already using rot or delt use that, otherwise use what it wants
00344       if (myDeltaHeadingDes.getStrength() > NO_STRENGTH)
00345 
00346       {
00347         myDeltaHeadingDes.merge(&actDesired->myDeltaHeadingDes);
00348       }
00349       else if (myRotVelDes.getStrength() > NO_STRENGTH)
00350       {
00351         myRotVelDes.merge(&actDesired->myRotVelDes);
00352       }
00353       else
00354       {
00355         myDeltaHeadingDes.merge(&actDesired->myDeltaHeadingDes);
00356         myRotVelDes.merge(&actDesired->myRotVelDes);
00357       }
00358       myMaxVelDes.merge(&actDesired->myMaxVelDes);
00359       myMaxNegVelDes.merge(&actDesired->myMaxNegVelDes);
00360       myMaxRotVelDes.merge(&actDesired->myMaxRotVelDes);
00361       myTransAccelDes.merge(&actDesired->myTransAccelDes);
00362       myTransDecelDes.merge(&actDesired->myTransDecelDes);
00363       myRotAccelDes.merge(&actDesired->myRotAccelDes);
00364       myRotDecelDes.merge(&actDesired->myRotDecelDes);
00365     }
00367 
00374   virtual void startAverage(void)
00375     {
00376       myVelDes.startAverage();
00377       myRotVelDes.startAverage();
00378       myDeltaHeadingDes.startAverage();
00379       myMaxVelDes.startAverage();
00380       myMaxNegVelDes.startAverage();
00381       myMaxRotVelDes.startAverage();
00382       myTransAccelDes.startAverage();
00383       myTransDecelDes.startAverage();
00384       myRotAccelDes.startAverage();
00385       myRotDecelDes.startAverage();
00386     }
00388 
00392   virtual void addAverage(ArActionDesired *actDesired)
00393     {
00394       if (actDesired == NULL)
00395         return;
00396       myVelDes.addAverage(&actDesired->myVelDes);
00397       // if we're using one of rot or delta heading use that,
00398       // otherwise use whatever they're using
00399       if (myRotVelDes.getStrength() > NO_STRENGTH)
00400       {
00401         myRotVelDes.addAverage(
00402                 &actDesired->myRotVelDes);
00403       }
00404       else if (myDeltaHeadingDes.getStrength() > NO_STRENGTH)
00405       {
00406         myDeltaHeadingDes.addAverage(
00407                 &actDesired->myDeltaHeadingDes);
00408       }
00409       else
00410       {
00411         myRotVelDes.addAverage(
00412                 &actDesired->myRotVelDes);
00413         myDeltaHeadingDes.addAverage(
00414                 &actDesired->myDeltaHeadingDes);
00415       }
00416 
00417       myMaxVelDes.addAverage(&actDesired->myMaxVelDes);
00418       myMaxNegVelDes.addAverage(&actDesired->myMaxNegVelDes);
00419       myMaxRotVelDes.addAverage(&actDesired->myMaxRotVelDes);
00420       myTransAccelDes.addAverage(&actDesired->myTransAccelDes);
00421       myTransDecelDes.addAverage(&actDesired->myTransDecelDes);
00422       myRotAccelDes.addAverage(&actDesired->myRotAccelDes);
00423       myRotDecelDes.addAverage(&actDesired->myRotDecelDes);
00424     }
00426 
00429   virtual void endAverage(void)
00430     {
00431       myVelDes.endAverage();
00432       myRotVelDes.endAverage();
00433       myDeltaHeadingDes.endAverage();
00434       myMaxVelDes.endAverage();
00435       myMaxNegVelDes.endAverage();
00436       myMaxRotVelDes.endAverage();
00437       myTransAccelDes.endAverage();
00438       myTransDecelDes.endAverage();
00439       myRotAccelDes.endAverage();
00440       myRotDecelDes.endAverage();
00441     }
00443 
00449   virtual void accountForRobotHeading(double robotHeading)
00450     {
00451       if (myHeadingSet)
00452         setDeltaHeading(ArMath::subAngle(myHeading, robotHeading), 
00453                         myHeadingStrength);
00454       myHeadingSet = false;
00455     }
00456 protected:
00457   double myHeading;
00458   double myHeadingStrength;
00459   bool myHeadingSet;
00460   ArActionDesiredChannel myRotVelDes;
00461   ArActionDesiredChannel myVelDes;
00462   ArActionDesiredChannel myDeltaHeadingDes;
00463   ArActionDesiredChannel myMaxVelDes;
00464   ArActionDesiredChannel myMaxNegVelDes;
00465   ArActionDesiredChannel myMaxRotVelDes;
00466   ArActionDesiredChannel myTransAccelDes;
00467   ArActionDesiredChannel myTransDecelDes;
00468   ArActionDesiredChannel myRotAccelDes;
00469   ArActionDesiredChannel myRotDecelDes;
00470 };
00471 
00472 
00473 #endif

Generated on Wed Oct 19 12:56:34 2005 for Aria by  doxygen 1.4.0