2015년 8월 3일 월요일

아두이노/라즈베리파이와 ROS 연동하기

앞의 글에서 라즈베리파이에 우분투 기반 ROS를 설치하는 내용을 정리해 보았다. 이 방식은 라즈베리파이에서 ROS의 모든 기능을 사용할 수 있는 것에 비해, 별도로 라즈베리파이에서 무거운 우분투와 ROS를 운영해야하는 문제가 있다. 그러므로, 이 글에서는 RPLidar와 같은 센서에서 아두이노/라즈베리파이 등을 이용해 데이터만 ROS로 전달하는 방법을 정리해 본다.

본 글의 실행한 환경은 노트북을 마스터 PC로 하고, TK1을 슬래이브하여, 테스트해 보았다.

1. 우분투 기반 rosserial 설치

1. 아두이노 rosserial 라이브러리 설치
아두이노와 ROS 간 데이터 통신을 위해서는 rosserial 라이브러리를 ROS에 설치해야 한다. 다음 링크에서 다운받은 rosserial 라이브러리를 설치한다.
이를 이용해, 다음과 같은 어플리케이션을 개발할 수 있다.




2. ROS rosserial-arduino 패키지 설치

이 챕터는 아래 레퍼런스를 정리한 것이다.
다음과 같은 명령으로 rosserial for arduino 패키지를 설치한다.

sudo apt-get install ros-indigo-rosserial-arduino
sudo apt-get install ros-indigo-rosserial

다음 명령으로 관련 소스를 설치한다.

cd <ws>/src
git clone https://github.com/ros-drivers/rosserial.git
cd <ws>
catkin_make
catkin_make install
source <ws>/install/setup.bash

3. 아두이노 환경에 ros_lib 설치
아두이노 IDE가 설치되어 있다면, ros_lib 를 아두이노 빌드 환경에 설치한다.

cd <sketchbook>/libraries
rm -rf ros_lib
rosrun rosserial_arduino make_libraries.py .

(*주: 만약, 아두이노 라이브러리에 쓰기 권한 에러로 ros_lib폴더가 생성되지 않으면, sudo chmod 777 libraries 로 폴더 권한을 변경해 줘야 한다)

4. 아두이노 IDE에서 다음 예제를 실행해 본다.


코드를 분석해 보면 다음과 같다 (*주: 지금 시점에선 이 예제가 없고, HelloWorld 예제가 있다. 거의 같은 소스이므로, 이 예제를 이용하면 된다).

   1 /*
   2  * rosserial Publisher Example
   3  * Prints "hello world!"
   4  */
   5
   6 #include <ros.h>
   7 #include <std_msgs/String.h>
   8
   9 ros::NodeHandle nh;
  10
  11 std_msgs::String str_msg;
  12 ros::Publisher chatter("chatter", &str_msg);
  13
  14 char hello[13] = "hello world!";
  15
  16 void setup()
  17 {
  18   nh.initNode();
  19   nh.advertise(chatter);
  20 }
  21
  22 void loop()
  23 {
  24   str_msg.data = hello;
  25   chatter.publish( &str_msg );
  26   nh.spinOnce();
  27   delay(1000);
  28 }

9번 줄에서 Node 핸들러를 정의한다.
12번 줄에서 Publisher 객체를 정의한다.
16번 줄에서 setup() 을 실행해, Node를 초기화한다.
25번 줄에서 hello 메시지를 publish한다.

이 스케치 코드를 아두이노에서 실행한다.
그리고, 다음 명령을 터미널에 입력한다 (*주: 이때 ttyUSB0는 아두이노에 연결된 COM포트 명으로 수정해야 입력해야 한다).

$ roscore
$ rosrun rosserial_python serial_node.py /dev/ttyUSB0
$ rostopic echo chatter

다음과 같이 잘 실행된다.





다른 예제를 실행해 보기 위해, rosrun을 종료한다.

이제 예제 중에 Blink 예제를 로드하고, 빌드하여 아두이노에 전송한다. 그리고 다시 rosrun을 실행한다. 
$ rosrun rosserial_python serial_node.py /dev/ttyUSB0

그리고, topic list -v 를 입력하면, /toggle_led 토픽이 나타난다.
이제, 토픽에 Blink 메세지를 줘 보자. 
$ rostopic pub -1 /toggle_led std_msgs/Empty 

토픽 메시지에 따라 아두이노 보드에 신호가 전달되어 13번 LED가 깜빡거리는 것을 확인할 수 있다.

슬래이브에서 rosrun 실행 (TK1 보드)

슬래이브(TK1 보드)에 연결된 아두이노 보드

blink 메시지 토픽 전달 (마스터 PC)

슬래이브(TK1)에 연결된 아두이노보드 13번 LED ON 확인 

blink 메시지 토픽 전달 (마스터 PC)

 슬래이브(TK1)에 연결된 아두이노보드 13번 LED OFF 확인 

이제, 아두이노에 응용되는 수많은 센서, 모터 및 라이브러리를 ROS기반으로 제어할 수 있다!!!

