iOS Develop / ARKit: Depth API를 통한 LiDAR 측정

Minsang Kang·2023년 6월 1일
3

iOS Develop

목록 보기
2/3

서론

졸업 프로젝트의 주제로 "Apple Device에 있는 LiDAR scanner로 Point Cloud 데이터를 측정하여 실내지도를 구축할 수 있는 프로그램"이 선정되었다.

몇년간 iOS 개발자로 준비해오고 있었고, 대학교를 마무리하는 프로젝트인 만큼 iOS 개발자로 뭔가를 보여줄 수 있는 프로젝트였으면 좋겠다는 생각이 있었다.
이러한 생각과 팀원들이 LiDAR 파일들을 다뤄본 관련 경험이 있었기에 자연스럽게 "Apple Device의 LiDAR scanner로 LiDAR 파일을 추출할 수 있지 않을까?" 생각되었고, 여러가지를 찾아보니 "가능하겠다!" 라는 결론에 도달했습니다.

ARKit을 다뤄보고 싶은 iOS 개발자 및 Digital Twin, 또는 SLAM(Simultaneous localization and mapping) 프로젝트 관련 종사하시는 분들에게 정보제공이 될 수 있지 않을까는 생각에 어떻게 LiDAR 파일을 측정하고, 업로드할 수 있었는지 정리해보고자 합니다.

LiDAR 측정 & 업로드

LiDAR 측정중LiDAR 업로드

LiDAR scanner가 내장된 Apple Device를 움직이면서 측정하고, 측정된 Point Cloud 데이터들이 표시됩니다.
추가로 LiDAR 데이터가 용량이 크기 때문에 업로드 진행률을 표시합니다.

3D 지도에서 LiDAR 데이터 확인

3D지도에 LiDAR 표출 1
3D지도에 LiDAR 표출 2

Apple Device에서 측정된 LiDAR 파일이 업로드되면 Web에서 3D 지도와 함께 측정된 LiDAR 파일을 확인할 수 있습니다.

LiDAR 측정앱 프로젝트

해당 프로젝트는 Public으로 공개되어 있습니다.
Point Cloud Data with LiDAR 저장소


핵심 기술 정리

본 프로젝트는 WWDC20: Explore ARKit 4 내용 중 LiDAR scanner를 통한 Demo Project 시연 영상을 기반으로 제작되었습니다.
따라서 해당 WWDC 소개 내용 분석과 프로젝트 개발을 위한 추가 개발사항들을 정리하겠습니다.

WWDC20: Explore ARKit 4


iPad Pro 및 iPhone Pro 시리즈에 추가된 LiDAR scanner를 통해 ARKit 4에서 Depth API를 통해 깊이를 측정할 수 있습니다.
LiDAR scanner는 초당 수백만번 빛을 쏘고 받는 작업을 통해 측정한다고 합니다.


iOS14의 ARKit 4에 Depth API가 추가되었습니다.
Depth API는 LiDAR scanner가 있는 장치에서 사용할 수 있습니다.
Depth API는 이미지의 픽셀이 미터 단위의 깊이에 해당하는 조밀한 깊이 이미지(dense depth image)를 제공합니다.
빨간 부분은 멀리있고, 파란 부분은 가까운 영역이라는 것을 LiDAR scanner로부터 알 수 있습니다.
Depth API는 AR frame과 연결되어 60Hz로 사용할 수 있습니다.


광각 카메라의 RGB 이미지와 LiDAR scanner의 깊이값(depth ratings)이 ML(Machine Learning) 알고리즘에 의해 융합되어 조밀한 깊이 이미지(dense depth image)를 생성합니다.
해당 과정은 모든 AR frame에서 사용 가능한 깊이 맵(depth map)으로, 초당 60Hz로 실행됩니다.


깊이값(depth data)은 ARFrame.sceneDepth 속성을 통해 접근이 가능합니다.
depth dataARDepthData 오브젝트 값으로 제공됩니다.
해당 ARDepthData는 depthMap Buffer 와 confidenceMap Buffer 로 구성됩니다.


