빠른 시작: VerseGrip 스타일러스
버즈그립에 방향 추적 기능이 추가된 Inverse3. 이 문서에서는 버즈그립 스타일러스 설정 절차와 그 기능에 대해 간략하게 설명합니다.
버즈그립 스타일러스
VerseGrip 스타일러스( Inverse3 )는 최첨단 독점 고속 무선 통신 기술을 적용하여 방향 설정과 손 안의 I/O를 제공합니다. 이 공간에서 가능한 것을 재창조하여 탁월한 활용성을 제공합니다.
여러분을 위해 만든 몇 가지 놀라운 기능을 소개합니다:
- 사용자 입력 버튼 2개,
- 보정 버튼 1개,
- 전원/대기 버튼 1개, 그리고
- 2개의 인디케이터 RGB LED 조명
- 10~12시간의 배터리 수명
- 충전용 USB-c 연결
- 최대 1KHz의 무선 통신 속도
- 하나의 밴드에서 최대 8개의 VerseGrip 스타일러스를 동글에 페어링할 수 있습니다.
버즈그립 스타일러스의 외부에는 (1) Inverse3 짐벌에 장착되는 볼 커넥터, (2) 및 (3) 입력 버튼, (4) USB-C 충전 포트, ( 5 ) 보정 버튼, (6) 상태 LED, (7) 전원 버튼 등 7가지 주요 기능이 있습니다.
고객 지원
장치 및 사용 방법에 대해 궁금한 점이나 우려 사항이 있는 경우 언제든지 문의해 주시면 기꺼이 답변해 드리겠습니다. VerseGrip 스타일러스는 복잡하고 독점적인 무선 기술이 내장된 기능성 디바이스입니다. 장치를 열려고 시도하면 보증이 무효화될 뿐만 아니라 매우 빠르게 장치를 사용할 수 없게 될 수 있습니다. 배송 시간이 길어지고 수리 비용이 많이 드는 것을 방지하려면 장치를 열려고 시도하지 마세요 .
VerseGrip 스타일러스 설정 및 보정
이 섹션에서는 동글 연결, VerseGrip 스타일러스 켜기 및 보정 단계를 간략하게 설명합니다.
설정
- 동글을 컴퓨터의 USB 단자에 꽂습니다.
- 손잡이는 움직이지 않는 평평한 표면에 놓고 버튼은 위쪽을 향하게 하고 볼 커넥터는 화면을 향하게 합니다.
전원 켜기 및 보정
- 전원 버튼을 한 번 누릅니다. 상태 표시등이 빨간색으로 바뀌었다가 파란색으로 바뀝니다. 파란색은 장치의 IMU가 자체 보정 중임을 나타냅니다.
- 자체 보정 후에는 상태 표시등이 0.5초에 한 번씩 빨간색으로 깜박입니다. 이것은 대기 모드입니다.
- 대기 모드에서 디바이스를 깨우려면 아무 버튼이나 누릅니다. 깨어나는 동안 상태 표시등이 녹색으로 깜박이다가 녹색으로 고정됩니다. 이제 무선으로 데이터를 전송 중입니다.
- 배터리가 부족하면 버즈그립 스타일러스는 2분마다 저절로 꺼지므로 즉시 충전하세요.
재보정
- 재보정하려면 보정 버튼을 3초 동안 길게 누르거나 시뮬레이션에서 방향이 바뀐 것을 확인할 때까지 누릅니다.
대기 및 전원 끄기
- 전원 버튼을 다시 누르면 대기 모드로 돌아갑니다. 상태 표시등이 빨간색으로 바뀌고 2초마다 깜박이며 데이터 전송이 중지됩니다.
- 버즈그립 스타일러스를 끄려면 전원 버튼을 5초간 누르고 있다가 놓습니다. 손을 놓으면 상태 표시등이 꺼지고 아무 표시도 나타나지 않습니다. 데이터 전송이 중지됩니다.
충전
- USB-C 충전 단자를 통해 VerseGrip 스타일러스를 전원에 연결합니다.
- 전원을 연결하면 충전 표시등이 파란색으로 켜지고, 완전히 충전되면 파란색으로 빠르게 깜박입니다. 전원을 연결하면 기기가 시작되고 대기 상태가 됩니다.
경고: 배터리가 방전되지 않도록 주의하세요! 배터리가 방전되면 충전 상태를 유지할 수 없게 됩니다. 이런 일이 발생하더라도 버즈그립 스타일러스는 플러그를 꽂아 두는 한 계속 작동합니다.
상태 및 표시등 표시기
상태 표시등 색상 및 동작 | 상태 |
---|---|
빨간색, 단색 | 구성 요소 초기화 보류 중 |
파란색, 단색 | 핸들의 IMU가 자체 보정 중입니다. |
빨간색, 2초마다 깜박임 | 대기 모드. 데이터 전송이 없습니다. |
녹색, 2초마다 깜박임 | 일반 모드, 자동으로 무선으로 데이터를 전송합니다. |
빛이 없으면 표시도 없습니다. | 전원이 꺼져 있습니다. |
충전 표시등 색상 | 상태 |
---|---|
파란색, 단색 | 충전 |
파란색, 빠르게 깜박임 | 기기가 완전히 충전되었음을 나타냅니다. |
빛이 없으면 표시도 없습니다. | 장치가 충전 중이 아닙니다. |
샘플 코드
다음은 C++에서 Versegrip 스타일러스를 사용하는 간단한 예제입니다.
- Inverse SDK
- 하드웨어API
#include <external/libhv.h>
#include <nlohmann/json.hpp>
#include <chrono>
#include <cstdio>
#include <string>
using namespace hv;
using json = nlohmann::json;
// Procedure to get the first detected and available Wired VerseGrip Stylus device id
std::string get_first_verse_grip_device_id(const json &data) {
const auto& vgs = data["wireless_verse_grip"];
if (vgs.empty()) {
return "";
}
return vgs.items().begin().key();
}
int main() {
const auto print_delay = std::chrono::milliseconds(100);
auto current = std::chrono::high_resolution_clock::now();
bool first_message = true;
std::string device_id;
WebSocketClient ws;
ws.onmessage = [&](const std::string &msg) {
json data = json::parse(msg);
if (first_message) {
first_message = false;
const std::string first_id = get_first_verse_grip_device_id(data);
if (first_id.empty()) {
printf("no Wireless VerseGrip found.\n");
ws.close();
return;
}
device_id = first_id;
}
if (device_id.empty() || !data["wireless_verse_grip"].contains(device_id)) {
return;
}
const auto now = std::chrono::high_resolution_clock::now();
if (std::chrono::high_resolution_clock::now() > current + print_delay) {
current = now;
const json state = data["wireless_verse_grip"][device_id];
printf("Rotation : { x:%f, y:%f, z:%f, w:%f }, Hall:%i, Button : [%d, %d, %d], Battery: {%f}\n",
state["orientation"]["x"].get<float>(),
state["orientation"]["y"].get<float>(),
state["orientation"]["z"].get<float>(),
state["orientation"]["w"].get<float>(),
state["hall"].get<int8_t>(),
state["buttons"]["a"].get<bool>(),
state["buttons"]["b"].get<bool>(),
state["buttons"]["c"].get<bool>(),
state["battery_level"].get<float>());
}
};
ws.open("ws://localhost:10000");
printf("Press ENTER to stop...\n\n");
while (std::cin.get() != '\n') {
}
if (ws.isConnected()) {
ws.close();
}
return 0;
}
#include <string.h>
#include <chrono>
#include <iostream>
#include <iterator>
#include <string>
#include <thread>
#include "HardwareAPI.h"
int main(int argc, char* argv[])
{
char* portName;
if (argc < 2)
{
std::printf("Usage: %s <port>\n", argv[0]);
}
else
{
#if defined(_WIN32) || defined(_WIN64)
portName = _strdup(argv[1]); // argv1;
#endif
#if defined(__linux__)
portName = strdup(argv[1]); // argv1;
#endif
}
Haply::HardwareAPI::IO::SerialStream serial_stream(portName);
Haply::HardwareAPI::Devices::Handle handle(&serial_stream);
while (true)
{
Haply::HardwareAPI::Devices::Handle::VersegripStatusResponse data;
data = handle.GetVersegripStatus();
std::printf(
"device_id: %d battery_level: %f quaternion: %f %f %f %f buttons: "
"%d error_flags: %d\n",
data.device_id, data.battery_level, data.quaternion[0],
data.quaternion[1], data.quaternion[2], data.quaternion[3],
data.buttons, data.error_flag);
}
}