CAFE

My Robot

ODROID-X2 보드로 kobuki 터틀봇 구동하기

작성자매발톱|작성시간13.09.16|조회수1,829 목록 댓글 0
Odroid-X2 보드는 국내 임베디드개발업체인 하드커널 사에서 만든 임베디드 ARM 보드입니다.
(참고: http://www.hardkernel.com/renewal_2011/products/prdt_info.php?g_code=G135235611947)
사양은 1.7GHz 쿼드코어 삼성 Exynos 4412 CPU, Mali400 GPU, 2GB RAM 을 장착하고 있으며, 6개의 USB 2.0 포트, 이더넷 포트, HDMI 포트, 그리고 LCD/I2C/UART/ADC/GPIO 용으로 사용할 수 있는 50핀의 확장포트를 포함하고 있습니다. 소프트웨어로는 안드로이드, Linaro 우분투 리눅스를 공식적으로 지원하고 있으며, 성능이 우수하여, 기존의 터틀봇에서 사용하는 넷북 대신 구동용으로 사용하였습니다. Odroid-X2 보드에 설치한 리눅스는 우분투 12.11 버전(for ROS Groovy 버전) 및 우분투 13.04 버전(for ROS Hydro 버전)을 사용하였고, ROS 소프트웨어는 현재 Groovy/Hydro 버전이 터틀봇과 관련된 대부분의 패키지들을 제공하여 선택하였습니다.

구체적인 설치환경은 다음과 같습니다.

- 하드웨어: Odroid-x2, Kobuki turtlebot 구동로봇, 프레임, MS kinect, 5V/2A 차량용 시거잭, 기타 케이블들
- 소프트웨어: robroyhall 님의 Ubuntu 12.11 Fullyloaded Image for ROS Groovy version ( http://forum.odroid.com/viewtopic.php?f=15&t=966 ) 또는 ㅕUbuntu 13.04 Dream Machine Image for ROS Hydro version ( http://forum.odroid.com/viewtopic.php?f=15&t=1406 ), OpenNI 1.5.2.1, SensorKinect 1.5.4.0, assimp 3.0, mali400-dev, 다양한 ROS 패키지들

1) 하드웨어 제작

Odroid-x2 보드에는 5V, 최대 2A DC 전원을 공급하도록 되어 있습니다. 사용해보니 USB 쿨링팬, 무선랜카드, 무선키보드/마우스, kobuki 구동부와의 USB 시리얼 케이블, 키넥트를 연결하니 최대 1.4~1.5A 정도까지 전력을 소모하더군요. 로봇을 구성하는 모든 장치에 공급되는 전원을 kobuki 구동로봇이 담당하도록 하려면 로봇과 보드의 전원을 연결되는 부분을 제작하여야 합니다.

kobuki 구동로봇이 제공하는 4개의 전원포트들은 다음과 같습니다.
- 5V/1A : Molex Connector 43540-0218 for custom boards
- 12V/1.5A : Molex 43045-0224 specially supporting the kinect
- 12V/5A : Molex 5566-02B2 for high powered accessories
- 19V/2A : Molex 3928-9068 for recharging netbooks

여기서, 12V/1.5A 포트는 키넥트에 전원을 공급합니다. 19V/2A 포트는 넷북 충전용으로 Kobuki 에 어댑터 전원이 연결되지 않으면 전원이 공급되지 않아 odroid  보드 전원 공급용으로는 불가능합니다. 또한,  무선랜/키넥트/kobuki USB 직렬연결된 상태에서 odroid 보드가 열심히 구동할 때 1.5A 정도까지 전류를 소모하므로 5V/1A 포트도 사용이 불가능합니다. 결국 12V/5A 포트를 활용하였습니다.
kobuki 와 odroid 보드쪽 연결 커넥터는 다음 링크에서 판매하는 것을 확인할 수 있습니다.
molex 5557-02R for kobuki 12V/5A port:  http://www.eleparts.co.kr/EPX37RHL
39-00-0038 crimp for 5557 connector:  http://www.eleparts.co.kr/EPX3BHX7
PP-012 power plug for odroid-x2 board:  http://www.eleparts.co.kr/EPX6BMK8

5V/2A 정도의 전원을 안정적으로 공급할 수 있는 레귤레이터의 경우에는, 78S05 (5V/2A) 와 같은 리니어 레귤레이터를 사용하면 전압 강하시 발열량이 상당하고 효율이 떨어지므로, 효율이 높은 LM2576 과 같은 스위칭 레귤레이터를 사용하는 것이 바람직합니다.
만드는 방법은 여러가지가 있는데, 직접 부품을 연결하는 것보다 이미 만들어져 있는 제품을 사용하면 편리합니다. 예를 들면, 다음과 같은 링크들에서 이미 판매하고 있는 관련제품들을 확인할 수 있습니다.
http://www.eleparts.co.kr/EPX384CH
http://www.eleparts.co.kr/EPX33L49

그런데 이런 제품들을 사용하는 대신 같은 부품을 사용하여 5V/2A 까지 제공하는 차량용시거잭을 사용해도 되겠더군요. 그래서 관련제품을 찾아보고 아래 제품들과 커넥터용 부품을 구입하여 kobuki 쪽 커넥터만 연결하여 제작하였습니다.
http://item2.gmarket.co.kr/Item/detailview/Item.aspx?goodscode=160552809
http://item2.gmarket.co.kr/Item/detailview/Item.aspx?goodscode=254402667

최종적으로 제작된 모습은 다음과 같습니다.


2) 소프트웨어 설치

