본문 바로가기

ROS

ROS 기본

SMALL
  • 로봇 소프트웨어 플랫폼

기계는 하드웨어, 소프트웨어로 구성이 되어 있습니다. 로봇 소프트웨어 플랫폼은 로봇 응용프로그램의 개발을 위한 하드웨어 추상화, 하위 디바이스 제어와 센싱 및 인식, 위치 추정, 내비게이션 등의 기능, 패키지 관리, 라이브러리, 개발 도구와 디버깅 도구 등을 포함합니다.

로봇 소프트웨어는 다양합니다. 하드웨어 역시 제조사마다 다른 스펙을 보유하고 있습니다. 이런 복잡성과 다양성을 해결하기 위해서 로봇 소프트웨어 플랫폼이 만들어져, 여러 연구자들이 협업하도록 하고있습니다.

 

이러한 로봇 소프트웨어 플랫폼에는 OpenRTM, OROCOS, OPRoS 등 여러 종류가 있으며 그 중 하나는 ROS라고 합니다.

로봇 소프트웨어 플랫폼, 특히 ROS의 필요성은 다음과 같습니다.

 

1. 프로그램의 재사용성 : 개발할 부분만 개발을 하고, 다른 기능들은 필요한 패키지를 다운 받아 사용할 수 있으며, 공유가 가능합니다.

2. 통신 기반 프로그램 : 하나의 서비를 위해 하드웨어 드라이빙, 센싱, 인식, 동작 등을 각각의 프로세서의 목적에 따라 작게 나누고(노드화 또는 컴포넌트화), 이 최소 실행 단위인 '노드'는 데이터를 플랫폼 상에서 주고받습니다. 따라서 하드웨어 의존성을 낮출 수 있으며, 이러한 네트워크 프로그래밍은 원격 제어를 용이하게 하고, 노드로 나누어진 덕분에 작은 단위로 디버깅할 수 있습니다.

3. 개발 도구 지원 : 디버깅, GUI(ex : rqt), 3차원 시각화 도구 (ex: Rviz)를 지원합니다. 정해진 메시지 형식에 맞추기만 하면 됩니다.

4. 커뮤니티 : 자발적으로 많은 패키지들이 개발 및 공유되고 있으며, 사용법이 설명된 Wiki 페이지들이 있습니다. 많은 개발자 및 사용자들이 원활하게 소통하고 있습니다.

5.로봇 생태계 구성: 하드웨어 기술을 통합할 운영체제가 필요합니다. 다양한 소프트웨어가 필요하고, 사용자도 잘 사용해야 합니다. 플랫폼은 개발 및 사용의 생태계를 갖출 수 있도록 합니다.

스마트폰의 하드웨어가 어떻게 구성되어있는지 알지 못해도 수많은 개발자들은, 심지어 중고등학생들도 어플리케이션을 잘 개발합니다. 같은원리로 로봇 소프트웨어 플랫폼을 이용하면 로봇 하드웨어가 각각 달라도 프로그래밍이 가능합니다.

 

 

 

  • ROS

Robot Operating System의 약자로, 오픈 로보틱스(Open Robotics)에서 개발하고 있습니다. Turtle을 심볼로 사용합니다.

기존의 전통적 운영체제를 이용 + 하드웨어 추상화 + 이기종(heterogeneous computing) 하드웨어 적용 + 로봇 특화 개발환경 제공을 하는 로봇 소프트웨어 플랫폼입니다.

 

 

 

  • 메타 운영체제

운영체제(OS;Operating System)는 컴퓨터로 따지면 Windows, Mac OS, Linux 등이 있고, 스마트폰으로 따지면 iOS, Android 등이 있습니다.

메타 운영체제는 전통적인 운영체제 위에 설치되어, 어플리케이션과 분산 컴퓨팅 자원 간의 가상화 레이어로 스케줄링, 로드, 에러 처리 등을 지원합니다. 

ROS는 주로 리눅스 배포판 중 하나인 Ubuntu위에 설치되어, 프로세스 관리 시스템, 파일 시스템, 유저 인터페이스, 프로그램 유틸리티(컴파일러, 스레드 모델) 등 전통적 운영체제에서 제공하는 기능을 사용합니다. 또한 로봇 응용프로그램에 필요한 기능 - 이기종 하드웨어 간 데이터 통신, 스케줄링, 에러 처리 등 - 을 라이브러리 형태로 제공합니다.

(Middleware 또는 Software Framework)

또한 다른 운영체제, 하드웨어, 프로그램 간 통신도 가능합니다. 따라서 우분투와 아두이노, 안드로이드, 다른 우분투 등의 데이터 송수신이 가능합니다.

 

 

 

  • ROS 주요 특징

 

