Connect amazon alexa vocie and ROS using alexa skill, lambda, pubnub #1

제이콥입니다.

이 글은 아마존 에코 스피커와 로봇을 연결하여 여러 명령을 하기 위한 셋팅입니다.

이 글 관련으로 2편-3편 정도 시리즈를 생각하고 있습니다.

감사합니다.


목적

스마트 스피커와 로봇을 연결할 필요가 생겼다.

왜냐하면 음성 인식 관련 소프트웨어, 하드웨어를 모두 다 개발할 수 없기 때문이다.

집중할 부분에 집중하고 이미 잘하는 것은 활용하는게 현명한 것 같다.

예를 들어, 여러 마이크를 사용하여 노이즈를 없앤다거나, 어느 방향인지 파악하는 것, 음성인식

잘하는 기존 제품을 활용해본다.

이 글을 쓴 이유는

기존의 글들을 보고 그대로 해도 동작도 안하고 따라하기 어려웠다. (사용하는 라이브러리가 바뀜, UI가 바뀜)

다시해도 제대로 못할 것 같아서 정리를 하게 됐다.


시스템 구조

<출처 – https://www.hackster.io/grassjelly/autonomous-home-assistant-robot-fff43e>

기존에 아마존 알렉사와 로봇 사이에 연결한 수많은 예시들을 찾아봤다.


  • 로봇과 알렉사를 연결하는 수많은 예시가 있다.

    • 다 복잡하고 잘 안된다.

    • pubnub으로 하는게 깔끔한 편이다.

      • ip를 알 필요가 없다.

      • 고정 ip가 아니여도 된다.

      • 인터넷만 잡으면 된다.






그 중에 내가 선택한 시스템은 위에 그림이다.


간단히 설명하면


사용자가 Echo 스피커에서 무언가 말을 하고, 그 중에 일부 (내가 설정한 어떤 명령어들)는 AWS LAMBDA FUNCTION (서버)에서 처리한다.


처리된 데이터는 PubNub이라는 중간 브로커를 통해 로봇 시스템 (ROS)에 전달하게 된다.


각자 인터넷만 연결되어 있다면, 스피커에서 로봇으로 각각의 단계를 거쳐 원하는 명령을 내릴 수 있다.




Alexa skill setup


https://developer.amazon.com/alexa/console/ask? 에서 셋업하면 된다.


Interaction Model 작성하기



  • 어떤 명령을 받았을 때, 이 skill (프로그램)을 사용할지 결정한다.

  • 되게 재밌는게 Sample Utterances에 활용해서 비슷한 문장을 말해도 같은 Intent를 실행하게 된다.

    • 즉, 완전 똑같지 말하지 않더라도 원하는 Intent를 호출 할 수 있다.

    • type도 정할 수 있다.

    • My favorite color is {color_type}.





End point 설정



  • 처음할 때 햇갈렸다.

    • 동영상을 보도록 한다.



  • 이 모델에 대한 결과를 만들어 줄 서버가 필요하다.

  • 작성자는 이 서버를 lambd로 만들었다.

    • 이번에 이 시스템을 구현하기 위해서 처음 사용해봤다.

    • 예제를 보면서 하면 할만하다.

    • python, nodejs가 있다.





Skill ID – 이 스킬의 ID이다.


AWS Lambda ANR – 서버라고 생각하면 편하다. 서버의 ID다.



  • ANR은 Lambda 함수를 만들고 나서 그 함수 관리 페이지에서 볼 수 있다.

  • ANR에서도 skill ID를 입력해야하고, Skill에서도 ANR을 입력해야한다. 서로 입력해야함.


주의할 점



  • 항상 save와 build를 잘 하도록 한다.

  • ANR, skill ID 확인


테스트



  • Interaction Model과 ANR을 입력하면 Test를 할 수 있다.

  • Skill은 launch (시작), 서버에서 처리할 수 있는 명령, quit(종료)로 구성된다.

    • 이게 무슨말이냐면

    • Invocation으로 정한 키워드를 통해 alexa에게 나의 skill을 호출하라고 명령한다.

      • Invocation이 “conversation application”이라 가정하면

      • ex – alexa run “conversation application”라 말하면 된다.

      • 이 때 launchIntent가 실행된다.



    • 다음으로 설정한 intent들을 호출할 수 있다.

      • launch 한 후, intent에 대한 결과를 반환한다.



    • quit를 하면 실행했던 skill을 사용중지한다.





시뮬레이션에서 돌려본 결과이다.




Lambda


https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1#


참 괜찮은 서비스다.


하나의 실행 모듈을 돌릴 수 있다.


lambda를 통해, 각 intent에 대해 어떤 동작을 할지 결정할 수 있다.


코드 입력


코드 입력 유형 –> .zip 파일 업로드로 코드를 업데이트 하면된다.


nodejs로 할 경우, package.json에 종속성을 체크한다.


그리고 npm install 후에 그 폴더 자체를 압축해서 lambda로 보낸다.


로그 보기


로그가 보고싶을 땐, 모니터링에서 CloudWatch에서 로그 보기를 한다.


자세한 내용은 튜토리얼을 첨부한다.


https://github.com/alexa/skill-sample-nodejs-hello-world


힘들었던 것



  • 참고했던 링크들을 보면 라이브러리 버젼이 달랐었다.

  • 이제는 안 쓰는 함수들을 쓴다던가..

  • 그래서 링크들의 소스들은 참고만하고

  • hello-world 코드에다가 pubnub을 적용하였다.





PubNub


PubNub은 lambda와 로봇의 중간 브로커 역할을 한다.


로봇은 보통 고정 ip를 갖고 있지 않다.


그렇기 때문에 외부에서 로봇에 연결하기 위해서는


포트 포워딩을 통해 로봇 ip에 잘 찾아갈 수 있도록 해야한다. (아는게 이것밖에 없군요.)


Pubnub은 설정을 할 필요 없게 해주는 서비스다.


lambda에서 pubnub으로 데이터를 넘기면 pubnub이 알아서 로봇 쪽으로 보내준다.


반대도 마찬가지다.



PubNub Setting


https://admin.pubnub.com/에서 셋팅한다.




  1. Create new App.




  2. Create new keyset.



    1. publish key와 subscribe key는 lambda와 로봇 쪽 코드에서 필요하다.




  3. Debug console



    1. 디버그 콘솔 창에서 add client

    2. channel을 확인한다.

    3. channel 또한 lambda와 로봇쪽에서 필요하다.

    4. 같은 채널로 데이터를 주고받아야 한다.

    5. 주고 받기 위해서는 publish key와 subscribe key가 필요하다.







로봇 쪽 통신 코드


아래 코드를 참고했다.


https://www.pubnub.com/docs/python/data-streams-publish-and-subscribe





일단 셋팅 및 테스트는 완료했다.


실제 활용에 대해서는 다음 포스팅에서 적어보도록 하겠다.


셋팅을 하면서 작성한 코드도 깃헙에 올린다.


https://github.com/passionbull/alexa-ros-python-pubnub



참고한 링크



This page is synchronized from the post: ‘Connect amazon alexa vocie and ROS using alexa skill, lambda, pubnub #1’

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×