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

04. ハロー・ボーデン

最初の触覚効果:カーソルがその中に入ると反発する、仮想の水平な床です。その力は単純なペナルティスプリング(stiffness × penetration_depth), Z軸に沿って set_cursor_force 適用される。

学習内容:

  • の使用 set_cursor_force、ペナルティのバネ力を適用するために
  • 読み出し cursor_position およびリアルタイムでの力の計算
  • (Python) の設定 ワークスペース用プリセット (arm_front_centered)、これにより、原点が作業領域の中央に位置することになる
  • (Python) パッケージを介して、キーボード操作で床の高さと剛性をインタラクティブに微調整する keyboard

手順​

  1. WebSocket接続を ws://localhost:10001 そして、最初のステータスフレームが表示されるのを待ってください。
  2. 最初のフレームで、以下の内容を登録してください。 セッション概要. Python版では、さらに以下を送信します configure.preset: arm_front_centered、これにより原点が作業領域の中央に位置するようになります。C++のバリエーションでは、デバイス上で既に有効になっている設定が使用されます。
  3. 各フレームごとに、以下を読み取ります cursor_position.z aus、計算する force_z = max(0, (floor_pos - z) * stiffness) そして、その結果をコマンドとして送信する set_cursor_force 戻る。
  4. 以降のティックでは、パワーコマンドのみが送信されます。セッションプロファイルは1回限りのハンドシェイクです。
  5. (Python) さらに、各ティックごとにキーボードの矢印キーの入力を確認し、 floor_pos / stiffness リアルタイムで更新されます。

パラメータ​

名称標準Zweck
floor_pos0.10 m仮想床面のZ座標
stiffness1000 単位なしフェダー定数(1 mmの貫入深度 → 1 N)
PRINT_EVERY_MS100~200テレメトリの制限
セッションプロファイル名co.haply.inverse.tutorials:hello-floorHaply Hubでこのシミュレーションをマークする
インタラクティブ(Pythonのみ)

Python版では、以下のパッケージを使用しています keyboard (Linuxでは、より高い権限が必要です):

  • ↑ / ↓ — 床面の高さを上げる/下げる
  • ← / → — 剛性を下げる/上げる
  • R — デフォルト設定に戻す
力の拡大

Dienst-Tick では、力は加算されます。つまり、すべての発生源からの力が合計されてから、デバイスに送信されます。このようなチュートリアルは、他の力の発生源と並存することができ、どちらかがもう一方を妨げることはありません。

読み込まれた状態フィールド​

Aus data.inverse3[i].state:

  • cursor_position.z — vec3, は浸透深さの計算に使用される
  • current_cursor_force — テレメトリとして報告される

送信/受信​

各ティックごとに:カーソルのZ値を読み取り、 force_z = max(0, (floor_pos - z) * stiffness) 計算して、コマンドを set_cursor_force 送信。最初の送信メッセージには、セッションプロファイル(すべてのバリエーション)に加え、Pythonの場合はさらに configure.preset: arm_front_centered.

たった1つの非同期ループ。最初のフレームでのハンドシェイクにはプロファイルと configure.preset, したがって floor_pos = 0.1 作業領域の中心の座標と一致する。

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 + preset (one-shot)
request_msg = {
"session": {"configure": {"profile": {"name": "co.haply.inverse.tutorials:hello-floor"}}},
"inverse3": [{
"device_id": device_id,
"configure": {"preset": {"preset": "arm_front_centered"}}
}]
}
else:
# Per tick: compute force along Z, send set_cursor_force
z = data["inverse3"][0]["state"]["cursor_position"]["z"]
force_z = 0.0 if z > floor_pos else (floor_pos - z) * stiffness
request_msg = {
"inverse3": [{
"device_id": device_id,
"commands": {"set_cursor_force":
{"vector": {"x": 0.0, "y": 0.0, "z": force_z}}}
}]
}

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

また、チュートリアル 04 は SDK とともにローカルにインストールされます。以下の場所にあります。 tutorials/04-haply-inverse-hello-floor/ サービスのインストールディレクトリ内。

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

関連トピック: ステューアコマンド (set_cursor_force) ・ モンタージュと作業領域(プリセット) ・ 型 (vec3) ・ 会議 ・ チュートリアル 07(ベースとモンタージュ)