[ROS] Pan/Tilt Study #2 가제보 연동 및 MoveIt를 활용한 모터 제어

setup

  • sudo apt-get install ros-kinetic-franka-description
  • roslaunch moveit_setup_assistant setup_assistant.launch

execute

  • roslaunch gazebo_ros empty_world.launch paused:=true use_sim_time:=false gui:=true throttled:=false recording:=false debug:=true
  • rosrun gazebo_ros spawn_model -file pan_tilt.urdf -urdf -x 0 -y 0 -z 1 -model panda
  • roslaunch test_moveit demo.launch rviz_tutorial:=true

 

reference

http://docs.ros.org/kinetic/api/moveit_tutorials/html/doc/motion_planning_api/motion_planning_api_tutorial.html

 

 

[ROS] Pan/Tilt Study #1 URDF 정의 및 가제보 연동

URDF 정의

In run_head_urdf.launch
<!-- Robot description -->
<param name="robot_description" command="$(find xacro)/xacro.py

'$(find cam_pan_tilt)/robots/first_robot.xacro'" />

xacro.py는 xacro를 urdf로 변환한다.

In first_robot.xacro

body, head, materials를 각각 불러온다.

아주 관리하기 편하다.

In haed.urdf.xacro

head_1, head_2는 head 안에 정의되어있다.

자신의 링크, 그리고 부모 링크, 그리고 두 링크 사이의 조인트를 설정한다.

head에서 head_1, head_2, xtion 간의 joint를 설정했다.


가제보 연결 및 컨트롤러 셋팅

아직 안함.


실행 명령어

먼저, URDF랑 가제보 연결 셋팅 완료해야함

  • roslaunch cam_pan_tilt pan_tilt_gazebo_control.launch
  • rostopic pub /ex_urdf_pan_tilt/joint1_position_controller/command std_msgs/Float64 -- 0.5

회전을 했다.

 

 

로봇의 상태

  • rostopic echo /ex_urdf_pan_tilt/joint_states

sensor_msgs/JointState

두 조인트에 대한 position, velocity, effort를 출력한다.

 


참고링크

https://pinkwink.kr/1007

https://pinkwink.kr/1013

http://wiki.ros.org/Robots/TIAGo/Tutorials/motions/head_action


위치 제어 – 포지션 컨트롤러

rostopic pub /ex_urdf_pan_tilt/joint1_position_controller/command std_msgs/Float64 — 0.5

rostopic pub /ex_urdf_pan_tilt/joint2_position_controller/command std_msgs/Float64 — 0.5


[ROS] ros-control과 gazebo를 활용한 Pan/Tilt control

로봇팔이나 머리 등 엑츄에이터를 원하는 곳으로 제어하는 것은 어려운 일이다.

예를 들어, 로봇 팔로 사과를 잡는다고 한다.

사과를 잡기 위해, 로봇 팔의 손가락 (End effector)이 목표하는 위치로 가기 위해서는 팔의 관절 (Joint)들이 각도를 적절히 설정되야한다.

음.. 사람은 자연스럽게 되지만 로봇이 사과를 잡기 위해 관절들의 각도를 계산해야한다. 이것을 역기구학이라고 한다.

하지만 역기구학을 공부를 했다고 하더라도 코드로 작성하는 것은 어려우며, 자유도가 높아질 수록 더 어렵다.

코드를 잘 짠다고 하더라도 수식도 어렵다. 이럴 때는.. 기초적인 것을 이해하고 잘 만들어 논 것을 활용하면 된다.

바로 ros_control..

위의 사진은 공부를 하면서 만든 로봇 머리이다.

이미지에서 좌표를 선택하면, 로봇은 그 좌표를 중심이 되도록 로봇 머리를 움직인다.

공부한 것

1.모터 포지션 컨트롤

모터를 원하는 각도 (위치)로 제어하는 것을 의미한다.

그리고 실제 움직이는 로봇과 시각화 툴에서 그대로 보일수 있도록 한다.

아래 동영상은 joint angle을 수동으로 조작해보는 영상이다.


다음으로는 position control을 해야하는데..

