Skip to main content
Summary

강화학습을 처음 로봇팔에 적용할 때 가장 좋은 출발점은 거창한 작업이 아니다. 컵을 집거나 문을 열기 전에, 먼저 로봇팔 끝이 원하는 위치까지 안정적으로 이동할 수 있어야 한다. 이것이 목표 도달 문제다.

목표 도달은 단순해 보이지만 강화학습 기반 로봇 제어의 거의 모든 요소를 담고 있다. 환경을 만들고, 상태를 정의하고, 행동을 선택하고, 보상을 설계하고, 학습된 정책을 평가해야 한다. 로봇팔이 목표점에 가까워질수록 보상을 받고, 충돌하거나 이상한 자세를 만들면 벌점을 받는다. 이 작은 문제를 제대로 구성해 보면 이후의 집기, 놓기, 밀기, 조립 작업도 같은 구조 위에서 확장할 수 있다.

이번 장에서는 시뮬레이터 안에 로봇팔과 목표 지점을 배치하고, 강화학습 에이전트가 목표 위치까지 엔드 이펙터를 이동시키도록 학습시키는 과정을 차근차근 설계한다.

로봇팔 목표 도달 학습

목표 도달 문제란 무엇인가

로봇팔의 끝부분, 즉 엔드 이펙터가 있다. 집기 작업에서는 보통 그리퍼의 중심점이 엔드 이펙터 역할을 한다. 목표 도달 문제는 이 엔드 이펙터를 공간상의 특정 위치로 이동시키는 문제다.

예를 들어 시뮬레이터의 테이블 위에 작은 빨간 구가 하나 떠 있다고 해 보자. 이 구는 실제 물체가 아니라 목표 지점을 표시하는 마커다. 로봇팔은 이 구를 잡을 필요가 없다. 그리퍼 중심을 빨간 구 근처까지 가져가면 성공이다.

이 문제는 다음과 같이 표현할 수 있다.

현재 엔드 이펙터 위치가 ee_pos이고 목표 위치가 target_pos라면, 로봇의 목표는 두 점 사이의 거리 distance = ||target_pos - ee_pos||를 줄이는 것이다. 거리가 충분히 작아지면 성공으로 판단한다.

단순히 한 점에 도달하는 문제라고 해서 만만하게 보면 안 된다. 로봇팔은 여러 관절로 이루어져 있고, 같은 목표 위치에 도달하는 자세가 여러 개 존재할 수 있다. 어떤 자세는 자연스럽고 안전하지만, 어떤 자세는 관절 한계에 가깝거나 주변 물체와 충돌할 수 있다. 강화학습은 이런 선택을 반복 경험을 통해 배운다.

목표 도달 정책은 이후 다음과 같은 고수준 스킬의 재료가 된다.

  • reach_to_pregrasp: 물체를 집기 전 접근 위치까지 이동한다.

  • reach_to_place: 물체를 놓을 위치 위로 이동한다.

  • recover_to_safe_pose: 실패 후 안전한 자세로 돌아간다.

  • align_with_target: 그리퍼 방향을 목표 물체에 맞춘다.

즉 목표 도달은 로봇팔 학습의 알파벳 같은 단계다. 여기서 로봇이 공간을 어떻게 움직이는지 배우면, 다음 작업들은 이 움직임 위에 조건과 목적을 하나씩 얹는 방식으로 확장된다.

학습 환경 만들기

강화학습 환경은 에이전트가 행동하고 결과를 관찰하는 연습장이다. 로봇팔 목표 도달 환경에는 최소한 로봇팔, 목표 지점, 작업 공간, 충돌 조건, 시간 제한이 필요하다.

시뮬레이터에서 하나의 에피소드는 이렇게 진행된다. 먼저 로봇팔을 초기 자세로 놓는다. 그다음 목표 지점을 작업 공간 안의 무작위 위치에 배치한다. 에이전트는 현재 상태를 보고 행동을 선택한다. 환경은 그 행동을 로봇팔에 적용하고, 새로운 상태와 보상을 돌려준다. 목표에 도달하거나 시간이 다 되면 에피소드가 끝난다.

이 흐름은 사람의 연습과 비슷하다. 양궁 선수가 화살을 쏘고 과녁에서 얼마나 벗어났는지 확인한 뒤 다음 자세를 고치는 것처럼, 로봇팔도 움직이고, 목표와의 거리를 확인하고, 다음 행동을 바꾼다.

