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

Haply 逆サービス

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の場合:

  • 設定ファイルは次の場所にあります:Haply ˶-*-config.json
  • ログファイルは次の場所にあります:Haply 。

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

JSONフォーマットのバージョン

このサービスは現在、以下の2種類をサポートしている。 JSON のフォーマットを使用している: 3.0 そして 3.1.両バージョンは同時に利用可能で、後方互換性が確保されている。もし 3.0 フォーマットでシミュレーションを行う場合、変更は必要ありません。 ただし 3.1.x バージョンでは、ゲームエンジンとの統合に必要な機能強化やパフォーマンスの向上が図られています。

主な内容

  • 3.0 バージョン

    • に完全収録されている。 3.0.x ドキュメントページ.
    • HTTP デフォルトでは http://localhost:10000/3.0.
    • Websockets デフォルトでは ポート 10000.
  • 3.1 バージョン

    • に完全収録されている。 3.1.x ドキュメントページ.
    • HTTP デフォルトでは http://localhost:10000/3.1.
    • Websockets デフォルトでは ポート 10001.
    • 機能性の向上とゲームエンジンとの統合の高速化を実現。

にアップグレードしてください。 3.1 既存のワークフローを中断することなく、その利点を活用することができます。

インターフェイス

HTTPとWebsocketの両インターフェイスは JSON フォーマットのペイロード。

インフォメーション

エンドエフェクターの位置を読み取るときは、力の値をデバイスに送信する必要があります(力の値がすべてゼロであっても)。

HTTP

デフォルトでは、HTTPサービスが起動する: http://localhost:10000.注:ポートはコンフィギュレーションで変更できる。

ダッシュボード

ダッシュボードは以下のサイトで入手できる: http://localhost:10000

バージョン

方法GET

URL: http://localhost:10000/3.1/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.1/devices

回答例

{
"inverse3": [
{
"device_id": "04BA",
"config": {
"type": "inverse3",
"device_info": {
"minor_version": 1,
"major_version": 7,
"id": "04BA",
"device_type": 4,
"uuid": "2D35F80DD9005F599B68F49944CB04BA"
},
"port": "COM13",
"extended_device_id": "2D35F80DD9005F599B68F49944CB04BA",
"extended_firmware_version": "8C20FDC8010AA1E15AA133CDA2534874",
"gravity_compensation": {
"enabled": true,
"scaling_factor": 1
},
"handedness": "right",
"torque_scaling": {
"enabled": true
}
},
"state": {
"angular_position": {
"a0": -69.31704,
"a1": 137.62952,
"a2": 19.832787
},
"angular_velocity": {
"a0": 0,
"a1": 0,
"a2": 0
},
"body_orientation": {
"x": -0.01940918,
"y": 0.7026367,
"z": 0.00048828125,
"w": 0.7113037
},
"cursor_position": {
"x": 0.07842738,
"y": -0.14836666,
"z": 0.14297646
},
"cursor_velocity": {
"x": -0.011969013,
"y": 0.0012009288,
"z": -0.043197
},
"mode": "idle"
},
"status": {
"calibrated": false,
"in_use": false,
"power_supply": true,
"ready": true,
"started": true
}
}
],
"verse_grip": [
{
"device_id": "61548",
"config": {
"port": "COM3",
"type": "verse_grip"
},
"state": {
"button": false,
"hall": 0,
"orientation": {
"x": -0.5019531,
"y": 0.8632202,
"z": -0.048095703,
"w": -0.022338867
}
},
"status": {
"error": 0,
"ready": true
}
}
],
"wireless_verse_grip": [
{
"device_id": "0",
"config": {
"port": "COM6",
"type": "wireless_verse_grip"
},
"state": {
"battery_level": 0.42000008,
"buttons": {
"a": false,
"b": false,
"c": false
},
"hall": 16,
"orientation": {
"x": -0.019866943,
"y": -0.017486572,
"z": 0.05508423,
"w": -0.9963989
}
},
"status": {
"ready": true
}
}
]
}

フォース・スケール

メソッドPOST

URL: http://localhost:10000/3.1/force_scale

ボディの例:

{
"force_scale": 0.5
}

回答例

{
"ok": true
}

重力補償

メソッドPOST

URL: http://localhost:10000/3.1/gravity_compensation

ボディの例:

{
"device_id": "049D",
"enable": true,
"gravity_scaling_factor": 0.8
}

回答例

{
"ok": true
}

