명장 홈🤖 AI명장유튜브 AI 강좌를 함께 정리하고 함께 배우는 명장 플랫폼명장 게시판 홈요청하기
본문 태그 링크 끄기

강화학습으로 만드는 진공청소기 배틀봇

James Bruton · 2026-10-29 · 유튜브 시청 3,174 · 게시판 조회 3 · 외국인

응용강화학습

유튜브 썸네일

난이도 응용#강화학습#배틀봇#PyTorch#ROS#로봇제어

← 목록

저자: James Bruton (외국인) · 원제: Reinforcement Learning BattleBots

난이도 판정: 강화학습 보상 설계, Stable-Baselines3와 PyTorch 학습, ROS 시각화와 무선 제어 등 여러 기술이 함께 등장해 입문보다 높은 수준입니다. 수식이나 코드 세부 설명보다는 제작 과정과 시행착오 중심이라 연구 논문 수준은 아닙니다.

요약

강화학습으로 진공청소기 외형의 배틀봇을 시뮬레이션에서 학습시키고, 보상 설계의 허점을 고치는 과정을 정리했습니다. 이어서 옴니휠 로봇 하드웨어, ELRS 무선 제어, 바이브 트래커 기반 절대 위치 추적, 시뮬레이션과 실제 로봇의 회전 속도 차이 보정까지 다룹니다.

⏱ 00:001. 프로젝트 목표와 게임 설계

⏱ 00:00영상은 강화학습으로 진공청소기 외형의 배틀봇 두 대가 스스로 싸우도록 학습시키고, 이를 실제 로봇으로 옮기는 과정을 다룹니다. 먼저 Pygame으로 2D 격투 게임을 만들어 키보드와 컨트롤러로 두 로봇을 조종할 수 있게 했고, 로봇은 홀로노믹 방식이라 회전 없이 전후좌우로 이동할 수 있습니다.

영상 장면 00:00
▶ 00:00 영상에서 보기

상대를 점수로 이기거나 링 밖으로 밀어내면 승리하는 규칙이며, ROS 변환을 게시해 RViz에서 3D로 볼 수 있도록 시각화했습니다.

⏱ 02:072. 강화학습 환경과 보상 설계

⏱ 02:07학습 환경은 Gymnasium API로 감싸서 만들었습니다. 매 경기마다 게임을 초기화하고 초당 20번 단계를 진행하며, 로봇의 속도와 체력, 무기 확장 정도, 경기장 중심과 상대의 위치와 방향 같은 관측값을 신경망에 넘깁니다. 신경망은 Stable-Baselines3로 구축했고 내부적으로 PyTorch 모델이 사용됩니다.

영상 장면 02:07
▶ 02:07 영상에서 보기

보상은 상대의 뒤나 옆에서 공격하면 높게, 정면 공격은 낮게 주고, 빗나간 무기 사용에는 감점을 주는 방식으로 설계했습니다. 경기장을 여러 지름의 영역으로 나누어 중앙에 있을수록 보상을 높이고, 바깥으로 나가면 페널티를 주었습니다.

⏱ 03:393. 보상 설계의 허점과 재조정

⏱ 03:39초기 학습에서 로봇들은 무작위로 움직이며 정면 공격을 많이 했습니다. 이후 로봇들은 상대의 뒤를 잡는 데는 성공했지만, 명확한 사격 각도가 아닐 때 무기를 쓰면 감점된다는 것을 알게 되면서 좁은 영역에서 뱅뱅 도는 상태에 빠졌습니다. 실제로 싸우기보다 무기를 쓰지 않고 중앙에 머무는 편이 더 많은 보상을 얻는 구조였기 때문입니다.

영상 장면 03:39
▶ 03:39 영상에서 보기

가중치를 바꾸고 다시 학습했지만 25,000번 경기 뒤에도 서로 정면으로 마주 본 채 갇히는 상황이 이어졌습니다. 그래서 시간 초과에 페널티를 주고 중앙 이탈 페널티를 줄여 경기장을 더 넓게 쓰도록 조정했습니다.

⏱ 04:574. 난이도 조절과 학습 결과

