2015년 8월 16일 일요일

대용량 센서 데이터 취득 및 처리에 적합한 임베디드 개발 보드 비교 분석

이 글은 대용량 센서 데이터 취득에 적합한 임베디드 개발 보드를 조사하다, 정리한 글이다.
여기서 대용량 센서 데이터란 카메라 이미지 센서, RGB-D센서, 레이저 센서, 라이다 센서 등에서 획득한 동영상 이미지 및 3D포인트 클라우드 데이터 크기 이상을 말한다.

1. 아두이노
소규모 센서 데이터 처리에만 적합하다. 굳이 언급한 이유는 대용량 센서 데이터를 취득할 때, 보조가 되는 GPS(Global Positioning System), IMU(Inertial Measurement Unit)센서와 같은 것들은 아두이노 보드로도 충분하기 때문이다. 게다가, 개발 컨텐츠가 이 글에서 언급하는 다른 개발 보드에 비할바가 안될 만큼, 풍부하다. 가격도 매우 저렴하고, 소형이다. 개발 목적 별로 다양한 개발 보드를 구입할 수 있다.

  • 장점 - 가격이 너무 싸다. 2만원 이하로 괜찬은 개발 보드를 구매할 수 있다. 크기가 소형이다. 정말 많은 개발 컨텐츠가 널려 있다. 개발 방법이 매우 쉽다. 
  • 단점 - 성능이 매우 좋지 않다. 예를 들어, 카메라로 이미지를 취득하여, 처리한다는 것은 불가능한 일이다.
  • 결론 - 소량의 데이터 취득 및 처리에만 사용한다.




2. 라즈베리파이2
비디오 이미지를 취득하는 수준까지는 적당하다. 다만, HD이미지를 취득하기에는 성능이 약간 떨어지는 면이 있다. 이 경우에는 pi camera를 사용하는 것이 좋다. 포인트 클라우드를 스캔하여 처리하는 것은 시도해 본 결과, 성능이 뒷받침 해주지 못하며, 게다가, ROS와 같은 미들웨어를 설치하고, 그 위에 이런 스캔 센서를 붙여, 데이터를 처리한다는 것은 스펙상 쉽지가 않다.
  • 장점 - 가격이 매우 싸다. 5만원 이하의 가격으로 우분투 리눅스를 설치할 수 있다. 다양한 개발 컨텐츠가 널려 있다. 파이썬만 알아도 어느 정도 개발이 가능하다.
  • 단점 - 성능이 좋지 않다. 물론, 아두이노보다는 훨씬 낫지만, 이정도로는 대용량 센서 데이터를 처리하는 것은 쉽지 않다. 
  • 결론 - 라즈비안 정도 OS에 소량의 센서 데이터를 취득하여, 다양한 파이썬 툴로 데이터를 처리하는 정도가 적당해 보인다. 무리해, ROS를 설치할 수도 있으나, 최소한의 기능으로 만족해야 정신건강이 해롭지 않다. 욕심을 내면 무한 삽질에 빠질 수 있다.


3. 비글본 블랙
이보드는 라즈베리파이와 비슷한 크기의 고성능 소형 보드로, 데비안 리눅스 계열과 호환성이 좋다. 많은 개발 컨텐츠와 서적이 출판되어 있어, 다양한 프로젝트를 개발하는 데 문제가 없다. 게다가, 가격도 착해서, adafruit에서 판매하는 BeagleBone Black Rev C - 4GB 가 $55에 판매되고 있다. beagleboard.org 에서 개발 컨텐츠를 지원하고 있으며, ros wiki에서 ROS와 같은 다소 무거운 미들웨어도 실행된다고 보고되고 있다.
  • 장점 - 가격이 다소 저렴하다. 다양한 개발 컨텐츠를 지원한다. ROS와 같은 미들웨어도 실행이 잘 된다. 
  • 단점 - 라즈베리파이나 아두이노에 비해서는 개발 컨텐츠가 약한 면이 있다. 개발을 위해, 리눅스 커널과 같은 좀 더 전문적인 지식들이 필요하다. 
  • 결론 - 돈이 별로 없지만, 고성능을 원하고, 크기도 작아야 한다면, 적당한 선택이다.


4. 오드로이드
이 보드는 하드 커널이란 국내 기업에 의해 개발되었다. 오드로이드 보드는 여러가지 버전이 있는 데, 그 중에 많이 사용되고 있는 U3버전을 기준으로 이야기한다. 성능이 라즈베리파이2에 비해 훨등히 좋아(최소 쿼드 코아), 거의 저렴한 데스크탑 PC정도의 성능을 낸다. 다만, 가격이 비싸다. 오드로이드 U3 판매가가 $248 정도 한다. 소형 리눅스 컴퓨터로 시작한 만큼, 리눅스 호환성은 좋다. 다만, 아두이노나 라즈베리파이에 비해, 센서 및 액추에이터 응용한 사례와 개발 컨텐츠가 빈약한 면이 있다.
  • 장점 - 성능이 뛰어나다. 리눅스 호환성이 라즈베리파이에 비해 훨씬 좋다. ROS설치에도 무리가 없다. 
  • 단점 - 가격이 비싸다. 라즈베리파이나 아두이노에 비해, 개발 컨텐츠가 비약하다. 
  • 결론 - 돈이 있고, 아두이노 정도의 소형 크기를 원한다면, 적절한 선택이 될 수 있다. 다만, 개발 컨텐츠 부분은 구글링을 통한 삽질이 필요하다.



5. Nvidia Jetson TK1
GPU 개발 대기업 NVIDIA에서 개발한 고성능 연산처리 전용 보드이다. 무려 192 core가 장착되어 있어, 센서에서 얻은 대용량 데이터 처리에 전혀 무리가 없다. 그러므로, 대용량 수치해석이 가능하다. 쿼드코아를 사용하고 있고, 기본적으로 16G의 저장 공간을 제공한다. 확장성을 고려한 IO를 제공하고 있다. 다만, 가격이 오드로이드에 비해 더 비싸고($320), 보드 크기가, 라즈베리파이 보다 2배 더 크다. 이런 문제는 대기업에서 빵빵하게 서비스하고 있는 개발 컨텐츠와 우분트+ROS 지원 노력으로 상쇄하고 남는 면이 있다.
  • 장점 - 성능이 매우 뛰어나다 (타의 추종을 불허한다). 리눅스 호환성이 매우 좋다. ROS설치에 전혀 무리가 없다. 개발자 사이트 서비스를 받을 수 있다.
  • 단점 - 가격이 비싸다. 크기가 라즈베리파이에 비해 2배다. 
  • 결론 - 돈 많고, 성능이 매우 중요하고, 보드 크기에 큰 문제가 없다면, 적절한 선택이다.


