ROS2(Robot Operating System 2)는 대부분 같은 네트워크의 PC와 로봇 사이에서 사용되며, 원격 서버에서 노드를 동작시키는 경우는 의외로 드물다. 여기서는 필자의 블로그가 동작하는 Vultr 가상 서버(1 vCPU, 메모리 1GB, Ubuntu 22.04)에 ROS2 Humble을 설치하고, 토픽으로 질의와 응답을 주고받는 실험을 정리하기로 한다.
1. 실험의 구성
(1) 목표
노트북에서 /ask 토픽에 질문을 발행(publish)하면, 서버의 정보 노드가 이를 구독(subscribe)하여 /answer 토픽으로 응답하는 것이 목표이다. 구성은 <그림1>과 같다.
노트북 ─ SSH ─▶ 서버 [ /ask ─▶ info_node ─▶ /answer ]
<그림1> 실험의 구성
(2) 왜 SSH를 거치는가?
그러면, 노트북의 ROS2에서 서버로 직접 토픽을 보낼 수는 없는가? 결론부터 말하면 간단하지 않다. ROS2의 통신 계층인 DDS(Data Distribution Service)는 멀티캐스트로 상대 노드를 탐색(discovery)하는데, 멀티캐스트는 인터넷 라우터를 넘지 못하기 때문이다. 그래서 첫 실험에서는 SSH로 서버에 접속하여 서버 내부에서 토픽을 주고받는 가장 단순한 방법을 택하였다. 또한, ROS_LOCALHOST_ONLY=1로 DDS 통신을 서버 내부(127.0.0.1)로 제한하였으므로 외부에 여는 포트는 없다.
2. 설치
메모리를 웹 서버와 나누어 써야 하므로 GUI 도구가 포함된 desktop 구성 대신 최소 구성인 ros-core만 설치하였다. 운영 중인 서버에서는 apt upgrade로 기존 패키지를 일괄 갱신하지 않도록 유의해야 한다. PHP나 데이터베이스가 함께 갱신되어 사이트가 멈출 수 있기 때문이다.
# ROS2 apt 저장소 등록 후
sudo apt install -y ros-humble-ros-core
# ~/.bashrc
source /opt/ros/humble/setup.bash
export ROS_DOMAIN_ID=7
export ROS_LOCALHOST_ONLY=1
3. 정보 노드의 작성
정보 노드는 rclpy로 작성한 파이썬 파일 하나이며, 처리하는 질의는 <표1>과 같다.
| 질의 | 응답 내용 |
|---|---|
| status | 가동 시간, CPU 부하, 메모리 및 디스크 사용량 |
| time | 서울 현재 시각 |
| visitors | 블로그 방문자 수 (어제 · 오늘 · 전체) |
| fortune | 로봇 관련 한마디 (무작위) |
방문자 수는 홈페이지의 카운터 값을 읽어 오며, 사이트 부하를 줄이기 위하여 1분 동안 캐시한다. 노드의 핵심 부분은 다음과 같다.
class InfoNode(Node):
def __init__(self):
super().__init__("yd_info")
self.pub = self.create_publisher(String, "answer", 10)
self.create_subscription(String, "ask", self.on_ask, 10)
def on_ask(self, msg):
self.pub.publish(String(data=answer(msg.data)))
4. 실행 및 결과
SSH 접속을 끊으면 실행 중인 프로그램도 종료되므로 노드는 tmux 안에서 실행하였다. “준비 완료” 로그가 보이면 Ctrl+B, D로 세션에서 빠져나온다(detach). 노드는 계속 동작하며 tmux attach -t ros로 다시 확인할 수 있다.
tmux new -s ros
python3 info_node.py
[INFO] [yd_info]: 준비 완료 — /ask 로 질문하세요 (help | status | time | visitors | fortune)
질의는 발행과 수신을 한 번에 처리하는 보조 스크립트를 ask라는 별칭으로 등록하여 사용하였다. 다음은 실제 서버에서 얻은 결과이다.
$ ask status
가동 시간 : 49일 2시간 22분
CPU 부하 : 0.01 / 0.07 / 0.03 (1 / 5 / 15분)
메모리 : 496 / 952 MB 사용 (스왑 71 MB)
디스크 : 13.8 / 31.6 GB 사용
$ ask visitors
어제 1명 · 오늘 4명 · 전체 282명
$ ask fortune
로봇은 거짓말을 하지 않습니다. 엔코더가 할 뿐.
물론 ros2 명령으로 직접 발행하여도 응답은 같다.
ros2 topic echo /answer
ros2 topic pub --once /ask std_msgs/msg/String "{data: time}"
data: 2026-09-15 (화) 16:46:30 KST
★주: 노드 하나의 메모리 사용량은 약 60MB로 워드프레스와 함께 동작시켜도 부담이 거의 없으나, 스왑(swap) 영역은 미리 확인해 두는 것이 좋다.
5. 맺음말
이상에서 메모리 1GB의 작은 서버에서도 ROS2 노드가 무리 없이 동작함을 확인하였다. 다만 이번 실험은 엄밀히 말하면 원격 통신이라기보다 원격 접속에 가깝다. 다음에는 Zenoh 브리지나 rosbridge로 노트북과 서버의 ROS2를 직접 연결하여, 로봇의 상태를 원격으로 수신해 볼 예정이다.
