휴머노이드 로봇은 어떻게 축구를 할까? - RoboCup 코드 해부

RoboCup 2026 인천: 휴머노이드 축구 전략 파헤치기

이 글은 RoboCup 휴머노이드 축구에 사용되는 실제 팀 코드 구조를 분석하여,
역할 분배를 어떻게 설계하느냐에 따라 전체 시스템이 어떻게 달라지는지를 비교합니다.

ROS를 조금이라도 사용해봤거나, 로봇 축구 / 자율 로봇 팀플레이에 관심 있는 학부생이라면 각 팀이 어떤 설계 선택을 했는지 이해하는 데 도움이 될 것입니다.

올해 6월 30일부터 7월 6일까지 인천 송도 컨벤시아에서 RoboCup 2026 World Championship이 개최됩니다.

그 중 휴머노이드 로봇으로 축구 게임을 하는 soccer 대회가 가장 많은 관심을 받고 있습니다.

왜 로봇 축구인가?

로봇 축구는 종합적인 기술의 집약체입니다.

  • 컴퓨터 비전: 공과 골대를 실시간으로 인식
  • 로컬라이제이션: 필드 위 자신의 위치를 파악
  • 멀티 에이전트 협력: 팀 내 로봇들이 팀플레이
  • 실시간 의사 결정: 빠른 시간 내에 패스/슛 판단
  • 모션 제어: 넘어지지 않고 빠르게 이동

로보컵 휴머노이드 축구 경기 규칙은 아래와 같습니다.

로보컵 휴머노이드 리그 경기 규칙

경기 진행

  • 경기 상태: INITIAL → READY → SET → PLAYING → FINISHED
  • 각 팀 최대 5명의 로봇 선수 (Kid size 5명, Teen/Adult size 4명)
  • 실시간으로 Game Controller와 통신하여 경기 상태 수신
  • 로봇은 주기적으로 “살아있음(ALIVE)” 신호를 보내야 함

페널티 규칙

  • 불법 공 조작 (Ball Manipulation)
  • 물리적 접촉 (Physical Contact/Pushing)
  • 불법 공격/수비 (Illegal Attack/Defense)
  • 필드 이탈 (Leaving the Field)
  • 비활성 플레이어 (Kid size 30초, Teen/Adult size 45초 이상 미동)

특수 상황

  • 프리킥 (Free Kick): 상대의 반칙 시 공격 기회
  • 코너킥 (Corner Kick): 수비측이 공을 골 라인 밖으로 보냈을 때
  • 골킥 (Goal Kick): 공격측이 공을 골 라인 밖으로 보냈을 때
  • 이 외 Throw-in, Penalty Kick, Drop Ball 등이 있음

로보컵 축구는 자율 로봇들이 인간의 개입 없이 스스로 판단하여 경기를 진행합니다. 그렇기 때문에 여러 기업과 학교에서 휴머노이드 로봇 축구 대회에 참가하며, 다양한 알고리즘을 만들어냅니다.

오늘은 그 중, hightorque roboticsbooster robotics에서 만든 코드를 비교하겠습니다.

간단히 표로 비교하면 아래와 같습니다.


hightorque robotics 사 로봇 축구 코드 정리

각 플레이어의 정보에서 공의 거리, 시야 정보 계산 → 가장 가까이, 오랫동안 공을 본 플레이어가 kicker가 되는 구조로 이루어집니다.

같은 팀 내 여러 로봇 간 통신은 아래 그림과 같이 이루어집니다.

각각의 로봇이 서로에게 플레이어 아이디, 역할, 생존 여부, 공을 검출 했는지의 여부와 의치 등의 정보를 전달합니다.

그러면 로봇들은 자신 팀원들의 정보를 알게 되고, 그 정보들을 바탕으로 blackboard.py에서 kicker를 선정합니다.

특정 시점에서 공유하는 정보가 수렴하기 때문에 중앙 서버 없이도 각각의 계산 결과는 동일하게 수렴합니다.

dbehavior (dblackboard.py)

주요 기능:

  • update_vision_info: 공/로봇 기준 공간좌표 기준 공 좌표 등을 yaml 파싱 방법으로 blackboard에 입력합니다.
  • reload_parameters: 파라미터를 업데이트합니다. (blackboard 내에서 데이터 업데이트 시 사용됨)
  • update_team_info: 공격 방향을 확인하고 각 수행 플레이어를 업데이트합니다. 공을 보고 있는 플레이어의 위치를 계산하여 공과 가까운 위치에 있는 플레이어가 kicker가 되도록 합니다.

dvision

  • ball detector: HSV 색공간과 kalman filter로 공을 추적합니다.
  • line, corner detector: hough 변환으로 필드 라인을 인식하며, 이는 로봇이 어느 위치에 있는지 알 수 있도록 합니다.
  • AMCL: particle filter를 기반으로 로컬라이제이션을 수행합니다.

dplanner (motion_hub_communicator.cpp)

generate_velocity(현재 좌표, 목표 좌표)

  • 현재 위치와 목표 위치를 입력받습니다.
  • x,y 방향 좌표와 회전 각속도를 지정합니다.
  • 분리형 독립 루틴 간 오차 벡터를 계산합니다.
    • x 방향 속도 계산
    • y 방향 속도 계산
    • yaw 방향 각속도 계산

로봇들은 아래 표와 같이 행동 양식을 지정받아 움직입니다.


booster robotics 사 로봇 축구 코드 정리

HighTorque가 구조적 안정성과 예측 가능성을 중시했다면, Booster는 협력 효율과 전술 유연성을 우선한 구조를 선택했습니다.

