PluginImageCapturer.cpp
Go to the documentation of this file.
00001 /*********************************************************************
00002  * Software License Agreement (BSD License)
00003  *
00004  *  Copyright (c) 2013, Institute for Artificial Intelligence,
00005  *  Universität Bremen.
00006  *  All rights reserved.
00007  *
00008  *  Redistribution and use in source and binary forms, with or without
00009  *  modification, are permitted provided that the following conditions
00010  *  are met:
00011  *
00012  *   * Redistributions of source code must retain the above copyright
00013  *     notice, this list of conditions and the following disclaimer.
00014  *   * Redistributions in binary form must reproduce the above
00015  *     copyright notice, this list of conditions and the following
00016  *     disclaimer in the documentation and/or other materials provided
00017  *     with the distribution.
00018  *   * Neither the name of the Institute for Artificial Intelligence,
00019  *     Universität Bremen, nor the names of its contributors may be
00020  *     used to endorse or promote products derived from this software
00021  *     without specific prior written permission.
00022  *
00023  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00024  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00025  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00026  *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00027  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00028  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00029  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00030  *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00031  *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00032  *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00033  *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00034  *  POSSIBILITY OF SUCH DAMAGE.
00035  *********************************************************************/
00036 
00040 #include <plugins/imagecapturer/PluginImageCapturer.h>
00041 
00042 
00043 namespace beliefstate {
00044   namespace plugins {
00045     PLUGIN_CLASS::PLUGIN_CLASS() {
00046       m_icapImageCapturer = NULL;
00047       
00048       this->addDependency("ros");
00049       this->setPluginVersion("0.2");
00050     }
00051     
00052     PLUGIN_CLASS::~PLUGIN_CLASS() {
00053     }
00054     
00055     Result PLUGIN_CLASS::init(int argc, char** argv) {
00056       Result resInit = defaultResult();
00057       
00058       m_icapImageCapturer = new CImageCapturer();
00059       m_icapImageCapturer->publishImages("/logged_images");
00060       this->setSubscribedToEvent("add-image-from-topic", true);
00061       
00062       return resInit;
00063     }
00064     
00065     Result PLUGIN_CLASS::deinit() {
00066       if(m_icapImageCapturer) {
00067         delete m_icapImageCapturer;
00068       }
00069       
00070       return defaultResult();
00071     }
00072     
00073     Result PLUGIN_CLASS::cycle() {
00074       Result resCycle = defaultResult();
00075       this->deployCycleData(resCycle);
00076       
00077       return resCycle;
00078     }
00079     
00080     void PLUGIN_CLASS::consumeEvent(Event evEvent) {
00081       if(evEvent.strEventName == "add-image-from-topic") {
00082         if(evEvent.cdDesignator) {
00083           std::string strTopic = evEvent.cdDesignator->stringValue("origin");
00084           std::string strFilename = evEvent.cdDesignator->stringValue("filename");
00085           
00086           if(strTopic != "") {
00087             if(strFilename == "") {
00088               strFilename = strTopic;
00089               replace(strFilename.begin(), strFilename.end(), '/', '_');
00090               strFilename += ".jpg";
00091             }
00092             
00093             ConfigSettings cfgsetCurrent = configSettings();
00094             
00095             if(m_icapImageCapturer->captureFromTopic(strTopic, strFilename, cfgsetCurrent.strExperimentDirectory)) {
00096               std::string strFilepath = cfgsetCurrent.strExperimentDirectory + strFilename;
00097               this->info("Wrote image from topic '" + strTopic + "' to file '" + strFilepath + "'");
00098               
00099               Event evImage = eventInResponseTo(evEvent, "add-image-from-file");
00100               evImage.cdDesignator = new CDesignator();
00101               evImage.cdDesignator->setType(ACTION);
00102               evImage.cdDesignator->setValue("origin", strTopic);
00103               // NOTE(winkler): We just use the filename here, not the
00104               // global filepath. This is due to the fact that all
00105               // images are stored relative to the generated .owl file
00106               // (i.e. in the same directory). When moving all files
00107               // somewhere else, global paths would make finding of
00108               // files very difficult.
00109               evImage.nOpenRequestID = evEvent.nOpenRequestID;
00110               evImage.cdDesignator->setValue("filename", strFilename);
00111               
00112               m_mtxEventsStore.lock();
00113               m_lstEvents.push_back(evImage);
00114               m_mtxEventsStore.unlock();
00115             } else {
00116               this->warn("Failed to capture image from topic '" + strTopic + "' and write it to '" + cfgsetCurrent.strExperimentDirectory + strFilename + "'.");
00117               
00118               Event evImage = eventInResponseTo(evEvent);
00119               
00120               m_mtxEventsStore.lock();
00121               m_lstEvents.push_back(evImage);
00122               m_mtxEventsStore.unlock();
00123             }
00124           } else {
00125             this->warn("No topic was given when requesting to capture an image from a topic.");
00126           }
00127         }
00128       }
00129     }
00130   }
00131   
00132   extern "C" plugins::PLUGIN_CLASS* createInstance() {
00133     return new plugins::PLUGIN_CLASS();
00134   }
00135   
00136   extern "C" void destroyInstance(plugins::PLUGIN_CLASS* icDestroy) {
00137     delete icDestroy;
00138   }
00139 }


beliefstate
Author(s): Jan Winkler
autogenerated on Sun Oct 5 2014 22:30:15