⏱ 04:57측면 공격이 어렵고 무기끼리 계속 부딪히는 문제를 해결하려고 측면과 후면 공격의 보상을 높이고, 확실한 사격 기회 없이 무기를 쓰면 더 큰 페널티를 주었습니다. 또한 로봇마다 속도를 다르게 설정해 다양한 전략을 시도하도록 무작위성을 추가했습니다.

영상 장면 04:57
▶ 04:57 영상에서 보기

한쪽이 빨라지자 상대가 공격을 덜 할 때 혼란을 느껴 경기장 밖으로 나가는 문제가 나타나 학습을 더 많이 진행해야 했습니다. 78,000번 경기 후에는 경기장 전체를 활용하고 후면과 측면 공격이 늘었으며, 속도 차이가 있어도 안정적으로 싸우는 모습이 나타났습니다. 성능이 낮은 GTX 750 Ti 대신 CPU로 처리해 약 3일이 걸렸습니다.

⏱ 05:545. 옴니휠 로봇 하드웨어 구성

⏱ 05:54실제 로봇은 120도 간격으로 배치된 3개의 옴니휠을 사용하며, 브러시 모터에 약 20대 1 기어 헤드를 달았습니다. 모터와 바퀴 사이에는 베벨 기어 세트를 넣어 동력 방향을 꺾었고, 기어 허브는 키와 나사로 축에 고정해 헛도는 것을 막았습니다. 기어 허브 일부는 3D 프린팅 대신 CNC로 가공한 알루미늄으로 만들어 키가 플라스틱을 뚫고 지나가는 문제를 줄였습니다.

영상 장면 05:54
▶ 05:54 영상에서 보기

진공청소기 내부의 펌프와 전원 코드는 제거했고, 6S LiPo 배터리와 저전압용 배터리, Arduino Due, 전원 분배 보드, 모터 드라이버 세 개를 배치했습니다. 차축은 베어링과 T-너트로 2020 알루미늄 프로파일에 고정했습니다.

⏱ 12:126. 무선 제어와 절대 위치 추적

⏱ 12:12PC의 게임은 USB 직렬 포트로 Arduino에 명령을 보내고, Arduino가 ELRS 무선 링크로 각 로봇에 전달합니다. ELRS는 2.4GHz 대신 868MHz 대역을 사용해 사람이 많은 행사장에서 와이파이와의 혼선을 줄이려는 선택입니다.

영상 장면 12:12
▶ 12:12 영상에서 보기

휠 슬립과 충돌이 잦아 바퀴 엔코더만으로는 위치 오차가 커지므로, HTC Vive 트래커와 라이트하우스를 이용해 절대 위치를 추적했습니다. libsurvive로 데이터를 받아 ROS 변환으로 게시하면 실제 로봇과 게임 속 디지털 트윈이 동기화되어, 로봇을 밀거나 들어 올려도 게임 상태가 맞춰집니다.

⏱ 17:047. 시뮬레이션과 실제 로봇의 차이 보정

⏱ 17:04훈련된 신경망으로 실제 로봇을 제어하자 로봇들이 제자리에서 앞뒤로 진동하며 계속 회전하는 문제가 나타났습니다. 원인은 실제 로봇이 최대 속도로 회전할 때 시뮬레이션보다 약 세 배 빠르게 돌아 목표 각도를 지나쳤기 때문입니다.

영상 장면 17:04
▶ 17:04 영상에서 보기

회전 속도 출력을 조절하자 시뮬레이션과 거의 같은 동작을 보였고, 처음부터 다시 학습하지 않아도 충분히 플레이 가능한 수준이 되었습니다. 무기 시스템은 아직 빠져 있는데, 머리 쪽 망치는 로봇끼리 엉킬 가능성이 커서 비효율적이라고 설명합니다. 무기 메커니즘을 로봇 머리 안에 넣으려는 계획이 소개되는 지점에서 내용이 끝납니다.

난이도 응용#강화학습#배틀봇#PyTorch#ROS#로봇제어

← 목록으로
공유페이스북밴드

이 글에 대해 요청(숨김) 수정 요청