각 플레이어의 정보에서 공의 위치, 주변 장애물을 기반으로 비용 계산 → 최저 비용을 가진 플레이어가 주도권을 가지는 구조로 설계되었습니다.

같은 팀 내 여러 로봇 간 통신은 아래 그림과 같이 이루어집니다.

각각의 로봇이 서로에게 플레이어 아이디, 역할, 생존 여부, 공을 검출 했는지의 여부와 의치 등의 정보를 전달합니다.

그러면 로봇들은 자신 팀원들의 정보를 알게 되고, 그 정보들을 바탕으로 brain.cpp에서 lead를 할 플레이어를 선정합니다.

특정 시점에서 공유하는 정보가 수렴하기 때문에 중앙 서버 없이도 각각의 계산 결과는 동일하게 수렴합니다.

brain (brain.cpp)

주요 기능:

  • handleCooperation: 팀원 간 협력 로직을 처리합니다.
    • updateCostToKick(): 각 플레이어가 공까지의 비용(거리, 각도, 장애물 고려) 계산을 수행합니다.
    • 공 정보 공유: 신뢰할 수 있는 팀원(3m 이상 떨어진)으로부터 공 위치를 수신합니다.
    • 역할 교체: 골키퍼가 골문에서 너무 멀 경우 자동으로 스트라이커로 전환되도록 합니다.
    • UDP 통신으로 팀원간의 상태를 주고받습니다.
  • tick: 메인 루프에서 Behavior Tree 실행과 로봇 상태를 업데이트합니다.
  • detectionsCallback: vision 노드로부터 공/로봇/골대 등의 검출 정보를 수신합니다.
  • odometerCallback: 로봇의 오도메트리(위치/속도) 정보를 업데이트합니다.

brain tree.cpp

Behavior Tree를 사용하여 로봇의 행동을 제어합니다.

  • 공이 보임 → 공의 방향으로 이동
  • 공이 보이지 않음 → 공을 보고 있는 로봇으로부터 공의 위치를 받음 → 공의 방향으로 이동
  • 공이 보이지 않음 → 공의 위치를 받지 못함 –> 정지

위와 같이 다양한 상황에서 행동 양식을 지정하여 흐름을 타며 진행됩니다.

Behavior Tree의 주요 요소들:

  • RobotFindBall: 로봇 본체를 회전시켜 공을 탐색하도록 합니다.
  • Chase: 킥 방향을 고려하여 목표 위치로 이동하도록 합니다. (장애물 회피 포함)
  • SimpleChase: 공을 향해 접근합니다.
  • Adjust: 킥 방향 정렬을 위해 공 주위를 원형으로 이동합니다.
  • Kick: 공 차기 동작을 수행합니다.
  • CalcKickDir: 킥 방향을 계산합니다. (shoot/cross/block 모드)
  • StrikerDecide: 스트라이커의 행동을 결정합니다. (find/chase/adjust/kick/assist)
  • GoalieDecide: 골키퍼의 행동을 결정합니다. (find/retreat/chase/kick/adjust)

핵심 차이점 정리

hightorque robotics의 강점 (거리/시야 기반 → 공을 가장 잘 보는 플레이어가 kicker)

  1. 모듈화된 구조: dvision, dbehavior, dplanner로 각 모듈이 명확하게 분리되어있어 유지보수가 용이합니다.
  2. 간결한 역할 분배: 공과의 거리와 시야 기반으로 단순하게 kicker를 선정합니다.
  3. 코드 변경 시 영향 범위 예측 가능: 코드 변경 시 영향 받는 부분을 파악하기 쉽습니다.

booster robotics의 강점 (비용 기반 → 공을 가장 효율적으로 제어할 수 있는 플레이어가 lead)

  1. 빠른 개발 속도: SDK+brain 만 수정하면 되어 초기 개발이 빠릅니다.
  2. 정교한 협력: 비용 함수로 장애물/각도까지 고려하여 최적으로 역할을 분배합니다.
  3. 즉각적인 로직 변경: Behavior Tree로 행동 패턴을 직관적으로 수정할 수 있습니다.

공통점

두 로봇사의 로봇은 서로의 정보를 보내고, 각자의 로봇 내부에서 리드를 하는 로봇을 결정합니다. 중앙의 서버를 거치지 않고 각 로봇 내부에서 로직을 연산한다는 점이 특이합니다.

로봇들은 같은 네트워크 환경에서 정보를 공유합니다. 이때 공유하는 정보에는 팀의 아이디와 플레이어의 아이디가 포함되어 있습니다.

팀의 아이디가 지정되어있기 때문에 무작위로 날아오는 정보들 속에서 자신의 팀원 정보만 선택할 수 있습니다.

아래 그림처럼 Broadcast는 한 로봇이 보낸 메시지를 같은 네트워크에 연결된 모든 로봇에게 한 번에 전달하는 방식으로, 중앙 서버 없이도 여러 로봇이 동시에 같은 정보를 공유할 수 있게 합니다. 이때 메시지에 team id가 포함되어 있기 때문에, 각 로봇은 수신한 메세지 중에서 자신의 팀원에 해당하는 정보만 식별하여 사용합니다.


마치며

이처럼 축구 공을 보고 상대방의 골대에 넣는 같은 동작이더라도 전략과 구현 방법이 다른 것을 확인하실 수 있습니다.

자세한 코드는 아래 링크를 통해 확인하실 수 있습니다.

HighTorque Robotics

Booster Robotics