정리해 보면 다음과 같다.

1. 보드 성능과 개발 수준이 높아질 수록, 리눅스 커널에 대한 지식과 구글링 삽질 기술이 중요해 지고, 할 수 있는 것들이 많아진다.
2. 돈이 많고, 성능이 무조건 좋아야 한다면, TK1을 선택한다.
3. 돈이 적고, 성능은 중간정도 필요하다면, 비글본을 선택한다.
4. 돈이 좀 많고, 성능도 괜찬아야 한다면, 오드로이드를 선택한다.
5. 돈이 없고, 무한 삽질에 대한 각오가 되어 있다면, 라즈베리파이2를 선택한다.
6. 돈이 주체할 수 없을 만큼 무한정 많다면, NI(National Instruments) 제품을 선택한다. 모든 제품에는 신뢰성 있는 동작 데이터를 제공한다. DIY하기가 매우 어렵고, 모든 서비스에는 무조건 돈이 든다.
7. 기타, 글쓴이가 모르는 더 좋은 대안이 있을 수 있다는 것을 고려한다.

한번 더 이야기하는 것이지만, 이 글은 대용량 센서 데이터를 취득하기 위한 목적에 괜찬은 임베디드 보드만 정리한 것이다. 만약, 그리 많지 않은 센서 데이터라면, 아두이노 보드를 선택하는 것이 훨씬 낫다. 제일 저렴한 우노 보드인 경우, 가격이 2만원 이하인데다, 수 많은 개발 컨텐츠를 지원하고 있다. 물론, 이 경우에도 보드보다 더 비싼 센서와 주변 엑사사리(WiFi 장치 등)는 별도로 고민해야 한다.

아울러, 그냥 간단한 소프트웨어만 개발해 볼 생각이라면, 노트북에 matlab 등을 설치해서, 연구하는 편이 훨씬 낫다. 이 글은 저렴한 비용으로 소프트웨어+하드웨어 개발까지 고려해, 센서 데이터를 처리하려 했을 때 시도하는 방법이다.

아래 사이트에 성능을 비교 결과가 있다. 참고하자.



Arduino YunBeaglebone BlackIntel GalileoRaspberry Pi Model ARaspberry Pi Model B
Memory Index1.1045.6610.6692.5092.570
Integer Index1.8406.0321.1983.3053.291
Floating Point Index0.0381.5910.6212.0642.002


2015년 8월 15일 토요일

리눅스 우분투 명령어 정리

작업을 하다가 복잡한 우분투 명령어를 기억하기 어려울 때가 많다.
까먹기 쉬운 명령어를 정리한다.

1. 운영체제 / 컴퓨터 스펙 확인
리눅스 종류 및 버전 확인
$ lsb_release -a

32비트, 64비트 확인
$ getconf LONG_BIT

CPU 아키텍처 확인
$ arch

CPU 스펙 상세 확인
$ lscpu | grep ^Arch

2.암호 분실 / 운영체제 부팅 순서 변경
패스워드 분실 시 복구방법
운영체제 부팅 순서 변경 방법

$ sudo add-apt-repository ppa:danielrichter2007/grub-customizer
$ sudo apt-get update
$ sudo apt-get install grub-customizer
$ sudo grub-customizer

3.무선 네트워크 설정 방법 
4.자동 로그인, 배치 실행 및 백그라운드 실행 
$ sudo  nano /etc/rc.local
5.화면 캡쳐 
5초 뒤 현재 활성화된 윈도우 화면 캡쳐해 파일 저장하는 방법

$ scrot -cd 5 -u

6.일반 컴퓨터에 ROS / OpenCV / OpenNI / PCL 설치 방법

OpenCV2
$ sudo apt-get install libopencv-dev
$ rm -rf src/opencv2

OpenNI
$ sudo apt-get install libopenni-dev

You will need to use the PCL provided by ROS, unfortunately PCL will not compile, so do the following changes:

Edit src/pcl/cmake/pcl_find_sse.cmake and replace '-march=native' from line 10 with '-march=armv6 -mfloat-abi=hard -mfpu=vfp'.

Edit src/pcl/io/include/pcl/io/ply/byte_order.h and define PLY_LITTLE_ENDIAN, right after it checks if it was already defined on line (69?).

만약 위의 방법이 안되면, 링크 #1, 링크 #2#를 참고해, OpenNI2를 설치해 본다. 

7.기타
재부팅 및 종료
$ sudo reboot
$ sudo shutdown -r now
$ sudo halt
$ sudo shutdown -h now

라즈베리파이 소프트웨어 설정
$ sudo raspi-config

소프트웨어 설치 및 삭제
$ sudo apt-get install [software]
$ sudo apt-get remove [software]
$ sudo apt-get autoremove [software]
$ sudo apt-get clean

소프트웨어 업데이트
$ sudo apt-get update

디스크 잔여 용량 확인
$ df -h

연결된 USB장치 확인
$ lsusb

라즈베리파이 앱 스토어 설치
$ sudo apt-get install pistore

라즈베리파이 로케일 설정 및 타임 서버 설정

라즈베리파이 날짜 설정
$ apt-get install rdate
$ cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime
$ rdate -s time.bora.net
$ date

리눅스 동영상 강좌



TK1 기반 ROS, 센서, 무선 및 배터리 설치

