00001 #ifndef ICECOMMUNICATOR_C 00002 #define ICECOMMUNICATOR_C 00003 00004 #include "QtUtil/ImageConvert4.H" 00005 #include "Robots/SeaBeeIII/GUI/IceCommunicator.qt.H" 00006 #include "Ice/ImageIce.ice.H" 00007 #include "Ice/IceImageUtils.H" 00008 00009 00010 #define MSG_BUFF_MAX 5 00011 00012 IceCommunicator::IceCommunicator(OptionManager& mgr, 00013 const std::string& descrName, 00014 const std::string& tagName) : 00015 RobotBrainComponent(mgr, descrName, tagName) 00016 // itsGUIRegistered(false), 00017 // itsFwdRetinaImagesSize(0), 00018 // itsFwdRetinaMsgCounter(0), 00019 // itsDwnRetinaImagesSize(0), 00020 // itsDwnRetinaMsgCounter(0), 00021 // itsOrangeSegEnabled(false), 00022 // itsRedSegImagesSize(0), 00023 // itsSalientPointsSize(0), 00024 // itsSalientPointsEnabled(false), 00025 // itsVisionMsgCounter(0), 00026 // itsBeeStemDataSize(0), 00027 // itsBeeStemMsgCounter(0), 00028 // itsCompassMeter(140,130), 00029 // itsDepthMeter(140,130), 00030 // itsPressureMeter(100,90), 00031 // itsCircleFillMeter(60,50,20) 00032 { 00033 // itsTimer.reset(); 00034 // itsFwdVisionImage = Image<PixRGB<byte> >(); 00035 // itsDwnVisionImage = Image<PixRGB<byte> >(); 00036 } 00037 00038 void IceCommunicator::registerTopics() 00039 { 00040 registerSubscription("BeeStemMessageTopic"); 00041 registerSubscription("XBox360RemoteControlMessageTopic"); 00042 registerSubscription("RetinaMessageTopic"); 00043 registerSubscription("VisionRectangleMessageTopic"); 00044 registerSubscription("SalientPointMessageTopic"); 00045 registerSubscription("MovementControllerMessageTopic"); 00046 registerPublisher("CameraConfigTopic"); 00047 registerPublisher("BeeStemConfigTopic"); 00048 registerPublisher("SeaBeeStateConditionMessageTopic"); 00049 } 00050 00051 void IceCommunicator::evolve() 00052 { 00053 /* 00054 itsUpdateMutex.lock(); 00055 if(itsGUIRegistered) 00056 { 00057 if(itsFwdRetinaImagesSize > 0) 00058 { 00059 updateFwdImg(); 00060 00061 if(itsOrangeSegImages.size() > 0 && itsOrangeSegEnabled) 00062 { 00063 Image<PixRGB<byte> > oj = itsOrangeSegImages.front(); 00064 00065 itsFwdVisionImage = oj; 00066 itsOrangeSegImages.pop_front(); 00067 } 00068 00069 if(itsSalientPoints.size() > 0 && itsSalientPointsEnabled) 00070 updateSaliencyImage(); 00071 00072 itsGUIForm->setFwdVisionImage(itsFwdVisionImage); 00073 00074 } 00075 if(itsDwnRetinaImagesSize > 0) 00076 { 00077 updateDwnImg(); 00078 00079 itsGUIForm->setDwnVisionImage(itsDwnVisionImage); 00080 } 00081 00082 if(itsBeeStemDataSize > 0) 00083 { 00084 updateBeeStemData(); 00085 } 00086 } 00087 00088 00089 if(itsTimer.getSecs() >= 1.0) 00090 { 00091 itsGUIForm->setFwdRetinaMsgField(itsFwdRetinaMsgCounter); 00092 itsGUIForm->setDwnRetinaMsgField(itsDwnRetinaMsgCounter); 00093 itsGUIForm->setBeeStemMsgField(itsBeeStemMsgCounter); 00094 itsGUIForm->setVisionMsgField(itsVisionMsgCounter); 00095 Image<PixRGB<byte> > headingAxis = itsCircleFillMeter.render(itsFwdRetinaMsgCounter); 00096 Image<PixRGB<byte> > depthAxis = itsCircleFillMeter.render(itsDwnRetinaMsgCounter); 00097 Image<PixRGB<byte> > strafeAxis = itsCircleFillMeter.render(itsBeeStemMsgCounter); 00098 itsGUIForm->setAxesImages(headingAxis,depthAxis,strafeAxis); 00099 00100 itsTimer.reset(); 00101 itsFwdRetinaMsgCounter = 0; 00102 itsDwnRetinaMsgCounter = 0; 00103 itsBeeStemMsgCounter = 0; 00104 itsVisionMsgCounter = 0; 00105 } 00106 itsUpdateMutex.unlock(); 00107 */ 00108 } 00109 00110 /* 00111 // ###################################################################### 00112 void IceCommunicator::updateFwdImg() 00113 { 00114 Image<PixRGB<byte> > img = itsFwdRetinaImages.front(); 00115 itsGUIForm->setFwdImage(img); 00116 00117 itsFwdVisionImage = img; 00118 00119 itsFwdRetinaImages.pop_front(); 00120 itsFwdRetinaImagesSize--; 00121 } 00122 00123 // ###################################################################### 00124 void IceCommunicator::updateDwnImg() 00125 { 00126 Image<PixRGB<byte> > img = itsDwnRetinaImages.front(); 00127 itsGUIForm->setDwnImage(img); 00128 itsDwnVisionImage = img; 00129 00130 itsDwnRetinaImages.pop_front(); 00131 itsDwnRetinaImagesSize--; 00132 } 00133 00134 // ###################################################################### 00135 void IceCommunicator::updateSaliencyImage() 00136 { 00137 Point2D<int> pt = itsSalientPoints.front(); 00138 00139 // drawTraj(itsFwdVisionImage, 00140 //&(itsSalientPoints[0]),&(itsSalientPoints[2])); 00141 00142 // LINFO("Point %d, %d\n",pt.i,pt.j); 00143 PixRGB<byte> color(0,0,0); 00144 drawCircle(itsFwdVisionImage, pt, 10, PixRGB<byte>(0,150,0), 1); 00145 drawCircle(itsFwdVisionImage, pt, 13, PixRGB<byte>(0,100,0), 1); 00146 drawCircle(itsFwdVisionImage, pt, 16, PixRGB<byte>(0,50,0), 1); 00147 drawCircle(itsFwdVisionImage, pt, 19, PixRGB<byte>(0,0,0), 1); 00148 00149 00150 drawDisk(itsFwdVisionImage, pt, 7, PixRGB<byte>(0,0,0)); 00151 drawDisk(itsFwdVisionImage, pt, 4, PixRGB<byte>(0,255,0)); 00152 00153 itsSalientPoints.pop_front(); 00154 } 00155 00156 // ###################################################################### 00157 void IceCommunicator::updateBeeStemData() 00158 { 00159 BeeStemData d = itsBeeStemData.front(); 00160 00161 Image<PixRGB<byte> > compassImg = itsCompassMeter.render(d.heading); 00162 Image<PixRGB<byte> > depthImg = itsDepthMeter.render(d.externalPressure); 00163 Image<PixRGB<byte> > pressureImg = itsPressureMeter.render(d.internalPressure); 00164 00165 itsGUIForm->setCompassImage(compassImg); 00166 itsGUIForm->setDepthImage(depthImg); 00167 itsGUIForm->setPressureImage(pressureImg); 00168 itsGUIForm->setBeeStemData(d); 00169 00170 itsBeeStemData.pop_front(); 00171 itsBeeStemDataSize--; 00172 } 00173 00174 void IceCommunicator::setOrangeSegEnabled(bool enabled) 00175 { 00176 itsUpdateMutex.lock(); 00177 itsOrangeSegEnabled = enabled; 00178 itsUpdateMutex.unlock(); 00179 } 00180 00181 void IceCommunicator::setSalientPointsEnabled(bool enabled) 00182 { 00183 itsUpdateMutex.lock(); 00184 itsSalientPointsEnabled = enabled; 00185 itsUpdateMutex.unlock(); 00186 } 00187 */ 00188 00189 // ###################################################################### 00190 void IceCommunicator::updateMessage(const RobotSimEvents::EventMessagePtr& eMsg, 00191 const Ice::Current&) 00192 { 00193 00194 //Get a retina message 00195 if(eMsg->ice_isA("::RobotSimEvents::RetinaMessage")) 00196 { 00197 RobotSimEvents::RetinaMessagePtr msg = RobotSimEvents::RetinaMessagePtr::dynamicCast(eMsg); 00198 // LINFO("msg_id: %s",msg->cameraID.c_str()); 00199 00200 if(Ice2Image<PixRGB<byte> >(msg->img).initialized()) 00201 { 00202 Image<PixRGB<byte> > retinaImage = Ice2Image<PixRGB<byte> >(msg->img); 00203 QImage qretinaImage = convertToQImage4(retinaImage); 00204 00205 if(msg->cameraID == "FwdCamera") 00206 { 00207 LINFO("Forward Camera Message"); 00208 emit(NewFwdLeftImg(qretinaImage)); 00209 } 00210 else if(msg->cameraID == "DwnCamera") 00211 { 00212 00213 } 00214 } 00215 00216 } 00217 } 00218 #endif 00219