ARM 보드에 ROS 를 설치하려면 여러가지 문제를 해결해야 합니다. 우분투의 ROS ARM 버전 패키지들을 활용하려고 해도 x86 패키지들처럼 완전하게 존재하지도 않는데다가 그나마 터틀봇이 구동되는 Groovy 버전의 경우에도 alignment 버그 패치가 아직 적용되지 않는 등 문제점이 많습니다.

어쨌든 몇가지 문제점이 있지만 현재까지 해결된 설치방법을 설명하겠습니다. Kobuki 터틀봇을 위한 Odroid-X2 보드용 ROS 는 기본적으로 우분투 ROS ARM 의 Groovy 버전 패키지들을 활용하되 나머지 수정할 필요가 있는 패키지들과 아직 패키지가 존재하지 않는 OpenNI, PCL, rviz 등의 패키지들은 직접 소스코드를 다운로드하여 빌드하였습니다. Groovy 버전의 경우에는 소스코드 빌드 과정이 catkin 을 이용한 빌드와 rosbuild 를 이용한 빌드로 나누어지고 새로 나온 Hydro 버전은 catkin 만으로 빌드됩니다. 이 중에서 단계 1과 4는 Groovy 과 Hydro 버전이 거의 비슷하지만 단계 2와 3 인 ROS 설치 부분은 완전히 다르므로 아래에서 적절하게 구분해서 설치하시기 바랍니다.

빌드 과정은 총 4단계로 나누어 보았습니다. 우분투 개발환경 및 OpenNI/SensorKinect 설치 -> ROS 초기화 및 의존패키지설치 -> catkin/rosbuild 워크스페이스 빌드 -> 보드설정 및 터틀봇 구동 순입니다.

단계 1. Ubuntu 개발환경 및 OpenNI/SensorKinect 드라이버 설치

SD 카드를 16GB 이상으로 준비하신 후에 ODROID-X2 보드용 우분투 이미지를 SD/eMMC 카드에 설치한 후 GParted 파티션 매니저를 사용해서 루트파일시스템의 용량을 최대한 늘려줍니다.
Groovy 버전의 경우 PCL 을 컴파일하기 위해서는 스왑공간을 1GB 이상 설정해야 합니다. Hydro 버전의 경우 PCL 은 우분투 패키지 설치가 가능하므로 소스코드를 빌드하기 위해 스왑 공간을 잡을 필요가 없습니다.
스왑 공간은 SD 카드에 스왑파티션을 만들거나 스왑파일을 등록하면 됩니다. 스왑파티션은 디스크도구를 사용하면 되고, 스왑파일은 다음과 같은 명령을 실행하면 됩니다.
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024    # 1GB
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
부팅시에 스왑공간이 등록되도록 하려면 /etc/fstab 파일에 다음 항목을 추가합니다.
/swapfile    swap    swap    defaults    0 0 
스왑공간의 설치여부는 “cat /proc/swaps” 이나 “free” 명령을 실행하여 확인할 수 있습니다.
linaro@linaro-ubuntu-desktop:~$ free
             total       used       free     shared    buffers     cached
Mem:       1990112    1069872     920240          0      47460     483344
-/+ buffers/cache:     539068    1451044
Swap:      1048572          0    1048572

다음으로 OpenNI 패키지와 SensorKinect 드라이버를 설치합니다. MS Kinect 장치를 위한 OpenNI 는 2가지 버전이 있습니다. OpenNI 1.x 버전과 SensorKinect 드라이버를 설치하는 것과 OpenNI2 버전과 freenect 드라이버를 설치하는 방법입니다. 하지만, 다음에 설치할 PCL 1.7 버전이 OpenNI 1.x 버전을 필요로 하므로 OpenNI 1.x 버전은 반드시 설치하여야 합니다.
(OpenNI 2.x 버전은 기회가 되면 다음에 설명하겠습니다)

먼저 다음과 같은 의존 패키지들을 설치합니다.
$ sudo apt-get install openjdk-6-jdk
$ sudo apt-get install freeglut3-dev libusb-1.0-0-dev doxygen graphviz