トルク・スケーリング

メソッドPOST

URL: http://localhost:10000/3.1/torque_scaling

ボディの例:

{
"device_id": "049D",
"enable": true
}

回答例

{
"ok": true
}

デバイスの利便性

メソッドPOST

URL: http://localhost:10000/3.1/device_handedness

ボディの例:

{
"device_id": "049D",
"handedness": "right"
}

回答例

{
"ok": true
}

設定の保存

Inverse3 。警告任意のデバイスに適用できる保存回数には限りがあるため、コンフィギュレーションを頻繁に保存することは避けてください。

メソッドPOST

URL: http://localhost:10000/3.1/save_configuration

ボディの例:

{
"device_id": "049D"
}

回答例

{
"ok": true
}

シリアルイネーブル

すべてのシリアル通信を有効または無効にします。シリアル通信を無効にすると、デバイスにコマンドを送信できなくなります。

メソッドPOST

URL: http://localhost:10000/3.1/serial_enable

ボディの例:

{
"enable": true
}

回答例

{
"ok": true
}

グリップ垂直ストッパー

グリップ垂直ストッパー実験機能を有効または無効にします。この機能は、ワイヤレスVerseGripの向きをチェックし、VerseGripの落下を検出します。これがトリガーされると、エンドエフェクタが落下しないように、Inverse3 を現在の位置で位置制御に設定します。VerseGripが再びピックアップされると、自動的に無効になります。

警告

実験的な機能であるため、デフォルトでは無効になっており、有効にするには明示的に有効にする必要がある。

メソッドPOST

URL: http://localhost:10000/3.1/experimental/features/grip_dropped_simulation_stopper

ボディの例:

{
"enable": true,
"hall_effect_threshold": 17
}

回答例

{
"ok": true
}

ウェブソケット

デフォルトのウェブソケットURLは ws://localhost:10001.注:ポートはコンフィギュレーションで変更できる。

イニシャルメッセージ

このサービスは、ウェブソケットが接続されると、完全なデバイスリストを含むメッセージを送信します。最初のメッセージは次のようなものです。 JSON という形式をとっている:

{
"inverse3": [
{
"device_id": "04BA",
"config": {
"type": "inverse3",
"device_info": {
"minor_version": 1,
"major_version": 7,
"id": "04BA",
"model": 4,
"uuid": ""
},
"port": "COM13",
"extended_device_id": "2D35F80DD9005F599B68F49944CB04BA",
"extended_firmware_version": "8C20FDC8010AA1E15AA133CDA2534874",
"gravity_compensation": {
"enabled": true,
"scaling_factor": 1
},
"handedness": "right",
"torque_scaling": {
"enabled": true
}
},
"state": {
"angular_position": {
"a0": -69.31704,
"a1": 137.62952,
"a2": 19.832787
},
"angular_velocity": {
"a0": 0,
"a1": 0,
"a2": 0
},
"body_orientation": {
"x": -0.01940918,
"y": 0.7026367,
"z": 0.00048828125,
"w": 0.7113037
},
"cursor_position": {
"x": 0.07842738,
"y": -0.14836666,
"z": 0.14297646
},
"cursor_velocity": {
"x": -0.011969013,
"y": 0.0012009288,
"z": -0.043197
},
"mode": "idle"
},
"status": {
"calibrated": false,
"in_use": false,
"power_supply": true,
"ready": true,
"started": true
}
}
],
"verse_grip": [
{
"device_id": "61548",
"config": {
"port": "COM3",
"type": "verse_grip"
},
"state": {
"button": false,
"hall": 0,
"orientation": {
"x": -0.5019531,
"y": 0.8632202,
"z": -0.048095703,
"w": -0.022338867
}
},
"status": {
"error": 0,
"ready": true
}
}
],
"wireless_verse_grip": [
{
"device_id": "0",
"config": {
"port": "COM6",
"type": "wireless_verse_grip"
},
"state": {
"battery_level": 0.42000008,
"buttons": {
"a": false,
"b": false,
"c": false
},
"hall": 16,
"orientation": {
"x": -0.019866943,
"y": -0.017486572,
"z": 0.05508423,
"w": -0.9963989
}
},
"status": {
"ready": true
}
}
]
}

状態更新メッセージ

このサービスは、コマンド・メッセージを受信するごとに、全デバイスの状態を含む1つの状態更新メッセージを送信する。

