[작성자:] admin

  • Vultr서버에 ROS2 테스트 하기

    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> 정보 노드가 처리하는 질의

    방문자 수는 홈페이지의 카운터 값을 읽어 오며, 사이트 부하를 줄이기 위하여 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를 직접 연결하여, 로봇의 상태를 원격으로 수신해 볼 예정이다.

  • 운동 패턴

    팔월 스무엿새맑음

    헬스장을 상록수로 옮겼다. 일 년 회원권과 사물함, 운동복을 함께 끊었다. 개인 지도 열 번을 더하여 값을 치렀다.

    셈을 마치고 나오니 마음이 가볍지 않다. 몸을 산 것이 아니라 결심을 산 것이다. 결심은 값을 치른다고 오지 않는다.

    돌아보다흐림

    오월에 71.9킬로그램까지 내렸다. 지금은 75와 76 사이를 오간다.

    여름 휴가를 앞뒤로 하여 패턴이 무너졌다. 무너진 것은 몸이 아니라 하루의 차례다. 차례가 무너지니 몸이 따라 무너졌다.

    내리는 데는 여러 달이 걸렸다. 오르는 데는 그러하지 않았다.

    어깨바람

    오른쪽 어깨에 오십견이 있다. 상체 운동은 할 수 있는 것이 많지 않다.

    팔을 들면 걸리는 자리가 있다. 그 자리를 피해 움직인다. 피하는 것도 운동이다.

    푸쉬업맑음

    푸쉬업을 시작했다. 한 번에 열에서 열다섯. 열 세트.

    이만큼 하면 어깨의 통증이 덜하다. 트레이너에게 물으니 오른쪽 날개 근육을 쓴 까닭이라 한다.

    아픈 자리를 쉬게 하여 낫는 줄 알았다. 그렇지 않았다. 아픈 자리 곁을 쓰니 아픔이 물러갔다.

    스쿼트맑음

    체지방을 줄이려면 스쿼트를 더하라 한다.

    푸쉬업 열다섯에 스쿼트 열다섯. 이것이 한 세트다.

    세 세트에 이르니 숨이 찬다. 열 세트는 아직 멀다. 멀다고 적어 둔다.

    오늘의 소용—

    종목횟수세트비고
    푸쉬업10~1510어깨 통증 완화
    스쿼트10~153~체지방 감소 목적

    푸쉬업과 스쿼트를 묶어 한 세트로 삼는다. 지금은 세 세트에 그친다. 늘려 가야 한다.

    몸은 정직하다. 쉬면 늘고 하면 준다. 속임이 없다.

    71.9로 돌아가는 길은 이미 알고 있다. 몰라서 못 가는 것이 아니다.

    다만 걸어야 한다.

어제 방문자 : 3 명오늘 방문자 : 1 명전체 방문자 : 584 명