학습 환경을 만들 때 처음부터 복잡한 장면을 넣을 필요는 없다. 첫 실험은 최대한 단순해야 한다. 장애물 없이, 목표점도 로봇팔이 쉽게 닿을 수 있는 곳에 배치한다. 로봇이 기본적인 도달 행동을 배우면 목표 범위를 넓히고, 이후 장애물이나 자세 제약을 추가한다.

환경 구성 요소는 보통 다음과 같이 나눌 수 있다.

  • 로봇 모델: 관절 수, 링크 길이, 관절 한계, 엔드 이펙터 위치를 제공한다.

  • 목표 생성기: 매 에피소드마다 도달 가능한 목표 위치를 만든다.

  • 물리 엔진: 행동을 적용했을 때 로봇이 어떻게 움직이는지 계산한다.

  • 관찰 함수: 현재 로봇 상태와 목표 정보를 상태 벡터로 만든다.

  • 보상 함수: 목표에 가까워졌는지, 충돌했는지, 부드럽게 움직였는지 평가한다.

  • 종료 조건: 성공, 실패, 시간 초과를 판단한다.

중요한 원칙은 하나다. 에이전트가 배워야 할 문제만 남기고 나머지 불필요한 어려움은 줄여야 한다. 카메라 이미지, 물체 검출, 좌표 변환까지 한꺼번에 넣으면 학습이 실패했을 때 원인을 찾기 어렵다. 처음에는 목표 위치를 숫자로 직접 주고, 로봇팔이 그 위치까지 가는지부터 확인한다.

작업 공간과 목표 지점 배치

로봇팔은 모든 공간에 닿을 수 없다. 팔 길이보다 먼 곳은 당연히 닿을 수 없고, 너무 가까운 곳도 관절 구조 때문에 어려울 수 있다. 따라서 목표 지점은 로봇이 도달 가능한 작업 공간 안에서 생성해야 한다.

예를 들어 로봇 베이스를 기준으로 다음과 같은 범위를 정할 수 있다.

x: 0.25m ~ 0.55m
y: -0.25m ~ 0.25m
z: 0.15m ~ 0.45m

이 범위는 로봇 종류에 따라 달라진다. 작은 데스크톱 로봇팔이라면 훨씬 좁고, 산업용 6축 로봇팔이라면 더 넓다. 핵심은 학습 초기에 너무 어려운 목표를 주지 않는 것이다.

좋은 목표 생성기는 단계적으로 난이도를 올린다. 처음에는 초기 엔드 이펙터 위치 근처에 목표를 배치한다. 로봇이 가까운 목표를 잘 따라가면 목표 범위를 넓힌다. 이후 높낮이 변화, 좌우 변화, 더 먼 거리의 목표를 추가한다. 이런 방식을 커리큘럼 학습이라고 부른다. 학교에서 쉬운 문제부터 어려운 문제로 넘어가는 것과 같다.

목표 지점은 시각적으로도 표시해 두는 것이 좋다. 작은 구, 십자 마커, 투명한 큐브 등을 사용하면 학습 결과를 영상으로 확인하기 쉽다. 강화학습은 숫자 로그만 보면 답답할 때가 많다. 로봇팔이 실제로 어디를 향해 가는지 눈으로 확인하면 보상 설계의 문제를 훨씬 빨리 찾을 수 있다.

상태 정의하기

상태는 에이전트가 의사결정을 할 때 보는 정보다. 사람이라면 팔의 현재 자세, 손끝 위치, 목표 위치를 눈과 몸 감각으로 동시에 파악한다. 강화학습 에이전트에게도 비슷한 정보를 숫자로 제공해야 한다.

가장 기본적인 상태에는 관절 상태, 엔드 이펙터 위치, 목표 위치가 들어간다. 관절 상태는 각 관절의 현재 각도와 속도를 의미한다. 엔드 이펙터 위치는 로봇팔 끝이 현재 어디에 있는지 알려 준다. 목표 위치는 도달해야 할 지점이다. 여기에 목표와 엔드 이펙터 사이의 상대 벡터를 넣으면 학습이 더 쉬워진다.

상태 벡터는 예를 들어 다음과 같이 구성할 수 있다.

