배경 & 목표
R2BOT은 교내를 자율적으로 이동하며 짐을 운반하거나 방문객을 목적지까지 안내하는 자율주행 서비스 로봇이다.
처음 학교에 입학했을 때, 실습실 이름이 복잡하고 직관적이지 않아 반 학기가 지나서도 새 건물의 실습실을 찾기 어려웠다. 이는 신입생은 물론 외부 손님·학부모님에게도 똑같은 불편이라고 생각했다. 기숙사 입사나 주말마다의 짐 정리처럼 무거운 짐을 옮기는 일도 체력적으로 큰 부담이었다.
이러한 문제의식에서 “사람을 따라다니며 짐을 운반하고 길을 안내하는 로봇이 있다면?” 이라는 질문이 출발점이 됐다. 사용자가 목적지를 입력하면 그곳까지 안내하고, 캠퍼스에 익숙한 사용자는 물건을 실어 운반용으로도 쓸 수 있는 안내와 운반을 겸비한 실용적인 로봇을 목표로 삼았다.
개발 과정
기획 · 기구 설계
요구사항을 운반·안내 두 시나리오로 정리하고, Fusion360으로 차체를, AutoCAD로 프레임 도면을 그렸다. 각 부품을 3D로 설계하고 시뮬레이션으로 간섭 여부와 동작 안정성을 확인한 뒤 실제 제작에 들어갔으며, 2D 설계 단계부터 3D 환경으로 불러와 배치와 연결 구조를 사전에 검토했다.

Fusion360 — 차체 설계
2륜 프로토타입
빠르게 검증하기 위해 2륜 차동 구동으로 1차 프로토타입을 만들었다. STM32로 모터를 제어하고 기본 주행을 확인했지만, 펌웨어에서 드라이버 2개로 PWM을 각자 발행하다 보니 직진성이 부족하다는 한계가 드러났다.
2륜 초기 시연영상
4륜 재설계 · 내부 배선
토크 여유와 안정성을 위해 4륜 구동으로 재설계했다. 모터·드라이버를 재선정하고 전원 계통을 다시 배선했으며, PWM 주기 관리를 함께 잡았다.
4륜 중간 시연영상

중간 결과물

중간 결과물
주행 제어 시도
Jetson에 제어용 웹을 올리고 MCU와 이더넷으로 연결해, 웹에서 명령을 내리면 4륜이 구르는 주행 제어까지 구현했다. 자율주행을 위해 라이다 2개를 TF로 병합해 연결하고 slam_toolbox로 단발성 맵 작성에 성공했으며, Nav2까지 올려 웹 UI에서 목적지 goal을 내릴 수 있는 단계까지 도달했다. 다만 로봇이 조향 없는 4륜 DD 구조라 구조적으로 회전이 어려워, 경로를 따라 부드럽게 주행하지는 못했다.
4륜 주행 시연영상

