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": {
"firmware_version": 1,
"hardware_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
}
}
]
}
フォース・スケール
メソッド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": {
"firmware_version": 1,
"hardware_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": {}
}
}
]
}