이제 OpenNI 소스코드를 다운로드하고 빌드하여 설치합니다.
$ mkdir openni; cd openni
$ git clone https://github.com/OpenNI/OpenNI.git -b unstable
(또는 git clone https://github.com/jspricke/debian-openni )
$ cd OpenNI
Platform/Linux/Build/Common/Platform.Arm 파일을 편집하여 다음 내용을 수정합니다.
- CFLAGS += -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-mcpu=cortex-a8
+ CFLAGS += -march=armv7-a -mtune=cortex-a9 -mfpu=neon -mfloat-abi=hard


Platform/Linux/CreateRedist/Redist_OpenNi.py 파일을 편집하여 352 번째 줄을 수정합니다.
-    samples_list.remove('NiViewer')
+#   samples_list.remove('NiViewer')


다음 명령을 실행하여 전체 소스코드를 빌드합니다.
 $ cd Platform/Linux/CreateRedist
$ ./RedistMaker.Arm
빌드가 완료되면 Redist 폴더가 만들어져 있을 겁니다. 이 디렉토리에 들어가서 OpenNI 패키지를 시스템에 설치합니다.
$ cd ../Redist/OpenNI-Bin-Dev-Linux-Arm-v1.5.4.0/
$ sudo ./install.sh

나중에 PCL 등 OpenNI 에 의존하는 패키지에서 참조할 수 있도록 다음과 같은 내용의 패키지 설정파일 libopenni.pc를 /usr/lib/pkgconfig/libopenni.pc 로 만들어 줍니다.
(또는 debian-openni 소스코드를 사용한 경우에는 $ cp debian/libopenni.pc /usr/lib/pkgconfig 를 실행시켜 줍니다)
=========
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/ni

Name: OpenNI
Description: A general purpose driver for all OpenNI cameras.
Version: 1.5.4.0
Cflags: -I${includedir}
Libs: -L${libdir} -lOpenNI
===============

다음으로 SensorKinect 드라이버의 소스코드를 다운로드하고 빌드합니다.
$ cd ~/openni
$ git clone https://github.com/avin2/SensorKinect.git
$ cd SensorKinect

Platform/Linux/Build/Common/Platform.Arm 파일을 편집하여 다음 내용을 수정합니다.
- CFLAGS += -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-mcpu=cortex-a8
+ CFLAGS += -march=armv7-a -mtune=cortex-a9 -mfpu=neon -mfloat-abi=hard

Source/XnDeviceSensorV2/XnExportedSensorDevice.cpp 파일의 36번째 줄과 XnSensor.cpp 파일의 47번째 줄을 수정합니다.
- #if (XN_PLATFORM == XN_PLATFORM_LINUX_ARM || XN_PLATFORM == XN_PLATFORM_ANDROID_ARM)
+ #if (XN_PLATFORM == XN_PLATFORM_ANDROID_ARM)

다음 명령을 실행하여 전체 소스코드를 빌드합니다.
$ cd Platform/Linux/CreateRedist
$ ./RedistMaker Arm

드라이버가 빌드되면 Redist 폴더가 만들어져 있을 겁니다. 이 디렉토리에 들어가서 드라이버를 시스템에 설치합니다.
$ cd ../Redist/Sensor-Bin-Linux-Arm-v5.1.2.1/
$ sudo ./install.sh

MS Kinect 장치를 연결하고 lsusb 명령으로 장치를 확인합니다.
$ lsusb

Bus 001 Device 008: ID 045e:02b0 Microsoft Corp. Xbox NUI Motor
Bus 001 Device 009: ID 045e:02ad Microsoft Corp. Xbox NUI Audio
Bus 001 Device 010: ID 045e:02ae Microsoft Corp. Xbox NUI Camera

NiViewer 와 같은 샘플 프로그램을 실행시켜 테스트합니다.

$ cd Samples/Bin

$ ./NiViewer

또는
$ cd ~/openni/OpenNI/Platform/Linux/Build/Samples/NiViewer
$ make
$ cd ../../../Bin/Arm-Release
$ ./NiViewer


다음은 ROS 를 설치합니다. Hydro 버전을 설치하는 경우 바로 아래 단계 2(Groovy 버전) 대신 한참 아래의 단계 2 (Hydro 버전) 으로 건너뛰어서 설치하시기 바랍니다.


단계 2(Groovy 버전). ROS 초기화 및 의존 패키지 설치

다음은 ROS Groovy 버전의 우분투 ARM 버전 소프트웨어를 설치합니다. 먼저 ROS 초기화 과정을 수행합니다.
(참고: http://www.ros.org/wiki/groovy/Installation/UbuntuARM)

$ sudo sh -c 'echo "deb http://packages.ros.org/ahendrix-mirror/ubuntu precise 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

패키지가 설치되지 않는 경우 가끔 apt-get update 를 실행하면 되는 경우가 있습니다. 사용가능한 패키지를 찾으려면 다음 명령어를 실행하세요.
$ apt-cache search ros-groovy

다음과 같은 ROS 기본 패키지를 설치합니다.
$ sudo apt-get install ros-groovy-ros ros-groovy-ros-comm ros-groovy-roscpp ros-groovy-rospy
다음으로 아래의 패키지들을 설치합니다. 하지만, 설치 도중 ros-groovy-rviz, ros-groovy-pcl, ros-groovy-pcl-ros 는 ubuntu arm 용 패키지가 없는 관계(2013년 5월 29일 현재)로 설치되지 않습니다. 이 패키지들을 제외하고 나머지를 설치합니다.
$ sudo apt-get install ros-groovy-geometry-msgs ros-groovy-sensor-msgs ros-groovy-nav-msgs ros-groovy-tf ros-groovy-rviz ros-groovy-nodelet ros-groovy-robot-state-publisher ros-groovy-diagnostic-msgs ros-groovy-dynamic-reconfigure ros-groovy-pcl ros-groovy-pcl-ros ros-groovy-pcl-msgs ros-groovy-diagnostics ros-groovy-image-proc ros-groovy-nodelet-core

다음과 같은 그 외의 패키지들을 설치합니다.
# kobuki-msgs
$ sudo apt-get install ros-groovy-kobuki-msgs
# for yujin ocs (Yujin Robot's open-source control software)
$ sudo apt-get install ros-groovy-yujin-ocs
# for kobuki-ftdi-driver
$ sudo apt-get install libftdi-dev
# for kobuki-auto-docking
$ sudo apt-get install ros-groovy-actionlib
# ecl (Embedded Control Library)
$ sudo apt-get install ros-groovy-ecl-threads ros-groovy-ecl-devices ros-groovy-ecl-streams ros-groovy-ecl-mobile-robot ros-groovy-ecl-sigslots ros-groovy-ecl
# 다음은 pcl 설치를 위해서도 필요함
$ sudo apt-get install libeigen3-dev ros-groovy-nodelet ros-groovy-nodelet-topic-tools ros-groovy-pluginlib ros-groovy-orocos-kdl ros-groovy-kdl-conversions ros-groovy-actionlib

다음은 본격적으로 catkin 및 rosbuild 워크스페이스를 빌드하기 전에 의존하는 바이너리 패키지들을 설치합니다.

단계 2-1 openni_camera 및 PCL 의존 패키지 설치

openni_camera, openni_launch 패키지 설치에 필요한 의존 패키지들을 설치합니다.
# for openni-camera & openni2-camera
$ sudo apt-get install ros-groovy-cv-bridge ros-groovy-camera-info-manager
$ sudo apt-get install ros-groovy-compressed-depth-image-transport

다음 명령을 실행하여 PCL 패키지 설치를 위해 필요한 cmake, eigen, boost, vtk 을 설치합니다.
$ sudo apt-get install cmake libflann-dev libeigen3-dev libboost-all-dev libvtk5-dev

libvtk5-dev 설치를 위해 필요한 패키지인 libqt4-opengl-dev 설치를 위해 필요한 libegl1-mesa-dev 와 libgles2-mesa-dev 가 기존에 설치된 mali400-dev 패키지와 충돌하여 제대로 설치되지 않습니다.(PCL 컴파일 시에 /usr/include/KHR/khrplatform.h 와 /usr/include/GLES2/gl2.h, libEGL.so 등이 중복됨)
따라서 mali400-dev 를 먼저 제거한 후 libqt4-opengl-dev 를 설치하고 난 후에 다시  mali400-dev 를 재설치하여야 합니다. 그런데 mali400-dev 는 우분투서버로부터 2.1-12 버전만 다운로드할 수 있으므로 2.1-13 버전은 다음과 같이 설치합니다. 만약 계속 libegl1-mesa-dev와 libgles2-mesa-dev 설정과 관련된 오류 메시지가 나타나면 구글에서 문제가 되는 패키지(버전명까지 같아야 함)를 검색한 다음 deb 파일을 다운로드하여 dpkg 로 강제설치합니다.
$ mkdir ~/mali400; cd ~/mali400
$ wget http://dn.odroid.com/MALI400_R3P2/20130208/mali400_packages.tar.gz
$ tar xvfz mali400_packages.tar.gz
$ sudo dpkg -r mali400-dev
$ sudo apt-get remove libqt4-opengl-dev
$ sudo apt-get install libqt4-opengl-dev
$ sudo dpkg -i --force-overwrite mali400-dev_2.1-13_armhf.deb 
$ sudo rm -rf /usr/lib/arm-linux-gnueabihf/mesa-egl 
$ sync

단계 2-2 rqt_robot_plugins 의존 패키지 설치 
$ sudo apt-get install ros-groovy-tf2-ros ros-groovy-rqt-common-plugins

단계 2-3 image_pipeline 의존 패키지 설치
$ sudo apt-get install ros-groovy-stereo-msgs

단계 2-4 rviz 의존 패키지 설치

다음 패키지들을 설치합니다.
$ sudo apt-get install ros-groovy-visualization-msgs ros-groovy-laser-geometry ros-groovy-python-qt-binding ros-groovy-resource-retriever libogre-dev ros-groovy-image-geometry
그리고, libassimp 3.0 버전을 설치합니다. sudo apt-get install libassimp-dev 명령을 통해 2.0 버전 패키지를 설치하면 나중에 rviz 빌드 시에 오류가 발생합니다.그러므로, 소스싸이트
http://sourceforge.net/projects/assimp/files/assimp-3.0 로부터 소스코드를 다운로드하여 직접 빌드합니다.
$ mkdir ~/assimp; cd ~/assimp
$ unzip assimp--3.0.1270-source-only.zip
$ cd assimp--3.0.1270-source-only ; mkdir build; cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/usr ..

$ make -j1

$ sudo make install

단계 3 (Groovy 버전). catkin/rosbuild 워크스페이스 빌드
(참고: http://www.ros.org/wiki/kobuki/Tutorials/Installation)


단계 3-1. catkin 워크스페이스 설치


catkin 워크스페이스를 생성하고 관련 소스 패키지들을 빌드합니다. 소스코드를 빌드하는 패키지들은 roscpp, kobuki, openni_camera, openni_launch, image_pipeline, pcl, pcl-ros, rviz  등입니다.

특히, 여기서는 roscpp 패키지를 이미 설치하였음에도 다시 빌드해야 합니다. 그 이유는 ARM CPU의 alignment 문제 때문에 터틀봇을 위해 실행되는 robot_state_publisher 와 robot_pose_ekf 등과 같은 프로그램이 제대로 통신을 하지 못합니다. 그래서 이 문제를 해결하는 패치를 적용한 다음 ROS 통신 Serialization 기능을 사용하는 libroscpp.so 등을 갱신하여야 합니다. (패치 참고: https://github.com/ros/roscpp_core/pull/8 )

그리고, 여기서 설치방법에는 2가지 선택사항이 있습니다. 하나는 catkin 워크스페이스를 시스템의 ROS 개발환경(/opt/ros/groovy) 와 통합하는 방법이고, 별도로 (~/catkin_ws/install/isolated 디렉토리에) 설치하는 방법입니다. 둘 다 가능한데, 별도로 설치하는 경우 같은 파일이 두군데에 존재하므로 추가적으로 고려해야 할 사항들이 있습니다. 이런 부분들은 앞으로 “참고” 로 표기하였습니다)

/opt/ros/groovy/include/ros/serialization.h 파일을 편집하여 다음 부분 (211, 243, 253 번째줄) 을 모두 수정합니다.
- #ifdef __arm
+ #if defined(__arm__) || defined(__arm)


다음 명령을 실행하여 소스 패키지들을 빌드할 준비를 합니다.
$ sudo apt-get install python-wstool
 # Create a workspace directory tree somewhere in you file system
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
 # Clone catkin repository
$ git clone https://github.com/ros/catkin.git
$ cp catkin/cmake/toplevel.cmake CMakeLists.txt

$ wstool init
$ wstool set ros_comm --git -v groovy-devel https://github.com/ros/ros_comm.git
$ wstool set kobuki --git -v groovy-devel https://github.com/yujinrobot/kobuki.git
$ wstool set openni_camera --git https://github.com/ros-drivers/openni_camera.git
$ wstool set openni_launch --git -v groovy-devel https://github.com/ros-drivers/openni_launch.git
$ wstool set image_pipeline --git -v groovy-devel https://github.com/ros-perception/image_pipeline.git
$ wstool set rqt_robot_plugins --git -v groovy-devel https://github.com/ros-visualization/rqt_robot_plugins.git
$ wstool set ineractive_markers --git -v groovy-devel https://github.com/ros-visualization/interactive_markers.git
$ wstool set rviz --git -v groovy-devel https://github.com/ros-visualization/rviz.git
$ wstool set perception_pcl --git -v groovy-unstable-devel https://github.com/ros-perception/perception_pcl.git

참고: catkin 워크스페이스를 시스템 ROS 개발환경과 통합하지 않는 경우 다음 패키지들도 다시 빌드하여야 합니다.
$ wstool set geometry --git -v groovy-devel https://github.com/ros/geometry.git
$ wstool set robot_state_publisher --git -v groovy-devel https://github.com/ros/robot_state_publisher.git
$ wstool set yujin_ocs --git -v groovy-devel https://github.com/yujinrobot/yujin_ocs.git

또, 나중에 rosbuild 빌드 시에 필요로 하는 flann 라이브러리 패키지 때문에 .rosinstall 파일에 다음 내용을 추가합니다.
=========================
- tar: {local-name: flann, uri: 'https://github.com/ros-gbp/flann-release/archive/release/flann/1.7.1.tar.gz',
   version: flann-release-release-flann-1.7.1}
=========================


다음 명령을 실행하여 소스 패키지들을 다운로드받습니다.
$ wstool update

ros_comm/test 디렉토리를 src 디렉토리로부터 제거합니다.
$ mv ros_comm/test ..

rviz 소스코드에서 src/rviz/ogre_helpers/point_cloud.cpp 파일 내용의 버그를 수정합니다. 
531c531
-       int num_verts = std::min<int>( VERTEX_BUFFER_CAPACITY, num_points - current_point );
+       int num_verts = std::min<int>( VERTEX_BUFFER_CAPACITY, (num_points - current_point) * vpp );
567,569c567,571
+   if (!isnan(p.position.x) && !isnan(p.position.y) && !isnan(p.position.z)) {
        aabb.merge(p.position);
        bounding_box_.merge( p.position);
        bounding_radius_ = std::max( bounding_radius_, p.position.squaredLength() );
+   }

이제 다음과 같은 명령을 실행하여 catkin 워크스페이스 내의 모든 패키지들을 빌드하고 설치합니다. PCL 이 포함되어 있어 빌드 시간이 한나절은 족히 걸립니다.

$ cd ..
$ source /opt/ros/groovy/setup.bash

$ sudo ./src/catkin/bin/catkin_make_isolated --install --install-space /opt/ros/groovy 

참고:
시스템의 ROS 개발환경과 통합하고 싶지 않으면, $ catkin_make_isolated --install 명령을 실행하여 install_isolated 디렉토리에 설치하면 됩니다. 하지만 이럴 경우 /opt/ros/groovy 에 설치된 기존의 우분투 패키지들과 충돌하게 되는 문제가 있습니다.

PCL 1.7 버전의 패키지 리소스 디렉토리와 관련 파일을 만들어 줍니다.
# for PCL 1.7
$ cd /opt/ros/groovy/share
$ sudo cp -r pcl-1.7 pcl
$ cd pcl; sudo mkdir cmake; sudo mv * cmake
$ sudo cp ~/catkin_ws/src/perception_pcl/pcl/package.xml .
(참고: 시스템 ROS 개발환경과 통합하지 않은 경우 ~/catkin_ws/install_isolated/share 디렉토리에 만듭니다)

다음 내용을 가진 /opt/ros/groovy/lib/pkgconfig/pcl.pc 파일을 만듭니다.
===============
prefix=/opt/ros/groovy
libdir=${prefix}/lib
includedir=${prefix}/include/pcl-1.7
Name: pcl
Description: Description of pcl
Version: 1.7.0
Cflags: -I${includedir}
Libs: -L${libdir}
Requires:
=========================

(참고: 시스템 ROS 개발환경과 통합하지 않은 경우 
~/catkin_ws/install_isolated/lib/pkgconfig/pcl.pc 
파일(prefix=/home/linaro/catkin_ws/install_isolated)을 만듭니다)
참고: 
catkin 워크스페이스를 시스템의 ROS 환경과 통합하지 않으면 libroscpp.so 라이브러리가 양쪽에 다 있으므로 제대로 동작하지 않을 수 있습니다. 그런 경우 다음 파일을 수정하고 재부팅한 다음 재빌드하여 제대로 동작하도록 해 주어야 합니다.
$ vi ~/catkin_ws/install_isolated/_setup_util.py
- CMAKE_PREFIX_PATH = '/opt/ros/groovy;/home/linaro/catkin_ws/install_isolated'.split(';')
+ CMAKE_PREFIX_PATH = '/home/linaro/catkin_ws/install_isolated;/opt/ros/groovy'.split(';')

단계 3-2. Rosbuild Stacks 빌드
(참고: http://www.ros.org/wiki/turtlebot/Tutorials/groovy/Installation)

먼저 다음 명령을 실행합니다.
$ rosrun kobuki_ftdi create_udev_rules

참고: 시스템 ROS 개발환경과 통합하지 않은 경우 다음 명령을 실행합니다.
$ source ~/catkin_ws/install_isolated/setup.bash

다음 의존 패키지들을 설치합니다.
# for turtlebot
$ sudo apt-get install ros-groovy-zeroconf-avahi ros-groovy-multimaster-experimental ros-groovy-depthimage-to-laserscan
#$ sudo apt-get install ros-groovy-xacro
# for kobuki_desktop/kobuki_qtestsuite
$ sudo apt-get install pyqt4-dev-tools
# for turtlebot_apps/turtlebot_calibration
$ sudo apt-get install ros-groovy-python-orocos-kdl
# for turtlebot_apps/turtlebot_teleop
$ sudo apt-get install ros-groovy-joy
# for navigation/map-server
$ sudo apt-get install libsdl-image1.2-dev
# for turtlebot_apps/turtlebot_core_apps
$ sudo apt-get install ros-groovy-map-store ros-groovy-compressed-image-transport 
# for navigation/robot_pose_ekf
$ sudo apt-get install ros-groovy-bfl

다음 명령을 실행하여 rosbuild 워크스페이스를 만듭니다.
$ mkdir ~/rosbuild_ws
$ rosws init ~/rosbuild_ws /opt/ros/groovy
(참고: 시스템의 ROS 개발환경과 통합하지 않은 경우 위 명령 대신
$ rosws init ~/rosbuild_ws ~/catkin_ws/install_isolated 실행합니다)
$ cd ~/rosbuild_ws
$ rosws merge http://packages.ros.org/web/rosinstall/generate/dry/raw/groovy/desktop
$ rosws merge https://raw.github.com/turtlebot/turtlebot/master/turtlebot.rosinstall

.rosinstall 파일을 수정하여 kobuki_desktop, turtlebot, turtlebot_apps, turtlebot_viz 항목들의 “master” 버전을 “groovy” 로 바꿉니다. 그런 다음 다음 명령을 실행하여 소스코드를 다운로드합니다.
$ rosws update

turtlebot_apps/software/pano/pano_core/CMakeLists.txt 파일에서 18번째 줄을 다음과 같이 수정합니다.
- set(ROS_COMPILE_FLAGS ${ROS_COMPILE_FLAGS} "-msse4.2 -Wall")
+ #set(ROS_COMPILE_FLAGS ${ROS_COMPILE_FLAGS} "-msse4.2 -Wall")

gazebo 와 관련된 패키지들을 설치하지 않기 위해 다음 명령을 실행합니다.
$ mkdir uninstalled
$ mv kobuki_desktop/kobuki_gazebo uninstalled
$ mv kobuki_desktop/kobuki_gazebo_plugins uninstalled

다음과 같은 명령을 실행하여 관련된 패키지들을 빌드합니다.
$ source setup.bash
$ sudo rosdep init
$ rosdep update
$ rosmake robot_model_visualization navigation kobuki_desktop turtlebot turtlebot_apps turtlebot_viz

기본적인 설치가 모두 끝났습니다. 단계 4로 가서 설치를 계속하시기 바랍니다.


단계 2 (Hydro 버전). ROS 초기화 및 의존패키지 설치
( 참고: http://wiki.ros.org/hydro/Installation/UbuntuARM )

다음 명령을 실행하여 시스템 로컬을 설정합니다.
sudo update-locale LANG=C LANGUAGE=C LC_ALL=C LC_MESSAGE=POSIX

다음은 ROS Hydro 버전의 우분투 ARM 버전 소프트웨어를 설치합니다. 먼저 ROS 초기화 과정을 수행합니다.
$ sudo sh -c 'echo "deb http://packages.ros.org/ahendrix-mirror/ubuntu raring 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

패키지가 설치되지 않는 경우 가끔 apt-get update 를 실행하면 되는 경우가 있습니다. 사용가능한 패키지를 찾으려면 다음 명령어를 실행하세요.
$ apt-cache search ros-hydro

다음과 같은 ROS 기본 패키지를 설치합니다.
$ sudo apt-get install ros-hydro-ros ros-hydro-roscpp ros-hydro-rospy

다음으로 아래의 패키지들을 설치합니다. 하지만, 설치 도중 ros-hydro-rviz 는 ubuntu arm 용 패키지가 없는 관계(2013년 9월 27일 현재)로 설치되지 않습니다. 이 패키지들을 제외하고 나머지를 설치합니다.
$ sudo apt-get install ros-hydro-geometry-msgs ros-hydro-sensor-msgs ros-hydro-nav-msgs ros-hydro-tf ros-hydro-rviz ros-hydro-nodelet ros-hydro-robot-state-publisher ros-hydro-diagnostic-msgs ros-hydro-dynamic-reconfigure ros-hydro-pcl ros-hydro-pcl-ros ros-hydro-pcl-msgs ros-hydro-diagnostics ros-hydro-nodelet-core
ros-hydro-image-pipeline ros-hydro-interactive-markers ros-hydro-navigation ros-hydro-tf2-ros ros-hydro-rqt ros-hydro-rqt-common-plugins

다음은 본격적으로 catkin 워크스페이스를 빌드하기 전에 의존하는 바이너리 패키지들을 설치합니다.

단계 2-1 openni_camera 의존 패키지 설치
openni_camera, openni_launch 패키지 설치에 필요한 의존 패키지들을 설치합니다.
# for openni-camera & openni2-camera
$ sudo apt-get install ros-hydro-camera-info-manager
$ sudo apt-get install ros-hydro-compressed-depth-image-transport

단계 2-2 rviz 의존 패키지 설치

다음 패키지들을 설치합니다.
$ sudo apt-get install ros-hydro-visualization-msgs ros-hydro-laser-geometry ros-hydro-python-qt-binding ros-hydro-resource-retriever libogre-dev ros-hydro-image-geometry
$ sudo apt-get install libqt4-dev libqt4-opengl-dev

그리고, libassimp 3.0 버전을 설치합니다. sudo apt-get install libassimp-dev 명령을 통해 3.0 버전 패키지를 설치하면 나중에 rviz 빌드 시에 오류가 발생합니다.그러므로, 소스싸이트
http://sourceforge.net/projects/assimp/files/assimp-3.0 로부터 소스코드를 다운로드하여 직접 빌드합니다.
$ mkdir ~/assimp; cd ~/assimp
$ unzip assimp--3.0.1270-source-only.zip
$ cd assimp--3.0.1270-source-only ; mkdir build; cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/usr ..
$ make -j1
$ sudo make install

/usr/share/cmake-2.8/Modules/FindQt4.cmake 파일의 500 번째 줄을 수정합니다.
- find_program(QT_QMAKE_EXECUTABLE NAMES qmake qmake4 qmake-qt4 qmake-mac
+ find_program(QT_QMAKE_EXECUTABLE NAMES qmake4 qmake-qt4 qmake-mac

단계 2-3 turtlebot & kobuki 의존 패키지 설치

기타 turtlebot 과 kobuki 관련 의존 패키지들을 설치합니다.
# for turtlebot
$ sudo apt-get install ros-hydro-zeroconf-avahi ros-hydro-depthimage-to-laserscan ros-hydro-xacro
# for kobuki-ftdi-driver
$ sudo apt-get install libftdi-dev
# for kobuki_desktop/kobuki_qtestsuite
$ sudo apt-get install pyqt4-dev-tools
# for kobuki_desktop/kobuki_dashboard
$ sudo apt-get install ros-hydro-rqt-robot-dashboard
# for turtlebot_apps/turtlebot_calibration
$ sudo apt-get install ros-hydro-python-orocos-kdl
# for turtlebot_apps/turtlebot_navigation
$ sudo apt-get install ros-hydro-slam-gmapping
# for turtlebot_apps/turtlebot_teleop
$ sudo apt-get install ros-hydro-joy
# for turtlebot_apps/turtlebot_core_apps
$ sudo apt-get install ros-hydro-map-store ros-hydro-compressed-image-transport
# for turtlebot_viz
$ sudo apt-get install ros-hydro-joint-state-publisher

단계 3 (Hydro 버전). catkin 워크스페이스 빌드
(참고: http://www.ros.org/wiki/kobuki/Tutorials/Installation )

Hydro 버전은 catkin 워크스페이스만 생성하고 관련 소스 패키지들을 빌드하면 됩니다. 소스코드를 빌드하는 패키지들은 아직 우분투 ARM 버전 패키지들로 등록되지 않은 openni_camera/openni_launch, ecl, kobuki, turtlebot, rviz  등입니다.

다음 명령을 실행하여 소스 패키지들을 빌드할 준비를 합니다.
$ sudo apt-get install python-wstool
 # Create a workspace directory tree somewhere in you file system
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ wstool init
$ wstool set kobuki --git -v hydro-devel https://github.com/yujinrobot/kobuki.git
$ wstool set kobuki_msgs --git -v hydro-devel https://github.com/yujinrobot/kobuki_msgs.git
$ wstool set kobuki_core --git -v hydro-devel https://github.com/yujinrobot/kobuki_core.git
$ wstool set kobuki_desktop --git -v hydro-devel https://github.com/yujinrobot/kobuki_desktop.git
$ wstool set openni_camera --git https://github.com/ros-drivers/openni_camera.git
$ wstool set openni_launch --git -v hydro-devel https://github.com/ros-drivers/openni_launch.git
$ wstool set rgbd_launch --git -v hydro-devel https://github.com/ros-drivers/rgbd_launch.git
$ wstool set rviz --git -v hydro-devel https://github.com/ros-visualization/rviz.git
$ wstool set ecl_tools --git -v hydro-devel https://github.com/stonier/ecl_tools.git
$ wstool set ecl_lite --git -v hydro-devel https://github.com/stonier/ecl_lite.git
$ wstool set ecl_core --git -v hydro-devel https://github.com/stonier/ecl_core.git
$ wstool set ecl_navigation --git -v hydro-devel https://github.com/stonier/ecl_navigation.git
$ wstool set turtlebot --git -v hydro-devel https://github.com/turtlebot/turtlebot.git

$ wstool set turtlebot_msgs --git -v hydro-devel https://github.com/turtlebot/turtlebot_msgs.git

$ wstool set turtlebot_create --git -v hydro-devel https://github.com/turtlebot/turtlebot_create.git

$ wstool set turtlebot_create_desktop --git -v hydro-devel https://github.com/turtlebot/turtlebot_create_desktop.git

$ wstool set turtlebot_apps --git -v hydro-devel https://github.com/turtlebot/turtlebot_apps.git
$ wstool set turtlebot_viz --git -v hydro-devel https://github.com/turtlebot/turtlebot_viz.git
$ wstool set yujin_ocs --git -v hydro-devel https://github.com/yujinrobot/yujin_ocs.git

$ wstool set rocon_msgs --git -v hydro-devel https://github.com/robotics-in-concert/rocon_msgs.git

$ wstool set rocon_multimaster --git -v hydro-devel https://github.com/robotics-in-concert/rocon_multimaster.git

$ wstool set rocon_app_platform --git -v hydro-devel https://github.com/robotics-in-concert/rocon_app_platform.git


다음 명령을 실행하여 소스 패키지들을 다운로드받습니다.
$ wstool update

rviz 소스코드에서 src/rviz/ogre_helpers/point_cloud.cpp 파일 내용의 버그를 수정합니다.
567,569a567,571
+   if (!isnan(p.position.x) && !isnan(p.position.y) && !isnan(p.position.z)) {
   aabb.merge(p.position);
   bounding_box_.merge( p.position );
   bounding_radius_ = std::max( bounding_radius_, p.position.squaredLength() );
+   }

gazebo 와 관련된 패키지들을 설치하지 않기 위해 다음 명령을 실행합니다.
$ mkdir ../uninstalled
$ mv kobuki_desktop/kobuki_gazebo ../uninstalled
$ mv kobuki_desktop/kobuki_gazebo_plugins ../uninstalled

$ mv turtlebot_create_desktop/create_gazebo_plugins ../uninstalled


이제 다음과 같은 명령을 실행하여 catkin 워크스페이스 내의 모든 패키지들을 빌드하고 install_isolated 디렉토리에 설치합니다.
$ cd ..
$ source /opt/ros/hydro/setup.bash
$ catkin_make_isolated --install

기본적인 설치가 끝났습니다.


단계 4. 보드설정 및 터틀봇 구동
(참고: http://wiki.ros.org/turtlebot/Tutorials)

다음은 kobuki 구동로봇, MS Kinect, Odroid-X2 보드를 서로 연결하고 
기존의 turtlebot 설치방법에 나와 있는 대로 시간동기화를 합니다.
$ sudo apt-get install chrony
$ sudo ntpdate ntp.ubuntu.com

.bashrc 파일에 다음 문장을 추가한 다음 리부팅합니다.

Groovy 버전:

source /opt/ros/groovy/setup.bash
(참고: catkin 워크스페이스를 시스템 ROS환경과 통합하지 않는 경우 source /home/linaro/catkin_ws/install_isolated/setup.bash 를 추가합니다)
source /home/linaro/rosbuild_ws/setup.bash
export ROS_MASTER_URI=http://localhost:11311
export ROS_HOSTNAME=<IP of turtlebot>


Hydro 버전:
source /opt/ros/hydro/setup.bash
source /home/odroid/catkin_ws/install_isolated/setup.bash
export ROS_MASTER_URI=http://localhost:11311
export ROS_HOSTNAME=<IP of turtlebot>


다음으로  네트워크 연결이 잘 되어 있는지를 확인한 다음, 터틀봇/거북이 튜토리얼에 나오는 여러가지 프로그램들을 실행시켜 봅니다.
먼저 ODROID-X2 임베디드보드는 배터리가 없으므로 minimal_launch 실행 시에 laptop_battery.py 실행하는 부분을 제거합니다. 다음과 같이 ~/rosbuild_ws/turtlebot/turtlebot_bringup/launch/minimal.launch 파일 (Groovy 버전) 또는
~/catkin_ws/install_isolated/share/turtlebot_bringup/launch/minimal.launch 파일 (Hydro 버전) 을 수정합니다.

+  <!--
  <include file="$(find turtlebot_bringup)/launch/includes/_netbook.launch">
    <arg name="battery" value="$(arg battery)" />
  </include>
+  -->
...

$ rosrun kobuki_ftdi create_udev_rules
[How to launch turtlebot]
$ roslaunch turtlebot_bringup minimal.launch

[How to launch dashboard]
$ rqt -s kobuki_dashboard  또는
$ roslaunch turtlebot_dashboard turtlebot_dashboard.launch

[How to launch 3d sensor]
$ roslaunch turtlebot_bringup 3dsensor.launch

[How to launch rviz]
$ roslaunch turtlebot_rviz_launchers view_robot.launch

[How to launch keyboard teleoperation]
$ roslaunch turtlebot_teleop keyboard_teleop.launch

추가로 안드로이드폰에서 OSRF 가 제공하는 ros app chooser (groovy), ros teleop (groovy), make a map (groovy), ros map navigation 등과 유진로봇에서 제공하는 Turtlebot panorama, Turtlebot follower 등을 실행시켜 kobuki 와 연결시켜 구동시켜 봅니다.

현재 원격조종은 문제없이 동작합니다. Groovy 버전의 경우 rviz 로 로봇 주변 환경을 보여줄 때, RGB 카메라 이미지를 처음에는 잘 보여주다가 나중에는 검게 나오는 문제가 있습니다. Hydro 버전의 경우 로케일(특히 LC_ALL) 을 C 대신 ko_KR.UTF-8 등으로 바꾸어야 rviz 가 정상적으로 실행됩니다. 또한, 안드로이드에서 Robot Remocon 으로는 로봇에 접속이 안되지만 개별적인 앱으로는 접속이 됩니다.

마지막으로 여러 부분의 오류 수정과 새로운 hydro 버전 포팅 등에 대해 여러분들의 많은 관심과 도움이 필요합니다.

참고문헌
http://www.hardkernel.com/renewal_2011/products/prdt_info.php?g_code=G135235611947
http://www.ros.org/wiki/groovy/Installation/Source
http://www.ros.org/wiki/groovy/Installation/UbuntuARM

http://www.ros.org/wiki/hydro/Installation/UbuntuARM

http://wiki.ros.org/turtlebot/Tutorials
http://www.ros.org/wiki/kobuki/Tutorials/Installation
http://yujinrobot.github.io/kobuki/doxygen/enInstallationLinuxGuide.html
http://answers.ros.org/question/62979/how-do-i-use-pcl-17-with-groovy/
http://www.ros.org/wiki/groovy/Installation/Raspbian/Source
http://www.ros.org/wiki/groovy/Installation/PandaBoard/Source


다음검색
현재 게시글 추가 기능 열기
  • 북마크
  • 공유하기
  • 신고하기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