Haply 역 서비스
Haply 역방향 서비스는 Haply 의 촉각 디바이스와 대화형 애플리케이션을 통합하는 기본 구성 요소로, 백그라운드 Windows 서비스로 실행되어 실시간 상호작용을 가능하게 합니다. 이 서비스의 기능은 다음과 같습니다:
- 장치 검색 및 관리: 연결된 Haply 장치를 자동으로 식별하고 구성합니다.
- 소유권 관리: 여러 애플리케이션에서 디바이스에 대한 액세스를 관리하여 원활한 운영을 보장합니다.
- 실시간 상태 스트리밍: 정밀한 제어를 위해 디바이스 상태에 대한 업데이트를 높은 빈도로 제공합니다.
- 명령 처리: 힘이나 위치에 대한 명령을 높은 충실도로 실행하여 햅틱 피드백을 향상시킵니다.
- 백그라운드 작동: 백그라운드에서 실행되어 사용자 개입 없이 디바이스 준비 상태를 유지합니다.
실행, 중지, 다시 시작
Windows에서:
- 열기 서비스 데스크톱 앱: 누르기
Windows
+R
을 클릭하여 실행 상자를 입력하고services.msc
을 누른 다음Enter
를 선택하거나OK
.
우분투에서:
- 시작
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\Inverse\*-config.json
- 로그 파일은 다음 위치에 있습니다: 프로그램 데이터%\Haply\Inverse\*-log.log
우분투에서:
- 구성 파일은 다음 위치에 있습니다: /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 형식 버전
이 서비스는 현재 두 가지를 지원합니다. 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 및 웹소켓 인터페이스는 모두 다음을 사용합니다. JSON
형식의 페이로드입니다.
엔드 이펙터의 위치를 읽을 때는 힘 값을 장치로 보내야 합니다(힘 값이 모두 0이더라도).
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
}
그립 수직 스토퍼
그립 수직 스토퍼 실험 기능을 활성화 또는 비활성화합니다. 이 기능은 무선 버즈그립 방향을 확인하여 버즈그립을 떨어뜨렸을 때 이를 감지합니다. 이 기능이 트리거되면 엔드 이펙터가 떨어지지 않도록 현재 위치에서 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
}
}
]
}
상태 업데이트 메시지
서비스는 수신된 각 명령 메시지에 대해 모든 디바이스의 상태가 포함된 상태 업데이트 메시지를 한 번씩 전송합니다.
기계의 상태를 알고 싶다면 힘 값(값이 0이더라도)과 같은 메시지를 미리 보내야 합니다. 이는 위치 추적이나 힘을 가하지 않는 등의 입력 장치로 사용하는 경우 특히 중요합니다. 상태 업데이트 메시지에는 다음이 포함됩니다. 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": []
}
또한 하나의 메시지로 여러 디바이스에 명령을 보낼 수도 있습니다. 다음은 그 예입니다:
{
"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
구절의 경우
그립에는 모두 명령 데이터가 포함되어 있지 않습니다.
{
"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": {}
}
}
]
}