observation = [
  joint_positions,
  joint_velocities,
  end_effector_position,
  target_position,
  target_position - end_effector_position
]

6축 로봇팔이라면 joint_positions는 6개 값이고, joint_velocities도 6개 값이다. 위치는 보통 x, y, z 세 값으로 표현한다. 따라서 위 상태는 대략 6 + 6 + 3 + 3 + 3 = 21차원 벡터가 된다.

여기서 상대 벡터 target_position - end_effector_position는 매우 중요하다. 목표 위치와 현재 위치를 각각 따로 주어도 신경망은 둘의 차이를 학습할 수 있다. 하지만 처음부터 차이 정보를 제공하면 에이전트는 어느 방향으로 움직여야 하는지 더 쉽게 알아낸다. 마치 길을 물어보는 사람에게 현재 주소와 목적지 주소만 주는 것보다, '여기서 오른쪽으로 200미터'라고 알려 주는 편이 쉬운 것과 같다.

상태를 설계할 때는 정규화도 신경 써야 한다. 관절 각도는 라디안 단위로 -3.14에서 3.14 근처를 오갈 수 있고, 위치는 미터 단위로 0.1에서 1.0 사이일 수 있다. 속도 값은 더 크게 튈 수도 있다. 값의 범위가 너무 다르면 신경망 학습이 불안정해진다. 그래서 각 값을 적절한 범위로 나누어 대략 -1에서 1 사이가 되도록 맞추는 것이 좋다.

상태에 너무 많은 정보를 넣는 것도 문제다. 처음부터 카메라 이미지까지 넣으면 학습 난이도가 크게 올라간다. 이미지 기반 정책은 강력하지만 데이터가 훨씬 많이 필요하다. 목표 도달의 첫 버전에서는 저차원 상태, 즉 관절값과 위치값으로 시작하는 편이 좋다. 이후 비전 기반 로봇으로 확장할 때 카메라에서 추정한 목표 위치를 target_position으로 넣으면 된다.

행동 정의하기

행동은 에이전트가 환경에 내리는 명령이다. 로봇팔에서 행동을 어떻게 정의하느냐에 따라 학습 난이도와 안전성이 크게 달라진다.

가장 낮은 수준의 행동은 토크 명령이다. 각 관절 모터에 얼마만큼의 힘을 줄지 직접 정하는 방식이다. 물리적으로는 가장 자유도가 높지만, 초보 실험에는 어렵고 위험하다. 작은 실수로 로봇팔이 심하게 떨거나 관절 한계를 강하게 때릴 수 있다.

더 실용적인 방법은 관절 목표 변화량을 행동으로 사용하는 것이다. 현재 관절 각도에서 각 관절을 조금씩 얼마나 움직일지 에이전트가 정한다. 예를 들어 6축 로봇팔이라면 행동은 6차원 벡터가 된다.

action = [Δq1, Δq2, Δq3, Δq4, Δq5, Δq6]

이 행동을 그대로 크게 적용하면 위험하므로 스케일을 작게 둔다. 예를 들어 에이전트의 출력은 -1에서 1 사이로 제한하고, 실제 관절 변화량은 여기에 0.03 라디안 정도를 곱해 만든다.

next_joint_target = current_joint_position + action * 0.03

이렇게 하면 에이전트는 한 번에 큰 동작을 하지 못하고 조금씩 움직인다. 답답해 보일 수 있지만 학습 초기에는 안정성이 훨씬 중요하다. 로봇팔은 빠르게 움직이는 것보다 안전하고 예측 가능하게 움직이는 것이 먼저다.

다른 방법은 엔드 이펙터 이동량을 행동으로 사용하는 것이다. 이 경우 에이전트는 손끝을 x, y, z 방향으로 얼마나 움직일지 출력한다.

action = [Δx, Δy, Δz]

이 방식은 목표 도달 문제와 직관적으로 잘 맞는다. 목표가 오른쪽 위에 있으면 엔드 이펙터를 오른쪽 위로 움직이면 된다. 다만 실제 로봇팔은 엔드 이펙터 위치 명령을 관절 명령으로 바꾸는 역기구학 계산이 필요하다. 역기구학은 원하는 손끝 자세를 만들기 위해 각 관절 각도를 구하는 과정이다. 따라서 이 방식은 강화학습 정책과 기존 로봇 제어기를 함께 사용하는 구조에 가깝다.

