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

02. VerseGripの印刷

最初の有線VerseGripから、姿勢(四元数+Z-X-Yオイラー角)、ホールセンサーの電圧レベル、およびボタン状態をリアルタイムで出力します。

学習内容:

  • ステートフレームから読み込む quaternion 姿勢
  • 四元数を、度単位の Z-X-Y オイラー角に変換する(+X が右、+Y が前、+Z が上)
  • 将 probe_orientation 独立オブザーバーとして機能するための生存維持コマンド
  • 最初のメッセージのみハンドシェイクが必要なモード(チュートリアル01と同じ)

ワークフロー​

  1. [リンク先]を開く ws://localhost:10001 WebSocket を確立し、最初のステータスフレームを待ちます。
  2. から verse_grip 配列の中から、最初に現れる有線VerseGripを device_id。
  3. 使用 会話構成 また、各デバイスごとに probe_orientation 保活コマンドの構築リクエスト(これは空のオブジェクトコマンドであり、保持姿勢データがステートフレームに継続して表示されるようにするためのものです)。
  4. リクエストを送信してから、削除してください session フィールド――これは1回限りのハンドシェイクにのみ使用されます。
  5. その後、各フレームごとに四元数をオイラー角に変換し、スロットリング方式でテレメトリデータを出力します。各サイクルごとに、接続維持コマンドを再送信します。

パラメータ​

名称デフォルト値用途
URIws://localhost:10001WebSocket チャネルの URL
PRINT_EVERY_MS100コンソールの出力間隔
セッション構成名co.haply.inverse.tutorials:print-verse-gripHaply Hub において、今回のシミュレーションを識別するために使用されます
オイラー角の定義

変換にはアプリケーション座標系を使用する +X right, +Y forward, +Z up Z-X-Y(ヨー → ピッチ → ロール)の順で内旋する。しないでください使用 glm::eulerAngles——これは異なる規約に従っているため、ここでは誤った結果が読み取られてしまいます。3つの言語版では同じ数学計算が実装されています。具体的な数式については、ソースコードをご参照ください。

いつ必要か probe_orientation

セッションが未Inverse3 にコマンドを送信する際は、probe_orientation そうして初めて意味があります。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 — 1行の要約ではなく、元の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(ワイヤレス VG)