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
00039
00040 #ifndef TESTARM_H_DEFINED
00041 #define TESTARM_H_DEFINED
00042
00043 #include "Component/ModelManager.H"
00044 #include "Image/Image.H"
00045 #include "Image/ImageSet.H"
00046 #include "Image/ShapeOps.H"
00047 #include "Image/DrawOps.H"
00048 #include "Image/FilterOps.H"
00049 #include "Image/ColorOps.H"
00050 #include "Image/Transforms.H"
00051 #include "Image/MathOps.H"
00052 #include "Image/CutPaste.H"
00053 #include "Image/Pixels.H"
00054 #include "Neuro/StdBrain.H"
00055 #include "Neuro/VisualCortex.H"
00056 #include "Neuro/VisualCortexConfigurator.H"
00057 #include "Neuro/NeuroOpts.H"
00058 #include "Channels/DescriptorVec.H"
00059 #include "Channels/ComplexChannel.H"
00060 #include "Channels/SubmapAlgorithmBiased.H"
00061 #include "Simulation/SimEventQueue.H"
00062 #include "Simulation/SimulationOpts.H"
00063 #include "Simulation/SimEventQueueConfigurator.H"
00064 #include "Learn/Bayes.H"
00065 #include "GUI/DebugWin.H"
00066 #include "ObjRec/BayesianBiaser.H"
00067 #include "Devices/DeviceOpts.H"
00068 #include "Devices/FrameGrabberConfigurator.H"
00069 #include "Media/FrameSeries.H"
00070 #include "Transport/FrameIstream.H"
00071 #include "GUI/XWinManaged.H"
00072 #include "Neuro/NeuroOpts.H"
00073 #include "Neuro/SaccadeControllers.H"
00074 #include "Neuro/SaccadeControllerConfigurator.H"
00075 #include "Raster/Raster.H"
00076 #include "Transport/FrameIstream.H"
00077 #include "Util/Timer.H"
00078 #include "Devices/rt100.H"
00079 #include "Controllers/PID.H"
00080
00081 #include <arpa/inet.h>
00082 #include <fcntl.h>
00083 #include <netdb.h>
00084 #include <signal.h>
00085 #include <stdlib.h>
00086 #include <unistd.h>
00087
00088 #define UP_KEY 98
00089 #define DOWN_KEY 104
00090 #define LEFT_KEY 100
00091 #define RIGHT_KEY 102
00092
00093
00094 #define NAVG 20
00095
00096
00097
00098
00099 #define UDPHOST "192.168.0.8"
00100 #define UDPPORT 5003
00101
00102 static bool goforever = true;
00103
00104
00105 void terminate(int s)
00106 { LERROR("*** INTERRUPT ***"); goforever = false; exit(1); }
00107
00108 enum STATE {INIT, REACH, GRASP, LIFT, PLACE_IN_BASKET, DROP, DONE};
00109
00110 struct ArmPosition
00111 {
00112 int elbow;
00113 int sholder;
00114 int zed;
00115 };
00116
00117 bool init(nub::soft_ref<RT100> rt100);
00118 bool reach(nub::soft_ref<RT100> rt100, Point2D<int> fixation,
00119 int x, int y, int zedPos);
00120 bool learnMovement(float xErr, float yErr, int *elbowPos, int *sholderPos);
00121 bool grasp(nub::soft_ref<RT100> rt100);
00122 bool lift(nub::soft_ref<RT100> rt100);
00123 bool placeInBasket(nub::soft_ref<RT100> rt100);
00124 bool drop(nub::soft_ref<RT100> rt100);
00125 void updateDisplay(Image<PixRGB<byte> > &ima,
00126 Image<float> &sm,
00127 Point2D<int> &fixation);
00128 void waitForMoveComplete(nub::soft_ref<RT100> rt100);
00129
00130 Point2D<int> evolveBrain(Image<PixRGB<byte> > &img, DescriptorVec& descVec,
00131 Image<float> &smap);
00132
00133 void biasVC(ComplexChannel &vc, Bayes &bayesNet, int objId, bool DoBias);
00134
00135
00136 ModelManager *mgr;
00137 nub::soft_ref<FrameIstream> gb;
00138 XWinManaged *xwinPtr;
00139 Image<PixRGB<byte> > *dispPtr;
00140 Timer masterclock;
00141 int w=-1,h=-1;
00142 int smlevel = -1;
00143
00144 ArmPosition armPosition;
00145
00146
00147 int main(int argc, char **argv)
00148 {
00149 MYLOGVERB = LOG_INFO;
00150 int sim = false;
00151
00152
00153
00154 ModelManager manager("Test Arm Control");
00155
00156 mgr = &manager;
00157
00158 nub::ref<FrameGrabberConfigurator>
00159 gbc(new FrameGrabberConfigurator(manager));
00160 manager.addSubComponent(gbc);
00161
00162 nub::soft_ref<SimEventQueueConfigurator>
00163 seqc(new SimEventQueueConfigurator(manager));
00164 manager.addSubComponent(seqc);
00165
00166
00167 nub::ref<StdBrain> brain(new StdBrain(manager));
00168 manager.addSubComponent(brain);
00169
00170
00171 nub::soft_ref<RT100> rt100(new RT100(manager));
00172 manager.addSubComponent(rt100);
00173
00174 nub::ref<InputFrameSeries> ifs(new InputFrameSeries(manager));
00175 if (sim)
00176 {
00177 manager.addSubComponent(ifs);
00178 }
00179
00180
00181 manager.exportOptions(MC_RECURSE);
00182
00183 manager.setOptionValString(&OPT_RawVisualCortexChans, "IOC");
00184
00185 manager.setOptionValString(&OPT_SaliencyMapType, "Fast");
00186 manager.setOptionValString(&OPT_SMfastInputCoeff, "1");
00187 manager.setOptionValString(&OPT_WinnerTakeAllType, "Fast");
00188 manager.setOptionValString(&OPT_SimulationTimeStep, "0.2");
00189
00190 manager.setModelParamVal("FOAradius", 20, MC_RECURSE);
00191 manager.setModelParamVal("FoveaRadius", 20, MC_RECURSE);
00192
00193
00194 manager.setOptionValString(&OPT_IORtype, "None");
00195
00196
00197 manager.setOptionValString(&OPT_FrameGrabberStreaming, "false");
00198 manager.setOptionValString(&OPT_FrameGrabberType, "V4L");
00199 manager.setOptionValString(&OPT_FrameGrabberChannel, "1");
00200 manager.setOptionValString(&OPT_FrameGrabberHue, "0");
00201 manager.setOptionValString(&OPT_FrameGrabberContrast, "16384");
00202 manager.setOptionValString(&OPT_FrameGrabberDims, "320x240");
00203
00204 manager.setOptionValString(&OPT_SCeyeMaxIdleSecs, "1000.0");
00205 manager.setOptionValString(&OPT_SCeyeThreshMinOvert, "4.0");
00206 manager.setOptionValString(&OPT_SCeyeThreshMaxCovert, "3.0");
00207 manager.setOptionValString(&OPT_SCeyeThreshMinNum, "2");
00208
00209
00210
00211
00212
00213 if (manager.parseCommandLine(argc, argv, "", 0, 0) == false) return(1);
00214
00215
00216 if (sim)
00217 {
00218 w = ifs->getWidth();
00219 h = ifs->getHeight();
00220 } else {
00221
00222 gb = gbc->getFrameGrabber();
00223 if (gb.isInvalid())
00224 LFATAL("You need to select a frame grabber type via the "
00225 "--fg-type=XX command-line option for this program "
00226 "to be useful");
00227 w = gb->getWidth();
00228 h = gb->getHeight();
00229 }
00230
00231 const int foa_size = std::min(w, h) / 12;
00232 manager.setModelParamVal("InputFrameDims", Dims(w, h),
00233 MC_RECURSE | MC_IGNORE_MISSING);
00234 manager.setModelParamVal("SCeyeStartAtIP", true,
00235 MC_RECURSE | MC_IGNORE_MISSING);
00236 manager.setModelParamVal("SCeyeInitialPosition", Point2D<int>(w/2,h/2),
00237 MC_RECURSE | MC_IGNORE_MISSING);
00238 manager.setModelParamVal("FOAradius", foa_size,
00239 MC_RECURSE | MC_IGNORE_MISSING);
00240 manager.setModelParamVal("FoveaRadius", foa_size,
00241 MC_RECURSE | MC_IGNORE_MISSING);
00242
00243
00244 signal(SIGHUP, terminate); signal(SIGINT, terminate);
00245 signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00246 signal(SIGALRM, terminate);
00247
00248
00249 manager.start();
00250
00251 ComplexChannel *cc = NULL;
00252 cc = &*dynCastWeak<ComplexChannel>(brain->getVC());
00253 const LevelSpec lspec = cc->getModelParamVal<LevelSpec>("LevelSpec");
00254 smlevel = lspec.mapLevel();
00255
00256 Image<float> sm(w >> smlevel, h >> smlevel, ZEROS);
00257
00258 uint64 avgtime = 0; int avgn = 0;
00259 float fps = 0.0F;
00260 Timer tim;
00261
00262 Point2D<int> fixation(-1, -1);
00263
00264
00265 STATE currentState = INIT;
00266
00267
00268
00269 Image<PixRGB<byte> > disp(w * 2, h + 20, ZEROS);
00270 dispPtr = &disp;
00271
00272 XWinManaged xwin(disp.getDims(), -1, -1, "RT100 arm control");
00273 xwinPtr = &xwin;
00274
00275 char info[1000];
00276
00277 Point2D<int> lastpointsent(w/2, h/2);
00278
00279 static bool moveArm = false;
00280
00281 try {
00282
00283
00284 DescriptorVec descVec(manager, "Descriptor Vector", "DecscriptorVec", cc);
00285
00286 LINFO("size %i\n", descVec.getFVSize());
00287
00288 Bayes bayesNet(descVec.getFVSize(), 10);
00289 Dims objSize(20, 20);
00290 descVec.setFoveaSize(objSize);
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300 initRandomNumbers();
00301
00302 if (!sim)
00303 {
00304
00305 gb->startStream();
00306 }
00307
00308
00309 tim.reset(); masterclock.reset();
00310 Timer timer(1000000); timer.reset();
00311
00312 int frame = 0;
00313 unsigned int objID = 0;
00314 while(goforever)
00315 {
00316
00317 Image< PixRGB<byte> > ima;
00318 if (sim)
00319 {
00320 ifs->updateNext();
00321 ima = ifs->readRGB();
00322 } else {
00323 ima = gb->readRGB();
00324 }
00325 frame++;
00326
00327 Point2D<int> loc = xwin.getLastMouseClick();
00328
00329
00330
00331 if (loc.isValid()) moveArm = !moveArm;
00332
00333 if (moveArm)
00334 {
00335 switch (currentState)
00336 {
00337 case INIT:
00338 if (init(rt100))
00339 {
00340 LINFO("INitalize complete");
00341 currentState = REACH;
00342 rt100->setJointParam(RT100::ZED, RT100::SPEED, 20);
00343
00344 rt100->setJointParam(RT100::SHOLDER, RT100::SPEED, 60);
00345 rt100->setJointParam(RT100::ELBOW, RT100::SPEED, 60);
00346
00347
00348
00349
00350
00351 printf("Init complete\n");
00352 printf("Fixation: %i %i\n", fixation.i, fixation.j);
00353
00354
00355 biasVC(*cc, bayesNet, -1, false);
00356 frame = 0;
00357 }
00358 break;
00359 case REACH:
00360 {
00361 fixation = evolveBrain(ima, descVec, sm);
00362 printf("Fixation: %i %i\n", fixation.i, fixation.j);
00363
00364 descVec.setFovea(fixation);
00365 descVec.buildRawDV();
00366
00367 std::vector<double> FV = descVec.getFV();
00368
00369
00370 bayesNet.learn(FV, objID);
00371
00372 if (!(frame%10))
00373 biasVC(*cc, bayesNet, objID, true);
00374
00375 if (frame > 20) {
00376 if(reach(rt100, fixation,
00377 ima.getWidth()/2,
00378 (ima.getHeight()/2) + 70,
00379 -2800))
00380 {
00381 LINFO("Reached object");
00382 currentState = GRASP;
00383 }
00384 }
00385 }
00386 break;
00387 case GRASP:
00388 if(grasp(rt100))
00389 {
00390 LINFO("Objected grasped");
00391 currentState = PLACE_IN_BASKET;
00392 } else {
00393 LINFO("Did not graped object. Trying again");
00394 rt100->setJointPosition(RT100::YAW, 600);
00395 rt100->setJointPosition(RT100::ZED, -2600);
00396 rt100->setJointPosition(RT100::GRIPPER, 1000);
00397
00398
00399 currentState = REACH;
00400 }
00401 break;
00402
00403 case LIFT:
00404 if(lift(rt100))
00405 {
00406 LINFO("Objected lifted");
00407 currentState = INIT;
00408 }
00409 break;
00410 case PLACE_IN_BASKET:
00411 if(placeInBasket(rt100))
00412 {
00413 LINFO("Object placed in basket");
00414 currentState = INIT;
00415 objID++;
00416 if (objID == 5)
00417 currentState = DONE;
00418 }
00419 break;
00420 case DONE:
00421 init(rt100);
00422 goforever = false;
00423 break;
00424
00425
00426 default:
00427 break;
00428 }
00429 }
00430
00431 updateDisplay(ima, sm, fixation);
00432
00433 avgtime += tim.getReset(); avgn ++;
00434 if (avgn == NAVG)
00435 {
00436 fps = 1000.0F / float(avgtime) * float(avgn);
00437 avgtime = 0; avgn = 0;
00438 }
00439
00440
00441 sprintf(info, "%.1ffps Target - (%03d,%03d) %f ",
00442 fps, fixation.i-(ima.getWidth()/2),
00443 fixation.j-(ima.getHeight()/2)-75,
00444 masterclock.getSecs());
00445
00446 writeText(disp, Point2D<int>(0, h), info,
00447 PixRGB<byte>(255), PixRGB<byte>(127));
00448
00449
00450 }
00451
00452
00453 manager.stop();
00454
00455 } catch ( ... ) { };
00456
00457 return 0;
00458 }
00459
00460
00461 void biasVC(ComplexChannel &vc, Bayes &bayesNet, int objId, bool doBias)
00462 {
00463
00464 BayesianBiaser bb(bayesNet, objId, -1, doBias);
00465 vc.accept(bb);
00466
00467 setSubmapAlgorithmBiased(vc);
00468 }
00469
00470 void updateDisplay(Image<PixRGB<byte> > &ima,
00471 Image<float> &sm,
00472 Point2D<int> &fixation){
00473
00474 static int frame = 0;
00475 char filename[255];
00476 const int foa_size = std::min(w, h) / 12;
00477
00478
00479 inplacePaste(*dispPtr, ima, Point2D<int>(0, 0));
00480
00481 if (sm.initialized())
00482 {
00483 Image<float> dispsm = quickInterpolate(sm, 1 << smlevel);
00484 inplaceNormalize(dispsm, 0.0f, 255.0f);
00485
00486 inplacePaste(*dispPtr,
00487 (Image<PixRGB<byte> >)toRGB(dispsm),
00488 Point2D<int>(w, 0));
00489
00490 Point2D<int> fix2(fixation); fix2.i += w;
00491 if (fixation.i >= 0)
00492 {
00493 drawDisk(*dispPtr, fixation, foa_size/6+2, PixRGB<byte>(20, 50, 255));
00494 drawDisk(*dispPtr, fixation, foa_size/6, PixRGB<byte>(255, 255, 20));
00495 drawDisk(*dispPtr, fix2, foa_size/6+2, PixRGB<byte>(20, 50, 255));
00496 drawDisk(*dispPtr, fix2, foa_size/6, PixRGB<byte>(255, 255, 20));
00497 }
00498 }
00499
00500 printf("FrameInfo: %i %f\n", frame, masterclock.getSecs());
00501 sprintf(filename, "armControlFrames/pickup/frame%06d.ppm", frame++);
00502
00503
00504 xwinPtr->drawImage(*dispPtr);
00505 }
00506
00507 bool init(nub::soft_ref<RT100> rt100)
00508 {
00509
00510 rt100->setJointParam(RT100::ZED, RT100::SPEED, 40);
00511 rt100->setJointParam(RT100::SHOLDER, RT100::SPEED, 40);
00512 rt100->setJointParam(RT100::ELBOW, RT100::SPEED, 40);
00513
00514 rt100->setJointPosition(RT100::ZED, -1500);
00515
00516 rt100->setJointPosition(RT100::SHOLDER, 2300);
00517
00518 rt100->setJointPosition(RT100::ELBOW, -2000);
00519 rt100->setJointPosition(RT100::YAW, 600);
00520 rt100->setJointPosition(RT100::TILT_WRIST, -700);
00521 rt100->setJointPosition(RT100::ROLL_WRIST, 2400);
00522 rt100->setJointPosition(RT100::GRIPPER, 1000);
00523 rt100->moveArm();
00524 waitForMoveComplete(rt100);
00525
00526 short int val;
00527 LINFO("Joint Pos: ");
00528 rt100->getJointPosition(RT100::ZED, &val);
00529 armPosition.zed = val;
00530 printf("%i ", val);
00531 rt100->getJointPosition(RT100::SHOLDER, &val);
00532 armPosition.sholder = val;
00533 printf("%i ", val);
00534 rt100->getJointPosition(RT100::ELBOW, &val);
00535 armPosition.elbow = val;
00536 printf("%i ", val);
00537 rt100->getJointPosition(RT100::YAW, &val);
00538 printf("%i ", val);
00539 printf("\n");
00540
00541 return true;
00542 }
00543
00544 bool learnMovement(float xErr, float yErr, int *elbowPos, int *sholderPos)
00545 {
00546 bool reachXPos = false, reachYPos = false;
00547
00548 *elbowPos = 0;
00549 *sholderPos = 0;
00550 if (!(xErr < 15 && xErr > -15))
00551 {
00552
00553 if (xErr > 0)
00554 *elbowPos = -30;
00555 else
00556 *elbowPos = 30;
00557 reachXPos = false;
00558 } else {
00559 reachXPos = true;
00560 }
00561
00562
00563 if (!(yErr < 15 && yErr > -15))
00564 {
00565 if (yErr > 0)
00566 *sholderPos = -30;
00567 else
00568 *sholderPos = 30;
00569 reachYPos = false;
00570 } else {
00571 reachYPos = true;
00572 }
00573
00574
00575 if (reachXPos && reachYPos)
00576 return true;
00577 else
00578 return false;
00579
00580 return false;
00581
00582 }
00583
00584 bool reach(nub::soft_ref<RT100> rt100, Point2D<int> fixation, int x, int y, int zedPos)
00585 {
00586 bool reachZedPos = false;
00587 std::vector<short int> movePos(rt100->getNumJoints(), 0);
00588 float xErr = fixation.i-x;
00589 float yErr = -1*(fixation.j-y);
00590
00591 int elbowPos = 0, sholderPos = 0;
00592 bool reachedTarget = learnMovement(xErr, yErr, &elbowPos, &sholderPos);
00593
00594
00595
00596
00597
00598 armPosition.sholder += sholderPos;
00599 armPosition.elbow += elbowPos;
00600 armPosition.zed -= 25;
00601 if (armPosition.zed < zedPos) armPosition.zed = zedPos;
00602
00603 if (armPosition.zed == zedPos)
00604 reachZedPos = true;
00605
00606 LINFO("Err: %f:%f s:%i e:%i z:%i",
00607 xErr, yErr,
00608 armPosition.elbow,
00609 armPosition.sholder,
00610 armPosition.zed);
00611
00612 if (reachedTarget && reachZedPos)
00613 {
00614
00615 short int sholderPos, elbowPos;
00616 rt100->getJointPosition(RT100::SHOLDER, &sholderPos);
00617 rt100->getJointPosition(RT100::ELBOW, &elbowPos);
00618
00619 rt100->setJointPosition(RT100::SHOLDER, sholderPos);
00620 rt100->setJointPosition(RT100::ELBOW, elbowPos);
00621
00622 short int val;
00623 printf("Reach complete\n");
00624 printf("Joint Pos: ");
00625 rt100->getJointPosition(RT100::ZED, &val);
00626 printf("%i ", val);
00627 rt100->getJointPosition(RT100::SHOLDER, &val);
00628 printf("%i ", val);
00629 rt100->getJointPosition(RT100::ELBOW, &val);
00630 printf("%i ", val);
00631 rt100->getJointPosition(RT100::YAW, &val);
00632 printf("%i\n", val);
00633
00634 return true;
00635 } else {
00636
00637 rt100->setJointPosition(RT100::SHOLDER, armPosition.sholder);
00638 rt100->setJointPosition(RT100::ELBOW, armPosition.elbow);
00639 rt100->setJointPosition(RT100::ZED, armPosition.zed);
00640 rt100->moveArm();
00641
00642 return false;
00643 }
00644
00645 return false;
00646 }
00647
00648 void waitForMoveComplete(nub::soft_ref<RT100> rt100)
00649 {
00650 bool moveDone = false;
00651 for(int i=0; i<1000 && !moveDone; i++)
00652 {
00653 moveDone = rt100->moveComplete();
00654 Image< PixRGB<byte> > ima = gb->readRGB();
00655 Image<float> sm;
00656 Point2D<int> fix;
00657 updateDisplay(ima, sm, fix);
00658 }
00659 }
00660
00661
00662 bool grasp(nub::soft_ref<RT100> rt100)
00663 {
00664
00665 short int elbowPos;
00666 rt100->getJointPosition(RT100::ELBOW, &elbowPos);
00667
00668
00669
00670 float yawPos = 0.3334*elbowPos+40.909;
00671
00672 LINFO("Elbow pos %i: %i\n", elbowPos, (short int)yawPos);
00673 rt100->setJointPosition(RT100::YAW, (short int)yawPos);
00674 rt100->moveArm();
00675 waitForMoveComplete(rt100);
00676
00677
00678 LINFO("Zed change");
00679 rt100->setJointPosition(RT100::ZED, -2900);
00680 rt100->moveArm();
00681 waitForMoveComplete(rt100);
00682
00683 LINFO("close gripper");
00684 rt100->setJointPosition(RT100::GRIPPER, -500);
00685 rt100->moveArm();
00686 waitForMoveComplete(rt100);
00687
00688 short int gripperPos;
00689 rt100->getJointPosition(RT100::GRIPPER, &gripperPos);
00690 printf("Gripper pos %i", gripperPos);
00691
00692 if (gripperPos <= 0)
00693 return false;
00694 else
00695 return true;
00696 }
00697
00698 bool lift(nub::soft_ref<RT100> rt100)
00699 {
00700 LINFO("Zed change");
00701 rt100->setJointPosition(RT100::ZED, -2500);
00702
00703
00704 rt100->moveArm();
00705 waitForMoveComplete(rt100);
00706
00707 LINFO("open gripper");
00708 rt100->setJointPosition(RT100::GRIPPER, 1000);
00709 rt100->moveArm();
00710 waitForMoveComplete(rt100);
00711
00712 return true;
00713 }
00714
00715 bool placeInBasket(nub::soft_ref<RT100> rt100)
00716 {
00717 LINFO("Move to basket");
00718 rt100->setJointPosition(RT100::ZED, -2100);
00719 rt100->moveArm();
00720 waitForMoveComplete(rt100);
00721
00722 rt100->setJointPosition(RT100::SHOLDER, 1890);
00723 rt100->setJointPosition(RT100::ELBOW, -120);
00724 rt100->setJointPosition(RT100::YAW, -226);
00725 rt100->moveArm();
00726 waitForMoveComplete(rt100);
00727
00728 LINFO("prepare to drop");
00729
00730 LINFO("open gripper");
00731 rt100->setJointPosition(RT100::GRIPPER, 1000);
00732 rt100->moveArm();
00733 waitForMoveComplete(rt100);
00734
00735 return true;
00736 }
00737 bool drop(nub::soft_ref<RT100> rt100)
00738 {
00739
00740
00741 return true;
00742 }
00743
00744 Point2D<int> evolveBrain(Image<PixRGB<byte> > &img, DescriptorVec& descVec,
00745 Image<float> &smap)
00746 {
00747
00748 nub::ref<StdBrain> brain = dynCastWeak<StdBrain>(mgr->subComponent("Brain"));
00749 nub::ref<SimEventQueueConfigurator> seqc =
00750 dynCastWeak<SimEventQueueConfigurator>(mgr->subComponent("SimEventQueueConfigurator"));
00751 nub::soft_ref<SimEventQueue> seq = seqc->getQ();
00752
00753 LINFO("Evolve Brain");
00754
00755 if (mgr->started()){
00756
00757 if (img.initialized())
00758 {
00759
00760 rutz::shared_ptr<SimEventInputFrame>
00761 e(new SimEventInputFrame(brain.get(), GenericFrame(img), 0));
00762 seq->post(e);
00763
00764 descVec.setInputImg(img);
00765 }
00766
00767 bool keep_going = true;
00768 while (keep_going){
00769 brain->evolve(*seq);
00770 seq->evolve();
00771
00772 const SimStatus status = seq->evolve();
00773 if (status == SIM_BREAK) {
00774 LINFO("V %d\n", (int)(seq->now().msecs()) );
00775 keep_going = false;
00776 }
00777 if (brain->gotCovertShift())
00778 {
00779
00780 const Point2D<int> winner = brain->getLastCovertPos();
00781 const float winV = brain->getLastCovertAgmV();
00782
00783 LINFO("##### Winner (%d,%d) at %fms : %.4f #####\n",
00784 winner.i, winner.j, seq->now().msecs(), winV * 1000.0f);
00785
00786 smap = brain->getVC()->getOutput();
00787
00788
00789
00790
00791
00792 return winner;
00793
00794 keep_going = false;
00795
00796 }
00797 if (seq->now().secs() > 3.0) {
00798 LINFO("##### Time limit reached #####");
00799 keep_going = false;
00800 }
00801 LINFO("Evolve brain");
00802 }
00803
00804 }
00805
00806 return Point2D<int>();
00807
00808 }
00809
00810
00811
00812 #endif
00813
00814
00815
00816
00817