처음 실험에서는 관절 목표 변화량 방식이 단순하다. 로봇팔의 관절 제어 인터페이스와 바로 연결할 수 있고, 역기구학 실패 문제도 피할 수 있다. 다만 정책이 학습해야 할 부담은 조금 더 커진다. 반대로 엔드 이펙터 이동량 방식은 행동이 직관적이지만 하위 제어기가 더 필요하다.

실전에서는 둘 중 하나가 무조건 정답은 아니다. 학습 목표와 시스템 구조에 맞춰 선택한다. 중요한 것은 행동을 반드시 제한하고, 로봇이 감당할 수 있는 속도와 범위 안에서만 움직이게 하는 것이다.

보상 설계하기

보상은 강화학습에서 가장 민감한 설계 요소다. 목표 도달 문제에서는 목표와의 거리를 줄이는 것이 핵심이므로 거리 기반 보상이 기본이 된다.

가장 단순한 보상은 현재 거리의 음수다.

reward = -distance

목표에 가까울수록 거리가 작아지고, 따라서 보상이 덜 나쁘다. 이 방식만으로도 로봇은 목표에 가까워지는 행동을 배울 수 있다. 하지만 실제 학습에서는 조금 더 섬세한 보상 조합이 도움이 된다.

보상은 다음 요소들을 함께 사용할 수 있다.

  • 거리 보상: 목표와 엔드 이펙터 사이의 거리가 작을수록 높은 보상을 준다.

  • 진행 보상: 이전 스텝보다 목표에 가까워졌다면 추가 보상을 준다.

  • 성공 보상: 목표 반경 안에 들어오면 큰 보너스를 준다.

  • 충돌 패널티: 로봇팔이 테이블, 장애물, 자기 자신과 충돌하면 큰 벌점을 준다.

  • 시간 패널티: 불필요하게 오래 걸리지 않도록 매 스텝 작은 벌점을 준다.

  • 부드러움 패널티: 행동 변화가 너무 크거나 떨림이 심하면 벌점을 준다.

예를 들어 다음과 같은 보상식을 사용할 수 있다.

reward = -1.0 * distance
reward += 2.0 * (previous_distance - distance)
reward -= 0.01

if distance < success_threshold:
    reward += 10.0

if collision:
    reward -= 5.0

reward -= 0.001 * action_magnitude

여기서 previous_distance - distance는 얼마나 가까워졌는지를 의미한다. 이전 거리보다 현재 거리가 작아졌다면 양수이고, 멀어졌다면 음수다. 이 항을 넣으면 에이전트는 최종 목표에 도달하지 못하더라도 '좋은 방향으로 움직이는 행동'을 조금씩 배울 수 있다.

성공 보상은 목표에 도달했을 때 주는 축하금 같은 역할을 한다. 다만 성공 보상이 너무 크고 나머지 보상이 약하면 에이전트는 대부분의 시간 동안 아무 힌트도 받지 못하다가 우연히 성공했을 때만 큰 신호를 받는다. 반대로 거리 보상만 있고 성공 보상이 없으면 목표 근처에서 정확히 멈추는 동기가 약할 수 있다. 그래서 거리 보상과 성공 보상을 함께 쓰는 편이 좋다.

충돌 패널티는 안전을 위한 신호다. 시뮬레이션에서는 충돌해도 망가지지 않지만, 실제 로봇에서는 이야기가 달라진다. 학습 단계부터 충돌을 싫어하는 정책을 만드는 것이 중요하다. 특히 다음 장에서 다룰 Sim2Real, 즉 시뮬레이션에서 배운 정책을 실제 로봇으로 옮기는 과정에서는 안전 보상이 매우 중요해진다.

종료 조건 설계하기

에피소드를 언제 끝낼지도 명확히 정해야 한다. 종료 조건이 없으면 로봇은 영원히 움직일 수 있고, 학습 데이터도 불필요하게 길어진다.

목표 도달 환경에서는 보통 다음과 같은 종료 조건을 둔다.

  • 성공 종료: 엔드 이펙터와 목표 사이의 거리가 기준값보다 작다.

  • 시간 초과 종료: 정해진 스텝 수 안에 목표에 도달하지 못했다.

  • 실패 종료: 충돌, 관절 한계 초과, 작업 공간 이탈이 발생했다.

