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
インターフェイス
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
}
ウェブソケット
デフォルトのウェブソケット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
    }
}