여러 joint의 각도를 설정하여, 모터를 조작하는..

업데이트 예정


 

2.실제 모터컨트롤러 (micro controller)를 ros_control 모듈과 연동시켜, 상위레벨에서 제어하고자 한다. 

Pal robotics

스페인 회사이다.

내가 하고자 하는 것을 제대로 구현을 해놨다.

코드를 보면서 많은 공부가 됐다.

동영상 위치 <http://wiki.ros.org/Robots/TIAGo/Tutorials/motions/head_action>

  • roslaunch tiago_gazebo tiago_gazebo.launch robot:=titanium public_sim:=true world:=look_to_point
  • rosrun look_to_point look_to_point

이미지에서 좌표 찍은 곳을 바라본다.

카메라 z축이 초록색 직선 A와 일치하게 만든다.

Controller에서는 좌표를 받고,  직선을 만든 후, 직선과 카메라 z축이 일치하게 한다.

Controller는 카메라 z축과 직선 A를 일치시키기 위해, 역기구학 문제를 풀고 pan 과 tilt의 각도를 계산한다.

그리고 joint trajectory를 생성하여 모터를 제어한다.

최종적으로 아래와 같은 결과가 된다.


Perception에서는 좌표를 넘기는 역할을 한다.

감자칩에에서 음료수를 볼 수 있도록 x,y 좌표를 넘겨준다.

컨트롤러에서는 좌표를 카메라 축이 보게될 방향으로 변환, 그리고 제어를 한다.


하드웨어

실제 모터 컨트롤러는 아래와 같은 출력과 입력이 필요하다.

출력 : curr_vel, curr_effort, curr_pos

현재 속도, 파워, 위치를 업데이트한다.

입력 : cmd_pos

목표하는 위치(각도)를 입력 받는다.


ROS Control에 연결

추후 정리 예정


참고링크

https://pinkwink.kr/1007

https://pinkwink.kr/1013

Ros control

  • https://github.com/ros-controls/ros_control/wiki/hardware_interface
  • http://gazebosim.org/tutorials/?tut=ros_control
  • https://github.com/PickNikRobotics/ros_control_boilerplate

Head action

  • http://docs.ros.org/electric/api/control_msgs/html/action/PointHeadAction.html
  • http://wiki.ros.org/pr2_controllers/Tutorials/Moving%20the%20Head
  • http://wiki.ros.org/robotican/Tutorials/Moving%20the%20head
  • http://wiki.ros.org/Robots/TIAGo/Tutorials/motions/head_action
  • http://wiki.ros.org/head_action

실험을 하면서 계속 업데이트할 예정이다.

Google assistant service with custom wake word detection #2

이 글은 내 로봇에 음성인식 서비스를 적용하는 과정에 대해 설명한다.

나는 Google assistant service와 custom wake word detection를 활용하여 음성인식 모듈을 만들고 있다.

이 서비스를 활용하여 나만의 키워드로 Google assistant를 호출할 수 있다.


Google Assistant는 2가지의 라이브러리를 제공한다.

Google assistant library와 Google assistant service

두 라이브러리의 차이점은 얼마나 아래 레벨까지 접근할 수 있는지 정도이다.

라이브러리는 쉽게 사용할 수 있고, 딱 필요한 기능들만 제공한다면

서비스는 Google assistant의 기능들을 하나하나 컨트롤 할 수 있다.

라이브러리로는 내가 원하는 기능들 (custom wake word detection, get answer text, get speech_text)이 어려울 것 같아서 서비스를 사용하기로 했다.


Google assistant service에 대한 설명은 아래를 참고한다.

The Google Assistant Service gives you full control over the integration with the Assistant by providing a streaming endpoint. Stream a user audio query to this endpoint to receive a Google Assistant audio response. You can generate bindings for this API from a variety of languages (for example, Go, Node.js, C++, and Java) on all platforms supported by gRPC.

여러 언어로 google assistant service를 연동할 수 있다.


Google assistant service 튜토리얼 자체는 아래와 같다.

  1. Google console에서 등록
  2. 디바이스에서 인증 파일 다운로드
  3. 샘플 예제 돌리기

