Contents — find the section you need

ROS 2는 로봇 자체가 아닙니다. 카메라 드라이버, 자체 위치 추정, 경로 계획 및 모터 제어를 별도의 프로그램(노드)으로 실행하고 표준화된 메시징 및 통신을 통해 결합하는 기반입니다. 프로토타입 단계에서는 단 하나의 Python 파일로 시작하여 C++, 실시간 실행, 여러 대의 컴퓨터, 안전 모니터링 기능까지 확장하여 제품을 개발할 수 있습니다. 중요한 것은 API를 암기하는 것이 아니라, 데이터 소유권, 타이밍, 신뢰성, 그리고 종료 시 안전한 상태를 설계하는 것입니다.

이미지: Robot Operating System logo, Wikimedia Commons (CC BY-SA 4.0). 로고는 미들웨어를 식별하는 데 사용되며 특정 배포판이나 DDS 구성을 보장하지 않습니다.

30초 요약

  • 노드는 하나의 책임을 가진 프로세스이고, 토픽은 지속적인 스트림을 나타내며, 서비스는 짧은 요청/응답을 나타내고, 액션은 중간 피드백이 있는 긴 작업을 나타냅니다.

  • ROS 2의 통신은 DDS에서 이루어지며, QoS(신뢰성, 이력, 심도, 지속성, 마감 시간)는 엔드포인트별로 선택할 수 있습니다. 센서와 제어 장치는 동일한 설정을 사용할 필요가 없습니다.

  • TF2는 시간과 함께 좌표계 트리를 관리합니다. map, odom, base_link와 센서 프레임이 혼합되면, 로봇은 인식이 정확하더라도 잘못된 위치로 이동할 수 있습니다.

  • 실제 하드웨어에서는 수명 주기 관리, 워치독, 권한 분리, 로깅 및 네트워크 연결 끊김에 대한 안전 장치를 추가해야 합니다. 시뮬레이션에서 작업하는 것이 안전성을 보장하는 것은 아닙니다.

  • ROS 2 Jazzy와 같은 장기 지원 릴리스와 이에 맞는 DDS, 운영 체제 및 드라이버 조합을 처음부터 수정하고 재현 가능한 워크스페이스를 구축해야 합니다.

1. ROS 2의 전체적인 개요

Diagram 1 · Use the button to switch views
Camera nodesensor driver /image_rawTopic + QoS Perception nodeperception Control nodecontroller DDS middleware (discovery, comms, QoS)Application layerOS / network / executor

그림 1 — ROS 2에서 노드는 DDS를 통해 서로를 검색하고 통신합니다.

토픽 이름뿐만 아니라 QoS, 유형, 시간, 좌표계까지 모두 계약의 일부로 취급됩니다.

ROS 2 그래프는 런타임에 구성할 수 있습니다. 카메라 노드는 이미지를 게시하고, 인식 노드는 이를 구독하며, 제어 노드는 결과에 자체 위치 정보를 더하여 속도 명령을 게시합니다. 노드를 다른 컴퓨터로 옮기더라도 DDS 검색 및 직렬화가 올바르게 작동하는 한 동일한 그래프가 유지됩니다.

2. 적절한 통신 기본 요소 선택

유형 사용 위치 예시 설계 고려 사항
토픽 연속 스트림, 다대다 /scan , /camera/image QoS, 대역폭, 지연 시간, 데이터 손실
서비스 짧은 요청 및 응답 /reset_odometry 타임아웃, 재진입
액션 진행 상황을 표시하는 장기 실행 작업 탐색, 파악 취소, 안전한 중단
매개변수 시작 시간 또는 저주파 구성 게인, 프레임 이름 유형, 변경 권한, 재현성

토픽 메시지에는 값뿐만 아니라 header.stamp 및 frame_id도 포함되어야 합니다. 이미지 타임스탬프와 IMU 타임스탬프가 동기화되지 않은 경우에도 알고리즘은 결과를 계산할 수 있지만 움직임을 잘못 추정할 수 있습니다. 카메라 이미지를 안정적으로 재전송하면 대역폭이 과부하될 수 있으므로 각 센서의 특성에 맞는 QoS를 선택해야 합니다.

3. "통신 계약"으로서의 QoS

ROS 2에서 확인해야 할 최소 QoS 설정은 신뢰성(최선 노력/신뢰성), 지속성(휘발성/일시적 로컬), 기록(마지막 유지/전체 유지), 깊이, 마감 시간 및 활성입니다. 고속 LiDAR는 오래된 패킷을 버리는 Best Effort 방식에 적합할 수 있지만, 메시지 손실을 허용할 수 없는 속도 명령은 짧은 Deadline을 사용하는 Reliable 방식을 사용해야 합니다.

퍼블리셔와 서브스크라이버의 QoS가 호환되지 않으면 동일한 토픽 이름을 사용하더라도 통신이 이루어지지 않습니다. 센서 드라이버의 사전 설정값을 맹목적으로 신뢰하기보다는 ros2 topic info -v /scan 명령어를 사용하여 실제 설정을 확인하십시오. 네트워크를 통해 통신할 때는 MTU, Wi-Fi 재전송, 멀티캐스트 제한 및 시간 동기화를 함께 테스트해야 합니다.

4. TF2 및 시간

로봇의 자세는 좌표계 간의 변환으로 표현됩니다. 일반적인 트리 구조는 다음과 같습니다.

map ──(SLAM/Localization)──> odom ──(odometry)──> base_link
                                                        ├── base_laser
                                                        ├── imu_link
                                                        └── camera_link

