VisionBrainComponentI.C
00001 #include "Robots/SeaBeeIII/VisionBrainComponentI.H"
00002 #include "Component/ModelParam.H"
00003 #include "Component/ModelOptionDef.H"
00004
00005 #ifndef VISIONBRAINCOMPONENTI_C
00006 #define VISIONBRAINCOMPONENTI_C
00007
00008 const ModelOptionCateg MOC_VisionBrainComponent = {
00009 MOC_SORTPRI_3, "VisionBrainComponent Related Options" };
00010
00011 const ModelOptionDef OPT_CameraSource =
00012 { MODOPT_ARG(std::string), "CameraSource", &MOC_VisionBrainComponent, OPTEXP_CORE,
00013 "The string description to be matched against incoming Retina messages\n"
00014 "when using Ice as an input source",
00015 "camera-source", '\0', "<string>", "Camera0" };
00016
00017
00018 VisionBrainComponentI::VisionBrainComponentI(OptionManager& mgr,
00019 const std::string& descrName, const std::string& tagName) :
00020 RobotBrainComponent(mgr, descrName, tagName),
00021 itsOfs(new OutputFrameSeries(mgr)),
00022 itsFrameCount(0),
00023 itsCameraSource(&OPT_CameraSource, this, 0),
00024 itsCurrentImgFwdCam(false),
00025 lastFrameCount(-1)
00026 {
00027
00028 addSubComponent(itsOfs);
00029 }
00030
00031
00032 VisionBrainComponentI::~VisionBrainComponentI()
00033 {
00034 }
00035
00036 void VisionBrainComponentI::registerVisionTopics()
00037 {
00038 LINFO("Registering VisionBrainComponent Message");
00039 this->registerSubscription("RetinaMessageTopic");
00040 }
00041
00042 void VisionBrainComponentI::registerVisionPublisher(const std::string& MessageTopic)
00043 {
00044 this->registerPublisher(MessageTopic);
00045 registerVisionTopics();
00046 }
00047
00048 bool VisionBrainComponentI::publishVisionMsg(const::std::string& MessageTopic, RobotSimEvents::EventMessagePtr msg)
00049 {
00050 return this->publish(MessageTopic,msg);
00051 }
00052
00053 void VisionBrainComponentI::evolve()
00054 {
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 itsImgMutex.lock();
00075 {
00076 if(itsCurrentImg.initialized() && itsFrameCount != lastFrameCount)
00077 {
00078 lastFrameCount = itsFrameCount;
00079 updateFrame(itsCurrentImg, itsCurrentCameraID);
00080 }
00081 }
00082 itsImgMutex.unlock();
00083
00084 }
00085
00086
00087 void VisionBrainComponentI::updateMessage(const RobotSimEvents::EventMessagePtr& eMsg,
00088 const Ice::Current&)
00089 {
00090
00091 if(eMsg->ice_isA("::RobotSimEvents::RetinaMessage"))
00092 {
00093 RobotSimEvents::RetinaMessagePtr retinaMessage = RobotSimEvents::RetinaMessagePtr::dynamicCast(eMsg);
00094 itsImgMutex.lock();
00095 if(retinaMessage->cameraID == itsCameraSource.getVal() || itsCameraSource.getVal() == "all")
00096 {
00097 Image<PixRGB<byte> > retinaImage = Ice2Image<PixRGB<byte> >(retinaMessage->img);
00098 itsCurrentImg = retinaImage;
00099 itsCurrentCameraID = retinaMessage->cameraID;
00100
00101 if(retinaMessage->cameraID == "FwdCamera")
00102 itsCurrentImgFwdCam = true;
00103 else
00104 itsCurrentImgFwdCam = false;
00105
00106 itsFrameCount++;
00107
00108
00109 }
00110
00111
00112 itsImgMutex.unlock();
00113 }
00114 }
00115
00116 #endif