depth map Buffer는 CV Pixel Buffer 값으로, 각 pixel은 미터 단위의 depth 값을 나타냅니다.
depth data 값은 카메라 평면으로부터 실제 대상까지의 거리값입니다.
depth map Buffer의 depth map의 해상도는 ARFrame에 캡쳐된 이미지에 비해 작습니다.
(LiDAR scanner의 해상도로 인해 카메라 이미지보다 작아지는 것으로 보임, depth map의 각 픽셀마다 depth data 값들을 지님)


LiDAR scanner로 쏜 빛의 반사를 기반으로 깊이(depth data)를 측정하므로, 반사율이 높거나 낮은 표면과 같이 까다로운 표면의 경우 depth data의 정확도가 낮을 수 있습니다.
따라서 이러한 depth data의 정확도(accuracy) 값은 신뢰도(confidence)를 나타내며, ARConfidenceLevel 타입의 값으로 제공됩니다.
ARConfidenceLevel 값은 low, medium, high 값중 하나이며, 해당 값으로 앱에서 요구사항에 따른 depth 값을 필터링하는데 사용될 수 있습니다.


Depth API를 사용하는 샘플코드입니다.
ARSessionARWorldTrackingConfiguration을 먼저 생성한다음
sceneDepth 값인 새로운 FrameSemantic 값을 설정한 후 ARSession에 해당 configuration 값을 동작시키면 됩니다.
ARSession의 delegate를 통해 didUpdate 함수를 통해 ARFrame의 sceneDepth 속성에서 depth data에 접근할 수 있습니다.
해당 sceneDepth 값을 설정하기 전에 supportsFrameSemantics를 통해 지원하는 장치인지를 확인해야 합니다.
(LiDAR scanner가 장착된 기기에서만 지원가능한 장치로 판단됩니다.)


Depth APIdepth dataARFrame에서 캡쳐된 RGB 이미지의 컬러값의 조합으로 컬러값을 지닌 조밀한 3D Point Cloud을 얻을 수 있습니다!
매 ARFrame에서 Point Cloud 들을 축적하여 AR로 표시하면 해당 Demo Project 처럼 Point Cloud를 측정하고, 표시할 수 있습니다!
여기서 depth data의 신뢰도(confidence) 값을 low, middle, high에 따라 필터링을 하면 더욱 신뢰도가 높은 Point Cloud 데이터를 얻을 수 있습니다.
(conficende 값이 높을수록 point 정확도가 높은 point 들만 표시되므로 점들이 적어지기에 더 어두워지는 현상이 발생합니다.)


해당 Demo Project의 동작구성입니다.
각각의 ARFrame 에서 ARDepthData 값과 ARCamera를 통해 unproject 라고 불리는 metal vertex shader를 생성합니다.
ARDepthData를 통해 depthMap(depth data)과 confidenceMap을 받고,
ARCamera의 내장 파라미터인 cameras transform(카메라 전환), projection matrix 값들을 사용하여
depth map에서 3D 공간으로 depth data를 unproject(비투영) 하여 unproject를 생성합니다.
unproject 와 ARFrame에서 capturedImage인 RGB 이미지를 사용하여 각 depth map의 각 pixel들의 색상을 샘플링합니다.

매 ARFrame마다 이러한 과정으로 얻은 3D Point cloud 들을 Metal을 사용하여 렌더링하면 Demo Prject 처럼 Point cloud가 표시됩니다.


요약을 하면 ARKit 4에 새로운 Depth API가 추가되었고,
LiDAR scanner를 활성화하기 위한 sceneDepth라는 새로운 frameSemantic값이 생겼고,
활성화를 하여 60Hz로 동작되는 각각의 ARFrame에서 ARDepthData를 통해 depth data를 얻을 수 있으며
depth datadepth mapconfidence map이 있으며
해당 Depth API는 LiDAR scanner가 있는 장치에서 지원됩니다.


Reference

profile
 iOS Developer

2개의 댓글

comment-user-thumbnail
2024년 2월 7일

와..! 멋있네요..!

답글 달기
comment-user-thumbnail
2024년 4월 8일

헉 제가 딱 필요했던 부분인데, 도움이 많이 될 것 같습니다 ㅎ

답글 달기