心拍をUnityで取得する
心拍計は、CooSpoのHW706を使用します。
PCのOSはWindowsが対象です。
今回は、
HW706をPCにBluetooth接続
↓
BluetoothHeartRateOSCで心拍を取得
↓
BluetoothHeartRateOSCの値をUnity+OSCJackVSで受信
という流れになります。
HW706をPCと接続する
Bluetoothで接続します。
私の方では、「HW706-~」という名前で表示されました。
BluetoothHeartRateOSCでHW706の値を受信する
BluetoothHeartRateOSCは、心拍計の値を受信できるアプリになります。
解凍し、BluetoothHeartRateOSC/Release/HeartRate.exeを起動します。
このような画面が表示されます。
(表示される文字は異なる場合があります)
HW706を装着し、しばらくすると、心拍が表示されます。
心拍数が反映されるまで、しばらく時間がかかります。
ウィンドウは閉じてもタスクトレイに格納されます。
(画面の文字がタスクトレイのアイコンになっています)
アプリの終了や再起動する場合は、タスクトレイから閉じる必要があります。
Unityのプロジェクトを作成する
Unityでプロジェクトを作成します。
(バージョンやテンプレートは問いません)
OscJackVSをインストールする
OscJackVSとは、UnityでOSCの送受信ができるアセットになります。
アセットの導入にあたり、PackageManagerのScopedRegistryに以下を登録します。
Name | URL | Scope(s) |
---|---|---|
Keijiro | https://registry.npmjs.com | jp.keijiro |
すると、PackageManagerのMyRegistryからインストール可能になるので、
OscJackVSをインストールします。
OSCJackVSの設定ファイルを作成する
Create/ScriptableObjects/OSC Jack/Connectionより、OSCConnectionファイルを作成します。
Portを9000にしておきます。
(BluetoothHeartRateOSCがポート9000を使用するため)
受信処理を作成する
適当なGameObjectにEventReceiverをアタッチします。
Connectionに先ほど作成したOscConnectionを、
OSCAddressに/avatar/parameters/HeartRateBPMを指定します。
(BluetoothHeartRateOSCがこのアドレスに値を送信するため)
DataTypeはIntにします。
今回は心拍数をテキストで表示するので、TextMeshProUGUIを配置しておきます。
このテキストに心拍数を反映させるため、スクリプトを作成します。
using UnityEngine;
using TMPro;
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
/// <summary>
/// メインクラス.
/// </summary>
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
public sealed class Main : MonoBehaviour
{
//================================================================================
// Fields.
//================================================================================
/// <summary>
/// ラベル.
/// </summary>
[SerializeField] private TextMeshProUGUI Label = default;
//================================================================================
// Methods.
//================================================================================
//--------------------------------------------------------------------------------
// Event methods.
//--------------------------------------------------------------------------------
/// <summary>
/// Intの値が返るイベント.
/// </summary>
/// <param name="value">値.</param>
public void OnIntEvent(int value) => Label.SetText($"{value}");
}
EventReceiverのOnIntEventに、先ほどのスクリプトのOnIntEventを指定します。
これでUnityを実行すると、心拍数がラベルに反映されます。
参考文献
Discussion