C#

C#은 단 하나의 문으로 SLAM 세계에 들어온다: 증강 현실 애플리케이션이다. SLAM 알고리즘 자체는 C++로 작성되지만, SLAM 출력을 소비하는 애플리케이션 — AR 게임, 산업용 AR 오버레이, 혼합 현실 트레이닝 도구 — 은 매우 자주 Unity나 Microsoft의 혼합 현실 스택 위에서 C#으로 만들어진다.

Unity AR. Unity는 AR 개발을 위한 지배적인 엔진이며, 그 스크립팅 언어는 C#이다. AR Foundation과 같은 프레임워크는 플랫폼 트래킹 시스템(iOS의 ARKit, Android의 ARCore) 위에 C# API를 제공한다: 여러분은 기반 VIO/SLAM 시스템이 네이티브로 계산한 디바이스 자세, 검출된 평면, 앵커 포인트를 전달받아 이를 이용해 가상 콘텐츠를 배치하고 렌더링한다. C# 쪽에서 보면 SLAM은 여러분이 구현하는 알고리즘이 아니라 하나의 서비스 — 6-DoF 자세와 환경 기하 정보의 스트림 — 로 보인다.

AR Foundation의 사고 모델은 여러분이 이미 알고 있는 SLAM 개념에 그대로 대응된다.

Microsoft HoloLens. HoloLens는 온보드 헤드 트래킹과 공간 맵핑이 시스템 서비스로 실행되는 독립형 혼합 현실 헤드셋이다. 애플리케이션은 보통 Unity에서 C#으로, 공간 메시, 공간 앵커, 손/눈 입력에 접근하기 위해 Mixed Reality Toolkit(MRTK)을 사용해 만들어진다. SLAM 엔지니어에게 HoloLens는 양방향으로 흥미롭다: 소비자급 기기에서 항상 켜져 있는 헤드 트래킹과 맵핑을 배치한 예시이면서, (리서치 모드를 통해) 실험용 다중 센서 데이터의 소스이기도 하다.

전형적인 역할 분담은 다음과 같다.

계층언어역할
SLAM / VIO 엔진C++트래킹, 맵핑, 재위치추정 (플랫폼 제공형 또는 커스텀)
엔진 바인딩C++/C# 상호운용 (P/Invoke, 네이티브 플러그인)자세, 메시, 앵커 노출
애플리케이션C# (Unity, MRTK)렌더링, 상호작용, 비즈니스 로직

자신의 C++ SLAM을 Unity에 연결하기. 표준 경로는 네이티브 플러그인이다: C++ 코어를 플랫폼별 공유 라이브러리(.so, .dylib, .dll, iOS 프레임워크)로 컴파일하고, C#에서 P/Invoke로 호출한다.

[DllImport("myslam")]
private static extern void slam_track(IntPtr image, double timestamp, float[] pose4x4);

자세는 경계를 넘을 때 평평한 float 배열로 전달되며, 반복적으로 발생하는 함정은 좌표계 규약이다. Unity는 왼손 좌표계, Y-up을 사용하는 반면 대부분의 SLAM/로보틱스 코드는 오른손 좌표계를 사용한다. 그래서 매 경계마다 변환(축 반전과 그에 대응하는 쿼터니언 성분 변경)이 필요하며, 이를 잘못하면 콘텐츠가 뒤집히거나 회전하며 흔들리는 결과가 나온다.

그러므로 C# 업무에서도 SLAM을 이해하면 도움이 된다: 트래킹 실패를 해석하고, 앵커가 왜 드리프트하는지 이해하고, 기반 트래커의 한계를 존중하는 콘텐츠 배치를 설계할 수 있다.

SLAM에서의 의미

AR은 시각적 SLAM의 가장 큰 상업적 응용 분야 중 하나이며, C#/Unity는 대부분의 AR 제품이 실제로 출시되는 방식이다. AR 디바이스용 SLAM 작업을 한다면 C#은 여러분의 사용자가 쓰는 언어다: 여러분은 C++ 트래커를 노출하는 네이티브 플러그인을 작성하고, C# 앱에서 보고된 이슈를 디버깅하며, C# 개발자가 소비할 API(자세, 앵커, 메시)를 설계한다. 또한 실용적인 프로토타이핑 경로이기도 하다 — Unity는 인식 파이프라인 테스트를 위한 카메라와 환경을 시뮬레이션할 수 있다.

관련 문서