メインコンテンツへスキップ

09. WebSocket ワークスペース・ナビゲーター

[ナビゲート] デバイスのワークスペース位置(リアルタイム)、以下の手順で set_transform- WebSocketチャネルを介してコマンドをストリーミングする。このチュートリアルでは、HTTPを使用してセッションとデバイスを特定しています(まさに チュートリアル 08)、その後、WebSocket接続を開き、ティックごとにポジションの更新情報を送信します。

これは、2つの変換操作の違いを具体的に示しています:

操作チュートリアル代表的な用途
configure.mount — 持続的なマウント変換08機器の物理的な組み立てについて説明するために、一度(あるいはごくまれに)使用する
set_transform — 持続的なワークスペース変換09(この)これも永続的ですが、ワークスペースでのリアルタイムナビゲーション用に、各ティックごとにストリーミングすることができます。

どちらのコマンドもHTTPおよびWebSocket経由で利用可能であり、どちらも 持続的な — このサービスは、最後に送信された値を記憶します。違いは、その目的と更新頻度にあります: configure.mount まれな更新(物理的な設定)に最適化されている一方、 set_transform 高頻度ストリーミング(シーンナビゲーション)向けに最適化されています。

「Verwenden Sie」を使用してください set_transform、ワークスペースの原点が、実行時に変化するサイズ(例えば、手や、アニメーション化された手続き型オフセット、あるいは仮想ワークスペースをリアルタイムで移動させる操作者など)に追従する必要がある場合。

「マウント」と「ワークスペース」は階層的に関連付けられています

それ自体としては、一見すると configure.mount und set_transform 同じ効果を生み出すが、それらは 階層的に関連付けられている: ワークスペース変換は、座標パイプライン内で auf den Mount が適用された (device → basis → mount → workspace → application). パイプラインの全容については、以下をご覧ください。 マウントとワークスペース.

ユースケース​

  • ワークスペース内のライブナビゲーション。ハプティックシーンを一時停止することなく、デバイスのカーソルワークスペース(エンドエフェクタが到達可能な範囲)を移動させることができます。
  • オペレーターによる位置合わせ。メインのハプティックアプリケーションの実行中に、別の端末で操作担当者が矢印キーを押し続けてワークスペースを移動させます。これは、セッション実行中に各ワークステーションでキャリブレーションを行う際に便利です。
  • ワークスペースの移動に関するプロシージャル処理。各ティックごとに純粋な位置変換パッチを送信することで、スクリプトからワークスペースの位置を制御します(オーディオ制御、物理演算ベースなど)。

前提条件​

チュートリアル09では、アクティブなWebSocketセッション、つまり、Inverse3 が実行中のハプティックループ内で既にアクティブになっているクライアントが必要です。チュートリアル09はこのセッションに接続し、そのワークスペースをリアルタイムで移動させます。

セッションを起動する最も手っ取り早い方法

Haply Hubを開き、Orb デモを起動してください。これにより、すぐに操作できる永続的なハプティック セッションが開始されます。

./09-haply-inverse-ws-remote-control --session co.haply.hub::demo-orb
python 09-haply-inverse-ws-remote-control.py --session "co.haply.hub::demo-orb"

「Orbシーン」は、ワークスペースの原点に球体をレンダリングします。チュートリアル09の手順に従ってワークスペースを移動すると、シーン全体がリアルタイムで移動するため、即座に視覚的なフィードバックを得ることができます。

触覚ループを実行する他のチュートリアル(01~07)も同様に動作します。ターミナルでそれらを起動し、その後、別のターミナルでチュートリアル09を起動して、セッションを対話モードで認識させてください。

使用方法​

# Discover session interactively, use first detected device
./09-haply-inverse-ws-remote-control
python 09-haply-inverse-ws-remote-control.py

# Target the Haply Hub Orb demo directly
./09-haply-inverse-ws-remote-control --session co.haply.hub::demo-orb
python 09-haply-inverse-ws-remote-control.py --session "co.haply.hub::demo-orb"

# Target a session directly, specify device
./09-haply-inverse-ws-remote-control --session :my_profile:0 --device A14
python 09-haply-inverse-ws-remote-control.py --session "#42" --device A14

制御​

ボタンを長押しすると、連続して移動します。ボタンを離すと停止します。

