ROS

image

ROS란?

  • 오픈소스 로봇 운영체제
    • 소스 무료 공개
    • 개방형 구조
    • 활발한 커뮤니티 활동
  • 로봇 소프트웨어를 개발하는데 필요한 소프트웨어의 집합체
    • 소프트웨어 프레임워크
  • 메타 운영체제(Meta OS), 미들웨어
    • 소프트웨어 모듈 + 라이브러리 집합 + 도구 집합
  • 각종 센서와 모터를 프로그래머가 편하게 사용할 수 있도록 지원

ROS 구성도

image

ROS의 특징

  • 로봇 SW를 만들기 위한 코드의 재사용이 용이한 환경제공이 목표

    • 다양한 프로그래밍 언어를 지원 : C++, Python
    • 표준화된 ROS 인터페이스를 따르는 HW와 SW를 편하게 엮을 수 있음
    • 하드웨어 부품과 소프트웨어 부품을 조립하여 여러 응용 구성 가능
    • 대규모 실행 시스템 및 프로세스에 적용 가능
  • 다양한 도구들을 함께 제공

    • RVIZ

      • 시각화 도구

      • 센서 데이터를 비롯한 주변 환경 변화를 시각화

      • 숫자 지표를 개발자가 보기 편하게 시각화

        image

    • RQT

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

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

      • 사용자 상호작용을 UI를 갖춘 응용 개발에 이용

        image

    • GAZEBO

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

      • 시뮬레이터 제작 및 모델링에 이용

        image

  • 다양한 OS 환경에서 통일된 방법으로 상호작용을 구현하는 것이 가능

    • 리눅스, OS X, Windows, Raspbian, QNX, RTOS, Andrioid, IOS 등
    • 표준화된 통신 프로토콜을 따르는 이기종간의 메시지 교환 가능

    image

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 핵심 기능

  • 노드간 통신을 기반으로 전체 시스템을 구동
    • 하드웨어 부품 / 소프트웨어 모듈에 노드가 하나씩 할당됨

image

  • 네트워크를 통한 원격 연동 가능

    image

ROS 기반의 구현 사례

image

  • 라이다 + 카메라 + 모터 + SW모듈1 + SW모듈2

  • 하드웨어 장치 3개와 소프트웨어 모듈 2개를 함께 엮어서 원하는 기능 구현

    1. 라이다와 카메라 정보를 상황인지SW가 분석한 후 결과를 운전판단 SW로 보냄

    2. 운전판단 SW가 제어 명령을 생성해서 모터로 보내고 차량을 움직임

ROS에서 사용하는 기본 용어

  • 마스터(Master)

    • 서로 다른 노드들 사이의 통신을 총괄 관리
    • 통상 ‘ROS Core’라고 부름
  • 노드(Nodes)

    • 실행 가능한 최소의 단위, 프로세스로 이해할 수 있음
    • ROS에서 발생하는 통신(메시지 송/수신)의 주체
    • HW장치에 대해 하나씩의 노드, SW모듈에 대해 하나씩의 노드 할당
  • 토픽(Topics)

    • ROS 노드들이 관심을 갖고 있는 이야깃거리

    • 그 안에 들어있는 실제 데이터를 메시지라고 부름

      e.g. 센서데이터, 카메라 이미지, 엑츄에이터 제어명령, …

  • 발행자(Publishers)

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

      e.g. 센서, 카메라, 모터제어 알고리즘, …

  • 구독자(Subsribers)

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

      e.g. 엑츄에이터 제어기, 데이터 시각화 도구, …

  • 패키지(Packages)

    • 하나 이상의 노드와 노드의 실행을 위한 정보 등을 묶어 놓은 단위
    • 노드, 라이브러리, 데이터, 파라미터 등을 포함
    • 예를 들어 라이다 하드웨어 장치를 하나 사면, 라이다에 관한 ROS 패키지 1개를 다운로드함

간단한 ROS 응용

  • 센서

    • 각각 어느 토픽에 어떤 형태의 메시지를 발행하는지 정해져 있음

    • 온도센서

      image

    • 습도센서

      image

  • 액츄에이터

    • 어느 토픽에 어떤 메시지를 발행하면 어떻게 동작하는지 정해져있음

      image

  • 통합

    • 온도센서 노드와 습도센서 노드는 주기적으로 각 토픽에 센싱데이터를 넣어서 발행

    • 제어 알고리즘 노드는 수집된 데이터에 따른 제어 결정을 내리고 명령을 발행

    • 에어컨 제어 노드는 명령 토픽을 구독하고 하드웨어인 에어컨 제어 신호를 생성

      image

ROS 노드 간 통신 기본 과정

  1. 통신이 이루어지기 이전에 통신을 원하는 노드는 마스터에 의뢰하여 연결해야하는 노드의 정보를 얻어오고 서로의 접속 정보를 교환함

image

  1. 통신환경 구축이 완료되면 노드간 통신은 마스터를 거치지 않고 직접 이루어짐

image

  • 토픽(topic) 방식의 통신
    • 일방적이고 지속적인 메시지 전송
    • 1:1 뿐만 아니라 1:N, N:N 통신도 가능
  • 서비스(Service) 방식의 통신
    • 서버가 제공하는 서비스에 클라이언트가 요청을 보내고 응답을 보내는 방식
    • 양방향 통신, 일회성 메시지 송수신

Ros 노드간 통신 시나리오

  1. 마스터(ROS Core) 시동
    • 통신이 이루어지려면 우선은 ROS Core가 실행되고 있어야함’
  2. 구독자 노드 구동
    • 특정 토픽에 발행되는 메시지를 수신하기 요청
  3. 발행자 노드 구동
    • 특정 토픽 메시지를 발행하겠다는 의사를 전달
  4. 노드 정보 전달
    • 마스터가 발행자 정보를 구독자에게 전달
  5. 노드간 접속 요청
    • 구독자 노드가 발행자 노드에게 TCPROS 접속을 요청
  6. 노드간 접속 요청에 대한 응답
    • 발행자 노드가 자신의 TCPROS URI(포트 포함)를 전송하여 응답
  7. TCPROS 접속
    • 발행자 노드와 구독자 노드 사이에 소켓 연결이 이루어짐
  8. 메시지 전송
    • 발행자 노드가 구독자 노드에게 메시지 전송
  9. 메시지 전송 반복
    • 접속이 한번 이루어진 뒤에는 별도 절차 없이 지속적으로 메시지 송수신

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

  • 노드와 토픽의 관계 정보를 그래프로 출력