map는 장기 월드 좌표계, odom는 단기 스무딩 오도메트리, base_link는 차량 기준 좌표계입니다. SLAM은 map → odom을 수정하고, 휠/IMU 추정은 odom → base_link을 빠른 속도로 업데이트합니다. TF2는 타임스탬프와 함께 변환값을 저장하고 각 센서의 데이터 획득 시간에 맞춰 보간합니다.

좌표계를 오른손 좌표계로 표준화하고, 광학 좌표계(z축이 앞쪽, x축이 오른쪽, y축이 아래쪽)와 차량 좌표계(x축이 앞쪽, y축이 왼쪽, z축이 위쪽)의 차이를 명확히 합니다. static_transform_publisher를 사용하여 정적 변환값을 수정하고, 동적 변환값을 정적 변환값으로 게시하지 않습니다. TF 트리에서 순환 구조나 여러 개의 부모 노드가 있는 것은 설계 오류입니다.

5. 패키지 및 구현 흐름

최소한의 ROS 2 Python 노드는 다음과 같습니다.

import rclpy
from rclpy.node import Node
from std_msgs.msg import Float32

class Speed(Node):
    def __init__(self):
        super().__init__('speed_node')
        self.pub = self.create_publisher(Float32, '/speed', 10)
        self.timer = self.create_timer(0.02, self.tick)  # 50 Hz
    def tick(self):
        msg = Float32(); msg.data = 0.2
        self.pub.publish(msg)

rclpy.init(); node = Speed(); rclpy.spin(node)

실제 하드웨어에서는 속도 명령을 모터에 직접 보내지 마십시오. 상위 노드, 속도 제한 장치, 비상 정지 장치 및 하드웨어 모니터링 장치를 중간에 배치하십시오. C++의 rclcpp을 사용하는 경우에도 콜백 그룹, 실행기, 메모리 할당 및 실시간 동작을 확인하십시오.

워크스페이스를 src, build, install, log로 분리하고 rosdep을 사용하여 종속성을 해결하십시오. Docker 또는 개발 컨테이너를 사용하여 OS, DDS 및 컴파일러를 고정하고 ros2 doctor, ros2 node list, ros2 topic hz, tf2_tools을 CI 및 현장 진단에 모두 포함시키십시오.

6. 라이프사이클 및 안전

센서와 액추에이터는 전원이 켜지는 즉시 명령을 수락할 필요는 없습니다. 라이프사이클 노드의 상태 전환(구성되지 않음 → 비활성 → 활성 → 완료)은 드라이버 초기화, 보정, 통신 점검 및 출력 권한 부여를 분리합니다. 워치독 센서가 하트비트를 잃으면 속도 명령을 초기화하고 하드웨어 측에서 브레이크 또는 릴레이를 해제해야 합니다.

안전 측면에서 ROS 2의 메시지 통신 자체만으로는 기능 안전 표준을 충족하지 못합니다. IEC 61508/ISO 26262/ISO 13849 및 유사 표준의 적용 범위를 확인하고, 안전 기능을 모니터링 시스템, 인증된 MCU 및 물리적 비상 정지 장치로 분리해야 합니다. 네트워크에 연결할 때는 SROS 2 키 및 인증서, DDS 보안, 접근 제어 및 로그 감사 기능을 도입해야 합니다.

7. 현재 생태계 및 연구

Nav2는 액션과 라이프사이클 관리를 통해 자체 위치 추정, 지도 작성, 경로 계획 및 제어를 통합하고, ros2_control은 하드웨어와 컨트롤러 간의 경계를 표준화합니다. MoveIt 2는 매니퓰레이터의 운동학, 충돌 검사 및 궤적 계획을 처리합니다. Gazebo 또는 Webots에서 시뮬레이션하고 rosbag2로 센서 로그를 재생하면 실제 로봇을 멈추지 않고 회귀 테스트를 수행할 수 있습니다.

제로 카피 통신, GPU/NPU를 사용하는 타입이 지정된 이미지 파이프라인, 결정론적 실행기, 분산 학습 및 DDS를 뛰어넘는 클라우드 로봇 공학에 대한 연구가 활발히 진행되고 있습니다. 새로운 기능을 도입할 때는 벤치마크뿐만 아니라 네트워크 연결 끊김, 시간 편차, 프로세스 재시작, 센서 오류 및 잘못된 메시지 길이도 테스트해야 합니다.

요약

ROS 2는 로봇을 단순히 여러 부품의 집합체가 아닌 재사용 가능한 분산 시스템으로 만들어 줍니다. 노드 책임, 토픽 QoS, TF2 좌표 및 타이밍, 수명 주기, 안전 상태 등을 사전에 설계하면 알고리즘을 변경하더라도 전체 시스템이 안정적으로 유지됩니다.

이해력 점검
노드 간 연결이 올바르게 작동하도록 설정되어 있습니까?

타임스탬프, 프레임, QoS 및 전송률도 일치해야 합니다.

데이터를 수신했다고 해서 해당 데이터가 제어에 사용 가능하다는 것을 의미하지는 않습니다.

참고 자료

Related reading

Explore another aspect of this fieldICP가 실패하는 이유: 초기화, 이상치 및 대칭 기하학적 구조Explore another aspect of this fieldROS 2에서 지도 제작부터 내비게이션까지 — Jazzy와 Nav2를 활용한 최소한의 절차Explore another aspect of this field로봇 좌표 변환: 행렬, 쿼터니언 및 TF