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 "Image/OpenCVUtil.H"
00039 #include "Image/Image.H"
00040 #include "Image/Pixels.H"
00041 #include "Component/ModelManager.H"
00042 #include "Image/CutPaste.H"
00043 #include "GUI/XWinManaged.H"
00044 #include "Util/Timer.H"
00045 #include "Controllers/PID.H"
00046 #include "Image/PyrBuilder.H"
00047 #include "RCBot/TrackFeature.H"
00048 #include "RCBot/FindLandmark.H"
00049
00050 #include <signal.h>
00051 #include <unistd.h>
00052 #include <netdb.h>
00053 #include <fcntl.h>
00054 #include <arpa/inet.h>
00055 #include <stdlib.h>
00056
00057 #include "Corba/Objects/BotControlServerSK.hh"
00058 #include "Corba/Objects/SceneRecServerSK.hh"
00059 #include "Corba/ImageOrbUtil.H"
00060 #include "Corba/CorbaUtil.H"
00061
00062 #define LAND_WINSIZE 55
00063
00064 char info[255];
00065 Point2D<int> trackLoc(-1,-1);
00066 Point2D<int> landmarkLoc(-1,-1);
00067 Point2D<int> oldLandmarkLoc(-1,-1);
00068
00069 static bool goforever = true;
00070
00071
00072 void terminate(int s)
00073 { LERROR("*** INTERRUPT ***"); goforever = false; exit(1); }
00074
00075
00076 int main(int argc, char **argv)
00077 {
00078 MYLOGVERB = LOG_INFO;
00079
00080
00081 signal(SIGHUP, terminate); signal(SIGINT, terminate);
00082 signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00083 signal(SIGALRM, terminate);
00084
00085 CORBA::ORB_ptr orb = CORBA::ORB_init(argc,argv,"omniORB4");
00086
00087
00088 ModelManager manager("SaliencyMT Tester");
00089
00090 nub::ref<SaliencyMT> smt(new SaliencyMT(manager, orb, 0));
00091 manager.addSubComponent(smt);
00092
00093
00094 CORBA::Object_ptr objBotControlRef[10]; int nBotControlObj;
00095 if (!getMultiObjectRef(orb, "saliency.BotControllers",
00096 objBotControlRef, nBotControlObj)){
00097 LFATAL("Cannot find any object to bind with");
00098 }
00099 BotControlServer_var robotController =
00100 BotControlServer::_narrow(objBotControlRef[0]);
00101
00102
00103 CORBA::Object_ptr objSceneRecRef[10]; int nSceneRecObj;
00104 if (!getMultiObjectRef(orb, "saliency.SceneRec", objSceneRecRef, nSceneRecObj))
00105 {
00106 LFATAL("Cannot find any SceneRec object to bind with");
00107 }
00108 SceneRecServer_var sceneRec = SceneRecServer::_narrow(objSceneRecRef[0]);
00109
00110
00111 if (manager.parseCommandLine((const int)argc, (const char**)argv, "", 0, 1) == false)
00112 return(1);
00113
00114 manager.start();
00115
00116 PID<float> steer_pid(0.03, 0, 0, -1, 1);
00117
00118
00119 robotController->init();
00120
00121 short w, h;
00122 robotController->getImageSensorDims(w,h,0);
00123 LINFO("Dim %i %i", w, h);
00124
00125 sprintf(info, "Testing...");
00126
00127
00128 TrackFeature trackFeature(smt);
00129
00130
00131 FindLandmark findLandmark(sceneRec);
00132 Image<PixRGB<byte> > landmarkImg;
00133 bool lookForLandmark = true;
00134 int leg = 0;
00135
00136
00137 robotController->setSpeed(0);
00138 robotController->setSteering(0);
00139
00140
00141 while(goforever)
00142 {
00143
00144 ImageOrb *imgOrb = robotController->getImageSensor(0);
00145 Image< PixRGB<byte> > ima;
00146 orb2Image(*imgOrb, ima);
00147
00148 LINFO("Send image");
00149
00150 trackFeature.setImg(ima);
00151
00152 LINFO("Send image 2");
00153
00154 findLandmark.setImg(ima);
00155 if (lookForLandmark){
00156 landmarkImg = ima;
00157 lookForLandmark = false;
00158 }
00159
00160 LINFO("Compute locations");
00161 int tempLeg = findLandmark.getLandmark(landmarkLoc);
00162 if (tempLeg > leg) leg = tempLeg;
00163 LINFO("Got landmark");
00164
00165
00166
00167
00168 if ((landmarkLoc.isValid() && oldLandmarkLoc != landmarkLoc) ||
00169 !trackLoc.isValid())
00170 {
00171 LINFO("Setting tracking location");
00172 trackFeature.setTrackLoc(landmarkLoc, landmarkImg);
00173 oldLandmarkLoc = landmarkLoc;
00174 lookForLandmark = true;
00175 }
00176
00177 LINFO("Getting tracking");
00178
00179 trackLoc = trackFeature.getTrackLoc();
00180 LINFO("Got tracking");
00181
00182
00183
00184
00185 LINFO("Landmark (%i,%i) track (%i,%i)", landmarkLoc.i, landmarkLoc.j,
00186 trackLoc.i, trackLoc.j);
00187 Point2DOrb locOrb;
00188 int key = robotController->getUserInput(locOrb);
00189 if (key == 65)
00190 leg++;
00191
00192 if (locOrb.i > 1 && locOrb.j > 1){
00193 landmarkLoc.i = locOrb.i; landmarkLoc.j = locOrb.j;
00194 if (key != -1 || landmarkLoc.isValid()){
00195 LINFO("Key %i loc (%i,%i)", key, landmarkLoc.i, landmarkLoc.j);
00196 }
00197
00198
00199 trackFeature.setTrackLoc(landmarkLoc, ima);
00200 oldLandmarkLoc = landmarkLoc;
00201
00202
00203 DimsOrb winOrb = {LAND_WINSIZE, LAND_WINSIZE};
00204 sceneRec->trainFeature(*image2Orb(ima), toOrb(landmarkLoc), winOrb, leg);
00205
00206
00207 }
00208
00209
00210 if (trackLoc.isValid()){
00211
00212 double steer_cor = steer_pid.update(w/2, trackLoc.i);
00213 if (steer_cor > 1) steer_cor = 1;
00214 else if (steer_cor < -1) steer_cor = -1;
00215
00216 robotController->setSteering(steer_cor);
00217
00218 robotController->setSpeed(-0.4);
00219 } else {
00220 robotController->setSpeed(0);
00221 }
00222
00223 sprintf(info, "%.1ffps l=%i", trackFeature.getFps(), leg);
00224 robotController->setInfo(info, toOrb(trackLoc), toOrb(landmarkLoc));
00225 }
00226
00227 manager.stop();
00228 return 0;
00229 }
00230
00231
00232
00233
00234
00235