본문 바로가기
자율주행

ROS(Robot Operating System) 총정리

by icebear3000 2023. 4. 7.
반응형

로봇 프로그래밍(Robot Programming)은 어떻게 다른가?

 로봇 프로그래밍은 컴퓨터 프로그래밍의 하위 집합입니다. 대부분의 로봇은 결정을 내릴 수 있는 "뇌"를 가지고 있습니다. 이것은 마이크로컨트롤러나 PC일 수 있습니다. 로봇 프로그래밍과 일반적인 프로그래밍의 차이점은 입력 및 출력 장치입니다. 입력 장치에는 로봇 센서, 티치 펜던트, 터치 스크린 등이 있으며, 출력 장치에는 LCD 디스플레이 및 구동기가 포함됩니다. 로봇을 프로그래밍하는 데에는 모든 프로그래밍 언어가 사용될 수 있지만, 좋은 커뮤니티 지원, 성능 및 프로토타입 시간을 고려하면 C++Python이 가장 많이 사용됩니다. 로봇을 프로그래밍하기 위해 필요한 몇 가지 기능은 다음과 같습니다:

 

Threading: 로봇 블록 다이어그램에서 볼 수 있듯이 로봇에는 여러 개의 센서 및 구동기가 있습니다. 다른 스레드에서 다른 센서 및 구동기와 작업하기 위해 멀티스레드 호환 프로그래밍 언어가 필요할 수 있습니다. 이를 멀티태스킹이라고 합니다. 각 스레드는 데이터를 교환하기 위해 서로 통신할 수 있습니다.

 

고수준 객체지향 프로그래밍: 이미 알고 있듯이, 객체지향 프로그래밍 언어는 더 모듈화되어 있으며 코드를 쉽게 재사용할 수 있습니다. 코드 유지 보수 또한 비객체지향 프로그래밍 언어와 비교하여 쉽습니다. 이러한 특성들은 로봇용 더 나은 소프트웨어를 만듭니다.

 

Low-level device control: 고수준 프로그래밍 언어도 GPIO (일반적인 입출력) 핀, 시리얼 포트, 병렬 포트, USB, SPI 및 I2C와 같은 저수준 장치에 액세스할 수 있습니다. C/C++ 및 Python과 같은 프로그래밍 언어는 저수준 장치와 작업할 수 있으며 이는 이러한 언어가 라즈베리 파이와 오드로이드와 같은 싱글 보드 컴퓨터를 선호하는 이유입니다.

 

프로토타이핑의 용이성: 로봇 알고리즘을 프로토타입으로 만드는 것은 프로그래밍 언어 선택에서 확실히 고려할 사항입니다. Python은 로봇 알고리즘을 빠르게 프로토타입으로 만드는 데 좋은 선택입니다.

 

프로세스 간 통신: 로봇은 많은 센서와 액추에이터를 가지고 있습니다. 우리는 멀티 스레딩 아키텍처를 사용하거나 각 작업을 수행하는 독립적인 프로그램을 작성할 수 있습니다. 예를 들어, 한 프로그램은 카메라에서 이미지를 가져와 얼굴을 감지하고, 다른 프로그램은 데이터를 임베디드 보드에 보냅니다. 이 두 프로그램은 데이터를 교환하기 위해 서로 통신할 수 있습니다. 이 기능은 멀티 스레딩 시스템 대신 여러 프로그램을 만듭니다. 멀티 스레딩 시스템은 병렬로 여러 프로그램을 실행하는 것보다 더 복잡합니다. 소켓 프로그래밍은 프로세스 간 통신의 예입니다.

 

Performance: 깊이 카메라 및 레이저 스캐너와 같은 고대역폭 센서를 사용할 경우, 데이터를 처리하기 위해 필요한 컴퓨팅 자원은 높아집니다. 적절한 컴퓨팅 자원을 할당하면서 컴퓨팅 자원을 과부하 없이 처리할 수 있는 좋은 프로그래밍 언어가 있습니다. 이러한 시나리오를 처리하기 위해 C++ 언어는 좋은 선택입니다.

제3자 라이브러리의 가용성: 제3자 라이브러리의 가용성은 개발을 용이하게 만들 수 있습니다. 예를 들어, 이미지 처리를 수행하려면 OpenCV와 같은 라이브러리를 사용할 수 있습니다. 프로그래밍 언어에 OpenCV 지원이 있으면 이미지 처리 애플리케이션을 더 쉽게 수행할 수 있습니다.

 

