ハプリー・インバース・サービス
Haply Inverse Serviceは、Haplyの触覚デバイスとインタラクティブなアプリケーションを統合する基本コンポーネントで、バックグラウンドのWindowsサービスとして動作し、リアルタイムのインタラクションを可能にします。 その機能には以下が含まれます:
- デバイスの検出と管理:接続されたHaplyデバイスを自動的に識別し、設定します。
- 所有権の管理:複数のアプリケーションにまたがるデバイスへのアクセスを管理し、スムーズな運用を実現します。
- リアルタイム・ステート・ストリーミング:デバイスの状態を高頻度で更新し、正確な制御を実現します。
- コマンド処理:力や位置のコマンドを忠実に実行し、触覚フィードバックを強化する。
- バックグラウンド動作:バックグラウンドで実行され、ユーザーの介入なしにデバイスの準備状態を維持します。
実行、停止、再開
Windowsの場合:
- を開く。 サービス デスクトップアプリを押します。
Windows
+R
を開きます。 走る ボックスにservices.msc
を押す。Enter
またはOK
.
Ubuntuで:
- スタート
systemctl start haply-inverse-service.service
- ストップ
systemctl stop haply-inverse-service.service
- 有効にする
systemctl enable haply-inverse-service.service
- 無効
systemctl disable haply-inverse-service.service
重要なファイル
Windowsの場合:
- 設定ファイルは次の場所にあります:設定ファイルは %PROGRAMDATA%HaplyInverse*-config.json にあります。
- ログファイルは以下の場所にあります:にある。
Ubuntuで:
- 設定ファイルは/etc/haply-inverse-service/*-config.jsonにあります。
- ログファイルは/var/log/haply-inverse-service/*-log.log。
OSXの場合:
- 設定ファイルはTMPDIR/Haply/Inverse/*-config.jsonにあります。
- ログファイルはTMPDIR/Haply/Inverse/*-log.logにあります。
インターフェイス
HTTPとWebsocketの両インターフェイスは JSON
フォーマットのペイロード。
HTTP
デフォルトでは、HTTPサービスが起動する: http://localhost:10000
.注:ポートはコンフィギュレーションで変更できる。
ダッシュボード
ダッシュボードは以下のサイトで入手できる: http://localhost:10000
バージョン
方法GET
URL: http://localhost:10000/3.0/version
回答例
{
"build_time": "2024-08-07T16:01:53Z",
"git_branch": "main",
"git_describe": "3.0.0-2-gce34c39e",
"git_hash": "ce34c39e",
"git_tag": "3.0.0",
"project_name": "haply-inverse-service",
"project_version": "3.0.0.0"
}
デバイス
方法GET
URL: http://localhost:10000/3.0/devices
回答例
{
"inverse3": {
"049D": {
"config": {
"device_info": {
"firmware_version": 1,
"hardware_version": 7,
"id": "049D",
"model": 4,
"uuid": "5A9F3AC02E085C078AD6A4A113DE049D"
},
"extended_device_id": "5A9F3AC02E085C078AD6A4A113DE049D",
"extended_firmware_version": "77488E4644CB6057D0920B0B919C8B82",
"gravity_compensation": {
"enabled": true,
"scaling_factor": 0.75
},
"handedness": "left",
"torque_scaling": {
"enabled": true
}
},
"device_id": "049D",
"state": {
"angular_position": {
"a0": 0.0,
"a1": 0.0,
"a2": 0.0
},
"angular_velocity": {
"a0": 0.0,
"a1": 0.0,
"a2": 0.0
},
"body_orientation": {
"w": 1.0,
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"calibrated": false,
"cursor_position": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"cursor_velocity": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"in_use": false,
"mode": "idle",
"power_supply": false,
"ready": false,
"started": false
},
"status": {
"initialization_received": {
"body_orientation": true,
"device_handedness": true,
"device_info": true,
"extended_device_id": true,
"extended_firmware_version": true,
"gravity_compensation": true,
"torque_scaling": true
},
"port": "COM12"
}
}
},
"verse_grip": {
"61582": {
"button": false,
"device_id": "61582",
"error": 0,
"hall": 0,
"orientation": {
"w": 0.17022705078125,
"x": -0.24114990234375,
"y": -0.95538330078125,
"z": -0.001220703125
}
}
},
"wireless_verse_grip": {
"0": {
"battery_level": 0.6200001239776611,
"buttons": {
"a": false,
"b": false,
"c": false
},
"device_id": "0",
"hall": 15,
"orientation": {
"w": -0.906463623046875,
"x": -0.379058837890625,
"y": -0.111785888671875,
"z": -0.136688232421875
}
}
}
}
フォース・スケール
メソッドPOST
URL: http://localhost:10000/3.0/force_scale
ボディの例:
{
"force_scale": 0.5
}
回答例
{
"ok": true
}
重力補償
メソッドPOST
URL: http://localhost:10000/3.0/gravity_compensation
ボディの例:
{
"device_id": "049D",
"enable": true,
"gravity_scaling_factor": 0.8
}
回答例
{
"ok": true
}
トルク・スケーリング
メソッドPOST
URL: http://localhost:10000/3.0/torque_scaling
ボディの例:
{
"device_id": "049D",
"enable": true
}
回答例
{
"ok": true
}
デバイスの利便性
メソッドPOST
URL: http://localhost:10000/3.0/device_handedness
ボディの例:
{
"device_id": "049D",
"handedness": "right"
}
回答例
{
"ok": true
}
設定の保存
Inverse3デバイスでのみ動作します。警告コンフィギュレーションを保存する回数には限りがあります。
メソッドPOST
URL: http://localhost:10000/3.0/save_configuration
ボディの例:
{
"device_id": "049D"
}
回答例
{
"ok": true
}
シリアルイネーブル
すべてのシリアル通信を有効または無効にします。シリアル通信を無効にすると、デバイスにコマンドを送信できなくなります。
メソッドPOST
URL: http://localhost:10000/3.0/serial_enable
ボディの例:
{
"enable": true
}
回答例
{
"ok": true
}
グリップ垂直ストッパー
すべてのグリップ垂直ストッパー機能を有効または無効にします。
メソッドPOST
URL: http://localhost:10000/3.0/features/grip_dropped_simulation_stopper
ボディの例:
{
"enable": true,
"hall_effect_threshold": 17
}
回答例
{
"ok": true
}
ウェブソケット
デフォルトのウェブソケットURLは ws://localhost:10000
.注:ポートはコンフィギュレーションで変更できる。
イニシャルメッセージ
このサービスは、ウェブソケットが接続されると、完全なデバイスリストを含むメッセージを送信します。最初のメッセージは次のようなものです。 JSON
という形式をとっている:
{
"inverse3": {
"049D": {
"config": {
"device_info": {
"firmware_version": 1,
"hardware_version": 7,
"id": "049D",
"model": 4,
"uuid": "5A9F3AC02E085C078AD6A4A113DE049D"
},
"extended_device_id": "5A9F3AC02E085C078AD6A4A113DE049D",
"extended_firmware_version": "77488E4644CB6057D0920B0B919C8B82",
"gravity_compensation": {
"enabled": true,
"scaling_factor": 0.75
},
"handedness": "left",
"torque_scaling": {
"enabled": true
}
},
"device_id": "049D",
"state": {
"angular_position": {
"a0": -90.40308380126953,
"a1": 3.390819549560547,
"a2": 0.8826223015785217
},
"angular_velocity": {
"a0": 0,
"a1": 0,
"a2": 0
},
"body_orientation": {
"w": 1,
"x": 0,
"y": 0,
"z": 0
},
"calibrated": false,
"cursor_position": {
"x": -0.022379431873559952,
"y": -0.011212021112442017,
"z": -0.11827600002288818
},
"cursor_velocity": {
"x": 0,
"y": 0,
"z": 0
},
"in_use": false,
"mode": "angle",
"power_supply": true,
"ready": true,
"started": true
},
"status": {
"initialization_received": {
"body_orientation": true,
"device_handedness": true,
"device_info": true,
"extended_device_id": true,
"extended_firmware_version": true,
"gravity_compensation": true,
"torque_scaling": true
},
"port": "COM12"
}
}
},
"verse_grip": {
"61582": {
"button": false,
"device_id": "61582",
"error": 0,
"hall": 0,
"orientation": {
"w": 0.156982421875,
"x": -0.24163818359375,
"y": -0.95751953125,
"z": -0.00079345703125
}
}
},
"wireless_verse_grip": {
"0": {
"battery_level": 0.5999999046325684,
"buttons": {
"a": false,
"b": false,
"c": false
},
"device_id": "0",
"hall": 15,
"orientation": {
"w": -0.91265869140625,
"x": -0.389984130859375,
"y": -0.075103759765625,
"z": -0.07635498046875
}
}
}
}
状態更新メッセージ
いつでも いずれも 利用可能なデバイスに変更があった場合、サービスは、そのデバイスの状態を含む状態更新メッセージを送信します。 すべて デバイスの状態を更新します。状態更新メッセージには以下のものがある。 JSON
という形式をとっている:
{
"inverse3": {
"049D": {
"state": {
"angular_position": {
"a0": 0,
"a1": 0,
"a2": 0
},
"angular_velocity": {
"a0": 0,
"a1": 0,
"a2": 0
},
"body_orientation": {
"w": 1,
"x": 0,
"y": 0,
"z": 0
},
"calibrated": true,
"cursor_position": {
"x": -0.022203030064702034,
"y": -0.027979673817753792,
"z": -0.1170499324798584
},
"cursor_velocity": {
"x": 0,
"y": 0,
"z": 0
},
"in_use": true,
"mode": "position",
"power_supply": false,
"ready": true,
"started": true
}
}
},
"verse_grip": {
"61582": {
"button": false,
"device_id": "61582",
"error": 0,
"hall": 0,
"orientation": {
"w": 0.15423583984375,
"x": -0.24176025390625,
"y": -0.95794677734375,
"z": -0.0015869140625
}
}
},
"wireless_verse_grip": {
"0": {
"battery_level": 0.5999999046325684,
"buttons": {
"a": false,
"b": false,
"c": false
},
"device_id": "0",
"hall": 15,
"orientation": {
"w": -0.3958740234375,
"x": 0.639190673828125,
"y": -0.404388427734375,
"z": -0.51739501953125
}
}
}
}
コマンドメッセージ
にコマンドを送信する。 inverse3
の場合、クライアントはコマンド・メッセージを送信しなければならない。以下はその例である:
{
"inverse3": {
"049D": [
{
"command": "set_cursor_force",
"values": {
"x": 0,
"y": 0,
"z": 0
}
}
]
}
}
また、1つのメッセージで複数のデバイスにコマンドを送信することも可能だ:
{
"inverse3": {
"049D": [
{
"command": "set_cursor_force",
"values": {
"x": 0,
"y": 0,
"z": 0
}
}
],
"049E": [
{
"command": "set_cursor_force",
"values": {
"x": 0,
"y": 0,
"z": 0
}
}
]
}
}
現在、以下のコマンドが inverse3
:
カーソル位置の設定
{
"command": "set_cursor_position",
"values": {
"x": 1.0,
"y": 2.0,
"z": 3.0
}
}
カーソルフォースの設定
{
"command": "set_cursor_force",
"values": {
"x": 0.5,
"y": 0.5,
"z": 0.5
}
}
角度位置の設定
{
"command": "set_angular_position",
"values": {
"a0": 1.0,
"a1": 2.0,
"a2": 3.0
}
}
設定角トルク
{
"command": "set_angular_torque",
"values": {
"a0": 0.5,
"a1": 0.5,
"a2": 0.5
}
}