MoonLander 환경은 Gym 스타일 `reset`과 `step`을 직접 구현해 물리, 관측, 행동과 보상의 관계를 한 파일에서 볼 수 있게 한다. Box2D에 숨기지 않고 2D 힘과 토크를 계산하므로 강화학습 환경 설계 연습에 적합하다.

문랜딩 커스텀 환경: 2D 물리와 16가지 분사 행동 핵심 도식
그림. 분사기 비트 조합에서 힘과 회전을 계산하고 안전 착륙 조건을 보상으로 표현한다.

7차원 관측

관측은 목표 중심 기준 x, 고도 y, 수평·수직 속도, 기울기, 각속도와 남은 연료를 정규화한 값이다. 초기 위치와 속도는 일정 범위에서 무작위로 뽑아 한 궤적만 외우지 않게 한다.

16가지 행동

하부 주 엔진, 상부 RCS, 좌·우 RCS의 ON/OFF를 4비트로 표현한다. 따라서 행동은 0부터 15까지다. 각 분사기의 body 좌표와 방향을 world 좌표로 회전하고 힘 합과 `r × F` 토크를 계산한다. 연료가 부족한 분사기는 켜지지 않는다.

보상 shaping

목표까지 거리, 자세, 속도와 각속도의 가중합을 potential로 만들고 이전 step과 현재 step의 차이를 보상으로 준다. 활성 분사기 수에는 작은 비용이 붙는다. shaping의 절대값이 아니라 차분을 쓰면 목표에 가까워진 변화가 직접 신호가 된다.

종료 조건

목표 구역, 낮은 수평·수직 속도, 수직 자세와 작은 각속도를 모두 만족하면 착륙이다. 정밀도와 남은 연료 보너스가 추가된다. 그 외 지면 접촉은 추락, 화면 이탈과 시간 초과도 별도 종료한다.

검증 방법

무작위 정책, 주 엔진만 쓰는 규칙 정책과 학습 정책을 같은 seed에서 비교한다. 착륙률만 아니라 충돌 이유, 연료, 최종 속도와 자세 분포를 기록한다.

관련 소스

  • `lander_env.py`: 상태, 물리, 보상과 종료
  • `dqn_agent.py`: DQN
  • `train.py`: 학습 loop
  • 렌더러: 물리 상태를 화면에 표시