|
3. 소프트웨어 설치
ROS (Robot Operating System) 는 구조적인 통신 계층을 통하여 이기종 로봇 개체들을 운용할 수 있도록 해 주는 오픈소스 로봇 소프트웨어 프레임워크입니다. ROS 은 PCL과 OpenCV 소프트웨어 등을 운영하는 Willow Garage 사에서 만들어 BSD 라이센스를 가진 오픈 소스 소프트웨어로 배포하고 있으며, 이미 수많은 로봇 플랫폼에 적용되어 전 세계 유수의 대학과 연구소 등에서 활발히 연구하고 있습니다.
ROS 는 ROS 홈페이지 (http://www.ros.org) 로부터 해당 OS 플랫폼을 위한 설치파일을 다운로드하여 설치하는 방법이 일반적이지만, 직접 빌드할 수도 있습니다.
터틀봇의 경우 ROS 소프트웨어를 설치할 플랫폼은 터틀봇의 처리부를 담당할 노트북과 원격으로 연결하여 제어하고 감시할 PC 컴퓨터입니다. 터틀봇 노트북에는 ROS 터틀봇 로봇 패키지 (ros-<버전명>-turtlebot-robot) 를 설치하고 PC 에는 ROS 터틀봇 데스크탑 패키지 (ros-<버전명>-turtlebot-desktop) 를 설치하게 됩니다.
상세한 내용은 ROS 홈페이지 참고자료(http://www.ros.org/wiki/Robots/TurtleBot) 또는 인터넷을 찾아보시기 바랍니다. 그리고, 설치시 문제점이나 수정사항이 있으면 언제든지 알려주시면 내용에 반영하도록 하겠습니다.
설치환경 - 호스트컴퓨터 : Ubuntu 11.10, 터틀봇: Ubuntu 10.04 LTS 기준
1) ROS 터틀봇 로봇 패키지 설치
터틀봇 소프트웨어를 설치하는 방법은 이미 리눅스가 탑재된 노트북에 바이너리 패키지를 설치하는 방법과 아예 LiveUSB 이미지를 사용하여 리눅스부터 설치하는 방법이 있습니다.
예1) 미리 설치된 우분투 리눅스에서 바이너리 패키지를 직접 설치하는 경우 (http://www.ros.org/wiki/Robots/TurtleBot/Robot Install)
먼저, 다음 명령을 실행하여 “turtlebot” 사용자를 생성합니다.
$ sudo adduser turtlebot
리눅스를 리부팅하거나 turtlebot 사용자로 로그인합니다. 그런 다음 ROS 홈페이지(ros.org) ROS 패키지 목록을 받아온 다음 apt 패키지 키를 생성합니다. 패키지 목록을 받아올 때, 설치된 리눅스 버전에 따라 다음 명령을 사용합니다. (10.04: lucid, 10.10: maverick, 11.04: natty, 11.10: oneiric)
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu ${버전명} main" > /etc/apt/sources.list.d/ros-latest.list'
$ wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
다음 명령을 실행하여 터틀봇 패키지를 설치합니다.
$ sudo apt-get update
$ sudo apt-get install ros-electric-turtlebot-robot
다음은 환경변수들을 쉘 스크립트 파일에 추가하여 새로운 쉘이 실행될 때마다 자동으로 설정되도록 합니다.
$ echo "source /opt/ros/electric/setup.bash" >> ~/.bashrc
$ . ~/.bashrc
이제 나중에 부팅 시에 터틀봇을 자동으로 시동시키는 등의 작업을 실행시키기 위해 다음과 같은 명령을 실행합니다. 아래 명령을 통해 생성되는 서비스 스크립트는 turtlebot-start (터틀봇 시동), turtlebot-stop(터틀봇 정지) 서비스, turtlebot.conf (터틀봇 설정) 등입니다.
$ roscd turtlebot_bringup/upstart
$ sudo ./install.bash wlan0
우분투 11.10 의 경우 turtlebot-start 에서 필요한 daemontools 패키지를 설치합니다.
$ sudo apt-get install daemontools
다음은 클록 동기화를 위해 chrony 패키지를 설치하고 ntp (네트워크 시간 프로토콜) 를 통해 동기화합니다.
$ sudo apt-get install chrony
$ sudo ntpdate ntp.ubuntu.com
다음은 무선랜을 설정합니다. 무선랜 설정을 위해 로긴한 후 데스크탑 화면에서 상단의 메뉴바에 있는 네트워크 연결 아이콘을 오른쪽 클릭하여 “연결 편집"을 선택하여 네트워크 연결 매니저를 실행시킵니다. 여기서 “무선" 탭에서 사용 가능한 무선네트워크 목록을 보고 적절한 공유기 아이디와 패스워드를 입력합니다. 필요에 따라 동적 IP 대신 고정 IP 를 설정하여야 할 수도 있습니다. 마지막으로 “자동 연결" 체크박스를 선택한 후 적용 버튼을 누르고 창을 닫습니다.
마지막으로 몇 가지 추가로 설정해야 할 부분들이 있습니다. 먼저, 나중에 터틀봇의 원격제어를 위한 원격접속을 위해 ssh 를 설치해 두어야 합니다.
$ sudo apt-get install ssh
그리고, 터틀봇의 Roomba 와 연결 시에 ttyUSB 입력 포트의 권한 문제 때문에 다음과 같은 오류가 나타날 수 있습니다.
Error: can’t open port /dev/ttyUSB0....
이런 경우를 위해 부팅 시에 /dev/ttyUSB0 포트의 사용 권한을 turtlebot 그룹으로 확장하여야 합니다. 이런 작업을 위해 다음 파일을 편집하여 UART-to-USB 모듈을 등록하여야 합니다. 예를 들면, FT232(FTDI 사) 칩의 vendor id 는 “0403”, product id는 “6001” 입니다. (id 들은 lsusb 명령을 실행하여 확인할 수 있습니다)
$ vi /etc/udev/rules.d/52-turtlebot.rules
ATTRS{idProduct}=="6001",ATTRS{idVendor}=="0403",MODE="666",GROUP="turtlebot"
ATTRS{idProduct}=="2008",ATTRS{idVendor}=="0557",MODE="666",GROUP="turtlebot"
…
또, 터틀봇에서 노트북 배터리의 상태를 모니터링할 때 노트북 종류에 따라 리눅스에 등록되는 배터리 장치의 id 가 다른 경우가 있습니다. 그런 경우에는 다음 파일을 수정하여 적절한 id 로 변경하여야 합니다. 노트북 배터리의 id 는 /proc/acpi/battery 디렉토리에 생성되는 디렉토리입니다. (예, BAT0, BAT1 …)
${ROS_BASE}/stacks/turtlebot/turtlebot_node/scripts/laptop_battery.py
예2) 리눅스에서 LiveUSB 를 사용하여 설치하는 경우
(http://www.ros.org/wiki/Robots/TurtleBot/Robot%20Setup)
LiveUSB 를 만들기 위해 2GB 이상의 USB 드라이브를 준비합니다. 그리고, 다음 링크로부터 ISO 이미지를 PC 에 다운로드합니다.
http://pr.willowgarage.com/downloads/turtlebot/turtlebot-2012-01-10.iso
PC 에 우분투가 설치되어 있다면 메뉴에서 시스템(System) → 관리(Adminstration) → 시동디스크생성기(Startup Disk Creator) 를 선택하여 USB 시동디스크를 만듭니다.
아니면, PC 에서 윈도우즈 운영체제를 사용한다면 unetbootin (http://unetbootin.sourceforge.net) 과 같은 프로그램을 사용하여 USB 시동디스크를 만듭니다.
그런 다음, 재부팅하여 ESC 를 눌러 부트 장치를 USB 로 선택하거나 CMOS 에서 USB 부팅이 가능하도록 설정하여 USB 장치로 부팅시킵니다. 부팅 중에 사용자:turtlebot 패스워드: turtlebot 으로 로그인하고 “Install ROS Ubuntu” 아이콘을 선택하여 우분투를 설치합니다. 설치 도중에 “Who Are You” 판넬에서 사용자 이름: turtlebot, 로그인이름: turtlebot, 자동 로그인 등을 선택한 다음 설치를 진행합니다.
설치가 끝나고 USB 드라이브를 제거하고 재부팅하여 로그인한 다음 root 사용자 패스워드를 설정합니다.
$ sudo passwd
다음 명령을 실행하여 터틀봇 패키지를 갱신하고 클록을 동기화시킵니다.
$ sudo apt-get update
$ sudo apt-get install ros-electric-turtlebot-robot
$ sudo apt-get install chrony
$ sudo ntpdate ntp.ubuntu.com
그리고, 무선랜 설정과 기타 추가 설정을 합니다.
2) ROS 터틀봇 데스크탑 패키지 설치
PC 컴퓨터에 설치하는 ROS 터틀봇 데스크탑 패키지 설치는 ROS 터틀봇 로봇 패키지 설치과정과 거의 같습니다.
http://www.ros.org/wiki/Robots/TurtleBot/SDK%20Setup
다만, 진행 도중 설치하는 패키지가 다음과 같은 ros-electric-turtlebot-desktop 패키지입니다.
http://www.ros.org/wiki/Robots/TurtleBot/SDK%20Setup/Deb
$ sudo apt-get install ros-electric-turtlebot-desktop
여기에서도 클록 동기화를 시키고 무선/유선랜 설정을 합니다.
$ sudo apt-get install chrony
$ sudo ntpdate ntp.ubuntu.com
3) 네트워크 설정
ROS 에서는 모든 연결된 컴퓨터들 간 통신을 위해 네트워크가 설정되어야 합니다. 터틀봇 구성에서는 터틀봇 노트북(IP_OF_TURTLEBOT) 과 PC 컴퓨터(IP_OF_WORKSTATION) 의 IP 주소 정보 등이 필요합니다.
각 컴퓨터의 IP 주소는 ifconfig 명령으로 확인할 수 있습니다. 보통 무선으로 연결되는 장치는 wlan0, wlan1 로 시작되는 장치에 등록된 주소이고, 유선 이더넷인 경우 eth0, eth1 으로 시작되는 장치에 등록된 주소가 IP 주소입니다. 예를 들면, 공유기에 연결된 PC 의 주소가 192.168.0.2(IP_OF_WORKSTATION) 이고 노트북의 주소가 192.168.0.3(IP_OF_TURTLEBOT) 인 경우입니다.
장치 간의 연결 상태는 ping 명령을 통해 확인할 수 있습니다.
터틀봇 노트북에서는 다음 명령을 입력해 봅니다.
$ ping IP_OF_WORKSTATION
PC에서는 다음 명령을 입력해 봅니다.
$ ping IP_OF_TURTLEBOT
터틀봇 노트북에서 다음 명령을 실행하여 환경변수를 등록합니다.
$ echo export ROS_MASTER_URI=http://IP_OF_TURTLEBOT:11311 >> ~/.bashrc
$ echo export ROS_HOSTNAME=IP_OF_TURTLEBOT >> ~/.bashrc
PC에서는 다음 명령을 실행하여 환경변수를 등록합니다.
$ echo export ROS_MASTER_URI=http://IP_OF_TURTLEBOT:11311 >> ~/.bashrc
$ echo export ROS_HOSTNAME=IP_OF_WORKSTATION >> ~/.bashrc
이렇게 해 두면 다음 로그인시 자동으로 ROS_MASTER_URI 와 ROS_HOSTNAME 변수가 설정됩니다. 그리고, 여기서 ROS MASTER 장치가 터틀봇을 가리킨다는 점을 주의하시기 바랍니다.
4) 동작 테스트
모든 장치들이 조립되고 연결되었으면 다음은 터틀봇을 시동시키고 다양한 샘플 프로그램들을 실행시켜 봄으로써 동작테스트를 수행합니다.
먼저 터틀봇을 시동시켜 봅니다.
$ sudo service turtlebot stop
$ sudo service turtlebot start
터틀봇 서비스가 설치되지 않았으면, 앞서 설치 과정을 다시 실행합니다.
$ roscd turtlebot_bringup/upstart
$ sudo ./install.bash wlan0
이제, PC 컴퓨터에서는 터틀봇에 연결하여 연결 상태를 모니터링할 수 있습니다. 그 전에 ROS_MASTER_URI 와 ROS_HOSTNAME 이 제대로 설정되었는지 확인합니다.
그리고, 터틀봇 대쉬보드(dashboard) 프로그램을 통해 터틀봇을 모니터링합니다.
$ rosrun turtlebot_dashboard turtlebot_dashboard &
이렇게 하면 다음과 같은 대쉬보드 화면이 나타납니다.
여기서, 각 항목들이 제대로 연결되었으면 녹색으로 나타나고, 그렇지 않으면 노란색(경고) 또는 적색으로 나타납니다. 적색일 때에는 뭔가 연결에 문제가 있으니 해결하여야 합니다.
Create 대신 Roomba 500 시리즈를 사용한다면 연결이 곧바로 되지 않으므로 소스코드를 수정하여야 합니다. 다음 파일을 수정합니다.
$ cd /opt/ros/electric/stacks/turtlebot/turtlebot_node 또는 $ roscd turtlebot_node
$ cd nodes
$ sudo vi turtlebot_node.py
147 번째 줄 근처의 아래 2줄을 고칩니다.
<< self.robot_type = rospy.get_param(‘~robot_type’, ‘create’)
>> self.robot_type = rospy.get_param(‘~robot_type’, ‘roomba’)
<< self.has_gyro = rospy.get_param(‘~has_gyro’, True)
>> self.has_gyro = rospy.get_param(‘~has_gyro’, False)
이렇게 하더라도 자이로 센서가 없기 때문에 대쉬보드의 Diagnostic 부분은 노란색이 나타납니다. 어쨌든 그런 상태에서도 로봇구동 및 사용은 가능합니다.
기본적인 구동 외에 여러가지 샘플 프로그램으로 실습을 할 수 있는데, 아래 내용은 ROS 홈페이지(http://www.ros.org/wiki/Robots/TurtleBot)에 수록된 각종 터틀봇 샘플들의 내용을 요약한 것입니다.
- TurtleBot Bringup - 터틀봇을 시동시키는 방법
TurtleBot Care and Feeding - 터틀봇을 충전하고 유지하는 방법
Visualizing TurtleBot Kinect Data - 키넥트 카메라의 데이터를 시각화하여 보는 방법
TurtleBot Teleoperation - 키보드 또는 조이스틱으로 터틀봇을 원격제어하는 방법
TurtleBot Teleoperation Using Interactive Markers - 인터렉티브 마커를 사용하여 원격제어하는 방법
TurtleBot Teleoperation using PS3 controller - PS3 제어기로 터틀봇을 원격제어하는 방법.
TurtleBot Odometry and Gyro Calibration - 터틀봇 위치 및 자이로 캘리브레이션하는 방법, 주행 기반 응용 프로그램을 실행할 때 추천함
SLAM Map Building with TurtleBot - gmapping 을 사용하여 맵을 생성하는 방법
Autonomous Navigation of a Known Map with TurtleBot - 이전에 만들어진 맵으로 터틀봇을 자율주행하는 방법
TurtleBot Follower Demo - 터틀봇이 앞에 있는 물체를 따라가도록 하는 프로그램
Android Control of the TurtleBot - 안드로이드 스마트폰으로 터틀봇을 제어하는 방법
4. 프로그램 개발
ROS 는 하드웨어 추상화, 공통 기능 구현, 프로세스 간 메시지 전달, 패키지 관리와 같은 기능을 제공하지만, 분산된 프로세스(노드)들을 고유한 통신 메커니즘을 통하여 서로 연결하여 원하는 작업을 수행하는 개념적인 운영체제입니다. 그런 의미에서 컴퓨터 하드웨어 자원과 응용 소프트웨어를 종합적으로 관리하는 전통적인 컴퓨터 운영체제 커널이나 다양한 서비스를 제공하는 프로세스들이 복합적이고 밀접하고 구성된 스마트폰 플랫폼과도 다릅니다.
어떻게 보면 프로세스들이 peer-to-peer 로 느슨하게 연결된 분산 네트워크 프레임워크라고 할 수 있으며 그런 의미에서 여타 로봇 프레임워크인 OPRoS, MSRS, Orocos 등과 비슷합니다. ROS 의 통신 프레임워크는 XMLRPC 라이브러리(xmlrpclib) 라는 HTTP 기반 프로토콜 라이브러리로 구현되어 있는데, 지원하는 기능으로는 로봇 명령어 실행과 같은 동기적인 통신 방식인 service, 센서/카메라 모니터링과 같은 비동기/주기적인 데이터 스트리밍을 위한 publish/subscribe 방식의 topic, 마스터(Master) 로봇에 저장된 공유 데이터를 제공하는 Parameter Server 가 있습니다.
이러한 특징 이외에도 ROS 의 설계 목표로서 다른 프레임워크와 차별화되는 특징이 몇 가지 있습니다. 첫째, ROS 는 “얇게(thin)” 구성되어 있습니다. 이것은 ROS 에 다른 로봇 소프트웨어들, 예를 들면 OpenRave, OpenCV, Orocos, Player 시뮬레이터 등과 쉽게 통합할 수 있다는 것을 의미합니다. 비슷하게, ROS 는 ROS 와 무관한 라이브러리를 사용해서 개발하는 방식을 선호합니다. CMake 등으로 구성된 ROS 빌드 시스템은 기존의 수많은 라이브러리는 물론 새로운 기능을 가진 라이브러리들도 ROS 와 쉽게 결합하여 빌드할 수 있도록 하고, ROS 는 분산 네트워크 프레임워크를 제공하므로 간단한 래퍼 프로세스를 통해 특정한 기능을 수행하는 함수가 정의된 라이브러리와 결합하여 원하는 작업을 수행할 수 있습니다. 따라서 소프트웨어 재사용성도 높일 수 있고, 테스트하기도 쉽습니다.
둘째, ROS 는 여러 가지 언어를 사용해서 개발할 수 있도록 지원합니다. 기본적으로는 C++(roscpp), Python(rospy), Lisp(roslisp) 을 지원하고 Java(rosjava) 와 Lua(roslua) 와 같은 언어도 지원하고 있습니다. (초기에는 octave 도 지원했었는데 지금은 더 이상 개발이 잘 되지 않나 봅니다. 제 생각에 matlab 클론인 octave 도 괜찮긴 한데, 비슷한 방식이지만 훨씬 다양한 기능을 가지고 있고 확장성도 우수한 Python 때문에 더 이상 필요없어진 게 아닌가 합니다.)
셋째, ROS 는 툴베이스(tools-based) 방식으로 구현되어 있습니다. 즉, ROS는 일반적인 통합개발환경(비쥬얼 스튜디오, 이클립스 등) 을 사용하는 게 아니라 python 스크립트로 구성된 다양한 명령어들을 사용하여 ROS 컴포넌트들을 빌드하거나 실행하는 환경으로 구성되어 있습니다.
마지막으로, ROS 는 오픈 소스이며, 누구나 개발에 참여하여 기여할 수 있고, 현재는 Linux 와 Mac OS X 와 같은 유닉스 기반의 개발 환경만 제공하고 있습니다.
ROS 를 사용한 프로그래밍은 ROS 홈페이지에 튜토리얼 등의 문서화가 잘 되어 있으므로 반드시 참고하시기 바랍니다. (http://www.ros.org/wiki/ROS/StartGuide) 그리고, 표윤석님의 블로그(http://blog.naver.com/passionvirus) 에서 튜토리얼 내용을 한글로 보실 수 있습니다.
ROS 은 내부적으로 수많은 패키지를 제공하고 있습니다. 그러므로 이러한 라이브러리 모듈에서 제공하는 여러 가지 API 들을 활용하여 프로그래밍할 수 있습니다. 또한, 특정한 기능을 수행하는 모듈을 C++ 또는 Python 등으로 프로그래밍하여 만든 후 튜토리얼에 따라 패키지화하여 활용할 수 있습니다.
참고자료:
http://www.ros.org, ROS 홈페이지
http://www.turtlebot.com , 터틀봇 판매 홈페이지
http://store.iheartengineering.com , 미국 터틀봇 판매 싸이트
www.turtlebot.eu , 유럽 터틀봇 판매 싸이트
http://www.openni.org, OpenNI 홈페이지
http://ros.org/wiki/Robots/Turtlebot, 터틀봇 설치 홈페이지
http://www.willowgarage.com/sites/default/files/icraoss09-ROS.pdf , Morgan Quigley, Brian Gerkey, Ken Conley, Josh Faust, Tully Foote, Jeremy Leibs, Eric Berger, Rob Wheeler, Andrew Ng, ROS: an open-source Robot Operating System, ICRA 2009
Tod E. Kurt, Hacking Roomba, Wiley Publishing Co. 2007
http://blog.naver.com/passionvirus, 표윤석님의 블로그