NAOqi (ver1 계) 용 독자 모듈의 작성

16446 단어 C++NAOqiPepper

소개


  • "ALTextToSpeech"등과 같은 최저한의 기능의 모듈을 작성해, 가상 로봇으로 동작 확인해 보았습니다.
  • SDK의 버전은 naoqi-sdk-1.14.5, 가상 로봇은 webots-for-nao-7.4.3이 되어 NAOqi ver1계가 대상입니다. Pepper 실기·최근의 Choregraphe 의 가상 로봇 등의 NAOqi ver2계의 환경에서는 움직이지 않는다고 생각됩니다.
  • 새로운 버전의 SDK 를 입수할 수 있으면, 재차 실기・Choregraphe 의 가상 로봇으로 확인하고 싶습니다.

  • 모듈 만들기



    병아리 생성


    $ qisrc create HelloWorldModule
    New project initialized in /path/to/project/HelloWorldModule
    
    $ cd HelloWorldModule
    

    코드 수정



    기본적으로는 문서의 Example: HelloWorld module 과 같습니다만, 원의 샘플로부터 (급하게는) 불필요한 부분을 한층 더 깎은 것이 되어 있습니다.

    helloworld.cpp (새로 만들기)



    helloworld.cpp
    #include <iostream>
    #include <alcommon/albroker.h>
    #include <alproxies/altexttospeechproxy.h>
    #include "helloworld.h"
    
    using namespace AL;
    
    HelloWorld::HelloWorld(boost::shared_ptr<ALBroker> broker, const std::string& name):
      ALModule(broker, name)
    {
      setModuleDescription("HelloWorld module");
    
      functionName("sayHello", getName(), "Say hello to the world");
      BIND_METHOD(HelloWorld::sayHello);
    }
    
    HelloWorld::~HelloWorld()
    {
    }
    
    void HelloWorld::init()
    {
      std::cout << "HelloWorld: init" << std::endl;
    }
    
    void HelloWorld::sayHello()
    {
      const std::string phraseToSay("HelloWorld");
    
      std::cout << "HelloWorld: Saying hello to the console ..." << std::endl;
      std::cout << "HelloWorld: " << phraseToSay << std::endl;
      std::cout << "HelloWorld: Calling say method of ALTextToSpeech module ..." << std::endl;
    
      ALTextToSpeechProxy tts(getParentBroker());
      tts.say(phraseToSay);
    
      std::cout << "HelloWorld: Done!" << std::endl;
    }
    

    helloworld.h (새로 만들기)



    helloworld.h
    #ifndef HELLOWORLD_H
    #define HELLOWORLD_H
    
    #include <boost/shared_ptr.hpp>
    #include <alcommon/almodule.h>
    
    namespace AL
    {
      class ALBroker;
    }
    
    class HelloWorld : public AL::ALModule
    {
     public:
      HelloWorld(boost::shared_ptr<AL::ALBroker> pBroker, const std::string& pName);
      virtual ~HelloWorld();
    
      virtual void init();
    
      void sayHello();
    };
    
    #endif // HELLOWORLD_H
    

    main.cpp



    main.cpp
    #include <alcommon/albroker.h>
    #include <alcommon/albrokermanager.h>
    #include "helloworld.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<HelloWorld>(pBroker, "HelloWorldModule");
    
        return 0;
      }
    
      int _closeModule()
      {
        return 0;
      }
    }
    

    CMakeLists.txt



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

    configure & make


    $ qitoolchain create mytoolchain /path/to/sdk/toolchain.xml
    mytoolchain already exists, updating without removing
    Updating toolchain mytoolchain with feed: /path/to/sdk/toolchain.xml
    Now try using
      qibuild configure -c mytoolchain
      qibuild make -c mytoolchain
    
    $ qibuild configure -c mytoolchain
    Current build worktree: /path/to/project
    Using toolchain: mytoolchain
    Build type: Debug
    * (1/1) Configuring HelloWorldModule
    -- The C compiler identification is AppleClang 6.0.0.6000056
    -- The CXX compiler identification is AppleClang 6.0.0.6000056
    -- Check for working C compiler: /usr/bin/cc
    -- Check for working C compiler: /usr/bin/cc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Check for working CXX compiler: /usr/bin/c++
    -- Check for working CXX compiler: /usr/bin/c++ -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Using qibuild 3.7
    -- Library: HelloWorldModule
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /path/to/project/HelloWorldModule/build-mytoolchain
    
    $ qibuild make -c mytoolchain
    Current build worktree: /path/to/project
    Using toolchain: mytoolchain
    Build type: Debug
    * (1/1) Building HelloWorldModule
    Scanning dependencies of target HelloWorldModule
    [ 50%] Building CXX object CMakeFiles/HelloWorldModule.dir/helloworld.cpp.o
    [100%] Building CXX object CMakeFiles/HelloWorldModule.dir/main.cpp.o
    Linking CXX shared library sdk/lib/naoqi/libHelloWorldModule.dylib
    [100%] Built target HelloWorldModule
    

    libHelloWorldModule.dylib가 완료되었습니다.

    가상 로봇에 모듈 설치



    설치 대상 경로 정보



    처음 쓴 것처럼 이번 확인에는 Webots를 사용하므로 먼저 런타임 경로를 설정해 둡니다.
    export NAOQI_RUNTIME=/path/to/Webots for NAO/resources/projects/robots/nao/aldebaran/naoqi-runtime
    

    생성 된 모듈을 가상 컴퓨터 아래에 설치 (복사)


    $ ls -la build-mytoolchain/sdk/lib/naoqi/libHelloWorldModule.dylib
    -rwxr-xr-x  1 suna  staff  75288  1  6 03:25 build-mytoolchain/sdk/lib/naoqi/libHelloWorldModule.dylib
    
    $ cp -p build-mytoolchain/sdk/lib/naoqi/libHelloWorldModule.dylib "$NAOQI_RUNTIME/lib/naoqi/"
    

    autoload.txt 수정



    가상 로봇이 만든 모듈을 로드하도록 autoload.txt를 수정합니다.
    $ ls -la "$NAOQI_RUNTIME/etc/naoqi/autoload.ini"
    -rw-r--r--  1 suna  admin  267  1  6 03:29 /path/to/webots/resources/projects/robots/nao/aldebaran/naoqi-runtime/etc/naoqi/autoload.ini
    
    $ vi "$NAOQI_RUNTIME/etc/naoqi/autoload.ini"
    
    $ tail "$NAOQI_RUNTIME/etc/naoqi/autoload.ini"
    framemanager
    pythonbridge
    videoinput
    redballdetection
    behaviormanager
    memorywatcher
    alnavigationinterface
    navigation
    
    HelloWorldModule
    

    동작 확인



    Webots 시작



    작성한 모듈이 로드되어 초기화된 것 같습니다.



    ALProxy를 통해 모듈에 연결하여 메소드 실행


    $ /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
    
    >>> hwm = ALProxy("HelloWorldModule", "localhost", 9559)
    [INFO ] Starting ALNetwork
    [INFO ] NAOqi is listening on 127.0.0.1:54011
    
    >>> hwm.sayHello()
    

    sayHello 메소드 실행 후 Webots 콘솔에 여러가지가 표시되어 예상대로 움직이고 있는 것 같습니다.



    감상


  • 처음에 SDK로 할 수 있을 것의 이미지가 이 형태였습니다. 아직 HelloWorld입니다만, 드디어 여기까지 온 느낌.
  • Pepper 실제 기계에서는 .dylib가 아니라 .so를 만들지 않으면 안된다고 생각하기 때문에 make의 방법도 보지 않으면 안된다.
  • 좋은 웹페이지 즐겨찾기