ROS 개요
ROS란 로봇 응용프로그램을 개발할 때 필요한 오픈소스 로봇 운영체제라고 할 수 있다. 기본적으로 가볍게 설계되어 있어 main()으로 불러오지 않아도 되고, python과 c++로 구현되어 있다.
- 하드웨어 추상화
- 저수준 기기 제어
- 로보틱스에서 많이 사용되는 센싱
- 인식, 지도 작성
- 모션 플래닝등의 기능 구현
- 프로세스 사이간 메시지 전달, 패키지 관리 기능 제공
- 개발환경에 필요한 라이브러리와 다양한 개발과 디버깅 도구을 제공한다.
- 공동 작업 가능
메타운영체제
메타운영체제(Meta-Operating System)은 어플리케이션과 분산 컴퓨팅 자원간의 가상화 레이어로 분산 컴퓨팅 자원을 활용하여, 스케쥴링 및 로드, 감시, 에러 처리 등을 실행하는 시스템이다. 또, 다수의 하드웨어간의 데이터 송수신, 스케쥴링, 에러 처리 등 로봇 응용 소프트웨어를 위한 필수 기능들을 라이브러리 형태로 제공하고 있다. 이런 로봇 소프트웨어 프레임워크를 기반으로 다양한 목적의 응용 프로그램을 개발, 관리, 제공하고 있으며 유저들이 개발한 패키지 또한 유통하는 생태계를 갖추고 있다.
ROS 용어 정리
- 노드 최소 단위의 실행 가능한 프로세서를 가리키는 용어로서 하나의 실행 가능한 프로그램이다. ROS에서는 최소한의 실행단위로 프로그램을 나누어 작업하게 되므로 각 노드는 메시지 통신으로 데이터를 주고 받는다.
- 퍼블리셔, 서브스크라이버, 서비스 서버, 서비스 클라이언트
마스터 마스터는 노드와 노드 사이의 연결과 메시지 통신을 위한 네임 서버와 같은 역할을 한다.
roscore
가 실행 명령어이고, 마스터를 실행하면 각 노드의 이름을 등록하고 필요에 따라 정보를 받을 수 있다. 마스터가 없이는 노드간의 접속, 토픽과 서비스와 같은 메시지 통신을 할 수 없다.패키지 하나 이상의 노드, 노드 실행을 위한 정보 등을 묶어 놓는 것이다. 즉 ROS를 구성하는 기본 단위로, 하나 이상의 노드를 포함하거나 다른 패키지의 노드를 실행하기 위한 설정 파일들을 포함한다. 패키지의 묶음을 메타패키지라 하여 따로 분리한다.
- 메시지 메시지를 통해 노드간의 데이터를 주고받게 된다. 메시지는 integer, floating, point, boolean와 같은 변수형태다. 또한, 메시지 안에 메시지를 품고 있는 간단한 데이터 구조 및 메시지들의 배열과 같은 구조도 사용할 수 있다.
- 퍼블리시 및 퍼블리셔
- 퍼블리시: 토픽의 내용에 해당하는 메시지 형태의 데이터를 송수신
- 퍼블리셔 노드: 퍼블리시를 수행하기 위해 토픽을 포함한 자신의 정보들을 마스터에 등록, 서브스크라이버에 메시지 전송
- 서브스크라이브 및 서브스크라이버
- 서브스크라이브: 토픽의 내용에 해당하는 메시지를 원하는 서브스크라이버 노드에 보냄
- 서브스크라이버 노드: 서브스크라이버를 하기 위해 마스터에 자신의 노드 정보 및 자신이 원하는 토픽을 등록하고, 자신이 원하는 토픽을 퍼블리시하는 퍼블리셔 노드의 정보를 마스터에게 직접 퍼블리셔 노드에 접속해서 메시지를 받는다.
- 토픽 퍼블리셔 노드가 하나의 이야깃거리에 대해 토픽으로 마스터에 등록한 후 이야기거리에 대한 이야기를 메시지 형태로 퍼블리시한다. 서브스크라이버는 마스터에 등록된 토픽이름에 해당하는 퍼블리셔의 노드 정보를 받는다. 퍼블리셔 노드에서 서브스크라이버 노드로 메시지를 토픽으로 송수신한다. 하나의 토픽에 대해 복수의 퍼블리셔, 복스의 서브스크라이버도 가능하다.
서비스 서비스 메시지 통신은 특정 목적의 작업 해당되는 서비스를 요청하는 서비스 클라이언트와 서비스 응답을 담당하는 서비스 서버간의 동적 양방향 서비스 메시지 통신을 말한다.
서비스 서버 서비스 서버는 요청을 입력으로 받고 응답을 출력으로 하는 서비스 메시지 통신의 서버 역할을 말한다. 요청과 응답은 모두 메시지로 되어 있으며, 서비스 요청을 받으면 지정된 서비스를 수행한 다음 그 결과를 서비스 클라이언트에게 전달한다. 서비스 서버는 정해진 명령을 받아 수행하는 노드에 사용된다.
서비스 클라이언트 서비스 클라이언트는 요청을 출력으로 하고, 응답을 입력으로 받는 서비스 메시지 통신의 클라이언트 역할을 말한다. 요청과 응답은 모두 메시지로 되어 있으며, 서비스 요청을 서비스 서버에 전달하고 그 결과값을 받는다. 서비스 클라이언트는 정해진 명령을 지시하고 결과 값을 받는 노드에 사용된다.
액션 액션은 서비스처럼 양방향을 요구하나 요청 처리 후 응답까지 오랜시간이 걸리고, 중간 결과값이 필요한 경우에 사용되는 메시지통신 방식이다. 액션 파일은 서비스와 비슷하게 요청과 응답에 해당되는 목표와 결과가 있지만, 중간 결과값에 해당되는 피드백이 추가되었다.
액션 서버 액션 서버는 액션 클라이언트로부터 목표를 입력으로 받고, 결과 및 피드백 값을 출력으로 하는 메시지 통신의 서버 역할을 한다. 액션 클라이언트로부터 목표값을 전달받은 후 지정된 실질적인 액션의 실행을 담당한다.
액션 클라이언트 액션 클라이언트는 목표를 출력으로 하고, 액션 서버로부터 결과 및 피드백 값을 입력으로 받는 메시지 통신의 클라이언트 역할을 말한다. 액션 서버에게 목표를 전달하고 결과 및 피드백을 수신 받아 다음 지시를 내리거나 목표를 취소하는 역할을 한다.
catkin 캐킨은 ROS의 빌드 시스템을 말한다. ROS의 빌드 시스템은 기본적으로 CMake를 이용하고 있어서 패키지 폴더에 CMakeList.txt라는 파일에 빌드 환경을 기술하고 있다. 캐킨 빌드 시스템은 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명령어이다.
노드 간의 통신
- 마스터 구동 ($roscore)
서브스크라이버 노드 구동 ($rosrun 패키지이름 노드이름)
퍼블리셔 노드 구동 ($rosrun 패키지이름 노드이름)
- 퍼블리셔 정보 알림
- 마스터는 서브스크라이버 노드에게 새로운 퍼블리셔 정보를 알린다.
- 퍼블리셔 노드에 접속 요청
- 마스터로부터 받은 퍼블리셔 정보를 이용하여 TCPROS 접속을 요청
- 서브스크라이버 노드에 접속 응답
- 접속 응답에 해당되는 자신의 TCP URI 주소와 포트번호를 전송
- TCP 접속
- TCPROS를 이용하여 퍼블리셔 노드와 직접 연결한다.
- 메시지 전송
- (퍼블리셔)발행자 노드는 서브스크라이버 노드에게 메시지를 전송 (토픽)
- 토픽방식에서는 접속을 끊지 않는 이상 지속적으로 메시지를 전송한다. (연속성)
- 서비스 요청 및 응답
- 1회에 한해 접속, 서비스 요청 및 서비스 응답이 수행되고, 서로간의 접속을 끊는다.
- 서비스는 토픽과 달리 1회에 한해 접속하고, 서비스 요청 및 서비스 응답을 수행한 후 서로간의 접속을 끊게 된다. (1회성)
ROS 패키지 설치
일단 Ubuntu 버전별로 ROS 버전이 다르다. 따라서 자신의 버전에 맞는 버전을 다운받아야 한다.
- Ubuntu 14.04 > ROS indigo
- Ubuntu 16.04 > ROS Kinetic
- Ubuntu 18.04 > ROS melodic
- Ubuntu 20.04 > ROS noetic
1
2
3
4
5
6
7
8
# 자신의 ubuntu 버전 확인하기
ice@LAPTOP-FCNUC3SV: ~$lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
- ROS 패키지 소프트웨어를 설치할 수 있도록 컴퓨터를 설정
1
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
- 키 설정
1
2
sudo apt install curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
- 키 등록 후 업데이트
1
sudo apt update
- 패키지 다운로드
1
sudo apt install ros-noetic-desktop-install
- 사용 가능한 패키지 찾기
1
apt search ros-noetic
- ROS 환경변수를 bash에 추가
1
2
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
- 추가적인 패키지 설치
1
sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
- rosdep 초기화
1
2
sudo rosdep init
rosdep update
- 설치확인
1
roscore