ROS 기초#

소개#

ROS (Robot Operating System)는 로봇 소프트웨어 개발을 위한 도구, 라이브러리, 규약 등을 제공하는 오픈소스 플랫폼입니다. ROS 생태계는 이러한 요소들로 구성되어 있으며, 개발자는 이를 활용하여 로봇 시스템을 설계, 구현, 분석할 수 있습니다.

ROS에서는 로봇의 각 기능을 노드(Node)라는 단위 프로세스로 구현하며, 노드 간의 데이터 송수신을 위해 토픽(Topic), 서비스(Service), 액션(Action) 등의 통신 방식을 제공합니다. 이를 통해 분산 컴퓨팅 환경에서 노드 간 유연한 협업이 가능해집니다.

용어 정리#

  • 노드 (Node): ROS에서 실행되는 기본 단위 프로세스입니다. 각 노드는 특정한 기능을 담당합니다.

  • 패키지 (Package): ROS에서 코드와 데이터, 설정 등을 관리하는 기본 단위입니다. 노드, 라이브러리, 데이터셋 등으로 구성됩니다.

  • 토픽 (Topic): 노드 간 데이터 송수신을 위한 단방향 통신 채널입니다. 메시지 발행/구독 방식으로 동작합니다.

  • 서비스 (Service): 노드 간 동기 양방향 통신을 위한 채널입니다. 요청-응답 방식으로 동작합니다.

  • 액션 (Action): 노드 간 비동기 양방향 통신을 위한 채널입니다. 장시간 실행되는 태스크의 진행 상황 전달에 사용합니다.

  • 인터페이스 (Interface): 노드 간 데이터 교환에 사용되는 메시지, 서비스, 액션의 타입을 통칭하는 용어입니다.

  • 파라미터 (Parameter): 노드의 설정값을 저장하는 키-값 쌍입니다. 노드 실행 중 값을 변경할 수 있습니다.

  • 런치파일 (Launchfile): 여러 노드를 한 번에 실행하기 위한 설정 파일입니다. XML, YAML, Python 등의 형식을 지원합니다.

ROS 구성요소#

문서 (Documentation)#

ROS는 다양한 문서를 제공합니다. 대표적인 것들은 다음과 같습니다:

  • ROS 공식 문서: ROS의 기본 개념, 튜토리얼, API 레퍼런스 등을 제공합니다.

  • ROS Wiki: ROS 1에 대한 상세한 문서를 제공합니다. ROS 2에도 대부분 적용 가능합니다.

  • ROS Answers: ROS에 대한 질문과 답변을 공유하는 포럼입니다. (읽기 전용)

  • ROS Discourse: ROS Answers를 대체하는 새로운 Q&A 포럼입니다.

패키지 (Packages)#

패키지는 ROS 컴포넌트의 기본 단위로, 하나 이상의 노드, 라이브러리, 데이터셋, 설정 파일 등을 포함합니다. 패키지는 소스 코드나 바이너리 형태로 배포되며, package.xml 매니페스트 파일에 메타데이터를 기술합니다.

패키지 설치는 apt를 통해 이루어지는 것이 일반적이지만, 소스 코드를 직접 빌드하거나 Python의 pip 같은 언어별 패키지 관리자를 사용할 수도 있습니다. ROS는 rosdep이라는 도구를 통해 시스템 의존성 패키지 설치를 자동화합니다.

노드 (Nodes)#

노드는 ROS에서 실행되는 프로세스의 기본 단위입니다. 각 노드는 특정 기능을 담당하며, 다른 노드와 통신하여 전체 로봇 시스템을 구성합니다.

노드는 보통 독립된 프로세스로 실행되지만, ROS 2에서는 하나의 프로세스 내에서 여러 노드를 실행할 수도 있습니다. 이를 Composition이라 하며, 통신 오버헤드를 줄이는 데 사용됩니다.

