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 + 터틀 키보드 제어 노드

기타 레퍼런스

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포스를 느껴보자 ㅎ)




라즈베리파이2에 ROS 이미지 설치하기

라즈베리파이는 리눅스 기반으로 동작되는 초소형 컴퓨터이다. 로봇 개발 관점에서, 이 컴퓨터를 이용하면, 매우 저렴한 비용으로, 다양한 센서에서 데이터를 취득하거나, 엑추에이터를 제어할 수 있다. 그러므로, ROS와 연동하면 금상첨화일 것이다. 이 글은 라즈베리파이2에 ROS를 설치하는 방법을 설명한다. 이 내용은 ZRob314의 Raspberry Pi and ROS를 참고하였다. 다만, 욕심이 과도해, rviz 등을 설치하려 하지 않는다. 정신 건강상 매우 해로운 일이다.
TurtleBot2 + raspberrypi + xtion + ROS (표윤석)

1. 작업 준비물
라즈베리파이2
8GD SD Card
HDMI 입력 모니터
HDMI 케이블
USB 키보드/마우스
Micro USB 전원선

2. SD카드 이미지 쓰기

아래 링크에서 리눅스에 ROS가 설치된 이미지를 다운 받는다.
그리고, 윈도우즈에서 win32 image writer를 이용해, SD Card에 이미지를 쓴다.
만약, 리눅스 환경이라면, 아래와 같이 dd 명령을 이용해, SD Card에 이미지슬 쓴다.

sudo dd if=/home/username/Downloads/Raspbian-ROS-full.img of=/dev/sdc

3. Rosberry 시작하기

SD Card를 라즈베리파이에 넣고, 부팅을 한다. 그리고, 다음과 같이 입력한다.

Username: pi
Password: raspberry

데스크탑이 실행된 후, Ctrl+Alt+t 키를 눌러 터미널을 실행한다. 그리고, 터미널에 다음과 같이 입력한다.

roscore

정상적으로 실행되면 성공한 것이다.

4. ROS 튜토리얼

roscore에 메시지를 publish 하고, 이 메시지를 subcribe 하는 예제를 간단히 실행해 보겠다. 다음과 같이 터미널에 입력해 본다.

rosrun roscpp_tutorials talker

그럼, 다음과 같이 메시지 publish가 시작될 것이다. 이제, 메시지 구독을 위해, 다음과 같이 입력한다.

rosrun roscpp_tutorials listener

그럼, 똑같은 데이터가 터미널에 출력될 것이다. 이 상황을 노드 그래프로 확인해 보자. 다음과 같이 입력한다.

rxgraph

그럼, 실행되고 있는 노드와 입출력되는 메시지가 보일 것이다. 좀 더 해 보고 싶은 사람은 ROS Tutorials를 참고하길 바란다.

후기 - 실제로 이 작업을 수행해 본 결과, 라즈베리파이 보드 종류와 SD카드 종류에 따라 안되는 경우가 발생하였다. 해당 레퍼런스의 리플들을 확인하면, 이미지 호환성이 그리 좋지 않다는 것을 알 수 있다. 만약, 삽질을 줄이고 싶다면, Desktop 버전은 ROS작업상 불필요하다면, 설치하지 말고, Comm 버전을 설치한다.




라즈베리파이 우분투 14.04 기반 ROS Desktop 설치 요약

아두이노, 라즈베리파이(RPi)와 같은 저렴한 보드에서 가져온 센서 데이터를 ROS의 특정 노드에서 전달 받거나, 특정 노드에서 제어 명령을 이런 보드에 전달하고 싶을 때가 있다. 이와 관련된 내용을 요약한다. 이 내용은 오로카에서 활동중이신 GroundZero님, ubuntu wiki (Raspbeery Pi에 Ubuntu 14.04 LTS 설치) 및 ROS wiki(Ubuntu ARM install of ROS Indigo) 사이트 글을 참고로하였다.