味アクション
→ / ←+X / −X
↑ / ↓+Y / −Y
Page Up / Page Down+Z / −Z
= / -航行速度を上げる/下げる
0ワークスペースを初期状態にリセットする
Hヘルプを表示
Esc終了 (Ctrl+C (これも機能します)

仕組み​

ステップ 1 — HTTP セッションおよびデバイスの識別​

このチュートリアルでは、同じ補助関数が使用されています discover_session() / discover_device() wie チュートリアル 08: GET /sessions (または GET /sessions/<selector> mit --session), その後 GET /devices (または直接 --device verwenden)。どちらの補助関数も、同じCLIフラグを受け付け、その内容は同一です。 SESSION_HELP-テキスト — チュートリアル00または08で紹介されたセレクタは、変更を加えることなくここで使用できます。

ステップ 2 — WebSocket セッション、最初のメッセージでのハンドシェイク​

このチュートリアルでは、WebSocket接続を ws://localhost:10001. ただし、その 最初に受信したメッセージ セッションプロファイルの登録を送信します:

{
"session": {"configure": {"profile": {"name": "co.haply.inverse.tutorials:ws-remote-control"}}},
"inverse3": [{"device_id": "...", "commands": {"set_transform": {"transform": {"position": {"x": 0, "y": 0, "z": 0}}}}}]
}

その後のティックは session weg — 送信されるのはコマンド配列のみです inverse3.

ステップ 3 — set_transform pro Tick​

set_transform 受け入れる 部分変換、また、変更したいフィールドのみです。このチュートリアルでは位置のみを送信します。回転と拡大縮小はセッションのデフォルト値(必要に応じて configure.mount (制定された)。

{
"inverse3": [{"device_id": "...", "commands": {"set_transform": {"transform": {"position": {"x": 0.02, "y": 0.0, "z": 0.01}}}}}]
}

ポジションはティックごとに累積されます。約1 kHzの周波数で、このサービスは set_transform 各ティックごとに再度設定される(ゼロオーダー・ホールド)ため、ワークスペースは最後に移動させた位置に留まります。

set_transform 対 configure.mount

どちらのコマンドも、セッションごとに1つの永続的な変換を保存します。ただし、ワークスペース変換はパイプライン内に auf dem Mount(参照 マウントとワークスペース). ソランジュ・チュートリアル09(各ティックごとに) set_transform ストリーミング中、新しいWebSocketフレームが送信されるたびに、以前にストリーミングされたワークスペース変換が上書きされます。別のクライアントが set_transform 同じデバイスがストリーミングを行っている場合、次のティックで上書きされます。 configure.mount これはそれとは無関係であり、その価値を維持します。実際には、要件ごとにチャネルを選択する必要があります。物理的な設定には「マウント」を、 set_transform ライブナビゲーション用。

スレッドモデル(C++)​

このC++チュートリアルでは、位置の累積値を共有する2つのスレッドを使用しています:

スレッドロール
メインスレッドLiest std::getline(std::cin, ...), トークンの解析、更新 nav_vel[] und default_step
WebSocketコールバックスレッドSchreibt nav_pos[] えーと nav_vel[] * dt 『フォート』、連載中 set_transform そして送信する

std::mutex nav_mutex 保護する nav_pos[], nav_vel[] und default_step. タイムスタンプ last_tick そしてその旗 first_ws_msg これらはWSコールバック内でローカルに実行されるため、ミューテックスは必要ありません。

ws.onmessage = [&](const std::string &) {
float pos_snap[3];
{
std::lock_guard<std::mutex> lk(nav_mutex);
for (int i = 0; i < 3; ++i) nav_pos[i] += nav_vel[i] * 0.001f; // mm/frame → m
for (int i = 0; i < 3; ++i) pos_snap[i] = nav_pos[i];
}
// build and send set_transform with pos_snap
};

出典​

SDKインストーラーに含まれています

チュートリアル 09 は SDK とともにローカルにインストールされます。以下の場所にあります。 tutorials/09-haply-inverse-ws-remote-control/ サービスのインストールディレクトリ内。

関連トピック: コマンド set_transform ・ セッション — 最初のメッセージによる握手 ・ マウントとワークスペース ・ セレクター ・ チュートリアル 08 — HTTP によるリモート設定 ・ チュートリアル 07 — ベースとマウント