그대로 따라서 동작시켜 봤다.


예제 소스 코드

이 코드는 내가 참고한 코드이다. 구글에서 제공하는 예제 코드이다.

https://github.com/googlesamples/assistant-sdk-python/tree/master/google-assistant-sdk/googlesamples/assistant/grpc

실제 서비스에 적용하기 위해서는 코드레벨에서 접근해야 한다.

이 코드는 Enter 를 누르고 음성인식을 하는 코드이다.

https://github.com/googlesamples/assistant-sdk-python/blob/master/google-assistant-sdk/googlesamples/assistant/grpc/pushtotalk.py#L455-L461

continue_conversation = assistant.assist()

위의 코드가 Enter 키를 누르면 동작하는 코드이다.

이 때 음성을 녹음하고, Assistant 대답을 만들어내는 곳이다.


나는 이 코드에다가 Custom wake word detection 라이브러리를 적용하여

내가 원하는 이름을 부를 때, Google assistant가 동작하도록 하였다.

사용한 Custom wake word detection은 snowboy 라는 라이브러리다.

https://github.com/Kitt-AI/snowboy

이 코드를 google assistant에 적용하기 위해서 python3로 다시 빌드를 하여서 적용하였다.

또 내가 원하는 키워드를 디텍션하기 위해서는 키워드를 트레이닝한 모델이 필요하다고 하다.

이것은 snowboy에서 제공을 한다.

스노우보이 키워드 학습

https://snowboy.kitt.ai/dashboard

위에 사이트에 가서 원하는 키워드로 학습을 한다.


코드

내 코드는 그래서 snowboy의 hot word detection과 google assistant service를 적용한 것이다.

이제는 이 코드에서 특정 명령이 들어올 때, 로봇으로 신호를 보내는 것은 연결할 것이다.

https://github.com/passionbull/gAssistant_with_custom-wakeword

라즈베리파이에서는 아래 깃헙 코드에서 시작하는게 좋다.

https://github.com/senyoltw/custom-hotword-for-aiy-voicekit


동영상

 

[공부] Bonnet Framework 분석 및 활용 #3 Docker 커맨드 정리 및 개인 Docker 생성

Docker 명령어

글을 따로 적는게 좋을까..

docker ps

현재 동작중인 도커 프로세스를 확인한다.

docker images

현재 저장한 도커 이미지들을 확인한다.

docker rmi IMAGE_NAME

도커 이미지를 지운다.

docker login

도커에 접속한다.

docker commit 7a71088bd4eb jacob/bonnet_mod:1.0

docker commit CONTAINER IMAGE_NAME

현재 동작하는 컨테이너를 커밋한다.

docker push jacobyu/bonnet_mod

도커를 푸쉬한다. 서버에 올린다.

푸쉬하기 전에 로그인을 해야한다.

docker pull jacobyu/bonnet_mod

docker pull REOMOTE_DOCKER_NAME

docker hub에서 이미지를 받아온다.

 

Bonnet docker 실행

jacobyu/bonnet_mod는 tano297/bonnet을 pull 받은 것에 추가적으로 ROS 셋팅 및 모델 저장을 한 후, 개인 도커 허브에 푸쉬한 docker이다.

실행 방법은 아래와 같다.

 

docker pull jacobyu/bonnet_mod

nvidia-docker run -ti –rm -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v $HOME/.Xauthority:/home/developer/.Xauthority -v /home/$USER/data:/shared –net=host –pid=host –ipc=host jacobyu/bonnet_mod:1.0 /bin/bash

 

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

이전글에서는 아마존 에코와 로봇을 연결하기 위한 셋업에 대해 설명을 했습니다.

이번 글에서는 실제 적용한 것을 보여드리겠습니다.

감사합니다.


#1에서 만든 alexa skill set을 실제로 에코 스피커에 적용을 해봤다.

에코에 적용을 하는 것은 생각보다 간단했다.

먼저 에코가 다른 사람이 쓰던 거라서 초기화를 했다.

다음으로 alexa skill을 만든 계정으로 에코를 세팅을 한다.

