본문 바로가기

Sim2Real/Acrobot

Simulation to Real. #5 [Acrobot-IsaacGym : Inverted Pendulum Balance]

728x90

# Intro 

Inverted Pendulum Balance

오늘은 드디어 Simulation 상에서 나의 Custom Model 자세 제어를 할 수 있게 됐다.
일전의 FrameWork를 정리한 경험과 다양한 분들의 의견을 수렴하고 논문들을 들춰본 결과

이런 좋은 결과가 일찍 나올 수 있던것 같다.


# Reward & Reset

일단 처음에는 있는 코드를 기반으로 FrameWork를 수정했다. 

아래는 기존에 있던 CartPole 코드의 Reward 부분이다.

그림 1. CartPole Reward

182번째 줄의 Reward는 자문해본 결과 

그림 2. NVIDIA Q&A

 

reward 선정 방식과 reset에 대해 설명을 해주었다. 간단하게 풀어서 말하면

 

1. reward 선정

reward의 선정 방식은 NVIDIA에서 임의로 짰다고 한다. 자세한 설명은 해주지 않고

보상 1에서 제어하고자 하는 요소들을 (-) 요소로 만들어서 조건을 만족하지 못하면

최대한 적은 보상을 주는 식으로 설계한 것이 보인다. 

 

2. reset

reset은 constraints를 정하고 정해진 범위를 초과하면 model이 초기화되고

reward를 강제로 -1, -2 로 변환한다.

 

정리하면, 내가 원하는 control에 맞게 보상 차감 요소를 설계해야 한다는 것이다.


# Idea

이제 내 모델이 왜 제대로 안 서있지? 가 해결 문제로 남아있게 된다.

 

설계 부터 파일 변환까지 어떤 부분에서 문제가 있는지 파악하는 것이 가장 중요하다고 생각했는데,

이 부분은 4족 보행 (Quadruped Robot)에서 경험해 보았다.

 

그리고 이번에는 Simulation상에서 Reward를 설계하는 방법

즉 Software적인 측면에서 문제를 해결해야 하는 경우가 나와서 굉장히 신이 났다.


1. CartPole Reward의 한계점.

 

일단 처음에는 위 그림 1. 의 방법 그대로 인용하여 Model Training을 시켰는데,

이건 뭐 예시를 들 것도 없이 시작과 동시에 아무런 움직임도 보이지 않는다.

이유는 단순했다.

그림 3. Inverted Pendulum의 목표

우리가 원하는 목표는 Link1과 Link2가 수직으로 서는 것이다, 즉 θ1 = ±π, θ2 = 0 이 만족 해야 한다는 뜻이다.

 

그림 1을 보면 CartPole에서는 단순하게 Pole_Ang * Pole_Ang로 구현했는데

이건 초기 위치(Init Position)가 위로 세운 상태로 학습 시켰기 때문에 모델이 시작과 동시에

reward가 괜찮은 지점을 찾아서 별다른 문제없이 0에 가까운 값을 찾을 수 있던 것이다.

다른 말로는 모델이 탐험할 필요가 상대적으로 적다고 생각했다.

 

그림 4. CartPole의 초기 위치

내가 만든 Acrobot 역시 초기 아래로 쳐진 위치,  θ = 0으로 시작한다.

하지만 내 모델은 반대 방향으로 수직이 돼야 하므로 위의 방식을 사용했다가는 제대로 된 학습을 하지 않고

꼼수를 부려서, reward만 챙겨가는 식으로 설계가 이뤄졌던 것이다.

 

우리가 원하는 방향은 충분한 탐험 끝에 Desired Position을 찾아가는 것이므로

그림 1. 의 보상 설계 방식은 탐험하지 못하고 갇히는 task로 진행되는 것이었다.


Solution 1 - Radian (실패)

 

처음엔 그냥 radian값들을 바탕으로 보상을 설계해보려 했다. 

단순하게 θ1 = ±π, θ2 = 0 이 되게 범위로 설정해 보았는데, 이렇게 하면 θ2가 조금만 움직여도 

reward가 -1 이 되는 문제가 생겨서, swing을 하지 못하는 문제점이 발생했다. 

그리고 radian으로 보상을 설계하면, 초기에 과도한 페널티가 적용돼서 모델이 갇히는 경우가 허다했다.

 

모델이 2번 3번 회전하게 되면 radian은 3, 4, 5 점점 커져만 갔고 이렇게 되면 reward는 터무니없는 숫자로 깎여 나간다.

그림 5. 초기 아이디어

그래서 페널티로 주는 부분을 최대한 0 ~ 1 사이로 변환시키는 과정이 필요했고 이를 위해 삼각함수를 사용하기로 했다.

 

글이 길어지니까 바로 이어지는 다음 글에서 설명한다.