주요 콘텐츠로 건너뛰기
버전: 3.0.7

하플리 인버스 서비스

하플리 인버스 서비스는 하플리의 촉각 디바이스와 대화형 애플리케이션을 통합하는 기본 구성 요소로, 백그라운드 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\인버스\*-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

인터페이스

HTTP 및 웹소켓 인터페이스는 모두 다음을 사용합니다. 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
}
}
}
}

상태 업데이트 메시지

언제든 any 사용 가능한 장치 중 변경 사항이 있는 경우, 서비스는 다음과 같은 상태가 포함된 상태 업데이트 메시지를 보냅니다. 모두 디바이스입니다. 상태 업데이트 메시지에는 다음이 포함됩니다. 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
}
}
]
}
}

또한 하나의 메시지로 여러 디바이스에 명령을 보낼 수도 있습니다. 다음은 그 예입니다:

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