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
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
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
00398
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