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

소개



  • NAOqi (ver1 계) 용 독자 모듈의 작성 의 계속입니다.
  • 알데바란 아틀리에 아키하바라에서 NAOqi ver2계의 SDK 를 카피 했으므로, 다시 Choregraphe 의 가상 로봇으로 동작을 확인해 보았습니다.
  • SDK, Choregraphe 등의 버전은 다음과 같습니다.



  • 도구
    버전


    C++ SDK
    naoqi-sdk-2.0.5.3

    C++ SDK (cross toolchain)
    mac64-atom-pub-v2.0.5.4

    파이썬 SDK
    pynaoqi-python2.7-2.0.5.3

    Choregraphe
    2.1.2.17


    모듈 만들기



    절차는 NAOqi (ver1 계) 용 독자 모듈의 작성과 동일합니다.

    약간, 코드를 수정했으므로, 수정 부분만 이하에 씁니다.

    코드 수정



    helloworld.h



    make 했을 때, 이하의 에러가 나왔습니다.
    $ qibuild make -c mytoolchain
    
    ...
    
    /path/to/sdk/include/boost/signal.hpp:17:4: warning: "Boost.Signals is no
          longer being maintained and is now deprecated. Please switch to Boost.Signals2. To disable
          this warning message, define BOOST_SIGNALS_NO_DEPRECATION_WARNING." [-W#warnings]
    #  warning                  "Boost.Signals is no longer being maintained and is now deprecat...
       ^
    
    ...
    

    메시지와 같이 BOOST_SIGNALS_NO_DEPRECATION_WARNING을 정의했습니다.

    helloworld.h
    $ head helloworld.h
    
    #ifndef HELLOWORLD_H
    #define HELLOWORLD_H
    
    #define BOOST_SIGNALS_NO_DEPRECATION_WARNING
    
    #include <boost/shared_ptr.hpp>
    #include <alcommon/almodule.h>
    
    ...
    

    helloworld.cpp



    이 파일에서도 다른 #include 보다 먼저 BOOST_SIGNALS_NO_DEPRECATION_WARNING 가 정의되고 있는 것이 좋을 것 같기 때문에, #include "helloworld.h"(을)를 최초로 이동했습니다.

    helloworld.cpp
    #include "helloworld.h"
    #include <iostream>
    #include <alcommon/albroker.h>
    #include <alproxies/altexttospeechproxy.h>
    
    ...
    

    CMakeLists.txt



    make 했을 때, 이하의 에러가 나왔습니다.
    $ qibuild make -c mytoolchain
    
    ...
    
    Linking CXX shared library sdk/lib/naoqi/libHelloWorldModule.dylib
    Undefined symbols for architecture x86_64:
      "AL::ALTextToSpeechProxy::say(std::string const&)", referenced from:
          HelloWorld::sayHello() in helloworld.cpp.o
      "AL::ALTextToSpeechProxy::ALTextToSpeechProxy(boost::shared_ptr<AL::ALBroker>)", referenced from:
          HelloWorld::sayHello() in helloworld.cpp.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    make[2]: *** [sdk/lib/naoqi/libHelloWorldModule.dylib] Error 1
    make[1]: *** [CMakeFiles/HelloWorldModule.dir/all] Error 2
    make: *** [all] Error 2
    [ERROR]:  BuildFailed Error occurred when building project HelloWorldModule
    

    링크시의 Undefined symbols이므로, 라이브러리 패스에 관한 문제일까, 라고 코드나 환경 변수를 바꾸어 여러가지 시험해 보았습니다만, 최종적으로는 이하의 수정이 되었습니다.

    qi_use_lib 행에 ALPROXIES를 추가했습니다. (문서의 샘플 코드에 이런 설명이 있었던 것을 기억했습니다)

    CMakeLists.txt
    ...
    
    qi_use_lib(HelloWorldModule ALCOMMON ALPROXIES)
    

    가상 로봇에 모듈 설치



    설치 대상 경로 정보



    이번 확인은 Choregraphe의 가상 로봇에서 실시합니다.
    export NAOQI_RUNTIME=/path/to/Choregraphe.app/Contents/Resources
    

    모듈 설치(복사) 및 autoload.txt 수정은 이전과 동일합니다.

    동작 확인



    Choregraphe 시작



    로그 뷰어의 표시 레벨을 변경해도 모듈의 로드 상황은 표시되지 않는 것 같습니다.

    연결 포트 확인



    편집 > 설정 > 가상 로봇(탭)

    포트 60736에서 작동 중 번호를 확인하십시오.

    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", 60736)
    [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://10.168.19.164:60743
    [I] 3343 qimessaging.transportserver: TransportServer will listen on: tcp://127.0.0.1:60743
    [I] 3343 qimessaging.transportserver: TransportServer will listen on: tcp://10.211.55.2:60743
    [I] 3343 qimessaging.transportserver: TransportServer will listen on: tcp://10.37.129.2:60743
    
    >>> hwm.sayHello()
    

    sayHello 메소드 실행 후, 가상 Pepper 군이 「HelloWorld」라고 말했습니다.



    Choregraphe의 Python Script 상자에서 실행



    그런 다음 Choregraphe에서 작성한 모듈을 사용해보십시오.
    Python Script 상자를 배치하고 코드를 작성하고 실행합니다. 위와 마찬가지로 가상 Pepper 군이 말합니다.



    감상


  • 표준 출력에 낸 문자열은 Choregraphe 의 로그 뷰어에 표시되지 않기 때문에, 로거의 오브젝트 경유로 출력하는 것 같은 느낌이 됩니까? 그러고 보면, 샘플 코드로 그런 것을 본 것도 생각합니다.
  • 모야 모야하고 있던 점이 여러가지 해결했기 때문에, 꽤 깨끗했습니다.
  • 좋은 웹페이지 즐겨찾기