자체 ALMemory 이벤트 만들기

소개


  • 스스로 써 두고 있습니다만, 아직 푹신한 이해이기 때문에, 타이틀은 이것으로 괜찮을까? 그리고 불안합니다.
  • 급히, ALMemory의 이벤트에 관해, 시도해 본 내용을 기록해 봅니다.

  • 각 도구의 버전




    도구
    버전


    C++ SDK
    naoqi-sdk-2.0.5.3

    파이썬 SDK
    pynaoqi-python2.7-2.0.5.3

    Choregraphe
    2.1.2.17


    자체 ALMemory 이벤트 만들기



    모듈 만들기


    $ qisrc create HelloEventModule
    

    코드 수정



    helloevent.h



    helloevent.h
    #ifndef HELLO_EVENT_H
    #define HELLO_EVENT_H
    
    #define BOOST_SIGNALS_NO_DEPRECATION_WARNING
    
    #include <boost/shared_ptr.hpp>
    #include <alcommon/almodule.h>
    #include <alproxies/almemoryproxy.h>
    
    namespace AL
    {
      class ALBroker;
    }
    
    class HelloEvent : public AL::ALModule
    {
     public:
      HelloEvent(boost::shared_ptr<AL::ALBroker> broker, const std::string& name);
      virtual ~HelloEvent();
    
      virtual void init();
    
      void callback(const std::string &key, const AL::ALValue &value, const AL::ALValue &msg);
    
     private:
      AL::ALMemoryProxy fMemoryProxy;
    };
    
    #endif // HELLO_EVENT_H
    

    helloevent.cpp



    helloevent.cpp
    #include "helloevent.h"
    
    #include <alvalue/alvalue.h>
    #include <alcommon/alproxy.h>
    #include <alcommon/albroker.h>
    #include <qi/log.hpp>
    
    HelloEvent::HelloEvent(boost::shared_ptr<AL::ALBroker> broker, const std::string& name):
      AL::ALModule(broker, name), fMemoryProxy(getParentBroker())
    {
      setModuleDescription("");
    
      functionName("callback", getName(), "callback");
      BIND_METHOD(HelloEvent::callback);
    }
    
    HelloEvent::~HelloEvent()
    {
      fMemoryProxy.unsubscribeToEvent("HelloEvent", "HelloEvent");
      fMemoryProxy.unsubscribeToMicroEvent("HelloMicroEvent", "HelloEvent");
    }
    
    void HelloEvent::init()
    {
      fMemoryProxy.subscribeToEvent("HelloEvent", "HelloEventModule", "callback");
      fMemoryProxy.subscribeToMicroEvent("HelloMicroEvent", "HelloEventModule", "subscribe message", "callback");
    }
    
    void HelloEvent::callback(const std::string &key, const AL::ALValue &value, const AL::ALValue &msg)
    {
      qiLogInfo("HelloEvent") << "Callback:" << key << std::endl;
      qiLogInfo("HelloEvent") << "Value   :" << value << std::endl;
      qiLogInfo("HelloEvent") << "Msg     :" << msg << std::endl;
    }
    

    main.cpp



    main.cpp
    #include "helloevent.h"
    #include <boost/shared_ptr.hpp>
    #include <alcommon/albroker.h>
    #include <alcommon/almodule.h>
    #include <alcommon/albrokermanager.h>
    
    extern "C"
    {
      int _createModule(boost::shared_ptr<AL::ALBroker> pBroker)
      {
        AL::ALBrokerManager::setInstance(pBroker->fBrokerManager.lock());
        AL::ALBrokerManager::getInstance()->addBroker(pBroker);
    
        AL::ALModule::createModule<HelloEvent>(pBroker, "HelloEventModule");
    
        return 0;
      }
    
      int _closeModule()
      {
        return 0;
      }
    }
    

    CMakeLists.txt
    cmake_minimum_required(VERSION 2.8)
    project(HelloEventModule)
    
    find_package(qibuild)
    
    set(CMAKE_CXX_FLAGS "-stdlib=libstdc++")
    
    set(_srcs
      main.cpp
      helloevent.h
      helloevent.cpp
    )
    
    qi_create_lib(HelloEventModule SHARED ${_srcs} SUBFOLDER naoqi)
    
    qi_use_lib(HelloEventModule ALCOMMON ALPROXIES)
    

    configure & make


    $ qibuild configure -c mytoolchain
    $ qibuild make -c mytoolchain
    

    모듈 설치


    $ export NAOQI_RUNTIME=/path/to/Choregraphe.app/Contents/Resources
    
    $ vi $NAOQI_RUNTIME/etc/naoqi/autoload.ini
    $ tail $NAOQI_RUNTIME/etc/naoqi/autoload.ini
    alvisualcompass
    allocalization
    alpanoramacompass
    
    autonomouslife
    
    dialog
    
    HelloEventModule
    
    $ cp -p build-mytoolchain/sdk/lib/naoqi/libHelloEventModule.dylib $NAOQI_RUNTIME/lib/naoqi/
    

    동작 확인



    Choregraphe에서 이벤트를받는 부분 만들기



    먼저 다이어그램 상자를 만듭니다.



    상자에 들어가서 "ALMemory에서 이벤트 추가"를 누르고 "HelloEvent""HelloMicroEvent"를 체크하여 추가합니다.



    로그 상자를 배치하고 추가한 이벤트에서 연결합니다.



    Python에서 이벤트 게시


    $ /usr/bin/python
    Python 2.7.6 (default, Sep  9 2014, 15:04:36)
    [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    
    >>> from naoqi import ALProxy
    
    >>> m = ALProxy("ALMemory", "localhost", 59350)
    [I] 3343 qi.eventloop: Creating event loop while no qi::Application() is running
    [I] 3343 qimessaging.session: Session listener created on tcp://0.0.0.0:0
    [I] 3343 qimessaging.transportserver: TransportServer will listen on: tcp://192.168.1.6:59389
    [I] 3343 qimessaging.transportserver: TransportServer will listen on: tcp://127.0.0.1:59389
    
    >>> m.raiseEvent("HelloEvent", "test")
    >>> m.raiseEvent("HelloMicroEvent", "test2")
    

    결과 확인



    모듈 내에서 나온 로그와 로그 상자의 로그가 로그 뷰어에 표시되었습니다.



    감상


  • 장기적으로 썼습니다만, 하고 있는 것은 「Subscribe to Event」 「Raise Event」박스를 조합해 할 수 있는 내용인가라고 생각합니다.
  • Event와 MicroEvent의 차이를 잘 모르겠습니다.
  • 좋은 웹페이지 즐겨찾기