빠른 시작: 스타일러스 버즈그립
버즈그립은 Inverse3에 방향 추적 기능을 추가합니다. 이 문서에서는 스타일러스 버즈그립 설정 절차와 그 기능에 대해 간략하게 설명합니다.
스타일러스 버즈그립
스타일러스 버즈 그립 프로토타입 인버스3는 최첨단 독점 고속 무선 통신 기술을 적용하여 방향 설정과 손 안의 I/O를 제공합니다. 이 공간에서 가능한 것을 재창조하여 탁월한 활용성을 제공합니다.
여러분을 위해 만든 몇 가지 놀라운 기능을 소개합니다:
- 사용자 입력 버튼 2개,
- 보정 버튼 1개,
- 전원/대기 버튼 1개, 그리고
- 2개의 인디케이터 RGB LED 조명
- 10~12시간의 배터리 수명
- 충전용 USB-c 연결
- 최대 1KHz의 무선 통신 속도
- 단일 밴드에서 최대 8개의 버즈그립을 동글에 페어링할 수 있습니다.
고객 지원
장치 및 사용 방법에 대한 질문이나 우려 사항이 있는 경우 주저하지 말고 문의해 주시면 기꺼이 답변해 드리겠습니다. 스타일러스 버즈 그립 프로토타입은 복잡하고 독점적인 무선 기술이 내장된 기능성 디바이스입니다. 장치를 열려고 시도하면 보증이 무효화될 뿐만 아니라 매우 빠르게 장치를 사용할 수 없게 될 수 있습니다. 배송 시간이 길어지고 수리 비용이 많이 드는 것을 방지하려면 장치를 열려고 시도하지 마세요 .
스타일러스 버즈그립 설정 및 보정
이 섹션에서는 동글을 연결하고, VerseGrip을 켜고, 보정하는 단계를 간략하게 설명합니다.
설정
- 동글을 컴퓨터의 USB 단자에 꽂습니다.
- 손잡이는 움직이지 않는 평평한 표면에 놓고 버튼은 위쪽을 향하게 하고 볼 커넥터는 화면을 향하게 합니다.
전원 켜기 및 보정
- 전원 버튼을 한 번 누릅니다. 상태 표시등이 빨간색으로 바뀌었다가 파란색으로 바뀝니다. 파란색은 장치의 IMU가 자체 보정 중임을 나타냅니다.
- 자체 보정 후에는 상태 표시등이 0.5초에 한 번씩 빨간색으로 깜박입니다. 이것은 대기 모드입니다.
- 대기 모드에서 디바이스를 깨우려면 아무 버튼이나 누릅니다. 깨어나는 동안 상태 표시등이 녹색으로 깜박이다가 녹색으로 고정됩니다. 이제 무선으로 데이터를 전송 중입니다.
재보정
- 재보정하려면 보정 버튼을 3초 동안 길게 누르거나 시뮬레이션에서 방향이 바뀐 것을 확인할 때까지 누릅니다.
대기 및 전원 끄기
- 전원 버튼을 다시 누르면 대기 모드로 돌아갑니다. 상태 표시등이 빨간색으로 바뀌고 2초마다 깜박이며 데이터 전송이 중지됩니다.
- 버즈그립을 끄려면 전원 버튼을 5초간 누르고 있다가 놓습니다. 손을 놓으면 상태 표시등이 꺼지고 아무 표시도 나타나지 않습니다. 데이터 전송이 중지됩니다.
충전
- USB-C 충전 단자를 통해 스타일러스 버즈그립을 전원에 연결합니다.
- 전원을 연결하면 충전 표시등이 파란색으로 켜지고, 완전히 충전되면 파란색으로 빠르게 깜박입니다. 전원을 연결하면 기기가 시작되고 대기 상태가 됩니다.
상태 및 표시등 표시기
상태 표시등 색상 및 동작 | 상태 |
---|---|
빨간색, 단색 | 구성 요소 초기화 보류 중 |
파란색, 단색 | 핸들의 IMU가 자체 보정 중입니다. |
빨간색, 2초마다 깜박임 | 대기 모드. 데이터 전송이 없습니다. |
녹색, 2초마다 깜박임 | 일반 모드, 자동으로 무선으로 데이터를 전송합니다. |
빛이 없으면 표시도 없습니다. | 전원이 꺼져 있습니다. |
충전 표시등 색상 | 상태 |
---|---|
파란색, 단색 | 충전 |
파란색, 빠르게 깜박임 | 기기가 완전히 충전되었음을 나타냅니다. |
빛이 없으면 표시도 없습니다. | 장치가 충전 중이 아닙니다. |
샘플 코드
다음은 C++에서 Versegrip 스타일러스를 사용하는 간단한 예제입니다.
- 인버스 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 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);
}
}