성공 기준은 작업에 맞게 정한다. 예를 들어 목표 반경을 3cm로 둘 수 있다.

success_threshold = 0.03
success = distance < success_threshold

처음에는 성공 기준을 너무 엄격하게 잡지 않는 것이 좋다. 1mm 정확도를 요구하면 학습이 매우 어려워진다. 먼저 5cm, 그다음 3cm, 마지막으로 1cm처럼 점진적으로 줄이는 방식이 더 안정적이다.

시간 제한도 중요하다. 제한이 너무 짧으면 로봇이 충분히 움직여 보기도 전에 실패한다. 너무 길면 비효율적인 행동도 계속 허용된다. 예를 들어 제어 주기가 20Hz이고 에피소드 길이를 100스텝으로 두면 한 에피소드는 5초 정도가 된다. 목표 도달 실험에는 이 정도가 적당한 출발점이다.

종료 조건은 보상과 함께 정책의 성격을 만든다. 빠르게 도달하길 원한다면 시간 패널티와 시간 제한을 조금 강하게 둔다. 안전하게 도달하길 원한다면 충돌 종료와 충돌 패널티를 더 엄격히 둔다. 정밀도를 원한다면 성공 반경을 줄이고 목표 근처에서 속도를 낮추는 보상을 추가할 수 있다.

환경의 기본 구조

강화학습 환경은 보통 reset과 step이라는 두 함수로 생각하면 쉽다. reset은 새 에피소드를 시작하고 초기 상태를 돌려준다. step은 에이전트의 행동을 받아 환경을 한 번 진행한 뒤 다음 상태, 보상, 종료 여부를 돌려준다.

개념적으로는 다음 구조다.

reset:
  로봇팔을 초기 자세로 이동한다
  목표 위치를 샘플링한다
  이전 거리 값을 계산한다
  현재 상태를 반환한다

step(action):
  action을 안전 범위로 제한한다
  action을 관절 목표 또는 엔드 이펙터 목표로 변환한다
  시뮬레이터를 한 스텝 진행한다
  새로운 엔드 이펙터 위치를 계산한다
  목표와의 거리를 계산한다
  보상을 계산한다
  성공, 충돌, 시간 초과를 확인한다
  다음 상태, 보상, 종료 여부를 반환한다

이 구조가 중요한 이유는 강화학습 알고리즘이 환경의 내부 사정을 몰라도 되기 때문이다. PPO든 SAC든 알고리즘은 상태 → 행동 → 보상 → 다음 상태의 반복만 보면 된다. 물리 엔진이 무엇인지, 로봇팔 모델이 무엇인지, 목표가 어떻게 샘플링되는지는 환경 안에 숨겨져 있다.

이렇게 인터페이스를 분리하면 나중에 시뮬레이터를 바꾸거나 로봇 모델을 바꾸어도 학습 코드를 크게 수정하지 않아도 된다. 오늘은 간단한 6축 로봇팔로 학습하고, 내일은 다른 로봇팔을 넣어도 reset과 step의 입출력이 같다면 같은 알고리즘을 사용할 수 있다.

PPO로 학습하기

이전 장에서 살펴본 PPO는 정책을 조금씩 안정적으로 개선하는 방식이다. 목표 도달 문제에서는 좋은 기본 선택이다. 행동 공간이 연속적이고, 보상 신호가 비교적 부드러우며, 정책이 갑자기 망가지는 것을 피하고 싶기 때문이다.

PPO 학습은 대략 다음 순서로 진행된다. 먼저 현재 정책으로 여러 에피소드를 실행한다. 이때 상태, 행동, 보상, 다음 상태를 기록한다. 그런 다음 이 경험을 바탕으로 어떤 행동이 평균보다 좋았는지 계산하고, 좋은 행동이 더 자주 나오도록 정책을 업데이트한다. 업데이트 후 다시 환경에서 데이터를 모은다. 이 과정을 수천 번, 수만 번 반복한다.

학습 초반의 로봇팔은 거의 취한 문어처럼 움직일 수 있다. 목표와 반대로 가기도 하고, 관절을 이상하게 접기도 한다. 하지만 거리 보상과 진행 보상이 제대로 들어가 있다면 조금씩 목표 방향으로 움직이는 비율이 늘어난다. 어느 순간부터는 목표 근처까지 꽤 그럴듯하게 다가가고, 이후에는 더 빠르고 부드럽게 도달하는 방향으로 개선된다.