WEB — 길찾기 인터페이스
내 역할
5명이 기구·자율주행·웹·AI를 나눠 맡은 가운데, 나는 팀장으로서 프로젝트 방향을 주도하며 로봇이 실제로 움직이는 층 — 펌웨어·통신·하드웨어부터 ROS2 자율주행 개발까지 책임졌다.
STM32 기반 모터 제어 펌웨어 개발 — 주행 로직과 주변 장치 제어, PWM·타이머 구성으로 하드웨어와 소프트웨어 간 통신을 가능하게 했다.
ROS2 기반 자율주행 개발 — 라이다 2개를 함께 쓰기 위해 각 센서의 TF(좌표 변환)를 병합(merge)해 하나의 스캔으로 통합했고, slam_toolbox로 맵 작성, Nav2로 네비게이션까지 연동했다.
Jetson Nano ↔ STM32 UART 통신 구성 및 MQTT 연동 — Jetson에 테스트용 웹 서버를 두고 주행 제어 명령과 센서 데이터를 실시간으로 주고받도록 상위·하위 명령 프로토콜을 설계했다.
시스템 통합 및 하드웨어 — Jetson이 외부와 통신하고 로봇 전반을 관리하도록 데이터 흐름을 설계했으며, 회로 구성과 전원·모터 드라이버 배선·배치에 참여했다.
트러블슈팅
ROS2 버전 호환성 문제
초기에는 ROS2 Humble을 쓰려 했으나 Jetson Nano는 Ubuntu 18.04까지만 지원되었고, 대부분의 오픈소스는 Ubuntu 20.04에서 호환되었다.
고성능 보드로 교체하려 Jetson Orin NX를 투입했으나 보드가 고장나며 프로젝트에 큰 지장이 생겼다.
Jetson Nano에서 Docker로 ROS2 환경을 격리해 재현 가능한 세팅을 만들고, DRobotics의 RDK X3 보드와 연산을 나눠 성능 부족을 개선했다.
BLDC 드라이버 사양 문제
구매한 BLDC 모터 드라이버가 데이터시트 사양에 미치지 못해 초반 토크 부족 문제가 발생했다.
문제를 추적한 결과 센서리스 타입 드라이버가 원인으로 밝혀졌다.
센서드 타입 드라이버로 교체해 토크 부족 문제를 해결했다.
센서드 모터의 토크 문제
센서드 타입 드라이버로 교체한 후에도 예상보다 낮은 토크 문제가 이어졌다.
STM32에서 PWM 주파수의 정확도를 낮게 설정한 것이 문제였고, NUCLEO-F103RB는 72MHz가 최대여서 ARR·CCR을 올바르게 분배하기가 거의 불가능했다.
최대 주파수가 높은 NUCLEO-H755ZI-Q로 교체해 ARR·CCR 분배 정밀도를 확보하고 토크 문제를 해결했다.
2륜 한계 · 좌우 RPM 불일치
2륜 운행 시 보조바퀴가 있어도 지면이 고르지 않거나 하중이 실리면 모터가 본래 토크를 내지 못했고, 좌우 모터의 RPM 차이로 로봇이 한쪽으로 심하게 기울었다.
STM32단 전처리로 좌우 출력을 보정하는 방향을 잡되, 근본적으로는 토크와 안정성을 확보하기 위해 4륜 구조로의 재설계를 우선 진행했다.
4륜 구조의 회전 불가 문제
바퀴가 고정된 4륜 구조는 회전이 어렵다. 2륜은 밖으로 밀리며 회전이 가능하지만, 4륜은 원을 그리는 선회 동작이 잘 나오지 않았다.
움직임 연산을 직진·회전으로만 두지 않고, CCR을 높여 좌우 바퀴 속도에 차이를 주는 방식으로 완만한 곡선 선회가 가능하도록 제어 로직을 보완했다.
결과 & 회고
약 1년 3개월(2024.03 ~ 2025.06)에 걸친 개발 끝에, R2BOT은 하드웨어와 주행 제어까지 실제로 동작하는 수준에 도달했다. Jetson의 제어 웹에서 명령을 내리면 MCU와 이더넷으로 통신해 4륜이 굴렀다. 정밀 부하 테스트까지는 못 했지만 사람이 올라갈 수준 약 200KG 까지 적재를 버텼고, 주행 속도는 2 ~ 7m/s 범위에서 확인했다.
다만 자율주행은 끝내 완성하지 못했다. slam_toolbox로 라이다를 연결해 맵 작성까지는 성공했으나, 기구학적으로 조향이 없는 4륜이여서 회전이 어려워 주행에 성공하지 못했다. 목적지 안내도 웹 UI에서 nav2 로 goal 을 던질 수 있었지만 주행이 따라오지 못했다.
주행 안정성에서도 좌우 바퀴 속도 차로 로봇이 한쪽으로 쏠리는 문제가 남았다. 원인을 추적해 보니, 필요한 PWM 주파수가 MCU가 안정적으로 낼 수 있는 범위를 넘어선 데 있었다(트러블슈팅 참조).
초기에는 프로토타입 없이 실물 위주로 모터·통신만 시험하다, 작은 실수 하나가 전체 일정을 크게 흔드는 경험을 했다. 이후 3D 모델링 기반 설계와 사전 통신 검증 절차를 도입하면서 개발 효율을 끌어올렸고, 2륜에서 4륜으로 과감히 재설계하며 “빨리 만들어 검증하고, 한계가 보이면 다시 설계한다” 는 감각도 얻었다. 다만 가장 아쉬운 것은 Isaac Sim이나 Gazebo 같은 로봇 시뮬레이션의 중요성을 그때는 제대로 알지 못했다는 점이다. 실물을 만들기 전에 시뮬레이션으로 주행을 먼저 검증했다면, 조향이 없는 고정형 4륜 구조가 자율주행에 맞지 않는다는 것을 설계 단계에서 미리 발견하고 바로잡을 수 있었을 것이다. 그래도 하드웨어·펌웨어·통신을 동시에 디버깅한 경험과 그 한계를 분명히 인지한 것이, 이후 작업에서 무엇을 먼저 검증해야 할지 정하는 기준점이 됐다.