2015년 8월 6일 목요일

라즈비안 기반 ROS 설치

매우 저렴하고 확장성있는 센서 통신처리 솔류션을 위해, ROS기반으로 라즈베리파이에 연결된 센서와 데이터 통신을 처리하려 한다. 이 환경을 구현하기 위해, 수많은 ROS레퍼런스와 QA 메일링 리스트를 구글링해가면서 확인해 보았고, 거의 2~3일 동안 밤을 세면서 삽질을 해 보았으나, 안타깝게도, 현재 시점에서는 완벽히 동작되지 않은 것들이 대부분이다 (아다시피 오픈소스는 특정 패키지, 라이브러리, OS, 하드웨어 환경 등 의존성이 매우 높다). 결론적으로 rviz와 같이 리소스를 많이 차지하는 것들은 설치하려 노력하지 말자. 

1. 설치
ROS설치 전에 아래 링크를 참고해, 라즈비안을 최신 버전으로 업데이트한다. 
$ sudo raspi-config
# select expand SD card
# display available space.
$ df -h
# don't timeout
$ export TMOUT=0

최신 라즈비안 이미지를 다운로드해서, 부팅가능한 SD card를 만들고, 라즈비안 부팅 후, 다음 명령어를 이용해, SD 메모리 용량 확장, 로케일 설정, 최신 업데이트 등을 해야 한다. 위 레퍼런스를 잘 따라하면서 설치한다.

$ sudo raspi-config

다음은 apt-get, git 와 같은 필수 명령이 제대로 동작되어, 패키지가 설치될 수 있고, roscore 등 필수 명령이 수행되는 방식인 라즈비안 기반 ROS 설치 방법을 설명한다. 이 내용은 아래 글을 참고하였다. 설치 방식은 ROS-Comm 방식을 권장한다. 
3단계까지 모두 따라하고, 3.2 단계에서 패키지 추가하는 예에서 joystick관련 패키지 대신 아래를 실행해, tutorial 을 추가한다. 

$ cd ~/ros_catkin_ws

$ rosinstall_generator ros_comm ros_tutorials --rosdistro indigo --deps --wet-only --exclude roslisp --tar >> indigo-ros_comm-wet.rosinstall

나머지 작업은 동일하다. 

다만, ROS-Comm 방법에서는 rviz와 같은 패키지가 설치되지 않는다. 마지막 단계에서 패키지 종속성 관련 에러가 발생한다(동일한 방식으로 2번이나 설치해 보았으나, rviz와 같은 desktop 패키지들은 제대로 설치되지 않았다. 어차피 라즈베리파이에서 GUI환경은 사치다. rviz와 같은 Desktop GUI는 설치시 무시하자). ROS-Comm방식으로 하였음에도 불구하고, Python관련 패키지 에러가 발생한다. 참고로 QA 글에 따르면, 나머지 패키지들은 큰 문제가 없으므로 이 에러는 무시해도 된다. 설치를 하고 싶다면, 다음 명령으로 설치하도록 한다. 

$ sudo pip install -U rosdep rosinstall_generator wstool rosinstall

이렇게 설치한 후 패키지들은 다음과 같다.
roscore 명령이 실행되면 제대로 설치된 것이다. 

$ roscore

만약, ros desktop 버전을 설치하였을 경우, turtlesim 패키지가 설치될 것이다. 이 경우, rosrun으로 turtlesim을 실행해 볼 수 있다. 만약, ros comm 버전으로 설치했을 경우, 별도로 turtlesim을 설치해야 한다. 이를 설치하기 위해서 다음 링크를 참조하길 바란다.
이 방법 역시 python관련 에러가 출력되나, tutlesim을 설치하고, 실행하는 데는 문제가 없다.

아래는 ROS Desktop 버전 설치 후 라즈비안에서 ROS가 실행되는 최종 모습이다. ROS Comm버전은 기본 패키지만 있으므로 rq로 시작되는 rqt, rqt_graph등은 포함되어 있지 않다. ROS Comm버전에서는 설치 방법을 구글링하거나, 위키에서 검색해서 별도로 설치해야 한다. 만약 설치된 ROS를 삭제하고 재설치하려면, 다음 apt-get 명령을 실행하라.

sudo apt-get purge ros-*

2. ROS 노드 간 무선 통신 테스트
이제, 다른 PC에 ROS를 설치하고, sudo nano ~/.bashrc 명령으로 ros의 ROS_HOSTNAME과 ROS_MASTER_URL의 IP를 해당 PC의 IP주소로 설정한다. 

무선 WiFi환경이 되도록 WiFi 동글을 USB에 꼽고, 드라이버를 설치해, WiFi 무선이 되도록 한다. 

라즈베리파이에도 WiFi 동글로 무선 통신을 설정한다. 이 내용은 이전 글을 참고하라. 
라즈베리파이의 bashrc 파일은 ROS_MASTER_URL을 PC의 IP주소로 설정한다. 

이제 PC에서 roscore를 실행하고, 라즈베리파이에서는 ROS의 노드를 rosrun으로 실행하면 된다. 그럼 무선 통신은 자동으로 ros가 알아서 처리해 준다. 노드간 통신은 노드에서 메시지만 특정 토픽이름으로 던져주고, 그 토픽을 다른 노드에서 받으면 되고, 이 과정은 roscore가 알아서 처리해준다 (무선이든, 유선이든 관계 없이).

아래는 터틀봇을 키보드로 제어하는 예이다. 
라즈베리파이에서는 turtlesim_node를 실행했다. 
PC에서는 turtle_teleop_key를 실행해 키보드를 입력받도록 하였다. 실행해 보면, 이 메시지는 WiFi 통신을 통해, turtlesim_node로 전달된다. 


라즈베리파이2+WiFi 동글

rosrun + 터틀 시뮬레이션 노드

MASTER PC: roscore + 터틀 키보드 제어 노드

기타 레퍼런스

댓글 없음:

댓글 쓰기