인공지능 요모조모
[ROS2] 기초 개념(2) 본문
4️⃣rclpy (ROS Client Library for Python)
rcl: ROS2 노드를 만들고 통신할 수 있도록 돕는 핵심 요소
▪️C++로 작성된 ROS2 코어 라이브러리(rcl)를 Python 환경에서 활용할 수 있도록 래핑(wrapping)한 것이 특징
▪️사용자들은 Python의 간결한 문법과 다양한 라이브러리를 ROS2 기반 시스템에 쉽게 통합 가능
👉🏻rclpy == Python에서 ROS2를 사용할 수 있도록 제공하는 라이브러리
✔️ 구성요소
▪️Node
▫️ROS2 시스템의 기본 실행 단위
▫️노드는 각각 고유의 이름을 가지며, pub/sub, service/client 등을 통한 통신을 담당
▪️Publisher, Subscriber
▫️ publisher는 데이터 토픽을 전송하고, subscriber는 이를 수신
▫️rclpy에서는 API로 pub/sub를 설정
▪️Service, Client
▫️service는 요청-응답 방식의 통신 처리, client는 특정 요청을 보내고 응답 대기
▪️Action
▫️긴 시간 동안 실행되는 작업을 요청하고, 그 결과를 받을 수 있는 기능
▫️주로 Motion Planning과 같은 작업에 사용
▪️Parameter Server
▫️ROS2 시스템에서 global / local parameter를 설정하고 가져올 수 있는 시스템
✔️주요 명령어
rclpy.init()
- ROS2 프로그램 실행 시 가장 먼저 호출 필요
- 역할
- 노드 초기화 과정 수행(초기 설정 및 통신 준비)
- 통신 인프라 설정(DDS 미들웨어와의 통신 인프라 구성)
- ROS 매개변수 및 환경 설정
- 로깅 시스템 초기화
- 글로벌 리소스 초기화
- 명령줄 인자 처리
rclpy.spin_once(node)
- 주어진 노드에 대해 한 번의 이벤트 처리 수행
- 노드의 대기 중인 콜백을 확인하고 실행
- 노드의 메시지 구독, 서비스 요청, 타이머 이벤트 등을 처리하는데 사용
rclpy.spin(node)
- 주어진 노드에 대해 이벤트 처리 수행(무한루프)
- 노드를 독립적으로 계속 돌릴 때 사용
- 노드의 메시지 구독, 서비스 요청, 타이머 이벤트 등을 처리하는데 사용
rclpy.spin | rclpy.spin_once | |
동작 방식 | 무한 루프 (이벤트를 계속 처리함) | 한 번만 이벤트 큐를 확인하고 리턴함 |
차단 여부 | 차단(blocking) → 함수가 종료되지 않음 | 비차단(non-blocking) 가능 |
사용 목적 | 일반적인 노드 실행 (listener, server 등) | 주기적 루프나 사용자 정의 루프에서 사용 |
적절한 상황 | 노드를 독립적으로 계속 돌릴 때 | 다른 코드와 병행하여 실행할 때 (예: 시뮬루프 안) |
5️⃣Multi Thread
▪️ 하나의 노드에서 여러 콜백(토픽/서비스 등)을 동시에 병렬 처리할 수 있도록 지원
▫️ex) 서비스와 퍼블리셔가 동일한 노드 내에서 동시에 작동하는 경우, MultiThreadedExecutor를 사용 가능
▪️비동기 서비스 호출(asyncio와 통합)
✔️노드 이름 관리
- 노드 이름은 고유해야 하므로, 노드를 생성할 때는 시스템 내 다른 노드들과 충돌하지 않도록 이름을 신중히 결정
✔️타이머 주기 관리
- 콜백 주기는 너무 짧게 설정하지 않도록 주의
- 지나치게 빠른 주기는 CPU 부하의 과도한 증가의 원인
✔️에러 핸들링
- ROS2 환경은 네트워크 및 하드웨어 상태에 따라 불안정할 수 있으므로, 예외 상황에 대한 철저한 에러 핸들링 필수
✔️최적화 팁
- 토픽 QoS 설정
- 네트워크 환경이나 메시지의 중요도에 따라 QoS 설정을 맞춰야 함
- ex) 메시지 유실이 치명적이지 않은 센서 데이터의 경우 Best Effort 방식(전달 속도 중시 방식)을 사용할 수 있음
- 파라미터 최적화
- 파라미터 서버를 활용해, 노드의 설정 값을 유연하게 바꾸면서 성능 튜닝 가능
6️⃣ 노드 생성
ex) Publisher Code 분석
▪️라이브러리 임포트
- rclpy : ROS2의 python 클라이언트 라이브러리
- Node : ROS2 노드를 정의하기 위한 기본 클래스
- String : std_msgs 패키지에서 제공하는 문자열 메시지 타입
▪️MinimalPublisher 클래스 정의
- Node 클래스 상속
▪️__init__()
super.__init__("node_name")
# 노드 이름 초기화- ROS interface Publisher 생성
생성 요소 | 의미 | 노드 역할에 주는 영향 |
create_publisher | 토픽 발행 | Publisher 역할 |
create_subscription | 토픽 수신 | Subscriber 역할 |
create_service | 서비스 서버 생성 | Service Server 역할 |
create_client | 서비스 요청 | Service Client 역할 |
create_action_server | 액션 서버 생성 | Action Server 역할 |
create_action_client | 액션 요청 | Action Client 역할 |
self.timer = self.create_timer(timer_period, self.timer_peiod)
- # timer_period = 발행 주기 정의(주로 0.5 사용)
▪️timer_callback 함수
- 타이머에 의해 주기적으로 호출
- 특정 형식의 메시지를 생성 및 발행(* publisher의 경우)
▪️main 함수
- ROS2 초기화
- 노드 인스턴스 생성 및 rclpy.spin() 또는 spin_once()로 노드 실행
- 노드와 ROS2 종료
'ROKEY > ROS2' 카테고리의 다른 글
[ROS2] ROS2 CLI (0) | 2025.05.02 |
---|---|
[ROS2] ROS2 Security (0) | 2025.05.02 |
[ROS2] ROS2 Lifecycle (0) | 2025.05.01 |
[ROS2] 기초 개념 (1) (0) | 2025.04.23 |
[ROS2] BAG (0) | 2025.04.22 |