PPO를 사용할 때는 한 번에 너무 큰 행동을 허용하지 않는 것이 좋다. 정책 업데이트도, 로봇 행동도 모두 작은 변화에서 시작해야 한다. 학습률이 너무 크거나 행동 스케일이 너무 크면 로봇은 목표를 향해 가기보다 계속 튀는 움직임을 보일 수 있다.

실험을 시작할 때 확인할 값은 다음과 같다.

  • 평균 에피소드 보상이 시간이 지날수록 증가하는가.

  • 목표 도달 성공률이 무작위 정책보다 높아지는가.

  • 최종 거리가 점점 줄어드는가.

  • 충돌 횟수나 작업 공간 이탈이 감소하는가.

  • 영상으로 봤을 때 움직임이 덜 흔들리고 더 직접적인가.

숫자 하나만 보고 판단하면 위험하다. 평균 보상은 증가하는데 실제 영상에서는 로봇이 이상한 자세로 떨고 있을 수도 있다. 강화학습에서는 로그와 영상을 함께 보는 습관이 중요하다.

SAC로 학습하기

SAC는 탐험을 적극적으로 사용하는 알고리즘이다. 정책이 항상 하나의 정답 행동만 고집하지 않고, 어느 정도 무작위성을 유지하며 더 나은 행동을 찾아간다. 목표 도달 문제에서도 SAC는 좋은 선택이 될 수 있다.

SAC의 장점은 수집한 경험을 재사용할 수 있다는 점이다. PPO는 현재 정책으로 모은 데이터를 중심으로 업데이트하지만, SAC는 리플레이 버퍼에 쌓인 과거 경험을 여러 번 활용한다. 시뮬레이션 비용이 크거나 데이터 효율이 중요할 때 유리하다.

다만 SAC는 설정에 따라 움직임이 더 다양하게 나올 수 있다. 탐험이 충분히 줄어들지 않으면 목표 근처에서도 약간 흔들리는 행동이 계속될 수 있다. 이럴 때는 평가 모드에서 탐험 노이즈를 제거하고 정책의 평균 행동을 사용해 성능을 확인한다.

PPO와 SAC 중 어느 쪽이 항상 더 좋다고 말하기는 어렵다. PPO는 구현과 튜닝이 비교적 단순하고 안정적인 편이다. SAC는 데이터 효율이 좋고 연속 제어 문제에서 강력하지만, 리플레이 버퍼와 온도 파라미터 같은 요소를 이해해야 한다. 목표 도달 문제에서는 두 알고리즘을 모두 돌려 보고 성공률, 최종 거리, 움직임의 부드러움을 비교해 보는 것이 좋은 연습이다.

학습 결과 평가하기

학습이 끝났다고 해서 바로 성공이라고 볼 수는 없다. 훈련 중 보상이 높아졌더라도, 새로운 목표 위치에서 잘 동작하지 않으면 실제 스킬로 사용하기 어렵다. 따라서 학습에 사용하지 않은 목표 위치를 따로 샘플링해 평가해야 한다.

평가 지표는 여러 관점에서 봐야 한다.

  • 성공률: 전체 평가 에피소드 중 목표 반경 안에 도달한 비율이다.

  • 최종 거리: 에피소드가 끝났을 때 목표와 엔드 이펙터 사이의 거리다.

  • 도달 시간: 성공까지 걸린 스텝 수 또는 실제 시간이다.

  • 충돌 횟수: 테이블, 장애물, 자기 링크와 충돌한 횟수다.

  • 경로 길이: 엔드 이펙터가 이동한 전체 거리다.

  • 행동 크기: 관절 변화량이나 속도 명령의 평균 크기다.

  • 부드러움: 행동이 갑자기 바뀌는 정도를 측정한다.

성공률만 높고 충돌이 많다면 좋은 정책이 아니다. 최종 거리는 작지만 시간이 너무 오래 걸려도 실용성이 떨어진다. 움직임이 빠르지만 심하게 흔들리면 실제 로봇에 적용하기 어렵다. 로봇 제어에서는 성공, 안전, 효율, 부드러움이 함께 중요하다.

