test-SeaBee3Simulator.C

00001 #include "Component/ModelManager.H"
00002 #include "Component/ModelComponent.H"
00003 #include "Component/ModelOptionDef.H"
00004 #include "Robots/SeaBeeIII/SeaBee3Simulator.H"
00005 #include <Ice/Ice.h>
00006 #include <Ice/Service.h>
00007 #include "Ice/RobotSimEvents.ice.H"
00008 #include "Ice/RobotBrainObjects.ice.H"
00009 #include "Ice/SimEventsUtils.H"
00010 #include "Ice/IceImageUtils.H"
00011 #include "Image/MatrixOps.H"
00012 #include "Media/FrameSeries.H"
00013 
00014 
00015 
00016 void handle_keys(nub::soft_ref<OutputFrameSeries> ofs, nub::soft_ref<SeaBee3Simulator> subSim)
00017 {
00018     //handle keyboard input
00019     const nub::soft_ref<ImageDisplayStream> ids =
00020       ofs->findFrameDestType<ImageDisplayStream>();
00021 
00022     const rutz::shared_ptr<XWinManaged> uiwin =
00023       ids.is_valid()
00024       ? ids->getWindow("subSim")
00025       : rutz::shared_ptr<XWinManaged>();
00026 
00027     int key = uiwin->getLastKeyPress();
00028     if (key != -1)
00029     {
00030       float yaw = 0;
00031       float forward = 0;
00032       float up = 0;
00033 
00034       switch(key)
00035       {
00036         case 8: //mac 8
00037         case 38: up = -100.0; break; //a
00038         case 14: //mac z
00039         case 52: up =  100.0; break; //z
00040         case 43: //mac p
00041         case 33: yaw = 100.0; break; //p
00042         case 39: //mac o
00043         case 32: yaw = -100.0; break; //o
00044         case 10: //mac d
00045         case 40: forward = 100.0; break; //d
00046         case 16: //mac c
00047         case 54: forward = -100.0; break; //c
00048         case 65: //space bar : stop
00049                  yaw = 0;
00050                  forward = 0;
00051                  up = 0;
00052                  break; // space
00053         case 20: //mac q
00054         case 24: //q
00055                  exit(0);
00056                  break;
00057       }
00058 
00059       float forwardLeftThruster = forward;
00060       float forwardRightThruster = forward;
00061       float verticalLeftThruster = up;
00062       float verticalRightThruster = up;
00063       float forwardStrafeThruster = yaw;
00064       float backStrafeThruster = -yaw;
00065 
00066       subSim->setThrusters(forwardLeftThruster, forwardRightThruster, verticalLeftThruster, verticalRightThruster,
00067           forwardStrafeThruster, backStrafeThruster);
00068 
00069       LINFO("Key is %i\n", key);
00070     }
00071 }
00072 
00073 
00074 class RobotBrainServiceService : public Ice::Service {
00075 protected:
00076   virtual bool start(int, char* argv[]);
00077   virtual bool stop() {
00078     if (itsMgr)
00079       delete itsMgr;
00080     return true;
00081   }
00082 
00083 private:
00084   Ice::ObjectAdapterPtr itsAdapter;
00085   ModelManager *itsMgr;
00086 };
00087 
00088 bool RobotBrainServiceService::start(int argc, char* argv[])
00089 {
00090   char adapterStr[255];
00091 
00092   //Create the adapter
00093   int port = RobotBrainObjects::RobotBrainPort;
00094   bool connected = false;
00095 
00096   while(!connected)
00097     {
00098       try
00099         {
00100           LINFO("Trying Port:%d", port);
00101           sprintf(adapterStr, "default -p %i", port);
00102           itsAdapter = communicator()->createObjectAdapterWithEndpoints("SeaBee3SimulatorAdapter",
00103                                                                         adapterStr);
00104           connected = true;
00105         }
00106       catch(Ice::SocketException)
00107         {
00108           port++;
00109         }
00110     }
00111 
00112   //Create the manager and its objects
00113   itsMgr = new ModelManager("SeaBee3SimulatorServiceManager");
00114 
00115   nub::ref<OutputFrameSeries> ofs(new OutputFrameSeries(*itsMgr));
00116   itsMgr->addSubComponent(ofs);
00117 
00118 
00119   LINFO("Starting SeaBee3 Simulator");
00120   nub::ref<SeaBee3Simulator> subSim(new SeaBee3Simulator(*itsMgr, "SeaBee3Simulator", "SeaBee3Simulator"));
00121   itsMgr->addSubComponent(subSim);
00122   subSim->init(communicator(), itsAdapter);
00123 
00124   itsMgr->parseCommandLine((const int)argc, (const char**)argv, "", 0, 0);
00125 
00126   itsAdapter->activate();
00127 
00128   itsMgr->start();
00129 
00130   while(1){
00131     Layout<PixRGB<byte> > outDisp;
00132 
00133     subSim->simLoop();
00134     Image<PixRGB<byte> > forwardCam = flipVertic(subSim->getFrame(1));
00135     Image<PixRGB<byte> > downwardCam = flipVertic(subSim->getFrame(2));
00136 
00137     outDisp = vcat(outDisp, hcat(forwardCam, downwardCam));
00138 
00139     ofs->writeRgbLayout(outDisp, "subSim", FrameInfo("subSim", SRC_POS));
00140 
00141     handle_keys(ofs, subSim);
00142   }
00143 
00144 
00145   return true;
00146 }
00147 
00148 // ######################################################################
00149 int main(int argc, char** argv) {
00150 
00151   RobotBrainServiceService svc;
00152   return svc.main(argc, argv);
00153 }
00154 
00155 
00156 
Generated on Sun May 8 08:42:07 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3