チュートリアル
各チュートリアルは、Inverse Serviceの機能の1つを示す独立したプログラムです。3つの言語バージョンが並べて提供されているため、記述方法を比較し、プロジェクトに適したスタックを選ぶことができます:
- Python — 最も短く、最も手軽に始められる入り口(
websockets+json) - C++(nlohmann/json)— 移植性の高いC++11、実行時解析型のJSON
- C++(Glaze)— コンパイル時リフレクションとゼロアロケーションのパース機能を備えた最新のC++20。リアルタイムのハプティックループに推奨
ソースコードは、2つの公開サンプルリポジトリで公開されています:
- haply — チュートリアルごとに1つのディレクトリがあり、nlohmann/json(C++11)版とGlaze(C++20)版の両方が収録されています。ビルドターゲットには、Glaze版用に
-glzという接尾辞が付いています。 - haply-inverse-python-samples— チュートリアルごとに1つのディレクトリがあります。
Inverse Serviceの各リリースでは、両方のリポジトリに対応するタグが固定されています。本ドキュメントと一致するバージョンを引き続き使用するには、release/<version> ブランチを追跡してください。
前提条件
- 逆サービスがポート
10001そこで実行されていること(Haplyまたはスタンドアロンインストーラーのいずれかから起動)。 - 少なくとも1台のHaplyデバイスが検出されていること。各チュートリアルは特定のデバイスファミリーを対象としています。以下の表をご参照ください。
- 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 | デバイス一覧 | 任意 | Python · C++ · C++ Glaze | HTTPによるデバイス検出、セッションスコープでのクエリ |
| 01 | Inverse3 出力 | Inverse3 | Python · C++ · C++ Glaze | WebSocket の状態ストリーミング、ゼロオーバーヘッドのキープアライブ、最初のメッセージによるハンドシェイク |
| 02 | VerseGrip 出力 | 有線 VG | Python · C++ · C++ Glaze | 姿勢のストリーミング、probe_orientation によるキープアライブ、クォータニオンからオイラー角への変換 |
| 03 | ワイヤレス VG 出力 | WVG | Python · C++ · C++ Glaze | ボタン、バッテリー、ホールセンサー |
| 04 | こんにちは、フロア | Inverse3 | Python · C++ · C++ Glaze | 最初のハプティック効果 — set_cursor_force によるペナルティスプリング |
| 05 | 位置制御 | Inverse3 | Python · C++ · C++ Glaze | set_cursor_position による制御、ランダムなターゲット(C++)または WASD キーによる長押し移動(Python) |
| 06 | 複合 | Inverse3 WVG | Python · C++ · C++ Glaze | 複数デバイスによるループ、クォータニオンを用いた方向でのカーソル操作 |
| 07 | 基準とマウント | Inverse3 | Python · C++ · C++ Glaze | configure.basis、configure.preset、実行時の configure.mount によるオーバーライド。プリセットとマウントの排他関係 |
| 08 | HTTP リモート設定 | Inverse3 | Python · C++ · C++ Glaze | HTTP専用のセッション横断コンフィギュレータ。プロファイルでセッションを検出し、REST経由でbasis / preset / mountに対して対話的にPOSTリクエストを送信する。 |
| 09 | WS リモートコントロール | Inverse3 | Python · C++ · C++ Glaze | リアルタイムのワークスペースナビゲーター:HTTP によるセッションおよびデバイスの検出後、WebSocket 経由でティックごとに set_transform をストリーミングする |
| 10 | イベント | — | Python · 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