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

02. ヴァースグリップの印刷

最初の有線VerseGripからの姿勢(クォータニオン+Z-X-Yオイラー角)、ホールセンサーのレベル、およびボタンの状態をストリーミングします。

学習内容:

  • 読書 quaternion 状態フレームからの向き
  • 四元数を度単位のZ-X-Yオイラー角(+Xが右、+Yが前方、+Zが上)に変換する
  • 使用して probe_orientation スタンドアロン・オブザーバーとしてのキープアライブ
  • 「ファーストメッセージのみ」のハンドシェイクパターン(チュートリアル01と同じ)

ワークフロー

  1. WebSocketを開く ws://localhost:10001 そして、最初のステートフレームを待ちます。
  2. 最初の有線VerseGripを選んでください device_id ~より verse_grip 配列。
  3. 以下の内容でリクエストを作成します セッションプロファイル およびデバイスごとの probe_orientation keepalive(ステートフレーム内でグリップの向きを維持する、空のオブジェクト用コマンド)。
  4. リクエストを送信した後、 session フィールド — これはワンショットのハンドシェイクです。
  5. 以降のすべてのフレームで、クォータニオンをオイラー角に変換し、スロットリングされたテレメトリを出力する。各ティックごとにキープアライブを再送信する。

パラメータ

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

この変換は、アプリケーション座標系における固有のZ-X-Y変換(ヨー→ピッチ→ロール)です +X right, +Y forward, +Z up. しないでください 使用 glm::eulerAngles — これは異なる規約に従っているため、ここでは正しく表示されません。3つの言語バリエーションはすべて同じ数学的処理を実装しています。数式の詳細はソースコードを参照してください。

いつ probe_orientation 実際に必要なのか

probe_orientation セッションが有効な場合にのみ役立ちます ~ない Inverse3任意のコマンドを送信します。Inverse3 力、位置、トルクなど)を送信すると、サービスはペアリングされたVerseGripの向きをすべての状態フレームで自動的にストリーミングします。プローブは不要です。使用方法 probe_orientation このチュートリアルのような、スタンドアロンのグリップ監視ツールにのみ適用されます。

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

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

  • orientationquaternion (w, x, y, z)
  • hall — ホールセンサーの整数値
  • button — ブール値

送信/受信

WebSocketのループ:ステートフレームを受信し、ハンドシェイクを構築して返信する + probe_orientation キープアライブ。最初の送信メッセージにはセッションプロファイルが含まれますが、それ以降のフレームにはキープアライブのみが含まれます。

単一の非同期ループ — 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["verse_grip"][0]["device_id"]
request_msg = {
"session": {"configure": {"profile": {
"name": "co.haply.inverse.tutorials:print-verse-grip"}}},
"verse_grip": [{
"device_id": device_id,
"commands": {"probe_orientation": {}} # empty — keepalive
}]
}

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

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

関連: 型(クォータニオン)制御コマンド (probe_orientation)WebSocketプロトコルチュートリアル 03(ワイヤレス VG)