KAT Universal SDK 簡易マニュアル
UNITY用SDK 1.9.2版 2025・03・06
1. はじめに
KAT SDK は、VRトレッドミルをはじめとする KAT デバイスを Unity 上で制御・利用するためのライブラリ群です。下記のような機能を提供しています。
· デバイス情報の取得: 接続台数、シリアル番号、使用中 (isBusy) かどうか、など
· 歩行状態の取得: 本体の回転 (腰方向) や移動ベクトル、バッテリ情報
· キャリブレーション: VRトレッドミル特有の「腰方向を進行方向とする」ための補正
· 振動・LED 制御: デバイスからのフィードバック(C2/C2Core/C2+ など一部機種で対応)
· 追加データ (エクストラデータ) の取得: 足の接地状況やモーションタイプなど、機種独自の情報
· デバイスロスト時のハンドラ登録: 切断を検出してUIや再接続を誘導
本マニュアルは、以下のファイルをベースに統合したものです。
1. KATNativeSDK.cs: SDK の基幹となる C# ラッパークラス
2. WalkC2ExtraData.cs: Coord2 シリーズ専用のエクストラデータ解析クラス
3. C2ExtraDataDemo.cs: Coord2 (C2) シリーズの拡張データ取得や速度計算などを行うサンプル
4. LongPressCalibrate.cs: XRコントローラの「トリガー長押し」によるキャリブレーションの例
5. その他、既存の KATXRWalker.cs / GetDevicesDemo.cs / WalkDemo.cs / RawdataDemo.cs などのサンプル
備考
· LocoS 系列などで外部データ取得が未サポートの場合もあり、SDKのバージョンやファームウェアによっては一部の拡張データが無効になるケースがあります。
· 公式ドキュメントやリリースノートにて、最新の対応状況をご確認ください。
2. VR トレッドミル独自のキャリブレーション背景
一般的な VR アプリでは「HMD が向いている方向=進行方向」が多いですが、KAT の VR トレッドミルでは「腰の向き=進行方向」が基本です。
ユーザーは首を回して自由に周りを見渡せる一方、実際の移動は身体が向いている方向に進むように設計されています。そのため、HMD と腰の回転がズレている場合があり、そこを キャリブレーション で補正して整合性をとります。
3. 事前準備
3.1. SDK とライブラリの配置
ネイティブライブラリ
· Windows: KATSDKWarpper.dll
· Linux/Android: libKATSDKWarpper.so
これらを Unity プロジェクトの Plugins/x86_64/ フォルダなど適切な位置に配置します。
C# スクリプト
· KATNativeSDK.cs (必須)
· 機種別エクストラデータ解析用: WalkC2ExtraData.cs, MiniSExtraData.cs, LocoSExtraData.cs, WalkCExtraData.cs など (必要に応じて)
· KATXRWalker.cs (歩行制御のサンプル)
· MainThreadDispatcher.cs (マルチスレッド経由での UI 更新に利用)
· LongPressCalibrate.cs (キャリブレーションの長押し例) など
3.2. SDK ロードの仕組み
· NativeLibHandler が、実行時に DLL/.so を動的にロードし、KATNativeSDK.cs 内で定義された API を呼び出せるようにします。
· エラーが発生した場合は例外がスローされるため、try-catch で補足すると便利です。
3.3. Unity XR の設定
· XR Interaction Toolkit や OpenXR などを導入し、XR 環境が初期化されているかを確認する場合は、KATXREnvHelper.CheckXRReadyStatus() を使用できます。
4. KATNativeSDK.cs 概要
KATNativeSDK クラスは、DeviceCount / GetDevicesDesc / GetWalkStatus などの関数を提供します。また、振動・LED 制御用の KATExtension クラスや、デバイスロスト検出用のハンドラ登録メソッドも含みます。
4.1. 主な構造体
DeviceDescription
l device: デバイス名(例 "KAT Walk C2" など)
l serialNumber: シリアル番号
l isBusy: 他アプリで使用中などの場合に true
l deviceType: 0=エラー, 1=トレッドミル, 2=トラッカー
l etc.
DeviceData
l btnPressed: キャリブレーションボタンが押されているか
l isBatteryCharging: バッテリー充電中か
l batteryLevel: 0~100%(実際の単位はファーム依存の場合あり)
l firmwareVersion: ファームウェアバージョン
TreadMillData
l deviceName: 実際のデバイス名
l connected: 接続されていれば true
l bodyRotationRaw: 腰センサーの生 Quaternion 回転
l moveSpeed: 移動ベクトル (Vector3)
l deviceDatas: DeviceData の配列(複数センサーを保持)
l extraData: 機種固有の追加情報(最大128バイト)
4.2. 主な API
· DeviceCount(): 接続されている KAT デバイスの台数を取得
· GetDevicesDesc(uint index): 指定インデックスのデバイス情報 (DeviceDescription)
· GetWalkStatus(string sn=""): 歩行デバイスの状態をまとめて取得 (TreadMillData)
· GetLastCalibratedTimeEscaped(): 最後のキャリブレーションからどれだけ時間が経ったか (秒)
· ForceConnect(sn): 指定シリアル番号のデバイス再接続を試行
· SetOnDeviceLostHandler(...): 切断時コールバックを登録
4.2.1. 振動・LED 操作: KATNativeSDK.KATExtension
· VibrateOnce(float amplitude): 単発振動
· VibrateInSeconds(float amplitude, float duration): 振動を指定秒数継続
· LEDOnce(float amplitude): 単発 LED 点灯
· LEDInSeconds(float amplitude, float duration): 指定秒数の LED 点灯
· LEDConst(float amplitude): 連続点灯 (0 で消灯, 1.0 で最大)
注意: 対応機種 (C2/C2+ など) でのみ有効。MiniS や LocoS では無効な場合があります。
5. C2 シリーズのエクストラデータ
5.1. WalkC2ExtraData.cs
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct extraInfo
{
public bool isLeftGround; // 左足接地
public bool isRightGround; // 右足接地
public bool isLeftStatic; // 左足が静止状態か
public bool isRightStatic; // 右足が静止状態か
public int motionType; // 動作種別 (例: 静止, スケーティング, 歩行など)
public Vector3 skatingSpeed;
public Vector3 lFootSpeed;
public Vector3 rFootSpeed;
}
· WalkC2ExtraData.GetExtraInfoC2(TreadMillData data) で、この構造体にパースします。
· motionType はファームウェアに依存し、0=静止,1=スケート開始,2=継続,3=微小動作,4=移動中 などの定義例が見られます。
以下は一般的な例になりますが、KAT Walk C2 シリーズのエクストラデータで定義されている使用機会が多そうな
public Vector3 skatingSpeed;
public Vector3 lFootSpeed;
public Vector3 rFootSpeed;
について解説します。
lFootSpeed / rFootSpeed
左右足それぞれの移動ベクトルを表わすものと考えられます。
3D ベクトル (Vector3) なので、x/y/z それぞれに「方向付き速度」の成分が格納されています。
例: lFootSpeed.x が正なら左足がワールド座標の +X 方向へ動いている、というようなイメージです。
skatingSpeed
左右の動きを合わせた“滑るような”移動速度や、特定のモーション状態における代表速度などを意味する可能性があります(合計ベクトル、あるいは足の前後動作をまとめたもの)。
実際の定義や挙動はデバイスのファームウェアや SDK リリースノートで異なる場合もあります
lFootSpeed: 左足の移動量+移動方向ベクトル
rFootSpeed: 右足の移動量+移動方向ベクトル
skatingSpeed: デバイスによっては、「左右合計」や「特定の移動状態」での代表速度ベクトル
という整理になります
5.2. C2ExtraDataDemo.cs のサンプル
var walkStatus = KATNativeSDK.GetWalkStatus();
if (walkStatus.deviceName.Contains("Coord2"))
{
var info = WalkC2ExtraData.GetExtraInfoC2(walkStatus);
// 足の接地状態や速度のログ出力
Debug.Log("Left Foot OnGround = " + info.isLeftGround);
Debug.Log("Right Foot OnGround = " + info.isRightGround);
Debug.Log("Skating Speed = " + info.skatingSpeed.ToString("F3"));
...
}
· 速度や接地状況を参照し、さらに高度な足踏み判定などを行えます。
· デモでは、数秒間の速度変化から平均スピードを計算する例や、バッテリー状態の表示を行っています。
6. 長押しでのキャリブレーション例: LongPressCalibrate.cs
if (GetTrigger(rightHand) && GetTrigger(leftHand))
{
pressedTime += Time.deltaTime;
}
else
{
pressedTime = 0.0f;
}
if (pressedTime > longPressTime && KATXRWalker.force_calibrate == false)
{
// 長押し成功 → キャリブレーション実行
KATXRWalker.force_calibrate = true;
// フィードバックとして振動 + LED
KATNativeSDK.KATExtension.VibrateInSeconds(1.0f, 1.0f);
KATNativeSDK.KATExtension.LEDInSeconds(1.0f, 1.0f);
}
· 両手のトリガーボタンを一定時間 (例: 2秒) 押し続けたらキャリブレーション
· キャリブレーション後、振動・LED を 1秒間実行し、利用者にフィードバック
KATXRWalker.force_calibrate が true になると、KATXRWalker の FixedUpdate() でキャリブレーション処理が走る仕組みです。
7. キャリブレーションと歩行制御
7.1. キャリブレーション手順要点
1. HMD (頭) の回転 と 腰センサー (bodyRotationRaw) の差を計算し、yawCorrection として記録
2. プレイヤーの実際の移動・回転計算時、腰方向 - yawCorrection によって身体の正面方向を決定
3. HMD はそのまま周囲を自由に見られる
7.2. KATXRWalker.cs
var data = KATNativeSDK.GetWalkStatus();
if (!data.connected) return;
if (data.deviceDatas[0].btnPressed || KATNativeSDK.GetLastCalibratedTimeEscaped() < 0.08 || force_calibrate)
{
// (1) HMD(Y軸) - 腰(Y軸) の差を取得
var hmdYaw = eye.transform.eulerAngles.y;
var bodyYaw = data.bodyRotationRaw.eulerAngles.y;
yawCorrection = bodyYaw - hmdYaw;
// (2) 位置リセット
var pos = transform.position;
var eyePos = eye.transform.position;
pos.x = eyePos.x;
pos.z = eyePos.z;
transform.position = pos;
// (3) 終了
force_calibrate = false;
return;
}
// 回転を適用
transform.rotation = data.bodyRotationRaw * Quaternion.Inverse(Quaternion.Euler(0, yawCorrection, 0));
// 移動速度を Rigidbody / CharactorController などで反映
...
※インサイドアウト型のHMDを元に作られたアプリと、アウトサイドイン型のHMDでの運用時には、双方の差異に注意が必要
8. 外部データが取得できない場合の対処
8.1. 取得できないケース
· LocoS 系列: 旧式ファームウェアやデバッグ用項目などで実装が不完全な場合、extraData に正しい値が入らない
· MiniS / WalkC: 一部の拡張フィールドが未使用だったり、将来的に対応予定のものが含まれる
8.2. 対処例
· (A) deviceName や deviceType を確認し、対応しないデバイスでは GetExtraInfo を呼ばない。
· (B) 値がすべて 0 もしくは無効値の場合は、ログを出力するなどして回避。
· (C) 旧式機種や未サポート環境の場合、SDK 経由でなく独自のソフト (e.g. GATEWAY + OSC) を組み合わせて速度情報だけ取得する例もあります。
LocoSExtraData.cs の記述 は、現在のSDKでは動作しない/正しい値が取得できない場合が多い点に注意してください。
9. エラーハンドリングと実装上の注意
1.
ネイティブライブラリ読み込み失敗
2.
o NativeLibHandler で LoadLibrary(...) が失敗すると例外をスロー
o ログやポップアップでユーザーにライブラリの配置ミスを知らせる
3.
デバイスが見つからない / 切断された
4.
o DeviceCount() が 0 → UI で「未検出」と表示
o GetWalkStatus().connected == false → 切断を示唆
o 切断コールバックを登録 (SetOnDeviceLostHandler) することでリアルタイム通知
5.
キャリブレーション連続実行に注意
6.
o ボタン連打で腰センサーが何度も再設定されると挙動が不安定になり得る
o UI 上でクールダウンを設ける、連続キャリブを無効化する などの対策
7.
振動・LED は一部機種のみ
8.
o MiniS / LocoS などでは LED / バイブが物理的に無い場合あり
o deviceName を判定し、未対応機種ならボタンを非活性にする等
9.
メインスレッドでの UI 操作
10.
o コールバック関数は別スレッドで呼ばれる可能性があるため、MainThreadDispatcher.Instance().Enqueue(...) で UI に反映する
10. 追加サンプルコード・関連ツール
10.1. C2ExtraDataDemo.cs
· Coord2 シリーズの足の状態や速度を定期取得し、テキスト UI に表示する例
· 数秒おきに速度の平均値を算出し、画面上に出すなど応用が可能
10.2. LongPressCalibrate.cs
· XRコントローラのトリガーを “両手同時長押し” したときにキャリブレーションを実行する
· 成功時にバイブレーション・LED でユーザーに通知
10.3. KATWifiLatencyHelper.cs
· Android 端末で Wi-Fi をロックし、スリープ等による遅延や切断を抑制する
· Quest / Pico などスタンドアロン機器で通信を安定させたい場合に利用
10.4. KATAlertDlgDemo.cs
· デバイスロスト (切断) を検知した際に再接続ボタンなどを表示する簡易的ダイアログサンプル
· ForceConnect(sn) を用いて再接続を試みる
11. まとめ
本ドキュメントは、KAT Native SDK の主要な機能を網羅しつつ、以下の点を重点的に追加・説明しました。
1. Coord2 シリーズのエクストラデータ: WalkC2ExtraData.cs や C2ExtraDataDemo.cs での解析例
2. 長押しキャリブレーション: LongPressCalibrate.cs を用いた UI 実装例
3. 外部データが取得できない場合: LocoS など一部機種で無効なケースがある点とその対処
4. キャリブレーションの仕組み: 腰の向きとHMDの向きをどう同期させるか
運用のポイント
· 常に GetWalkStatus() で connected をチェックし、接続が確立しているか確認
· キャリブレーションは適切にクールダウンを入れ、ユーザーが操作しやすい UI を提供
· 機種ごとにエクストラデータの構造が異なるため、必ず対応する解析クラスを用いる
· 振動・LED は機種依存である点に留意
今後の拡張
· ネットワークマルチプレイ: 各プレイヤーの歩行情報を同期し、VR空間で相互干渉
· 物理演算: Rigidbody を用いて障害物との衝突・坂道歩行などを実装
· 新機種対応: SDK バージョン更新やファームウェア連携により、新たなエクストラ情報が追加される場合あり
以上が最新の KAT Native SDK マニュアルです。
Coord2 (C2) シリーズなどデバイス固有の追加機能を把握しながら、実装を進めてください。外部データが取得できない機種 (例: LocoS) やファームウェアの差異にもご注意いただき、必要に応じて問い合わせやリリースノートの確認をお願いいたします。
※以下では、お問い合わせの多いKAT LocoS 系列デバイスの Pitch / Roll 角度を取得する際のコードスニペットを含めてご紹介します。実装環境やファームウェアのバージョンによっては安定して値を得られない場合があるため、あくまで参考例としてお使いください。
KAT LocoS 系列の Pitch / Roll 取得例
1. LocoSExtraData 構造体 (例)
LocoS 用の LocoSExtraData.cs(または同等クラス)では、以下のような extraInfo 構造体が定義されています。これは公式にはデバッグ用の項目を含むため、実際の製品版では必ずしもサポートが約束されたものではない点にご注意ください。
using System.Runtime.InteropServices;
using UnityEngine;
public class LocoSExtraData
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct extraInfo
{
// 例: デバッグ情報や未使用フィールドが含まれる
public baseSDKinfo baseSDKinfo; // こちらも内部に action, isMoving, calorie 等が入る
// 連続で列挙される足ごとの状態
public uint L_Status;
public float L_Pitch;
public float L_Roll;
public uint R_Status;
public float R_Pitch;
public float R_Roll;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct baseSDKinfo
{
// 例: motionType, isMoving, isForward, calorie など
public int action;
public bool isMoving;
public int isForward;
public double calorie;
// … そのほか未使用フィールドが含まれる可能性あり
};
public static extraInfo GetExtraInfoLoco(KATNativeSDK.TreadMillData data)
{
// extraData(最大128バイト)を pinned memory として構造体に変換
GCHandle handle = GCHandle.Alloc(data.extraData, GCHandleType.Pinned);
extraInfo info;
try
{
info = (extraInfo)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(extraInfo));
}
finally
{
handle.Free();
}
return info;
}
}
この extraInfo 構造体には、左足 (L_...) / 右足 (R_...) の Pitch, Roll が含まれる形で定義されている場合があります。しかし、機種やファームウェアによっては正しい値が入っていないケースもある点に留意してください。
2. Pitch / Roll を実際に取り出して表示するコード例
2.1. 単純に構造体メンバを読むパターン
using UnityEngine;
using UnityEngine.UI;
public class LocoSPitchRollDemo : MonoBehaviour
{
public Text infoText;
void Update()
{
// LocoS (または未指定の場合は最初に見つかったデバイス) のTreadMillData取得
var data = KATNativeSDK.GetWalkStatus();
if (!data.connected || !data.deviceName.Contains("Loco"))
{
infoText.text = "LocoS device not detected or not connected.";
return;
}
// extraData解析
var extra = LocoSExtraData.GetExtraInfoLoco(data);
// 仮に extra.L_Pitch / extra.L_Roll / extra.R_Pitch / extra.R_Roll をそのまま表示
string msg = "=== LocoS Pitch/Roll Demo ===\n";
msg += "L_Pitch: " + extra.L_Pitch.ToString("F3") + "\n";
msg += "L_Roll : " + extra.L_Roll.ToString("F3") + "\n";
msg += "R_Pitch: " + extra.R_Pitch.ToString("F3") + "\n";
msg += "R_Roll : " + extra.R_Roll.ToString("F3") + "\n";
infoText.text = msg;
}
}
上記のように、extra.L_Pitch / extra.L_Roll / extra.R_Pitch / extra.R_Roll を直接 ToString で出力するだけの簡易例です。
しかし、ファームウェアによっては「常に0」や「異常な数値」が入る可能性があるため、実際にはそれらの値が妥当かどうか検証・補正が必要になります。
2.2. バイト操作による解釈変換のパターン
一部のバージョン / 開発ビルドでは、L_Pitch とされる領域が実際には 32 ビット整数 (uint32) であり、L_Status フィールドに相当する等の配置ずれが生じるケースが報告されています。そのため、BitConverter を使った以下のようなデバッグコードが紹介されています。
using System;
using UnityEngine;
public class DebugExtraData : MonoBehaviour
{
private string debugText = "";
void Update()
{
var data = KATNativeSDK.GetWalkStatus();
// LocoSExtraData.GetExtraInfoLoco で構造体を取り出し
var extraInfo = LocoSExtraData.GetExtraInfoLoco(data);
ParseAndDebugExtraData(extraInfo);
}
void ParseAndDebugExtraData(LocoSExtraData.extraInfo info)
{
// 例: L_Rollをuint化→L_Statusをfloat化...など通常とは異なるマッピングで解釈
// (本来は公式構造体が正しければ不要だが、バージョンの違いで整合しない場合を想定)
// ひとまず raw->uint->float と変換する例
uint L_Status = BitConverter.ToUInt32(BitConverter.GetBytes(info.L_Roll), 0);
float L_Pitch = BitConverter.ToSingle(BitConverter.GetBytes(info.L_Status), 0);
float L_Roll = info.L_Pitch;
uint R_Status = BitConverter.ToUInt32(BitConverter.GetBytes(info.R_Roll), 0);
float R_Pitch = BitConverter.ToSingle(BitConverter.GetBytes(info.R_Status), 0);
float R_Roll = info.R_Pitch;
debugText = $"L_Status={L_Status}, L_Pitch={L_Pitch:F3}, L_Roll={L_Roll:F3}\n" +
$"R_Status={R_Status}, R_Pitch={R_Pitch:F3}, R_Roll={R_Roll:F3}";
}
void OnGUI()
{
GUI.Label(new Rect(10, 10, 600, 30), debugText);
}
}
このように、一度 BitConverter.GetBytes(...) などで取り出して再解釈する方法をとることで、公式と異なる配列オフセットになっている場合でも値が得られる可能性があります。
逆に言えば、開発ビルドやファームウェアによってデータ配置が変わることがあるため、確定的な方法とは言い切れません。
3. 取得における注意点
公式サポート外の可能性
LocoS の Pitch/Roll フィールドはもともと 開発・デバッグ用 として公開されている節があるため、正式にサポートされていない / 値が無効になる場合があります。
ファームウェア / SDK バージョンの相違
バージョンが古い場合や特定の機種リビジョンでは、まったく値が入らない(0固定)のケースも報告されています。
最新のリリースノートを必ず確認し、対応状況を把握してください。
動作テスト
取得した Pitch/Roll が期待する角度変化に追従しているかを、デバイスの動きを実際に試して検証する必要があります。
無効値や過大値への対処
もし得られる値にスパイクや異常値が混じる場合、ローパスフィルターやクランプ処理 (Mathf.Clamp) などを入れるのが望ましいです。
4. まとめ
LocoSExtraData に含まれる L_Pitch, L_Roll, R_Pitch, R_Roll は、あくまで「デバッグ用」として扱われることが多く、SDK 公式の保証対象外である可能性があります。
それでも、バージョンや機種リビジョン次第では有用な角度情報を取得し、足の傾き・接地具合をリアルタイムに可視化することができます。
値が正しく取得できない場合は、BitConverter を利用した別の解釈を試しつつ、実機での動作検証を繰り返してください。
これらのスニペットを参照しながら実装を行えば、LocoS 系列で Pitch/Roll を読み取り、アプリケーション内で足の角度を可視化または活用することが可能になります。もし挙動が安定しないようであれば、リリースノート、アップデート情報を確認のうえ調整を行ってください。
以下では、必要最低限のコードスニペットを要所で紹介しながら、KAT Native SDK の使い方をまとめています。Unity プロジェクトに組み込む際、これだけ読めば実装の流れを把握できる形を目指しました。
KAT Native SDK 簡易マニュアル
1. SDKの主な特徴
デバイス情報: 接続台数、各デバイスのシリアル番号、使用中かどうか (isBusy) など
歩行状態の取得: 腰の回転 (bodyRotationRaw)、移動速度 (moveSpeed)、バッテリー情報
キャリブレーション: VRトレッドミル特有の「腰方向を進行方向とする」補正
振動・LED 制御: C2 シリーズ等で対応。MiniS/LocoS では非対応の場合あり
拡張データ: (機種別) 足の接地、モーションタイプ、ピッチ・ロールなど
デバイスロスト: 切断時のコールバック登録
2. 事前準備
ネイティブライブラリ配置
Windows → KATSDKWarpper.dll
Linux/Android → libKATSDKWarpper.so
Unity の Plugins/x86_64/ などに配置
C# スクリプト追加
KATNativeSDK.cs (必須)
機種別のエクストラデータクラス (例: WalkC2ExtraData.cs)
歩行・キャリブサンプル (例: KATXRWalker.cs, LongPressCalibrate.cs)
MainThreadDispatcher.cs (マルチスレッド→UIスレッド変換用) など
XR 環境
Unity XR Interaction Toolkit / OpenXR 設定が必要な場合あり
3. デバイス情報の取得
3.1. デバイス一覧: GetDevicesDemo.cs スニペット
var count = KATNativeSDK.DeviceCount();
for (uint i = 0; i < count; i++)
{
var desc = KATNativeSDK.GetDevicesDesc(i);
Debug.Log($"Device {i}: {desc.device}, SN={desc.serialNumber}, Busy={desc.isBusy}");
}
3.2. 歩行デバイスの状態: WalkDemo.cs スニペット
var data = KATNativeSDK.GetWalkStatus();
if (!data.connected)
{
Debug.Log("No device connected.");
return;
}
Debug.Log($"Rotation={data.bodyRotationRaw}, Speed={data.moveSpeed}");
4. キャリブレーション
4.1. 長押しによるキャリブ: LongPressCalibrate.cs スニペット
if (triggerRight && triggerLeft) {
pressedTime += Time.deltaTime;
} else {
pressedTime = 0f;
}
if (pressedTime > 2f && !KATXRWalker.force_calibrate) {
KATXRWalker.force_calibrate = true;
// 振動&LEDで通知
KATNativeSDK.KATExtension.VibrateInSeconds(1f, 1f);
KATNativeSDK.KATExtension.LEDInSeconds(1f, 1f);
}
4.2. キャリブロジック: KATXRWalker.cs スニペット
// 例: FixedUpdate内
var ws = KATNativeSDK.GetWalkStatus();
if (ws.deviceDatas[0].btnPressed || force_calibrate) {
float hmdYaw = eye.transform.eulerAngles.y;
float bodyYaw = ws.bodyRotationRaw.eulerAngles.y;
yawCorrection = bodyYaw - hmdYaw;
force_calibrate = false;
return;
}
transform.rotation = ws.bodyRotationRaw * Quaternion.Inverse(
Quaternion.Euler(0, yawCorrection, 0));
transform.position += transform.rotation * ws.moveSpeed * Time.fixedDeltaTime;
5. 振動・LED 制御 (KATExtension)
// 単発振動&LED
KATNativeSDK.KATExtension.VibrateOnce(1.0f);
KATNativeSDK.KATExtension.LEDOnce(1.0f);
// 秒数指定
KATNativeSDK.KATExtension.VibrateInSeconds(0.8f, 2.0f);
KATNativeSDK.KATExtension.LEDInSeconds(0.5f, 1.0f);
注意: C2 系列など一部機種のみ対応。
6. エクストラデータ (Coord2 シリーズ)
6.1. WalkC2ExtraData.cs 概要
public struct extraInfo {
public bool isLeftGround, isRightGround;
public bool isLeftStatic, isRightStatic;
public int motionType;
public Vector3 skatingSpeed, lFootSpeed, rFootSpeed;
}
6.2. 取得例: C2ExtraDataDemo.cs
var data = KATNativeSDK.GetWalkStatus();
if (data.deviceName.Contains("Coord2")) {
var info = WalkC2ExtraData.GetExtraInfoC2(data);
Debug.Log($"LeftGround={info.isLeftGround}, RightGround={info.isRightGround}");
Debug.Log($"SkatingSpeed={info.skatingSpeed}");
}
7. デバイス切断のハンドラ登録
KATNativeSDK.SetOnDeviceLostHandler((sn, msg, reason) => {
Debug.Log($"DeviceLost: {sn}, reason={reason}");
MainThreadDispatcher.Instance().Enqueue(() => {
// UI表示や再接続処理
// e.g. KATAlertDlgDemo.Show(sn);
});
});
8. 外部データが取れない場合
LocoS などで extraData が無効 → 古いファームウェアやデバッグ用フィールドの場合が多い
MiniS / WalkC → 未使用フィールドあり
対処
deviceName や deviceType を判定し、未対応時は呼ばない
すべて0ならログ表示などで回避
旧機種は Gateway + OSC で代替取得
9. エラーハンドリングの注意
ネイティブライブラリのロード失敗
LoadLibrary が失敗 → try-catch やロギングを入れる
キャリブ連続実行
連打でセンサーが乱れる → クールダウンを設ける
UIはメインスレッドのみ
コールバックスレッド → MainThreadDispatcher.Instance().Enqueue(...) で実行
10. まとめ
歩行状態 は KATNativeSDK.GetWalkStatus()、キャリブ は KATXRWalker.force_calibrate
振動/LED は KATNativeSDK.KATExtension (一部機種限定)
C2エクストラデータ は WalkC2ExtraData.GetExtraInfoC2()
LocoS 等で Pitch/Roll を取得する際はファームウェアによって無効の可能性がある
追加サンプル
KATXRWalker.cs: 腰回転をプレイヤー移動に反映するサンプル
LongPressCalibrate.cs: 両手トリガー長押し → キャリブ実行
C2ExtraDataDemo.cs: Coord2 シリーズの足接地状況や速度参照
KATAlertDlgDemo.cs: デバイスロスト検知後の再接続ダイアログ
KATWifiLatencyHelper.cs: Android端末のWiFiロック
以上、KAT Native SDK を最小限のコード例とともにまとめました。実際の実装では、プロジェクト構造や機種に応じて追加調整を行ってください。