ROS2 Distributed Robotics Physics
ROS2 Distributed 로보틱스 메커니즘의 정의, 범위, 선행 지식, 학습 주제, 참고 근거를 정리한 CS&E 학습 노드입니다.
Article
M
Me
hyunyoun's Blog
computer-architecture-embedded-systemscomputer-architectureembedded-systemsroboticscontrol-systems-mechanicsros2-distributed-robotics-physicsros2distributed-robotics-physics8 min read
1. Overview
ROS 2와 분산 로보틱스 역학(ROS2 Distributed Robotics Physics)은 바퀴, 팔, 카메라, 레이저 센서(LiDAR) 등 수십 개의 독립된 컴퓨터 뇌(Node)들이 하나의 유기체처럼 맞물려 돌아가게 만드는, 우주 최고 등급의 미들웨어(Middleware) 배관이자 로봇 통신 헌법입니다.
학습자는 단일 칩(MCU)에서 아등바등 돌던 통짜 코드를 찢어버리고, 서로 다른 프로세스, 서로 다른 언어(C++, Python), 서로 다른 네트워크(PC와 라즈베리파이)를 넘나들며 메시지를 뿌려대는 노드(Node) 기반 퍼블리시-서브스크라이브(Pub/Sub) 아키텍처를 뜯어봅니다. 나아가 군집 로봇이나 수중 탐사선처럼 Wi-Fi가 툭툭 끊기는 지옥 같은 통신망에서도 메시지 배달을 기어코 보장해 내는 DDS(Data Distribution Service) QoS 역학을 해부하고, ROS 2의 가상 시뮬레이터(Gazebo)와 로봇 좌표계 프레임(TF2)을 통달하여 전 지구적 스케일의 군집 로봇 아키텍트 역량을 확보합니다.
2. Scope & Boundaries
In-Scope
- ROS2 토폴로지 (Graph Architecture): 분산 노드(Distributed Nodes), 토픽(Topics, 비동기 Pub/Sub), 서비스(Services, 동기 RPC), 액션(Actions, 긴 피드백 루프).
- 로봇 좌표계 기하학 (TF2 Frame Math): 3차원 공간 트랜스폼 트리(Transform Tree), 센서 프레임(Laser) 베이스 프레임(Base) 월드 프레임(Map) 변환.
- 실시간 통신 코어 (DDS Middleware): Data Distribution Service, RTPS 와이어 프로토콜, QoS(Reliability, Durability, Deadline) 정책.
- 물리 시뮬레이터 및 툴링: Gazebo 3D 가상 환경, RViz 데이터 시각화 렌더러, URDF(Unified Robot Description Format) 모델링.
Out-of-Scope
- 로봇 운동학 및 경로 계획 수식 본체: 로봇 팔의 IK(역기구학) 계산식 자체나 A* 길 찾기 수학 자체 02-08-03. Kinematics & Planning 영역. (※ ROS2는 이 수학을 대신 풀어주는 툴(MoveIt, Nav2)을 제공하는 껍데기(배관) 역할에 집중)
- 비전 객체 인식 및 센서 퓨전 자체: 카메라 필터링 수식이나 칼만 필터 수학 자체 02-08-02. Control & Sensor Fusion 등 다른 영역.
Boundaries
- ROS2 vs. Basic MCU (02-05): 베어메탈 MCU(02-05)가 "작은 칩 하나 안에서 톱니바퀴를 깎아 하나의 완벽한 회중시계를 만드는 공예"라면, ROS 2는 "전 세계에 흩어진 수백 개의 공장에서 만든 모터 제어기, 딥러닝 카메라, 맵 네비게이션 부품들을 허공의 네트워크(DDS)로 연결해 하나의 거대한 트랜스포머 군단을 조립하는 통신 뼈대"입니다.
3. Counterexample
- ROS1의 망령과 단일 장애점(SPOF)의 붕괴 (ROS Master Trap): 구형 ROS 1을 쓰면서 전체 로봇 시스템의 호적을 관리하는 중앙 'ROS Master(roscore)' 서버를 맹신하는 설계. 드론 3대가 날아가다 통신 허브(Master)가 탑재된 대장 드론이 격추당하는 순간, 나머지 2대의 꼬봉 드론들은 서로 살아있음에도 주소표를 못 찾아서 통신이 완전히 박살 나고 허공에서 추락합니다. ROS 2는 중앙 마스터를 폭파해 버리고, 모든 노드가 스스로 이웃을 찾아내는 분산 탐색(DDS Discovery) 헌법으로 재탄생했습니다.
- 무조건 신뢰(Reliable) 통신의 참사 (QoS Mismatch Crash): 자율주행 차에 달린 라이다(LiDAR) 센서가 1초에 1,000장의 포인트 클라우드 지도를 쏟아내는데, 이 데이터를 받는 노드(수신 측)가 "단 1바이트도 놓치지 않겠다"라며 QoS를 'Reliable'로 설정해 버린 치명적 짓. 네트워크가 찰나 흔들리면 송신 노드(LiDAR)는 못 받은 데이터를 재전송(Retransmission)하느라 큐(Queue)가 폭발하고, 수신 측은 밀린 과거 지도를 처리하다 랙이 걸려 벽을 뚫고 쳐박습니다. 1초 뒤에 어차피 최신 지도가 또 들어오는 센서 데이터는 무조건 누락을 허용하는 'Best Effort(쏘고 버림)' QoS로 타협해야 합니다.
4. Prerequisites
- MQTT 등 분산 메시징 통신망 (Basic): 누가 누구에게 보내는지 주소를 몰라도 '토픽(주제)'만 맞으면 알아서 통신이 꽂히는 Pub/Sub의 디커플링 개념을 이해해야 합니다. (02-07-03 MQTT & IoT Protocols)
- 좌표계 변환 역학 (Recommended): 로봇 어깨의 축(Frame)과 손끝의 축이 동차 변환 행렬()로 как(어떻게) 엮이는지 알아야 TF2(Transform) 트리를 다룰 수 있습니다. (02-08-03 Kinematics)
5. Learning Map
6. Learning Topics
Basic
Core Topic 01: 뇌의 탈중앙화와 무한 확장 배관, 노드 그래프 기하학 (Node & Pub/Sub)
- Why to Learn: 5천 줄짜리 메인 C 코드 하나에 카메라 처리와 바퀴 제어 루프를 몽땅 때려 박았다가 꼬여서 자폭하는 스파게티 시스템을 박살 내고, 언제든 새 모듈을 레고 블록처럼 끼웠다 뺐다(Plug & Play) 할 수 있는 모듈화의 끝을 쥐기 위함입니다.
- What to Learn:
- Concepts: 노드(Node), 토픽(Topic, 비동기 단방향), 서비스(Service, 동기 RPC), 액션(Action, 비동기 상태 피드백).
- Skills: Publisher/Subscriber 디커플링, 그래프 컴포넌트(Graph/Architecture) 설계.
- Tools:
rqt_graph명령어로 노드 간 통신 궤적 시각화. - Trade-offs: 시스템을 수십 개의 노드로 찢어 토픽(네트워크)으로 묶으면 모듈화와 언어 믹스(Python+C++)의 자유도가 폭발하지만, 그냥 함수 호출(
call()) 한방이면 될 것을 패킷으로 싸서 OS 소켓을 태워 던지느라 엄청난 IPC(프로세스 간 통신) 오버헤드와 레이턴시 랙(Lag)이 터지는 분산망의 업보.
- How to Learn:
- 1단계: 카메라 노드(파이썬)는 모터 노드(C++)가 지구에 존재하는지 알 필요도 없이 허공에
/cmd_vel이라는 이름(Topic)표만 붙여 "직진해라" 속도 벡터를 냅다 던지고 도망가는 공간적 완전 분리를 해부합니다. - 2단계: "로봇 팔 30도로 꺾어줘"라고 명령할 때, 꺾일 때까지 서버가 멍청하게 서서 기다리는 동기식(Service) 찌르기와, "나 지금 10도 꺾는 중~"이라고 중간 피드백(Feedback)을 계속 날려주면서 다른 짓을 할 수 있게 놔주는 비동기(Action) 역학의 차이를 뜯어봅니다.
- 1단계: 카메라 노드(파이썬)는 모터 노드(C++)가 지구에 존재하는지 알 필요도 없이 허공에
- Implement: 파이썬
multiprocessing또는 로컬 소켓 모방 구조를 짜서 분산 시스템 구축.SensorNode프로세스는/image문자열만 무한 펌핑하고,MotorNode프로세스는/image에 콜백(Callback) 리스너만 걸어둠. 둘 사이에 아무런 코드적 결합(Import) 없이 큐(Queue) 통신 배관만으로 콘솔 창 2개에서 각자의 톱니바퀴가 돌아가는 ROS 그래프 모사.
Recommended
Core Topic 02: 마스터의 죽음과 군단 통신망, DDS 와이어 프로토콜 (DDS & QoS)
- Why to Learn: 우주 공간이나 험난한 사막에서 통신 타워(Master Node) 하나가 부서졌다고 군집 로봇 전체가 눈을 감아버리는 끔찍한 단일 장애점(SPOF)을 부수고, 노드들이 개미 떼처럼 서로를 스스로 찾아내는 흑마법을 장악하기 위해서입니다.
- What to Learn:
- Concepts: DDS(Data Distribution Service), UDP 멀티캐스트 탐색(Multicast Discovery), RTPS 와이어 프로토콜.
- Skills: QoS(Quality of Service) 프로파일 튜닝 (Reliability, Durability, History, Deadline).
- Tools: Wireshark RTPS 패킷 스니핑, FastDDS/CycloneDDS 옵션.
- Trade-offs: DDS 멀티캐스트 탐색을 켜두면 노드가 켜지는 순간 주변 봇들을 기적처럼 다 찾아내(Discovery) 통신망을 세우지만, 한 공장에 로봇이 100대가 넘어가면 지들끼리 "너 살아있냐?"라는 탐색 패킷(UDP) 폭풍(Broadcast Storm)을 쏘아대어 Wi-Fi 공유기가 터져버리는 확장성 한계(결국 DDS Router/Discovery Server 도입 필요).
- How to Learn:
- 1단계: 마스터 서버 없이, 노드가 부팅되자마자 허공(UDP Multicast)에 "나
/cmd_vel토픽 들을 사람인데 누구 없어?"라고 소리를 지르면, 반대쪽 노드가 "어? 내가 쏘는 사람임!"이라며 P2P(1<1>1>) 파이프를 다이렉트로 결속(Match)해버리는 자율 탐색 궤적을 해부합니다. - 2단계: 카메라 영상처럼 1기가바이트씩 쏟아지다 손실 나도 되는 데이터는 Best-Effort(재전송 안 함)로 쏘고, "비상 정지!" 같은 긴급 제어 명령은 무조건 확인증(ACK)을 받을 때까지 재전송을 갈기는 Reliable 모드로 믹스(Mix)하여 네트워크 트래픽을 지배하는 QoS 기하학을 뜯어봅니다.
- 1단계: 마스터 서버 없이, 노드가 부팅되자마자 허공(UDP Multicast)에 "나
- Implement: 파이썬 스크립트 기반 더미(Dummy) UDP 브로드캐스트 탐색 루틴 작성.
Node_A(수신)가 켜져서 브로드캐스트를 쏘고, 뒤늦게 켜진Node_B(송신)가 핑을 받고Node_A의 IP/Port를 저장한 뒤부터 1<1>1> 유니캐스트(UDP)로 데이터 핑퐁을 시작하는, 중앙 브로커(MQTT) 없이 연결되는 P2P 궤적 증명.
Practical
Core Topic 03: 뼈대 공간의 4x4 매트릭스 변환, TF2 트랜스폼 트리 (TF2 Frame Math)
- Why to Learn: 로봇 팔 끝에 달린 카메라(Camera Frame)가 사과를 발견했을 때, "카메라 기준 우측 10cm"라는 바보 같은 데이터를 냅다 바퀴(Base Frame)에 던지면 차가 엉뚱한 곳으로 돌진하므로, 모든 센서 좌표를 몸통 기준으로 통일시키는 4차원 뼈대 마법을 쥐기 위함입니다.
- What to Learn:
- Concepts: 프레임(Frame), 트랜스폼 트리(Transform Tree:
mapodombase_linkcamera_link). - Skills: 동차 변환 행렬(Homogeneous Transform), 쿼터니언(Quaternion) 오일러 변환, 시간 동기화(Time Travel).
- Tools:
rqt_tf_tree, RViz 디스플레이 플러그인. - Trade-offs: 모든 뼈대(Frame) 좌표를 뿌리(Root)부터 끝단(Leaf)까지 트리(Tree) 구조로 엄격하게 그리면 단 1번의 쿼리로 어느 부위든 위치 환산이 가능해지지만, 이 트리의 연결선이 하나라도 끊어지거나 노드 간 시간(Timestamp)이 0.1초라도 어긋나면 TF 엔진이 "과거/미래 데이터라 변환 못 함!"이라며 패닉(Extrapolation Exception)을 뿜고 시공간이 붕괴되는 지독한 시간성(Temporality)의 감옥.
- Concepts: 프레임(Frame), 트랜스폼 트리(Transform Tree:
- How to Learn:
- 1단계:
/base_link(몸통 중심)에서 목을 20cm 위로 뽑아/camera_link뼈대를 달았다는 족보(Tree)를 TF2 서버(백그라운드 스레드)에 밀어 넣고 무한히 갱신하게 만드는 프레임 방송(Broadcast) 물리를 해부합니다. - 2단계: 카메라 노드가 찍은 사과의 3D 좌표 벡터(X,Y,Z)를 TF2 리스너(Listener) 함수에 던져주면, 백그라운드 서버가 그동안의 뼈대 관절 각도 행렬들을 모조리 끄집어내 연속으로 내적(Dot) 곱셈 융단 폭격을 때린 뒤 "로봇 몸통 기준 사과 좌표는 이거야!"라고 번역해 내는 기하학을 뜯어봅니다.
- 1단계:
- Implement: 3D 공간을 가정하여 평행이동/회전 행렬 2개(
Base_to_Arm,Arm_to_Hand)를 정의하는 파이썬 수학 스크립트 작성.Hand프레임에서 측정한 좌표점[1, 0, 0, 1]에 역순으로 행렬 체인 역변환을 때려Base프레임 기준의 절대 좌표[X_base, Y_base, Z_base]로 완벽히 사상(Mapping)되는 선형 대수학 증명.
Advanced
Core Topic 04: 코딩 없는 쇳덩이 창조와 매트릭스 실험, URDF와 Gazebo 물리 엔진 (Simulation Matrix)
- Why to Learn: 로봇을 쇳물로 깎아 만들고 모터를 달아 코드를 돌려봤다가 벽에 쳐박혀 박살 나는 수백만 원짜리 참사를 막기 위해, 관성과 질량이 완벽하게 재현된 가상 우주(시뮬레이터)에서 코드 100%를 돌려보는 디지털 트윈을 구축하기 위해서입니다.
- What to Learn:
- Concepts: URDF(Unified Robot Description Format), 충돌체(Collision), 관성 텐서(Inertia Matrix).
- Skills: Gazebo 물리 엔진(ODE/Bullet) 연동,
ros2_control가상 하드웨어 플러그인 매핑. - Tools: XML 파싱 링커, RViz(데이터 시각화) vs Gazebo(물리 세계 엔진)의 차이.
- Trade-offs: URDF 파일에 로봇의 뼈대와 센서를 XML 태그 몇 줄로 그리면 가제보(Gazebo)에서 환상적인 3D 물리 시뮬레이터가 공짜로 돌아가지만, 이 가상 세계는 현실의 끈적한 기어 백래시 마찰이나 바람의 영향 같은 비선형적인 우주적 노이즈(Sim-to-Real Gap)까지 100% 똑같이 묘사하지는 못하므로, 시뮬에서 완벽하던 로봇이 현실에선 덜덜 떠는 시뮬레이터 맹신 붕괴의 벽.
- How to Learn:
- 1단계: C++로 코드를 짜는 대신, 그저 텍스트 파일(XML 형식의 URDF) 한 장에 "몸통은 박스 모양(질량 10kg), 바퀴는 원기둥(질량 1kg), 둘은 회전 관절(Continuous Joint)로 연결"이라고 명세서만 적어주면 로봇 형상이 창조되는 구조를 해부합니다.
- 2단계: 이 텍스트 뼈대를 가제보 물리 엔진 매트릭스에 쑤셔 넣고 중력을 켭니다. 그리고 ROS2 터미널에서 바퀴 모터 조인트에
/cmd_vel10rad/s 토크(Torque)를 때려 넣었을 때, 로봇이 바닥 마찰력을 딛고 앞으로 튕겨 나가는 가상 물리 시뮬레이션의 궤적을 뜯어봅니다.
- Implement: XML 형태의 초간단
Robot.urdf텍스트 문자열(Base_Link와 Wheel_Link, 그리고 Revolute Joint)을 파싱하여 메모리 상 트리 자료구조 객체로 띄우는 파이썬 텍스트 파서 데모.Parent(Base)와Child(Wheel)가[0, 0, -5]위치(Origin) 관계로 묶이는 계층 족보를 출력하여, 로봇 하드웨어의 설계도를 소프트웨어 객체(DOM)로 맵핑하는 마법 시각화.