RPi + ROS에 대한 소개는 다음 슬라이드를 참고한다.
참고 - 실제 설치해 보니, 위 레퍼런스대로 해도 문제가 발생하는 경우가 꽤 있다. 이중 몇몇 부분은 다시 재설치해야 해서, 하루 종일 밤새며 3번 설치해야 했다. 각 단계에서 주의할 부분이 있으면 표시했으니 참고하길 바란다. 만약 각 패키지들을 설치하다가 에러가 발생하면, sudo apt-get upgrade 로 업그레이드한 후 다시 설치한다. 불필요하다면, 삽질을 피하기 위해서는 rviz와 같은 desktop버전을 설치하지 않는다.

1. 라즈베리파이2에 우분투 14.04 LTS 설치

1. 우분투 이미지 쓰기

아래 링크에서 우분투 이미지를 다운로드하여, win32diskimager를 이용하여, SD 메모리 카드에 이미지를 쓴다. 단, SD 메모리 카드는 최소 8기가 이상이어야 한다.
그리고, 라즈베리파이에 SD 메모리카드를 넣고, 부팅한다.
기본 계정과 패스워드는 ubuntu, ubuntu 이다. 패스워드 수정은 "sudo passwrd root" 명령을 이용한다.

이후, 로케일 등을 제대로 설정하고, 우분투를 최신 버전으로 업데이트한다.

$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

$ sudo ntpdate time.kriss.re.kr

2. 파일 시스템 설정

SD 메모리카드에 할당되지 않은 디스크 공간을 사용하기 위해서, 다음 명령을 이용해 파티션을 재설정한다.

$ sudo fdisk /dev/mmcblk0

fdisk 화면에서 두 번째 파티션을 삭제하기 위해, "d", "2"를 입력한다. 그리고, 파티션을 확장하기 위해 차례대로, "n", "p", "2", 엔터, 엔터, "w"를 입력한다.

다음과 같이 명령어를 입력한다.

$ sudo reboot

$ sudo resize2fs /dev/mmcblk0p2

$ sudo apt-get install dphys-swapfile

3. 네트워크 설정

WiFi 동글을 가지고 있다면, 다음과 같은 패키지를 설치한다.

$ sudo apt-get install linux-firmware

$ sudo apt-get install wireless-tools wpasupplicant

4. GUI 데스크탑 설치

다음 명령어를 입력해 GUI 데스크탑을 설치한다.

$ sudo apt-get install lubuntu-desktop

$ sudo apt-get install openssh-server

$ sudo apt-get install ssh

$ sudo apt-get install xserver-xorg-video-fbturbo

그리고, xorg.conf를 다음과 같이 수정하고, 업데이트한다.

$ sudo nano /etc/X11/xorg.conf

Section "Device"
    Identifier "Raspberry Pi FBDEV"
    Driver "fbturbo"
    Option "fbdev" "/dev/fb0"
    Option "SwapbuffersWait" "true"
EndSection

$ sudo apt-get update
$ sudo apt-get upgrade

VideoCore 패키지를 설치한다.

$ sudo apt-get install libraspberrypi-bin libraspberrypi-dev

이 패키지의 컴파일을 위해, 적절한 위치의 폴더 링크를 생성한다. 그리고 설치한다.

$ sudo ln -s /usr /opt/vc

$ sudo apt-get install libraspberrypi-bin-nonfree

빌드 도구를 설치한다.

$ sudo apt-get install build-essential -y

만약 시리얼 콘솔을 설정하려면 다음과 같이 /boot/cmdline.txt 를 수정한다. 다만, 이 부부분은 잘못 수정하면 우분투 부팅이 되지 않는 경우가 있다. 주의해서 수정하고, 작업전에 백업을 만들어 두도록 한다. 만약, 부팅이 안되는 경우, 다른 PC에서 본 메모리 카드를 삽입하고, cmdline.txt파일을 원본으로 되돌린다.

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootwait

