HTTP
デフォルトでは、HTTP サービスは http://localhost:10001 で起動します。
ポート番号は、サービスの設定で変更できます。
概要
このセクションでは、サービスが公開している HTTP のルートについて説明します。
以下のすべてのルートは、デフォルトのベース URL http://localhost:10001 を前提としています。
標準レスポンスエンベロープ
すべてのエンドポイントは、次の2種類のエンベロープのいずれかを返します:
データなしレスポンス(変更系のみのエンドポイントで使用):
{ "ok": true }
{ "ok": false, "error": "reason string" }
データありレスポンス(GET のほか、適用された値を返す設定エンドポイントの POST/DELETE で使用):
{ "ok": true, "data": { "..." : "..." } }
{ "ok": false, "error": "reason string" }
デバイスセレクタの構文
デバイスレベルのルートは /{device_type}/{id_or_index}/... のパターンを使用します。{device_type} と {id_or_index} のパスセグメントで、対象のデバイスを指定します。
| 例のパスセグメント | 意味 |
|---|---|
inverse3/0 | インデックス(0始まり)で指定した最初の Inverse3 |
inverse3/A14 | デバイスID A14 の Inverse3 |
inverse3/* | すべての Inverse3 デバイス(ワイルドカード) |
verse_grip/0 | インデックスで指定した最初の Verse Grip |
wireless_verse_grip/* | すべての Wireless Verse Grip |
*inverse/* | Inverse ファミリーのすべてのデバイス(Inverse3、Inverse3x、Minverse) |
*verse_grip/* | Verse Grip ファミリーのすべてのデバイス(Verse Grip、Wireless VG) |
ワイルドカードの規則:
GETは、曖昧なセレクタやワイルドカードを含むセレクタを拒否します(400を返します)。POSTとDELETEはワイルドカードを受け付けます。操作は一致するすべてのデバイスに適用されます。
セッションセレクタ
セッションスコープのエンドポイント(basis、mount、preset、transform、filters)では、セッションを特定するために ?session=<expr> クエリパラメータが必要です。
| 式 | 意味 |
|---|---|
| (省略) | すべてのセッション(DELETE のみ) |
#123 または 123 | 数値ID 123 のセッション |
:-1 | インデックスによる最後のセッション |
:0 | インデックスによる最初のセッション |
例: GET /inverse3/0/config/basis?session=:0
バージョン
メソッド: GET
URL: http://localhost:10001/version
レスポンス例:
{
"build_time": "2024-08-07T16:01:53Z",
"git_branch": "main",
"git_describe": "3.5.0-2-gce34c39e",
"git_hash": "ce34c39e",
"git_tag": "3.5.0",
"project_name": "haply-inverse-service",
"project_version": "3.5.0"
}
Expert ステータス
メソッド: GET
URL: http://localhost:10001/expert/status
検出、デバイス、セッション、グローバル設定を含む詳細なステータス情報を返します。
デバイス
メソッド: GET
URL: http://localhost:10001/devices
config、state、status を含む、現在のデバイス一覧を返します。
必要に応じて ?session=<expr> を指定すると、スナップショットを特定のセッションの視点に絞り込めます(そのセッションの basis、mount、transform を返される値に適用します)。
レスポンス例:
{
"inverse3": [
{
"device_id": "04BA",
"config": { "...": "..." },
"state": { "...": "..." },
"status": { "...": "..." }
}
]
}
セッション
| メソッド | パス | 説明 |
|---|---|---|
| GET | /sessions | アクティブな v3.1 セッションをすべて一覧表示 |
| GET | /sessions/{session_id} | 単一のセッションを取得 |
| GET | /sessions/{session_id}/profile | セッションのプロファイル名を取得 |
| POST | /sessions/{session_id}/profile | セッションのプロファイルを設定 |
| DELETE | /sessions/{session_id}/profile | プロファイルを "default" にリセット |
POST /sessions/{session_id}/profile のボディ:
{
"name": "my_profile"
}
ポート
メソッド: POST
URL: http://localhost:10001/ports/{port}/reset
ブロックされたシリアルポートをクリアします。{ "ok": true } を返します。
デバイス設定
すべての設定エンドポイントは /{device_type}/{id_or_index}/config/{setting} のパターンを使用します。
セッションスコープのエンドポイント(basis、mount、preset)では、さらに ?session=<expr> クエリパラメータが必要です。
利き手(Inverse3 のみ)
| メソッド | パス | ボディ | レスポンス |
|---|---|---|---|
| GET | /{device_type}/{id}/config/handedness | -- | "left" または "right" |
| POST | /{device_type}/{id}/config/handedness | "left" または "right" | エコーされた値 |
| DELETE | /{device_type}/{id}/config/handedness | -- | "right"(デフォルト) |
トルクスケーリング(Inverse3 のみ)
| メソッド | パス | ボディ | レスポンス |
|---|---|---|---|
| GET | /{device_type}/{id}/config/torque_scaling | -- | { "enabled": bool } |
| POST | /{device_type}/{id}/config/torque_scaling | { "enabled": bool } | エコーされた値 |
| DELETE | /{device_type}/{id}/config/torque_scaling | -- | { "enabled": false } |
重力補償(Inverse3 のみ)
| メソッド | パス | ボディ | レスポンス |
|---|---|---|---|
| GET | /{device_type}/{id}/config/gravity_compensation | -- | { "enabled": bool, "scaling_factor": float } |
| POST | /{device_type}/{id}/config/gravity_compensation | { "enabled": bool, "scaling_factor": float } | エコーされた値 |
| DELETE | /{device_type}/{id}/config/gravity_compensation | -- | { "enabled": true, "scaling_factor": 1.0 } |
Basis(すべてのデバイス、セッションスコープ)
| メソッド | パス | ボディ | レスポンス |
|---|---|---|---|
| GET | /{device_type}/{id}/config/basis?session= | -- | { "permutation": "XYZ" } |
| POST | /{device_type}/{id}/config/basis?session= | { "permutation": "ZXY" } | エコーされた値 |
| DELETE | /{device_type}/{id}/config/basis?session= | -- | { "permutation": "XYZ" } |
Mount(すべてのデバイス、セッションスコープ)
| メソッド | パス | ボディ | レスポンス |
|---|---|---|---|
| GET | /{device_type}/{id}/config/mount?session= | -- | { "transform": {...} } |
| POST | /{device_type}/{id}/config/mount?session= | { "transform": {...} } | エコーされた値 |
| DELETE | /{device_type}/{id}/config/mount?session= | -- | 恒等変換(identity transform) |
Transform の構造(mount および state/transform で使用):
{
"transform": {
"position": { "x": 0, "y": 0, "z": 0 },
"rotation": { "x": 0, "y": 0, "z": 0, "w": 1 },
"scale": { "x": 1, "y": 1, "z": 1 }
}
}
プリセット(全デバイス、セッション単位)
| メソッド | パス | ボディ | レスポンス |
|---|---|---|---|
| GET | /{device_type}/{id}/config/preset?session= | -- | { "preset": "arm_front_centered" } |
| POST | /{device_type}/{id}/config/preset?session= | { "preset": "arm_front_centered" } | エコーされた値 |
| DELETE | /{device_type}/{id}/config/preset?session= | -- | { "preset": "device_defaults" } |
利用可能な値: device_defaults, arm_front, arm_front_centered, led_front, led_front_centered, custom。
デバイスフィルター(Inverse3 のみ、セッション単位)
フィルターのエンドポイントは /{device_type}/{id}/config/filters/{filter}?session=<expr> を使用します。
ダンピング
均一ダンピングと方向性ダンピングの両方を制御します。POST のボディには、少なくとも 1 つのフィールドを含める必要があります。
| メソッド | パス | ボディ | レスポンス |
|---|---|---|---|
| GET | /{device_type}/{id}/config/filters/damping?session= | -- | { "scalar": float, "vector": { "x": f, "y": f, "z": f } } |
| POST | /{device_type}/{id}/config/filters/damping?session= | { "scalar": float } または { "vector": {...} } または両方 | エコーされた値 |
| DELETE | /{device_type}/{id}/config/filters/damping?session= | -- | 両方ともゼロにリセット |
フォースゲート
| メソッド | パス | ボディ | レスポンス |
|---|---|---|---|
| GET | /{device_type}/{id}/config/filters/force_gate?session= | -- | { "gain": float } |
| POST | /{device_type}/{id}/config/filters/force_gate?session= | { "gain": float } | エコーされた値 |
| DELETE | /{device_type}/{id}/config/filters/force_gate?session= | -- | 設定のデフォルト値の gain |
デバイスの状態
Transform(全デバイス、セッション単位)
ワークスペースの変換(デバイス空間からアプリケーション空間への変換)。
| メソッド | パス | ボディ | レスポンス |
|---|---|---|---|
| GET | /{device_type}/{id}/state/transform?session= | -- | { "transform": {...} } |
| POST | /{device_type}/{id}/state/transform?session= | { "transform": {...} } | エコーされた値 |
| DELETE | /{device_type}/{id}/state/transform?session= | -- | 恒等変換 |
設定の保存
Inverse3 デバイスでのみ動作します。警告: 設定の保存は頻繁に行わないでください。 任意のデバイスに適用できる保存回数には上限があります(EEPROM への書き込み約 10,000 回)。
メソッド: POST
URL: http://localhost:10001/save_configuration
ボディの例:
{
"device_id": "049D"
}
レスポンスの例:
{
"ok": true
}
設定
設定のエンドポイントは、以下について自動生成されます:
- すべての設定の一覧取得(メタデータを含む)
- 単一の設定値の読み取り
- 設定の適用(単一または一括)
- キーのデフォルト値へのリセット
設定キーの一覧はこちらにあります。
ルート
| メソッド | ルート | 説明 |
|---|---|---|
| GET | /settings/ | すべての設定キー、値、メタデータを取得します。 |
| POST | /settings/ | 複数の設定を一括で適用します。 |
| GET | /settings/{key} | 特定の設定キーの現在値を取得します。 |
| POST | /settings/{key} | 特定のキーに新しい値を適用します。 |
| DELETE | /settings/{key} | キーをデフォルト値にリセットします。 |
レスポンスの形式
GET /settings/(すべての設定)
設定キーをキーとするオブジェクトを返します。各エントリには以下が含まれます:
value: 現在の値metadata: 型 + 制約 + ロック状態
エントリの例:
{
"devices/detection/timeout": {
"metadata": {
"constraint": {
"range": {
"max": 15,
"min": 1,
"step": 0
}
},
"locked": false,
"type_hint": "INT"
},
"value": 5
}
}
GET /settings/{key}(単一の設定)
指定されたキーの値のみ(メタデータなし)を返します。
設定の適用
POST /settings/(一括適用)
複数のキーをまとめて適用します。
推奨されるボディの形式: キーから値へのマッピングを表す JSON オブジェクト。
{
"devices/detection/timeout": 5,
"devices/detection/advanced/wvg_description_filter": ["Haply USB Transceiver", "Haply Handle"]
}
POST /settings/{key}(単一の適用)
単一のキーに新しい値を適用します。
推奨されるボディの形式: 生の JSON 値、またはラップされた値のいずれか(わかりやすさのため、ラップする形式を推奨)。
{
"value": 5
}
設定のリセット
DELETE /settings/{key}
キーをデフォルト値に戻します。
これは「デフォルト値にリセット」と同じです。
型ヒント
サービスは type_hint を自動的に推定します。複雑な型には、フォールバックとして GENERIC が使用されます。
対応しているヒント:
BOOLINTFLOATSTRINGVEC2VEC3VEC4TRANSFORMARR_INTARR_FLOATARR_STRINGGENERIC
非推奨のレガシーエンドポイント
いくつかの POST エンドポイントは引き続き受け付けられますが、非推奨の警告を出力します。
これらは 4.0 で削除される予定です。
非推奨のパスから置き換えルートへの完全な対応表については、3.5 移行ガイドをご覧ください。