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

ArActionDesired.h

00001 /*
00002 MobileRobots Advanced Robotics Interface for Applications (ARIA)
00003 Copyright (C) 2004, 2005 ActivMedia Robotics LLC
00004 Copyright (C) 2006, 2007 MobileRobots Inc.
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 MobileRobots for information about a commercial version of ARIA at 
00022 robots@mobilerobots.com or 
00023 MobileRobots Inc, 19 Columbia Drive, Amherst, NH 03031; 800-639-9481
00024 */
00025 
00026 #ifndef ARACTIONDESIRED_H
00027 #define ARACTIONDESIRED_H
00028 
00029 #include "ariaUtil.h"
00030 
00032 class ArActionDesiredChannel
00033 {
00034 public:
00035   AREXPORT static const double NO_STRENGTH;
00036   AREXPORT static const double MIN_STRENGTH;
00037   AREXPORT static const double MAX_STRENGTH;
00038   
00039   ArActionDesiredChannel() { reset(); myOverrideDoesLessThan = true; }
00040   ~ArActionDesiredChannel() {}
00041   void setOverrideDoesLessThan(bool overrideDoesLessThan) 
00042     { myOverrideDoesLessThan = overrideDoesLessThan; }
00043   void setDesired(double desired, double desiredStrength, 
00044           bool allowOverride = false) 
00045     {
00046       myDesired = desired;
00047       myStrength = desiredStrength; 
00048       myAllowOverride = allowOverride;
00049       if (myStrength > MAX_STRENGTH)
00050     myStrength = MAX_STRENGTH;
00051       if (myStrength < MIN_STRENGTH)
00052     myStrength = NO_STRENGTH;
00053     }
00054   double getDesired(void) const { return myDesired; }
00055   double getStrength(void) const { return myStrength; }
00056   double getAllowOverride(void) const { return myAllowOverride; }
00057   void reset(void) 
00058     { myDesired = 0; myStrength = NO_STRENGTH; myAllowOverride = true; }
00059   void merge(ArActionDesiredChannel *desiredChannel)
00060     {
00061       double otherStrength = desiredChannel->getStrength();
00062       double oldStrength = myStrength;
00063       if (myStrength + otherStrength > MAX_STRENGTH)
00064     otherStrength = MAX_STRENGTH - myStrength;
00065       myStrength = myStrength + otherStrength;
00066       myAllowOverride = myAllowOverride && desiredChannel->getAllowOverride();
00067       // if we're allowing override just set myDesired to the least
00068       // (or greatest) value
00069       if (myAllowOverride && myStrength >= MIN_STRENGTH)
00070       {
00071     // if both have strength get the min/max
00072     if (oldStrength >= MIN_STRENGTH && 
00073         desiredChannel->getStrength() >= MIN_STRENGTH)
00074     {
00075       if (myOverrideDoesLessThan)
00076         myDesired = ArUtil::findMin(myDesired, 
00077                     desiredChannel->getDesired());
00078       else if (!myOverrideDoesLessThan)
00079         myDesired = ArUtil::findMax(myDesired, 
00080                     desiredChannel->getDesired());
00081     }
00082     // if only it has strength use it
00083     else if (desiredChannel->getStrength() >= MIN_STRENGTH)
00084     {
00085       myDesired = desiredChannel->getDesired();
00086     }
00087     // if only this has strength then we don't need to do anything
00088       }
00089       else if (myStrength >= MIN_STRENGTH)
00090     myDesired = (((oldStrength * myDesired) + 
00091               (desiredChannel->getDesired() * otherStrength)) 
00092              / (myStrength));
00093     }
00094   void startAverage(void)
00095     {
00096       myDesiredTotal = myDesired * myStrength;
00097       myStrengthTotal = myStrength;
00098     }
00099   void addAverage(ArActionDesiredChannel *desiredChannel)
00100     {
00101       myAllowOverride = myAllowOverride && desiredChannel->getAllowOverride();
00102       // if we're allowing override then myDesired is just the least
00103       // of the values thats going to come through... still compute
00104       // the old way in case something doesn't want to override it
00105       if (myAllowOverride)
00106       {
00107     // if both have strength get the min/max
00108     if (myStrength >= MIN_STRENGTH && 
00109         desiredChannel->getStrength() >= MIN_STRENGTH)
00110     {
00111       if (myOverrideDoesLessThan)
00112         myDesired = ArUtil::findMin(myDesired, 
00113                     desiredChannel->getDesired());
00114       else if (!myOverrideDoesLessThan)
00115         myDesired = ArUtil::findMax(myDesired, 
00116                     desiredChannel->getDesired());
00117     }
00118     // if only it has strength use it
00119     else if (desiredChannel->getStrength() >= MIN_STRENGTH)
00120     {
00121       myDesired = desiredChannel->getDesired();
00122     }
00123     // if only this has strength then we don't need to do anything
00124       }
00125       myDesiredTotal += (desiredChannel->getDesired() * 
00126              desiredChannel->getStrength());
00127       myStrengthTotal += desiredChannel->getStrength();
00128     }
00129   void endAverage(void)
00130     {
00131       if (myStrengthTotal < MIN_STRENGTH)
00132       {
00133     myStrength = NO_STRENGTH;
00134     return;
00135       }
00136       // if we're overriding we just use what myDesired already is
00137       if (!myAllowOverride)
00138     myDesired = (myDesiredTotal / myStrengthTotal);
00139       myStrength = myStrengthTotal;
00140       if (myStrength > MAX_STRENGTH)
00141     myStrength = MAX_STRENGTH;
00142     }
00143 protected:
00144   double myDesired;
00145   double myStrength;
00146   bool myAllowOverride;
00147   double myDesiredTotal;
00148   double myStrengthTotal;
00149   bool myOverrideDoesLessThan;
00150 };
00151 
00153 
00183 class ArActionDesired
00184 {
00185 public:
00186   AREXPORT static const double NO_STRENGTH;
00187   AREXPORT static const double MIN_STRENGTH;
00188   AREXPORT static const double MAX_STRENGTH;
00190   ArActionDesired() 
00191     { myHeadingSet = false; 
00192     myTransDecelDes.setOverrideDoesLessThan(false); 
00193     myRotDecelDes.setOverrideDoesLessThan(false); }
00195   virtual ~ArActionDesired() {}
00196   
00198 
00202   virtual void setVel(double vel, double strength = MAX_STRENGTH)
00203     { myVelDes.setDesired(vel, strength); }
00205 
00210   virtual void setDeltaHeading(double deltaHeading, 
00211                    double strength = MAX_STRENGTH)
00212     { myDeltaHeadingDes.setDesired(deltaHeading, strength); }
00214 
00223   virtual void setHeading(double heading, double strength = MAX_STRENGTH)
00224     { myHeading = heading; myHeadingStrength = strength; myHeadingSet = true; }
00225 
00227 
00232   virtual void setRotVel(double rotVel, double strength = MAX_STRENGTH)
00233     { myRotVelDes.setDesired(rotVel, strength); }
00234 
00235 
00237 
00247   virtual void setMaxVel(double maxVel, double strength = MAX_STRENGTH,
00248              bool useSlowest = true)
00249     { myMaxVelDes.setDesired(maxVel, strength, useSlowest); }
00251 
00260   virtual void setMaxNegVel(double maxVel, double strength = MAX_STRENGTH,
00261                 bool useSlowest = true)
00262     { myMaxNegVelDes.setDesired(maxVel, strength, useSlowest); }
00263 
00265 
00275   virtual void setTransAccel(double transAccel, 
00276                  double strength = MAX_STRENGTH,
00277                  bool useSlowest = true)
00278     { myTransAccelDes.setDesired(transAccel, strength, useSlowest);  }
00279 
00281 
00291   virtual void setTransDecel(double transDecel, double strength = MAX_STRENGTH,
00292                  bool useFastestDecel = true)
00293     { myTransDecelDes.setDesired(transDecel, strength, useFastestDecel);  }
00294 
00296 
00306   virtual void setMaxRotVel(double maxVel, double strength = MAX_STRENGTH,
00307                 bool useSlowest = true)
00308     { myMaxRotVelDes.setDesired(maxVel, strength, useSlowest); }
00309 
00311 
00321   virtual void setRotAccel(double rotAccel, double strength = MAX_STRENGTH,
00322                bool useSlowest = true)
00323     { myRotAccelDes.setDesired(rotAccel, strength, useSlowest);  }
00324 
00326 
00336   virtual void setRotDecel(double rotDecel, double strength = MAX_STRENGTH,
00337                bool useFastest = true)
00338     { myRotDecelDes.setDesired(rotDecel, strength, useFastest);  }
00339 
00341   virtual void reset(void) 
00342     {
00343       myVelDes.reset(); myDeltaHeadingDes.reset(); 
00344       myMaxVelDes.reset(); myMaxNegVelDes.reset(); myMaxRotVelDes.reset(); 
00345       myRotVelDes.reset();
00346       myTransAccelDes.reset(); myTransDecelDes.reset();
00347       myRotAccelDes.reset(); myRotDecelDes.reset();
00348       myHeadingSet = false;
00349     }
00350 
00352   virtual double getVel(void) const
00353     { return myVelDes.getDesired(); }
00355   virtual double getVelStrength(void) const
00356     { return myVelDes.getStrength(); }
00358   virtual double getHeading(void) const
00359     { return myHeading; }
00361   virtual double getHeadingStrength(void) const
00362     { return myHeadingStrength; }
00364   virtual double getDeltaHeading(void) const
00365     { return myDeltaHeadingDes.getDesired(); }
00367   virtual double getDeltaHeadingStrength(void) const
00368     { return myDeltaHeadingDes.getStrength(); }
00370   virtual double getRotVel(void) const { return myRotVelDes.getDesired(); }
00372   virtual double getRotVelStrength(void) const 
00373     { return myRotVelDes.getStrength(); }
00374 
00376   virtual double getMaxVel(void) const
00377     { return myMaxVelDes.getDesired(); }
00379   virtual double getMaxVelStrength(void) const
00380     { return myMaxVelDes.getStrength(); }
00382   virtual double getMaxVelSlowestUsed(void) const
00383     { return myMaxVelDes.getAllowOverride(); }
00385   virtual double getMaxNegVel(void) const
00386     { return myMaxNegVelDes.getDesired(); }
00388   virtual double getMaxNegVelStrength(void) const
00389     { return myMaxNegVelDes.getStrength(); }
00391   virtual double getMaxNegVelSlowestUsed(void) const
00392     { return myMaxNegVelDes.getAllowOverride(); }
00394   virtual double getTransAccel(void) const
00395     { return myTransAccelDes.getDesired(); }
00397   virtual double getTransAccelStrength(void) const
00398     { return myTransAccelDes.getStrength(); }
00400   virtual double getTransAccelSlowestUsed(void) const
00401     { return myTransAccelDes.getAllowOverride(); }
00403   virtual double getTransDecel(void) const
00404     { return myTransDecelDes.getDesired(); }
00406   virtual double getTransDecelStrength(void) const
00407     { return myTransDecelDes.getStrength(); }
00409   virtual double getTransDecelFastestUsed(void) const
00410     { return myTransDecelDes.getAllowOverride(); }
00411 
00413   virtual double getMaxRotVel(void) const
00414     { return myMaxRotVelDes.getDesired(); }
00416   virtual double getMaxRotVelStrength(void) const
00417     { return myMaxRotVelDes.getStrength(); }
00419   virtual double getMaxRotVelSlowestUsed(void) const
00420     { return myMaxRotVelDes.getAllowOverride(); }
00422   virtual double getRotAccel(void) const
00423     { return myRotAccelDes.getDesired(); }
00425   virtual double getRotAccelStrength(void) const
00426     { return myRotAccelDes.getStrength(); }
00428   virtual double getMaxAccelSlowestUsed(void) const
00429     { return myRotAccelDes.getAllowOverride(); }
00431   virtual double getRotDecel(void) const
00432     { return myRotDecelDes.getDesired(); }
00434   virtual double getRotDecelStrength(void) const
00435     { return myRotDecelDes.getStrength(); }
00437   virtual double getRotDecelFastestUsed(void) const
00438     { return myRotDecelDes.getAllowOverride(); }
00439 
00440 
00443 
00450   virtual void merge(ArActionDesired *actDesired)
00451     {
00452       if (actDesired == NULL)
00453     return;
00454       myVelDes.merge(&actDesired->myVelDes);
00455       // if we're already using rot or delt use that, otherwise use what it wants
00456       if (myDeltaHeadingDes.getStrength() > NO_STRENGTH)
00457       {
00458     myDeltaHeadingDes.merge(&actDesired->myDeltaHeadingDes);
00459       }
00460       else if (myRotVelDes.getStrength() > NO_STRENGTH)
00461       {
00462     myRotVelDes.merge(&actDesired->myRotVelDes);
00463       }
00464       else
00465       {
00466     myDeltaHeadingDes.merge(&actDesired->myDeltaHeadingDes);
00467     myRotVelDes.merge(&actDesired->myRotVelDes);
00468       }
00469       myMaxVelDes.merge(&actDesired->myMaxVelDes);
00470       myMaxNegVelDes.merge(&actDesired->myMaxNegVelDes);
00471       myMaxRotVelDes.merge(&actDesired->myMaxRotVelDes);
00472       myTransAccelDes.merge(&actDesired->myTransAccelDes);
00473       myTransDecelDes.merge(&actDesired->myTransDecelDes);
00474       myRotAccelDes.merge(&actDesired->myRotAccelDes);
00475       myRotDecelDes.merge(&actDesired->myRotDecelDes);
00476     }
00478 
00485   virtual void startAverage(void)
00486     {
00487       myVelDes.startAverage();
00488       myRotVelDes.startAverage();
00489       myDeltaHeadingDes.startAverage();
00490       myMaxVelDes.startAverage();
00491       myMaxNegVelDes.startAverage();
00492       myMaxRotVelDes.startAverage();
00493       myTransAccelDes.startAverage();
00494       myTransDecelDes.startAverage();
00495       myRotAccelDes.startAverage();
00496       myRotDecelDes.startAverage();
00497     }
00499 
00503   virtual void addAverage(ArActionDesired *actDesired)
00504     {
00505       if (actDesired == NULL)
00506     return;
00507       myVelDes.addAverage(&actDesired->myVelDes);
00508       // if we're using one of rot or delta heading use that,
00509       // otherwise use whatever they're using
00510       if (myRotVelDes.getStrength() > NO_STRENGTH)
00511       {
00512     myRotVelDes.addAverage(
00513         &actDesired->myRotVelDes);
00514       }
00515       else if (myDeltaHeadingDes.getStrength() > NO_STRENGTH)
00516       {
00517     myDeltaHeadingDes.addAverage(
00518         &actDesired->myDeltaHeadingDes);
00519       }
00520       else
00521       {
00522     myRotVelDes.addAverage(
00523         &actDesired->myRotVelDes);
00524     myDeltaHeadingDes.addAverage(
00525         &actDesired->myDeltaHeadingDes);
00526       }
00527 
00528       myMaxVelDes.addAverage(&actDesired->myMaxVelDes);
00529       myMaxNegVelDes.addAverage(&actDesired->myMaxNegVelDes);
00530       myMaxRotVelDes.addAverage(&actDesired->myMaxRotVelDes);
00531       myTransAccelDes.addAverage(&actDesired->myTransAccelDes);
00532       myTransDecelDes.addAverage(&actDesired->myTransDecelDes);
00533       myRotAccelDes.addAverage(&actDesired->myRotAccelDes);
00534       myRotDecelDes.addAverage(&actDesired->myRotDecelDes);
00535     }
00537 
00540   virtual void endAverage(void)
00541     {
00542       myVelDes.endAverage();
00543       myRotVelDes.endAverage();
00544       myDeltaHeadingDes.endAverage();
00545       myMaxVelDes.endAverage();
00546       myMaxNegVelDes.endAverage();
00547       myMaxRotVelDes.endAverage();
00548       myTransAccelDes.endAverage();
00549       myTransDecelDes.endAverage();
00550       myRotAccelDes.endAverage();
00551       myRotDecelDes.endAverage();
00552     }
00554 
00560   virtual void accountForRobotHeading(double robotHeading)
00561     {
00562       if (myHeadingSet)
00563     setDeltaHeading(ArMath::subAngle(myHeading, robotHeading), 
00564             myHeadingStrength);
00565       myHeadingSet = false;
00566     }
00568   AREXPORT virtual void log(void) const;
00570   AREXPORT virtual bool isAnythingDesired(void) const;
00571 
00572 protected:
00573   double myHeading;
00574   double myHeadingStrength;
00575   bool myHeadingSet;
00576   ArActionDesiredChannel myRotVelDes;
00577   ArActionDesiredChannel myVelDes;
00578   ArActionDesiredChannel myDeltaHeadingDes;
00579   ArActionDesiredChannel myMaxVelDes;
00580   ArActionDesiredChannel myMaxNegVelDes;
00581   ArActionDesiredChannel myMaxRotVelDes;
00582   ArActionDesiredChannel myTransAccelDes;
00583   ArActionDesiredChannel myTransDecelDes;
00584   ArActionDesiredChannel myRotAccelDes;
00585   ArActionDesiredChannel myRotDecelDes;
00586 };
00587 
00588 
00589 #endif

Generated on Tue Feb 20 10:51:38 2007 for Aria by  doxygen 1.4.0