IL2CPP(C++로 변환하는 중간 언어)는 Unity에서 개발한 스크립팅 백엔드로, 여러 플랫폼용 프로젝트를 빌드할 때 Mono 대신 사용할 수 있습니다. IL2CPP를 사용하여 프로젝트를 빌드할 때 Unity가 스크립트와 어셈블리의 IL 코드를 C++ 코드로 변환한 후에 선택한 플랫폼에 적합한 네이티브 바이너리 파일(예: .exe, apk, .xap)을 만듭니다. IL2CPP는 Unity 프로젝트의 성능, 보안 및 플랫폼 호환성을 개선하는 등의 용도로 사용됩니다.
IL(Intermediate Language)코드를 c++형태로 변환 하는 프로그램
AOT(Ahead Of Time) : 실행 시간 이전에 이루어진 컴파일 컴파일 타임에 중간 언어로 번역한다음 중간언어를 기계어로 번역 한다.
JIT(Just-In-Time) 컴파일러 : 실행 시간 이전에 컴파일한 내용을 가상 머신 코드(IL Code)로 저장해놓고 컴포넌트 사용시 가상 머신 코드를 기계어로 바꾸어 명령어가 실행되도록 한다.
IOS는 LLVM을 지원하는데 LLVM은 JIT컴파일러를 지원하지 않기 때문에 IOS에서 JIT컴파일러대신 AOT 컴파일러 방식을 도입
AOT 컴파일러가 컴파일 시간에 중간 언어로 번역하고 LLVM이 중간 언어를 네이티브 코드 (CPU나 OS가 직업 실행할수 있는 코드, ex: 기계어)로 만들어 낸다.
NDK(Native Development Kit)는 Android에서 C 및 C++ 코드를 사용할 수 있게 해주는 일련의 도구 모음으로, 네이티브 액티비티를 관리하고 센서 및 터치 입력과 같은 물리적 기기 구성요소에 액세스하는 데 사용할 수 있는 플랫폼 라이브러리를 제공합니다.
I'm trying to figure out how to run the training from a Unity Process instead of doing by hand in the command line. I tried to executepython ml-agents\mlagents\trainers\learn.pybut I get the following errors:No module named 'docopt'. I also tried to execute a batch file containingactivate ml-agentsand thenmlagents-learn config.yaml --train --run-id=xxxbut that won't work either (everything that comes afteractivatein the .bat file is ignored).
Someone is doing that with ml-agents 0.3here, so I assume it is possible, but he folder structure has changed in 0.5 and I can't figure out how to do that with Conda.
(replying to myself after finding a solution) The trick was actually to do (in a batch file): call C:\Users\username\Anaconda3\Scripts\activate.bat C:\Users\username\Anaconda3 call mlagents-learn config.yaml --train --run-id=xxx
1. Unity Project 창에서 RollerAgent 스크립트를 두 번 클릭하여 코드 편집기에서 엽니 다.
2. 편집기에서 MLAgents를 추가합니다. 기본 클래스를 MonoBehaviour에서 Agent로 변경하십시오.
3. Update () 메서드를 삭제하지만 Start () 함수를 사용하므로 지금 당장 그대로 두십시오.
지금까지는 Unity 프로젝트에 ML-Agents를 추가하기 위해 사용하는 기본 단계입니다.
다음으로, 에이전트가 보강 학습을 사용하여 큐브에 롤백하는 법을 배울 수있는 논리를 추가합니다
이 간단한 시나리오에서 우리는 아카데미 객체를 사용하여 환경을 제어하지 않습니다.
예를 들어 시뮬레이션 전이나 시뮬레이션 중에 바닥의 크기를 변경하거나 에이전트 나 다른 객체를 추가 또는 제거하는 등 환경을 변경하려는 경우 아카데미에서 적절한 방법을 구현할 수 있습니다.
대신, 우리는 에이전트가 성공하거나 실패 할 때 자신과 대상을 다시 설정하는 모든 작업을 수행하게 할 것입니다
Initialization and Resetting the Agent
에이전트가 목표에 도달하면 에이전트는 완료되었음을 표시하고 에이전트 재설정 기능은 대상을 임의의 위치로 이동시킵니다.
또한 에이전트가 플랫폼에서 벗어나면 재설정 기능을 통해 플랫폼에 다시 넣습니다.
대상 GameObject를 이동하려면 Transform (3D 세계에서 GameObject의 위치, 방향 및 축척을 저장함)에 대한 참조가 필요합니다.
이 참조를 얻으려면 Transform 유형의 공용 필드를 RollerAgent 클래스에 추가하십시오.
Unity의 구성 요소 공개 필드는 Inspector 창에 표시되므로 Unity Editor에서 대상으로 사용할 GameObject를 선택할 수 있습니다.
에이전트의 속도를 재설정하려면 (나중에 에이전트 강제 이동을 적용하려면) Rigidbody 구성 요소에 대한 참조가 필요합니다. 리지드 바디
리지드 바디 (Rigidbody)는 물리학 시뮬레이션을위한 Unity의 주요 요소입니다. Unity 물리학의 전체 문서는 물리학을 참조하십시오.
Rigidbody 구성 요소가 에이전트 스크립트와 동일한 GameObject에 있기 때문에이 참조를 얻는 가장 좋은 방법은 GameObject.GetComponent <T> ()를 사용하는 것입니다.이 스크립트는 스크립트의 Start () 메소드에서 호출 할 수 있습니다.
지금까지 RollerAgent 스크립트는 다음과 같습니다.
다음으로 Agent.CollectObservations () 메소드를 구현해 보겠습니다.
Observing the Environment
에이전트는 우리가 수집 한 정보를 두뇌에 보내고,이 정보를 사용하여 결정을 내립니다.
에이전트를 훈련 시키거나 (훈련 된 모델을 사용할 때), 데이터는 특징 벡터로서 신경망에 공급됩니다.
에이전트가 작업을 성공적으로 배우려면 정확한 정보를 제공해야합니다.
수집 할 정보를 결정하는 좋은 방법은 문제에 대한 분석 솔루션을 계산하는 데 필요한 것이 무엇인지 고려하는 것입니다.
우리의 경우 에이전트가 수집하는 정보에는 다음이 포함됩니다.
타겟의 위치
AddVectorObs(Target.position);
Agent 자신의 위치
AddVectorObs(this.transform.position);
에이전트 속도. 이렇게하면 에이전트가 속도를 제어하여 타겟을 오버 슛하고 플랫폼에서 벗어날 수 있습니다.