本文へスキップ

クイックスタートスタイラス・ヴァースグリップ

VerseGripsは、Inverse3にオリエンテーショントラッキング機能を追加します。この記事では、Stylus VerseGripのセットアップ手順とその特徴について説明します。

スタイラス・ヴァースグリップ

Stylus VerseGrip PROTOTYPE Inverse3は、最先端の独自エッジ高速ワイヤレス通信技術を応用し、オリエンテーションとインユアハンドI/Oを提供します。このスペースで可能なことを再構築し、比類のない汎用性を実現します。

私たちがあなたのために作った素晴らしい機能の一部:

  • 2つのユーザー入力ボタン
  • 1キャリブレーションボタン、
  • 電源/スタンバイボタン×1
  • 2インジケーターRGB LEDライト
  • 10-12時間のバッテリー寿命
  • 充電用USB-c接続
  • 最大1KHzのワイヤレス通信速度
  • 1つのバンドで最大8個のVerseGripsをドングルにペアリング可能

カスタマーサポート

デバイスや使用方法についてご質問やご不明な点がございましたら、ご遠慮なくお問い合わせください。 Stylus VerseGrip PROTOTYPEは、複雑な独自のワイヤレス技術を内蔵した機能的なデバイスです。デバイスを開けようとすると、保証が無効になるだけでなく、デバイスがすぐに使用できなくなる可能性があります。長時間の輸送や高額な修理費用を避けるため、デバイスを開けようとしないでください。

スタイラス・ヴァースグリップのセットアップとキャリブレーション

このセクションでは、ドングルの接続、VerseGripの電源オン、キャリブレーションの手順について説明します。

セットアップ

  • ドングルをコンピュータのUSBレセプタクルに差し込む。
  • ハンドルは動かないように平らな場所に置き、ボタンは上に向け、ボールコネクターはスクリーンに向ける。

電源オンとキャリブレーション

  • 電源ボタンを1回押します。ステータスランプが赤色に変わり、その後青色に変わります。青色は、デバイス内のIMUが自己校正中であることを示します。
  • 自己較正後、ステータス・ライトは0.5秒に1回赤色に点滅します。これはスタンバイモードです。
  • いずれかのボタンを押して、スタンバイモードからデバイスを起動します。起動中はステータスライトが緑色に点滅し、その後緑色の点灯に変わります。ワイヤレスにデータを送信中です。

再校正

  • 再キャリブレーションを行うには、キャリブレーションボタンを3秒間、またはシミュレーションで方位がずれたことが確認できるまで押し続けます。

スタンバイと電源オフ

  • 電源ボタンをもう一度押すと、スタンバイ・モードに戻ります。ステータス・ライトが赤くなり、2秒ごとに点滅し、データ通信が停止します。
  • VerseGripの電源を切るには、電源ボタンを5秒間押したまま放します。離すとステータスランプが消え、何も表示されなくなります。データの送信は停止します。

充電

  • USB-C充電レセプタクルを介してStylus VerseGripを電源に接続します。
  • 電源に差し込むと充電ランプが青く点灯し、フル充電されると急速に青く点滅します。電源に接続すると、デバイスが起動し、スタンバイ状態になります。

ステートとライト・インジケータ

ステータス・ライトの色と動作
赤、ソリッドコンポーネントの初期化保留
ブルー、ソリッドハンドルのIMUが自己校正中
赤、2秒ごとに点滅スタンバイモード。データ通信はできない。
緑、2秒ごとに点滅ノーマルモード、自動的に無線にデータを送信する。
ライトなし、表示なし電源が切れている。
充電表示灯の色
ブルー、ソリッド充電
青色、急速に点滅これは、デバイスが完全に充電されていることを示す。
ライトなし、表示なしデバイスが充電されていない

サンプルコード

C++でヴァースグリップ・スタイラスを使う簡単な例を紹介しよう。

#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;
}