그러면 자동으로 내가 개발한 skill이 스피커에 적용이 된다.


위에 사진에서 왼쪽의 웹페이지는 가상 알렉사 스피커이다.

나는 스피커에게 이렇게 말했다.

  1. Start fiona application
  2. come here
  3. go to ryan

1번을 통해 나의 skill을 활성화 시켰다.

2번을 말하면 로봇이 내 자리로 온다.

3번은 go to {person/place}, 특정 사람에게 이동할 수 있도록 한다.

왼쪽의 웹페이지에서 동작한 것처럼 실제로 에코에서도 똑같이 동작한다.


Alexa skill

Alexa skill에 대해 깜빡하고 말하지 않았던 것 같다.

Alexa skill은 아마존 에코 스피커에 적용되는 앱이다.

예를 들어, 우리는 스마트폰에 여러 애플리케이션을 설치한다.

전화를 하기 위해서는 전화앱, 채팅을 하기 위해서는 카카오톡, 라인을 쓴다.

그런것 처럼 아마존 에코 (스마트 스피커)에도 애플리케이션이 있다.

그걸 Alexa skill (알렉사 스킬)이라고 부른다.

작성자는 스피커에 로봇이랑 통신을 할 수 있는 하나의 앱을 만든 것이다.

장점

원격에서 로봇을 제어할 수 있다는 것에 장점이 있다.

단순히, 원격 제어가 아니라 원격에서 음성으로 제어할 수 있다는 것이다.

음성처리에 대해 깊이있게 알지 않아도 충분히 활용 가능하다.

엄청난 장점이다.

모든 것을 개발할 필요 없고, 기존에 있는 알렉사, pubnub을 통해 원격 제어 기능을 추가한다.

예를 들어, 로봇이 10대가 있다. 그리고 스피커가 5개가 있다.

사람들이 각각 스피커에 말한다.

Jacob: A 로봇 이리로 와줘

Frankie: B 로봇 저리로 가줘

Maria: 불 꺼줘

단점

에코를 활용해서 로봇에 명령을 할 수는 있다.

하지만, 대기시간이 짧다.

무슨 말이냐면

실제로 로봇에게 명령을 위해서는 다음의 과정이 필요하다.

Fiona application이 내가 만든 skill이다.

  • Hey Alexa
  • Start Fiona application
  • help me

3개의 과정을 통해서 로봇에게 명령을 할 수 있다.

명령을 한 후, 10초 이내에 또 말을 하지 않으면

alexa는 꺼진다. 그러면 다시 3개의 과정을 거쳐서 로봇에게 명령을 해야한다.


프라이버시 문제 때문에 계속 듣도록 하지는 않은 것 같다.

하지만 귀찮다.

그래도 쉽게? 연결을 해볼 수 있다는 점에서 시도해볼만하다.


로봇에게 명령 할만한 것

어떤 로봇이냐에 따라 다르겠지만..

  1. 사진 찍어줘 (Take a photo)
  2. 너 앞에 있는게 뭐니? (What is in front of you?)
  3. 오른쪽 봐 (watch your right side)
  4. 왼쪽 봐 (watch your left side)
  5. 어디로 이동 해.

정도로 해봐야 겠다.


실행 방법

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

cd path_git

python ros_pubnub_sample.py

동영상

개발 중인 네비게이션 시스템에 echo를 적용해봤다.

원격에서도 로봇을 제어할 수 있다.

아래 동영상은 echo 시뮬레이션으로 로봇을 제어하는 영상이다.

에코 시뮬레이션과 실제 에코는 동일한 답변과 동작을 한다.

단지 컴퓨터에서 동작하는 것인가, 아니면 스피커에서 동작하는 것인가만 다르다.

이 동영상은 실제 에코를 활용하여 로봇을 제어하는 영상이다.

개인 사정으로 비공개로 바꾸었다.

아래 동영상은 사람이 에코에 말을 하면 로봇이 물고기 먹이를 주는 영상이다.

잘만들었다.

결론

