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 #include "ArExport.h"
00027 #include "ariaOSDef.h"
00028 #include "ArActionAvoidSide.h"
00029 #include "ArRobot.h"
00030
00037 AREXPORT ArActionAvoidSide::ArActionAvoidSide(const char *name,
00038 double obstacleDistance,
00039 double turnAmount) :
00040 ArAction(name, "Avoids side obstacles, ie walls")
00041 {
00042 setNextArgument(ArArg("obstacle distance", &myObsDist,
00043 "Distance at which to start avoiding (mm)"));
00044 myObsDist = obstacleDistance;
00045 setNextArgument(ArArg("turn amount", &myTurnAmount,
00046 "Degrees at which to turn (deg)"));
00047 myTurnAmount = turnAmount;
00048
00049 myTurning = false;
00050
00051 }
00052
00053 AREXPORT ArActionAvoidSide::~ArActionAvoidSide()
00054 {
00055
00056 }
00057
00058 AREXPORT ArActionDesired *ArActionAvoidSide::fire(
00059 ArActionDesired currentDesired)
00060 {
00061 double leftDist, rightDist;
00062
00063 leftDist = (myRobot->checkRangeDevicesCurrentPolar(60, 120) -
00064 myRobot->getRobotRadius());
00065 rightDist = (myRobot->checkRangeDevicesCurrentPolar(-120, -60) -
00066 myRobot->getRobotRadius());
00067
00068 myDesired.reset();
00069 if (leftDist < myObsDist)
00070 {
00071 myDesired.setDeltaHeading(-myTurnAmount);
00072 myDesired.setVel(0);
00073 myTurning = true;
00074 }
00075 else if (rightDist < myObsDist)
00076 {
00077 myDesired.setDeltaHeading(myTurnAmount);
00078 myDesired.setVel(0);
00079 myTurning = true;
00080 }
00081 else if (myTurning)
00082 myDesired.setDeltaHeading(0);
00083
00084 return &myDesired;
00085 }