그리고 /etc/init/ttyAMA0.conf 파일에 아래와 같이 내용을 추가한다.

start on stopped rc or RUNLEVEL=[12345]
stop on runlevel [!12345]

respawn
exec /sbin/getty -L 115200 ttyAMA0 vt102

다 설치하였으면 재부팅한다.

$ sudo reboot

2. ROS Indigo 설치

1. Locale 설정

ROS 도구가 요청하는 시스템 Locale 정보를 위해, 이를 설정한다.

sudo update-locale LANG=C LANGUAGE=C LC_ALL=C LC_MESSAGES=POSIX

2. Sources.list 설정

이 설정은 Trusty armhf (14.04)용이다.

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'

3. Key 설정


wget https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add -

4. 설치

데비안 패키지 최신 버전으로 업데이트한다.

sudo apt-get update

ROS-base를 설치한다.

sudo apt-get install ros-indigo-ros-base

기타 패키지를 설치한다.

sudo apt-get install ros-indigo-PACKAGE

예를 들어, 아래와 같이 설치한다. 다만, 이 부분에서 unmet dependencies 에러가 나는 경우가 있다. libqt4-opengl-dev에서 발생하나, 아직 정확한 원인을 찾지는 못하였다.

sudo apt-get install ros-indigo-navigation

참고로, 설치 가능한  패키지는 다음 명령으로 확인 가능하다.

apt-cache search ros-indigo

설치 패키지 용량은 ROS-base가 407MB, 전체 설치 용량은 572MB이다.

5. rosdep 초기화

ROS를 사용하기 전에, rosdep 를 초기화한다. rosdep 는 컴파일 시 핵심 컴포넌트 실행에 요구되는 소스 의존성을 고려해, 패키지 설치를 쉽게할 수 있도록 도와준다.

sudo apt-get install python-rosdep
sudo rosdep init
rosdep update

6. ROS 환경 설정

ROS 환경변수를 터미널이 열릴때마다 자동적으로 적용되도록 설정한다.

echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
source ~/.bashrc

7. rosinstall 설치

rosinstall은 ROS 패키지의 수많은 소스 트리를 쉽게 다운로드할 수 있도록 한다.

sudo apt-get install python-rosinstall

8. OS 이름 확인

/etc/lsb-release 에 있는 OS이름이 다음과 같은지 확인해 본다.

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04"

9. catkin 작업공간 설정

catkin 작업공간을 아래 명령으로 설정한다.
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws

catkin 메이크를 테스트해본다.
catkin_make

catkin 빌드환경을 다음 명령어로 설정한다.
source ~/catkin_ws/devel/setup.bash
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

마지막으로 roscore를 실행해 본다. 정상으로 실행된다.

10. 튜토리얼 실행

다음 링크에는 다양한 ROS 튜토리얼이 있다. 한번 실행해 본다.

ROS conference 모습

후기 1

모든 작업을 마치면, roscore가 잘 돌아간다. 모두 설치하면, roscore등 핵심적인 실행파일은 정상적으로 동작한다. ros를 라즈베리파이에서 설치하다보면, 밤새는 일은 다반사라, 머리가 새하얗게 되는 듯한 느낌이다.

헐~ 


이런 삽질에서도 git, opengl을 사용하는 qt와 같은 패키지들은 제대로 설치가 안된다. opengl은 그렇다 쳐도, git이 안되다니, 정말 황당할 뿐이다. 전체 패키지를 모두 설치/재설치하느라 밤 11시 부터 현재 새벽 5시까지 설치했었는데 말이다. 최종적으로 libgles2-mesa-dev unmet dependencies 문제가 발생한다. 이 문제는 원본 레퍼런스의 패키지 버전들과 현재 시점에서 설치되는 패키지 버전간 불일치로 추측된다.

이와 관련해, 구글링을 오랜 시간에 걸쳐 해 보았으나, 다들 비슷한 문제를 질문하고 있으며, 명확한 해결책은 아직 발견하지 못하였다. 다른 일들도 많은 데, 이런 삽질에 시간이 가고 있다니...