기존 로봇 소프트웨어 프레임워크 지원: ROS와 같은 기존 로봇 소프트웨어 프레임워크가 존재합니다. 프로그래밍 언어가 ROS 지원을 제공하면 로봇 애플리케이션 프로토타이핑이 더욱 쉬워집니다.


왜 ROS를 사용해야 할까?

 ROS에는 많은 기능이 있지만, 사용할 수 없거나 권장하지 않는 경우도 있습니다. 예를 들어, 자율 주행 자동차의 경우 ROS를 사용하여 프로토타입을 만들 수 있지만, 실제 제품을 만드는 데는 권장되지 않습니다. 보안, 실시간 처리 등과 같은 다양한 문제 때문입니다. ROS는 일부 영역에서는 적합하지 않을 수 있지만, 다른 영역에서는 꼭 필요한 선택일 수 있습니다.

 

 기업 로봇 연구 센터 및 대학에서는 ROS가 프로토타입에 이상적인 선택입니다. ROS는 많은 세밀 조정을 거친 후 일부 로봇 제품에서 사용됩니다(하지만 자율 주행 자동차에서는 사용되지 않습니다). ROS 2.0이라는 프로젝트는 보안 및 실시간 처리 측면에서 기존 ROS의 훨씬 우수한 버전을 개발 중입니다(https://github.com/ros2/ros2/wiki). ROS 2.0은 앞으로 로봇 제품에 좋은 선택이 될 수 있습니다.


ROS Architecture and Concepts

 기본적으로 ROS는 두 프로그램 또는 프로세스 간에 통신하기 위한 프레임워크입니다. 예를 들어, 프로그램 A가 프로그램 B에 데이터를 보내고 B가 프로그램 A에 데이터를 보내려면 ROS를 사용하여 쉽게 구현할 수 있습니다.  로봇은 여러 개의 센서와 액추에이터, 그리고 컴퓨팅 유닛을 가질 수 있습니다. 많은 액추에이터를 제어하고 많은 센서 데이터를 처리하는 것은 어떻게 할까요? 하나의 프로그램으로 처리할 수 있을까요? 가능하지만 그것은 좋은 방법이 아닙니다. 더 나은 방법은 센서 데이터와 액추에이터를 제어하는 독립적인 프로그램을 작성하고 종종 이러한 프로그램 간에 데이터를 교환해야합니다. 이것이 ROS를 사용하는 상황입니다.

 

 위 그림은 ROS의 기본 블록 다이어그램을 보여줍니다. 그림 4-12는 노드 1과 노드 2로 표시된 두 프로그램을 보여줍니다. 프로그램 중 하나가 시작될 때마다 노드는 ROS 마스터라는 ROS 프로그램에 연결합니다. 노드는 데이터의 유형을 포함하여 모든 정보를 ROS 마스터에게 보냅니다. 데이터를 보내는 노드를 게시자 노드(publisher nodes)라고 하고 데이터를 받는 노드를 구독자 노드(subscriber nodes)라고 합니다. ROS 마스터는 컴퓨터에서 실행 중인 모든 게시자 및 구독자 정보를 가지고 있습니다. 노드 1이 "A"라는 특정 데이터를 보내고 노드 2가 같은 데이터를 필요로하는 경우, ROS 마스터는 노드가 서로 통신할 수 있도록 정보를 보내줍니다.

 

 ROS 노드는 서로 정수, 부동 소수점, 문자열 등과 같은 기본 데이터 타입을 포함하여 다른 유형의 데이터를 보낼 수 있습니다. 보내는 다른 데이터 유형을 ROS 메시지라고 합니다. ROS 메시지를 사용하여 단일 데이터 유형 또는 다양한 데이터 유형으로 데이터를 보낼 수 있습니다. 이러한 메시지는 ROS 토픽이라는 메시지 버스나 경로를 통해 전송됩니다. 각 토픽에는 이름이 있으며, 예를 들어 "chatter"라는 이름의 토픽은 문자열 메시지를 보냅니다. ROS 노드가 토픽을 발행하면, ROS 메시지와 함께 ROS 토픽을 보내며, 메시지 유형에 따라 데이터가 있습니다. 그림에서 ROS 토픽이 노드 1과 노드 2를 구독하고 게시합니다. 이 프로세스는 ROS 마스터가 노드 세부 정보를 서로 교환할 때 시작됩니다.


  • ROS 노드: ROS API를 사용하여 연산을 수행하는 프로세스입니다.
  • ROS 마스터: ROS 노드를 연결하는 중간 프로그램입니다.
  • ROS 매개변수 서버: 일반적으로 ROS 마스터와 함께 실행되는 프로그램입니다. 사용자는 이 서버에 다양한 매개변수나 값을 저장할 수 있으며, 모든 노드에서 이를 액세스할 수 있습니다. 사용자는 매개변수의 개인 정보 설정을 할 수도 있습니다. 공개 매개변수인 경우 모든 노드에서 액세스할 수 있고, 개인 매개변수인 경우 특정 노드만 매개변수에 액세스할 수 있습니다.
  • ROS 토픽: ROS 노드가 메시지를 보낼 수 있는 이름이 지정된 버스입니다. 노드는 토픽을 여러 개 발행하거나 구독할 수 있습니다.
  • ROS 메시지: 메시지는 기본적으로 토픽을 통해 전송됩니다. 기본 데이터 유형을 기반으로 하는 기존 메시지가 있으며, 사용자는 자신의 메시지를 작성할 수 있습니다.
  • ROS service: 우리는 이미 ROS 토픽을 봤는데, 이것은 게시 및 구독 메커니즘을 갖고 있습니다. ROS 서비스는 요청/응답 메커니즘을 갖고 있습니다. 서비스 호출은 클라이언트 노드가 요청을 보낼 때마다 호출될 수 있는 함수입니다. 서비스 호출을 생성하는 노드를 서버 노드라고 하고, 서비스를 호출하는 노드를 클라이언트 노드라고 합니다.
  • ROS bags: 로봇에서 나오는 데이터를 기록하고 나중에 처리하기 위해 유용한 방법입니다. 또한 ROS topic을 저장하고 재생하는 데에도 유용합니다.


ROS File System

 ROS 파일 시스템에는 패키지(packages), 메타패키지(metapackages), 패키지 매니페스트(package manifests), 저장소(repositories), 메시지 타입(message types) 및 서비스 타입(service types)이 포함됩니다.

 

 ROS 패키지는 ROS 소프트웨어의 개별 단위 또는 원자적 단위입니다. 모든 소스 코드, 데이터 파일, 빌드 파일, 의존성 및 기타 파일이 패키지에 구성됩니다.

 

 ROS 메타패키지는 특정 응용 프로그램을 위한 유사한 패키지 집합을 그룹화합니다. ROS 메타패키지에는 소스 파일이나 데이터 파일이 포함되지 않습니다. 유사한 패키지의 의존성이 있습니다. ROS 메타패키지는 패키지를 구성합니다.

 

 패키지 매니페스트(package manifests)는 ROS 패키지 내부에 배치되는 XML 파일입니다. 패키지의 이름, 설명, 작성자, 의존성 등 ROS 패키지의 모든 주요 정보를 담고 있습니다.

 

 ROS 리포지토리(ROS repository)는 공통 버전 관리 시스템을 공유하는 ROS 패키지의 모음입니다.  A message type description은 새로운 ROS 메시지 유형의 정의입니다. ROS에서는 직접 사용할 수 있는 기존 데이터 유형이 있지만 새로운 ROS 메시지를 만들고자 하는 경우에는 정의할 수 있습니다. 새로운 메시지 유형은 패키지의 msg 폴더에 저장될 수 있습니다. 메시지 유형과 유사하게, a service type definition는 우리가 정의한 서비스 정의를 포함합니다. 이는 srv 폴더에 저장됩니다.

 

ROS Command Tools

 ROS 도구들을 사용하여 ROS의 거의 모든 기능을 구현할 수 있습니다. 명령줄 도구는 Linux 터미널에서 실행됩니다. Linux의 다른 명령어와 마찬가지로 ROS 명령 도구를 사용할 수 있습니다.

 

 roscore 명령어는 ROS에서 매우 중요한 도구입니다. 이 명령어를 터미널에서 실행하면 ROS 마스터, 매개변수 서버 및 로깅 노드가 시작됩니다. 이 명령을 실행한 후에 다른 ROS 프로그램/노드를 실행할 수 있습니다. 따라서 roscore를 하나의 터미널 창에서 실행하고 다른 터미널 창에서 다음 명령을 입력하여 ROS 노드를 실행할 수 있습니다. roscore를 터미널에서 실행하면 Figure 4-14에 표시된 것과 같은 메시지를 받을 수 있습니다.

 

 rosnode 명령어는 ROS 노드의 모든 측면을 탐색합니다. 예를 들어, 우리는 시스템에서 실행 중인 ROS 노드 수를 나열할 수 있습니다. 명령어를 입력하면 도구의 완전한 도움말을 볼 수 있습니다.
다음은 rosnode의 일반적인 사용 방법입니다: $ rosnode list

 

 rostopic 명령은 시스템에서 발행/구독하는 토픽에 대한 정보를 제공합니다. 이 명령은 토픽 목록을 나열하고, 토픽 데이터를 출력하고, 데이터를 게시하는 데 매우 유용합니다.

$ rostopic list

 

만약 /chatter라는 토픽이 있다면, 다음 명령어를 사용하여 토픽 데이터를 출력할 수 있습니다.
$ rostopic echo /chatter


토픽과 함께 데이터를 게시하려면 다음 명령어를 사용할 수 있습니다.
$ rostopic pub topic_name msg_type data


다음은 예시입니다.
$ rostopic pub /hello std_msgs/String "Hello"


퍼블리싱 후에도 동일한 토픽을 에코할 수 있습니다. 이러한 명령어를 하나의 터미널에서 실행한다면 roscore가 실행 중이어야 함에 유의하세요.

 

 rosversion 명령은 ROS 버전을 확인합니다. 다음 명령은 현재 ROS 버전을 검색합니다: $ rosversion -d

 

 rosparam 명령어는 매개변수 서버에 로드된 매개변수 목록을 제공합니다. 시스템의 매개변수를 나열하려면 다음 명령을 사용할 수 있습니다:

$ rosparam list

 

 ROS 노드를 실행하려면 rosrun 노드를 사용해야 합니다. 사용법은 매우 간단합니다.

$ rosrun ros_pkg_name node_name

 

 roslaunch 명령어는 ROS에서 유용합니다. 10개 이상의 ROS 노드를 실행하려면 하나씩 시작하는 것이 매우 어렵습니다. 이 상황에서는 roslaunch 파일을 사용하여 이 어려움을 피할 수 있습니다. ROS launch 파일은 실행하려는 각 노드를 삽입할 수있는 XML 파일입니다.

 또한 roslaunch 명령은 roscore 명령이 함께 실행되므로 노드를 실행하기 위해 별도의 roscore 명령을 실행할 필요가 없습니다. roslaunch 파일을 실행하기 위한 구문은 다음과 같습니다. "roslaunch"는 런치 파일을 실행하기 위한 명령어이며, 패키지 이름과 런치 파일 이름을 지정해야 합니다.

$ roslaunch ros_pkg_name launch_file_name


ROS GUI 도구 : Rviz 및 Rqt

 ROS는 명령 줄 도구 외에도 센서 데이터를 시각화하는 GUI 도구를 제공합니다. 인기 있는 GUI 도구 중 하나는 Rviz입니다. Rviz를 사용하면 이미지 데이터, 3D 포인트 클라우드, 로봇 모델 및 변환 데이터 등을 시각화 할 수 있습니다.

• 3D viewport: 센서 데이터, 로봇 변환 데이터, 3D 모델 데이터 및 기타 종류의 3D 정보를 시각화하는 영역입니다.
• Display panel: 다양한 종류의 센서 데이터를 표시합니다.
• View panel: 애플리케이션에 따라 3D 뷰포트를 보는 옵션입니다.
• Toolbar: 3D 뷰포트와 상호 작용하고, 로봇 위치를 측정하고, 로봇 탐색 목표를 설정하고, 카메라 뷰를 변경하는 옵션입니다.
• Time panel: ROS 시간 및 경과 시간에 대한 정보가 표시됩니다. 이러한 타임 스탬프 정보는 센서 데이터 처리에 유용합니다.
Rqt: 2D 데이터 시각화, 토픽 로깅, 토픽 게시, 서비스 호출 등을 위한 옵션을 제공합니다.

 

다음은 Rqt GUI를 시작하는 방법입니다:

Start roscore
$ roscore
Start rqt_gui
$ rosrun rqt_gui rqt_gui

반응형

댓글