マウントおよびワークスペースの変換
2つの変換が、アプリケーション空間におけるデバイスの位置を特定します。パイプラインを理解することで、適切な変換を選択するのに役立ちます。
座標パイプライン
| 段階 | 役割 | 設定方法 | 永続的に保存するかどうか |
|---|---|---|---|
| 基準座標系 | 軸を再マッピングします(例:Z軸上向き → Y軸上向き) | session.configure.basis — チュートリアル 08 (HTTPによるリモート設定) | はい |
| 単位変換 | デバイスの物理的な取り付けオフセット(アームの位置、回転、スケール) | configure.mount または configure.preset — チュートリアル 08 (HTTPによるリモート設定) | はい |
| ワークスペースの変換 | カメラ/シーンの移動に伴うドリフト | commands.set_transform — チュートリアル 09 (WebSocketによるティックごとのストリーミング) | はい(値を保持) |
単位変換
マウントとは、デバイスが物理的に設置されている位置を指します。つまり、アームのオフセット、 向き、スケールが含まれます。一度設定されると(あるいはユーザーが物理的な設置構成を変更した際に設定されると)、 実行時にはほとんど更新されません。
プリセット(工場出荷時の設定)
マウントを直接計算する代わりに、名前が指定されたプリセットを選択してください:
| プリセット | 原点配置 | がんの方向 |
|---|---|---|
defaults | デバイスベース | 前面(腕の前面) |
arm_front | デバイスベース | 前方 |
arm_front_centered | ワークスペース中心 | 前方 |
led_front | デバイスベース | LEDの側面(前方) |
led_front_centered | ワークスペース中心 | LEDの側面(前方) |
custom | 手動 — マウントを直接設定する | — |
プリセットを使用すると、マウント、基準座標系、ワークスペースの原点を一度に設定できます。
マウントの直接設定
- WebSocket
- HTTP
{
"inverse3": [{
"device_id": "049D",
"configure": {
"mount": {
"transform": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"rotation": { "x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0 },
"scale": { "x": 1.0, "y": 1.0, "z": 1.0 }
}
}
}
}]
}
curl -X POST "http://localhost:10001/inverse3/049D/config/mount?session=:0" \
-H "Content-Type: application/json" \
-d '{"transform":{"position":{"x":0,"y":0,"z":0},"rotation":{"w":1,"x":0,"y":0,"z":0},"scale":{"x":1,"y":1,"z":1}}}'
mountわあ presetは互いに排他的です同じメッセージに両方を送信すると意味が曖昧になるため、サービスはこれを拒否します。
次のいずれかを選択してください:名前付き preset(マウントを自動的に設定する)または明示的な
mount 変換。
マウントを 送信 「때」は変換で囲む必要があります: { "mount": { "transform": { … } } }.
スナップショットからマウントを 読む これは、覆いのない平らな構造です: { "mount": { "position": …, "rotation": …, "scale": … } }.
これは意図された設計です。コマンドは統合された command_data ラッパーを使用し、スナップショットは core::transformを直接シリアライズするためです。
ワークスペースの変換
ワークスペース変換は、マウントに対して適用されるランタイムドリフトです。 一般的なユースケースはシーンのナビゲーションです。つまり、デバイスを物理的にその場に置いたまま、アプリケーションのビューをパン、回転、またはズームイン/ズームアウトさせることです。
マウントとワークスペースの変換は、いずれも永続的です。サービスは最後に送信された値を記憶します。両者の違いは、用途とパフォーマンスにあります:
- マウントは、一度設定すればそのまま維持されるように設計されています。物理的なインストール構成を表しており、更新頻度が低いように最適化されています。
- ワークスペースの変換は、高い頻度でストリーミングされるように設計されています(例:カメラのパン操作中の各フレーム)。内部パイプラインは、この更新サイクルに合わせて最適化されています。
- WebSocket
- HTTP
{
"inverse3": [{
"device_id": "049D",
"commands": {
"set_transform": {
"transform": {
"position": { "x": 1.0, "y": 0.0, "z": 0.0 },
"rotation": { "x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0 },
"scale": { "x": 1.0, "y": 1.0, "z": 1.0 }
}
}
}
}]
}
curl -X POST "http://localhost:10001/inverse3/049D/state/transform?session=:0" \
-H "Content-Type: application/json" \
-d '{"transform":{"position":{"x":1,"y":0,"z":0},"rotation":{"w":1,"x":0,"y":0,"z":0},"scale":{"x":1,"y":1,"z":1}}}'
GETは現在の変換を返し、 DELETEを恒等変換(identity)にリセットします。
マウントまたはワークスペースのスケールを変更すると、デバイスがレンダリングする力が変化します。これは、スケールが接触力の計算に使用される**貫入深度(penetration depth)**に影響を与えるためです。例えば、 2x スケールを適用すると、貫通深度がおよそ半分になります(デバイスの移動範囲に比べて仮想シーンが2倍の大きさになるためです)。したがって、結果として生じる力は 1xそこで感じる力の概算 半分です。逆に 0.5x スケールは力をおよそ2倍にします。
これは通常、意図した動作です。ハプティックシーンを縮小すると、接触が自然に弱まり(「より遠くにある」状態になります)、拡大すると接触が強くなります。ユーザーが拡大・縮小している間、剛性を一定に保つ必要があるなど、意図した動作ではない場合は、力のゲインを逆方向にスケーリングして補正してください。
連続的な移動(バブルナビゲーション、速度制御ドリフト)が必要な場合は、ティックごとに set_transform手動でストリーミングする代わりに ナビゲーションモジュールを使用してください。このモジュールが、物理演算、ハプティックフィードバック、ワークスペース境界の処理を代行します。