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