[2023-03-27] 1. ROS
ROS
ROS란?
- 오픈소스 로봇 운영체제
- 소스 무료 공개
- 개방형 구조
- 활발한 커뮤니티 활동
- 로봇 소프트웨어를 개발하는데 필요한 소프트웨어의 집합체
- 소프트웨어 프레임워크
- 메타 운영체제(Meta OS), 미들웨어
- 소프트웨어 모듈 + 라이브러리 집합 + 도구 집합
- 각종 센서와 모터를 프로그래머가 편하게 사용할 수 있도록 지원
ROS 구성도
ROS의 특징
-
로봇 SW를 만들기 위한 코드의 재사용이 용이한 환경제공이 목표
- 다양한 프로그래밍 언어를 지원 : C++, Python
- 표준화된 ROS 인터페이스를 따르는 HW와 SW를 편하게 엮을 수 있음
- 하드웨어 부품과 소프트웨어 부품을 조립하여 여러 응용 구성 가능
- 대규모 실행 시스템 및 프로세스에 적용 가능
-
다양한 도구들을 함께 제공
-
RVIZ
-
시각화 도구
-
센서 데이터를 비롯한 주변 환경 변화를 시각화
-
숫자 지표를 개발자가 보기 편하게 시각화
-
-
RQT
-
Qt 기반의 GUI 응용 개발 도구
-
노드연결 정보를 그래프로 표현
-
사용자 상호작용을 UI를 갖춘 응용 개발에 이용
-
-
GAZEBO
-
물리 엔진 기반의 3차원 시뮬레이터
-
시뮬레이터 제작 및 모델링에 이용
-
-
-
다양한 OS 환경에서 통일된 방법으로 상호작용을 구현하는 것이 가능
- 리눅스, OS X, Windows, Raspbian, QNX, RTOS, Andrioid, IOS 등
- 표준화된 통신 프로토콜을 따르는 이기종간의 메시지 교환 가능
ROS 배포판
- ROS 버전
- ROS Melodic Morenia : May 23rd, 2018 - May 2023
- ROS Lunar Loggerhead : May 23rd, 2017 - May 2019
- ROS Kinetic Kame : May 23rd, 2016 - April 2021
- ROS Indigo Igloo : July 22nd, 2014 - April 2019
ROS 핵심 기능
- 노드간 통신을 기반으로 전체 시스템을 구동
- 하드웨어 부품 / 소프트웨어 모듈에 노드가 하나씩 할당됨
-
네트워크를 통한 원격 연동 가능
ROS 기반의 구현 사례
-
라이다 + 카메라 + 모터 + SW모듈1 + SW모듈2
-
하드웨어 장치 3개와 소프트웨어 모듈 2개를 함께 엮어서 원하는 기능 구현
-
라이다와 카메라 정보를 상황인지SW가 분석한 후 결과를 운전판단 SW로 보냄
-
운전판단 SW가 제어 명령을 생성해서 모터로 보내고 차량을 움직임
-
ROS에서 사용하는 기본 용어
-
마스터(Master)
- 서로 다른 노드들 사이의 통신을 총괄 관리
- 통상 ‘ROS Core’라고 부름
-
노드(Nodes)
- 실행 가능한 최소의 단위, 프로세스로 이해할 수 있음
- ROS에서 발생하는 통신(메시지 송/수신)의 주체
- HW장치에 대해 하나씩의 노드, SW모듈에 대해 하나씩의 노드 할당
-
토픽(Topics)
-
ROS 노드들이 관심을 갖고 있는 이야깃거리
-
그 안에 들어있는 실제 데이터를 메시지라고 부름
e.g. 센서데이터, 카메라 이미지, 엑츄에이터 제어명령, …
-
-
발행자(Publishers)
-
특정 토픽에 메시지를 담아 외부로 송신하는 노드
e.g. 센서, 카메라, 모터제어 알고리즘, …
-
-
구독자(Subsribers)
-
특정 토픽에 담겨진 메시지를 수신하는 노드
e.g. 엑츄에이터 제어기, 데이터 시각화 도구, …
-
-
패키지(Packages)
- 하나 이상의 노드와 노드의 실행을 위한 정보 등을 묶어 놓은 단위
- 노드, 라이브러리, 데이터, 파라미터 등을 포함
- 예를 들어 라이다 하드웨어 장치를 하나 사면, 라이다에 관한 ROS 패키지 1개를 다운로드함
간단한 ROS 응용
-
센서
-
각각 어느 토픽에 어떤 형태의 메시지를 발행하는지 정해져 있음
-
온도센서
-
습도센서
-
-
액츄에이터
-
어느 토픽에 어떤 메시지를 발행하면 어떻게 동작하는지 정해져있음
-
-
통합
-
온도센서 노드와 습도센서 노드는 주기적으로 각 토픽에 센싱데이터를 넣어서 발행
-
제어 알고리즘 노드는 수집된 데이터에 따른 제어 결정을 내리고 명령을 발행
-
에어컨 제어 노드는 명령 토픽을 구독하고 하드웨어인 에어컨 제어 신호를 생성
-
ROS 노드 간 통신 기본 과정
- 통신이 이루어지기 이전에 통신을 원하는 노드는 마스터에 의뢰하여 연결해야하는 노드의 정보를 얻어오고 서로의 접속 정보를 교환함
- 통신환경 구축이 완료되면 노드간 통신은 마스터를 거치지 않고 직접 이루어짐
- 토픽(topic) 방식의 통신
- 일방적이고 지속적인 메시지 전송
- 1:1 뿐만 아니라 1:N, N:N 통신도 가능
- 서비스(Service) 방식의 통신
- 서버가 제공하는 서비스에 클라이언트가 요청을 보내고 응답을 보내는 방식
- 양방향 통신, 일회성 메시지 송수신
Ros 노드간 통신 시나리오
- 마스터(ROS Core) 시동
- 통신이 이루어지려면 우선은 ROS Core가 실행되고 있어야함’
- 구독자 노드 구동
- 특정 토픽에 발행되는 메시지를 수신하기 요청
- 발행자 노드 구동
- 특정 토픽 메시지를 발행하겠다는 의사를 전달
- 노드 정보 전달
- 마스터가 발행자 정보를 구독자에게 전달
- 노드간 접속 요청
- 구독자 노드가 발행자 노드에게 TCPROS 접속을 요청
- 노드간 접속 요청에 대한 응답
- 발행자 노드가 자신의 TCPROS URI(포트 포함)를 전송하여 응답
- TCPROS 접속
- 발행자 노드와 구독자 노드 사이에 소켓 연결이 이루어짐
- 메시지 전송
- 발행자 노드가 구독자 노드에게 메시지 전송
- 메시지 전송 반복
- 접속이 한번 이루어진 뒤에는 별도 절차 없이 지속적으로 메시지 송수신
ROS 기본 명령어
-
ROS 셀 명령어
- roscd : 지정한 ros 패키지 폴더로 이동
- rosls : ros 패키지 파일 목록 확인
- rosed : ros 패키지 파일 편집
- roscp : ros 패키지 파일 복사
-
ROS 실행 명령어
-
roscore : master + rosout + parameter server
- $ roscore
-
rosrun : 패키지 노드 실행
-
$ rosrun [pakage name] [node_name]
e.g. $rosrun turtlesim turtlesim_node
-
-
roslaunch : 패키지 노드를 여러개 실행(파라미터 값과 함께 노드를 실행)
-
$ roslaunch [package_name] [file.launch]
e.g. $ roslaunch usb_cam usb_cam-test.launch
-
-
rosclean : ros 로그 파일 검사 및 삭제
-
-
ROS 정보 명령어
-
rostopic : 토픽의 정보를 표시
-
$ rostopic [option]
e.g. $ rostopic info /imu
-
-
rosnode : 노드의 정보를 표시(발행, 구독 정보)
-
$ rosnode [info..]
e.g. $ rosnode info node_name
-
-
rosparam : 파라미티 정보 확인, 수정
-
rosbag : 메시지 기록, 재생
-
rosmsg : 메세지 정보 확인
-
rosversion : 패키지 및 배포 버전정보 확인
-
roswtf : ros 시스템 검사
-
-
ROS catkin 명령어
- catkin_create_pkg : catkin 빌드 시스템으로 패키지 생성
- catkin_make : catkin 빌드 시스템으로 빌드
- catkin_eclipse : 패키지를 eclipse에서 사용할 수 있게 변경
- catkin_prepare_release : changelog 정리 및 버전 태깅
- catkin_init_workspace : catkin 빌드 시스템의 작업 폴더 초기화
- catkin_find : 검색
-
ROS package 명령어
- rospack : 패키지와 관련된 정보 보기
- rosinstall : 추가 패키지 설치
- rosdep : 해당 패키지의 의존성 파일 설치
- roslocate : 패키지 정보 관련 명령어
- rosmake : 패키지 빌드(구 시스템)
- rosecreate-pkg : 패키지 자동 생성(구 시스템)
$ rqt_graph
- 노드와 토픽의 관계 정보를 그래프로 출력