라즈베리파이 기반 ROS를 설치하고, roscore와 turtlesim 실행까지 성공하였으나, 그 이후, camera, openni 등은 unmet 의존성 문제로 실패하였다. 아마, 우분투 버전 14.02.4 LTS에서 해결되지 않은 몇몇 패키지의 문제들로 추측된다. 다만, 라즈베리파이에서 자이로 센서와 같이 대용량 데이터 처리를 할 필요가 없는 센서 관련 패키지 등은 큰 문제 없이 실행되었다.

본인은 3차원 포인트 클라우드를 센싱하고 처리할 수 있는 보드가 필요했으므로, 라즈베리파이는 간단한 센서 처리(IMU같은)에만 사용하였다. 3차원 포인트 클라우드를 취득 및 처리하려면, openni와 PCL 라이브러리를 설치해야 한다. 이 라이브러리를 사용하려면, 라즈베리파이에서 예전 안정된 우분투 버전에서 다시 삽질을 하거나, 꼬인 패키지 의존성을 풀거나, 라즈베리파이 같이 열악한 보드가 아닌 베어본 pc에서 제대로 설치해 보는 것이다.

베어본 PC이면서 개발에 적합한 소형 보드는 오드로이드, TK1이 대표적이다.

만약 병렬 데이터 처리가 필요하다면, 단연 TK1을 사용하는 것이 좋다.
여기서는 Jetson TK1에서 ROS를 설치해 본다. 장비 스펙은 다음 링크를 참고한다.

1. 시작
TK1을 이용해 다음과 같은 짓을 할 수 있다 (이리 잘 된다면야).


TK1의 디스크 용량은 16G로 그리 크지 않다.
$ df -h

TK1 상세 재원은 다음과 같다.

Jetson Specs

Nvidia Jetson TK1

Processor
2.32GHz ARM quad-core Cortex-A15

DRAM
2GB DDR3L 933MHz EMC x16 using 64-bit data width

Video out
HDMI

Flash
16GB fast eMMC 4.51

Mini PCIe
Addon wifi module, firewire IEEE 1394, etc.

Serial
a full-size DB9 serial port

Power
12V DC barrel power jack and a 4-pin PC IDE power connector


2. 설치
설치 방법은 아래 레퍼런스를 따른다.
관련 설치 동영상은 다음과 같다. 이 영상은 installROS.sh 배치파일을 사용하는 데, ros-indigo-ros-base 패키지를 설치한다. shell은 './[shell 배치파일명]' 혹은 'sudo sh [shell 배치파일명]' 을 실행하면 된다. 만약, rqt, RViz 등을 설치하고자 한다면, ros-indigo-desktop-full 패키지를 설치하면 된다.


기본적인 ROS 패키지를 설치한 후에, 새로운 터미널을 열고, Catkin workspace를 설치한다. 만약, 앞의 설치 shell 배치 환경에 정의된, ROS 경로 설정이 반영되지 않으면, Catkin workspace 초기화 명령이 실행되지 않으니, 주의하길 바란다. 설치 동영상은 다음과 같다. 관련 레퍼런스는 ros wiki를 참고한다.


ROS 패키지 경로 환경 변수를 확인할려면, 다음 명령을 실행해 본다.
$ echo $ROS_PACKAGE_PATH

3. ROS 환경 설정
다음과 같이 bashrc 파일에 ROS 환경을 설정한다.
$ gedit ~/.bashrc

ifconfig를 통해, ip를 얻고, 이 값을 ROS_HOSTNAME, ROS_MASTER_URI에 설정한다. 환경 설정 관련 내용은 이전 ROS 설정관련 글을 참고하라.

개발환경도 설치한다.
$ sudo apt-get install qtcreator

4. ROS 테스트
이제 제대로 설치되었는 지 테스트해 보자.
$ roscore
...
started core service [/rosout]

제대로 서비스가 실행되면, 설치에 성공한 것이다.

설치 가능한 패키지가 어떤것이 있는 지 확인해 보자.
$ apt-cache search ros-indigo

대략 1634패키지가 설치 가능하다.

이 중에 tutlesim을 설치해 본다.
$ sudo apt-get install ros-indigo-turtlesim

turtlesim을 실행해 본다.
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key

rqt_graph를 설치해 실행해 본다.
$ sudo apt-get install rqt_graph
$ rosrun rqt_graph rqt_graph

그럼 다음과 같은 노드 간 토픽 그래프를 확인할 수 있다.




이제 rviz 삽질 미션이다.
$ sudo apt-get install ros-indigo-rqt*

그대로 실행하면, segment fault 에러가 출력된다. 이 문제는 ros wiki에 보고된 것으로, ~/.bashrc 파일에 다음과 같이 GTK_IM_MODULE을 unset 하도록 한다.

unset GTK_IM_MODULE

재부팅한 후, rviz를 실행해 본다.
$ rosrun rviz rviz

그래도 같은 segmentation fault가 출력된다. 구글링 삽질을 해보니, robot_model 패키지에서 문제가 발생하고 있다고 wiki에 보고되고 있다. git에서 다운받아 catkin으로 재설치해 보았다. 그래도 또 발생한다.

다시 rviz를 1.11.7에서 1.11.6으로 다운그래이드(Downgrading)하면 된다는 wiki 발견하고 시도해 보았다. 특정 버전 설치는 다음과 같다.

$ sudo apt-get purge ros-indigo-rviz*
$ sudo apt-get install package=version
1.11.6 버전 패키지를 찾을 수 없다는 에러가 발생한다. 참고로, 잘되는 rviz는 GLSL 4.4가 아닌 1.3이 사용되고 있다.

다시 1.11.7 버전을 재설치한다. 그리고, 실행해 보니, XML과 관련된 다른 에러가 발생한다.
rviz_backdrop 패키지이다. sudo apt-get purge로 삭제한 후 다시 실행해 본다. 그래도, segmentation fault가 발생한다. 대략 2시간 정도의 삽질이 아깝지만, 일단, rviz는 과감히 포기한다.

rviz를 제외하고는 순조롭게 설치가 진행된다. rviz를 제외하고는 대략 2시간 정도 걸렸다. 라즈베리파이 삽질은 [우분투 | 라즈비안] + [ROS Desktop | ROS comm] + [32G | 16G] + [WiFi] 를 거의 일주일동안 밤을 새며 작업을 하였으나, 결국 camera,  openni ros 패키지 등을 설치하기 어려웠다.

