本文へスキップ

02. VerseGrip 出力

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

学習内容:

  • ステートフレームで quaternion 方向の読み方
  • クォータニオンを度単位のZ-X-Yオイラー角に変換する(+Xは右、+Yは前、+Zは上)
  • probe_orientationを単独オブザーバー用のキープアライブとして使用する
  • 最初のメッセージでのみ送信されるハンドシェイクパターン(チュートリアル01と同じ)

ワークフロー​

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

パラメータ​

名前デフォルト値用途
URIws://localhost:10001シミュレーションチャンネルのWebSocket URL
PRINT_EVERY_MS100コンソール出力のスロットリング
セッションプロファイル名co.haply.inverse.tutorials:print-verse-gripHaply Hubでこのシミュレーションを特定する
オイラーの規約

変換はアプリケーションフレーム +X right, +Y forward, +Z upこれは、内在的(intrinsic)Z-X-Y(ヨー→ピッチ→ロール)方式です。 glm::eulerAnglesは使用しないでください。 この関数は別の規約に従っているため、ここでは正しく読み取られません。3つの言語バージョンすべてで同じ数式が実装されているため、数式についてはソースコードを参照してください。

probe_orientation実際にそれが必要な場合

probe_orientationそのセッションはInverse3にコマンドを 送信しない この機能は特定の状況でのみ役立ちます。Inverse3 (力、位置、トルクなど)にコマンドを送信した瞬間、サービスはペアリングされたVerseGripの方向情報をすべての状態フレームに自動的にストリーミングするため、プローブは不要です。 probe_orientationこのツールは、本チュートリアルのような単独のグリップモニタリングツールでのみ使用してください。

読み取り状態フィールド​

data.verse_grip[0].state以下より引用:

  • orientation — quaternion (w, x, y, z)
  • hall — 整数型のホールセンサーの値
  • button — ブリアン
  • transform.rotation — ワークスペースの回転(quaternion). 方向専用デバイスでは、位置とスケールが対応しないため、絶対値は出力されません。
「部分的な更新」の意味

transform.rotation銀の恒等クォータニオン {w:1,x:0,y:0,z:0}の場合、省略されます。読み込む際は、デフォルト値を指定してください。常に値を取得するには、 serialization/explicit_fieldsを有効にしてください。

送信 / 受信​

WebSocket ループ:ステータスフレームを受信し、ハンドシェイクと probe_orientation キープアライブを設定して再送信します。最初の送信メッセージにはセッションプロファイルが含まれており、それ以降のすべてのフレームにはキープアライブのみが含まれます。

単一の非同期ループ — recv() → コマンド構成 → 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)​

Pythonのこのバリエーションは、チュートリアル01と同じ2つのフラグをサポートしています:

  • --full — 一行の要約の代わりに、生のJSONペイロードを見やすく表示します。
  • --query-config — すべてのティックごとに session.force_render_full_stateを再度注入することで、各フレームが状態のデルタのみを伝達する代わりに config ブロック(デバイスタイプ、ファームウェア、マウント変換など)を含めるようにします。設定の変更をリアルタイムでデバッグする際に役立ちます。

この2つのフラグは併用可能です。C++版にはこのフラグは用意されていません。

SDKインストーラーに同梱されています

チュートリアル 02 も SDK とともにローカルにインストールされています — サービスのインストールディレクトリ内の tutorials/02-haply-inverse-print-verse-grip/で確認できます。

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

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