00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
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
00068
00069 if (myAllowOverride && myStrength >= MIN_STRENGTH)
00070 {
00071
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
00083 else if (desiredChannel->getStrength() >= MIN_STRENGTH)
00084 {
00085 myDesired = desiredChannel->getDesired();
00086 }
00087
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
00103
00104
00105 if (myAllowOverride)
00106 {
00107
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
00119 else if (desiredChannel->getStrength() >= MIN_STRENGTH)
00120 {
00121 myDesired = desiredChannel->getDesired();
00122 }
00123
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
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
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
00509
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