5. 센서 설치 및 실행
1. uvc_camera 설치
usb 카메라를 꼽아 본 후 lsusb로 카메라가 인식되는지 확인한다. 인식되면 해당 카메라가 리스트된다. 참고로 /dev 폴더에 video0 드라이버가 열릴것이다.

그후, uvc_camera를 설치해 본다.
$ sudo apt-get install ros-indigo-uvc-camera
$ sudo apt-get install ros-indigo-image-*
$ sudo apt-get install ros-indigo-rqt-image-view

$ roscore
$ rosrun uvc_camera uvc_camera_node

$ rostopic list

$ rosrun image_view image_view image:=/image_raw

이 결과로, 다음과 같이 카메라 이미지가 제대로 취득되는 것을 확인할 수 있다.


2. openni2 설치
이제 기쁜 마음으로 openni2를 설치해 보자. 사용할 RGB-D 센서는 Xtion이다.
$ sudo apt-get install ros-indigo-openni2-camera ros-indigo-openni2-launch

잘 설치된다^^. 이제 실행해 본다.
$ roscore
$ roslaunch openni2_launch openni2.launch

이제, rviz로 확인해 볼 단계이다. rviz가 현재 TK1에 제대로 설치되지 않았으니, 인터넷으로 연결된 ROS master PC에서 확인해 본다. 이를 위해, TK1 우분투의 ~/.bashrc 의 MASTER URI 주소를 master PC IP주소로 설정해야 한다. 이 과정은 이전 글의 내용과 동일하다. 실행 순서는 다음과 같다.

1) TK1의 roscore, roslaunch를 실행 취소한다.
2) TK1의 ~/.bashrc 에서 ROS_MASTER_URI 주소를 MASTER PC의 IP주소로 설정하고 저장한다.
3) MASTER PC에서 다음 명령을 실행한다.
$ roscore
4) TK1에서 다음 명령을 실행한다.
$ roslaunch openni2_launch openni2.launch
...
process[camera_base_link3-13]: started with pid [21355]
...
4) MASTER PC에서 rviz를 실행한다.
$ rviz
[Global options] -> [Fixed Frame] -> 'camera_depth_frame'
RViz의 [Add]버튼 클릭 -> [PointCloud2] 선택
[PointCloud2] 노드 속성값에서 [Color Transform]을 'AxisColor' 로 설정

그럼 다음과 같이 포인트 클라우드가 보여진다. RViz의 거리 측정 명령을 사용하면, 점 간 거리를 알 수 있다.

5) MASTER PC
$ rqt_image_view
/camera/depth/image
/camera/ir/image

TK1 + Asus XTion


Master PC

만약 잘 안된다면, 다음 사이트를 참고해, 드라이버 등을 설치한다. 참고로, 본인의 경우에는 TK1에 별도로 XTion 드라이버를 설치하지 않아도 실행이 잘 되었었다.
아래는 Asus XTion PRO Live 사이트의 요약 내용이다.
$ sudo apt-get install -y g++ git python libusb-1.0-0-dev libudev-dev freeglut3-dev doxygen graphviz openjdk-6-jdk
$ mkdir ~/devel
$ cd  ~/devel
$ git clone https://github.com/occipital/OpenNI2.git
$ cd OpenNI2
$ find . -iname platform.arm
$ gedit ./ThirdParty/PSCommon/BuildSystem/Platform.Arm
Find:
CFLAGS += -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=hard
Replace with:
CFLAGS += -march=armv7-a -mtune=cortex-a15 -mfpu=neon-vfpv4 -mfloat-abi=hard

$ gedit ThirdParty/PSCommon/BuildSystem/CommonCppMakefile
Search the line
[Line 97] LDFLAGS += -Wl,-rpath ./ 
and the line
[Line 98] OUTPUT_COMMAND = $(CXX) -o $(OUTPUT_FILE) $(OBJ_FILES) $(LDFLAGS) 
Add the code between the two lines:
LDFLAGS += -Wl,-rpath ./
ifneq (“$(OSTYPE)”,”Darwin”)

    LDFLAGS += -lpthread

