Backend
로봇을 위해서
정호종··수정됨 2026.07.21
로봇을 위하여
한 줄 요약 — 로봇팔, 로봇차처럼 로봇이 들어가는 컨텐츠에서 매번 새로 연결하지 않도록, 공통된 통신(ROS2)을 한곳에서 대신 맡고 콘텐츠 쪽에서는 간단한 명령만 보내도록 만든 통합 컨트롤러 이야기입니다. 아직 완성형은 아니고, 지금도 만들어 가는 중입니다.
여러 종류의 로봇을 다루다가, 매번 새로 짜는 대신 공통된 부분을 하나로 모을 수 없을까 하는 고민에서 시작했습니다. 이 글은 그 계기와 고민, 그리고 지금까지 만든 것을 정리한 기록입니다.
1. 어떻게 시작했나 — 로봇팔과 로봇차
최근 업무에서 로봇을 제어해야 할 일이 있었습니다. 로봇팔과 로봇 자동차가 그 대상이었습니다.
각각에 맞는 제어 프로그램을 만들어 나가다 보니, 관련 문서 곳곳에서 한 가지 공통점이 자꾸 눈에 들어왔습니다. 바로 둘 다 'ROS2'라는 것을 쓰고 있다는 점이었습니다.
2. 그래서 ROS2가 무엇인가
ROS2(Robot Operating System 2) — 이름은 운영체제 같지만, 핵심만 보면 로봇 부품들이 메시지를 주고받는 통신 규격(약속)입니다.
로봇은 보통 부품이 많습니다. 바퀴를 돌리는 모터, 거리를 재는 센서, 영상을 찍는 카메라, 팔 관절 같은 것들이죠. 이 부품들이 "지금 30cm 앞에 벽이 있다", "그러면 멈춰라" 하고 끊임없이 메시지를 주고받아야 로봇이 제대로 움직입니다. ROS2는 이 메시지를 어떤 형식으로, 어떤 통로로 주고받을지 정해 둔 공통 약속이고, 전 세계 로봇 개발자들이 사실상 표준처럼 쓰고 있습니다.
여기서 짚어 둘 점이 하나 있습니다.
ROS2가 같다고 해서 모든 로봇이 같은 명령을 받는 것은 아닙니다. ROS2가 통일해 주는 건 "무엇을 시키느냐(명령어)"가 아니라 "메시지를 어떻게 실어 나르느냐(통신 규격)"입니다.
편지에 비유하면 봉투와 우편 시스템은 같지만, 그 안에 적는 내용은 로봇마다 다른 셈입니다.
3. 결론 — 통신을 일괄적으로 처리하자
그래서 도달한 결론은 이렇습니다.
로봇마다 매번 비동기 처리와 통신부를 새로 구현하는 것도 비효율적이고,
유니티·고도 등 여러 환경으로 프로그램을 만들 때마다 각 환경에 맞는 통신을 다시 구현해야 하는 번거로움도 있었습니다.
이 반복을 없애기 위해, ROS2를 활용해 콘텐츠 쪽에서는 단순히 명령을 내리거나 값을 간편하게 받아올 수 있도록 지원하는 통합 컨트롤러를 만들자는 것이었습니다.
4. 지금까지 만든 것
콘텐츠 쪽에서는 일정한 구조로 명령을 보냅니다. 예를 들면 이런 모양입니다.
{"op":"run_command","device":"robot_arm","command":"move_to",
"args":{"x":0.3,"y":0.0,"z":0.2}}
"로봇팔에게 (0.3, 0, 0.2) 위치로 이동하라고 시켜 달라"는 뜻입니다.
로봇차라면 move_to가 아니라 drive처럼 그 로봇에 맞는 명령을 보냅니다. 명령어는 로봇마다 다르지만, 명령을 실어 보내는 통로와 형식은 똑같이 가져가는 거죠.
5. 기본 구조
아직 다듬을 곳이 많지만, 지금까지 만든 뼈대는 이렇습니다.
왜 파이썬인가
무거운 고속 통신·데이터 처리는 게임 엔진 안에서 직접 감당하기 버겁습니다. 게임 엔진은 통신을 화면 그리는 프레임 루프에 얹어 처리하다 보니, 오가는 데이터가 많아지면 프레임이 끊기기 쉽고 동시 처리도 까다롭기 때문입니다.
반면 파이썬은
asyncio같은 비동기 처리가 잘 갖춰져 있어, 많은 연결과 메시지를 화면 갱신과 상관없이 효율적으로 다룰 수 있고,ROS2 연동(rclpy)·WebSocket·msgpack 같은 통신·직렬화 라이브러리도 풍부합니다.
그래서 무거운 통신을 별도 프로세스로 떼어 두면, 게임 엔진은 결과만 받아 쓰면 되니 서로의 부담을 자연스럽게 나눌 수 있습니다.
어떻게 연결하나 — WebSocket
통신 방식은 WebSocket으로 잡았습니다. 콘텐츠(Unity, Godot, 파이썬 등) 쪽에서 별도 구현 없이 간단하게 붙어 명령을 주고받을 수 있게 하기 위해서입니다. 카메라·라이다처럼 무거운 영상 데이터는 더 빠른 전용 통로로 따로 보내도록 길을 나눴습니다.
어떻게 로봇을 추가하나 — 설정 파일
로봇마다 다른 명령어는 코드가 아니라 설정 파일(YAML)에 적어 둡니다. 파일 한 장만 끼우면 새 로봇을 추가할 수 있어서, 장비가 늘어도 핵심 코드는 건드리지 않도록 했습니다.
진짜 로봇이 없어도 — 가짜(Mock) 모드
실제 로봇이 없는 환경에서도 콘텐츠 쪽을 테스트할 수 있도록, 가짜 데이터를 보내 주는 Mock 모드를 마련했습니다.
믿고 쓰기 위해 — 자동 테스트
통신 규약, 설정 시스템, 서버 동작을 점검하는 자동 테스트를 붙여 두었습니다.
6. 현재 상태 한눈에
구분 | 내용 | 상태 |
|---|---|---|
통신 구조 | WebSocket 기반 통합 컨트롤러 + 대용량 데이터용 고속 통로 | 동작 |
가짜(Mock) 모드 | 실제 로봇 없이 전체 흐름 테스트 | 동작 |
장비 설정 | YAML 설정 파일로 로봇 추가 | 동작 |
실제 ROS2 연결 | rclpy 백엔드 | 틀만 잡음 |
로봇 자동 세팅 | 전원 켜면 자동 통신·연결 대기 | 예정 |
7. 남은 고민과 앞으로
아직 갈 길이 꽤 멉니다. 현재는 틀을 잡아 가짜 모드까지 돌아가는 단계이고, 실제 ROS2와 연결되는 부분은 아직 채워야 합니다.
이 부분을 해결한 뒤에는 로봇 쪽 설정을 자동화하는 프로그램을 만들려고 합니다. 지금은 로봇에서 통신을 띄우는 과정을 사람이 일일이 챙겨야 하는데,
로봇 전원을 켜면 알아서 통신 프로토콜이 실행되고, PC와 연결될 때까지 대기 상태로 들어가도록 자동화하는 것이죠.
로봇마다 OS가 다양하지만, 대표적인 OS 몇 가지를 추려 대응하면 불가능한 일은 아니라고 봅니다.
시작은 "어떻게 통신을 처리하지?"라는 작은 고민이었습니다. 정답을 다 찾은 건 아니지만, 방향만큼은 또렷합니다.
콘텐츠를 만드는 과정에서 로봇과 씨름하는 노력을 최대한 낮추고, 그렇게 아낀 노력을 콘텐츠 자체에 더 쏟아 높은 퀄리티의 결과물을 뽑아내는 것.
이것이 최종 목표입니다. 로봇 제어는 이 도구에 맡기고, 사람은 콘텐츠에 집중할 수 있도록 계속 만들어 가려 합니다.
읽기 도구
약 6분 읽기
이 글이 도움이 되었나요?