알렉사는 내가 로봇들을 말만하면 원하는대로 움직일 수 있게 해줬다.
마치, 토니스타크가 아이언맨 여러 대를 제어한 것처럼 말이다.
멋진 기술들이다.

감사합니다.

Google assistant library on ubuntu #1 사전 조사

저는 취미활동으로 저만의 로봇을 만들고 있습니다. 중간중간 쉬고 있긴 하지만 꾸준히 하는중이긴 합니다.

최근에 계속 로봇에 어떻게하면 쉽게 음성인식 기능을 적용할 수 있을까? 에 대해 고민중입니다.

이 포스팅은 구글 어시스턴트를 어떻게 로봇에 적용할까? 에 관련된 포스팅입니다.

구글 어시스턴트 서비스, 라이브러리를 활용해서 제가 할 것은 아래와 같습니다.

  • 음성인식 결과 (사용자가 말한 것) 가져오기
  • Google assistant의 응답 가져오기
  • 특정 명령에 대해서는 내가 설정한 대답, 혹은 동작을 할 수 있도록 한다. (내방 불꺼줘, Jacob이 누구지? – 제이콥은 저를 만든 사람입니다.)
    • 즉, 구글 어시스턴트의 대답과 내가 설정한 것을 선택할 수 있어야함.
  • 시리야, Ok google 과 같은 Custom Invocation (hot word, wake word)이 필요

이 4가지를 로봇에 적용하려고 합니다.

사실은 적용을 하긴 했고, 아직 글로 정리를 못해서

하나하나 정리를 해보려고 합니다.

감사합니다.

이번 글은 먼저 튜토리얼을 따라서 해보고, 여러가지 검색했던 결과들에 대한 나열입니다.

 

google assistant에 대한 이미지 검색결과

<출처 : https://assistant.google.com/#?modal_active=none>


Google assistant library 튜토리얼

google에서 제공하는 내용이다.

https://developers.google.com/assistant/sdk/guides/library/python/

이대로 따라해보도록 한다.

 

마이크 체크

  • arecord l
    • 마이크 목록 확인
    • 0 카드, 0  장치 (card 0, device 0)

  • arecord –format=S16_LE –duration=5 –rate=16000 –file-type=raw out.raw
    • 옵션
      • -D hw: card,device
      • -D hw:1,0 (CameraB409241의 마이크 선택)

 

마이크 추천

https://community.home-assistant.io/t/best-microphone-for-diy-voice-control-components/51265

스피커 체크

  • speaker-test -t wav

프로젝트 관리

프로젝트 관리

https://console.actions.google.com/u/1/project/

보안 관련, key

https://console.developers.google.com/apis/

Google assistant 튜토리얼 결과물

튜토리얼대로 하면 샘플코드를 실행할 수 있다.

hotword ‘OK google’을 하고, 말을 하면 된다.

  • googlesamples-assistant-hotword –project-id proejctID –device-model-id modelID
    • projectID와 modelID는 아래 순서로 들어가서 가져온다.
    • projectID – 구글 액션 콘솔 -> 톱니 -> Project setting -> project ID
    • modelID – 구글 액션 콘솔 ->Device registration -> model ID

 

기타

Google assistatnt docker 활용 검토

Custom Device Actions

https://developers.google.com/assistant/sdk/device-actions-overview

파이썬 코드 샘플

https://github.com/googlesamples/assistant-sdk-python/tree/master/google-assistant-sdk/googlesamples/assistant/library

무조건 응답이 있는 것 같다.

특정 조건에서 내가 원하는 것을 할 수 있을까?

잘 모르겠다.

GRPC로 해봐야겠다.

Custom Wake

https://github.com/shivasiddharth/GassistPi

https://snowboy.kitt.ai/

 

참고 프로젝트

 

https://wiki.odroid.com/odroid-xu4/application_note/software/ai_speaker

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

 

참고한 링크

[공부] Bonnet Framework 분석 및 활용 #2 테스트

Bonnet framework에 대해 이어서 적어본다.

  • https://github.com/PRBonn/bonnet

활용을 위해서는 모든 것을 알 필요는 없다.

Bonnet framework를 활용하여 사람을 검출해봤다.

