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 "ArActionKeydrive.h"
00029 #include "ArRobot.h"
00030 #include "ariaInternal.h"
00031 #include "ArKeyHandler.h"
00032
00033 AREXPORT ArActionKeydrive::ArActionKeydrive(const char *name,
00034 double transVelMax,
00035 double turnAmountMax,
00036 double velIncrement,
00037 double turnIncrement)
00038 :
00039 ArAction(name, "This action reads the keyboard arrow keys and sets the translational and rotational velocities based on this."),
00040 myUpCB(this, &ArActionKeydrive::up),
00041 myDownCB(this, &ArActionKeydrive::down),
00042 myLeftCB(this, &ArActionKeydrive::left),
00043 myRightCB(this, &ArActionKeydrive::right),
00044 mySpaceCB(this, &ArActionKeydrive::space)
00045 {
00046 setNextArgument(ArArg("trans vel max", &myTransVelMax, "The maximum speed to go (mm/sec)"));
00047 myTransVelMax = transVelMax;
00048
00049 setNextArgument(ArArg("turn amount max", &myTurnAmountMax, "The maximum amount to turn (deg/cycle)"));
00050 myTurnAmountMax = turnAmountMax;
00051
00052 setNextArgument(ArArg("vel increment per keypress", &myVelIncrement, "The amount to increment velocity by per keypress (mm/sec)"));
00053 myVelIncrement = velIncrement;
00054
00055 setNextArgument(ArArg("turn increment per keypress", &myVelIncrement, "The amount to turn by per keypress (deg)"));
00056 myTurnIncrement = turnIncrement;
00057
00058 myDesiredSpeed = 0;
00059 myDeltaVel = 0;
00060 myTurnAmount = 0;
00061 mySpeedReset = true;
00062 }
00063
00064 AREXPORT ArActionKeydrive::~ArActionKeydrive()
00065 {
00066
00067 }
00068
00069 AREXPORT void ArActionKeydrive::setRobot(ArRobot *robot)
00070 {
00071 ArKeyHandler *keyHandler;
00072 myRobot = robot;
00073 if (robot == NULL)
00074 return;
00075
00076
00077 if ((keyHandler = Aria::getKeyHandler()) == NULL)
00078 {
00079 keyHandler = new ArKeyHandler;
00080 Aria::setKeyHandler(keyHandler);
00081 myRobot->attachKeyHandler(keyHandler);
00082 }
00083 takeKeys();
00084 }
00085
00086 AREXPORT void ArActionKeydrive::takeKeys(void)
00087 {
00088 ArKeyHandler *keyHandler;
00089 if ((keyHandler = Aria::getKeyHandler()) == NULL)
00090 {
00091 ArLog::log(ArLog::Terse,
00092 "ArActionKeydrive::takeKeys: There is no key handler, keydrive will not work.");
00093 }
00094
00095
00096 if (!keyHandler->addKeyHandler(ArKeyHandler::UP, &myUpCB))
00097 ArLog::log(ArLog::Terse, "The key handler already has a key for up, keydrive will not work correctly.");
00098 if (!keyHandler->addKeyHandler(ArKeyHandler::DOWN, &myDownCB))
00099 ArLog::log(ArLog::Terse, "The key handler already has a key for down, keydrive will not work correctly.");
00100 if (!keyHandler->addKeyHandler(ArKeyHandler::LEFT, &myLeftCB))
00101 ArLog::log(ArLog::Terse,
00102 "The key handler already has a key for left, keydrive will not work correctly.");
00103 if (!keyHandler->addKeyHandler(ArKeyHandler::RIGHT, &myRightCB))
00104 ArLog::log(ArLog::Terse,
00105 "The key handler already has a key for right, keydrive will not work correctly.");
00106 if (!keyHandler->addKeyHandler(ArKeyHandler::SPACE, &mySpaceCB))
00107 ArLog::log(ArLog::Terse,
00108 "The key handler already has a key for space, keydrive will not work correctly.");
00109 }
00110
00111 AREXPORT void ArActionKeydrive::giveUpKeys(void)
00112 {
00113 ArKeyHandler *keyHandler;
00114 if ((keyHandler = Aria::getKeyHandler()) == NULL)
00115 {
00116 ArLog::log(ArLog::Terse,
00117 "ArActionKeydrive::giveUpKeys: There is no key handler, something is probably horribly wrong .");
00118 }
00119
00120
00121 if (!keyHandler->remKeyHandler(&myUpCB))
00122 ArLog::log(ArLog::Terse, "ArActionKeydrive: The key handler already didn't have a key for up, something is wrong.");
00123 if (!keyHandler->remKeyHandler(&myDownCB))
00124 ArLog::log(ArLog::Terse, "ArActionKeydrive: The key handler already didn't have a key for down, something is wrong.");
00125 if (!keyHandler->remKeyHandler(&myLeftCB))
00126 ArLog::log(ArLog::Terse,
00127 "ArActionKeydrive: The key handler already didn't have a key for left, something is wrong.");
00128 if (!keyHandler->remKeyHandler(&myRightCB))
00129 ArLog::log(ArLog::Terse,
00130 "ArActionKeydrive: The key handler already didn't have a key for right, something is wrong.");
00131 if (!keyHandler->remKeyHandler(&mySpaceCB))
00132 ArLog::log(ArLog::Terse,
00133 "ArActionKeydrive: The key handler didn't have a key for space, something is wrong.");
00134 }
00135
00136 AREXPORT void ArActionKeydrive::setSpeeds(double transVelMax,
00137 double turnAmountMax)
00138 {
00139 myTransVelMax = transVelMax;
00140 myTurnAmountMax = turnAmountMax;
00141 }
00142
00143 AREXPORT void ArActionKeydrive::setIncrements(double velIncrement,
00144 double turnIncrement)
00145 {
00146 myVelIncrement = velIncrement;
00147 myTurnIncrement = turnIncrement;
00148 }
00149
00150 AREXPORT void ArActionKeydrive::up(void)
00151 {
00152 myDeltaVel += myVelIncrement;
00153 }
00154
00155 AREXPORT void ArActionKeydrive::down(void)
00156 {
00157 myDeltaVel -= myVelIncrement;
00158 }
00159
00160 AREXPORT void ArActionKeydrive::left(void)
00161 {
00162 myTurnAmount += myTurnIncrement;
00163 if (myTurnAmount > myTurnAmountMax)
00164 myTurnAmount = myTurnAmountMax;
00165 }
00166
00167 AREXPORT void ArActionKeydrive::right(void)
00168 {
00169 myTurnAmount -= myTurnIncrement;
00170 if (myTurnAmount < -myTurnAmountMax)
00171 myTurnAmount = -myTurnAmountMax;
00172 }
00173
00174 AREXPORT void ArActionKeydrive::space(void)
00175 {
00176 mySpeedReset = false;
00177 myDesiredSpeed = 0;
00178 myTurnAmount = 0;
00179 }
00180
00181 AREXPORT void ArActionKeydrive::activate(void)
00182 {
00183 if (!myIsActive)
00184 takeKeys();
00185 myIsActive = true;
00186 }
00187
00188 AREXPORT void ArActionKeydrive::deactivate(void)
00189 {
00190 if (myIsActive)
00191 giveUpKeys();
00192 myIsActive = false;
00193 myDesiredSpeed = 0;
00194 myTurnAmount = 0;
00195 }
00196
00197 AREXPORT ArActionDesired *ArActionKeydrive::fire(ArActionDesired currentDesired)
00198 {
00199 myDesired.reset();
00200
00201
00202 if (fabs(currentDesired.getVelStrength() - 1.0) < .0000000000001)
00203 {
00204 mySpeedReset = true;
00205 }
00206
00207
00208 if (mySpeedReset && myDesiredSpeed > 0 && myDesiredSpeed > myRobot->getVel())
00209 myDesiredSpeed = myRobot->getVel();
00210 if (mySpeedReset && myDesiredSpeed < 0 && myDesiredSpeed < myRobot->getVel())
00211 myDesiredSpeed = myRobot->getVel();
00212 mySpeedReset = false;
00213
00214 if (currentDesired.getMaxVelStrength() &&
00215 myDesiredSpeed > currentDesired.getMaxVel())
00216 myDesiredSpeed = currentDesired.getMaxVel();
00217
00218 if (currentDesired.getMaxNegVelStrength() &&
00219 myDesiredSpeed < currentDesired.getMaxNegVel())
00220 myDesiredSpeed = currentDesired.getMaxNegVel();
00221
00222 myDesiredSpeed += myDeltaVel;
00223 if (myDesiredSpeed > myTransVelMax)
00224 myDesiredSpeed = myTransVelMax;
00225 if (myDesiredSpeed < -myTransVelMax)
00226 myDesiredSpeed = -myTransVelMax;
00227
00228 myDesired.setVel(myDesiredSpeed);
00229 myDeltaVel = 0;
00230
00231 myDesired.setDeltaHeading(myTurnAmount);
00232 myTurnAmount = 0;
00233
00234
00235 return &myDesired;
00236 }