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
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "NeovisionII/PrefrontalCortexService.H"
00039 #include "Image/ColorOps.H"
00040
00041 PrefrontalCortexI::PrefrontalCortexI(OptionManager& mgr,
00042 const std::string& descrName,
00043 const std::string& tagName ) :
00044 ModelComponent(mgr, descrName, tagName),
00045 itsCurrentState(0),
00046 itsArmXOffset(358.76),
00047 itsArmYOffset(-372.16),
00048 itsArmZOffset(-80.00)
00049 {
00050
00051 IceStorm::TopicPrx topicPrx;
00052 itsTopicsSubscriptions.push_back(TopicInfo("RetinaTopic", topicPrx));
00053 itsTopicsSubscriptions.push_back(TopicInfo("SaliencyMapTopic", topicPrx));
00054 itsTopicsSubscriptions.push_back(TopicInfo("VisualTrackerTopic", topicPrx));
00055 itsTopicsSubscriptions.push_back(TopicInfo("SegmenterTopic", topicPrx));
00056 itsTopicsSubscriptions.push_back(TopicInfo("CameraCtrlTopic", topicPrx));
00057 itsTopicsSubscriptions.push_back(TopicInfo("InferotemporalCortexTopic", topicPrx));
00058 itsTopicsSubscriptions.push_back(TopicInfo("HippocampusTopic", topicPrx));
00059 itsTopicsSubscriptions.push_back(TopicInfo("GUITopic", topicPrx));
00060
00061 assignStates();
00062 }
00063
00064 PrefrontalCortexI::~PrefrontalCortexI()
00065 {
00066 unsubscribeSimEvents();
00067 }
00068
00069 void PrefrontalCortexI::init()
00070 {
00071 SimEvents::GUIInputMessagePtr ggMsg = new SimEvents::GUIInputMessage;
00072 ggMsg->msg = "Please place my pieces and yours on the table and press enter.";
00073 ggMsg->rollDice = false;
00074 itsEventsPub->evolve(ggMsg);
00075
00076 itsCurrentState = INIT_PTZ;
00077
00078 getUserInput = true;
00079 }
00080
00081 void PrefrontalCortexI::initSimEvents(Ice::CommunicatorPtr icPtr, Ice::ObjectPrx objectPrx)
00082 {
00083
00084 Ice::ObjectPrx obj = icPtr->stringToProxy("SimEvents/TopicManager:tcp -p 11111");
00085 IceStorm::TopicManagerPrx topicManager =
00086 IceStorm::TopicManagerPrx::checkedCast(obj);
00087
00088
00089 IceStorm::TopicPrx topic;
00090 try {
00091 topic = topicManager->retrieve("PrefrontalCortexTopic");
00092 } catch (const IceStorm::NoSuchTopic&) {
00093 topic = topicManager->create("PrefrontalCortexTopic");
00094 }
00095
00096 Ice::ObjectPrx pub = topic->getPublisher()->ice_oneway();
00097 itsEventsPub = SimEvents::EventsPrx::uncheckedCast(pub);
00098
00099
00100 itsObjectPrx = objectPrx;
00101
00102 for(uint i=0; i<itsTopicsSubscriptions.size(); i++)
00103 {
00104 try {
00105 IceStorm::QoS qos;
00106 itsTopicsSubscriptions[i].topicPrx =
00107 topicManager->retrieve(itsTopicsSubscriptions[i].name.c_str());
00108 itsTopicsSubscriptions[i].topicPrx->subscribeAndGetPublisher(qos, itsObjectPrx);
00109 } catch (const IceStorm::NoSuchTopic&) {
00110 LINFO("Error! No %s topic found!", itsTopicsSubscriptions[i].name.c_str());
00111 } catch (const char* msg) {
00112 LINFO("Error %s", msg);
00113 } catch (const Ice::Exception& e) {
00114 cerr << e << endl;
00115 }
00116 }
00117 }
00118
00119 void PrefrontalCortexI::unsubscribeSimEvents()
00120 {
00121
00122 for(uint i=0; i<itsTopicsSubscriptions.size(); i++)
00123 {
00124 itsTopicsSubscriptions[i].topicPrx->unsubscribe(itsObjectPrx);
00125 }
00126 }
00127
00128
00129 void PrefrontalCortexI::evolve(const SimEvents::EventMessagePtr& eMsg,
00130 const Ice::Current&)
00131 {
00132
00133 if(eMsg->ice_isA("::SimEvents::RetinaMessage")){
00134 SimEvents::RetinaMessagePtr msg = SimEvents::RetinaMessagePtr::dynamicCast(eMsg);
00135 itsCurrentRetinaImg = Ice2Image<PixRGB<byte> >(msg->img);
00136 }
00137
00138 int nextState = processState(itsCurrentState, eMsg);
00139 setCurrentState(nextState);
00140 }
00141
00142 void PrefrontalCortexI::setSalientTrackLoc(const SimEvents::SaliencyMapMessagePtr& msg)
00143 {
00144
00145 SimEvents::VisualTrackerBiasMessagePtr bMsg = new SimEvents::VisualTrackerBiasMessage;
00146 for(uint i=0; i<msg->nMostSalientLoc.size(); i++)
00147 {
00148 SimEvents::LocInfo locInfo = msg->nMostSalientLoc[i];
00149 LINFO("Assigning the most salient location to a track point: %ix%i",
00150 locInfo.fullresMaxpos.i, locInfo.fullresMaxpos.j);
00151 SimEvents::TrackInfo trackInfo;
00152 trackInfo.pos.i = locInfo.fullresMaxpos.i;
00153 trackInfo.pos.j = locInfo.fullresMaxpos.j;
00154 trackInfo.err = 0;
00155 bMsg->locToTrack.push_back(trackInfo);
00156
00157
00158 SimEvents::HippocampusBiasMessagePtr hMsg = new SimEvents::HippocampusBiasMessage;
00159 hMsg->loc = trackInfo.pos;
00160 hMsg->objectName = "MODE:rec";
00161 hMsg->img = Image2Ice(itsCurrentRetinaImg);
00162 itsEventsPub->evolve(hMsg);
00163
00164 break;
00165 }
00166 itsEventsPub->evolve(bMsg);
00167 }
00168
00169 void PrefrontalCortexI::setTrackLoc(Point2D<int> loc)
00170 {
00171
00172 SimEvents::VisualTrackerBiasMessagePtr bMsg = new SimEvents::VisualTrackerBiasMessage;
00173 LINFO("Assigning the location to a track point: %ix%i", loc.i, loc.j);
00174 SimEvents::TrackInfo trackInfo;
00175 trackInfo.pos.i = loc.i;
00176 trackInfo.pos.j = loc.j;
00177 trackInfo.err = 0;
00178 bMsg->locToTrack.push_back(trackInfo);
00179
00180
00181 SimEvents::HippocampusBiasMessagePtr hMsg = new SimEvents::HippocampusBiasMessage;
00182 hMsg->loc = trackInfo.pos;
00183 hMsg->objectName = "MODE:rec";
00184 hMsg->img = Image2Ice(itsCurrentRetinaImg);
00185 itsEventsPub->evolve(hMsg);
00186 itsEventsPub->evolve(bMsg);
00187
00188 }
00189
00190 void PrefrontalCortexI::setTrackSegLoc(const SimEvents::VisualTrackerMessagePtr& msg)
00191 {
00192 SimEvents::SegmenterBiasMessagePtr sMsg = new SimEvents::SegmenterBiasMessage;
00193 for(uint i=0; i<msg->trackLocs.size(); i++)
00194 {
00195 SimEvents::TrackInfo trackInfo = msg->trackLocs[i];
00196
00197
00198 SimEvents::SegInfo segInfo;
00199 segInfo.loc.i = trackInfo.pos.i;
00200 segInfo.loc.j = trackInfo.pos.j;
00201 sMsg->regionsToSeg.push_back(segInfo);
00202 break;
00203 }
00204 itsEventsPub->evolve(sMsg);
00205 }
00206
00207 void PrefrontalCortexI::setPTZoomIn()
00208 {
00209
00210 SimEvents::CameraCtrlBiasMessagePtr ptzMsg = new SimEvents::CameraCtrlBiasMessage;
00211 ptzMsg->zoomIn = true;
00212 LINFO("Sending Zooming in");
00213 itsEventsPub->evolve(ptzMsg);
00214 }
00215
00216 int PrefrontalCortexI::processState(int state, const SimEvents::EventMessagePtr& eMsg)
00217 {
00218 if ((uint)state > itsStates.size())
00219 {
00220 LINFO("invalid state %i", state);
00221 return -1;
00222 }
00223
00224 switch(state)
00225 {
00226 case WAIT_FOR_GAME_START:
00227 if (eMsg->ice_isA("::SimEvents::GUIOutputMessage")){
00228 SimEvents::GUIOutputMessagePtr msg = SimEvents::GUIOutputMessagePtr::dynamicCast(eMsg);
00229 LINFO("Key %i", msg->key);
00230
00231 if (msg->key == 36)
00232 {
00233 SimEvents::GUIInputMessagePtr ggMsg = new SimEvents::GUIInputMessage;
00234 ggMsg->msg = "Please wait while I figure where the pieces are.";
00235 ggMsg->rollDice = false;
00236 itsEventsPub->evolve(ggMsg);
00237 return itsStates[state].nextState;
00238 }
00239 }
00240 return WAIT_FOR_GAME_START;
00241
00242
00243
00244 case INIT_PTZ:
00245 {
00246 LINFO("INIT PTZ");
00247
00248 SimEvents::CameraCtrlBiasMessagePtr ptzMsg = new SimEvents::CameraCtrlBiasMessage;
00249 ptzMsg->initPtz = true;
00250 ptzMsg->zoomIn = false;
00251 ptzMsg->zoomOut = false;
00252 itsEventsPub->evolve(ptzMsg);
00253 return itsStates[state].nextState;
00254 }
00255 case INIT_PTZ_DONE:
00256
00257 if (eMsg->ice_isA("::SimEvents::CameraCtrlMessage")){
00258 SimEvents::CameraCtrlMessagePtr msg = SimEvents::CameraCtrlMessagePtr::dynamicCast(eMsg);
00259 if (msg->initPtzDone)
00260 {
00261
00262 return itsStates[state].nextState;
00263 }
00264 }
00265 return INIT_PTZ_DONE;
00266 case SET_TRACKING:
00267 if (!getUserInput)
00268 {
00269 if (eMsg->ice_isA("::SimEvents::SaliencyMapMessage")){
00270 SimEvents::SaliencyMapMessagePtr msg = SimEvents::SaliencyMapMessagePtr::dynamicCast(eMsg);
00271 setSalientTrackLoc(msg);
00272 setPTZoomIn();
00273 getUserInput = true;
00274 return itsStates[state].nextState;
00275 }
00276 } else {
00277
00278 if (eMsg->ice_isA("::SimEvents::GUIOutputMessage")){
00279 SimEvents::GUIOutputMessagePtr msg = SimEvents::GUIOutputMessagePtr::dynamicCast(eMsg);
00280 if (msg->loc.i > 0 && msg->loc.j > 0)
00281 {
00282 setTrackLoc(Point2D<int>(msg->loc.i, msg->loc.j));
00283 setPTZoomIn();
00284
00285 return itsStates[state].nextState;
00286 }
00287 }
00288 }
00289
00290 return SET_TRACKING;
00291 case TRACKING:
00292 {
00293 if (eMsg->ice_isA("::SimEvents::CameraCtrlMessage")){
00294 SimEvents::CameraCtrlMessagePtr msg = SimEvents::CameraCtrlMessagePtr::dynamicCast(eMsg);
00295 if (msg->zoomDone)
00296 {
00297 itsPan = msg->pan;
00298 itsTilt = msg->tilt;
00299 return itsStates[state].nextState;
00300 }
00301 }
00302 }
00303 return TRACKING;
00304 case SET_SEG_LOC:
00305 if (eMsg->ice_isA("::SimEvents::VisualTrackerMessage")){
00306 SimEvents::VisualTrackerMessagePtr msg = SimEvents::VisualTrackerMessagePtr::dynamicCast(eMsg);
00307 if (msg->trackLocs.size())
00308 {
00309 setTrackSegLoc(msg);
00310 itsCount=0;
00311 return itsStates[state].nextState;
00312 }
00313 }
00314 return SET_SEG_LOC;
00315
00316 case GET_SEG_IMG:
00317 if(eMsg->ice_isA("::SimEvents::SegmenterMessage")){
00318 SimEvents::SegmenterMessagePtr msg = SimEvents::SegmenterMessagePtr::dynamicCast(eMsg);
00319
00320 SimEvents::InfrotemporalCortexBiasMessagePtr sMsg = new SimEvents::InfrotemporalCortexBiasMessage;
00321 for(uint i=0; i<msg->segLocs.size(); i++)
00322 {
00323 SimEvents::SegInfo segInfo = msg->segLocs[i];
00324 sMsg->img = segInfo.img;
00325 }
00326 LINFO("Send img to SIFT");
00327
00328 itsEventsPub->evolve(sMsg);
00329 return itsStates[state].nextState;
00330 }
00331 return GET_SEG_IMG;
00332
00333 case GET_OBJ_INFO:
00334
00335 if(eMsg->ice_isA("::SimEvents::InfrotemporalCortexMessage")){
00336 SimEvents::InfrotemporalCortexMessagePtr msg = SimEvents::InfrotemporalCortexMessagePtr::dynamicCast(eMsg);
00337 LINFO("Got message");
00338
00339 SimEvents::HippocampusBiasMessagePtr hMsg = new SimEvents::HippocampusBiasMessage;
00340 hMsg->loc.i = -2; hMsg->loc.j = -2;
00341 hMsg->pan = itsPan;
00342 hMsg->tilt = itsTilt;
00343 hMsg->rotation = msg->rotation;
00344
00345 hMsg->objectName = msg->objectName;
00346 hMsg->img.width=0; hMsg->img.height=0;
00347
00348 itsEventsPub->evolve(hMsg);
00349
00350 LINFO("Got object %s with score %f",
00351 msg->objectName.c_str(), msg->confidence);
00352 if (msg->objectName == "nomatch" && itsCount < 3)
00353 {
00354 itsCount++;
00355 return GET_SEG_IMG;
00356 }
00357 else
00358 return itsStates[state].nextState;
00359 }
00360 return GET_OBJ_INFO;
00361
00362 case GET_OBJ_STATE:
00363 if(eMsg->ice_isA("::SimEvents::HippocampusMessage")){
00364 SimEvents::HippocampusMessagePtr hMsg = SimEvents::HippocampusMessagePtr::dynamicCast(eMsg);
00365
00366
00367 for(uint i=0; i<hMsg->objectsState.size(); i++)
00368 {
00369 SimEvents::ObjectState objectState = hMsg->objectsState[i];
00370 LINFO("Got object %s at %ix%i (%f,%f,%f) inDanger=%i",
00371 objectState.objectName.c_str(),
00372 objectState.loc.i, objectState.loc.j,
00373 objectState.pos.x, objectState.pos.y, objectState.pos.z,
00374 objectState.inDanger);
00375
00376
00377 {
00378
00379 LINFO("Moving object %s", objectState.objectName.c_str());
00380 SimEvents::PrimaryMotorCortexBiasMessagePtr msg = new SimEvents::PrimaryMotorCortexBiasMessage;
00381 msg->moveArm = true;
00382 msg->armPos.x = objectState.pos.x + itsArmXOffset;
00383 msg->armPos.y = objectState.pos.y + itsArmYOffset;
00384 msg->armPos.z = itsArmZOffset;
00385 msg->armPos.rot = 0;
00386 msg->armPos.roll = 0;
00387 msg->armPos.gripper = 0;
00388
00389 itsEventsPub->evolve(msg);
00390 }
00391 }
00392
00393
00394 if (hMsg->objectsState.size() == 4)
00395 return ZOOM_OUT;
00396 else
00397 return itsStates[state].nextState;
00398 }
00399 return GET_OBJ_STATE;
00400
00401
00402 case ZOOM_OUT:
00403 {
00404
00405 SimEvents::CameraCtrlBiasMessagePtr ptzMsg = new SimEvents::CameraCtrlBiasMessage;
00406 ptzMsg->initPtz = true;
00407 ptzMsg->zoomIn = false;
00408 ptzMsg->zoomOut = false;
00409 itsEventsPub->evolve(ptzMsg);
00410 return itsStates[state].nextState;
00411 }
00412 case ZOOM_OUT_DONE:
00413
00414 if (eMsg->ice_isA("::SimEvents::CameraCtrlMessage")){
00415 SimEvents::CameraCtrlMessagePtr msg = SimEvents::CameraCtrlMessagePtr::dynamicCast(eMsg);
00416 if (msg->initPtzDone)
00417 {
00418
00419
00420 return itsStates[state].nextState;
00421 }
00422 }
00423 return ZOOM_OUT_DONE;
00424
00425 case GAMEPLAY_PLAYERMOVE:
00426 {
00427 SimEvents::GUIInputMessagePtr ggMsg = new SimEvents::GUIInputMessage;
00428 ggMsg->msg = "Please move your pieces and press enter.";
00429 ggMsg->rollDice = false;
00430 itsEventsPub->evolve(ggMsg);
00431 }
00432 return itsStates[state].nextState;
00433
00434 case GAMEPLAY_PLAYERMOVE_DONE:
00435 if (eMsg->ice_isA("::SimEvents::GUIOutputMessage")){
00436 SimEvents::GUIOutputMessagePtr msg = SimEvents::GUIOutputMessagePtr::dynamicCast(eMsg);
00437
00438 if (msg->key == 36)
00439 {
00440 SimEvents::GUIInputMessagePtr ggMsg = new SimEvents::GUIInputMessage;
00441 ggMsg->msg = "Please wait while I figure where the pieces are.";
00442 ggMsg->rollDice = false;
00443 itsEventsPub->evolve(ggMsg);
00444 return itsStates[state].nextState;
00445 }
00446 }
00447 return GAMEPLAY_PLAYERMOVE_DONE;
00448 }
00449
00450
00451 return -1;
00452 }
00453
00454
00455
00456 void PrefrontalCortexI::assignStates()
00457 {
00458 itsStates.push_back(StateInfo(START_OF_GAME_MSG, "Wait for Game to start",
00459 WAIT_FOR_GAME_START));
00460 itsStates.push_back(StateInfo(WAIT_FOR_GAME_START, "Start the Game", INIT_PTZ));
00461 itsStates.push_back(StateInfo(INIT_PTZ, "Init PTZ", INIT_PTZ_DONE));
00462 itsStates.push_back(StateInfo(INIT_PTZ_DONE, "Check PTZ Init Done", SET_TRACKING));
00463 itsStates.push_back(StateInfo(SET_TRACKING, "SetTracking", TRACKING));
00464 itsStates.push_back(StateInfo(TRACKING, "Tracking", SET_SEG_LOC));
00465 itsStates.push_back(StateInfo(SET_SEG_LOC, "Set SEgmantation location", GET_SEG_IMG));
00466 itsStates.push_back(StateInfo(GET_SEG_IMG, "Get Image to Recognize", GET_OBJ_INFO));
00467 itsStates.push_back(StateInfo(GET_OBJ_INFO, "Recognize Image", GET_OBJ_STATE));
00468 itsStates.push_back(StateInfo(GET_OBJ_STATE, "Get Game State", INIT_PTZ));
00469 itsStates.push_back(StateInfo(ZOOM_OUT, "Observe the game", ZOOM_OUT_DONE));
00470 itsStates.push_back(StateInfo(ZOOM_OUT_DONE, "Observe the game Done", GAMEPLAY_PLAYERMOVE));
00471 itsStates.push_back(StateInfo(GAMEPLAY_PLAYERMOVE, "Player move", GAMEPLAY_PLAYERMOVE_DONE));
00472 itsStates.push_back(StateInfo(GAMEPLAY_PLAYERMOVE_DONE, "Player move done", GAMEPLAY_PLAYERMOVE_DONE));
00473
00474 setCurrentState(0);
00475 }
00476
00477 void PrefrontalCortexI::setCurrentState(int s)
00478 {
00479 if (s == -1) return;
00480 if ((uint)s > itsStates.size())
00481 {
00482 LINFO("Entering an invalid state %i", s);
00483 return;
00484 }
00485 if (itsCurrentState != s)
00486 {
00487 itsLastState = s;
00488 LINFO("Entering state: %i:%s", s, itsStates[s].name.c_str());
00489 itsCurrentState = s;
00490
00491 }
00492 }
00493
00494
00495
00496 class PrefrontalCortexService : public Ice::Service {
00497 protected:
00498 virtual bool start(int, char* argv[]);
00499 virtual bool stop() {
00500 if (itsMgr)
00501 delete itsMgr;
00502 return true;
00503 }
00504
00505 private:
00506 Ice::ObjectAdapterPtr itsAdapter;
00507 ModelManager *itsMgr;
00508 };
00509
00510 bool PrefrontalCortexService::start(int argc, char* argv[])
00511 {
00512
00513 itsMgr = new ModelManager("PrefrontalCortexService");
00514
00515 nub::ref<PrefrontalCortexI> pc(new PrefrontalCortexI(*itsMgr));
00516 itsMgr->addSubComponent(pc);
00517
00518 itsMgr->parseCommandLine((const int)argc, (const char**)argv, "", 0, 0);
00519
00520 char adapterStr[255];
00521 sprintf(adapterStr, "default -p %i", BrainObjects::PrefrontalCortexPort);
00522 itsAdapter = communicator()->createObjectAdapterWithEndpoints("PrefrontalCortexAdapter",
00523 adapterStr);
00524
00525 Ice::ObjectPtr object = pc.get();
00526 Ice::ObjectPrx objectPrx = itsAdapter->add(object, communicator()->stringToIdentity("PrefrontalCortex"));
00527 pc->initSimEvents(communicator(), objectPrx);
00528 itsAdapter->activate();
00529 itsMgr->start();
00530
00531 pc->init();
00532
00533 return true;
00534 }
00535
00536
00537 int main(int argc, char** argv) {
00538
00539 PrefrontalCortexService svc;
00540 return svc.main(argc, argv);
00541 }
00542
00543