이 링크는 개발자가 올려 놓은 뮤직비디오에서 사람 검출이다.

생각보다 아주 빠르고 잘된다. 노트북에서 10fps 정도 속도로 검출한다.


프레임워크를 단순히 사용하는 방법은 간단하다.

이 프레임 워크는 이미지를 분류하는 프로그램일 뿐이고 분류하기 위해서는 모델이 필요하다.

  1. 사람 검출을 하기 위해서 사람 모델을 다운 받는다.
    • 프레임워크를 개발한 사람들이 만들어놓은 모델을 활용하였다. Link
  2. Bonnet에서 제공하는 docker 파일를 받는다.
  3. pre-model을 frozen protobuf를 생성한다.
    • ./cnn_freeze.py -p /shared/persons_512
    • frozen protobuf은 /tmp/frozen_model에 생성된다.
  4. roslaunch bonnet_run bonnet_run.launch
    • model path 경로 확인, 생성한 frozen protobuf를 읽도록 한다.
    • image topic 확인
  • input
    • rgb image
    • config
      • topic name
      • model path
  • output
    • segmentation image

왼쪽 이미지는 결과물인 세그멘테이션된 이미지, 오른쪽은 원본 이미지이다.

[공부] Bonnet Framework 분석 및 활용 #1 논문 읽음

안녕하세요. 제이콥입니다.

좋은 프레임워크를 찾아서 소개합니다.

이 프레임워크는 Bonnet Framework인데요.

사용자들이 세그멘테이션을 할 때, 머신러닝을 쉽게 적용할 수 있게 해줍니다.

세그멘테이션은 이미지에서 여러 물체들을 검출하고, 분리하는 것을 말합니다.

논문 : https://arxiv.org/pdf/1802.08960.pdf

깃헙 : https://github.com/PRBonn/bonnet

위의 이미지에서 차, 길거리, 차로, 나무 등을 검출하는 것을 볼 수 있습니다.

3번째 이미지에서는 농작물과 잡초? 작은 것을 분리해내는 것입니다. (Crop vs. Weed Semantic Segmentation)

논문에서 하는 이야기는

너희는 너희의 일에 집중해라, 우리가 세그멘테이션 해줄게 입니다.

그것을 위해 필요한 것은 세그멘테이션 할 모델이 필요하다고 합니다.

문제는 어떻게 그 모델을 만들 수 있는지.. tensorflow에 대해 이해가 필요해보입니다.

아직 이해를 못했습니다.


지금은 그저 작성자가 만들어놓은 모델을 적용해보는 것을 해봤습니다.

스스로 원하는 물체 데이터 셋을 만들고 (혹은 구하고), 모델을 만든다는 것? 이걸 하는게 중요한데

아직 잘 모르겠습니다. 공부가 필요합니다. ㅜㅜ


아래는 framework의 동작을 위한 순서입니다.

Bonnet Framework

we provide a stable and easy-to-use tool to make this technology more approachable in the context of autonomous systems. In this sense, we aim at closing a gap between computer vision research and its use in robotics research. We provide an opensource framework for training and deployment

Sequence

Dataset definition
  • includes images and labels
  • 이미지에 변형을 줄 필요는 없다.

  Abstract dataset handler performs the desired dataset augmentation, such as flips, rotations, shears, stretches, and gamma modifications

Network definition

Each architecture inherits the abstract class Network and redefines the graph in order to change the model type, which allows to easily add new architectures.

The interface with the model architecture is done through the net.yaml configuration file, which includes the selection of the architecture, the number of layers, number of kernels per layer, and some other architecture dependent hyperparameters such as the amount of dropout [13], and the batch normalization [14] decay.

Hyper-parameter Selection

Once the network and the dataset have been properly defined, the hyper-parameters need to be tuned.

Training

Once the most promising model is found, the training can be done with this hyper-parameter set using multiple GPUs to be able to increase the batch size, and hence, the speed of training.

Graph Freezing for Deployment

Once the trained model performs as desired, the framework exports a log directory containing a copy of all the configuration files used, for later reference, and two directories inside containing the best IoU and best accuracy checkpoints.