C#
C# はSLAMの世界に一つの入口から入ってくる。拡張現実(AR)アプリケーションだ。SLAMアルゴリズム自体はC++で書かれることが多いが、SLAMの出力を消費するアプリケーション — ARゲーム、産業用ARオーバーレイ、複合現実(MR)トレーニングツール — は、Unityやマイクロソフトの複合現実スタックの上でC#によって構築されることが非常に多い。
Unity AR。 Unityは AR開発における支配的なエンジンであり、そのスクリプト言語はC#である。AR Foundationのようなフレームワークはプラットフォームのトラッキングシステム(iOSのARKit、AndroidのARCore)に対するC# APIを提供する。すなわち、内部で動作するVIO/SLAMシステムがネイティブに計算したデバイスの姿勢、検出された平面、アンカーポイントを受け取り、それらを使って仮想コンテンツを配置・レンダリングする。C#側から見ると、SLAMはアルゴリズムとして実装するものではなく、6自由度(6-DoF)の姿勢と環境の幾何情報を流し続けるサービスとして現れる。
AR Foundationのメンタルモデルは、あなたが知っているSLAMの概念に直接マッピングされる。
- セッション(Session) — 内部トラッカーのライフタイム。初期化中、トラッキング中、あるいは劣化/限定状態のいずれかを取り得る(C#アプリはこの3状態すべてを適切に扱わなければならない)。
- トラッカブル(Trackables) — トラッカーによって検出された平面、特徴点、画像、メッシュ。プラットフォームにおける*地図(map)*の版である。
- アンカー(Anchors) — 物理世界に固定された姿勢で、システムはマップが改善されるにつれてそれを更新し続ける。これはランドマークとループ閉じ込みのARに面した側面である。トラッカーがドリフトを補正すると、アンカー付きコンテンツは視覚的にスナップする — なぜそうなるかを理解するのは純粋なSLAMの知識である。
Microsoft HoloLens。 HoloLensは自己完結型の複合現実ヘッドセットで、オンボードのヘッドトラッキングと空間マッピングがシステムサービスとして動作する。アプリケーションは通常、Mixed Reality Toolkit(MRTK)を用いてUnity + C#で構築され、空間メッシュ、空間アンカー、ハンド/アイ入力にアクセスする。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軸が上を向く座標系を使うが、ほとんどのSLAM/ロボティクスのコードは右手系である。そのため、変換(軸の反転とそれに対応するクォータニオン成分の変更)が橋渡しのたびに必要になり、これを誤ると鏡像化したり回転がおかしくなったりするコンテンツが生じる。
したがって、C#の仕事であってもSLAMを理解しておくことは価値がある。トラッキング障害を解釈でき、アンカーがドリフトする理由を理解でき、内部トラッカーの限界を踏まえたコンテンツ配置を設計できるようになる。
SLAMにおける意義
ARは視覚SLAMの最大の商業応用の一つであり、C#/Unityは実際にARプロダクトが出荷される主要な手段である。AR機器向けのSLAMに取り組むなら、C#はあなたのユーザーの言語である。C++トラッカーをUnityに公開するネイティブプラグインを書き、C#アプリから報告される問題をデバッグし、C#開発者が消費するAPI(姿勢、アンカー、メッシュ)を設計することになる。また実用的なプロトタイピング手段でもある。Unityはカメラや環境をシミュレートして知覚パイプラインをテストできる。