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 #include "Beowulf/Beowulf.H"
00040 #include "Component/ModelManager.H"
00041 #include "Raster/Raster.H"
00042 #include "Image/Image.H"
00043 #include "Image/Pixels.H"
00044 #include "GUI/XWinManaged.H"
00045 #include "GUI/ImageDisplayStream.H"
00046 #include "Neuro/EnvVisualCortex.H"
00047 #include "Image/ShapeOps.H"
00048
00049 #include "Media/MediaOpts.H"
00050 #include "Devices/DeviceOpts.H"
00051 #include "Devices/FrameGrabberConfigurator.H"
00052 #include "Devices/FrameGrabberFactory.H"
00053 #include "Raster/GenericFrame.H"
00054
00055 #include "Image/CutPaste.H"
00056
00057
00058 #include "ForwardVision.H"
00059 #include "MovementController.H"
00060 #include "SubGUI.H"
00061 #include "Globals.H"
00062 #include "SubController.H"
00063
00064 #include <signal.h>
00065
00066 volatile bool goforever = false;
00067
00068
00069
00070
00071 void terminate(int s)
00072 {
00073 LERROR("*** INTERRUPT ***");
00074 goforever = false;
00075 exit(1);
00076 }
00077
00078 const ModelOptionDef OPT_ALIASseabeeCam =
00079 { MODOPT_ALIAS, "ALIASseabeeCam", &MOC_ALIAS, OPTEXP_CORE,
00080 "Set parameters for the SeaBee's camera",
00081 "seabee-cam", '\0', "",
00082
00083
00084 "--framegrabber-mode=YUYV "
00085 "--framegrabber-bswap=false "
00086 "--out=display "
00087 };
00088
00089
00090 static const ModelOptionDef OPT_RunAgents =
00091 { MODOPT_FLAG, "SeaBeeRunAgents", &MOC_OUTPUT, OPTEXP_CORE,
00092 "Whether to run seabee submarine agents ",
00093 "run-seabee-agents", '\0', "", "false" };
00094
00095 Point2D<int> getClick(nub::soft_ref<OutputFrameSeries> &ofs, const char* winName)
00096 {
00097 const nub::soft_ref<ImageDisplayStream> ids =
00098 ofs->findFrameDestType<ImageDisplayStream>();
00099
00100 const rutz::shared_ptr<XWinManaged> uiwin =
00101 ids.is_valid()
00102 ? ids->getWindow(winName)
00103 : rutz::shared_ptr<XWinManaged>();
00104 return uiwin->getLastMouseClick();
00105 }
00106
00107
00108
00109 int main( int argc, const char* argv[] )
00110 {
00111 MYLOGVERB = LOG_INFO;
00112
00113
00114 ModelManager manager("SeaBee 2008 Main");
00115
00116 OModelParam<bool> runSubAgents(&OPT_RunAgents, &manager);
00117
00118
00119
00120 nub::soft_ref<OutputFrameSeries> ofs(new OutputFrameSeries(manager));
00121 manager.addSubComponent(ofs);
00122
00123 nub::soft_ref<SubGUI> subGUI(new SubGUI(manager));
00124 manager.addSubComponent(subGUI);
00125
00126 nub::soft_ref<SubController> subController(new SubController(manager, "SubController", "SubController"));
00127 manager.addSubComponent(subController);
00128
00129 nub::soft_ref<MovementController> movementController(new MovementController(manager,
00130 subController));
00131 manager.addSubComponent(movementController);
00132
00133 nub::soft_ref<EnvVisualCortex> evc(new EnvVisualCortex(manager));
00134 manager.addSubComponent(evc);
00135
00136
00137
00138
00139
00140 rutz::shared_ptr<ForwardVisionAgent> forwardVision(new ForwardVisionAgent(evc));
00141
00142
00143 manager.requestOptionAlias(&OPT_ALIASseabeeCam);
00144
00145 manager.exportOptions(MC_RECURSE);
00146
00147
00148 if (manager.parseCommandLine(argc, argv, "", 0, 0) == false) return(1);
00149
00150 Dims cameraDims = subController->peekDims();
00151
00152
00153 signal(SIGHUP, terminate); signal(SIGINT, terminate);
00154 signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00155 signal(SIGALRM, terminate);
00156
00157
00158 manager.start();
00159
00160
00161 bool competitionMode = false;
00162 bool debugMovementController = true;
00163 bool debugGoThroughGate = false;
00164 bool debugGoForwardTurnAround = true;
00165 bool debugPipeFollowing = false;
00166
00167
00168 if(!competitionMode)
00169 {
00170 subGUI->startThread(ofs);
00171 subGUI->setupGUI(subController.get(), true);
00172
00173 if(debugMovementController)
00174 subGUI->setupGUI(movementController.get(), true);
00175
00176 subGUI->addMeter(subController->getIntPressurePtr(),
00177 "Int Pressure", 500, PixRGB<byte>(255, 0, 0));
00178 subGUI->addMeter(subController->getHeadingPtr(),
00179 "Heading", 360, PixRGB<byte>(192, 255, 0));
00180 subGUI->addMeter(subController->getPitchPtr(),
00181 "Pitch", 256, PixRGB<byte>(192, 255, 0));
00182 subGUI->addMeter(subController->getRollPtr(),
00183 "Roll", 256, PixRGB<byte>(192, 255, 0));
00184 subGUI->addMeter(subController->getDepthPtr(),
00185 "Depth", 300, PixRGB<byte>(192, 255, 0));
00186 subGUI->addMeter(subController->getThruster_Up_Left_Ptr(),
00187 "Motor_Up_Left", -100, PixRGB<byte>(0, 255, 0));
00188 subGUI->addMeter(subController->getThruster_Up_Right_Ptr(),
00189 "Motor_Up_Right", -100, PixRGB<byte>(0, 255, 0));
00190 subGUI->addMeter(subController->getThruster_Up_Back_Ptr(),
00191 "Motor_Up_Back", -100, PixRGB<byte>(0, 255, 0));
00192 subGUI->addMeter(subController->getThruster_Fwd_Left_Ptr(),
00193 "Motor_Fwd_Left", -100, PixRGB<byte>(0, 255, 0));
00194 subGUI->addMeter(subController->getThruster_Fwd_Right_Ptr(),
00195 "Motor_Fwd_Right", -100, PixRGB<byte>(0, 255, 0));
00196
00197 subGUI->addImage(subController->getSubImagePtr());
00198
00199
00200 }
00201
00202
00203
00204 sleep(2);
00205
00206 goforever = true; uint fnum = 0;
00207
00208
00209
00210
00211
00212
00213
00214 subController->setHeading(subController->getHeading());
00215
00216
00217 while(goforever)
00218 {
00219 if(runSubAgents.getVal())
00220 {
00221
00222
00223 }
00224 else if(debugMovementController)
00225 {
00226 Image< PixRGB<byte> > fImg = subController->getImage(1);
00227 if(fImg.initialized())
00228 {
00229 ofs->writeRGB(fImg, "ForwardCam", FrameInfo("Frame",SRC_POS));
00230 ofs->updateNext();
00231 }
00232
00233 Image< PixRGB<byte> > dImg = subController->getImage(2);
00234 if(dImg.initialized())
00235 {
00236 ofs->writeRGB(dImg, "DownwardCam", FrameInfo("Frame",SRC_POS));
00237 ofs->updateNext();
00238 }
00239
00240 Image< PixRGB<byte> > debugImg(*forwardVision->getDebugImagePtr());
00241
00242 if(debugGoThroughGate)
00243 {
00244
00245 if(movementController->dive(movementController->setDiveValue.getVal(),
00246 true,
00247 movementController->setTimeout.getVal()))
00248 {
00249 movementController->goStraight(movementController->setSpeedValue.getVal(),
00250 movementController->setGoStraightTimeValue.getVal());
00251 }
00252
00253 }
00254 else if(debugGoForwardTurnAround)
00255 {
00256
00257
00258
00259 if(1)
00260 {
00261 movementController->goStraight(movementController->setSpeedValue.getVal(), 0);
00262
00263
00264
00265
00266
00267
00268 Point2D<int> buoyLoc = forwardVision->lookForBuoy(fImg);
00269 int xerr = (buoyLoc.i-(320/2));
00270
00271
00272 ofs->writeRGB(debugImg, "DebugCam", FrameInfo("Frame",SRC_POS));
00273 ofs->updateNext();
00274
00275 movementController->setHeading(xerr,
00276 true,
00277 movementController->setTimeout.getVal());
00278
00279 }
00280
00281 }
00282 else if(debugPipeFollowing)
00283 {
00284 Image< PixRGB<byte> > img = subController->getImage(2);
00285 if(img.initialized())
00286 {
00287 ofs->writeRGB(img, "DownwardCam", FrameInfo("Frame",SRC_POS));
00288 ofs->updateNext();
00289 }
00290
00291 Point2D<int> clickLoc = getClick(ofs, "DownwardCam");
00292 Point2D<int> center(320/2, 240/2);
00293
00294 if(clickLoc.isValid())
00295 {
00296 LINFO("Tracking point: %i, %i",clickLoc.i, clickLoc.j);
00297 movementController->trackPipe(clickLoc, center);
00298 }
00299 }
00300 }
00301 else
00302 {
00303 Image< PixRGB<byte> > img = subController->getImage(1);
00304 if(img.initialized())
00305 {
00306 ofs->writeRGB(img, "ForwardCam", FrameInfo("Frame",SRC_POS));
00307 ofs->updateNext();
00308 }
00309
00310 img = subController->getImage(2);
00311 if(img.initialized())
00312 {
00313 ofs->writeRGB(img, "DownwardCam", FrameInfo("Frame",SRC_POS));
00314 ofs->updateNext();
00315 }
00316 }
00317
00318 fnum++;
00319 }
00320
00321
00322 manager.stop();
00323 return 0;
00324 }
00325
00326
00327
00328
00329
00330
00331