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
制御
- Python
- C++
ボタンを長押しすると、連続して移動します。ボタンを離すと停止します。
| 味 | アクション |
|---|---|
→ / ← | +X / −X |
↑ / ↓ | +Y / −Y |
Page Up / Page Down | +Z / −Z |
= / - | 航行速度を上げる/下げる |
0 | ワークスペースを初期状態にリセットする |
H | ヘルプを表示 |
Esc | 終了 (Ctrl+C (これも機能します) |
行ベース — コマンドを入力し、その後ENTERキーを押してください。
| コマンド | アクション |
|---|---|
x+[N] / x-[N] | X軸の速度を±N mm/フレームに設定(数値を指定せずに使用した場合) x+ (現在の標準速度) |
y+[N] / y-[N] | Y方向の速度を±N mm/フレームに設定する |
z+[N] / z-[N] | Z軸速度を±N mm/フレームに設定する |
s+[N] / s-[N] | 標準速度を±N mm/フレームの範囲で調整する |
stop | すべての速度をゼロに設定する |
reset | 速度をゼロに設定し、原点に戻る |
h | ヘルプを表示 |
Ctrl+C(またはCtrl+D/EOF)を押して、プログラムを終了してください。
仕組み
ステップ 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
};
出典
チュートリアル 09 は SDK とともにローカルにインストールされます。以下の場所にあります。 tutorials/09-haply-inverse-ws-remote-control/ サービスのインストールディレクトリ内。
関連トピック: コマンド set_transform ・ セッション — 最初のメッセージによる握手 ・ マウントとワークスペース ・ セレクター ・ チュートリアル 08 — HTTP によるリモート設定 ・ チュートリアル 07 — ベースとマウント