로봇에게 "주방을 청소해"라고 말했더니, 실제로 해냈다
요약
로컬 LLM인 Llama 3.2와 ROS2를 결합하여 자연어 명령으로 로봇을 제어하는 NavMind 프로젝트를 소개합니다. 별도의 유료 API나 물리적 로봇 없이 시뮬레이션 환경에서 언어 모델이 명령을 구조화하고 로봇의 이동 및 청소 동작을 수행하는 과정을 다룹니다.
핵심 포인트
- Llama 3.2를 활용한 자연어 명령의 구조화된 데이터 변환
- ROS2 Nav2를 이용한 로봇의 자율 주행 및 경로 계획
- 클라우드 없이 로컬 환경(Ollama, WSL2)에서 전체 시스템 구동
- 언어 모델을 통한 실시간 작업 상태 해설 기능 구현
채팅창에 "주방을 청소해(Clean the kitchen)"라고 입력했습니다. 로봇은 올바른 방을 향해 몸을 돌리고, 그곳으로 이동하여, 깔끔하게 앞뒤로 왔다 갔다 하는 패턴으로 바닥을 쓸고, 이동하는 내내 자신이 무엇을 하고 있는지 설명하며 다시 집으로 돌아왔습니다.
버튼도, 좌표도, 매번 작성해야 하는 코드도 없었습니다. 그저 문장 하나뿐이었습니다.
저는 지난 몇 주 동안 이것을 만들었습니다. 이름은 NavMind이며, 제가 공개적으로 로보틱스 (Robotics)를 배우면서 작성하는 첫 번째 프로젝트입니다. 이것이 무엇을 하는지, 작동하게 만드는 단 하나의 아이디어는 무엇인지, 그리고 그 과정에서 무엇이 고장 났는지 소개하겠습니다.
한 문장으로 요약하자면
NavMind는 시뮬레이션된 집 (Simulated house) 안에 사는 로봇입니다. 여러분이 일상적인 영어로 무엇을 할지 말하면, 로봇은 여러분이 말하는 방이 어디인지 파악하고, 스스로 그곳으로 이동하여, 바닥 전체를 청소한 뒤, 베이스 (Base)로 돌아옵니다. 주방 (Kitchen), 침실 (Bedroom), 서재 (Study) 등 이름이 붙은 6개의 방이 있으며, "침실을 진공 청소해" 또는 "손님방을 쓸어줘"와 같은 명령을 처리합니다.
이 시스템은 전적으로 제 노트북에서 실행됩니다. 클라우드 (Cloud), 유료 API, 물리적인 로봇 없이, 오직 시뮬레이터 (Simulator)와 로컬에서 실행되는 언어 모델 (Language model)만 사용합니다.
명령을 입력하면 어떤 일이 일어나는가
단일 명령이 처리되는 전체 과정을 따라가 보겠습니다.
"주방을 청소해(clean the kitchen)"라고 입력합니다. (Streamlit으로 구축된) 작은 채팅 앱이 여러분의 문장을 가져옵니다.
언어 모델 (Language model)이 이를 읽습니다. 제 컴퓨터에서 Ollama를 통해 실행되는 로컬 모델인 Llama 3.2가 여러분의 자유로운 문장을 구조화된 명령으로 변환합니다: room = kitchen, action = clean.
그 명령은 로봇의 "두뇌"로 전송됩니다. 내비게이션 노드 (Navigation node)가 이를 수신합니다. 이 노드는 집 지도에서 각 방이 어디에 위치하는지 이미 알고 있으므로, "kitchen"을 실제로 이동할 위치로 변환합니다.
로봇은 그곳으로 이동합니다. 이 과정은 ROS2의 표준 내비게이션 시스템인 Nav2에 의해 처리됩니다. Nav2는 로봇의 현재 위치를 파악하고, 주방으로 가는 경로를 계획하며, 가구를 피하면서 그 경로를 따라갑니다.
로봇은 방을 청소합니다. 목적지에 도착하면, 로봇 청소기가 사용하는 것과 같은 잔디깎이 패턴 (lawnmower pattern)으로 로봇이 바닥을 앞뒤로 왕복하며 구역을 채우는 커버리지 루틴 (coverage routine)이 실행됩니다. 이를 통해 특정 지점만이 아니라 방 전체가 청소됩니다.
로봇은 상황을 설명하고 복귀합니다. 작업이 진행되는 동안 언어 모델 (Language Model)은 채팅창에 평이한 영어로 해설을 작성하며, 방 청소가 끝나면 로봇은 집(기지)으로 돌아옵니다.
이것이 전체 루프 (loop)입니다: 문장 → 의미 → 위치 → 주행 → 청소 → 복귀.
난관이었던 부분들
이 과정 중 매끄러운 부분은 하나도 없었으며, 오히려 엉망이었던 부분들이 저에게 가장 많은 것을 가르쳐 주었습니다. 여러분의 시간을 아껴드리기 위해 몇 가지 사례를 공유합니다:
- 실행을 위해 7개의 터미널이 필요합니다. 시뮬레이터 (simulator), 브리지 (bridge), 내비게이션 시스템 (navigation system), UI, 그리고 몇몇 보조 프로그램들이 각각 별도로, 순서대로 실행되어야 합니다. 하나라도 잊어버리면 로봇은 그냥 그 자리에 가만히 서 있게 됩니다.
- 언어 모델이 로봇에 도달할 수 없었습니다. 저는 Windows의 WSL2 환경에서 모든 것을 실행하고 있으며, Windows 측에 Ollama를 설치했는데, 이 둘은 기본적으로 네트워크를 공유하지 않습니다. 로봇에게 올바른 내부 IP 주소를 지정해 주기 전까지 로봇은 말 그대로 모델과 대화할 수 없었습니다.
- 내비게이션 시스템이 "깨어나지" 않았습니다. Nav2는 대기 상태로 시작되며 특정 순서에 따라 켜져야 합니다. 이를 배우기 전까지는 모든 명령에 대해 로봇이 아주 만족스러운 듯, 아주 미동도 없이 가만히 있을 뿐이었습니다.
이 중 그 어떤 것도 화려하지 않았습니다. 하지만 이 모든 과정이 진정한 배움이 일어난 지점이었습니다.
다음 단계
시도해보고 싶은 몇 가지가 있습니다: 명령 체이닝 (chaining commands, 예: "주방을 청소하고, 그다음에 서재를 청소해"), 방 모양에 적응하는 더 스마트한 커버리지, 그리고 지시 사항을 더 안정적으로 분석할 수 있는지 확인하기 위한 더 큰 로컬 모델 (local model) 사용입니다.
전체 코드와 설정 가이드는 GitHub에 있습니다: github.com/sudeekshach/NavMind (MIT 라이선스입니다. 원하는 대로 마음껏 분해해 보세요).
이것은 저의 첫 번째 글이므로, 프로젝트나 포스트에 대한 피드백을 진심으로 환영합니다. 그리고 만약 이것을 기반으로 무언가를 만드신다면, 무엇을 만드셨는지 꼭 알려주세요. 🤖
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기