평가할 때는 난이도를 나누어 보는 것이 좋다. 가까운 목표, 먼 목표, 높은 목표, 낮은 목표, 작업 공간 가장자리 목표를 따로 평가한다. 평균 성공률이 90%라도 특정 영역에서 계속 실패한다면 그 영역의 데이터나 보상이 부족하다는 뜻이다.

영상 기록도 반드시 남기자. 실패한 에피소드 10개를 모아 보면 숫자 로그보다 많은 것을 알려 준다. 목표를 지나쳐 버리는지, 관절 한계에 걸리는지, 특정 방향으로는 잘 못 움직이는지, 목표 근처에서 떨리는지 확인할 수 있다. 보상 설계는 디버깅이고, 디버깅의 절반은 관찰이다.

자주 생기는 실패와 수정 방법

목표 도달 학습에서는 몇 가지 전형적인 실패가 자주 나타난다.

첫 번째는 로봇이 거의 움직이지 않는 경우다. 행동 스케일이 너무 작거나, 시간 패널티가 강해서 움직이는 것보다 가만히 있는 편이 낫다고 배웠을 수 있다. 이때는 행동 스케일을 조금 키우고, 목표에 가까워질 때 주는 진행 보상을 강화한다.

두 번째는 로봇이 목표 주변에서 계속 떨리는 경우다. 성공 반경 안에 들어온 뒤에도 에피소드가 끝나지 않거나, 부드러움 패널티가 약할 때 이런 현상이 생긴다. 목표에 도달하면 즉시 성공 종료를 하거나, 목표 근처에서 속도와 행동 크기를 줄이도록 보상을 조정한다.

세 번째는 로봇이 관절 한계 근처로 자주 가는 경우다. 목표 위치는 도달 가능하지만 특정 자세가 불안정할 수 있다. 관절 한계에 가까워질수록 작은 패널티를 주거나, 초기 목표 범위를 조금 줄여 학습을 안정화한다. 이후 점진적으로 범위를 넓히는 편이 좋다.

네 번째는 목표와 가까워지기는 하지만 충돌이 많은 경우다. 거리 보상이 충돌 패널티보다 너무 강하면 에이전트는 '부딪혀도 가까이 가면 된다'고 배운다. 이때는 충돌 패널티를 키우고, 충돌이 발생하면 에피소드를 바로 종료하는 것이 효과적이다.

다섯 번째는 훈련 목표에서는 잘하지만 새로운 목표에서는 실패하는 경우다. 목표 샘플링 범위가 너무 좁거나 특정 위치가 과도하게 많이 등장했을 가능성이 있다. 목표 위치를 더 다양하게 샘플링하고, 평가용 목표 집합을 따로 만들어 일반화 성능을 확인해야 한다.

실패는 나쁜 신호가 아니다. 실패는 환경 설계가 무엇을 가르치고 있는지 보여 주는 피드백이다. 강화학습에서 정책은 보상 함수의 말을 아주 충실히 따른다. 우리가 의도한 대로 움직이지 않는다면, 대개 보상이나 상태, 행동 정의 어딘가에서 다른 메시지를 보내고 있는 것이다.

난이도 높이기: 장애물과 자세 조건

기본 목표 도달이 안정적으로 학습되면 환경을 조금씩 복잡하게 만들 수 있다. 첫 번째 확장은 장애물이다. 목표까지 직선으로 가면 충돌하는 위치에 작은 박스나 원통을 놓는다. 이제 로봇은 단순히 목표에 가까워지는 것뿐 아니라 충돌을 피하는 경로를 찾아야 한다.

장애물을 추가할 때는 상태에도 장애물 정보를 넣어야 한다. 예를 들어 장애물의 위치와 크기, 또는 엔드 이펙터와 장애물 사이의 거리 정보를 제공할 수 있다. 카메라 기반 환경이라면 이미지나 포인트 클라우드를 사용할 수도 있지만, 처음에는 숫자 정보로 시작하는 것이 좋다.

두 번째 확장은 자세 조건이다. 집기 작업에서는 손끝 위치만 맞는다고 충분하지 않다. 그리퍼가 물체를 잡을 방향도 맞아야 한다. 따라서 목표를 위치뿐 아니라 방향까지 포함한 목표 자세로 바꿀 수 있다.

target_pose = [target_position, target_orientation]

