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

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



댓글 없음:

댓글 쓰기