ROS 2 (로봇 미들웨어) 드라이버
개요
ROS 2 (Robot Operating System 2) 는 모바일 로봇 / AGV / 협동 로봇 / 드론 분야의 표준 미들웨어로,
DDS (Data Distribution Service, RTPS over UDP/TCP) 위에서 publish / subscribe / service / action
를 제공합니다. 토픽 (예: /odom, /scan, /battery_state) 을 구독하여 로봇 상태를 모니터링합니다.
| 항목 | 값 |
|---|---|
opc_type | ROS2 |
| 구현 클래스 | plantpulse.driver.protocol.ros2.ROS2Driver |
| 라이브러리 | rosbridge_suite (JSON over WebSocket, 자체 클라이언트) |
| read | ✅ 토픽 구독 — <topic>:<field.dot.path> |
| write | ⛔ 미지원 (읽기 전용) |
| 보안 | DDS-Security / SROS2 (벤더별) |
ROS2 는 rosbridge_server 에 WebSocket 으로 접속해 토픽을 구독하는 실구현입니다.
등록 방법·주소 계약은 연결 유형 — ROS 2 가 정본이며, 아래는
대안 운영 방법 의 bridge 패턴 중 하나를 사용하세요.
왜 native 구현이 어려운가
ROS 2 의 자바 클라이언트인 rcljava 는
순수 자바 라이브러리가 아니라 C++ 코어 (rcl, rmw) + JNI 바인딩 구조입니다.
| 의존 요소 | 설명 | 배포 영향 |
|---|---|---|
rcl (C) | ROS 2 client library 코어 | 플랫폼별 .so / .dll 필요 |
rmw middleware | 실제 DDS 구현 추상화 | 어떤 DDS 를 쓸지 빌드시 결정 |
rmw_cyclonedds_cpp | Eclipse CycloneDDS 백엔드 | native lib + license (EPL/EDL) |
rmw_fastrtps_cpp | eProsima Fast DDS 백엔드 | native lib + license (Apache 2.0) |
| ROS 2 distro 의존 | Humble / Iron / Jazzy / Rolling 매 LTS 마다 ABI 다름 | 게이트웨이 OS 버전과 매칭 필요 |
| JNI bridge | rcljava 자체 | 자바 메모리 모델과 DDS thread pool 충돌 위험 |
따라서 PlantPulse Edge 처럼 다양한 OS / 아키텍처 (x86-64 Linux, ARM64 Linux, Windows Server) 에서 동작해야 하는 자바 애플리케이션이 native ROS 2 클라이언트를 직접 임베드하는 것은 배포 / 라이브러리 충돌 / 버전 매칭 면에서 매우 비용이 큽니다.
대안 운영 방법
ROS 2 진영은 외부 시스템 통합용으로 bridge 노드를 표준화해 두었습니다. PlantPulse 는 bridge 의 출력 인터페이스를 받기만 하면 됩니다.
옵션 1. rosbridge_server (WebSocket / REST)
ROS 2 측에 rosbridge_suite 를 띄우면
JSON over WebSocket / HTTP 로 토픽 구독이 가능합니다.
| 사용할 PlantPulse 드라이버 | 페이지 |
|---|---|
HTTP (REST polling 또는 WebSocket bridge) | HTTP |
옵션 2. MQTT bridge
ros2-mqtt-bridge 등의 bridge 로 ROS 2 토픽을
MQTT 토픽으로 변환합니다.
| 사용할 PlantPulse 진입로 | 페이지 |
|---|---|
| Sparkplug B 입력 | Sparkplug B |
옵션 3. OPC UA Robotics Companion Specification
OPC Foundation + VDMA 가 표준화한 OPC UA Robotics Companion Spec 을 지원하는 로봇 컨트롤러 (예: ABB OmniCore, KUKA KR C5, Universal Robots PolyScope X) 가 늘고 있습니다. 이 경우 ROS 2 자체가 아니라 컨트롤러의 OPC UA 서버에 직접 접속할 수 있습니다.
| 사용할 PlantPulse 드라이버 | 페이지 |
|---|---|
OPCUA | OPC-UA |
어떤 옵션을 골라야 하나
| 상황 | 권장 |
|---|---|
| 자체 개발 ROS 2 시스템 (모바일 AGV 등) | rosbridge_server + HTTP 드라이버 |
| 다수 로봇 + 클라우드 수집까지 필요 | MQTT bridge → Sparkplug B |
| 산업용 로봇 컨트롤러 (ABB / KUKA / UR) | OPC UA Robotics Companion → OPCUA 드라이버 |
| 단순 상태 텔레메트리 1~2 토픽 | rosbridge_server REST polling |
추후 native 구현 시 고려 사항
| 옵션 | 의존성 | 난이도 |
|---|---|---|
| rcljava 임베드 | rcl + rmw + DDS 의 native .so / .dll | 매우 상 |
| ROS 2 Java 클라이언트 (jros2client 등 fork) | 비공식, 유지보수 약함 | 상 |
| 자체 RTPS 파서 (UDP 멀티캐스트) | RTPS 스펙 직접 구현 | 매우 상 |
PlantPulse Edge 의 단일 jar 배포 모델 안에서 native ROS 2 클라이언트를 임베드할 계획은 없습니다. 공식 권장 통합 경로는 rosbridge_server (HTTP) 또는 OPC UA Robotics Companion (OPCUA) 입니다.
stub 등록 (테스트 전용)
curl -X POST http://<edge-host>/api/v1/opc \
-H "Content-Type: application/json" \
-d '{
"opc_id": "OPC_ROS2_STUB",
"opc_type": "ROS2",
"opc_name": "ROS 2 stub",
"opc_agent_ip": "192.168.0.0",
"opc_agent_port": "0",
"site_id": "SITE_00001",
"auto_collect": false,
"timecycle": 5000,
"tag_list": []
}'