本文へスキップ
バージョン: 3.0.8

ハプリー・インバース・サービス

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
}
}