1.분산 프로세스 : 위에서도 밝힌 바와 같이, ROS는 최소 단위의 실행 가능한 프로세스인 노드 형태로 프로그래밍합니다.

이들이 독립적으로 실행되면서도 유기적으로 얽혀 통신합니다.

 

2. 패키지 단위 관리 : 패키지란 단어 그대로 어떤 뭉치라 생각하면 됩니다. 같은 목적의 여러개의 프로세스를 묶어놓은 것이며, 패키지 단위로 개발, 사용, 공유 및  수정, 재배포가 이루어져 편리합니다.

 

3. 패키지는 깃허브 등의 공개 레포지토리에 공개되어야 하며 라이센스를 밝혀야합니다.

 

4. 프로그램 개발 시 API를 불러와 사용하던 코드에 삽입할 수 있습니다.

 

5.C++,Python,JAVA 등 다양한 프로그래밍 언어를 사용할 수 있으며 이를 위해 클라이언트 라이브러리를 제공합니다.

 

 

  • ROS의 구성

-클라이언트 라이브러리: 다양한 프로그래밍 언어를 지원하는 소프트웨어 모듈, 각각의 노드를 다른 언어로 작성할 수 있고, 노드 간의 통신을 통해 정보를 교환하기 위해 사용합니다. (ex : roscpp (c++) , rospy (Python), roslisp (LISP) 등)

-로보틱스 어플리케이션 프레임워크 : 로보틱스 응용프로그래밍 용 (ex : tf, dynamic reconfigure, laser pipline)

-로보틱스 어플리케이션 : 위 프레임 워크를 기반으로 한 서비스용 응용프로그래밍 (navigation, Movelt! 등)

-커뮤니케이션 레이어 : 데이터 통신 (ex : common msgs, rosbag, rostopic, rosnode, roslaunch, rosparam, rosmaster, rosout 등)

-하드웨어 인터페이스 레이어: 하드웨어 제어 (ex : 카메라 드라이버, GPS/IMU 드라이버, rosserial 등)

-소프트웨어 개발 도구 : (ex. RViz, rqt, rospack, catkin, rosdep)

-시뮬레이션 : 가상공간에서 로봇 제어 (ex. gazebo ros pkgs, stage ros 등)

 

 

  • master(마스터)

노드 사이를 연결하고, 메시지 통신을 위한 네임 서버 역할을 합니다. 전체를 관장하는 관리센서라고 생각하면 됩니다.

노드를 구동하면 마스터에 노드의 이름과, 퍼블리셔/서브스크라이버 등에서 사용할 토픽 이름, 메시지 형태, URL 주소, 포트 등을 등록해야 하는 것입니다. 이 이름을 바탕으로 통신합니다.

ROS 마스터는 roscore 명령어로 실행됩니다. 보통은 같은 네트워크에서 하나만 구동하며, 같은 네트워크 내에선 다른 컴퓨터에서 실행해도 됩니다. roslaunch가 아니라면 roscore를 가장 먼저 실행하여, 노드들이 등록되어 작동하고 서로 통신할 수 있도록 해야합니다.

 

 

  • Node(노드)

실행 가능한, 최소 단위 프로세서입니다. 값을 받아들이거나 내보내거나, 둘 다를 하는 프로그램이라 해도 좋습니다.

하나의 로봇을 작동하는데 여러개의 노드가 작게 세분화되어 운영되면서, 주로 하나의 목적에 하나의 노드를 씁니다. 분업화의 개념처럼 생각하면 좋습니다.

예를 들면 GPS에서 정보를 내보내는 노드 하나, 그 정보를 받아들여 최단 경로를 계산하고 다음 이동할 위치를 내보내는 노드 하나, 또 그 정보를 받아 바퀴를 얼만큼 움직일지 알려주는 노드 하나인 식입니다.

다음 그림은 rqt 그래프입니다. 여기서 원으로 표시된 것이 '노드'입니다. 한쪽으로만 화살표가 연결되는 것을 확인할 수 있습니다.

 

  • package (패키지)

ROS를 구성하는 기본 단위이자 개발 단위입니다.

하나 이상의 노드를 포함하고 있으며, 다른 패키지의 노드를 실행하기 위한 설정 파일, 프로세스들을 실행할 ROS 의존성 라이브러리, 데이터셋 등을 가집니다.

깃허브 등에서 자료를 찾으면 대부분 패키지 단위로 업로드 됩니다.

 

  • 통신

1. message (메시지)

노드가 데이터를 주고 받을 때 사용하는 데이터의 형태입니다. 프로그래밍을 배울 때, 각 언어마다 지원하는 변수에 자료형이 있듯이, 메시지도 변수로서 integer(int16, int32등), float, boolean(bool), string, time 등이 있고, 배열(리스트) 형(unit8[], Point32[] 등)으로 메시지 안에 메시지를 담을 수 있습니다. std_msgs/Header처럼 헤더도 메시지로 사용할 수 있습니다.

