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

ArActionIRs.cpp

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 #include "ArExport.h"
00028 #include "ariaOSDef.h"
00029 #include "ArActionIRs.h"
00030 #include "ArRobot.h"
00031 #include "ArCommands.h"
00032 
00039 ArActionIRs::ArActionIRs(const char *name, 
00040                                           double backOffSpeed,
00041                                           int backOffTime, int turnTime,
00042                                           bool setMaximums) :
00043   ArAction(name, "Reacts to the IRs triggering")
00044 {
00045   setNextArgument(ArArg("back off speed", &myBackOffSpeed, 
00046                         "Speed at which to back away (mm/sec)"));
00047   myBackOffSpeed = backOffSpeed;
00048 
00049   setNextArgument(ArArg("back off time", &myBackOffTime,
00050                         "Number of msec to back up for (msec)"));
00051   myBackOffTime = backOffTime;
00052 
00053   myStopTime = 1000;
00054 
00055   setNextArgument(ArArg("turn time", &myTurnTime,
00056                         "Number of msec to allow for turn (msec)"));
00057   myTurnTime = turnTime;
00058 
00059   setNextArgument(ArArg("set maximums", &mySetMaximums,
00060                         "Whether to set maximum vels or not (bool)"));
00061   mySetMaximums = setMaximums;
00062   
00063   myFiring = false; 
00064   mySpeed = 0.0;
00065   myHeading = 0.0;
00066 }
00067 
00068 ArActionIRs::~ArActionIRs()
00069 {
00070 
00071 }
00072 
00073 void ArActionIRs::setRobot(ArRobot *robot)
00074 {
00075   myRobot = robot;
00076   const ArRobotParams *params;
00077   params = myRobot->getRobotParams();
00078   myParams = *params;
00079   
00080   for(int i = 0; i < myParams.getNumIR(); i++)
00081     cycleCounters.push_back(1);
00082 }
00083 
00084 ArActionDesired *ArActionIRs::fire(ArActionDesired currentDesired)
00085 {
00086   myDesired.reset();
00087 
00088   double angle = 0;
00089   int counter = 0;
00090   double turnRange = 135;
00091 
00092   ArUtil::BITS bit;
00093 
00094   if(myFiring)
00095     {  
00096       if (myStartBack.mSecSince() < myBackOffTime)
00097         {
00098           myDesired.setVel(mySpeed);
00099           myDesired.setDeltaHeading(0);
00100           return &myDesired;
00101         }
00102       else if (myStartBack.mSecSince() < myBackOffTime + myTurnTime &&
00103              ArMath::fabs(ArMath::subAngle(myRobot->getTh(), myHeading)) > 3)
00104         {
00105           myDesired.setVel(0);
00106           myDesired.setHeading(myHeading);
00107           return &myDesired;
00108         }  
00109       else if(stoppedSince.mSecSince() < myStopTime)
00110         {
00111           myDesired.setVel(0);
00112           myDesired.setDeltaHeading(0);
00113           return &myDesired;
00114         }
00115     
00116       myFiring = false;
00117     }
00118 
00119 
00120   if(myParams.haveTableSensingIR())
00121     {
00122       for (int i = 0; i < myParams.getNumIR(); ++i)
00123         {
00124           switch(i)
00125             {
00126             case 0:
00127               bit = ArUtil::BIT0;
00128               break;
00129             case 1:
00130               bit = ArUtil::BIT1;
00131               break;
00132             case 2:
00133               bit = ArUtil::BIT2;
00134               break;
00135             case 3:
00136               bit = ArUtil::BIT3;
00137               break;
00138             case 4:
00139               bit = ArUtil::BIT4;
00140               break;
00141             case 5:
00142               bit = ArUtil::BIT5;
00143               break;
00144             case 6:
00145               bit = ArUtil::BIT6;
00146               break;
00147             case 7:
00148               bit = ArUtil::BIT7;
00149               break;
00150             }
00151           if(myParams.haveNewTableSensingIR() && myRobot->getIODigInSize() > 3)
00152             {
00153               if((myParams.getIRType(i) && !(myRobot->getIODigIn(3) & bit)) ||
00154                  (!myParams.getIRType(i) && (myRobot->getIODigIn(3) & bit)))
00155               {
00156                 if(cycleCounters[i] < myParams.getIRCycles(i))
00157                   {
00158                     cycleCounters[i] = cycleCounters[i] + 1;          
00159                   }
00160                 else
00161                   {
00162                     cycleCounters[i] = 1;
00163                    
00164                     ArPose pose;
00165                     pose.setX(myParams.getIRX(i));
00166                     pose.setY(myParams.getIRY(i));
00167                     if(pose.getX() > 0)
00168                       {
00169                         ArPose center(0,0,0);
00170                         angle += center.findAngleTo(pose);
00171                         counter++;
00172                       }
00173                   }
00174               }
00175               else
00176                 {
00177                   cycleCounters[i] = 1;
00178                 }
00179             }
00180           else
00181             {
00182               if(!(myRobot->getDigIn() & bit))
00183               {
00184                 if(cycleCounters[i] < myParams.getIRCycles(i))
00185                   {
00186                     cycleCounters[i] = cycleCounters[i] + 1;          
00187                   }
00188                 else
00189                   {
00190                     cycleCounters[i] = 1;
00191                     
00192                     ArPose pose;
00193                     pose.setX(myParams.getIRX(i));
00194                     pose.setY(myParams.getIRY(i));
00195                     if(pose.getX() > 0)
00196                       {
00197                         ArPose center(0,0,0);
00198                         angle += center.findAngleTo(pose);
00199                         counter++;
00200                       }
00201                   }
00202               }
00203               else
00204                 {
00205                   cycleCounters[i] = 1;
00206                 }
00207               
00208             }
00209         }
00210  
00211       if(counter > 0 && myRobot->getVel() > 50)
00212         {
00213           angle = angle / (double) counter;
00214           if(angle > (turnRange / 2))
00215             angle = turnRange / 2;
00216           else if(angle < -(turnRange / 2))
00217             angle = -(turnRange / 2);
00218           
00219           if(angle < 0) angle = ((turnRange / 2) + angle) * -1;
00220           else angle = ((turnRange / 2) - angle);
00221         
00222           myHeading = ArMath::addAngle(myRobot->getTh(), angle);
00223           mySpeed = -myBackOffSpeed;
00224           myStartBack.setToNow();
00225           myRobot->comInt(ArCommands::ESTOP, 0);
00226           myFiring = true;
00227           
00228           myDesired.setVel(mySpeed);
00229           myDesired.setHeading(myHeading);
00230   
00231         }
00232       else if(counter > 0 && (myRobot->getVel() > -50 && myRobot->getVel() < 50))
00233         {
00234           stoppedSince.setToNow();
00235         }
00236       else return NULL;
00237     }
00238   else return NULL;
00239   
00240 
00241   return &myDesired;
00242 }  

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