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 "Media/MediaOpts.H"
00046 #include "GUI/XWinManaged.H"
00047
00048 #include "Video/VideoFormat.H"
00049 #include "Devices/FrameGrabberConfigurator.H"
00050 #include "Devices/FrameGrabberFactory.H"
00051
00052 #include "Devices/DeviceOpts.H"
00053 #include "Image/CutPaste.H"
00054
00055 #include "Globals.H"
00056 #include "AgentManagerB.H"
00057 #include "Mission.H"
00058 #include "SubController.H"
00059
00060 #include <signal.h>
00061
00062 #define SIM_MODE false
00063
00064 volatile bool goforever = false;
00065 uint fNum = 0;
00066
00067
00068 void checkInMessages
00069 ( nub::soft_ref<Beowulf> beo,
00070 nub::ref<AgentManagerB> agentManager,
00071 rutz::shared_ptr<XWinManaged> cwin);
00072
00073
00074 void checkOutMessages
00075 ( nub::ref<AgentManagerB> agentManager,
00076 nub::soft_ref<Beowulf> beo);
00077
00078
00079 void packageSensorResult
00080 ( SensorResult sensorResult,
00081 TCPmessage &smsg);
00082
00083
00084
00085
00086 void terminate(int s)
00087 {
00088 LERROR("*** INTERRUPT ***");
00089 goforever = false;
00090 exit(1);
00091 }
00092
00093
00094
00095 int main( int argc, const char* argv[] )
00096 {
00097 MYLOGVERB = LOG_INFO;
00098
00099
00100 ModelManager manager("SeaBee 2008 competition slave");
00101
00102
00103 nub::soft_ref<Beowulf>
00104 beo(new Beowulf(manager, "Beowulf Slave", "BeowulfSlave", false));
00105 manager.addSubComponent(beo);
00106
00107 #if SIM_MODE == false
00108
00109 nub::soft_ref<InputFrameSeries> ifs;
00110
00111 ifs.reset(new InputFrameSeries(manager));
00112 manager.addSubComponent(ifs);
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 #endif
00130
00131
00132
00133
00134
00135
00136
00137
00138 nub::ref<AgentManagerB> agentManager(new AgentManagerB(manager));
00139 manager.addSubComponent(agentManager);
00140
00141 manager.exportOptions(MC_RECURSE);
00142
00143
00144 if (manager.parseCommandLine(argc, argv, "", 0, 0) == false) return(1);
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 TCPmessage rmsg;
00155 TCPmessage smsg;
00156 int32 rframe = 0, raction = 0, rnode = -1;
00157
00158
00159 signal(SIGHUP, terminate); signal(SIGINT, terminate);
00160 signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00161 signal(SIGALRM, terminate);
00162
00163
00164 manager.start();
00165
00166 while(!beo->receive(rnode, rmsg, rframe, raction, 5));
00167 int initval = uint(rmsg.getElementInt32());
00168 LINFO("Recieved INIT(%d) from COM_A", initval);
00169
00170
00171 uint w, h;
00172
00173 #if SIM_MODE == false
00174 w = ifs->getWidth();
00175 h = ifs->getHeight();
00176
00177
00178 #else
00179 w = 320;
00180 h = 240;
00181 #endif
00182
00183
00184 rutz::shared_ptr<XWinManaged> cwin
00185 (new XWinManaged(Dims(w,h), 0, 0, "Downward Vision WindowF"));
00186
00187
00188
00189
00190
00191 agentManager->setWindow(cwin);
00192
00193
00194
00195 smsg.reset(rframe, INIT_DONE);
00196 beo->send(rnode, smsg);
00197
00198 #if SIM_MODE == false
00199
00200 ifs->startStream();
00201
00202
00203
00204
00205 #endif
00206
00207 goforever = true;
00208
00209 Image<PixRGB<byte> > img(w,h,ZEROS);
00210
00211
00212
00213
00214 while(goforever)
00215 {
00216
00217 #if SIM_MODE == false
00218
00219 ifs->updateNext(); img = ifs->readRGB();
00220 if(!img.initialized()) {Raster::waitForKey(); break; }
00221
00222
00223
00224
00225 agentManager->setCurrentImageF(img, fNum);
00226 agentManager->setCurrentImageB(img, fNum);
00227 #else
00228
00229
00230 #endif
00231
00232 fNum++;
00233
00234
00235 checkInMessages(beo, agentManager, cwin);
00236
00237
00238 checkOutMessages(agentManager, beo);
00239 }
00240
00241
00242 manager.stop();
00243 return 0;
00244 }
00245
00246
00247 void checkInMessages
00248 ( nub::soft_ref<Beowulf> beo,
00249 nub::ref<AgentManagerB> agentManager,
00250 rutz::shared_ptr<XWinManaged> cwin
00251 )
00252 {
00253 int32 rframe = 0, raction = 0, rnode = -1;
00254 TCPmessage rmsg;
00255
00256
00257 if(beo->receive(rnode, rmsg, rframe, raction, 5))
00258 {
00259
00260 Image<PixRGB<byte> > img;
00261
00262 switch(raction)
00263 {
00264 case ABORT:
00265 {
00266 goforever = false; LINFO("Stop SeaBee COM-B");
00267 break;
00268 }
00269 case UPDATE_MISSION:
00270 {
00271
00272 Mission theMission;
00273 theMission.missionName = Mission::MissionName(rmsg.getElementInt32());
00274 theMission.timeForMission = int(rmsg.getElementInt32());
00275 theMission.missionState = Mission::MissionState(rmsg.getElementInt32());
00276
00277
00278 agentManager->updateAgentsMission(theMission);
00279 break;
00280 }
00281 case IMAGE_UPDATE:
00282 fNum++;
00283 img = rmsg.getElementColByteIma();
00284
00285 agentManager->setCurrentImageF(img, fNum);
00286 break;
00287 default:
00288 LINFO("Unknown purpose");
00289 }
00290 }
00291 }
00292
00293
00294 void checkOutMessages
00295 ( nub::ref<AgentManagerB> agentManager,
00296 nub::soft_ref<Beowulf> beo)
00297 {
00298 int32 rnode = -1;
00299 TCPmessage smsg;
00300
00301
00302 if(agentManager->getNumResults() > 0)
00303 {
00304
00305 SensorResult result = agentManager->popResult();
00306
00307
00308 packageSensorResult(result, smsg);
00309
00310
00311 beo->send(rnode, smsg);
00312 }
00313 }
00314
00315
00316 void packageSensorResult
00317 ( SensorResult sensorResult,
00318 TCPmessage &smsg)
00319 {
00320 int32 rframe = 0;
00321
00322 smsg.reset(rframe, SENSOR_RESULT);
00323
00324 SensorResult::SensorResultType type =
00325 sensorResult.getType();
00326
00327 smsg.addInt32(type);
00328
00329 smsg.addInt32(sensorResult.getStatus());
00330
00331
00332 switch(type)
00333 {
00334 case SensorResult::BUOY:
00335 {
00336 Point3D pos = sensorResult.getPosition();
00337 smsg.addInt32(int32(pos.x));
00338 smsg.addInt32(int32(pos.y));
00339 smsg.addInt32(int32(pos.z));
00340 break;
00341 }
00342 case SensorResult::PIPE:
00343 {
00344 Point3D pos = sensorResult.getPosition();
00345 smsg.addInt32(int32(pos.x));
00346 smsg.addInt32(int32(pos.y));
00347 smsg.addInt32(int32(pos.z));
00348 Angle ori = sensorResult.getOrientation();
00349 smsg.addDouble(ori.getVal());
00350 uint fnum = sensorResult.getFrameNum();
00351 smsg.addInt32(int32(fnum));
00352 break;
00353 }
00354 case SensorResult::BIN:
00355 {
00356 Point3D pos = sensorResult.getPosition();
00357 smsg.addInt32(int32(pos.x));
00358 smsg.addInt32(int32(pos.y));
00359 smsg.addInt32(int32(pos.z));
00360 break;
00361 }
00362 case SensorResult::PINGER:
00363 {
00364 Angle ori = sensorResult.getOrientation();
00365 smsg.addDouble(ori.getVal());
00366 break;
00367 }
00368 case SensorResult::SALIENCY:
00369 {
00370 Point3D pos = sensorResult.getPosition();
00371 smsg.addInt32(int32(pos.x));
00372 smsg.addInt32(int32(pos.y));
00373 smsg.addInt32(int32(pos.z));
00374 break;
00375 }
00376 default: LINFO("Unknown sensor result type: %d",type);
00377 }
00378 }
00379
00380
00381
00382
00383
00384