- 인쇄
- PDF
ARC eye VL API
- 인쇄
- PDF
개요
ARC eye Visual Localization (VL) API 는 카메라를 포함한 비전 디바이스로부터 수집된 정보를 통해, 실외 및 GPS가 통하지 않는 실내에서도 현재 위치를 정확하게 알려주는 위치 측위 서비스를 제공합니다. 이미지만으로 실내 위치 데이터를 확인할 수 있습니다.
WiFi Localization: 디바이스에서 수집된 WiFi 신호세기(RSSI)를 이용하여 GPS가 통하지 않는 실내에서 현재 위치를 대략적으로 알려주는 위치 측위 서비스를 추가로 제공합니다. 디바이스가 위치한 대략적인 위치와 함께 로케이션 정보도 함께 제공이 됩니다. 이를 이용하여 보다 정확한 ARC eye VL API 요청(반경서치: lastPose + odometry 조합)을 보낼 수 있습니다.
참고: RSSI란?
2024년 7월 이전에 스캔한 공간에 대해서는 ARC eye WiFi Localization 기능이 지원되지 않습니다.
공간데이터 구축
콘솔에서 공간데이터를 구축하여 VL API 를 사용할 수 있습니다. SLAM 데이터 변환부터 SLAM 데이터 병합, 로컬라이즈, VL 데이터 변환까지 모든 작업을 순서대로 진행해야합니다. 자세한 내용은 ARC eye 사용가이드 를 참조하세요.
API 준비
VL 데이터 병합이 성공하면, ARC eye > API 메뉴에 '대기' 상태의 API 가 생성됩니다. 해당 API 를 선택하여 배포하면 VL API 를 사용할 수 있습니다.
또다른 API 를 생성하여 배포할 버전을 변경할 경우에는 기존 API 는 중지됩니다. *중지중에는 다른 API 를 배포할 수 없습니다.
요청
메서드 | 요청 URI |
---|---|
POST | ARC eye > API > API 연동 키 확인 의 InvokeURL 로 호출 |
요청 헤더
이름 | 설명 |
---|---|
X-ARCEYE-SECRET | ARC eye > API > API 연동 키 확인 의 Secret Key 사용 |
Content-Type | multipart/form-data |
요청 바디
필드 이름 | 필수 여부 | 데이터 유형 | 설명 | 제약사항 |
---|---|---|---|---|
image | Y | file | wifi 요청일 경우 생략 가능 | |
cameraParameters | N | string | 카메라 파라미터 정보를 입력. 입력하지 않으면 디폴트 값으로 동작 fx,fy,cx,cy,k1,k2,p1,p2,k3 - (fx,fy): focal length - (cx,cy): principal point - (k1,k2): radial distortion - (p1,p2): tangential distortion - (k3): radial distortion | |
lastPose | N | string | - 쿼리 이미지를 생성하는 시점에 추정된 이미지의 comma로 구분된 6-dof pose 정보 - 최근에 응답받은 pose 값에 odometry 값을 더함. | odometry 와 함께 사용되어야함 |
odometry | N | string | - comma로 구분된 6-dof pose 정보 - 마지막 쿼리 이미지를 보낸 시점에서 현재 쿼리 이미지를 보낸 시점사이의 pose 변화량 | lastPose 와 함께 사용되어야함 |
withGlobal | N | boolean | - true 일 경우 lastPose 값을 "위도, 경도, tz, qw, qx, qy, qz" 으로 해석. - 만약 값이 설정되어 있지 않거나 false 일 경우 lastPose 값을 "tx, ty, tz, qw, qx, qy, qz" 으로 해석 | |
withInlier | N | boolean | true 일 경우 위치측위시 사용했던 유효한 3D-2D correspondences 가 응답에 추가됨 | |
wifi | N | file | Json 형태의 WiFi 신호강도 스캔 파일 | |
datasetInfo | N | string | 로케이션 레이어 이름에 대응되는 가공 데이터만을 이용하여 VL 쿼리를 수행 (로케이션 이름의 구분은 쉼표 문자로 구분) |
CURL example:
curl -X POST '{invokeUrl}' \
-H 'X-ARCEYE-SECRET: {secretKey}' \
-H 'Content-Type: multipart/form-data' \
-F 'image=@location.jpg;type=image/jpeg'
curl -X POST '{invokeUrl}' \
-H 'X-ARCEYE-SECRET: {secretKey}' \
-H 'Content-Type: multipart/form-data' \
-F 'image=@location.jpg;type=image/jpeg' \
-F 'odometry=0,0,0,1,0,0,0' \
-F 'lastPose=0,0,0,1,0,0,0' \
-F 'cameraParameters=1186.7,1406.5,540,960,0.0,0.0,0.0,0.0,0.0' \
-F 'withInlier=true' \
-F dataset_info="1F,T2B00652308180853"
응답
응답 바디
필드 이름 | 데이터 유형 | 설명 |
---|---|---|
result | string | 응답결과 : "SUCCESS", "FAILURE" |
message | string | 결과메시지 |
tips | string | 추가정보 |
pose | string | 이미지이름,tx,ty,tz,qw,qx,qy,qz 값을 의미 |
total | int | 쿼리이미지에서 추출된 특징점의 전체 개수 |
inlier | int | 쿼리이미지에서 추출된 유효한 특징점의 전체 개수 |
inliers | array | 위치측위시 사용했던 유효한 3D-2D correspondences, - [U,V] : 이미지 상의 픽셀 좌표 - [X,Y,Z] : 대응되는 3차원 포인트 |
residual | float | 유효한 특징점의 projection error (pixel 단위) |
status | string | 서버 상태 |
floor | string | 쿼리 이미지의 층정보 |
lonLat | string | Longitude(경도), Latitude (위도) |
globalPose | string | 이미지이름,위도,경도,altitude,qw,qx,qy,qz 값을 의미 |
nnPoses | string[] | 인접한 레퍼런스 이미지들의 이미지이름,tx,ty,tz,qw,qx,qy,qz 값을 의미 |
datasetInfo | string | 스캔시에 구분한 각 계층의 이름들을 하나로 이어붙인 값 |
응답 예시
{
"result": "SUCCESS",
"status": "success",
"pose": "VL0_0000050014880892_000000006.jpg,2.746507,9.889554,-20.729435,0.657244,-0.096816,-0.068169,0.744318",
"total": 7738,
"inlier": 1762,
"inliers": [
{
"U" : 356.8439,
"V" : 146.9978,
"X" : 114.01553,
"Y" : 233.33755,
"Z" : 12.9115095
}
],
"residual": 5.998124,
"floor": "ground",
"lonLat": "126.61787915108854,37.47318807235039",
"globalPose": "VL0_0000050014880892_000000006.jpg,37.47318807235039,126.61787915108854,21.688565,0.657244,-0.096816,-0.068169,0.744318",
"nnPoses": [
"VL0_1663124545528216.jpg,3.219894,17.559616,-19.898514,0.720037,-0.121523,-0.006865,0.683177",
"VL1_1663124536528144.jpg,3.498234,18.586061,-20.282135,0.721541,-0.07256,-0.117165,0.678518",
"VL2_1663124537528455.jpg,2.849693,18.648811,-20.386539,0.631969,-0.018601,-0.109304,0.767022",
"VL0_1663124544528213.jpg,3.159655,16.287134,-19.874195,0.701073,-0.139553,0.015575,0.699127",
"VL1_1663124521528042.jpg,4.446866,15.010426,-19.975168,0.755891,-0.150474,-0.035666,0.636171",
"VL1_1663124543528186.jpg,3.704958,15.066489,-20.11025,0.761836,-0.152187,-0.059388,0.626832",
"VL4_1663124540528089.jpg,4.224849,16.700996,-20.057743,0.601045,-0.055503,-0.034118,0.796555",
"VL0_1663124547528227.jpg,2.683109,20.13681,-20.074528,0.543752,-0.150696,-0.013089,0.825502",
"VL4_1663124516527975.jpg,3.005801,17.602791,-20.282951,0.761109,-0.017261,-0.000655,0.648394",
"VL2_1663124520528189.jpg,5.639919,15.146515,-19.748491,0.675394,-0.108291,-0.088871,0.724029",
"VL1_1663124513527983.jpg,4.592686,18.804764,-20.067684,0.770351,-0.120287,-0.11107,0.616242"
],
"datasetInfo": "NationalMuseumKorea_1F_T2B00652308180853"
}
{
"result": "FAILURE",
"status": "success",
"message": "internal server error",
"pose": "failed",
"floor": "",
"lonLat": "",
"globalPose": "",
"datasetInfo": ""
}
에러 코드
에러 응답:
{
"code": "9999",
"message": "Unknown server error.",
"path": "/api/v1",
"product": "ARC eye",
"traceId": "9c1f55ac7d8341d792a922b2590c045f",
"timestamp": 1570776853475,
"status": "500"
}
에러 코드 | HTTP 상태 | 설명 |
---|---|---|
0001 | 404 | Not Found |
0020 | 401 | Unauthorized |
0030 | 403 | Forbidden |
0100 | 40x | Invalid Parameter |
0101 | 409 | Duplicate |
1000 | 50x | Internal API Error |
1001 | 500 | Processing Error |
9999 | 500 | Unknown Error |
WiFi 응답
WiFi 응답 바디
필드이름 | 데이터유형 | 설명 |
---|---|---|
result | string | 응답 결과 : "SUCCESS", "FAILURE" |
message | string | 결과 메시지 |
position | string | 매핑 공간에서의 2자유도 위치 값(XY 평면)을 의미 |
lonLat | string | Longitude (경도), Latitude (위도) |
datasetInfo | string | 스캔 시 구분한 각 계층의 이름들을 하나로 이어붙인 값 |
datasetInfoScore | float | 로케이션 구분 정확도 (0에 가까울수록 신뢰도가 낮고, 1에 가까울수록 신뢰도가 높음) |
WiFi 응답 예시
{
"result": "SUCCESS",
"position": "16.6337711608804,5.690108685931897",
"lonLat": "127.105412759367,37.359465269300976",
"datasetInfo": "Naver_1784_1F",
"datasetInfoScore": 0.6852494
}
WiFi 에러 코드
에러 응답:
{
"traceId": "3d77c10b1a0646659b6c897a35a5fa64",
"path": "/vl/v1/300568/9bb1a2b6f8031e355dfdb8e5205a1f7a860b167a0fcbd35681235f35c3629634/location",
"timestamp": 1725449250446,
"product": "ARC eye",
"status": 422,
"code": "0100",
"message": "Invalid parameters.",
"details": "there are no valid signals"
}
에러 코드 | HTTP 상태 | 설명 |
---|---|---|
0001 | 404 | Not Found |
0020 | 401 | Unauthorized |
0030 | 403 | Forbidden |
0100 | 40x | Invalid Parameter |
0100 | 400 | "there is no location" (location parameter 가 인입이 되지 않은 경우) |
0100 | 400 | "failed to parse wifi scan file" (입력된 wifi 데이터가 문제가 있는 경우) |
0100 | 404 | "failed to get location info from qdrant: xxx" (Qdrant db 에서부터 해당 location 에 대한 정보를 얻을 수 없는 경우) |
0100 | 404 | "failed to get wifi-finder model file from S3" (가공된 WiFi Finder 모델이 없는 경우) |
0100 | 404 | "wifi-loc model does not exists" (가공된 WiFi Loc 모델이 없는 경우) |
0100 | 422 | "failed, it has low dataset info score" (대상 로케이션에 유효한(신호세기가 큰) WiFi 신호가 없는 경우) |
0100 | 422 | "failed to get location info from qdrant: xxx" (낮은 DatasetInfoScore 로 인해 로케이션 구분이 어려운 경우) |
0101 | 409 | Duplicate |
1000 | 500 | "No matching AP list exists" (mac-address가 일치하는 WiFi 신호가 없는 경우) |
1000 | 500 | "failed to load qdrant" (내부 서버 통신 간 오류가 발생한 경우 (Qdrant vector db와 통신이 안 되는 경우)) |
1000 | 500 | "failed to get global position filefrom qdrant" (내부 서버 통신 간 오류가 발생한 경우 (global poistion 정보를 qdrant로부터 받지 못하는 경우)) |
1000 | 500 | "out of service, due to there is no valid xxx" (내부 서버 통신간 오류가 발생한 경우 (xxx 가 없는 경우)) |
1001 | 500 | Processing Error |
9999 | 500 | Unknown Error |