ROS 2 — 로봇 / AGV 미들웨어
ROS 2 (Robot Operating System 2) 는 모바일 로봇 / AGV / 협동 로봇 / 드론 분야의 표준 미들웨어로, DDS (Data Distribution Service, RTPS over UDP/TCP) 위에서 publish / subscribe / service / action 을 제공합니다. 토픽 (예: /odom, /imu, /battery_state) 을 구독하여 로봇 상태를 모니터링하는 것이 일반적입니다.
게이트웨이의 ROS2 드라이버는 ROS 2 표준 브릿지 rosbridge_suite (rosbridge_server) 의 JSON over WebSocket 엔드포인트에 접속해 토픽을 구독하는 실구현 드라이버 입니다. DDS 에 직접 붙지 않으므로 ROS 2 측에 rosbridge_server 만 띄우면 됩니다. 읽기 전용 입니다.
사전 준비 — rosbridge_server
ROS 2 측 (로봇 본체 또는 같은 네트워크의 PC) 에 표준 패키지 rosbridge_suite 를 설치·구동합니다.
# 예: ROS 2 Humble
sudo apt install ros-humble-rosbridge-suite
ros2 launch rosbridge_server rosbridge_websocket_launch.xml # 기본 ws 포트 9090
등록 폼 입력값
| 입력 칸 | 무엇을 적나요 | 예시 |
|---|---|---|
| IP 주소 | rosbridge_server 호스트 | 192.168.0.30 |
| 포트 | rosbridge WebSocket 포트 | 9090 (ws 기본) / 9443 (wss 기본) |
| 경로 (rosbridge) | WebSocket endpoint 경로 — 옵션 path | / (기본) |
| TLS 사용 | false = ws / true = wss — 옵션 tls | false (기본) |
ROS 2 드라이버는 read 전용 입니다. 토픽 publish (예: /cmd_vel 이동 명령) 는 rosbridge advertise 가 필요해 지원하지 않습니다. 로봇 명령 송신은 별도 경로를 사용하세요.
태그의 PLC 주소 표기
주소는 <topic>:<field.dot.path> — 첫 : 로 토픽과 필드 경로를 분리합니다 (ROS 토픽은 / 를 포함하고 : 는 없음).
| 표기 | 의미 |
|---|---|
/temperature:data | std_msgs/Float64 의 data 필드 |
/imu:orientation.z | sensor_msgs/Imu 의 중첩 필드 (dot-path) |
/scan:ranges.0 | 배열 원소 — 숫자 세그먼트가 인덱스 |
/odom | : 없으면 msg 전체 (JSON 문자열) |
- 리프 필드는 텍스트 값으로, object / array 는 JSON 문자열로 반환됩니다.
- lazy subscribe — 토픽은 첫 read 시 1회 구독되고 이후 rosbridge 가 새 샘플을 push 합니다. 따라서 첫 값은 다음 수집 주기부터 들어옵니다.
데이터 형식 매칭
| msg 필드 | 데이터 형식 |
|---|---|
float 필드 (data, orientation.z …) | Float / Double |
| int / enum 필드 | Integer |
| bool 필드 | Boolean |
| 문자열 / msg 전체 (JSON) | String |
자주 쓰는 토픽 매핑 (참고)
| 주소 | 의미 | 권장 형식 |
|---|---|---|
/battery_state:percentage | 배터리 잔량 (sensor_msgs/BatteryState) | Float |
/odom:pose.pose.position.x | 로봇 위치 x (nav_msgs/Odometry) | Float |
/odom:twist.twist.linear.x | 전진 속도 (nav_msgs/Odometry) | Float |
/diagnostics | 진단 메시지 전체 | String (JSON) |
/scan (LiDAR raw) 처럼 큰 메시지는 msg 전체 수집을 피하고 필요한 원소만 (예: /scan:ranges.0) 등록하세요.
자주 만나는 문제
| 증상 | 가능한 원인 | 해결 |
|---|---|---|
| 등록 직후 값이 비어 있음 | lazy subscribe — 첫 read 는 구독만 수행 | 다음 수집 주기 (timecycle 1회) 까지 대기 |
| 연결 실패 (connect failed) | rosbridge_server 미구동 / 포트 불일치 | ROS 2 측 rosbridge_server 구동 + 포트 (9090) 확인 |
wss 연결 실패 | TLS 설정 / 인증서 | tls=true 면 rosbridge 도 TLS 로 구동돼야 함 (wss 기본 포트 9443) |
| 값이 갱신되다 멈춤 | WebSocket 끊김 — 드라이버는 즉시 미연결로 전환 (오래된 캐시 값을 계속 반환하지 않음) | 네트워크 / rosbridge 재기동 확인 |
| 토픽 이름은 맞는데 빈 값 | 필드 dot-path 오타 (msg 에 없는 경로) | ros2 topic echo <topic> 으로 msg 구조 확인 후 경로 수정 |
다른 통합 경로 (참고)
rosbridge 를 쓸 수 없는 환경에서는 다음 경로도 가능합니다.
| 상황 | 대안 |
|---|---|
| 다수 로봇 + 클라우드 수집까지 필요 | MQTT bridge → Sparkplug B / MQTT 클라이언트 |
| 산업용 로봇 컨트롤러 (ABB / KUKA / UR) | OPC UA Robotics Companion → OPC-UA |