KoduAgent.cc
Go to the documentation of this file.00001 
00002 
00003 #include "Kodu/KoduPage.h"
00004 #include "Kodu/General/GeneralFncs.h"
00005 #include "Kodu/PerceptualTasks/PerceptualTaskBase.h"
00006 #include "Kodu/Primitives/PerceptionSearch.h"
00007 
00008 #include "Kodu/KoduAgent.h"
00009 
00010 
00011 #include "DualCoding/ShapeTypes.h"
00012 #include "Shared/get_time.h"
00013 #include "Shared/mathutils.h"
00014 using namespace DualCoding;
00015 
00016 namespace Kodu {
00017 
00018     KoduAgent::KoduAgent()
00019       : gripperObject(),
00020         agentIsExecutingManipAction(false),
00021         agentWantsToDropObject(false),
00022         agentWantsToGrabObject(false),
00023         targetObjectIsInGripper(false),
00024         agentIsExecutingMotionAction(false),
00025         currMotionCmd(),
00026         distanceTravelled(0.0f),
00027         agentWantsToGiveObject(false),
00028         giveTargetObject(),
00029         agentIsReceiving(false),
00030         agentReceivingFrom(0),
00031         gotGiveReady(false),
00032         gotGiveInformation(false),
00033         giveAngleToTurn(0.0),
00034         giveObjType(""),
00035         pages(),
00036         currPageIndex(0),
00037         newReqdPage(0),
00038         ptasks(),
00039         scoreQueue(),
00040         stringToSpeak(""),
00041         playQueue(),
00042         agentGazePoints()
00043     {
00044         
00045         generateGazePoints();
00046     }
00047 
00048     KoduAgent::~KoduAgent() {
00049         GeneralFncs::destroyAllPtrsInQueue(ptasks);
00050         GeneralFncs::destroyAllPtrsInVector(pages);
00051         stringToSpeak.clear();
00052     }
00053 
00054     KoduAgent& KoduAgent::operator=(const KoduAgent& kAgent) {
00055         if (this != &kAgent) {
00056             gripperObject = kAgent.gripperObject;
00057             agentIsExecutingManipAction = kAgent.agentIsExecutingManipAction;
00058             agentWantsToDropObject = kAgent.agentWantsToDropObject;
00059             agentWantsToGrabObject = kAgent.agentWantsToGrabObject;
00060             targetObjectIsInGripper = kAgent.targetObjectIsInGripper;
00061             agentIsExecutingMotionAction = kAgent.agentIsExecutingMotionAction;
00062             currMotionCmd = kAgent.currMotionCmd;
00063             distanceTravelled = kAgent.distanceTravelled;
00064             pages = kAgent.pages;
00065             currPageIndex = kAgent.currPageIndex;
00066             newReqdPage = kAgent.newReqdPage;
00067             ptasks = kAgent.ptasks;
00068             scoreQueue = kAgent.scoreQueue;
00069             stringToSpeak = kAgent.stringToSpeak;
00070             playQueue = kAgent.playQueue;
00071             agentGazePoints = kAgent.agentGazePoints;
00072         }
00073         return *this;
00074     }
00075 
00076 
00077     const float KoduAgent::kLocalizationDistanceThreshold = 1000.0f;
00078 
00079 
00080     void KoduAgent::generateGazePoints() {
00081         
00082         const float kSearchArea = mathutils::deg2rad(50.0f);  
00083         const float kAngleIncrement = mathutils::deg2rad(50.0f);   
00084         
00085         float radius = 750.0f;
00086         
00087         float currAngle = -1.0f * kSearchArea / 2.0f;
00088         
00089         while (currAngle <= (kSearchArea / 2.0f)) {
00090             agentGazePoints.push_back(
00091                 Point(
00092                     cos(currAngle) * radius,  
00093                     sin(currAngle) * radius,  
00094                     0.0f,                     
00095                     DualCoding::egocentric    
00096                 ));
00097             currAngle += kAngleIncrement; 
00098         }
00099     }
00100 
00101     const std::vector<Point>& KoduAgent::getGazePoints() const {
00102         return agentGazePoints;
00103     }
00104 
00105 
00106     bool KoduAgent::isExecutingManipAction() const {
00107         return agentIsExecutingManipAction;
00108     }
00109 
00110     bool KoduAgent::isHoldingAnObject() const {
00111         return targetObjectIsInGripper;
00112     }
00113 
00114     void KoduAgent::manipulationComplete() {
00115         
00116         if (agentWantsToDropObject) {
00117             setWantsToDropObjectFlag(false);    
00118             setTargetInGripperFlag(false);      
00119         }
00120         
00121         else {
00122             setWantsToGrabObjectFlag(false);    
00123             setTargetInGripperFlag();           
00124         }
00125         setIsExecutingManipActionFlag(false);   
00126     }
00127 
00128     void KoduAgent::setIsExecutingManipActionFlag(bool bval) {
00129         agentIsExecutingManipAction = bval;
00130     }
00131 
00132     void KoduAgent::setTargetInGripperFlag(bool bval) {
00133         targetObjectIsInGripper = bval;
00134     }
00135 
00136     void KoduAgent::setWantsToDropObjectFlag(bool bval) {
00137         agentWantsToDropObject = bval;
00138     }
00139 
00140     void KoduAgent::setWantsToGrabObjectFlag(bool bval) {
00141         agentWantsToGrabObject = bval;
00142     }
00143 
00144     void KoduAgent::signalDropActionStart() {
00145         setIsExecutingManipActionFlag();    
00146         setWantsToDropObjectFlag();         
00147     }
00148 
00149     void KoduAgent::signalGrabActionStart() {
00150         setIsExecutingManipActionFlag();    
00151         setWantsToGrabObjectFlag();         
00152     }
00153 
00154     void KoduAgent::signalGiveActionStart() {
00155         setIsExecutingManipActionFlag();
00156         setIsExecutingMotionActionFlag();
00157         setWantsToGiveObjectFlag();
00158     }
00159 
00160     bool KoduAgent::wantsToDropObject() const {
00161         return agentWantsToDropObject;
00162     }
00163 
00164     bool KoduAgent::wantsToGrabObject() const {
00165         return agentWantsToGrabObject;
00166     }
00167 
00168 
00169     bool KoduAgent::bodyIsInMotion() const {
00170         return VRmixin::isWalkingFlag;
00171     }
00172 
00173     bool KoduAgent::isExecutingMotionAction() const {
00174         return agentIsExecutingMotionAction;
00175     }
00176 
00177     bool KoduAgent::needsToLocalize() const {
00178         return (distanceTravelled >= kLocalizationDistanceThreshold);
00179     }
00180 
00181     void KoduAgent::motionComplete() {
00182       
00183       currMotionCmd = MotionCommand();
00184       setIsExecutingMotionActionFlag(false);
00185     }
00186 
00187     void KoduAgent::signalMotionActionStart() {
00188         setIsExecutingMotionActionFlag();
00189     }
00190 
00191     void KoduAgent::setIsExecutingMotionActionFlag(bool bval) {
00192         agentIsExecutingMotionAction = bval;
00193     }
00194 
00195     void KoduAgent::setMotionCommand(const MotionCommand& kCmd) {
00196         currMotionCmd = kCmd;
00197     }
00198 
00199 
00200     void KoduAgent::setWantsToGiveObjectFlag(bool bval) {
00201         agentWantsToGiveObject = bval;
00202     }
00203 
00204     void KoduAgent::setIsReceiving(bool bval) {
00205         agentIsReceiving = bval;
00206         setIsExecutingManipActionFlag(bval);
00207         setIsExecutingMotionActionFlag(bval);
00208 
00209     }
00210 
00211     bool KoduAgent::wantsToGiveObject() const {
00212         return agentWantsToGiveObject;
00213     }
00214 
00215 
00216 
00217     bool KoduAgent::hasNewScoreChanges() const {
00218         return (!scoreQueue.empty());
00219     }
00220 
00221 
00222     KoduPage* KoduAgent::getCurrentPage() const {
00223         return pages[currPageIndex];
00224     }
00225 
00226     KoduPage* KoduAgent::getPage(unsigned int pageNumber) const {
00227         return getPageInPos(pageNumber - 1);
00228     }
00229 
00230     KoduPage* KoduAgent::getPageInPos(unsigned int pageIndex) const {
00231         if (pageIndex < pages.size()) {
00232             return pages[pageIndex];
00233         } else {
00234             std::cout << "Page index \"" << pageIndex << "\" is out of bounds!\nReturning NULL...\n";
00235             return NULL;
00236         }
00237     }
00238 
00239     bool KoduAgent::hasNewPageNumber() const {
00240         return (newReqdPage > 0);
00241     }
00242 
00243 
00244     bool KoduAgent::hasTextToSay() const {
00245         return (!stringToSpeak.empty());
00246     }
00247 
00248 
00249     bool KoduAgent::hasSoundsToPlay() const {
00250         return (!playQueue.empty());
00251     }
00252 }