Priceless

[ROS1] ROS1 기초 본문

ROS1 & ROS2

[ROS1] ROS1 기초

Hyun__ 2023. 10. 6. 14:05

ROS 배경 지식

ROS 구성도

ROS는 OS 위에서 동작하는 프레임워크로

Linux/Windows 등 OS 위의 구조를 나타낸다

 

ROS가 제공하는 도구 

RVIZ

- 시각화 도구

- 센서를 통해 얻은 주변 환경의 데이터, 로봇의 움직임 데이터 등을 시각화

 

RQT

- Qt 기반의 GUI 응용 개발 도구

- 노드 연결 정보를 그래프로 표현

- UI를 갖춘 개발 과정에 사용자 상호작용을 직접 확인 가능하다

- rqt_graph

명령어를 통해 노드와 토픽의 관계 정보를 그래프로 출력

 

GAZEBO

- 물리 엔진 기반의 3차원 시뮬레이터

- 가상 공간에서 물리적 상호작용을 확인하여 시뮬레이터 제작 및 모델링에 이용

 

 

ROS에서의 통신

- Topic의 publish(발행) 와 subscribe(구독) 기반의 메시지 교환

- ROS가 설치된 기기들 간에는 메시지 교환이 가능하다

 

ROS의 핵심 기능

- 노드간 통신을 기반으로 전체 시스템을 구동한다

- 노드에 하드웨어 부품 또는 소프트웨어 모듈 등이 하나씩 할당된다

- 노드는 OS를 통해 하드웨어를 제어한다

- 노드들은 마스터의 통신 제어를 통해 서로 메시지를 주고 받는다

 

- ROS를 통해 서로 다른 하드웨어에 있는 노드들이 네트워크를 통해 원격으로 통신하며 하나의 시스템으로 동작할 수 있다

ROS 용어

Master

- 노드 사이의 통신을 관리

- ROS core가 이에 해당한다

 

Node(노드)

- 실행 가능한 최소 단위, 하나의 프로세스

- ROS에서 메시지 통신의 주체

- 하드웨어 기기마다 하나씩, 소프트웨어 모듈에 대해 하나씩 노드를 할당한다

 

Topic(토픽)

- 노드 간 주고 받는 데이터, 메시지

- 센서 데이터, 카메라 이미지, 제어 명령 등

 

Publisher(발행자)

- 토픽에 메시지를 담아 외부로 송신하는 노드

- 센서, 카메라, 모터제어 알고리즘 등 특정 값을 보낸다

Subscriber(구독자)

- 토픽에 담겨진 메시지를 수신하는 노드

- 액츄에이터 제어기, 데이터 시각화 도구 등 입력 받은 값을 통해 임무를 수행한다

Package(패키지)

- 하나 이상의 노드와 노드의 실행을 위한 정보 등을 묶어 놓은 단위

- 노드, 라이브러리, 데이터, 파라미터, 세팅값 등을 포함한다

Catkin

- ROS에서 프로그램을 실행하기 위해 라이브러리, 스크립트 등을 빌드하기 위해 사용하는 빌드 시스템

- 보통 Cmakelist.txt와 package.xml을 사용한다

Workspace(작업공간)

- 하나의 ROS 프로그램과 관련된 ROS 코드를 모아두는 저장소

 

 

ROS 응용

- 아래와 같이 두 종류의 노드가 존재

센서는 센싱 데이터를 publish 하며, 액츄에이터는  제어 명령 데이터를 subscribe 한다

 

- 제어 알고리즘 노드를 추가하여 센서 데이터를 subscribe하고 제어 명령을 publish한다

 

ROS 노드 간 통신 과정

- 통신을 원하는 노드는 마스터를 통해 연결해야 하는 노드와 서로 노드 정보를 교환한다

- 노드 간 통신 환경이 구축되면 노드 간 통신은 마스터를 거치지 않고 직접 이루어진다

마스터는 사라지지 않고 계속 존재한다

 

 

ROS 노드 간 통신 방식

Topic 방식의 통신

- 일방적이고 지속적인 메시지 전송

- 1대1부터 N대N 통신 등 가능

Service 방식의 통신

- 서버가 제공하는 서비스에 클라이언트가 요청을 보내고 응답을 받는 방식

- 양방향 통신, 1회성 메시지 송수신

 

 

ROS 노드 간 통신 시나리오

1. 마스터(roscore) 시동

- 통신하기 위해 우선 roscore가 실행되고 있어야 한다

- 마스터의 주소는 모든 노드가 알고 있어야 한다 

 

2. Subscriber(구독자) 노드 구동

- 특정 토픽에 publish(발행)되는 메시지를 수신하기를 요청

- 구독자의 노드 정보를 마스터에 전달한다

 

3. Publisher(발행자) 노드 구동

- 특정 토픽 메시지를 발행하기를 요청

- 발행자의 노드 정보를 마스터에게 전달한다

 

4. 노드 정보 전달

- 마스터가 publisher 정보를 subscriber정보를 전달

- 마스터가 양쪽 정보를 가지고 있으므로 서로의 토픽을 확인하고 연결한다

 

5. 노드 간 접속 요청

- subscriber 노드가 publisher 노드에 TCPROS 접속을 요청

 

6. 노드 간 접속 요청에 대한 응답

- 발행자 노드가 자신의 TCPROS URI(포트 번호 포함)를 전송하여 응답

ROS_HOSTNAME:3456과 같은 방식

 

7. TCPROS 접속

- publisher 노드와 subscriber 노드 사이에 소켓 연결이 이루어진다

 

8. 메시지 전송

- publisher 노드가 subscriber 노드에게 메시지 전송 (topic)

9. 메시지 전송 반복

- 접속이 한 번 이루어진 이후 지속적으로 메시지 송수신

- 마스터는 메시지 전송에 관여하지 않는다

 

 

ROS 명령어

- roscore

: ROS 시스템이 구동되기 위한 필요한 프로그램 실행

roscore

 

- rosrun <package name> <node name>

: 패키지에 있는 노드를 선택하여 실행

 

- rosnode info <node name>

: 노드의 정보를 출력

 

- rostopic info <topic name>

: 토픽의 정보를 출력

 

- roslaunch <package name> <file.launch>

: 파라미터 값과 함께 노드 실행

실행할 노드 목록을 적어 놓은 launch 파일을 실행한다

 

빌드 명령: catkin_make

- ROS의 워크스페이스에서 새로운 소스 파일이나 패키지가 만들어지면

catkin_make 명령어를 통해 빌드 작업을 진행한다

- 프로그램을 실행하기 위한 파일들을 최신 상태로 만드는 작업

Bash 작업 환경 설정 명령어

- bash 파일을 수정하기 위한 명령어

gedit ~/.bashrc

 

- 수정한 bash 내용을 시스템에 적용

source .bashrc

 

- ROS 작업에 필요한 환경변수 설정 확인

printenv | grep ROS