3D 포인트 클라우드 스캔 및 아두이노 센서 토픽 함께 실행한 모습

rosserial과 관련해, 다음 레퍼런스를 참고하면 사용에 도움이 된다.

2. 라즈비안 기반 rosserial 설치

이 글은 아래 링크를 참고하였다. 다만, 설치 시 패키지 Error 가 나는 경우가 많음에 주의할 필요가 있다. 우선 내용을 정리한다는 차원에서 포스팅한다.
이를 이용해, 다음과 같은 어플리케이션을 개발할 수 있다.


우선 라즈베리파이에 앞의 글에서 설명한, 라즈비안+ROS가 설치되어 있음을 가정한다. 그리고 앞에서 ROS에서 설치했던 방식으로 rosserial 을 설치한다. 참고로, 다음과 같은 방식으로 설치할 수도 있다.

$ cd ~/ros_catkin_ws/src
$ git clone https://github.com/ros-drivers/rosserial
$ cd ..
$ rosdep install  --from-paths src --ignore-src --rosdistro indigo -y --os=debian:wheezy

rosserial 사용방법은 동일하다.

기타, 다음 레퍼런스를 참고하면, 개발에 도움이 된다.
특히, rosbridge 를 사용하면, JSON 웹기반으로 ROS와 메시지를 주고 받을 수 있다. 이와 관련되어, 로봇웹툴이란 커뮤니티가 있다. 

rosbridge & force (rosbridge로 ROS포스를 느껴보자 ㅎ)




댓글 10개:

  1. 안녕하세요
    라즈베리파이 2 model B에 xubuntu + ROS(Indigo) 이용중입니다

    혹시 Arduino IDE 설치 방법이 따로 있는지 궁금합니다.

    답글삭제
  2. 그냥 아두이노 다운로드 홈페이지 가셔서, 리눅스 버전 다운로드 하시고 설치하시면 됩니다. 상세 내용은 이 글의 Arduino IDE setup과 http://planfully.com/install-arduino-ubuntu/ 링크 참고하시면 될꺼예요..

    답글삭제
  3. 답변 감사합니다
    근데 혹시 xubuntu + ROS(Indigo)를 올린 라즈베리에서는 아두이노 최신버전은 실행이 안되나요?
    arduino-1.6.5를 다운받아 압축풀고 실행하면

    cannot execute binary file : exec format error 이 오류가 발생해서

    32bit 64bit 모두 시도해봤지만 같은 증상이 나타나더라구요

    라즈비안에서는 되는 것 같던데 혹시 OS 문제인가요?

    답글삭제
  4. 리눅스 버전으로 다운로드 하셨나요? 저는 라즈베리파이에 우분투 DESKTOP 버전 설치했었습니다. 참고하시길 바랍니다.

    답글삭제
    답글

    1. 라즈베리파이 2 model B에 우분투 데스크탑인 xubuntu를 설치했구요
      처음엔 우분투 unity 버전을 설치했는데 알고보니 arm용으로는 unity버전이 지원이 안된다고 하더라구요
      그리고나서 ROS(indigo)까지 설치했습니다
      아두이노는 정식 홈페이지에서 arduino-1.6.5(Linux32bit)를 받았구요.
      그런데 오류가 나네요... 어떤문제인지 알 수가 없어서 질문드렸습니다

      삭제
    2. 음.. xubuntu 에선 app설치 없나요? 혹시 있으면, 검색해서 설치해 보십시요. 그리고, 아래 링크에 직접 설치 관련 내용이 있습니다. 구글링해보시면 좀 더 많은 글이 있으니 참고하시길...

      https://patakacs.wordpress.com/2014/01/24/installing-arduino-helloworld/

      삭제
  5. 아두이노 IDE 코드 상에서 리눅스 명령어를 실행할 수 있나요?

    답글삭제
  6. 아두이노 보드 자체가 리눅스 OS가 설치되지 않습니다. 그래서, 리눅스 명령어 실행하기는 어렵죠. 혹시, 아두이노 강점을 살리고, 저렴한 비용으로 리눅스와 연동해 사용하는 게 목적이라면, 아래 조합을 권해 드립니다.

    라즈베리파이 (라즈비안 OS) + 아두이노 (외부 장치 제어)


    답글삭제
  7. 안녕하세요?
    쓰신 글 잘봤습니다
    궁금한 점이 하나 있어서 댓글 남깁니다.
    혹시 하신 방법이 아두이노에서 우분투로 데이터를 넘기고 우분투에서 ROS을 이용한 방법인가요?

    혹시 하나의 노트북에서 아두이노와 우분투를 서로 연동하는게 가능한가요?? 또한 ROS까지 연동이 가능한 것인가요?

    답글삭제
    답글
    1. 네. 데이터 전달 방법은 다음과 같이 하였습니다.

      우분투에서 ROS실행 - ROS serial - 아두이노 - 센서 및 모터 제어

      하나의 노트북에서 아두이노, 우분투 모두 연동 됩니다. 우분투 설치후 아두이노 리눅스 버전 앱 설치해 사용했는 데 큰 문제 없었습니다.

      삭제