本文へスキップ
バージョン: 3.5.x

01.Inverse3印刷

シミュレーションのWebSocketに接続し、Inverse3 報告するInverse3 、カーソルの位置、速度、および力をストリーミングします。

学習内容:

  • WebSocket接続を開き、初期のフルステートメッセージを受信する
  • ゼロフォースを送信する set_cursor_force キープアライブでセッションを維持する
  • Haply シミュレーションを認識できるように、セッションプロファイルを登録する
  • 「初回メッセージのみ」のハンドシェイクパターン — 初回送信後にセッションの削除および設定を行う
  • コンソールの出力を読みやすい速度に調整する

ワークフロー

  1. WebSocketを開く ws://localhost:10001. このサービスは直ちに フルステート・フレーム 接続されたデバイスの一覧表示。
  2. 最初のフレームでは、最初のInverse3を選択してください device_id そして、2つの部分からなるリクエストメッセージを作成します:
    • session.configure.profile.name — シミュレーションを登録します Haply.
    • デバイスごとの set_cursor_force ゼロベクトルを伴うコマンド。このサービスはこれをキープアライブとして利用しており、コマンドが到着し続ける限り、状態フレームを送信し続けます。
  3. そのメッセージを返信してください。 の皮をむく session フィールド 次のティックまで — セッションプロファイルはワンショットのハンドシェイクであり、その後のティックではコマンドのみが送信されます。
  4. その後の各状態フレーム:カーソルを表示する vec3 (位置、速度、力)の各フィールドを約10 Hzにサンプリングレート制限し、ゼロ力キープアライブを再送信する。

パラメータ

名称デフォルト目的
URIws://localhost:10001シミュレーションチャンネルのWebSocket URL
PRINT_EVERY_MS100コンソール出力スロットル
セッションプロファイル名co.haply.inverse.tutorials:print-inverse3Haply 上でこのシミュレーションを特定します

状態フィールドを読み取る

差出人 data.inverse3[0].state:

  • cursor_position, cursor_velocity, current_cursor_forcevec3 それぞれ

送信/受信

WebSocketのループ:ステートフレームを受信し、 コマンドフレーム. 最初のコマンドフレームには、セッションハンドシェイクとゼロフォースが含まれる set_cursor_force keepalive; それ以降の各フレームには ただ キープアライブ(セッション情報は削除されます)。

単一の非同期ループ — recv() → build コマンド → send() → 繰り返す。

async with websockets.connect(URI) as websocket:
while True:
msg = await websocket.recv()
data = json.loads(msg)

if first_message:
first_message = False
device_id = data["inverse3"][0]["device_id"]
request_msg = {
"session": {"configure": {"profile": {
"name": "co.haply.inverse.tutorials:print-inverse3"}}},
"inverse3": [{
"device_id": device_id,
"commands": {"set_cursor_force":
{"vector": {"x": 0.0, "y": 0.0, "z": 0.0}}},
}]
}

await websocket.send(json.dumps(request_msg))
request_msg.pop("session", None) # one-shot handshake

出典: Python·C++·C++ Glaze

関連: WebSocketプロトコル制御コマンド (set_cursor_force)セッション型 (vec3)