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 #include "Beowulf/Beowulf.H"
00041 #include "Component/ModelManager.H"
00042 #include "Media/FrameSeries.H"
00043 #include "Transport/FrameIstream.H"
00044 #include "Raster/Raster.H"
00045 #include "Image/Image.H"
00046 #include "Image/Pixels.H"
00047 #include "GUI/XWinManaged.H"
00048
00049 #include "Media/MediaOpts.H"
00050 #include "Devices/DeviceOpts.H"
00051 #include "Raster/GenericFrame.H"
00052
00053 #include "Image/CutPaste.H"
00054
00055 #include "BeoSub/BeeBrain/AgentManagerA.H"
00056
00057 #include "BeoSub/BeeBrain/Globals.H"
00058 #include <signal.h>
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 bool goforever = false;
00073
00074
00075 void checkInMessages
00076 ( nub::soft_ref<Beowulf> beo,
00077 nub::ref<AgentManagerA> agentManager);
00078
00079
00080 void checkOutMessages
00081 ( nub::ref<AgentManagerA> agentManager,
00082 nub::soft_ref<Beowulf> beo);
00083
00084
00085 void packageAgentManagerCommand
00086 (rutz::shared_ptr<AgentManagerCommand> agentManagerCommand,
00087 TCPmessage &smsg);
00088
00089
00090 void unpackageToOceanObject
00091 ( TCPmessage rmsg,
00092 rutz::shared_ptr<OceanObject> oceanObject,
00093 DataTypes dType);
00094
00095
00096
00097 void terminate(int s)
00098 { LERROR("*** INTERRUPT ***"); goforever = false; exit(1); }
00099
00100
00101 int main( int argc, const char* argv[] )
00102 {
00103 MYLOGVERB = LOG_INFO;
00104
00105
00106 ModelManager manager("seabee 2007 competition");
00107
00108
00109 nub::soft_ref<Beowulf>
00110 beo(new Beowulf(manager, "Beowulf Master", "BeowulfMaster", true));
00111 manager.addSubComponent(beo);
00112
00113 nub::soft_ref<InputFrameSeries> ifs(new InputFrameSeries(manager));
00114 manager.addSubComponent(ifs);
00115
00116
00117 nub::ref<AgentManagerA> agentManager(new AgentManagerA(manager));
00118 manager.addSubComponent(agentManager);
00119
00120 manager.exportOptions(MC_RECURSE);
00121
00122 manager.setOptionValString(&OPT_InputFrameSource, "V4L2");
00123 manager.setOptionValString(&OPT_FrameGrabberMode, "YUYV");
00124 manager.setOptionValString(&OPT_FrameGrabberDims, "1024x576");
00125 manager.setOptionValString(&OPT_FrameGrabberByteSwap, "no");
00126 manager.setOptionValString(&OPT_FrameGrabberFPS, "30");
00127
00128
00129 if (manager.parseCommandLine(argc, argv, "", 0, 0) == false) return(1);
00130
00131
00132 int w = 320, h = 240;
00133 std::string dims = convertToString(Dims(w, h));
00134 LINFO("image size: [%dx%d]", w, h);
00135 manager.setOptionValString(&OPT_InputFrameDims, dims);
00136
00137 manager.setModelParamVal("InputFrameDims", Dims(w, h),
00138 MC_RECURSE | MC_IGNORE_MISSING);
00139
00140 TCPmessage rmsg;
00141 TCPmessage smsg;
00142 int32 rframe = 0, raction = 0, rnode = 0;
00143
00144
00145 signal(SIGHUP, terminate); signal(SIGINT, terminate);
00146 signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00147 signal(SIGALRM, terminate);
00148
00149
00150 manager.start();
00151
00152
00153 smsg.reset(0, INIT_COMM);
00154 smsg.addInt32(int32(235));
00155
00156
00157 beo->send(COM_B_NODE, smsg);
00158
00159
00160 LINFO("waiting until COM_B is ready to go");
00161 rnode = COM_B_NODE;
00162 while(!beo->receive(rnode, rmsg, rframe, raction, 5));
00163 rmsg.reset(rframe, raction);
00164 LINFO("%d is ready", rnode);
00165
00166
00167 ifs->startStream();
00168
00169 rutz::shared_ptr<XWinManaged> cwin
00170 (new XWinManaged(Dims(2*w,2*h), 20, 20, "Forward Vision Window"));
00171 Image<PixRGB<byte> >dispImage(2*w, 2*h, ZEROS);
00172
00173 agentManager->setWindow(cwin,dispImage);
00174
00175 agentManager->startRun();
00176 goforever = true; uint fnum = 0;
00177 while(goforever)
00178 {
00179
00180
00181
00182
00183
00184 Image<PixRGB<byte> > ima;
00185
00186 const FrameState is = ifs->updateNext();
00187 if (is == FRAME_COMPLETE)
00188 break;
00189
00190
00191 GenericFrame input = ifs->readFrame();
00192 if (!input.initialized())
00193 break;
00194 ima = rescale(input.asRgb(), 320, 240);
00195
00196 agentManager->setCurrentImage(ima, fnum);
00197 fnum++;
00198
00199
00200 checkInMessages(beo, agentManager);
00201
00202
00203
00204 checkOutMessages(agentManager, beo);
00205 }
00206
00207
00208 smsg.reset(0, ABORT);
00209 beo->send(COM_B_NODE, smsg);
00210
00211
00212 manager.stop();
00213 return 0;
00214 }
00215
00216
00217 void checkInMessages
00218 ( nub::soft_ref<Beowulf> beo,
00219 nub::ref<AgentManagerA> agentManager)
00220 {
00221 int32 rframe = 0, raction = 0, rnode = 0;
00222 TCPmessage rmsg;
00223
00224
00225 while(beo->receive(rnode, rmsg, rframe, raction, 5))
00226 {
00227
00228
00229 rutz::shared_ptr<OceanObject> oceanObject(new OceanObject());
00230
00231
00232 uint oceanObjectId = int(rmsg.getElementInt32());
00233
00234 oceanObject->setId(oceanObjectId);
00235
00236
00237 switch(raction)
00238 {
00239 case SEARCH_OCEAN_OBJECT_CMD:
00240 {
00241
00242 DataTypes oceanObjectDataType = DataTypes(rmsg.getElementInt32());
00243
00244 LINFO("Recieved result. DataType: %d", oceanObjectDataType);
00245
00246
00247 unpackageToOceanObject(rmsg, oceanObject, oceanObjectDataType);
00248
00249
00250 agentManager->updateOceanObject(oceanObject, oceanObjectDataType);
00251
00252 break;
00253 }
00254
00255 case OCEAN_OBJECT_STATUS:
00256 {
00257 agentManager->getPreFrontalCortexAgent()->msgOceanObjectUpdate();
00258 break;
00259 }
00260
00261 default:
00262 LERROR("Unknown purpose");
00263 }
00264 }
00265 }
00266
00267
00268 void checkOutMessages
00269 ( nub::ref<AgentManagerA> agentManager,
00270 nub::soft_ref<Beowulf> beo)
00271 {
00272 int32 rnode = 0;
00273 TCPmessage smsg;
00274
00275
00276 while(agentManager->getNumCommands() > 0)
00277 {
00278 LINFO("COM_A: sending out a command");
00279
00280
00281 packageAgentManagerCommand(agentManager->popCommand(), smsg);
00282
00283
00284 beo->send(rnode, smsg);
00285 }
00286 }
00287
00288
00289 void packageAgentManagerCommand
00290 (rutz::shared_ptr<AgentManagerCommand> agentManagerCommand, TCPmessage &smsg)
00291 {
00292 int32 sframe = 0;
00293 int32 saction = agentManagerCommand->itsCommandType;
00294
00295 smsg.reset(sframe, saction);
00296 smsg.addInt32(int32(agentManagerCommand->itsDataType));
00297 smsg.addInt32(int32(agentManagerCommand->itsOceanObjectId));
00298 smsg.addInt32(int32(agentManagerCommand->itsOceanObjectType));
00299 }
00300
00301
00302 void unpackageToOceanObject
00303 (TCPmessage rmsg,
00304 rutz::shared_ptr<OceanObject> oceanObject,
00305 DataTypes dType)
00306 {
00307 DataTypes dataType = dType;
00308
00309 switch(dataType)
00310 {
00311 case POSITION:
00312 {
00313 int x = int(rmsg.getElementInt32());
00314 int y = int(rmsg.getElementInt32());
00315 int z = int(rmsg.getElementInt32());
00316 LINFO("Recieved a point (%d,%d,%d)",x,y,z);
00317 oceanObject->setPosition(Point3D(x,y,z));
00318 break;
00319 }
00320 case ORIENTATION:
00321 {
00322 double angle = rmsg.getElementDouble();
00323 oceanObject->setOrientation(Angle(angle));
00324 break;
00325 }
00326 case FREQUENCY:
00327 {
00328 float frequency = rmsg.getElementFloat();
00329 oceanObject->setFrequency(frequency);
00330 break;
00331 }
00332 case DISTANCE:
00333 {
00334 float distance = rmsg.getElementFloat();
00335 oceanObject->setDistance(distance);
00336 break;
00337 }
00338 case MASS:
00339 {
00340 float mass = rmsg.getElementFloat();
00341 oceanObject->setMass(mass);
00342 break;
00343 }
00344 default: LFATAL("unknown data type");
00345 }
00346 }
00347
00348
00349
00350
00351
00352