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

03. ワイヤレス・バースグリップの印刷

チュートリアル02と同じパターンですが、Wireless VerseGrip用です。ストリーミングされるステータスにボタン(A/B/C)とバッテリー残量を追加します。

学習内容:

  • ワイヤレス固有の状態フィールドの読み取り: buttons.{a,b,c}, battery_level, hall
  • 使用して probe_orientation スタンドアロン・オブザーバーとしてのキープアライブ
  • チュートリアル02と同じ「初回メッセージのみ」のハンドシェイクパターン

ワークフロー

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

パラメータ

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

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

いつ probe_orientation 実際に必要なのか

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

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

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

  • orientationquaternion (w, x, y, z)
  • hall — ホールセンサーの整数値
  • buttons.a, buttons.b, buttons.c — ブール値
  • battery_level — 浮動小数点数 (0.0 ~ 1.0)

送信/受信

同じ形 チュートリアル 02、ただ単に wireless_verse_grip デバイス配列。WebSocketループはステートフレームを受信し、ハンドシェイク+ probe_orientation キープアライブ;最初の送信メッセージにはセッションプロファイルが含まれ、それ以降のフレームにはキープアライブのみが含まれる。

単一の非同期ループ。

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["wireless_verse_grip"][0]["device_id"]
request_msg = {
"session": {"configure": {"profile": {
"name": "co.haply.inverse.tutorials:print-wireless-verse-grip"}}},
"wireless_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

関連: チュートリアル 02(有線版)型(クォータニオン)制御コマンド (probe_orientation)WebSocketプロトコル