1. 개요
AirSim을 위한 Unity 프로젝트를 scratch로부터 만들어 보기로 했다, 전체 AirSim의 구성을 익히기 위함이지 별 의미는 없다. 만일 자신의 환경에서 AirSim을 실행하고 싶다면 기존 예시 프로젝트를 그냥 수정해서 쓰는 편이 훨씬 좋다. 그냥 배워가면서 이해하면서 만든 프로젝트이다.
2. 프로젝트 생성
3. Scene 만들기
어셋을 다운 받고 편의상 Hierachy에 Environments(Empty GameObject at (0,0,0))를 만들어 그 하위에 모두 종속시켰다. Environments의 스케일을 (2,2,2)로 변경하고 도시의 중심이 (0,0,0) 의 위치에 배치한다. 작업 중간에 자주 저장하도록 한다.
3. Car를 배치한다.
Empty GameObject Car를 (0,0,0) 위치에 만들고 매쉬를 그 밑에 배치한다. Scale은 (0.002, 0.002, 0.002)로 줄였다. 유니티에서 좌표 +1은 1미터를 의미함으로 환경이나 자동차를 이를 기준으로 작성하는 것이 편리하다.
4. AirSim 설치
Assets/Plugins 폴더를 만들고 AirSimWrapper.dll 파일을 복사해 준다. 또한 샘플 프로젝트 AirSim-master/Unity/UnityDemo/Assets 하단의 AirSimAssets 폴더 전부를 복사해 준다. UnityDemo 폴더 밑에 있는 settings.json 파일도 함께 복사해준다. 이것으로 기본 파일을 모두 복사해왔다.
5. AirSim 초기화 코드
아래의 그림과 같은 구조로 구성할 것이다.
Hierarchy 창에서 Empty GameObject를 추가하고 이름을 InitAirSim (이름은 특별 의미는 없다) 으로 한다. InitAirSim 에 InitiallizeAirSim 스크립트를 부착한다. InitiallizeAirSim.cs 파일의 GetAirSimSettingsFileName()함수에 settings.json 파일을 읽어오는 코드가 있으며 이의 위치에 settings.json파일이 실제 있는지 확인한다. 다음, Vehicle.cs 파일의 Start() 함수에 아래 코드를 넣어주자. 예제 프로젝트에서는 SimModeSelector Scene에서 이를 실행하고 CarDemo Scene으로 이동한다.
AirSimSettings.GetSettings().SimMode = "Car";
AirSimManager 객체에는 AirSimTick과 AirSimServer 스크립트를 붙여준다. 파이썬 등 외부 프로그램과 통신한다. AirSimGlobal 객체에는 AirSimGlobal과 Weather 스크립트를 붙여준다. 스크립트 내부적으로 연결괴어 있어서 붙여주어야 한다.
6. Car 설정
Car에는 기본적으로 필요한 설정 등이 많이 필요하다. 그러므로 예제 프로젝트의 Car를 이용하는 것이 제일 편할 것이다. 만일 직접 해본다면 아래와 같은 구조로 만들어 준다. Empty Game Object 4개를 Car 아래에 (0,0,0) 위치에 만들고 이름을 각각 LookAt, ViewCameras,CaptureCameras,Coliders라고 한다. 이름은 중요하지 않다. LookAt 은 MainCamera가 이 객체를 추적하면서 따라 다니도록 할 때 필요하고, ViewCameras는 실행화면에서 1,2,3을 눌렀을 때 Depth View, Segmentation View, Scene View를 보여주기 위함이다. CaptureCameras는 Rec 버튼을 클릭하면 화면을 기록하는 카메라의 설정이다. Colliders는 AirSimCarControllers.cs 스크립트 설정에 필요한 Colider를 만들기 위함이다. 또한 아래 그림과 같은 계층구조의 Empty Game Object (0,0,0) 를 만들어 주자.
Car의 AirSimCarControllers.cs 스크립트에서는 모든 타이어에 WheelColider를 필요로하며 GameObject로 만들어져야 이를 인스펙터 창에서 끌어다 설정할 수 있다. 그러므로 GameObject를 만들어 Wheel Collider를 만들어주고 각각의 자동차 바퀴 위치에 설정한다.
Car의 GameObject에는 아래와 같이 컴포넌트를 부착하고 설정한다.
Tag를 2개 추가한다. Tag의 이름은 스크립트에서 그대로 사용함으로 대소문자와 철자까지 똑같이 타이핑한다. 각각의 테그를 Car/CaptureCameras와 Car/ViewCameras 객체에 부착하며 그 하위 객체에는 부착하지 않는다. 스크립트에서 Tag를 이용하여 그 child 들을 리스트로 만들어 억세스한다.
ViewCameras01,ViewCameras02,ViewCameras03 객체는 Camera 객체로 다음과 같이 설정하자. Camera의 Target Texture로 Window1RenderTecture, Window2RenderTecture, Window3RenderTecture를 설정하고 CameraFilter Script 에서 각각 Depth Vis, Segmentation, Scene을 설정한다.
7. AirSimHUD 설정
AirSimHUD객체 아래에 아래와 같이 UI > Panel 을 붙이고 이름을 Window1, Window2, Window3로 변경하고 기본 설정인 Image 컴포넌트를 Raw Image로 바꾸어준다. 위치와 크기는 화면 하단에 적절히 배치한다. 설명이 구구하여 그림으로 대치한다.
8. MainCamera 설정
MainCamera는 카메라 객체로 SmoothFollow 스크립트를 부착하며 Target에는 Car/LookAt 객체를 드래그로 설정한다.
9. Recoding 버튼 추가하기
DataCaptureScript에 다음 코드를 삽입하여 간단히 구현한다.
void OnGUI()
{ string msg="";
if (!isCapturing) msg = "Start Recoding";
else msg = "Stop Recoding";
if (GUI.Button(new Rect(50, 100, 100, 60), msg))
{
ToggleRecording();
}
}
10. 실행하기 및 작성후기
프로젝트가 무겁고 자주 다운되는 경우가 많다. 그러므로 중간중간 저장을 하여야 한다. 전체적으로 이해하는데 목적이 있었음므로 작업을 한것이지만, 이글을 정리하면서 이일을 왜하고 있지? 하는 회의감도 있었다. 어째든 꾸역꾸역 마무리하였다. 파이썬 예제 hello_car.py와 연동도 성공하였으니 완벽하지는 않지만 나름 성공이라 본다.