ARC eye VL SDK는 ARC eye Visual Localization (VL) API를 이용하여 공간 상에서 모바일 기기의 위치를 측정하여 모바일 기기의 위치를 추정하는 Unity 패키지입니다. 이를 통해 공간 정보를 활용하는 AR 앱을 쉽게 구현할 수 있습니다.
Unity 상단 메뉴의 Assets > Import Packages > Custom Package… 를 클릭한 후 vl-sdk-unity-1.6.5.unitypackage를 찾아 프로젝트에 추가합니다.
com.unity.modules.xr@1.0.0 com.unity.xr.arcore@5.1.5 com.unity.xr.arfoundation@5.1.5 com.unity.xr.arkit@5.1.5 com.unity.xr.management@4.4.0 com.unity.nuget.newtonsoft-json@3.2.1
VLSDK_ARFOUNDATION VLSDK_NEWTONSOFT_JSON
Unity 상단 메뉴의 GameObject > ARC-eye > VL > Create VLSDKManager 를 클릭하여 VLSDKManager를 Scene에 추가합니다.
VL SDK를 사용하기 위해서는 VL 데이터 변환이 완료 된 배포 완료 상태의 VL API가 필요합니다. 배포 완료 상태의 VL API를 확보 했다면 이를 VLSDK에서 사용할 수 있도록 VLSDK Settings 파일을 생성하는 과정이 필요합니다. Project 탭에서 Assets > VLSDK > VLSDK Settings.asset을 클릭하여 설정 페이지에 진입합니다.
다음은 VLSDK Settings.asset 파일을 클릭 했을 때 Inspector 창에서 보이는 모습입니다.
각 항목들에 대한 설명은 다음과 같습니다.
VL 요청을 보낼 주소들의 리스트를 입력하는 영역입니다. VLSDK는 하나의 어플리케이션에서 여러개의 VL API를 사용할 수 있도록 구현되어 있습니다. VL 요청을 보낼 주소는 ARC eye 콘솔 페이지의 ARC eye > API > API 연동 키 확인에서 확인할 수 있습니다. 해당 페이지에서 InvokeURL과 Secret Key를 가져온 뒤 VLSDK Settings의 URL List 항목에 입력합니다.
URL List의 각 항목들에 대한 세부 설명은 다음과 같습니다.
항목 | 설명 |
---|---|
Location | VL API가 동작하는 지역의 이름입니다. GPS Guide를 사용하는 경우 이 값을 이용하여 어떤 Invoke URL을 사용할지 선택합니다. GPS Guide를 사용하지 않는 경우에는 이 값이 사용되지 않습니다. |
Invoke Url | ARC eye API 연동 키 확인의 Invoke URL 값입니다. |
Secret Key | ARC eye API 연동 키 확인의 Secret Key 값입니다. |
Is Inactivated | 해당 URL을 사용하지 않을 경우 체크합니다. |
GPS Guide는 스마트폰 기기의 GPS 값을 이용해 지리적으로 의미 있는 VL API들을 선택하는 기능입니다. 사용자의 위치에 따라 특정한 VL API를 사용하고 싶은 경우 이 기능을 사용합니다. GPS Guide가 활성화 되지 않으면 URL Lists에 추가된 모든 VL API를 순회하며 VL 요청을 보냅니다.
GPS Guide를 사용하기 위해서는 VL 요청 지역이 설정된 geojson 형식의 문자열이 필요합니다. VL SDK에서는 RFC 7964 명세의 GeoJeon 포맷을 사용합니다. VL SDK는 GeoJson을 생성하는 기능을 제공하지 않기 때문에 https://geojson.io/ 과 같은 외부의 툴을 사용해 GeoJson을 생성해야 합니다.
VL SDK에서 사용할 수 있는 GeoJson을 생성하기 위해서는 location이라는 이름의 properties를 생성해야 합니다. 이 location 필드에 들어가는 값은 앞서 URL List를 설정할 때 사용했던 Location과 동일해야 합니다.
아래의 그림을 보시면 GeoJson 형태에 location 속성이 추가된 것을 보실 수 있습니다. VLSDK는 GeoJson에 입력된 location과 location 필드의 값이 일치하는 URL List의 요소를 찾아 VL 요청을 보내게 됩니다.
GeoJson의 생성이 완료되면 GPS Guide의 체크박스를 눌러 활성화를 한 뒤 Location Geo Json 필드에 앞서 생성한 GeoJson 값을 복사합니다.
실제 기기에서는 GPS 값을 이용하여 GPS Guide의 동작 여부를 테스트 할 수 있지만 Editor 모드에서는 별도의 GPS 값이 없기 때문에 테스트용 GPS 데이터를 통해 GPS Guide의 동작 여부를 확인할 수 있습니다. 테스트용 GPS 데이터는 다음 두 가지 방법을 통해 사용할 수 있습니다.
GeoCoordProvider
GeoCoordProvider
는 임의의 고정된 GPS값을 VLSDK에 할당하는 컴포넌트입니다. Hierarchy에서 VLSDKManager를 선택하면 GeoCoordProvider에 GPS 값을 할당할 수 있습니다. Play mode에 진입하면 할당한 GPS 값을 기준으로 VLSDK가 동작하게 됩니다. Use Fake GPS Coord On Device
를 활성화 하면 실제 기기에서도 해당 GPS 값을 이용해서 동작을 하게 됩니다.
AR Dataset
AR Dataset Recorder
를 이용하면 기기의 동작 환경을 기록한 뒤 재현할 수 있습니다. 이 경우 별도의 설정이 필요하지 않습니다. AR Dataset
과 관련된 자세한 사항은 아래에서 다루도록 하겠습니다.
위치가 인식이 되지 않았을 때 VL 요청을 보내는 주기입니다. 단위는 밀리세컨트(ms) 입니다. 기본값은 500ms 입니다.
위치 인식이 되어 VL Pass
상태가 되었을 때 VL 요청을 보내는 주기입니다. 단위는 밀리세컨트(ms) 입니다. 기본값은 1000ms 입니다.
VL Quality 값의 설정을 통해 수신한 VL 위치값의 정확도에 따른 VL Pass 처리 여부를 조절할 수 있습니다. LOW
, MEDIUM
, HIGH
세 단계로 조절할 수 있으며 LOW 값에 가까울수록 정확도가 낮지만 성공 횟수가 많아지게 되고 HIGH 값에 가까울수록 정확도가 높지만 성공 횟수는 적게 설정 됩니다.
VL 응답 결과를 시각화 하는 기능입니다. VL 인식 정확도에 따라 정확도가 높은 순서로 초록색, 파란색, 빨간색으로 인식된 위치를 Scene에 표시합니다. 실제 기기 화면에는 렌더링 되지 않습니다.
VLSDK의 내부 동작 간 출력되는 로그의 레벨을 설정합니다. 기본값은 WARNING입니다.
설정이 완료된 VLSetting.assets 파일을 VLSDKManager
의 Settings
필드에 할당합니다. 이제 Play 모드로 진입하면 VLSDKManager는 할당한 설정 파일의 정보를 이용하여 VL 요청을 진행합니다.
Play mode에 진입 했을 때 VLSDKManager의 세션이 자동으로 실행될지 여부를 설정하는 기능입니다. 기본값은 true입니다. 만일 특정 순간부터 VL 요청을 보내길 원한다면 PlayOnAwake를 false로 설정한뒤 아래와 같이 직접 세션을 시작해야 합니다.
public class GameManager : MonoBehaviour
{
public ARCeye.VLSDKManager m_VLSDKManager;
void Start()
{
m_VLSDKManager.StartSession();
}
}
VLSDKManager가 정상적으로 추가 되고 VL API까지 정상적으로 연동했다면 앱 빌드 시 VL 측위 기반 AR 기능을 사용할 수 있습니다. 앱 실행과 동시에 VL 요청이 시작 되고, VL 요청을 통해 받은 응답은 VL 내부에서 처리하여 AR Session Origin의 위치가 자동으로 갱신 됩니다.
VL SDK는 Editor와 실제 디바이스에서 모두 측위 테스트를 할 수 있습니다. 실제 디바이스는 ARFoundation을 통해 획득한 카메라 프레임의 Texture를 이용하여 VL 요청을 보냅니다. Editor에서는 AR Dataset
을 사용하는 방법과 TextureProvider
를 사용하는 방법이 있습니다.
AR Dataset
은 기기의 화면과 움직임 등을 기록한 AR 전용 데이터셋 다루는 패키지입니다. VLSDK는 실제 기기의 움직임을 기반으로 위치 추정의 정확도를 향상 시키는 로직이 포함되어 있기 때문에 AR Dataset을 이용해서 개발을 진행하면 실제 기기를 사용 했을 때와 유사한 환경에서 개발을 진행할 수 있습니다.
AR Dataset
은 Recoder
와 Player
로 구성되어 있습니다. Recorder
는 VLSDK 패키지 내의 VLSDK > ARDataset > ar-dataset-recorder-0.9.3.unitypackage로 제공 되고 있습니다. Player
는 VLSDK에 추가가 된 상태이며 VLSDK > Player 경로에서 확인할 수 있습니다.
Recorder
를 사용하기 위해서는 VLSDK에 추가된 ar-dataset-recorder-0.9.3.unitypackage
를 사용해야 합니다. 패키지를 열면 Recorder 관련 파일들이 추가되는 것을 볼 수 있습니다. Recorder > Scenes > Recorder.unity scene을 열면 다음과 같이 카메라 앱과 같은 화면이 구현된 것을 볼 수 있습니다.
해당 scene을 iOS나 Android로 빌드해서 실행하면 데이터셋을 생성할 수 있습니다. 레코딩 버튼을 눌러 녹화를 시작한 뒤 레코딩을 종료하면 기기에 녹화된 결과를 저장하게 됩니다. 녹화면 결과는 다음과 같은 방법으로 PC에 옮길 수 있습니다.
Player
를 사용하기 위해서는 Scene에 ARDatasetManager
가 추가 되어 있어야 합니다. GameObject > ARC-eye > Dataset > Create ARDatasetManager를 클릭하여 ARDatasetManager를 Scene에 추가합니다.
ARDatasetManager를 선택하면 Inspector에서 다음과 같은 화면을 확인할 수 있습니다. Select Dataset Directory 버튼을 누른 뒤, 압축을 해제한 데이터셋의 디렉토리를 선택합니다.
데이터를 선택한 뒤 Play mode로 진입하면 데이터셋을 촬영 했던 순간의 영상과 움직임이 출력되는 것을 볼 수 있습니다.
TextureProvider
는 VL 요청을 보낼 Texture를 NetworkController에 전달하는 기능을 수행합니다. TextureProvider의 Texture To Send
필드에 요청을 보내고자 하는 Texture를 할당하면 해당 Texture를 이용해 VL 요청을 보내게 됩니다. 여기에는 Texture Type이 Sprite (2D and UI)인 이미지 파일이나 비디오의 Render Texture를 할당할 수 있습니다.
이미지 파일을 사용할 경우 파일을 클릭하여 Import Settings에 진입한 뒤 아래와 같은 설정을 합니다.
비디오 플레이어를 사용하는 경우 Render Mode를 Render Texture로 설정한 뒤 Target Texture에 VL SDK에 첨부된 VideoTexture를 할당합니다.
VLSDKManager는 VL 인식과 관련된 각종 정보를 전달하는 이벤트를 제공하고 있습니다.
각 이벤트에 대한 세부 설명은 다음과 같습니다.
OnStateChanged
VL 인식 상태가 변경될 경우 호출되는 이벤트입니다. 세부 상태에 대한 정보는 아래의 ‘상태’ 항목을 참고해주세요
OnLayerInfoChanged(string layerInfo)
VL이 인식되는 계층이 변경 되었을 경우 호출되는 이벤트입니다. 전달 되는 매개변수는 {계층1}{계층2}{계층3}…의 형태를 가지고 있습니다.
ex. AMCOHERITZ_GND_065
OnPoseUpdated(Matrix4x4 viewMatrix, Matrix4x4 projMatrix)
매 프레임마다 호출되는 이벤트입니다. 카메라의 전역 위치와 투영 행렬을 4x4의 행렬 형태로 전달합니다.
viewMatrix - 전역 위치를 나타내는 4x4 행렬
projMatrix - 카메라의 투영행렬을 나타내는 4x4 행렬
OnGeoCoordUpdated(Double latitude, Double longitude)
GPS 위치 인식이 수행 될때마다 호출되는 이벤트입니다.
latitude - 위도
longitude - 경도
OnObjectDetected(DetectedObject info)
VOT 인식 결과를 전달하는 이벤트입니다. 현재는 사용할 수 없습니다.
VL는 내부적으로 세 가지 상태를 가집니다. 최초에는 Initial 상태이며 이후 VL의 동작에 따라 상태가 변경 됩니다. 상태가 변경이 되면 VLSDKManager의 OnStateChanged(TrackerState) 이벤트가 호출됩니다.
상태 | 설명 |
---|---|
Initial | VL 초기화가 안 된 상태. 앱 최초 실행 시, 혹은 VL 요청이 일정 수 이상 실패 시 INITIAL 상태가 됩니다. VL Settings의 Request Interval Before Localization에 설정된 주기에 맞춰 VL 요청을 보냅니다. 이 상태가 되면 AR Session Origin은 원점으로 이동하고 VL의 내부 세선은 모두 초기화 됩니다. |
VL_RECEIVED | VL 응답을 성공적으로 수신한 상태. VL_PASS 상태가 되지 직전의 상태입니다. |
VL_PASS | VL 응답을 성공적으로 수신한 상태. Request Interval After Localization에서 설정한 주기에 맞게 VL 요청을 보냅니다. |
VL_FAIL | VL 응답이 일시적으로 실패 중인 상태. Request Interval Before Localization에서 설정한 주기에 맞게 VL 요청을 보냅니다. VL 요청을 통해 갱신된 AR Session Origin은 유지 됩니다. 이 상태가 지속되면 INITIAL 상태로 변환. |
VL_OUT_OF_SERVICE | GPS Guide 사용 결과 유효한 VL API를 찾을 수 없는 상태. 지속적으로 GPS 값을 이용해 사용 가능한 VL API를 탐색합니다. |
VL의 제어는 VLSDKManager를 통해서 할 수 있습니다. VLSDKManager는 기기 별로 카메라 이미지와 위치를 전달받아 VL 요청을 보내고 그 결과를 Scene에 적용하는 역할을 수행합니다. VLSDKManager에서 사용할 수 있는 메서드는 다음과 같습니다.
메서드 이름 | 설명 |
---|---|
StartSession() | PoseTracker 세션을 시작합니다. 세션이 시작되면 매 프레임마다 카메라의 위치를 갱신하고 필요한 순간에 VL 요청을 보냅니다. 기본적으로 VLSDKManager의 Start 이벤트에서 실행합니다. |
StopSession() | PoseTracker 세션을 중단합니다. 카메라 위치 갱신이 중단되고 VL 요청을 보내지 않습니다. |
ResetSession() | PoseTracker 세션을 초기화합니다. State가 INITIAL이 되고 AR Session Origin이 원점으로 이동됩니다. |
VLSDK 사용 시 버그를 발견하거나 사용 방법에 대한 문의가 있을 경우 dl_ar@naverlabs.com으로 연락 바랍니다.
버그 리포팅 시 VLSDK Settings
의 Log Level을 Verbose
로 설정하여 로그를 출력한 뒤 Unity Console에서 Stack Tracing Logging의 설정을 모두 Full로 선택한 상태에서 전체 로그를 함께 첨부해주시면 문제 상황을 더욱 빠르게 확인할 수 있습니다.