もしマシンの状態を知りたいのであれば、あらかじめ力の値(たとえ値がゼロであっても)などのメッセージを送っておく必要があります。これは、私たちのデバイスを入力デバイスとして使用する場合、特に重要です。例えば、位置をトラッキングし、力を加えない場合などです。状態更新メッセージには次のようなものがあります。 JSON という形式をとっている:

{
"inverse3": [
{
"device_id": "04BA",
"state": {
"angular_position": {
"a0": -69.31704,
"a1": 137.62952,
"a2": 19.832787
},
"angular_velocity": {
"a0": 0,
"a1": 0,
"a2": 0
},
"body_orientation": {
"x": -0.01940918,
"y": 0.7026367,
"z": 0.00048828125,
"w": 0.7113037
},
"cursor_position": {
"x": 0.07842738,
"y": -0.14836666,
"z": 0.14297646
},
"cursor_velocity": {
"x": -0.011969013,
"y": 0.0012009288,
"z": -0.043197
},
"mode": "idle"
},
"status": {
"calibrated": false,
"in_use": false,
"power_supply": true,
"ready": true,
"started": true
}
}
],
"verse_grip": [
{
"device_id": "61548",
"state": {
"button": false,
"hall": 0,
"orientation": {
"x": -0.5019531,
"y": 0.8632202,
"z": -0.048095703,
"w": -0.022338867
}
},
"status": {
"error": 0,
"ready": true
}
}
],
"wireless_verse_grip": [
{
"device_id": "0",
"state": {
"battery_level": 0.42000008,
"buttons": {
"a": false,
"b": false,
"c": false
},
"hall": 16,
"orientation": {
"x": -0.019866943,
"y": -0.017486572,
"z": 0.05508423,
"w": -0.9963989
}
},
"status": {
"ready": true
}
}
]
}

コマンドメッセージ

にコマンドを送信する。 inverse3 の場合、クライアントはコマンド・メッセージを送信しなければならない。以下はその例である:

{
"inverse3": [
{
"device_id": "049D",
"commands": {
"set_cursor_force": {
"values": {
"x": 1.0,
"y": 2.0,
"z": 3.0
}
}
}
}
],
"verse_grip": [],
"wireless_verse_grip": []
}

また、1つのメッセージで複数のデバイスにコマンドを送信することも可能だ:

{
"inverse3": [
{
"device_id": "049D",
"commands": {
"set_cursor_force": {
"values": {
"x": 1.0,
"y": 2.0,
"z": 3.0
}
}
}
},
{
"device_id": "049E",
"commands": {
"set_cursor_force": {
"values": {
"x": 1.0,
"y": 2.0,
"z": 3.0
}
}
}
}
],
"verse_grip": [],
"wireless_verse_grip": []
}

現在、以下のコマンドが inverse3:

カーソル位置の設定
{
"inverse3": [
{
"device_id": "049D",
"commands": {
"set_cursor_position": {
"values": {
"x": 1.0,
"y": 2.0,
"z": 3.0
}
}
}
}
],
"verse_grip": [],
"wireless_verse_grip": []
}
カーソルフォースの設定
{
"inverse3": [
{
"device_id": "049D",
"commands": {
"set_cursor_force": {
"values": {
"x": 1.0,
"y": 2.0,
"z": 3.0
}
}
}
}
],
"verse_grip": [],
"wireless_verse_grip": []
}
角度位置の設定
{
"inverse3": [
{
"device_id": "049D",
"commands": {
"set_cursor_force": {
"values": {
"x": 1.0,
"y": 2.0,
"z": 3.0
}
}
}
}
],
"verse_grip": [],
"wireless_verse_grip": []
}
設定角トルク
{
"inverse3": [
{
"device_id": "049D",
"commands": {
"set_angular_torque": {
"values": {
"a0": 1.0,
"a1": 2.0,
"a2": 3.0
}
}
}
}
],
"verse_grip": [],
"wireless_verse_grip": []
}
プローブ・コマンド

probe_cursor_position, probe_angular_position をinverse3 、そして probe_orientation バース用 grips all はコマンドデータを含まない。

{
"inverse3": [
{
"device_id": "049D",
"commands": {
"probe_cursor_position": {},
"probe_angular_position": {}
}
}
],
"verse_grip": [
{
"device_id": "049D",
"commands": {
"probe_orientation": {}
}
}
],
"wireless_verse_grip": [
{
"device_id": "049D",
"commands": {
"probe_orientation": {}
}
}
]
}