メインコンテンツへ移動

02. ヴェルセグリップの表示

初代有線VerseGripからの姿勢(クォータニオン+オイラー角 Z-X-Y)、ホールセンサーのレベル、およびボタンの状態を継続的に表示します。

このコースで学べる内容:

  • ガイダンスを読む quaternion 状態トレースに基づいて
  • クォータニオンを、度単位のZ-X-Yオイラー角に変換する(+Xが右、+Yが前方、+Zが上方)
  • 利用 probe_orientation 自律型観測者の維持を示すシグナルとして
  • 最初のメッセージでのみ送信される握手モデル(チュートリアル01のものと同じ)

進行​

  1. WebSocket接続を以下に向けて確立してください ws://localhost:10001 そして、最初のステータスフレームを待ちます。
  2. [選択] device_id 表内の最初の有線VerseGrip verse_grip.
  3. 以下のを使用してクエリを作成してください セッションプロファイル およびホールド信号 probe_orientation par appareil(状態フレーム内でハンドルの向きフローを維持する、空のオブジェクトに対するコマンド)。
  4. リクエストを送信してから、そのフィールドを削除してください session : これはその場限りの握手です。
  5. 次のフレームごとに、クォータニオンをオイラー角に変換し、テレメトリを制限されたレートで表示してください。各サイクルごとにホールド信号を返してください。

パラメータ​

ノムデフォルト値役割
URIws://localhost:10001WebSocket シミュレーションチャネルの URL
PRINT_EVERY_MS100コンソール表示の更新レートの上限
セッションプロファイル名co.haply.inverse.tutorials:print-verse-gripHaply Hub でこのシミュレーションを特定してください
オイラーの公約法

変換とは、写像座標系におけるZ-X-Y方向の内回転(横揺れ→ピッチ→ロール)である。 +X right, +Y forward, +Z up. 使用しないでください glm::eulerAngles : この関数は別の規約に従っているため、ここでは誤った値を返すことになります。3つの言語バリエーションはいずれも同じ計算を実装しています。計算式についてはソースコードを参照してください。

Quand probe_orientation 本当に必要なのか

probe_orientation セッションが有効な場合にのみ有効です 一切送信しない Inverse3 へのコマンド。Inverse3 (力、位置、トルクなど)をコマンドすると、サービスは関連するVerseGripの向きを各ステータスフレームで自動的に配信します。保持信号は必要ありません。使用方法: probe_orientation このチュートリアルのように、スタンドアロンのハンドル追跡ツールにのみ適用されます。

よく読まれている記事​

以来 data.verse_grip[0].state :

  • orientation — quaternion (w, x, y, z)
  • hall — ホール効果センサーの整数値
  • button — booléen
  • 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 — réinjecte 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)