Priceless
[ROS1] ROS1 기초 본문
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
'ROS1 & ROS2' 카테고리의 다른 글
[ROS1] ROS1 launch (0) | 2023.10.08 |
---|---|
[ROS1] ROS1 Package(패키지) (0) | 2023.10.08 |
[ROS1] ROS1 Publish, Subscribe, Topic 이해하기(with turtlesim) (1) | 2023.10.08 |
[ROS] ROS2 빌드 설정 파일 (0) | 2022.11.17 |
[ROS]Ubuntu 20.04 & ROS 2 Foxy 설치 (0) | 2022.09.18 |