メインコンテンツへ移動

07. 基礎と設置:試験場

インタラクティブに操作して 編集の変換 本機の機能について説明し、その方法を示しています configure.basis, configure.preset et configure.mount プロトコルレベルで連携して動作します。インタラクティブな注目点が設定コマンド上に留まるよう、水平方向の背景を固定します。

学習内容:

  • 定義する 基本順列 ("XZY" → Y軸が上向きになるように配置された目印)
  • 選ぶ プリセット (arm_front) そして、それがどのような設定を行うのかを理解する
  • 実行時のモンタージュを、(キーボード操作による)回転クォータニオンに置き換える
  • 相互排他性の法則: mount et preset は、同じブロック内で共存することはできません。 デバイスの設定
  • 『』の点在的意味論 configure : キーを押すたびに、設定メッセージが正確に1つ送信されます
  • (C++ Glaze) 相互排他的なフィールドのモデル化 std::optional

ワークフロー​

  1. 最初のメッセージが届いたら、それを送信してください セッションプロファイル, configure.basis: "XZY" et configure.preset: arm_front. 送信を開始してください set_cursor_force 固定床用。
  2. 各サイクルごとに:カーソルのY座標を読み取り、計算する force_y = max(0, (floor_pos - y) * stiffness) そして、それを送信してください。
  3. ユーザーがマウントの回転ボタンを押した際、以下を設定してください pending_configure = true.
  4. 次のサイクル:ブロックを作成してください configure.mount その変容を伴って rotation はユニタリ四元数です(現在のピッチ/ヨー角のZ成分とX成分の合成)。省略してください preset — プロトコルの観点からは、この2つは互いに排他的である。
  5. リセットボタン(R) は置換を元に戻します。以下の設定は、次と同じ効果になります。 preset.

パラメータ​

ノムデフォルト役割
BASIS"XZY"軸の並置— Y軸が上を向く座標系
DEVICE_PRESET / DEVICE_CONFIG_PRESET"arm_front"「プリセット名」— 機器のベースにある原点
FLOOR_POS_Y0.0 m固定平面図(アプリの「Y」軸)
STIFFNESS1000 単位なし地盤の剛性定数
MOUNT_STEP_DEG10°キー操作による回転
PRINT_EVERY_MS200テレメトリのデータ転送速度の制限

コマンド​

その通りアクション
W / S装置の+X軸を中心に、マウントを±10°回転させる(ピッチ)
A / D装置の+Z軸を中心に、マウントを±10°回転させる(ヨー)
Rマウントをリセット — プリセットに戻す
H注文を表示する
Q負け犬
mount et preset 互いに排他的である

このサービスは、あるブロックを拒否します。 デバイスの設定 その両方が含まれています。ユーザーがマウントを置き換えると、チュートリアルではその部分が省略されます preset 以下の各設定について。を押してください R 反応性 preset 以下の設定を行い、削除します mount.

さまざまな入力形式

C++ 版は、バックグラウンドの stdin スレッドから入力を行単位で読み込みます(各文字を入力するたびに Enter キーを押してください)。Python 版は、パッケージ keyboard メインの非同期ループ内でのキー入力のリアルタイム検出用 — ENTERキーは不要です。同じキー、同じコマンドです。

よく読まれている記事​

「~から」 data.inverse3[i].state :

  • cursor_position.y — vec3、地中への浸透深度を算出するために用いられる
  • current_cursor_force — テレメトリ用に報告済み

送信/受信​

ペイロードの構造はすべてのバリエーションで同じですが、顕著な違いは、各バリエーションが相互排他的な分岐をどのように構築するかという点にあります。 mount / preset そして、入力線がWebSocket線をどのように示すか。

パケットを介したリアルタイムのキースキャン機能を備えた、独自の非同期ループ keyboard. pending_configure これは、キーハンドラによって定義されるグローバルな指標であり、ブロックが実行されるたびにリセットされます。 configure 送信されます。

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["inverse3"][0]["device_id"]
# Handshake: profile + basis + preset
request_msg = {
"session": {"configure": {"profile": {"name": SLUG}}},
"inverse3": [{
"device_id": device_id,
"configure": build_configure_block(first_handshake=True),
# -> {"basis": {"permutation": "XZY"},
# "preset": {"preset": "arm_front"}}
}],
}
else:
handle_key_inputs() # may set pending_configure = True (classic, not shown)

y = data["inverse3"][0]["state"]["cursor_position"]["y"]
force_y = 0.0 if y > FLOOR_POS_Y else (FLOOR_POS_Y - y) * STIFFNESS

entry = {
"device_id": device_id,
"commands": {"set_cursor_force":
{"vector": {"x": 0.0, "y": force_y, "z": 0.0}}},
}
if pending_configure:
entry["configure"] = build_configure_block(first_handshake=False)
# -> {"mount": {...}} OR {"preset": {...}} (never both)
pending_configure = False

request_msg = {"inverse3": [entry]}

await websocket.send(json.dumps(request_msg))
SDKのインストーラーに同梱されています

チュートリアル 07 も SDK とともにローカルにインストールされています。詳しくは tutorials/07-haply-inverse-basis-and-mount/ サービスのインストールディレクトリ内。

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

関連項目: 基本順列 ・ 組立と作業スペース ・ デバイスの設定 ・ 制御コマンド (set_cursor_force) ・ 型(変換) ・ チュートリアル 04(Hello Floor)