endif
OUTPUT_COMMAND = $(CXX) -o $(OUTPUT_FILE) $(OBJ_FILES) $(LDFLAGS)
    $ gedit Makefile
    core_samples: $(CORE_SAMPLES)
    PLATFORM=Arm make
    GLUT_SUPPORTED=1 make tools -j4

    $ cd ~/devel/OpenNI2/Bin/Arm-Release
    $ ./SimpleRead
    $ ./NiViewer




    3. WiFi 설치
    WiFi 설치는 다음 사이트를 참고한다. 

    이 사이트에서 권장하는 WiFi 제품은 다음과 같다.





    4. 배터리 설치
    배터리 설치와 관련된 부분은 다음 링크와 영상을 참고한다. 




    사용되는 배터리의 크기는 다음과 같다. 
    13.97 cm x 5.08 cm x 2.54 cm (5.5 x 2 x 1 inch)

    5. 결론
    TK1은 레퍼런스가 워낙 잘 되어 있고, 보드에 필요한 라이브러리의 호환성이 좋아, 큰 문제 없이 모든 라이브러리 패키지 설치 작업을 몇 시간만에 마칠 수 있었다. 삽질했었던 RViz도 지금은 잘 실행된다. 
    매우 강력한 병렬 프로세싱이 지원되는 보드이므로, 강력한 수치 연산이 필요한 응용에 사용 가능하다. 가격은 아마존에서 현재 192달러에 판매되고 있다. 이 정도 성능에 가격이라면, 비싼 편이 아니다. 



    레퍼런스




    2015년 8월 7일 금요일

    ROS 요약 상세 정리 2차

    이 글은 ROS에 대한 2차 요약 정리 글이다. 이 내용은 표윤석님의 ROS 로봇 프로그래밍 책을 참조하였다. 이 책에서는 Ubuntu 14.04 를 사용하고 있다. 그 이후 버전에선 libgl1-mesa-dev-lts-utopic 설치시 의존성 unmet 오류가 발생된다. 그리고, 현재 시점에서 완전히 해결되지 않았다(2015.8.15). 우분투 버전을 확인하려면 다음 명령을 입력한다.

    $ lsb_release -a

    1. 개요
    ROS는 2007년 5월 미국의 스탠퍼드 대학 인공지능 연구소가 진행하던 STAIR(STandford AI Robot) 프로젝트를 위해 Morgan Quigley 가 개발한 Switchyard 라는 시스템에서 시작하였다. 이후, 2007년 11월 로봇 전문 개발사인 윌로우게러지란 회사가 ROS란 이름을 개발하기 시작하였다. 2010년 1월 22일 ROS 1.0버전이 릴리즈되었다. 2014년 7월에는 9번째 버전인 ROS 인디고 이글루 버전이 공개되었다.

    라이센스는 BSD 3-Clause 이다. 누구든 수정, 재사용, 재배포가 가능하다. 윌로우게러지가 2013년 상업 서비스 로봇을 판매하면서, ROS는 OSRF(Open Source Robotics Foundation)으로 이양되었다.

    다음은 ROS 릴리즈 및 컨퍼런스 연혁이다.

    ROSCon 2014 Chicago, USA
    ROSCon 2013 Stuttgart, Germany
    ROSCon 2012 St. Paul, USA


    2. 설치
    1. 기본 설치

    ROS가 지원하는 공식 운영체제는 우분투(Ubuntu)이다. 현재 시점에서 권장 버전은 Ubuntu 14.04 LTS (Trusty Tahr)이다. 

    우분투 14.04.2 LTS를 설치한다. 다만, ibgl1-mesa-dri 관련 의존성 문제가 있다. 다음 명령어로 의존성 파일을 설치한다.

    $ sudo apt-get install libgl1-mesa-dev-lts-utopic

    이후는 책에 있는 그대로 설치하면 된다 (42P부터).
    ros 사용전에 rosdep를 초기화한다. 

    $ sudo rosdep init
    이 결과로 의존된 패키지 경로를 다운로드하는 정보가 입력된 /etc/ros/rosdep/sources.list.d/20-default.list 파일이 갱신된다. 
    $ rosdep update

    rosinstall까지 설치를 끝냈으면, 환경설정파일을 불러온다. 이 파일에는 각종 ROS 환경 변수가 설정되어 있다. 

    $ source /opt/ros/indigo/setup.bash

    이제 catkin 등을 설치한다. 그리고, roscore 가 정상적으로 실행되면, 제대로 설치한 것이다. 

    2. 환경설정

    ROS가 설치된 후, 터미널에서 패키지를 실행할 때마다, setup.bash가 있는 곳을 ros에 알려줘야 한다. 귀찬으므로, 아래와 같이 bashrc 파일에 이 파일의 위치를 알려준다. 

    $ gedit ~/.bashrc 

    그리고, 다음 내용을 맨 아래에 추가한다.

    # Set ROS Indigo
    source /opt/ros/indigo/setup.bash
    source ~/catkin_ws/devel/setup.bash

    # Set ROS Network
    export ROS_MASTER_URI=http://xxx.xxx.xxx.xxx:11311
    export ROS_HOSTNAME=xxx.xxx.xxx.xxx

    # set ROS alias command
    alias cw='cd ~/catkin_ws'
    alias cs='cd ~/catkin_ws/src'
    alias cm='cd ~/catkin_ws && catkin_make'

    여기서 xxx는 본인 pc의 ip이다. 
    참고로, 이 내용은 책의 P47를 참조하면 된다. 본인의 PC환경에 맞도록 설정해 준다. 



    3. 개발환경 구축

    이 책에서는 QtCreator 를 개발 편집 에디터로 권장하고 있다. 

    $ sudo apt-get install qtcreator 

    $ qtcreator

    4. ROS 동작 테스트

    $ roscore

    $ rosrun turtlesim turtlesim_node

    $ rosrun turtlesim turtle_teleop_key

    $ rosrun rqt_graph rqt_graph

    3. ROS개념 정리

    마스터 - 노드와 노드사이의 연결과 메시지 통신을 위한 네임 서버와 같은 역활을 한다. roscore가 실행 명령어이다. 실행하면, 각 노드의 이름을 등록하고, 필요에 따라 정보를 받을 수 있다. 

    마스터는 접속하는 슬래이브들과의 접속 상태를 유지하지 않는 HTTP 기반의 프로토콜인 XMLRPC를 이용하여 슬레이브들과 통신한다. 이로 인해, 슬레이브가 다운되더라도, 마스터는 다운되는 일이 없으며, 슬레이브의 센서 노드 등이 일부 종료하더라도, 전체 시스템이 다운되는 일은 없다. 심지어, 다운된 센서 노드가 다시 기동하면, 이 데이터를 받는 노드는 다시 데이터를 받아 처리하도록 되어 있다. 이는 토픽-메시지 기반 데이터 처리 방식이기 때문에 가능한 것이다. 

    마스터는 사용자가 정해 놓은 ROS_MASTER_URL변수에 기재된 URI주소와 포트를 가진다. 사용자가 설정해 놓지 않으면, URI주소로 현재 로컬 IP를 사용하고, 11311포트를 이용한다.

    노드 - ROS 최소 단위의 실행 프로세서이다. 노드는 생성과 함께 마스터에 노드와 퍼블리셔, 서브스크라이버, 토픽, 서비스의 각 이름, 메시지 형태, URI 주소와 포트를 등록한다. 이 정보들을 기반으로 각 노드는 노드끼리 토픽과 서비스를 이용해 메시지를 주고 받는다.

    노드는 마스터와 통신할 때는 XMLRPC를 이용하고, 노드간 통신에는 XMLRPC나 TCPROS를 사용한다. 노드간 접속과 질의 응답은 XMLRPC를 사용하고, 메시지 통신은 노드간 직접 통신이므로 TCPPROS를 이용한다. URI주소는 노드가 실행중인 컴퓨터에 저장된 ROS_HOSTNAME 환경 변수 값으로 URI주소를 사용한다.

    패키지 - ROS 기본단위이다. ROS Indigo는 2015.3.5 기준으로 1,600개 (www.ros.org/debbuild/indigo.html) 패키지를 제공하며, 사용자 개발 공개 패키지는 5,340개 (http://rosindex.github.io/stats/) 정도이다.

    메타 패키지 - 공통 목적을 지닌 여러 패키지를 모아둔 패키지 집합이다. 

    메시지 - 노드 간에 데이터를 주고 받는 단위이다. 정수, 실수 변수의 구조체이며, 배열을 사용할 수 있다. 단방향 메시지 송수신 방식의 토픽과 양방향 메시지 요청/응답 방식의 서비스를 이용한다.

    토픽 - 스토리이며, 퍼블리셔(publisher) 노드가 하나의 스토리에 대해, 토픽이란 이름으로 마스터에 등록한 후, 이 스토리에 대해 메시지 형태로 퍼블리쉬한다. 토픽을 수신받기 위해서, 서브스크라이버(subscriber) 노드가 마스터에 등록된 토픽의 이름에 해당하는 퍼블리셔 노드의 정보를 받는다. 이를 기반으로 서브스크라이버 노드와 퍼블리셔 노드가 직접 연결해 메시지를 토픽으로 송수신한다.

    서비스 - 동기화된 메시지 처리 방식이다. 일회성 메시지 통신으로, 서비스 요청과 응답이 완료되면 연결된 두 노드의 접속은 끊긴다. 

    캐킨(catkin) - ROS빌드 시스템이다. 기본적으로 CMake를 이용한다. ROS는 CMake를 ROS에 맞도록 특화된 캐킨 빌드 시스템을 만들었다. 상세한 내용은 아래 링크를 참고한다.

    ROS빌드 - rosbuild는 catkin 빌드 시스템 이전에 사용된 것이다. 

    roscore - 멀티 roscore를 지원하는 특수한 경우를 제외하고, 같은 네트워크에서 하나만 구동된다. 

    파라미터 - 노드에서 사용하는 파라메터이다. 

    파라미터 서버 - 패키지에서 파라미터를 사용할 때, 각 파라미터를 등록하는 서버를 말한다. 

    rosrun - ROS 기본 실행 명령이다. 

    roslaunch - 여러 노드를 실행하는 명령이다. 패키지의 파라미터, 노드 이름, 노드 네임스페이스, ROS_ROOT, ROS_PACKAGE_PATH, 환경변수 등 옵션을 제공한다. *.launch파일을 이용해 실행 노드에 대한 설정을 한다. 

    bag - 주고 받는 메시지의 데이터를 저장할 수 있다. 기록 및 재생이 가능하다.

    리포지터리 - 리포지터리 패키지가 저장된 웹상의 URL 주소이다. git 등으로 다운로드 가능하다. 

    package.xml - 패키지 정보를 담은 XML파일로, 이름, 저작자, 의존성 패키지 등을 기술하고 있다. 

    ROS Wiki - 각 패키지와 기능을 설명하는 http://wiki.ros.org 이다. 지원하는 패키지 리스트는 http://www.ros.org/browse/list.php 에서 확인할 수 있다.

    ROS 업그레이드 명령 - 패키지 업그레이드 명령이다.
    $ sudo apt-get update && sudo apt-get upgrade

    다음은 노드 간 통신 방법을 보여준다. 


    4. ROS 파일 시스템
    1. 개요
    ROS설치 폴더는 /opt 폴더에 ros 폴더가 생성되고, 그 안에 roscore등 핵심 유틸리티 등이 설치된다. 만약, 이를 수정하고자 한다면, catkin에서 git clone을 이용해 설치하면된다.

    indigo 버전으로 설치하면 /opt/ros/indigo 가 설치되고, 그 안에 다음 내용을 포함한다.

    /bin 실행 파일
    /etc ROS 및 catkin 설정 파일
    /include
    /lib
    /share ROS 패키지
    env.* 환경설정파일
    setup.* 환경설정파일

    사용자 작업 폴더는 catkin workspace이다. 이 폴더는 다음과 같이 구성된다. 
    /build catkin 빌드 관련 파일
    /devel caktin 메시지, 서비스 헤더 파일과 사용자 패키지 라이브러리, 실행 파일
    /src 사용자 패키지

    사용자 패키지 폴더의 패키지는 다음과 같이 구성된다.
    /include
    /launch roslaunch 에 사용되는 launch파일
    /node rospy용 스크립트
    /msg 메시지 파일
    /src 코드 소스
    /srv 서비스 파일
    CMakeLists.txt 빌드 설정
    package.xml  패키지 설정

    2. ros-lastest.list 파일
    이외에 중요한 파일로, /etc/apt/sources.list.d 폴더에 있는 ros-lastest.list가 있다. 이 파일은 apt-get 으로 ros 패키지를 설치할 때 참조를 하는 웹사이트 URL이 입력되어 있다. 참고로, 우분투에서 제공하는 설치가능한 패키지는 http://packages.ubuntu.com/ 에서 별도로 검색할 수 있다. 이 웹사이트들에서 제공되는 패키지만 apt-get으로 설치된다. 


    여기서 dists 폴더를 확인하면, 각 ROS버전 종류별로 설치를 지원하는 패키지들을 확인할 수 있다. 2015.8.15 시점에서 wheezy의 경우, 다음과 같은 버전을 지원하고 있다.


    라즈베리파이에서 주로 사용하는 wheezy버전을 확인해보면, CPU종류별로 패키지 리스트를 제공하고 있는 것을 알 수 있다.


    이 중에 armel 버전을 확인해 보자. 파일이 3개 있는 데, 이 중에서 Packages 파일을 확인해 본다. 다음은 ROS에서 지원하는 패키지 리스트이다. 


    이 리스트에 패키지가 없으면, 'E: Unable to locate package'과 같은 아리송한 에러 메시지가 출력된다. 확인해 보면, wheezy 버전에서는 openni와 같은 패키지는 apt-get 설치를 지원하지 않는 것을 알 수 있다. 반면, trusty의 amd64 패키지는 openni2 설치를 지원하고 있는 것을 알 수 있다.


    구글링을 해 보면 wheezy기반으로 설치된 라즈베리안 기반 ROS에서 이런 패키지를 apt-get으로 설치하려는 사람들이 많은 것을 알 수 있다. 버전을 확인하지 않으면, 아까운 시간만 낭비된다. 설치 가능한 패키지를 알고 싶다면 다음 명령으로 확인 가능하다 (다만, ROS-Comm버전으로 설치하였을 경우, 실행이 제대로 안되는 경우가 있다).

    $ apt-cache search ros-indigo

    만약, apt-get으로 설치를 지원하는 경우가 아니면, git 등을 이용해 해당 패키지를 받아, 수동으로 빌드하고, 설치할 수 밖에 없다. github기반 설치 방법의 예는 다음 링크를 참고하라.

    5. ROS빌드 및 실행

    $ cd ~/catkin_ws/src

    catkin_create_pkg [패키지이름] [의존하는 패키지1] [의존하는 패키지2] 를 실행한다.

    $ catkin_create_pkg my_first_ros_pkg std_msgs roscpp

    이 경우, my_first_ros_pkg 폴더가 생성되고, 그 안에 다음 폴더가 생성된다. 

    include
    src
    CMakeLists.txt
    package.xml

    package.xml 파일은 이름, 의존성 패키지 등이 기술된다. 책의 P102를 참고해, 필요한 내용을 입력한다.

    CMakeLists.txt에 빌드할 소스 및 헤더 파일 등을 기술한다.

    ROS 패키지 목록 프로파일을 갱신한다.
    $ rospack profile 

    그리고, ROS 노드 소스를 코딩하고, 다음과 같이 빌드한다. 
    $ cd ~/catkin_ws && catkin_make

    실행은 다음과 같다. 
    $ roscore

    $ rosrun my_first_ros_pkg hello_world_node


    6. ROS 명령어 
    상세한 명령어는 P117나 wiki를 참고한다.

    roscd: 지정한 ROS패키지로 디렉토리 이동
    rosls: ROS 패키지 목록 확인

    roscore
    rosrun
    roslaunch
    rosclean: 로그파일 삭제
    rosnode: rosnode list (활성화된 노드 목록 확인), rosnode ping (지정된 노드와 연결 테스트), rosnode machine (해당 PC에서 실행되는 노드 목록 확인), rosnode kill(지정된 노드 실행 종료), rosnode cleanup (유령 노드 삭제)
    rostopic: rostopic list -v (토픽 리스트), rostopic echo (토픽 메시지 내용 실시간 확인), rostopic bw (토픽 메시지 데이터 대역폭 확인), rostopic hz (토픽 데이터 퍼블리쉬 주기 표시), rostopic info (토픽 정보 표시), rostopic pub (토픽 메시지 퍼블리쉬), 
    rosservice
    rosparam: rosparam list, rosparam get /, rosparam dump ~/parameters.yaml, rosparam set, rosparam load
    rosbag: rosbag record, rosbag info, rosvbag play
    rosmsg: rosmsg show,, rosmsg package
    rossrv
    rosversion

    catkin_create_pkg
    catkin_make
    catkin_eclipse
    catkin_find

    rospack
    rosinstall: ros 추가 패키지 설치
    rosdep: ros+dep. 해당 패키지의 의존성 파일 설치
    roslocate: ros 패키지 URI 위치 확인


    7. ROS Desktop 도구

    1. RViz
    $ sudo apt-get install ros-indigo-rviz
    $ rosrun rviz rviz

    2. rqt
    $ sudo apt-get install ros-indigo-rqt ros-indigo-rqt-common-plugins
    $ rqt_plot
    $ rqt

    $ sudo apt-get install ros-indigo-uvc-camera
    $ rosrun uvc_camera uvc_camera_node
    $ rqt

    $ rosrun turtlesim turtlesim_node
    $ rosrun turtlesim turtle_teleop_key
    $ rosrun uvc_camera uvc_camera_node

    $ rosrun turtlesim turtlesim_node
    $ rqt

    $ rqt_plot /turtle1/pos

    $ rosrun turtlesim turtle_teleop_key

    $ rosrun uvc_camera uvc_camera_node
    $ rosbag record /image_raw
    $ rqt


    8. ROS 기본 프로그래밍

    P172를 참고해, 프로그래밍한다.

    $ cd ~/catkin_ws/src
    $ catkin_create_pkg oroca_ros_tutorials std_msgs roscpp
    $ ls
    $ gedit package.xml
    $ gedit CMakeLists.txt
    $ roscd oroca_ros_tutorials
    $ mkdir msg
    $ cd msg
    $ gedit msgTutorial.msg
    int32 data
    $ roscd oroca_ros_tutorials/src
    $ gedit ros_tutorial_msg_publisher.cpp
    int main()
    {
       ros::Publisher ros_tutorial_pub = ...
       ros::Rate loop_rate(10);
       while(ros::ok())
       {
          oroca_ros_tutorials::msgTutorial msg;
          msg.data = count;
          ros_tutorial_pub.publish(msg);
          loop_rate.sleep();
       }
    }

    $ roscd oroca_ros_tutorials/src
    $ gedit ros_tutorial_msg_subscriber.cpp
    void msgCallback(const oroca_ros_tutorials::msgTutorial::ConstPtr& msg) {
       ...
    }

    int main(...)
    {
       ros::NodeHandle nh;
       ros::Subscriber ros_tutorial_sub = nh.subscriber("ros_tutorial_msg", 10, msgCallback);
       ros::spin();
    }

    $ cd ~/catkin_ws
    $ catkin_make

    이 결과로 /catkin_ws의 /build와 /devel 에 생성된다. devel/lib 에는 실행파일이, devel/include/oroca_ros_tutorials 에는 메시지 헤더 파일이 생성된다. 

    $ rosrun oroca_ros_tutorials ros_tutorial_msg_publisher
    $ rostopic list
    $ rostopic echo /ros_tutorial_msg

    $ rosrun oroca_ros_tutorials ros_tutorial_msg_subscriber

    $ rqt_graph
    $ rqt

    매계변수는 소스 내에서 다음과 같이 사용한다.
    nh.setParam("calculation_method", PLUS);
    nh.getParam("calculation_method", g_operator);

    $ cd ~/catkin_ws && catkin_make
    $ rosrun oroca_ros_tutorials ros_tutorial_srv_server
    $ rosparam list

    roslaunch 다음과 같다.
    $ roscd oroca_ros_tutorials
    $ mkdir launch
    $ cd launch
    $ gedit union.launch
    <launch>
       <group ns="ns1">
          <node pkg="..." type"..." name="..."/>
          <node pkg="..." type"..." name="..."/>
       </group>
       ...
    </launch>

    9. 로봇 및 센서 패키지
    $ apt-cache search ros-indigo
    $ sudo apt-get install ros-indigo-pr2-desktop

    만약, 공식적으로 제공되지 않은 버전이면 다음과 같이 소스를 받아 빌드할 수 있다.
    $ cd ~/catkin_ws/src
    $ hg clone http://code.google.com/p/amor-ros-pkg/

    공개 패키지는 http://www.ros.org/debbuild/indigo.html 에서 확인할 수 있다. 다음 페이지에서 패키지 리스트를 검색할 수 있다.

    http://www.ros.org/browse/list.php

    패지키를 설치하기 전에, cakin인지, rosbuild인지, 오픈소스 라이센스는 무엇인지, 패키지 오픈소스 리포지터리 주소, 패키지 의존 관계를 확인한다. 의존 패키지는 사용전에 반듯이 설치해야 한다. 

    pi_face_tracker의 예는 다음과 같다.

    $ git clone https://github.com/ericperko/uvc_cam.git
    $ rosdep install uvc_cam
    에러가 발생하면, rosdep 관련 링크를 참조한다.

    $ rosmake uvc_cam

    참고로, 라즈비안 기반 ROS 버전에서는 앞의 패키지를 제대로 지원하지 않는다. 


    10. 센서 정보 취득
    1. USB카메라
    $ sudo apt-get install ros-indigo-uvc-camera
    $ sudo apt-get install ros-indigo-image-*
    $ sudo apt-get install ros-indigo-rqt-image-view
    라즈비안 기반 ROS에서는 지원하지 않는다.

    $ roscore
    $ roscore uvc_camera uvc_camera_node
    $ rostopic list
    $ rosrun image_view image_view image:=/image_raw
    $ rqt_image_view image:=/image_raw
    $ rosrun rviz rviz

    2. 원격 이미지 전송
    $ gedit ~/.bashrc
    export ROS_MASTER_URI = [마스터 노드 pc ip설정]
    export ROS_HOSTNAME =[본인 ip설정]

    $ roscore
    $ rosrun uvc_camera uvc_camera_node

    3. 카메라 캘리브레이션
    $ sudo apt-get install ros-indigo-camera-calibration
    $ rosrun uvc_camera uvc_camera_node
    $ rostopic echo /camera_info

    체스보드를 준비하여, 캘리브레이션을 한다. 상세한 내용은 P220을 참고한다. 

    3. 레이저 레인지 파인더(LRF)
    LRF중 하나인 RpLiDAR의 예는 이전 글을 참조하라.

    4. RGB-Depth Camera
    RGB-D중 하나인 Xtion을 이용한 예를 설명한다.

    $ sudo apt-get install ros-indigo-openni2-camera ros-indigo-openni2-launch

    $ tar -xvf Sensor-Bin-Linux-x64-v5.1.0.41.tar.bz2
    $ cd Sensor-Bin-Linux-x64-v5.1.0.41/
    $ sudo sh install.sh

    $ roscore
    $ roslaunch openni2_launch openni2.launch
    $ rviz
      [Global options] -> [Fixed Frame] -> camera_depth_frame
      [Add] -> [PointCloud2]


    11. 모바일 로봇
    1. 터틀봇/거북이

    센서 값 확인은 다음과 같다.
    $ rostopic echo /mobile_base/sensors/core
    $ rostopic echo /odom
    $ rostopic echo /tf

    진단 정보 확인은 다음과 같다.
    $ sudo apt-get install ros-indigo-rqt-robot-monitor
    $ rosrun rqt_robot_monitor rqt_robot_monitor

    계기판 실행은 다음과 같다.
    $ sudo apt-get install ros-indigo-kobuki-desktop
    $ rosrun kobuki_dashboard kobuki_dashboard

    테스트는 다음과 같다.
    $ rosrun kobuki_testsuite test_events.py

    이외에 가상 시뮬레이션, 네비게이션 등이 가능하다
    $ gazebo


    12. SLAM및 네비게이션
    거북이를 이용해, 실습을 한다.
    $ sudo apt-get install ros-indigo-kobuki*
    $ sudo apt-get install ros-indigo-gmapping
    $ sudo apt-get install ros-indigo-navigation
    $ sudo apt-get install ros-indigo-openni2*

    이후 다음과 같이 실행한다.

    catkin을 실행해 빌드한다.
    slam 패키지를 실행한다.
    rviz 로 확인한다.
    roslaunch kobuki_keyop safe_keyop.launch 로 실행한다.


    13. 로봇암
    URDF, MoveIt, 제어패키지를 설치한다 (P346).

    $ sudo apt-get install liburdfdom-tools
    $ sudo apt-get install ros-indigo-moveit*
    $ sudo apt-get install ros-indigo-arbotix*
    $ sudo apt-get install ros-indigo-ros-control
    $ sudo apt-get install ros-indigo-ros-controller
    $ sudo apt-get install ros-indigo-joint-state-controller
    $ sudo apt-get install ros-indigo-effort-controllers
    $ sudo apt-get install ros-indigo-position-controllers
    $ sudo apt-get install ros-indigo-joint-trajectory-controller


    액추에이터 제어 패키지를 설치한다 (P382).
    $ sudo apt-get install ros-indigo-dynamixel*
    ...


    14. 유용한 ROS 명령어
    ROS 명령어를 요약한다.

    1. roscore
    2. rosnode
    3. rosrun
    4. roslaunch
    5. rostopic
    rostopic pub topic std_msgs/String "'on'" QA#1
    6. catkin_make

    핵심적으로 많이 사용되는 명령어이다.