APIリファレンス
ContactGlove C++/C/Rust SDK V2は、ContactGloveデバイスとやり取りするためのC++ライブラリです。
セットアップと組込み
対応OS・CPU、実行時とビルド時の要件、配布物の導入、CMake/C/Rust組込み、 トラブルシュートはSDKガイドを参照してください。
使用例
DivingStationへの接続と切断
DivingStationへの接続には ConnectToHost を使います。
ConnectToHost に渡す接続情報は、ホスト名、IPアドレス、DivingStationの受信ポート、SDKの受信ポートからなります。ホスト名は、ホストを区別するための任意のラベルです。IPアドレスは、DivingStationを実行しているPCに割り当てられたものです。DivingStationの受信ポートは、SDKからのOSCリクエストを受け付けます。通常は25791ですが、DivingStationで変更できます。変更した場合は、その値を使ってください。SDKの受信ポートは、DivingStationからのデータストリームを受け付けます。
DivingStationからの切断には Disconnect を使います。
#include <chrono>
#include <iostream>
#include <thread>
#include "contactglove/ContactGloveSDKv2.hpp"
int main() {
ContactGloveSDKv2::SDK sdk;
// Set the connection information.
ContactGloveSDKv2::Host host{"localhost", "127.0.0.1", 25791, 25788};
// Connect to DivingStation.
sdk.ConnectToHost(host);
// Perform application-specific work.
// Disconnect from DivingStation.
sdk.Disconnect(host);
return(0);
}データの取得
次の関数で、グローブに関連する情報を取得できます。どの関数も、呼び出した時点で得られる値を返します。
| 取得できる値 | 関数 |
|---|---|
| グローブの情報 | GetDataForGlove |
| グローブが振動に対応しているか | DoesGloveSupportHaptics |
| 各指関節の開き角と曲げ角 | GetErgonomicsDataForGlove |
| 各指関節の位置と回転 | GetSkeletonDataForGlove |
| センサーの生の位置と回転 | GetRawSensorTransformsForGlove |
| グローブに付けたコントローラーの入力 | GetControllerDataForGlove |
| 接続中のすべてのグローブのID | GetIdsOfAvailableGloves |
| 接続中のグローブの数 | GetNumberofAvailableGloves |
グローブのデータは非同期に届きます。ConnectToHost の成功はローカルセッションの開始を示すもので、接続承認やデータの受信を確認するものではありません。データの取得には、DivingStationから受信したグローブIDを使ってください。複数のグローブがある場合は、IDや isLeft などの属性で対象を選びます。
同梱の share/ContactGloveSDKv2/examples/basic_usage.cpp は、同じPC上のDivingStation(127.0.0.1)を使ったコールバックとポーリングの例です。最初に受信したIDを取得対象とし、約5秒後に切断します。
LAN接続に承認が必要な場合は、承認とデータを待つ間、同じセッションを維持してください。Disconnect を呼ぶと承認待ちや承認済みの状態が失われることがあります。接続要求の成功は承認完了を意味しません。
更新を自動で受け取る
グローブに関連する値が変わったときに自動で更新を受け取るには、コールバック関数を登録します。
コールバックはSDKの受信スレッドで実行され、キャッシュされたデータを読み取れます。あるコールバックが例外を投げても、残りのコールバックとレコードの配信は続きます。コールバック内でこのSDKの接続・切断・破棄を行わず、別のスレッドで処理してください。Disconnectは実行中のコールバックが終わるまで待機します。SDKへアクセスするコールバックは、SDKの破棄を始める前に完了させてください。
| コールバックが呼ばれる更新 | 関数 |
|---|---|
| グローブの情報 | RegisterCallbackForGloveDataStream |
| 各指関節の開き角と曲げ角 | RegisterCallbackForErgonomicsStream |
| 各指関節の位置と回転 | RegisterCallbackForSkeletonStream |
| センサーの生の位置と回転 | RegisterCallbackForRawSensorTransformsStream |
| グローブに付けたコントローラーの入力 | RegisterCallbackForControllerDataStream |
コールバックとポーリングの完全な例は、同梱の share/ContactGloveSDKv2/examples/basic_usage.cpp を参照してください。この例は約5秒で終了します。
C ABIとRust Binding
include/contactglove/ContactGloveSDKv2C.h は、ContactGlove C++/C/Rust SDK V2のC++/C/Rust FFIヘッダーです。追加のヘッダーなしで、C言語から直接使えます。C ABI v2は、不透明ハンドル、固定幅の数値型、UTF-8の文字列ビュー、呼び出し側が用意するバッファ、購読トークンを提供します。
C ABIのデータ構造の多くはこのページで説明するC++の型に対応しますが、ライフタイムとメモリの取り決めが異なります。文字列を含むポーリング結果では、呼び出し側が cg_string_buffer_t でバッファを渡します。CG_RESULT_BUFFER_TOO_SMALL が返った場合でも、length には必要な文字数が入ります。十分な領域を確保して、同じ関数を呼び直してください。SDKが返したメモリを解放する必要はありません。
ストリームの購読は cg_sdk_subscribe_* と cg_sdk_unsubscribe で管理します。コールバックに渡されるビューは、そのコールバックの呼び出し中だけ有効です。cg_sdk_unsubscribe が成功した時点で、そのコールバックは実行中ではありません。コールバックの中から切断すること、SDKを破棄すること、購読を解除することには対応していません。
v2の更新では、デバイスのフィールド is_external_power_present と無効値 battery_percentage=-1、エルゴノミクスデータとスケルトンデータの tracking_state、リターゲット済みスケルトンデータの profile_uuid、HandSkeletonRaw、リターゲットプロファイル情報の要求・応答メッセージが公開されます。Rust Bindingも、同じ問い合わせとコールバックの機能を提供します。C ABIとRustの数値フィールド color は、デバイスの表示色設定を表すDeviceColorの値です。数値フィールド tracking_state はTrackingStateの値で、IkFailedとNotAttemptedには同じく表示・診断用途の制約があります。接続中、SDKは30秒ごとにConnectを再送し、Connect・Disconnect・振動の要求に同じ送信ソケットを使い回します。
公式のRustワークスペースは、配布物の rust/ に含まれています。contactglove-sdk-v2-sys はC ABIの層を、contactglove-sdk-v2 は所有権を持つ型とRAIIによる購読を提供します。
定義されている型と関数
このSDKでは、次の型と関数が定義されています。
クラス
| 名前 | 説明 |
|---|---|
SDK | ContactGlove SDKのメインクラス。 |
GloveData | グローブデバイスの情報を保持する構造体。 |
Host | DivingStationのホストを表す構造体。 |
Vec3 | 3次元ベクトル。 |
Quaternion | 回転を表すクォータニオン。 |
Transform | 位置と回転を組み合わせた変換。 |
ControllerData | コントローラーの入力状態を保持する構造体。 |
ErgonomicsData | 指の開き角と曲げ角のデータを保持する構造体。 |
SkeletonData | 手のスケルトンデータ(関節の位置と回転)を保持する構造体。 |
RawSkeletonData | リターゲット前の手のスケルトンデータ。 |
RetargetProfileInfo | リターゲットプロファイルの情報を含む応答。 |
RawSensorTransformsData | 片手分のセンサーの生の変換データを保持する構造体。 |
列挙型
| 名前 | 説明 |
|---|---|
DeviceFamilyType | デバイスファミリーの列挙型。 |
DeviceColor | デバイスの表示色設定の列挙型。 |
DeviceConnectedState | デバイスの接続状態の列挙型。 |
TrackingState | IKで求めたデータのトラッキング状態。 |
SDKReturnCode | SDKの関数が使う戻り値のコード。 |
ButtonStatus | ボタンの状態の列挙型。 |
ErgonomicsDataType | エルゴノミクスデータの各要素が表す関節を識別する列挙型。 |
SkeletonDataType | スケルトンデータの各要素が表す関節を識別する列挙型。 |
DeviceFamilyType
enum DeviceFamilyTypeデバイスファミリーの列挙型です。
主な対象はContactGlove3です。
| 値 | 説明 |
|---|---|
ContactGlove | ContactGlove。 |
ContactSheet | ContactSheet。 |
ContactGlove2 | ContactGlove2。 |
ContactGlove3 | ContactGlove3。 |
DeviceColor
enum DeviceColorデバイスの表示色設定の列挙型です。
表示色の型名の移行
公開型名はDeviceColorです。LedColor::Greenなどの参照をDeviceColor::Greenへ変更して再ビルドしてください。
LedColorはC++のDeviceColor互換エイリアスとして残るため、既存ソースも引き続きコンパイルできます。
新しいコードではDeviceColorを使ってください。GloveData.colorのメンバー名と色の数値は同じです。
C ABIのバージョンは2のままです。C ABIとRustのcolor整数フィールド、OSCの通信形式も変わりません。
| 値 | 説明 |
|---|---|
Magenta | マゼンタ。 |
Red | 赤。 |
Orange | オレンジ。 |
Yellow | 黄。 |
Green | 緑。 |
Cyan | シアン。 |
Blue | 青。 |
Achromatic | 無彩色。 |
DeviceConnectedState
enum DeviceConnectedStateデバイスの接続状態の列挙型です。
| 値 | 説明 |
|---|---|
Unknown | 状態が不明。 |
Connected | 接続済み。 |
Unconnected | 未接続。 |
Pairing | 接続を試行中。 |
TrackingState
enum TrackingStateIKで求めたデータのトラッキング状態です。
NotAttemptedは、必要なIK処理が実行されなかったことを表します。前段の処理失敗や入力不足のほか、更新間隔の制御で既存の姿勢を再利用するなど、姿勢計算が不要と判断された場合も含みます。この状態自体はIKの失敗を意味しません。
IkFailedとNotAttemptedの値は表示や診断には使えますが、制御・速度推定・補間には使わないでください。これらの用途で有効なのはTrackedの値だけです。
SkeletonDataはリターゲットIK、RawSkeletonDataとErgonomicsDataはソーススケルトンIKの状態を表し、同じ時刻でも状態が異なる場合があります。リターゲットIKのNotAttemptedにも、姿勢計算が不要と判断された場合が含まれます。
| 値 | 説明 |
|---|---|
Tracked | 今回のIK処理で得られた有効な結果。 |
IkFailed | IK処理を試みたが失敗した。 |
NotAttempted | 更新間隔による意図的な省略などでIK処理を実行しなかった。 |
SDKReturnCode
enum SDKReturnCodeSDKの関数が使う戻り値のコードです。
関数呼び出しの結果、またはエラーの種類を示します。
| 値 | 説明 |
|---|---|
Success | 処理が正常に完了しました。 |
SdkNotAvailable | SDK、または要求した機能が利用できません。 |
NotConnected | DivingStationに接続していません。 |
InvalidID | 指定したIDが存在しません。 |
InvalidArgument | 引数が有効な範囲外です。 |
ButtonStatus
enum ButtonStatusボタンの状態の列挙型です。
| 値 | 説明 |
|---|---|
Unpressed | 押されていない。 |
Touching | タッチセンサーが接触を検出した。 |
Pressed | 押されている。 |
ErgonomicsDataType
enum ErgonomicsDataTypeエルゴノミクスデータの各要素が表す関節を識別する列挙型です。
左手の値は0〜19、右手の値は20〜39ですが、ErgonomicsData::data が保持するのは常に片手分(20要素)だけです。値を ErgonomicsData::data のインデックスとして使うには、static_cast<uint32_t>(type) % ERGONOMICS_DATA_COUNT を使います。値の単位は度です。
命名規則:(Left|Right){finger name}{joint name}{motion type}。
| 値 | 説明 |
|---|---|
LeftThumbCMCFlex | 左手親指のCMC関節の屈曲角。 |
LeftThumbMCPFlex | 左手親指のMCP関節の屈曲角。 |
LeftThumbIPFlex | 左手親指のIP関節の屈曲角。 |
LeftThumbMCPTilt | 左手親指のMCP関節の傾き角。 |
LeftIndexMCPFlex | 左手人差し指のMCP関節の屈曲角。 |
LeftIndexPIPFlex | 左手人差し指のPIP関節の屈曲角。 |
LeftIndexDIPFlex | 左手人差し指のDIP関節の屈曲角。 |
LeftIndexMCPTilt | 左手人差し指のMCP関節の傾き角。 |
LeftMiddleMCPFlex | 左手中指のMCP関節の屈曲角。 |
LeftMiddlePIPFlex | 左手中指のPIP関節の屈曲角。 |
LeftMiddleDIPFlex | 左手中指のDIP関節の屈曲角。 |
LeftMiddleMCPTilt | 左手中指のMCP関節の傾き角。 |
LeftRingMCPFlex | 左手薬指のMCP関節の屈曲角。 |
LeftRingPIPFlex | 左手薬指のPIP関節の屈曲角。 |
LeftRingDIPFlex | 左手薬指のDIP関節の屈曲角。 |
LeftRingMCPTilt | 左手薬指のMCP関節の傾き角。 |
LeftLittleMCPFlex | 左手小指のMCP関節の屈曲角。 |
LeftLittlePIPFlex | 左手小指のPIP関節の屈曲角。 |
LeftLittleDIPFlex | 左手小指のDIP関節の屈曲角。 |
LeftLittleMCPTilt | 左手小指のMCP関節の傾き角。 |
RightThumbCMCFlex | 右手親指のCMC関節の屈曲角。 |
RightThumbMCPFlex | 右手親指のMCP関節の屈曲角。 |
RightThumbIPFlex | 右手親指のIP関節の屈曲角。 |
RightThumbMCPTilt | 右手親指のMCP関節の傾き角。 |
RightIndexMCPFlex | 右手人差し指のMCP関節の屈曲角。 |
RightIndexPIPFlex | 右手人差し指のPIP関節の屈曲角。 |
RightIndexDIPFlex | 右手人差し指のDIP関節の屈曲角。 |
RightIndexMCPTilt | 右手人差し指のMCP関節の傾き角。 |
RightMiddleMCPFlex | 右手中指のMCP関節の屈曲角。 |
RightMiddlePIPFlex | 右手中指のPIP関節の屈曲角。 |
RightMiddleDIPFlex | 右手中指のDIP関節の屈曲角。 |
RightMiddleMCPTilt | 右手中指のMCP関節の傾き角。 |
RightRingMCPFlex | 右手薬指のMCP関節の屈曲角。 |
RightRingPIPFlex | 右手薬指のPIP関節の屈曲角。 |
RightRingDIPFlex | 右手薬指のDIP関節の屈曲角。 |
RightRingMCPTilt | 右手薬指のMCP関節の傾き角。 |
RightLittleMCPFlex | 右手小指のMCP関節の屈曲角。 |
RightLittlePIPFlex | 右手小指のPIP関節の屈曲角。 |
RightLittleDIPFlex | 右手小指のDIP関節の屈曲角。 |
RightLittleMCPTilt | 右手小指のMCP関節の傾き角。 |
SkeletonDataType
enum SkeletonDataTypeスケルトンデータの各要素が表す関節を識別する列挙型です。
この列挙型は SkeletonData::transforms のインデックスとして使います。片手分のSKELETON_NODE_COUNT個の要素に対応します。
命名規則:Skeleton{finger}{joint name} または Skeleton{finger}Tip。
| 値 | 説明 |
|---|---|
SkeletonWrist | 手首。 |
SkeletonThumbCMC | 親指のCMC関節。 |
SkeletonThumbMCP | 親指のMCP関節。 |
SkeletonThumbIP | 親指のIP関節。 |
SkeletonThumbTip | 親指の先端。 |
SkeletonIndexCMC | 人差し指のCMC関節。 |
SkeletonIndexMCP | 人差し指のMCP関節。 |
SkeletonIndexPIP | 人差し指のPIP関節。 |
SkeletonIndexDIP | 人差し指のDIP関節。 |
SkeletonIndexTip | 人差し指の先端。 |
SkeletonMiddleCMC | 中指のCMC関節。 |
SkeletonMiddleMCP | 中指のMCP関節。 |
SkeletonMiddlePIP | 中指のPIP関節。 |
SkeletonMiddleDIP | 中指のDIP関節。 |
SkeletonMiddleTip | 中指の先端。 |
SkeletonRingCMC | 薬指のCMC関節。 |
SkeletonRingMCP | 薬指のMCP関節。 |
SkeletonRingPIP | 薬指のPIP関節。 |
SkeletonRingDIP | 薬指のDIP関節。 |
SkeletonRingTip | 薬指の先端。 |
SkeletonLittleCMC | 小指のCMC関節。 |
SkeletonLittleMCP | 小指のMCP関節。 |
SkeletonLittlePIP | 小指のPIP関節。 |
SkeletonLittleDIP | 小指のDIP関節。 |
SkeletonLittleTip | 小指の先端。 |
型の別名
| 戻り値 | 名前 | 説明 |
|---|---|---|
uint64_t | Timestamp | Unix時間をミリ秒で表す整数型。 |
std::string | GloveId | グローブデバイスの識別子。 |
DeviceColor | LedColor | DeviceColorの互換エイリアス。新しいコードではDeviceColorを使用。 |
std::function< void(const GloveData &)> | GloveDataStreamCallback_t | グローブのデータが更新されたときに呼ばれるコールバック関数の型。 |
std::function< void(const ControllerData &)> | ControllerDataStreamCallback_t | コントローラーのデータが更新されたときに呼ばれるコールバック関数の型。 |
std::function< void(const ErgonomicsData &)> | ErgonomicsStreamCallback_t | エルゴノミクスデータが更新されたときに呼ばれるコールバック関数の型。 |
std::function< void(const SkeletonData &)> | SkeletonStreamCallback_t | スケルトンデータが更新されたときに呼ばれるコールバック関数の型。 |
std::function< void(const RawSkeletonData &)> | RawSkeletonStreamCallback_t | |
std::function< void(const RawSensorTransformsData &)> | RawSensorTransformsStreamCallback_t | センサーの生の変換データが更新されたときに呼ばれるコールバック関数の型。 |
std::function< void(const RetargetProfileInfo &)> | RetargetProfileInfoCallback_t |
Timestamp
uint64_t Timestamp()Unix時間をミリ秒で表す整数型です。
GloveId
std::string GloveId()グローブデバイスの識別子です。
LedColor
DeviceColor LedColor()DeviceColorの互換エイリアスです。新しいコードではDeviceColorを使ってください。
GloveDataStreamCallback_t
std::function< void(const GloveData &)> GloveDataStreamCallback_t()グローブのデータが更新されたときに呼ばれるコールバック関数の型です。
ControllerDataStreamCallback_t
std::function< void(const ControllerData &)> ControllerDataStreamCallback_t()コントローラーのデータが更新されたときに呼ばれるコールバック関数の型です。
ErgonomicsStreamCallback_t
std::function< void(const ErgonomicsData &)> ErgonomicsStreamCallback_t()エルゴノミクスデータが更新されたときに呼ばれるコールバック関数の型です。
SkeletonStreamCallback_t
std::function< void(const SkeletonData &)> SkeletonStreamCallback_t()スケルトンデータが更新されたときに呼ばれるコールバック関数の型です。
RawSkeletonStreamCallback_t
std::function< void(const RawSkeletonData &)> RawSkeletonStreamCallback_t()RawSensorTransformsStreamCallback_t
std::function< void(const RawSensorTransformsData &)> RawSensorTransformsStreamCallback_t()センサーの生の変換データが更新されたときに呼ばれるコールバック関数の型です。
RetargetProfileInfoCallback_t
std::function< void(const RetargetProfileInfo &)> RetargetProfileInfoCallback_t()変数
| 戻り値 | 名前 | 説明 |
|---|---|---|
uint32_t | ERGONOMICS_DATA_COUNT | 片手あたりのエルゴノミクスデータの要素数(5本の指×4関節)。 |
uint32_t | SKELETON_NODE_COUNT | 片手あたりのスケルトンのノード数(手首、親指の4ノード、ほかの4本の指の各5ノード)。 |
uint32_t | SKELETON_DATA_COUNT | 片手あたりのスケルトンの変換の数。 |
uint32_t | RAW_SENSOR_TRANSFORM_COUNT | 片手あたりのセンサーの生の変換の数。 |
ERGONOMICS_DATA_COUNT
uint32_t ERGONOMICS_DATA_COUNT = 20片手あたりのエルゴノミクスデータの要素数(5本の指×4関節)です。
SKELETON_NODE_COUNT
uint32_t SKELETON_NODE_COUNT = 25片手あたりのスケルトンのノード数(手首、親指の4ノード、ほかの4本の指の各5ノード)です。
SKELETON_DATA_COUNT
uint32_t SKELETON_DATA_COUNT = SKELETON_NODE_COUNT片手あたりのスケルトンの変換の数です。
RAW_SENSOR_TRANSFORM_COUNT
uint32_t RAW_SENSOR_TRANSFORM_COUNT = 5片手あたりのセンサーの生の変換の数です。
SDK
#include <contactglove/ContactGloveSDKv2.hpp>ContactGlove SDKのメインクラスです。
公開メソッド
| 戻り値 | 名前 | 説明 |
|---|---|---|
SDK | ||
SDK | 削除されたコンストラクタ。 | |
SDKReturnCode | ConnectToHost | DivingStationに接続し、データストリームを開始します。 |
SDKReturnCode | Disconnect | DivingStationから切断します。 |
SDKReturnCode | DoesGloveSupportHaptics const | グローブが振動に対応しているかを問い合わせます。 |
SDKReturnCode | GetDataForGlove const | グローブIDを指定して、グローブの情報を取得します。 |
SDKReturnCode | GetControllerDataForGlove const | グローブIDを指定して、コントローラーの入力データを取得します。 |
SDKReturnCode | GetErgonomicsDataForGlove const | グローブIDを指定して、指の開き角と曲げ角のデータを取得します。 |
SDKReturnCode | GetSkeletonDataForGlove const | グローブIDを指定して、関節の位置と回転のデータを取得します。 |
SDKReturnCode | GetRawSkeletonDataForGlove const | グローブIDを指定して、リターゲット前の手のスケルトンデータを取得します。 |
SDKReturnCode | GetRawSensorTransformsForGlove const | グローブIDを指定して、センサーの生の変換データを取得します。 |
SDKReturnCode | GetIdsOfAvailableGloves const | 現在認識しているすべてのグローブのIDを取得します。 |
SDKReturnCode | GetNumberofAvailableGloves const | 現在認識しているグローブの総数を取得します。 |
SDKReturnCode | VibrateGlove | グローブを振動させます。 |
SDKReturnCode | RequestRetargetProfileInfo | リターゲットプロファイルの情報の要求を送ります。 |
SDKReturnCode | RegisterCallbackForGloveDataStream | グローブの情報が更新されたときに呼ばれるコールバックを登録します。 |
SDKReturnCode | RegisterCallbackForControllerDataStream | コントローラーのデータが更新されたときに呼ばれるコールバックを登録します。 |
SDKReturnCode | RegisterCallbackForErgonomicsStream | エルゴノミクスデータが更新されたときに呼ばれるコールバックを登録します。 |
SDKReturnCode | RegisterCallbackForSkeletonStream | スケルトンデータが更新されたときに呼ばれるコールバックを登録します。 |
SDKReturnCode | RegisterCallbackForRawSkeletonStream | |
SDKReturnCode | RegisterCallbackForRawSensorTransformsStream | センサーの生の変換データが更新されたときに呼ばれるコールバックを登録します。 |
SDKReturnCode | RegisterCallbackForRetargetProfileInfoStream |
SDK
SDK()SDK
SDK(const SDK &) = delete削除されたコンストラクタです。
ConnectToHost
SDKReturnCode ConnectToHost(const Host & p_Host)DivingStationに接続し、データストリームを開始します。
同じエンドポイントとポートで再び呼び出すと、既存のソケットを使ってConnectを再送します。sendPortが0の場合は、OSが選んだ送信元ポートもそのまま使います。LANでの承認を待つ間の自動リトライや、データが途絶えたときの復旧に使ってください。Successは要求を開始したことを意味し、LANでの承認を確認するものではありません。Disconnectはセッションを明示的に終了し、承認を取り消すことがあります。
引数
p_Host接続先のDivingStationインスタンスのホスト情報。
戻り値
SDKReturnCode::Success — 接続を開始しました。
戻り値
SDKReturnCode::SdkNotAvailable — ソケットを開けませんでした。
戻り値
SDKReturnCode::InvalidArgument — p_Host.sendPort が65535より大きい値です。
戻り値
SDKReturnCode::InvalidArgument — 受信ポートが、IPアドレス・送信先ポート・送信ポートのいずれかが異なる接続ですでに使われています。
Disconnect
SDKReturnCode Disconnect(const Host & p_Host)DivingStationから切断します。
引数
p_Host切断するホスト情報。ConnectToHost()に渡した値と一致している必要があります。
戻り値
SDKReturnCode::Success — 切断しました。
戻り値
SDKReturnCode::NotConnected — 指定したポートの接続がありません。
DoesGloveSupportHaptics
const
SDKReturnCode DoesGloveSupportHaptics(const std::string & id, bool * p_IsHaptics) constグローブが振動に対応しているかを問い合わせます。
引数
-
id問い合わせるグローブのID。 -
p_IsHaptics振動に対応しているかどうかの出力先。nullにはできません。
戻り値
SDKReturnCode::Success — 値を取得しました。
戻り値
SDKReturnCode::InvalidID — 指定したグローブが存在しません。
GetDataForGlove
const
SDKReturnCode GetDataForGlove(const std::string & id, GloveData * p_GloveData) constグローブIDを指定して、グローブの情報を取得します。
引数
-
id取得するグローブのID。 -
p_GloveData取得したデータの出力先。nullにはできません。
戻り値
SDKReturnCode::Success — データを取得しました。
戻り値
SDKReturnCode::InvalidID — 指定したグローブが存在しません。
GetControllerDataForGlove
const
SDKReturnCode GetControllerDataForGlove(const std::string & id, ControllerData * p_Controller) constグローブIDを指定して、コントローラーの入力データを取得します。
引数
-
id取得するグローブのID。 -
p_Controller取得したデータの出力先。nullにはできません。
戻り値
SDKReturnCode::Success — データを取得しました。
戻り値
SDKReturnCode::InvalidID — 指定したIDのデータが存在しないか、p_Controller がnullです。
GetErgonomicsDataForGlove
const
SDKReturnCode GetErgonomicsDataForGlove(const std::string & id, ErgonomicsData * p_ErgonomicsData) constグローブIDを指定して、指の開き角と曲げ角のデータを取得します。
引数
-
id取得するグローブのID。 -
p_ErgonomicsData取得したデータの出力先。nullにはできません。
戻り値
SDKReturnCode::Success — データを取得しました。
戻り値
SDKReturnCode::InvalidID — 指定したIDのデータが存在しないか、p_ErgonomicsData がnullです。
GetSkeletonDataForGlove
const
SDKReturnCode GetSkeletonDataForGlove(const std::string & id, SkeletonData * p_SkeletonData) constグローブIDを指定して、関節の位置と回転のデータを取得します。
引数
-
id取得するグローブのID。 -
p_SkeletonData取得したデータの出力先。nullにはできません。
戻り値
SDKReturnCode::Success — データを取得しました。
戻り値
SDKReturnCode::InvalidID — 指定したIDのデータが存在しないか、p_SkeletonData がnullです。
GetRawSkeletonDataForGlove
const
SDKReturnCode GetRawSkeletonDataForGlove(const std::string & id, RawSkeletonData * p_RawSkeletonData) constグローブIDを指定して、リターゲット前の手のスケルトンデータを取得します。
GetRawSensorTransformsForGlove
const
SDKReturnCode GetRawSensorTransformsForGlove(const std::string & id, RawSensorTransformsData * p_RawSensorTransforms) constグローブIDを指定して、センサーの生の変換データを取得します。
引数
-
id取得するグローブのID。 -
p_RawSensorTransforms取得したデータの出力先。nullにはできません。
戻り値
SDKReturnCode::Success — データを取得しました。
戻り値
SDKReturnCode::InvalidID — 指定したIDのデータが存在しないか、p_RawSensorTransforms がnullです。
GetIdsOfAvailableGloves
const
SDKReturnCode GetIdsOfAvailableGloves(GloveId * p_IdsOfAvailableGloves, uint32_t p_NumberOfIdsThatFitInArray) const現在認識しているすべてのグローブのIDを取得します。
出力先の配列が小さすぎる場合は、先頭の p_NumberOfIdsThatFitInArray 個のIDだけを書き込みます。総数は事前に GetNumberofAvailableGloves() で問い合わせてください。
引数
-
p_IdsOfAvailableGloves出力先のID配列の先頭要素へのポインタ。nullにはできません。 -
p_NumberOfIdsThatFitInArray出力先の配列の容量(要素数)。
戻り値
SDKReturnCode::Success — データを取得しました。
戻り値
SDKReturnCode::InvalidID — p_IdsOfAvailableGloves がnullです。
GetNumberofAvailableGloves
const
SDKReturnCode GetNumberofAvailableGloves(uint32_t * n) const現在認識しているグローブの総数を取得します。
引数
n数の出力先。nullにはできません。
戻り値
SDKReturnCode::Success — データを取得しました。
戻り値
SDKReturnCode::InvalidID — n がnullです。
VibrateGlove
SDKReturnCode VibrateGlove(const std::string & id, float frequency, float amplitude, float duration)グローブを振動させます。
引数
-
id振動させるグローブのID。 -
frequency振動の周波数(Hz、100.0〜500.0)。 -
amplitude振動の振幅(0.0〜1.0)。 -
duration振動の持続時間(秒、0.001〜1.0)。
戻り値
SDKReturnCode::Success — 要求を送信しました。
戻り値
SDKReturnCode::InvalidID — 指定したグローブが存在しません。
戻り値
SDKReturnCode::InvalidArgument — 引数が有効な範囲外です。
RequestRetargetProfileInfo
SDKReturnCode RequestRetargetProfileInfo(const std::string & profileUuid, int32_t requestId)リターゲットプロファイルの情報の要求を送ります。
RegisterCallbackForGloveDataStream
SDKReturnCode RegisterCallbackForGloveDataStream(GloveDataStreamCallback_t p_Callback)グローブの情報が更新されたときに呼ばれるコールバックを登録します。
コールバックは引数として GloveData を受け取ります。
引数
p_Callback登録するコールバック関数。
戻り値
SDKReturnCode::Success — 登録しました。
RegisterCallbackForControllerDataStream
SDKReturnCode RegisterCallbackForControllerDataStream(ControllerDataStreamCallback_t p_Callback)コントローラーのデータが更新されたときに呼ばれるコールバックを登録します。
引数
p_Callback登録するコールバック関数。
戻り値
SDKReturnCode::Success — 登録しました。
RegisterCallbackForErgonomicsStream
SDKReturnCode RegisterCallbackForErgonomicsStream(ErgonomicsStreamCallback_t p_Callback)エルゴノミクスデータが更新されたときに呼ばれるコールバックを登録します。
引数
p_Callback登録するコールバック関数。
戻り値
SDKReturnCode::Success — 登録しました。
RegisterCallbackForSkeletonStream
SDKReturnCode RegisterCallbackForSkeletonStream(SkeletonStreamCallback_t p_Callback)スケルトンデータが更新されたときに呼ばれるコールバックを登録します。
引数
p_Callback登録するコールバック関数。
戻り値
SDKReturnCode::Success — 登録しました。
RegisterCallbackForRawSkeletonStream
SDKReturnCode RegisterCallbackForRawSkeletonStream(RawSkeletonStreamCallback_t p_Callback)RegisterCallbackForRawSensorTransformsStream
SDKReturnCode RegisterCallbackForRawSensorTransformsStream(RawSensorTransformsStreamCallback_t p_Callback)センサーの生の変換データが更新されたときに呼ばれるコールバックを登録します。
引数
p_Callback登録するコールバック関数。
戻り値
SDKReturnCode::Success — 登録しました。
RegisterCallbackForRetargetProfileInfoStream
SDKReturnCode RegisterCallbackForRetargetProfileInfoStream(RetargetProfileInfoCallback_t p_Callback)GloveData
#include <contactglove/ContactGloveSDKv2.hpp>グローブデバイスの情報を保持する構造体です。
OSCアドレス /DS2/HC/Device で受信したデータに対応します。
公開属性
| 戻り値 | 名前 | 説明 |
|---|---|---|
std::string | id | デバイスID。 |
std::string | pairId | ペアになっているグローブのID。ペアがない場合は空。 |
int32_t | batteryPercentage | バッテリー残量(%)[0 - 100]。無効な場合は-1。 |
bool | isHaptics | 振動に対応しているかどうか。 |
bool | isLeft | 左手用のグローブかどうか。 |
DeviceFamilyType | familyType | デバイスファミリー。 |
DeviceColor | color | デバイスの表示色設定。 |
DeviceConnectedState | connectedState | 接続状態。 |
std::string | name | デバイス名。 |
bool | isExternalPowerPresent | 外部給電を検出しているかどうか。 |
id
std::string idデバイスIDです。
pairId
std::string pairIdペアになっているグローブのIDです。ペアがない場合は空です。
batteryPercentage
int32_t batteryPercentage = -1バッテリー残量(%)[0 - 100]です。無効な場合は-1です。
isHaptics
bool isHaptics = false振動に対応しているかどうかです。
isLeft
bool isLeft = false左手用のグローブかどうかです。
familyType
DeviceFamilyType familyType = DeviceFamilyType::ContactGloveデバイスファミリーです。
color
DeviceColor color = DeviceColor::Achromaticデバイスの表示色設定です。
connectedState
DeviceConnectedState connectedState = DeviceConnectedState::Unknown接続状態です。
name
std::string nameデバイス名です。
isExternalPowerPresent
bool isExternalPowerPresent = false外部給電を検出しているかどうかです。
Host
#include <contactglove/ContactGloveSDKv2.hpp>DivingStationのホストを表す構造体です。
この構造体は ConnectToHost() と Disconnect() に渡します。port はDivingStation側のOSC受信ポートです。receivePort はSDK側のOSC受信ポートです。sendPort はSDK側のOSC送信ポートで、0 の場合はOSが空いているポートを選びます。
公開属性
| 戻り値 | 名前 | 説明 |
|---|---|---|
std::string | hostName | ホストを区別するための任意のラベル。例:"localhost"。 |
std::string | ipAddress | IPアドレス。例:"127.0.0.1"。 |
uint32_t | port | DivingStation側のOSC受信ポート。 |
uint32_t | receivePort | SDK側のOSC受信ポート。 |
uint32_t | sendPort | SDK側のOSC送信ポート。0ならOSが空いているポートを選びます。 |
hostName
std::string hostNameホスト名です。例:"localhost"。
ipAddress
std::string ipAddressIPアドレスです。例:"127.0.0.1"。
port
uint32_t port = 25791DivingStation側のOSC受信ポートです。
receivePort
uint32_t receivePort = 25788SDK側のOSC受信ポートです。
sendPort
uint32_t sendPort = 0SDK側のOSC送信ポートです。0ならOSが空いているポートを選びます。
Vec3
#include <contactglove/ContactGloveSDKv2.hpp>3次元ベクトルです。
公開属性
x
float x = 0.0fX成分です。
y
float y = 0.0fY成分です。
z
float z = 0.0fZ成分です。
Quaternion
#include <contactglove/ContactGloveSDKv2.hpp>回転を表すクォータニオンです。
公開属性
w
float w = 1.0fスカラー成分です。
x
float x = 0.0fX成分です。
y
float y = 0.0fY成分です。
z
float z = 0.0fZ成分です。
Transform
#include <contactglove/ContactGloveSDKv2.hpp>位置と回転を組み合わせた変換です。
SkeletonData::transforms の各要素として使われます。
公開属性
position
Vec3 position位置です。
rotation
Quaternion rotation回転です。
ControllerData
#include <contactglove/ContactGloveSDKv2.hpp>コントローラーの入力状態を保持する構造体です。
公開属性
| 戻り値 | 名前 | 説明 |
|---|---|---|
std::string | id | グローブID。 |
bool | isLeft | 左手かどうか。 |
ButtonStatus | aButton | Aボタンの状態。 |
ButtonStatus | bButton | Bボタンの状態。 |
ButtonStatus | sysButton | システムボタンの状態。 |
ButtonStatus | triggerButton | トリガーボタンの状態。 |
ButtonStatus | joystickButton | ジョイスティックボタンの状態。 |
ButtonStatus | trackpadButton | トラックパッドのタッチ状態。 |
float | trigger | トリガーの値(0.0〜1.0)。 |
float | gripValue | グリップの値(0.0〜1.0)。 |
float | gripForce | グリップの力(0.0〜1.0)。 |
float | joystickX | ジョイスティックのX軸の値(-1.0〜1.0)。 |
float | joystickY | ジョイスティックのY軸の値(-1.0〜1.0)。 |
float | trackpadX | トラックパッドのX軸の値(-1.0〜1.0)。 |
float | trackpadY | トラックパッドのY軸の値(-1.0〜1.0)。 |
id
std::string idグローブIDです。
isLeft
bool isLeft = false左手かどうかです。
aButton
ButtonStatus aButton = ButtonStatus::UnpressedAボタンの状態です。
bButton
ButtonStatus bButton = ButtonStatus::UnpressedBボタンの状態です。
sysButton
ButtonStatus sysButton = ButtonStatus::Unpressedシステムボタンの状態です。
triggerButton
ButtonStatus triggerButton = ButtonStatus::Unpressedトリガーボタンの状態です。
joystickButton
ButtonStatus joystickButton = ButtonStatus::Unpressedジョイスティックボタンの状態です。
trackpadButton
ButtonStatus trackpadButton = ButtonStatus::Unpressedトラックパッドのタッチ状態です。
trigger
float trigger = 0.0fトリガーの値(0.0〜1.0)です。
gripValue
float gripValue = 0.0fグリップの値(0.0〜1.0)です。
gripForce
float gripForce = 0.0fグリップの力(0.0〜1.0)です。
joystickX
float joystickX = 0.0fジョイスティックのX軸の値(-1.0〜1.0)です。
joystickY
float joystickY = 0.0fジョイスティックのY軸の値(-1.0〜1.0)です。
trackpadX
float trackpadX = 0.0fトラックパッドのX軸の値(-1.0〜1.0)です。
trackpadY
float trackpadY = 0.0fトラックパッドのY軸の値(-1.0〜1.0)です。
ErgonomicsData
#include <contactglove/ContactGloveSDKv2.hpp>指の開き角と曲げ角のデータを保持する構造体です。
data には片手分のERGONOMICS_DATA_COUNT個の要素が入ります。値の単位は度です。各インデックスの意味はErgonomicsDataTypeを参照してください。
公開属性
| 戻り値 | 名前 | 説明 |
|---|---|---|
std::string | id | グローブID。 |
bool | isLeft | 左手かどうか。 |
Timestamp | generatedAt | フレームの生成時刻(Unix時間、ミリ秒)。 |
TrackingState | trackingState | IKで求めたデータのトラッキング状態。 |
std::array< float, ERGONOMICS_DATA_COUNT > | data | 関節ごとの開き角と曲げ角の値(片手分20要素、単位は度)。 |
id
std::string idグローブIDです。
isLeft
bool isLeft = false左手かどうかです。
generatedAt
Timestamp generatedAt = 0フレームの生成時刻(Unix時間、ミリ秒)です。
trackingState
TrackingState trackingState = TrackingState::TrackedIKで求めたデータのトラッキング状態です。
NotAttemptedは、必要なIK処理が実行されなかったことを表します。前段の処理失敗や入力不足のほか、更新間隔の制御で既存の姿勢を再利用するなど、姿勢計算が不要と判断された場合も含みます。この状態自体はIKの失敗を意味しません。
IkFailedとNotAttemptedの値は表示や診断には使えますが、制御・速度推定・補間には使わないでください。これらの用途で有効なのはTrackedの値だけです。
SkeletonDataはリターゲットIK、RawSkeletonDataとErgonomicsDataはソーススケルトンIKの状態を表し、同じ時刻でも状態が異なる場合があります。リターゲットIKのNotAttemptedにも、姿勢計算が不要と判断された場合が含まれます。
data
std::array< float, ERGONOMICS_DATA_COUNT > data {}関節ごとの開き角と曲げ角の値(片手分20要素、単位は度)です。
SkeletonData
#include <contactglove/ContactGloveSDKv2.hpp>手のスケルトンデータ(関節の位置と回転)を保持する構造体です。
transforms には片手分のSKELETON_DATA_COUNT個の要素が入ります。各インデックスの意味はSkeletonDataTypeを参照してください。 位置は手首を原点とする右手系の手モデル座標で、単位はメートルです。+Xは指先から手首、+Yは手のひらから手の甲に向かい、+Zは右手では小指から親指、左手では親指から小指に向かいます。回転は親関節に対するローカルクォータニオンです。手首と指先の回転は単位クォータニオンのプレースホルダーであり、計測値ではありません。この規約はスケルトンの変換に適用されます。生センサーの回転は手モデル座標系での向きを表します。
公開属性
| 戻り値 | 名前 | 説明 |
|---|---|---|
std::string | id | グローブID。 |
std::string | profileUuid | リターゲットプロファイルの固定のUUID。 |
bool | isLeft | 左手かどうか。 |
Timestamp | generatedAt | フレームの生成時刻(Unix時間、ミリ秒)。 |
TrackingState | trackingState | リターゲットIKのトラッキング状態。 |
std::array< Transform, SKELETON_DATA_COUNT > | transforms | ノードごとの位置と回転(25要素)。 |
id
std::string idグローブIDです。
profileUuid
std::string profileUuidリターゲットプロファイルの固定のUUIDです。
isLeft
bool isLeft = false左手かどうかです。
generatedAt
Timestamp generatedAt = 0フレームの生成時刻(Unix時間、ミリ秒)です。
trackingState
TrackingState trackingState = TrackingState::TrackedリターゲットIKのトラッキング状態です。
transforms
std::array< Transform, SKELETON_DATA_COUNT > transforms {}ノードごとの位置と回転(25要素)です。
RawSkeletonData
#include <contactglove/ContactGloveSDKv2.hpp>リターゲット前の手のスケルトンデータです。
公開属性
| 戻り値 | 名前 | 説明 |
|---|---|---|
std::string | id | |
bool | isLeft | |
Timestamp | generatedAt | |
TrackingState | trackingState | |
std::array< Transform, SKELETON_DATA_COUNT > | transforms |
id
std::string idisLeft
bool isLeft = falsegeneratedAt
Timestamp generatedAt = 0trackingState
TrackingState trackingState = TrackingState::Trackedtransforms
std::array< Transform, SKELETON_DATA_COUNT > transforms {}RetargetProfileInfo
#include <contactglove/ContactGloveSDKv2.hpp>リターゲットプロファイルの情報を含む応答です。
公開属性
| 戻り値 | 名前 | 説明 |
|---|---|---|
int32_t | requestId | |
std::string | profileUuid | |
int32_t | status | |
std::string | name | |
std::string | description |
requestId
int32_t requestId = 0profileUuid
std::string profileUuidstatus
int32_t status = 0name
std::string namedescription
std::string descriptionRawSensorTransformsData
#include <contactglove/ContactGloveSDKv2.hpp>片手分のセンサーの生の変換データを保持する構造体です。
OSCアドレス /DS2/HC/RawSensorTransforms で受信したデータに対応します。各変換は、/DS2/HC/HandSkeleton と同じ、モデルを原点とする右手系の空間(model-rooted space)で表されます。位置は wrist を基準としたセンサーの中心で、回転はセンサーのローカル座標系からmodel-rooted spaceへの向きです。transforms には、親指・人差し指・中指・薬指・小指の順にRAW_SENSOR_TRANSFORM_COUNT個の要素が入ります。
公開属性
| 戻り値 | 名前 | 説明 |
|---|---|---|
std::string | id | グローブID。 |
bool | isLeft | 左手かどうか。 |
Timestamp | generatedAt | フレームの生成時刻(Unix時間、ミリ秒)。 |
std::array< Transform, RAW_SENSOR_TRANSFORM_COUNT > | transforms | センサーごとの位置と回転(片手分5要素)。 |
id
std::string idグローブIDです。
isLeft
bool isLeft = false左手かどうかです。
generatedAt
Timestamp generatedAt = 0フレームの生成時刻(Unix時間、ミリ秒)です。
transforms
std::array< Transform, RAW_SENSOR_TRANSFORM_COUNT > transforms {}センサーごとの位置と回転(片手分5要素)です。
Moxygenで生成しました。