ROS Documentation에서는 제공되고 있는 다양한 메시지 타입을 아래와 같이 기술하고 있으니, 필요하거나 궁금한 메시지 타입이 있으면 구글링을 통해서 바로바로 찾아볼 수 있습니다.

메시지 파일은 다양한 자료형을 포함한 새로운 자료형으로도 만들어질 수 있으며, 토픽에 사용되는 메시지는 '.msg' 파일에 그 형태가 기술됩니다. 당연히 만들어 사용도 가능합니다.

 

 

2. topic (토픽)

메시지를 편지봉투, 혹은 편지지라고 하면 토픽은 그 안에 담기는 편지 '내용' 입니다. 즉, 메시지 안에 담기는 내용입니다.

토픽은 비동기식, 단방향, 연속적 메시지 송수신이 가능하므로 센서 데이터에 적합합니다. 예를 들면 IMU에서 그때그때 인식한 센서값을 노드에서 토픽으로 계속 쏴주는 식인 것입니다.

 

-토픽, 서비스, 액션의 차이

노드 간의 통신 방식에는 3가지가 있습니다. 단방향이란 노드에서 다른 노드로 일반통행 식으로 메시지를 쏜다는 뜻입니다. 양방향은 서로 쏠 수 있다는 것입니다.

종류 방식 방향 설명
토픽 비동기 단방향 연속적으로 데이터 송수신할 때
서비스 동기 양방향 한 번만 데이터 송수신. 요청 처리가 현재 순간만일 때
액션 비동기 양방향 요청 후 응답까지 시간 걸리거나, 중간 피드백이 필요할 때

※동기/비동기식

=> 동기(synchronous) : 입력과 출력, 요청과 응답이 동시에 일어납니다.

=>비동기(asynchronous) : 입력이나 요청이 있다해서 출력이나 응답이 바로 나타나지 않습니다. 특정 신호가 있어야 결과가 나타나는 등으로 조작합니다.

 

3. publish (퍼블리시) & subscribe (서브스크라이브)

영어 단어를 보면, 퍼블리시는 무언가를 공표/발표하는 것입니다. 그 일을 하는 주체는 퍼블리셔(publisher) 노드입니다. 반대로 서브스크라이브는 무언가를 구독/읽는 것이고, 노드는 서브스크라이버(subscriber) 노드라고 합니다.

퍼블리셔 노드는 토픽과 자신의 정보를 마스터에 등록하고, 서브스크라이브 노드에 메시지를 보낸다. 퍼블리셔는 이 일을 하는 개체로, 노드에서 선언하며 복수 개 선언이 가능합니다.
서브스크라이브 노드는 토픽과 자신의 정보를 마스터에 등록하고, 받고자 하는 토픽을 주고 있는 퍼블리셔 노드의 정보를 받는다. 마찬가지로 서브스크라이버를 노드에서 선언하고 복수 개가 가능합니다.
이렇게 둘은 마스터에 등록되고 정보를 주고 받은 뒤 직접적으로 서로 연결되어 비동기식 통신을 합니다. 가장 간략한 순서는 이렇습니다.

 

1. 마스터 구동

2. 서브스크라이버 노드 구동

3. 퍼블리셔 노드 구동

4. 퍼블리셔 정보 알림

5. 서브스크라이버 노드의 접속 요청 및 퍼블리셔 노드의 접속 응답

6. 메시지 송수신

 

노드, 토픽, 퍼블리셔, 서브스크라이브의 관계는 그래프로 표현하기가 쉽습니다. 보통 rqt_graph 패키지의 rqt_graph 노드를 다른 터미널에서 실행시켜서 확인이 가능합니다.

 

  • parameter (파라미터)

노드에서 사용되는 파라미터입니다. 미리 지정되거나 할당할 수 있는 어떤 값이라 보면됩니다. 보통 소스코드에서도 할당이 가능하나, 따로 파일로 빼 두어 값들을 모아두거나 손쉽게 조정할 수 있도록 할 수 있습니다. 윈도우 프로그램에서 .ini 설정 파일과 비슷합니다. 디폴트 값이 지정되어 있고, 필요에 따라 읽고 쓸 수 있습니다. 실제 활용에서는 USB 포트 번호, 캘리브레이션 값, 최대/최솟값 등의 변경에 유용하게 쓰입니다.

  • 캐킨(catkin) & CMakeList.txt

Catkin은 ROS의 빌드 시스템입니다. CMake(Cross Platform Make)를 기본적으로 이용하여, 패키지 폴터에 CMakeList.txt라는 파일에 빌드 환경을 기술해야 합니다. ROS에서는 CMake를 ROS에 맞게 수정해 특화된 캐킨 빌드 시스템을 만들었으며, ROS 관련 빌드, 패키지 관리, 패키지 간 의존관계 등을 편리하게 사용할 수 있게 되었습니다.

 

 

 

  • 실행