이 경우 보상에는 위치 오차와 방향 오차가 함께 들어간다. 방향 오차는 쿼터니언이나 회전 행렬로 계산할 수 있지만, 처음에는 너무 깊게 들어갈 필요는 없다. 핵심은 '손끝이 목표 지점에 있을 뿐 아니라 올바른 방향을 향해야 한다'는 점이다.

세 번째 확장은 다단계 목표다. 하나의 목표점에 도달한 뒤 다음 목표점으로 이동하게 할 수 있다. 예를 들어 사각형 경로를 따라 네 개의 점을 순서대로 방문하게 만들면 정책은 단발성 도달보다 더 긴 시간의 제어를 배운다. 이런 구조는 이후 Pick and Place의 접근, 집기, 들어올리기, 이동, 내려놓기 단계와 자연스럽게 연결된다.

학습된 정책을 스킬로 감싸기

강화학습으로 학습한 정책은 그 자체로 완성된 로봇 에이전트가 아니다. 이 정책은 하나의 하위 스킬로 감싸야 한다. 예를 들어 reach_target(target_pos)라는 스킬을 만들고, 내부에서 학습된 정책을 호출해 엔드 이펙터를 목표 위치로 이동시킨다.

상위 시스템은 이 스킬의 내부 신경망 구조를 몰라도 된다. 상위 계획기는 목표 위치를 주고, 스킬은 성공 여부와 실행 결과를 반환한다.

reach_target 입력:
  target_position
  timeout
  safety_mode

reach_target 출력:
  success
  final_distance
  reason

이렇게 감싸면 이후 LLM 로봇 에이전트와 연결하기 쉬워진다. LLM은 '빨간 컵을 집어'라는 명령을 여러 단계로 나누고, 그중 접근 단계에서 reach_target 스킬을 호출할 수 있다. 중요한 점은 LLM이 관절 명령을 직접 만들지 않는다는 것이다. 낮은 수준의 제어는 학습된 정책이나 검증된 제어기가 담당하고, LLM은 목표와 순서를 정하는 쪽에 머문다.

스킬로 감쌀 때는 안전 필터도 함께 넣어야 한다. 정책이 출력한 행동을 그대로 로봇에 보내지 말고, 관절 한계, 속도 제한, 충돌 예측, 작업 공간 제한을 통과한 행동만 실행한다. 강화학습 정책은 똑똑한 조종사라기보다 많이 연습한 운전자에 가깝다. 도로의 가드레일과 제한속도 표지판은 여전히 필요하다.

이번 장의 정리

이번 장에서는 로봇팔이 목표 위치에 도달하도록 강화학습 환경을 설계하는 과정을 살펴보았다. 이 문제는 단순하지만 강화학습 기반 로봇 제어의 핵심 흐름을 모두 담고 있다.

시뮬레이터 안에 로봇팔과 목표 지점을 배치하고, 관절 상태와 엔드 이펙터 위치, 목표 위치를 상태로 구성했다. 행동은 관절 목표 변화량이나 엔드 이펙터 이동량으로 정의할 수 있으며, 처음에는 안전한 작은 변화량부터 시작하는 것이 좋다. 보상은 거리 보상, 진행 보상, 성공 보상, 충돌 패널티, 시간 패널티를 조합해 만든다. 학습 결과는 성공률 하나만 보지 말고 최종 거리, 도달 시간, 충돌 횟수, 움직임의 부드러움까지 함께 평가해야 한다.

목표 도달 정책은 이후 더 큰 로봇 작업의 부품이 된다. 물체를 집기 전 접근 위치로 이동하고, 놓을 위치까지 움직이고, 실패 후 안전 자세로 돌아오는 모든 과정에 목표 도달 능력이 숨어 있다.

하지만 아직 중요한 질문이 남아 있다. 시뮬레이터에서 잘 움직이는 정책이 실제 로봇에서도 그대로 잘 움직일까? 현실의 모터에는 오차가 있고, 카메라에는 노이즈가 있으며, 마찰과 무게중심은 시뮬레이터와 다르다. 다음 장에서는 이 간극을 다룬다. 시뮬레이션에서 배운 로봇 지능을 현실로 옮기는 과정, 바로 Sim2Real이다.

책 목록

AI 로봇 에이전트 만들기: 비전·로봇팔·학습·LLM으로 자연어 명령을 실행하는 로봇

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기