노드는 ROS 클라이언트 라이브러리(rclcpp, rclpy 등)를 사용하여 구현됩니다. 또한 라이프사이클(Lifecycle) 관리 기능을 통해 노드의 상태를 제어할 수 있습니다.

통신 (Inter-Node Communication)#

ROS는 노드 간 통신을 위해 토픽, 서비스, 액션 등의 방식을 제공합니다. 이들은 모두 ROS 인터페이스 언어(IDL)를 통해 정의됩니다.

  • 토픽은 발행-구독(Publish-Subscribe) 모델에 기반한 단방향 통신 채널입니다. 메시지 타입으로 토픽의 데이터 구조를 정의합니다.

  • 서비스는 요청-응답(Request-Response) 모델에 기반한 양방향 통신 채널입니다. 서비스 타입으로 요청과 응답의 데이터 구조를 정의합니다.

  • 액션은 비동기적인 양방향 통신 채널로, 장시간 실행되는 태스크의 진행 상황을 전달하는 데 사용됩니다. 액션 타입으로 목표, 결과, 피드백 메시지의 데이터 구조를 정의합니다.

ROS 2에서는 DDS(Data Distribution Service)라는 미들웨어를 사용하여 노드 간 통신을 구현합니다. DDS는 QoS(Quality of Service) 설정을 통해 다양한 통신 환경에 대응할 수 있습니다.

그래프 (ROS Graph)#

ROS에서 실행 중인 모든 노드와 토픽은 계산 그래프(Computation Graph)로 표현할 수 있습니다. 노드가 그래프의 정점(Vertex)이 되고, 토픽이 방향성 있는 간선(Edge)이 됩니다.

ROS는 DDS의 자동 검색 기능을 활용하여 노드 간 연결을 자동으로 구성합니다. 이를 통해 기존 ROS 1의 roscore와 같은 중앙 마스터 노드가 필요 없어졌습니다.

파라미터 (Parameters)#

파라미터는 노드의 설정값을 저장하는 키-값 쌍입니다. YAML 형식으로 정의되며, 노드 실행 시 로드되거나 실행 중에 변경될 수 있습니다. 파라미터는 주로 노드의 동작을 제어하는 데 사용됩니다.

런치파일 (Launchfiles)#

런치파일은 여러 노드를 한 번에 실행하기 위한 설정 파일입니다. ROS 2에서는 Python, XML, YAML 등의 다양한 형식을 지원합니다. 런치파일을 통해 노드의 파라미터를 설정하거나, 노드 간 연결을 구성할 수 있습니다.

백 (Bags)#

백은 토픽의 데이터를 파일로 기록하고 재생하기 위한 도구입니다. 주로 데이터 분석이나 알고리즘 테스트에 활용됩니다. ros2 bag 명령어를 통해 백을 생성하고 관리할 수 있습니다.

로깅 (Logging)#

ROS는 노드의 로그 메시지를 위한 로깅 시스템을 제공합니다. 노드는 심각도에 따라 DEBUG, INFO, WARN, ERROR, FATAL 등의 수준으로 로그를 남길 수 있습니다. rqt_console을 통해 로그를 실시간으로 모니터링할 수 있습니다.

디버깅 (Debugging)#

ROS는 디버깅을 위한 다양한 도구를 제공합니다. ros2 run을 통해 노드를 실행하고, ros2 topic, ros2 service 등의 명령어로 토픽과 서비스를 모니터링할 수 있습니다. 또한 rqt_graph를 통해 노드와 토픽 간의 연결 관계를 시각화할 수 있습니다.

ros2 doctor 명령어를 사용하면 ROS 환경의 문제점을 진단하고 해결 방법을 제안받을 수 있습니다.

이상으로 ROS의 기본 구성요소와 주요 개념에 대해 알아보았습니다. ROS는 로봇 소프트웨어 개발을 위한 강력하고 유연한 프레임워크로, 다양한 도구와 라이브러리를 제공합니다. 이를 잘 활용한다면 복잡한 로봇 시스템도 효과적으로 구현할 수 있을 것입니다.