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 개념에 그대로 대응된다.
- 세션(Session) — 기반 트래커의 생명 주기. 초기화 중, 트래킹 중, 또는 저하/제한 상태일 수 있으며(C# 앱은 이 세 가지를 모두 우아하게 처리해야 한다).
- 트래커블(Trackables) — 트래커가 검출한 평면, 특징점, 이미지, 메시: 플랫폼 버전의 맵이다.
- 앵커(Anchors) — 물리적 세계에 고정된 자세로, 시스템이 자신의 맵을 개선함에 따라 계속 업데이트한다. 랜드마크와 루프 클로저의 AR 쪽 얼굴이다. 트래커가 드리프트를 보정하면 앵커에 붙은 콘텐츠가 눈에 띄게 튀는데, 그 이유를 이해하는 것은 순전히 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는 인식 파이프라인 테스트를 위한 카메라와 환경을 시뮬레이션할 수 있다.