해당 글은 2021.07 ~ 2021.11 기간동안 여러 프로젝트를 진행하며 느낀 내용, 생각을 정리한 글입니다.
시뮬레이션 환경에서 설계, 제어를 검증할 수 있다면 얼마나 좋을까? 엄청난 시간, 비용이 단축되는 것은 물론이고 재연도 가능하며, 실제 시험장에서 실험이 불가능한 극한의 상황에서도 시뮬레이션이 가능할 것이다 (ex: 건물 붕괴, 비행기 추락) 따라서 해당 분야에 관심이 끌렸고 꾸준히 관련 연구 및 시뮬레이션을 진행하고 있다.
시뮬레이션의 시작 (Unity ML-Agents)
Unity는 ML-Agents 패키지를 제공하고 있다. 이는 패키지의 일환으로써 기존 Unity 환경, Asset Store를 사용할 수 있다는 특징을 가진다. 따라서 강화학습을 위한 환경 구현이 매우 쉽고, 기존 데스크톱 게임 엔진 -> 모바일 게임 엔진에 최적화 되어 오랜기간 사용된 만큼 환경 구현을 위한 C# 문법, 유니티 자체에 대한 정보도 많다.
유니티 ML-Agetns AI 엔지니어 부분 유일한 마스터님이 집필하신 책이 있다.
텐서플로와 유니티 ML-Agents로 배우는 강화학습
다른 책이 하나 더 있지만, 버전마다 바뀌는 내용이 많은 소프트웨어 특징 상 이 책으로 학습하는 것을 추천한다. 물론 현재 ML-Agents는 2.1.0버전까지 출시된 상태이고 위의 책은 0.8.1을 기준으로 작성되었다. 따라서 Academy 및 action과 관련된 코드 등 바뀐 부분이 많지만, 그럼에도 불구하고 베타 단계의 내용을 학습하면서 ML-Agents에 대한 기본기를 높일 수 있고, 이러한 기본기는 추후 자신만의 환경에서 강화학습을 진행할 때 많은 도움이 된다. 따라서 꼭 위의 책으로 학습을 진행하는 것을 권고한다. (2.0 버전의 새로운 책이 2022년 초에 발매될 예정으로 알고 있다)
ML-Agents로 진행한 프로젝트 Projects
![](https://blog.kakaocdn.net/dn/cE9HEl/btrFi95cJsp/gn1oGXcXQkon8YXDCj883k/img.png)
![](https://blog.kakaocdn.net/dn/bLl0YA/btrFlD45SoG/k6BuJyzDtdnTf1lAUXKqqk/img.png)
7월부터 8월까지 집중적으로 Unity의 기본개념, Unity ML-Agents에 대해 학습하였다. 이 후 8월 말 한국정보과학회 SWCC 2021에서 "Unity ML-Agents를 이용한 사거리 자율주행 환경 구현 및 컴포넌트 설계"를 주제로 발표하였다. 놀라운 성과를 담은 내용보다는, 새로운 환경을 만들고, 어떻게 적용하는지, 적용 과정에서 생긴 문제는 무엇인지를 중점으로 내가 학습한 내용을 나누었다.
개인적으로 확인하고 싶은 부분은 자율주행 시대에 주행론의 하나로 군집주행이 주목을 받기 시작하였는데, ML-Agents를 활용하여 군집주행보다 효율적인 방법이 있는지 찾고자 싶었고, 이를 진행하기 위해 자율주행 환경 시뮬레이션을 진행하였다. 학습을 진행하면서 얻은 고찰은 여기에서 확인할 수 있다. 개인적으로 부분적으로 완성된 프로젝트라고 생각하지는 않는다. 좌회전, 우회전, 덤프트럭, 버스와 같은 다양한 액션, 에이전트를 학습하는 것에 실패했다. 하지만 전반적인 개념을 학습 및 복습 그리고 내가 직접 구현한 환경에서 진행한 첫번째 프로젝트임에 큰 애착이 간다.
이 후 KAI 에서 매년 진행하는 논문경진대회에 UAV 시뮬레이션을 주제로 참가하고자 하였다. 여러 자료를 조사 했지만 그 중 유튜버 Jump Trjetory의 Realistic Aircraft Physics for Games 크게 참고하였고, 논문으로는 크게 2가지 Real-Time modeling of agile fixed-wing UAV aerodynamics와 Full configuration drag estimation of short-to-medium range fixed-wing UAVs and its impact on inital sizing optimization을 참고하였다.
기존 유튜버가 진행한 오픈소스(License : MIT)를 다운 받고 원작자의 동의를 구한 후 강화학습을 진행하고자 하였다. 하지만 해당 프로젝트는 실패로 끝났다. 그 이유는 다음과 같다.
이번 강화학습 프로젝트에서는 단순히 강화학습만 진행하고자 하는 것이 아닌 기존 코드를 4가지 물리학 부분에서 개선하고자 하였다.
첫째, 항력계수
정찰, 감시 목적으로 UAV에 부착되는 sensor의 경우 그 형상으로 인하여 항력을 증가시킨다. 따라서 이 부분에 관련한 항력계수를 논문을 참고하여 업데이트 후 진행하였다. 다만 이 부분을 진행할 때 광고로 인한 데이터의 과장, 대외비 정책으로 인하여 어쩔 수 없이 유사모델을 택하게 되었다.
둘째, 연료소비에 따른 중력 계산
연료를 소비함에 따라서 무게가 줄어들고, 무게가 달라진 UAV는 중력의 영향을 덜 받게 될 것이다. 이 부분또한 구현하고자 해 식을 써서 정리한 후 코드화하였다. 하지만, 소비되는 연료의 양은 시간에 비례하는 것이 아니다. 모터의 구동동력과 같이 점화시 더 많은 연료를 소비하게 되는데, 내가 진행하는 프로젝트에서는 이러한 데이터를 구할 수가 없었다. 따라서 초당 연료 소비량을 계산하였는데 여러 행동을 택하면서 학습하는 강화학습 특성 상 이는 초기부터 현실과 맞지 않는 환경에서 학습을 진행하는 것이기 떄문에 결과의 신뢰성을 떨어트리는 요소가 되었다.
셋째, 고도에 따른 밀도 계산
밀도를 계산하기 위해서 필요한 온도, 습도를 계산할 수가 없어서 NASA에서 기존에 관측한 raw 데이터를 구한 후 50unit 을 기준으로 모델링하였다. 그 후 엑셀의 함수식으로 변환기능을 사용하여 적용하였다.
넷째, 바람 구현
보퍼트 항력을 기준으로 구현하였고, Wind Zone을 생성하여 10초 주기로 변화되는 바람 영역을 구현하였다.
크게 첫째와 둘째 부분에서 유사모델 선택을 강제받았다. 따라서 시뮬레이션과 실제 환경의 차이가 발생하였고 이렇게 발생한 오차는 오차의 곱 적용에 의해 강화학습을 진행하던 중 더더욱 커져갔다.
단순 강화학습 적용에는 성공하였지만, 내가 확인하고 싶은 것은 비행기 강화학습뿐만 아니라 역학을 고려한 비행기 강화학습이였다. 이를 통해 단순 시뮬레이션과 역학을 고려한 시뮬레이션의 차이를 연구하고 싶었는데, 오차가 너무 커져서 해당 부분을 진행할 수 없었다. 결과적으로 해당 프로젝트는 추후에 연구실 또는 회사에 들어가서 관련 raw 데이터를 제공받기 전까지는 진행할 수 없다고 판단하였다. 하지만! UAV에 강화학습을 진행하고 연구하면서 Industry 산업 전반에 어떻게 강화학습을 적용할 수 있는지, 해당 역량에 대한 시야가 넓어지게 되었고 기본적인 유니티 구현 및 환경 설계에 대한 역량을 기를 수 있었다.
새로운 시뮬레이터 (Nvidia Omniverse Isaac Sim)
Unity를 어느정도 학습 후 Nvidia Isaac Sim이 눈에 들어왔다. 보다 높은 물리 성능을 탑재한 PhysX 5에 관심을 갖게 되었고 국방로봇경진대회, 대표학생으로 소속된 Mate 프로그램에서 사용하기 위해서 연구 및 학습을 진행중이다.
Nvidia Isaac Sim Projects
![](https://blog.kakaocdn.net/dn/ylCLu/btrFkZAzkla/agBdvwvUtGCukAvp1tIdM1/img.png)
![](https://blog.kakaocdn.net/dn/dFtuul/btrFjxLC7zB/jEKcxEZK99dtG3PXJCBEI0/img.png)
Unity를 어느정도 학습한 후, 시뮬레이션 프로그램에 대한 전반적인 이해를 넓히기 위해 경쟁사인 Nvidia의 Isaac Sim에 대해 학습하였다. 해당 프로그램은 Ubuntu 18.04만 지원한다는 점, 프로그램과 관련하여 ML-Agents의 민규식님 처럼 선구자 그리고 관련된 책이 없다는 점이 크게 발목을 잡았고 따라서 IsaacSim Docs와 Nvidia Forums을 중심으로 학습하였다. 실 학습 기간이 2~3달임에도 불구하고 많은 진행을 하지 못하였다. 리눅스 환경을 처음 다뤄보았기 때문에 모든 것이 낯설었고, 샘플로 학습하는데도 불구하고 유니티와는 다르게 정보도 너무 없고, 유기적으로 연결된 프로그램이 너무 많았다 (Isaac sim SDK, Nvidia Omniverse, Nvidia Omniverse View, Nvidia Omniverse View, Autocad 3ds Max 등등) 따라서 무엇을 하나 하고자 하면 관련된 프로그램 또한 다 학습해야 하였고, Nvidia Forum에 있는 많은 글을 읽었음에도, 2~3개월간 프로젝트를 많이 진척시키지 못하였다. 개인적으로 무른 마음이지만 누군가 앞서서 알려주는 사람이 있었다면...? 지금 내가 알고 있는 지식을 짧게는 2주 길게는 1달 이내에 학습할 수 있었다는 생각을 무수히 하였다. 이에 내가 그런 존재가 되고자 별도의 Sim2Real 칸을 블로그에 신설하였고 완전히 정리하여 글을 올리지는 않았지만 최소한 Sim2Real 어떻게 진행할 수 있을지에 대한 의견 및 아이디어를 나누기 위해 글을 작성하고 있다. (최종적으로 프로젝트가 완성될 시 모든 내용을 정리 후 공유할 예정)
Isaac Sim을 사용하면서 아쉬운 점은 다음과 같다.
유니티의 경우 모든 소스가 오픈되어 있고 Asset store의 존재로 인하여 금전적인 투자만 가능하다면 쉽게 프로젝트를 완성시킬 수 있다. 하지만 Isaac Sim을 그런 환경을 제공하고 있지 않다. 따라서 유저의 증가 폭이 빠르지 않다. 추가적으로 기존에 Isaac Sim SDK 에서는 유니티 시뮬레이션 환경을 지원했지만 2021.1.1버전 부터 더 이상 유니티를 지원하고 있지 않다. Raisim과 같은 프로그램, 모라이 등 스타트업에서도 유니티를 시뮬레이션 코어로 이용하고 있는데 이러한 Isaac Sim은 장기적으로 봤을 때 완전 독자적인 소프트웨어를 구상할 수 있겠지만, 지금 당장 사용하기에는 Asset 및 Sample 측면에서 엄청난 불이익을 갖는다. 물론 공식적으로 제공하는 Sample 및 Asset의 퀄리티가 매우 높지만, 학습을 위해서는 Qauilty뿐만 아니라 Quantity도 중요하기 때문에, 학습에 큰 어려움을 겪을 수 밖에 없었다. 추가적으로 프로그램을 사용하기 위한 컴퓨터의 성능도 매우 높은데, 연구실 컴퓨터 (2070 super)기준 빈 화면에서 프레임 120 방어가 안되고, 매우 간소화된 로봇을 불러왔음에도 불구하고 프레임60선을 방어하지 못한다. 이 뿐만 아니라 렉도 매우 심하고 프로그램이 꺼지는 현상, 프리징 현상 등등 너무 높은 최소사양으로 대부분의 컴퓨터에서 원활한 진행이 불가능하다.
What's Next
Isaac Sim을 어느정도 진행한 후로는 Unity Robotics 그리고 Raisim과 같은 유니티 기반 프로그램을 사용하고자 한다. 아직 Unity 시뮬레이션 환경을 벗어나는 것은 자료의 질과 양 측면에서 시기상조라 생각된다.
댓글