후기 2

이런 문제가 골치아파, 라즈베리안을 기반으로 설치하고 싶다면, 아래 링크를 참고하라. 본인은 이 레퍼런스를 기반으로 다시 ROS를 재설치하고 있다. 현재 새벽 6시인데, 아직은 잘 설치되고 있다. 잘 되면, 다시 글을 정리해 업로드하도록 하겠다. 제길...

레퍼런스


ROS 요약 정리

로봇 개발 시 최근 많이 사용하기 시작한 ROS에 대해 간단히 요약한다.

1. 개요

ROS는 로봇 운영 체계(robot operating system) 이다. 플랫폼 개념으로 개발되었다. 다양한 로봇관련 센서와 액추에이터를 제공하고 있다.

2. 특징

1. ROS는 노드와 그래프란 개념으로 로봇을 구동시킨다. 노드는 센서에서 데이터 취득, 액추에이터 구동, 알고리즘 실행의 단위가 된다. 이런 노드를 모아둔 것을 패키지라 한다.
2. 노드에서 다른 노드로 데이터를 보내는 것은 메시지란 개념으로 통해 전달된다.  
3. 노드 간 통신은 TCP/IP 스택 기반 데이터 통신을 한다. 하나의 네트웍 상에서 동작한다. 그러므로, 같은 네트웍의 node간 데이터 통신은 매우 쉽다.
4. 메시지를 발행하는 노드는 publisher, 메시지를 받는 노드들을 subscriber 라 한다.
5. 각 노드는 별도의 프로세스처럼 동작한다.
6. 발행된 메시지를 기록하는 rosbag 명령이 있으며, 기록된 메시지를 재생할 수 있다.
7. 유명한 센서, 액추에이터, 로봇 플랫픔은 이미 패키지로 개발된 것이 있다.
8. 데이터 가시화를 위한 rviz 프로그램이 있다.
9. 3차원 시뮬레이션을 위한 gazebo 프로그램이 있다.
10. 관절 암 시뮬레이션을 위한 moveit 프로그램이 있다.

3. SLAM과 위치추정

SLAM과 위치추정은 서로 많은 관계가 있다. 노이즈가 있는 센서 데이터를 통해, 위치를 추정할 경우, 칼만 필터나 파티클 필터를 사용하는 경우가 많다. 네비게이션을 수행할 때, 성능을 고려한다면 DWA(dynamic window approach)를 사용한다. 파티클 필터의 경우, 초기화, 예측, 보정, 위치추정, 재추출 단계를 거친다.

4. 주의사항

1. 불완전한 roscore 및 node 종료
가끔, 불완전하게 종료된 roscore, node로 인해, 관련 패키지들이 제대로 동작하지 않는 경우가 있다. 이때는 프로세스를 강제 종료시키거나, 재부팅해야 한다.

2. 패키지 빌드과정에서 누락된 패키지
가끔 패키지 빌드과정에서 누락된 패키지가 있다. 이 경우에는 구글링 노가다를 통해, 문제를 해결할 수 밖에 없다.

3. 네트웍 문제
트래픽이 많은 네트웍에서 실행하면, 메시지가 제대로 전달안되는 경우가 발생할 수 있다.




picamera 사용기

라즈베리파이2와 쉽게 연결되는 picamera는 HD 동영상 캡쳐를 지원한다. 이와 관련된 글을 정리한다.



레퍼런스

2015년 8월 2일 일요일

TK1 (Tegra K1) 스펙과 배터리

TK1 장비는 Nvidia에서 개발한 고성능 GPU가 포함된 개발자용 소형 컴퓨터이다. 이와 관련해, 스펙과 배터리팩 사용 방법에 관한 링크를 남긴다.
드론에 실을 생각으로, 무게를 재어 봤다. 144g. 이정도면 괜찬은 거다.