チュートリアル
各チュートリアルは、Inverse Serviceの機能を1つ示す独立したプログラムです。3つの言語バリアントを並べて提供しているため、書き方を比較し、プロジェクトに合ったスタックを選ぶことができます:
- Python — 最も短く、最も手軽に始められるエントリーポイント(
websockets+json) - C++(nlohmann/json) — 移植性の高いC++11、実行時パースのJSON
- C++(Glaze) — コンパイル時リフレクションとゼロアロケーションのパースを備えた最新のC++20。リアルタイムのハプティックループに推奨
ソースコードは、2つの公開サンプルリポジトリで公開されています:
- haply-inverse-cpp-samples — チュートリアルごとに1つのディレクトリがあり、nlohmann/json(C++11)版と Glaze(C++20)版の両方を収録しています。ビルドターゲットには、Glaze版用に
-glzのサフィックスが付いています。 - haply-inverse-python-samples — チュートリアルごとに1つのディレクトリがあります。
Inverse Serviceの各リリースでは、両方のリポジトリに対応するタグが固定されています。本ドキュメントと一致するバージョンを使い続けるには、release/<version> ブランチを追跡してください。
前提条件
- Inverse Serviceがポート
10001で実行されていること(Haply Hubまたはスタンドアロンインストーラーのいずれかから起動)。 - Haplyデバイスが少なくとも1台検出されていること。各チュートリアルは特定のデバイスファミリーを対象としています。下の表を参照してください。
- Pythonチュートリアル:
pip install websockets(チュートリアル04、05、06、07、08、09では、さらにkeyboardが必要です。これはLinuxで管理者権限を必要とします。チュートリアル08と09ではrequestsも必要です)。 - C++チュートリアル:nlohmann版には CMake 3.15 以上とC++11対応のコンパイラが、Glaze(
-glz)版にはC++20対応のコンパイラが必要です。サンプルリポジトリのトップレベルのCMakeLists.txtが、FetchContent 経由でlibhv、nlohmann/json、glazeを取得するため、手動での依存関係のセットアップは不要です。
チュートリアル一覧
| # | 名前 | デバイス | バリアント | 学べる内容 |
|---|---|---|---|---|
| 00 | デバイス一覧 | 任意 | Py · C++ · C++ Glaze | HTTPによるデバイス検出、セッションスコープのクエリ |
| 01 | Inverse3 出力 | Inverse3 | Py · C++ · C++ Glaze | WebSocket の状態ストリーミング、ゼロ力のキープアライブ、最初のメッセージによるハンドシェイク |
| 02 | VerseGrip 出力 | 有線 VG | Py · C++ · C++ Glaze | 姿勢のストリーミング、probe_orientation によるキープアライブ、クォータニオンからオイラー角への変換 |
| 03 | ワイヤレス VG 出力 | WVG | Py · C++ · C++ Glaze | ボタン、バッテリー、ホールセンサー |
| 04 | Hello Floor | Inverse3 | Py · C++ · C++ Glaze | 最初のハプティック効果 — set_cursor_force によるペナルティスプリング |
| 05 | 位置制御 | Inverse3 | Py · C++ · C++ Glaze | set_cursor_position による制御、ランダムなターゲット(C++)または WASD による長押し移動(Python) |
| 06 | 複合 | Inverse3 + WVG | Py · C++ · C++ Glaze | 複数デバイスのループ、クォータニオンによる方向でのカーソル駆動 |
| 07 | 基準とマウント | Inverse3 | Py · C++ · C++ Glaze | configure.basis、configure.preset、実行時の configure.mount によるオーバーライド。プリセットとマウントの相互排他 |
| 08 | HTTP リモート設定 | Inverse3 | Py · C++ · C++ Glaze | HTTP専用のセッション横断コンフィギュレーター。プロファイルでセッションを検出し、REST 経由で basis / preset / mount を対話的に POST |
| 09 | WS リモートコントロール | Inverse3 | Py · C++ · C++ Glaze | リアルタイムのワークスペースナビゲーター:HTTP によるセッション・デバイスの検出後、WebSocket 経由でティックごとに set_transform をストリーミング |
| 10 | イベント | — | Py · C++ · C++ Glaze | ポート 10020 のイベントストリームリスナー。レベル・名前によるフィルタリング |
ヒント — ハプティックループのベンチマーク
チュートリアル10(イベント)は、他のどのチュートリアルと並行して実行できるように設計されています。--no-hide-rate を有効にすると、サービスの system-rate-report イベントを出力します。このイベントには、実効的なデバイスのティックレートが含まれます。同じチュートリアルの Python / C++(nlohmann)/ C++(Glaze)バリアント間でレートを比較し、約 4 kHz の制御ループにおけるシリアライズのオーバーヘッドの影響を確認してください。
# Terminal 1 — pick a tutorial variant
./04-haply-inverse-hello-floor # C++ nlohmann
./04-haply-inverse-hello-floor-glz # C++ Glaze
python 04-haply-inverse-hello-floor.py # Python
# Terminal 2 — watch the rate
./10-haply-inverse-events --no-hide-rate