-rosrun

rosrun은 ROS의 기본 실행 명령어로, 패키지에서 '하나의 노드'를 실행합니다. 노드가 실행중인 컴퓨터에 저장된 ROS_HOSTNAME 환경 변수 값을 URI 주소로, 임의의 고윳값을 포트로 설정합니다. rosrun 실행 전에 다른 터미널 창에 roscore을 실행해두어야 합니다.

 

-roslaunch

rosrun과는 달리 roscore 없이도 여러 개의 노드를 실행할 수 있는 명령어가 roslaunch입니다.

또한 패키지 파라미터와 노드 이름 변경, 노드 네임스페이스 설정, ROS_ROOT 및 ROSPACKAGE_PATH 설정, 환경 변수 설정 등 옵션을 줄 수 있습니다. 작동은 .launch 파일을 통합니다. 해당 파일은 태그별 옵션을 제공하는 XML 기반이며, 파일은 패키지 폴더 내 launch 폴더 안에 있어야 합니다.

roslaunch 관련 사항은 따로 포스팅을 해 두었습니다.

 

※ XML(Extensible Markup Language)

: 다목적 마크업 언어로, 태그 등을 이용해 데이터의 구조를 표시하는 언어 중 하나입니다.

(HTML을 사용해본 사람이라면 태그 형식을 잘 이해할 수 있을 것입니다. 인터넷 창에서 F12키를 눌러보면 됩니다.)

XML은 .launch 나 package.xml 등에서 사용합니다.

 

-package.xml

패키지의 정보(패키지의 이름, 저작자, 라이선스, 의존성 패키지 등)을 기술하고 있는 XML파일입니다.

 

  • bag

ROS에서 주고받는 메시지 데이터를 저장하는 파일 포맷으로, .bag 확장자를 가집니다. 이 기능을 활용하면 화면녹화 혹은 음성 녹음처럼 이전 상황을 재현할 수 있습니다.

예를 들어 배를 움직이며 GPS좌표를 rosbag 시키면 지난 경로의 좌표를 기록할 수 있고, 필요한 경우 센서값을 반복해 사용할 수 있으며 .csv 파일로 변환도 가능합니다.

 

 

  • name (네임)

노드, 파라미터, 토픽, 서비스에 모두 이름, 즉 네임이 있습니다. 마스터에 등록하면 이 이름을 이용하여서 검색 및 메시지 송수신이 이뤄집니다. 실행 시 변경도 가능하고, 중복도 가능합니다.

 

 

  • 파일 시스템

'설치 폴터'와 '사용자 직업 폴더'로 구분됩니다.

설치 폴터는 ROS 데스크탑 버전을 설치하면 /opt 폴더 내에 '/ros/버전 이름'으로 생성됩니다. 내부에는 roscore를 포함한 핵심 유틸리티, rqt, RViz, 기타 라이브러리, 시뮬레이션, 내비게이션 등이 설치됩니다.

파일 내용
/bin 바이너리 파일
/etc ROS, 캐킨 관련 설정 파일
/include 헤더 파일
/lib 라이브러리 파일
/share ROS 패키지
env.* , setup.* 환경설정 파일

사용자 작업 폴더는 사용자가 작성한 패키지 및 다른 개발자의 공개된 패키지를 저장하고 빌드하는 공간이며, 대부분 작업은 여기서 합니다. 사용자가 원하는 곳에 생성할 수 있으나 보통 '/home/사용자명/catkin_ws/'에 생성됩니다. 그래야 빌드하기 쉽습니다. ~catkin_ws/ 하의 세부파일은 다음과 같습니다.

파일 내용
/build 빌드 관련 파일. catkin_make 후에 생성됨
/devel msg, srv 헤더 파일, 사용자 패키지 라이브러리, 실행파일.catkin_make 후에 생성됨
/src 사용자 패키지. 사용자 소스 코드의 공간

특히 /src 폴더는 패키지가 저장되고 사용되는 공간으로 주로 이 폴더 안에서 작업이 이뤄지므로 하위 폴더 구성을 알아둘 필요가 있습니다.

파일 내용
/include 헤더 파일
/launch roslaunch에 사용되는 .launch 파일
/node rospy용 스크립트
/msg 메시지 파일
/src 코드 소스 파일
/srv 서비스 파일
CMakeList.txt 빌드 설정 파일
package.xml 패키지 설정 파일
LIST

'ROS' 카테고리의 다른 글

package 빌드와 node 작성  (0) 2023.02.22
Linux, ROS 주요 명령어  (1) 2023.02.20