Schnellstart: Stylus VerseGrip
VerseGrips erweitern den Inverse3 um eine Orientierungsfunktion. In diesem Artikel werden die Einrichtung des Stylus VerseGrip und seine Funktionen beschrieben.
Der Stylus VerseGrip
Der Stylus VerseGrip PROTOTYPE Inverse3 nutzt modernste, proprietäre drahtlose Hochgeschwindigkeits-Kommunikationstechnologie, um Orientierung und E/A direkt in der Hand zu ermöglichen. Eine neue Vision dessen, was in diesem Bereich möglich ist, für unübertroffene Vielseitigkeit.
Einige der unglaublichen Funktionen, die wir für Sie entwickelt haben:
- 2 Tasten zur Benutzereingabe,
- 1 Kalibrierungstaste,
- 1 Netz-/Standby-Taste und
- 2 RGB-LED-Anzeigeleuchten
- 10-12 Stunden Akkulaufzeit
- USB-c-Anschluss zum Aufladen
- Drahtlose Kommunikationsgeschwindigkeit bis zu 1 KHz
- Bis zu 8 VerseGrips können sich mit einem Dongle auf einem einzigen Band verbinden
Kundenbetreuung
Wenn Sie jemals Fragen oder Bedenken zu Ihrem Gerät und dessen Verwendung haben, zögern Sie nicht, uns zu kontaktieren, wir würden uns freuen, Ihre Fragen zu beantworten. Der Stylus VerseGrip PROTOTYPE ist ein funktionsfähiges Gerät mit komplexer und geschützter Funktechnologie im Inneren. Jeder Versuch, das Gerät zu öffnen, führt nicht nur zum Erlöschen der Garantie, sondern kann das Gerät sehr schnell unbrauchbar machen. Um langwierige Versand- und kostspielige Reparaturprozesse zu vermeiden, versuchen Sie NICHT, das Gerät zu öffnen.
Stylus VerseGrip Einrichten und Kalibrieren
In diesem Abschnitt werden die Schritte des Anschließens des Dongles, des Einschaltens des VerseGrip und der Kalibrierung beschrieben.
Einrichten
- Stecken Sie den Dongle in eine USB-Buchse an Ihrem Computer.
- Legen Sie den Griff auf eine ebene Fläche, auf der er sich nicht bewegen kann, wobei die Tasten nach oben und der Kugelstecker auf den Bildschirm gerichtet sein müssen.
Einschalten und Kalibrierung
- Drücken Sie einmal die Einschalttaste. Die Statusleuchte wird rot und wechselt dann zu blau. Blau zeigt an, dass die IMU im Gerät eine Selbstkalibrierung durchläuft.
- Nach der Selbstkalibrierung blinkt die Statusleuchte alle 0,5 Sekunden einmal rot. Dies ist der Standby-Modus.
- Drücken Sie eine beliebige Taste, um das Gerät aus dem Standby-Modus aufzuwecken. Die Statusanzeige blinkt grün, während das Gerät hochfährt, und leuchtet dann dauerhaft grün. Das Gerät überträgt nun Daten an das WLAN.
Rekalibrierung
- Zur Neukalibrierung halten Sie die Kalibrierungstaste drei Sekunden lang gedrückt, oder bis Sie sehen, dass sich die Ausrichtung in Ihrer Simulation verschoben hat.
Standby und Ausschalten
- Drücken Sie die Netztaste erneut, um in den Standby-Modus zurückzukehren. Die Statusleuchte leuchtet rot und blinkt alle 2 Sekunden, und die Datenübertragung wird beendet.
- Um den VerseGrip auszuschalten, halten Sie die Einschalttaste 5 Sekunden lang gedrückt und lassen Sie sie dann los. Wenn Sie loslassen, sollte die Statusleuchte erlöschen und es werden keine Anzeigen mehr angezeigt. Es werden keine Daten mehr übertragen.
Aufladen
- Schließen Sie den Stylus VerseGrip über die USB-C-Ladebuchse an den Strom an.
- Die Ladelampe leuchtet blau, wenn das Gerät an das Stromnetz angeschlossen ist, und bei voller Ladung blinkt sie schnell blau. Wenn Sie das Gerät an das Stromnetz anschließen, startet es und geht in den Standby-Modus.
Zustände und Lichtindikatoren
Status Lichtfarbe und Verhalten | Staat |
---|---|
Rot, einfarbig | Anstehende Initialisierung von Komponenten |
Blau, einfarbig | Die IMU im Griff wird selbst kalibriert |
Rot, blinkt alle 2 Sekunden | Standby-Modus. Keine Datenübertragung. |
Grün, blinkt alle 2 Sekunden | Normaler Modus, automatische Übertragung von Daten an den Funk. |
Kein Licht, keine Anzeige | Der Strom ist ausgeschaltet. |
Farbe der Ladekontrollleuchte | Staat |
---|---|
Blau, einfarbig | Aufladen |
Blau, schnell blinkend | Dies zeigt an, dass das Gerät vollständig aufgeladen ist. |
Kein Licht, keine Anzeige | Das Gerät wird nicht geladen |
Beispiel-Code
Hier ist ein einfaches Beispiel für die Verwendung des Versegrip Stylus mit C++.
- Inverse SDK
- HardwareAPI
#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);
}
}