インストールとワークスペースの変換
アプリケーション空間内でデバイスの位置を特定するために、2種類の変換が使用されます。 処理プロセス全体を理解することで、適切な変換を選択しやすくなります。
座標処理の流れ
| 段階 | 作用 | 設定方法 | 永続化されるか? |
|---|---|---|---|
| 基準 | 座標軸の再マッピング(例:Z-up → Y-up) | session.configure.basis — 参照 チュートリアル 08(HTTP リモート設定) | はい |
| 変換のインストール | デバイスの物理的な設置位置のずれ(アームの位置、回転、ズーム) | configure.mount あるいは configure.preset — 参照 チュートリアル 08(HTTP リモート設定) | はい |
| ワークスペース変換 | カメラ/シーンナビゲーションのドリフト | commands.set_transform — 参照 チュートリアル 09(WebSocket による周期ごとのストリーミング) | はい(永続保存) |
変換のインストール
配置とは、物理空間におけるデバイスの実際の位置(アームのオフセット、 向き、拡大率など)を指します。通常、設定は1回だけ行われ(あるいはユーザーが物理的な設定を変更した際にのみ行われ)、実行時にはほとんど更新されません。
プリセット(工場出荷時の設定)
インストールパラメータを自分で計算する必要はなく、名前付きのプリセットを1つ選択するだけで済みます:
| プリセット | 原点位置 | 腕の方向 |
|---|---|---|
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。
ワークスペース変換
ワークスペース変換とは、設置変換の上に重ねられる実行時の変位です。 その代表的な用途はシーンナビゲーションであり、デバイスの物理的な位置が変化しない状態で、アプリケーションのビューを平行移動、回転、または拡大・縮小するものです。
変換のインストールとワークスペースの変換はどちらも永続化されます。つまり、サービスはユーザーが最後に送信した値を記憶します。両者の違いは、用途とパフォーマンスにあります:
- 設置変換の設定は、一度設定すれば変更されないよう設計されています。これは物理的な設置状況を反映しており、更新頻度が低い場合に最適化されています。
- ワークスペース変換は、高頻度でのストリーム送信(例えば、カメラナビゲーション中に1フレームごとに送信するなど)を想定して設計されており、その内部パイプラインはこの更新頻度に最適化されています。
- 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 単位変換にリセットします。
インストールやワークスペースのズーム操作を行うと、デバイスのレンダリングされる力が変化します。これは、ズーム操作が接触力の計算に使用される貫通深度。例えば、2x ズームを行うと、透過深度はおよそ半分になります(デバイスのストロークに対して、仮想シーンの大きさが2倍になるため)。したがって、得られる力はおよそ 1x 時の半分。逆に、0.5x 拡大・縮小すると、力はおよそ2倍になる。
これは通常、まさに意図した動作です。触覚シーンでビューを縮小すると、接触の強さが自然に弱まり(いわば「距離が遠くなる」状態)、逆にビューを拡大すると接触が強くなります。もしこれが意図した効果ではない場合――例えば、ユーザーがズームしても剛性を一定に保ちたい場合など――は、ズーム力ゲインを逆方向に調整することで補正することができます。
連続的な移動(バブルナビゲーション、速度制御によるドリフト)が必要な場合は、
以下をご利用ください。ナビゲーションモジュール,すべての周期ごとに手動でストリーム送信するのではなく set_transform——物理演算、触覚フィードバック、作業領域の境界設定を自動的に処理します。