[ROS] ROS 개요
ROS란?
ROS 위키에서는 ROS는 로봇 응용프로그램을 개발할 때 필요한
- 하드웨어 추상화
- 하위 디바이스 제어
- 로보틱스에서 많이 사용되는 센싱
- 인식,지도 작성
- 모션 플래닝등의 기능 구현
- 프로세스 사이의 이미지 패싱 패키지 관리
- 개발환경에 필요한 라이브러리와 다양한 개발과 디버깅 도구를 제공 한다로 정의하고 있다.
ROS는 메타 운영체제?
- 앱과 분산 컴퓨팅 자원간의 가상화 레이어로 분산 컴퓨팅 자원을 활용하여 스케줄링 및 로드, 감시, 에러 처리 등을 실행하는 시스템이다.
- 분산 프로세스 : 최소 단위의 실행 가능한 프로세스(노드) 형태로 프로그램하며, 각 프로세스는 독립적으로 실행되면서 유기적으로 데이터를 주고 받는다.
- 패키지 단위 관리 : 같은 목적을 갖는 복수 개의 프로세스를 패키지 단위로 관리하기 때문에 개발은 물론 사용하기에도 편하고 공유 및 수정 후 재배포도 쉽다.
- 공개 리포지토리 : 각 패키지는 개발자가 선호하는 공개 리포지토리 등에 패키즈를 공개하고 각 라이선스도 밝히게 되어있ㄷ.
- API 형태 : ROS 를 활용한 프로그램을 개발할 때 ROS는 단순히 API를 불러와 자신이 사용하던 코드에 쉽게 삽입할 수 있도록 설계되었다. 각 장에 소개된 소스 코드를 보면 ROS 프로그래밍과 C++, Python 프로그램이 별반 다를 게 없다는 것을 알게 될 것이다.
- 복수의 프로그래밍 지원 : ROS 프로그램은 다양한 언어를 지원하기 위해 클라이언트 라이브러리를 제공한다.
ROS의 구성
- 클라이언트 라이브러리 : 다양한 프로그래밍 언어를 지원하기 위한
- 하드웨어 인터페이스 : 하드웨어 제어를 위한
- 커뮤니케이션 레이어 : 데이터 통신을 위한
- 로보틱스 애플리케이션 프레임워크 : 로보틱스 응용프로그램의 작성을 돕는
- 로보틱스 애플리케이션 : 로보틱스 애플리케이션 프레임워크를 기반으로 한 서비스용 응용 프로그램
- 시뮬레이션 : 가상의 공간에서 로봇을 제어해 볼 수 있는
- 소프트웨어 개발 툴
ROS 용어 정리
- 마스터
- 마스터는 노드와 노드 사이의 연결과 메시지 통신을 위한 네임 서버와 같은 역할을 한다.
roscore
가 실행 명령어이며, 마스터를 실행하면 각 노드의 이름을 등록하고 필요에 따라 정보를 받을 수 있다.- 마스터가 없이는 노드간의 접속, 토픽과 서비스와 같은 메시지 통신을 할 수 없다.
- 노드
- 노드는 ROS에서 실행되는 최소 단위의 프로세서
- 하나의 실행가능한 프로그램
- 하나의 목적에 하나의 노드 작성
- 퍼블리셔 , 서브스크라이버, 서비스 서버, 서비스 클라이언트
- 패키지
- ROS를 구성하는 기본 단위
- 하나 이상의 노드를 포함하거나 다른 패키지의 노드를 실행하기 위한 설정 파일들 포함
- 메타 패키지
- 공통된 목적을 가진 패키지들의 집합
- 메시지
- 노드는 메시지를 통해 노드 간의 데이터를 주고 받는다.
- 메시지는 integer, floating point, boolean 과 같은 변수형태이고, 데이터 구조도 가능
- 토픽
- 퍼블리셔 노드가 하나의 이야깃거리에 대해서 토픽으로 마스터에 등혹한후, 이야깃거리에대한 이야기를 메시지 형태로 퍼블리시한다.
- 서브스크라이버는 마스터에 등록된 토픽이름에 해당하는 퍼블리셔의 노드 정보를 받는다.
- 퍼블리셔 노드에서 서브스크라이버 노드로 메시지를 토픽으로 송수신
퍼블리시 및 퍼블리셔
- 퍼블리시 : 토픽의 내용에 해당하는 메시지 형태의 데이터를 송수신하는 것
- 퍼블리셔 노드 : 퍼블리시를 수행하기 위해 토픽을 포함한 자신의 정보들을 마스터에 등록, 서브스크라이버에 메시지 전송
서브스크라이브 및 서브스크라이버
- 서브스크라이브 : 토픽의 내용에 해당하는 메시지를 원하는 서브스크라이버 노드에 보내는 것
- 서브스크라이버 노드 : 서브스크라이버를 하기 위해 마스터에 자신의 노드 정보 및 자신이 원하는 토픽을 등로하고 자신이 원하는 토픽을 퍼블리시하는 퍼블리셔 노드의 정보를 마스터에게 받는다. 직접 퍼블리셔 노드에 접속하여 메시지를 받는다.
서비스
- 서비스 메시지 통신은 특정 목적의 작업에 해당되는 서비스를 요청하는 서비스 클라이언트와 서비스 응답을 담당하는 서비스 서버간의 동기적 양방향 서비스 메시지 통신을 말한다.
서비스 서버
- 서비스 서버는 요청을 입력으로 받고 응답을 출력으로하는 서비스 메시지 통신의 서버 역할을 말한다. 요청과 응답은 모두 메시지로 되어 있으며, 서비스 요청을 받으면 지정된 서비스를 수행한 다음에 그 결과를 서비스 클라이언트에게 전달한다. 서비스 서버는 정해진 명령을 받아 수행하는 노드에 사용된다.
서비스 클라이언트
- 서비스 클라이언트는 요청을 출력으로 하고, 응답을 입력으로 받는 서비스 메시지 통신의 클라이언트 역할을 말한다. 요청과 응답은 모두 메시지로 되어 있으며, 서비스 요청을 서비스 서버에 전달하고 그 결과값을 받는다. 서비스 클라이언트는 정해진 명령을 지시하고 결과 값을 받는 노드에 사용된다.
액션
- 액션은 서비스처럼 양방향을 요구하나 요청 처리 후 응답까지 오랜시간이 걸리고 중간 결과값이 필요한 경우에 사용되는 메시지통신 방식
- 액션 파일도 서비스와 많이 비스한데, 요청과 응답에 해당되는 목표와 결과가 있다. 여기에 중간 결과값에 해당되는 피드백이 추가되었다.
액션 서버
- 액션 서버는 액션 클라이언트로부터 목표를 입력으로 받고, 결과 및 피드백 값을 출력으로 하는 메시지 통신의 서버 역할을 말한다. 액션 클라이언트로부터 목푯값을 전달받은 후 지정된 실질적인 액션의 실행을 담당한다.
액션 클라이언트
- 액션 클라이언트는 목표를 출력으로 하고, 액션 서버로부터 결과 및 피드백 값을 입력으로 받는 메시지 통신의 클라이언트 역할을 말한다. 액션 서버에게 목표를 전달하고 결과 및 피드백을 수신 받아 다음 지시를 내리거나 목표를 취소하는 역할을 한다.
캐킨
- 캐킨은 ROS의 빌드 시스템을 말한다. ROS의 빌드 시스템은 기본적으로 CMake를 이용하고 있어서 패키지 폴더에 CMakeList.txt라는 파일에 빌드 환경을 기술하고 있다. 캐킨 빌드 시스템은 ROS와 관련된 빌드, 패키지 관리, 패키지 간의 의존관계 등을 편리하게 사용할 수 있게 한다. 현시점에서 ROS를 사용한다면 ROS 빌드가 아닌 캐킨을 사용해야한다.
roscore
roscore
는 ROS마스터를 구동하는 명령어이다. 같은 네트워크라면 다른 컴퓨터에서 실행해도된다. 단, 멀티 roscore를 지원하는 특수한 경우를 제외하고는 같은 네트워크에서 하나만 구동된다. ROS를 구동하면 사용자가 정해놓은ROS_MASTER_URI
변수에 기재된 URI주소와 포트를 사용하게 된다. 사용자가 설정해놓지 않았으면 URI의 주소로 현재 로컬 IP를 사용하고 11311포트를 이용한다.
rosrun
- rosrun은 ROS의 기본 실행 명령어이다. 패키지에서 하나의 노드를 실행하는데 사용된다. 노드가 사용하는 URI 주소와 포트는 현재 노드가 실행 중인 컴퓨터에 저장된 ROS_HOSTNAME 환경변수값을 URI 주소로 사용하며, 포트는 임의의 고유값으로 설정된다.
roslaunch
rosrun
이 하나의 노드를 실행하는 명령어라면 roslaunch는 여러 노드를 실행하는 개념이다. 이 명령어를 통해 하나 그 이상의 정해진 노드를 실행시킬 수 있다. 그 밖의 기능으로 노드를 실행할 때 패키지의 파라미터나 노드 이름 변경, 노드 네임스페이스 설정, ROS_ROOT 및 ROS_PACKAGE_PATH 설정, 환경변수 변경 등 많은 옵션을 갖춘 노드 실행에 특화된 ROS 명령어이다.