OSC HeartRateSendersドキュメントページ

OSC HeartRateSender

開発: おめが (@Omegamega)
市販のBluetooth心拍計の心拍数情報を、OSCプロトコルを経由して、VRChatへ通知するツールです。

omega.booth.pm

要件

使い方

f:id:o_mega:20220227040228p:plain

  1. 心拍計をセットアップして電源を入れ装着する。VRChatを起動する
    1. (bluetoothペアリングは不要です)
    2. VRChatアクションメニュー(メニュー長押しorキーボードR)から、OSC Enableを選択しておく
  2. OSC HeartRateSenderを起動する
  3. 「BLE心拍計に接続する」ボタンを押す
  4. 数秒待つと接続が確立して、デバイス名と心拍数が表示される
  5. 「VRC OSCに接続する」ボタンを押す
  6. VRChatに心拍数が送信される(VRC内ではOSC Debugで確認可能)

参考動画

 

心拍計がない場合は、「VRC OSCに接続する」ボタンを押した後、
「ランダムな心拍数を送る」ボタンでVRChatへの送信テストをすることが出来ます。
アバターアニメーションテスト等に使えます

bluetoothLE

接続方式にbluetoothLE(bluetooth4.0)を利用しています。
bluethooth3(bluetooth Classic)以下とは互換性がありません。必要に応じてbluetooth4.0以降のドングルを購入してPCに追加してください

 

bluetooth心拍計の選択について

BT接続して心拍を取れてスマホ連携できるスマートウォッチはたくさんありますが、BLEの心拍プロトコルを実装してないことが多く、残念ながら使えない可能性が高いです。
スポーツモードを謳い、stravaやruntastic、wahooなどのスマホアプリ連携(リアルタイム)を売りにしていれば使える可能性があります*1。デバイスで問題なく使えたものがあればリストに追記しますので、教えてくれるとありがたいです

◎動作確認済み

○たぶん可能

  • Wahoo TICKR/TICKRx/TICKRfit
  • Polar Verity Sense/H10/OH1
  • CatEye HR-12
  • Garmin HRM-Dual
  • Coospo/XOSS/iGSPORT等のアームバンド型心拍センサーまたは胸ストラップ型心拍センサー

筋電位・胸ストラップ型の方が一回り安いですが、装着が面倒/ベルト耐久性に難があるためおすすめしません。光学式・アームバンド型が楽でおすすめです。

✕たぶん非対応

残念ながらBTスマートウォッチの多くはBLEでの心拍送信を機能がないことが多いです。対応機種を見つけましたら、お知らせください

✕非対応(動作しないことを確認済み)

  • Xioami Mi band4,5

Mi bandシリーズは独自のプロトコルがあるようですが現時点では、このアプリは非対応です。Mi bandをお持ちの方は、mkc1370さんの実装例がありますのでそちらをどうぞ

 

単にBLE心拍計の動作チェックをしたい場合、スマホがあればWhaoo fitnessアプリがおすすめです

https://jp.wahoofitness.com/fitness-apps

 

アプリから送るOSCデータについて

本アプリでは3つのAvatarParameterを送信しています。
これらのパラメータをAvatar3.0のExpressionParameter、FXレイヤーなどで処理することにより、アバターの表示を変化させたりできます。

単に通知されていること、挙動を確認したい場合は、VRChatのアクションメニューからOSC Debugをオンにすることでパラメータを確認することができます。「ランダムな心拍数を送る」ボタンも使えるでしょう

/avatar/parameters/HeartRate, Int

Int型の心拍数です。0~256。本人の体質や年齢、運動負荷や個人差によりますが、概ね45~200ぐらいの範囲に収まるはずです

/avatar/parameters/HeartRateFloat01, Float

Float型の心拍数です。心拍数の0~256を0.0f~1.0fに割り当てています。Animation StateのMotionTimeやSpeedに使うことを想定しています。
アナログメーターの針が動くアニメーション等と組み合わせることで、心拍に応じて動かすことができるはずです。

心拍表示サンプルアバター(U10素体版)では、このパラメータを使って心拍数の表示と、心臓風キューブモデルのアニメーションをさせています

/avatar/parameters/HeartRateZone, Float

HeartRateZone領域でクロップされた心拍数です。
HeartRateZone設定が60~120の時、心拍数が60なら0.0f、心拍数が90なら0.5f、心拍数が120なら1.0fを返します。

人間の心拍数は本人の年齢や体質で異なります。運動負荷や緊張状態に応じて、割と細かい範囲で上下するため、使う人に応じてアバターの挙動が変わる心拍数帯は調整したい所です。
ですが、その調整をアバターに乗せるのはいささか面倒ですから、ツール側で対応可能にするためのパラメータがこれになります。

HeartRateZoneは「その人の安静時心拍数(50~80)」から「その人の最大心拍数(220-年齢)」を設定することを想定しています。(ユーザー年齢20歳~40歳を想定し、初期値は60~180としています)

 

スポーツでは心拍計を使って運動負荷を調整する「心拍トレーニング」と呼ばれる手法があります。これを参考に個人の年齢/体質に寄らない形で、「がんばり」「運動の負荷/つらさ」を表現する指標として導入しました。

心拍トレーニングの一例としてガーミンでは心拍数のゾーンをこういう分類になっています。

が、VRCで激しい運動をと言っても、狭い部屋を使う運動ですから、おそらくガーミンの指標ではゾーン3~4あたりが上限になろうと思います

最大心拍180(年齢20~40歳想定)の場合、108~125がゾーン2、126~144がゾーン3(有酸素)、145~162がゾーン4(無酸素)。OSC送信されるHeartRateZone値では、0.40~0.54がゾーン2、0.55~0.70がゾーン3、0.71~0,85がゾーン4となります。

 

これを元に、アバターギミックはHeartRateZone、0.4(ちょっとした運動、緊張)~0.7(有酸素運動の限界)のしきい値を条件に動くように組むと
良い感じに振る舞い、ユーザーも心拍ゾーン設定だけで心拍調整が効くはずです。

 

別の使い方として0近くで、睡眠、または睡眠に近いリラックス状態をトリガーにすることもできるでしょう、多分。

 

心拍表示サンプルアバター(U10素体版)では0.4~(赤オレンジ)、0.55~(青紫)、0.7~(緑青)のそれぞれのゾーンで身体からパーティクルが出るようになってます。

対応済みpublicアバター

ここに心拍表示サンプルアバター(U10素体版)があります。このアバターは製作者の火事屋さんの許可の元public化をしています

https://vrchat.com/home/world/wrld_eea39796-5836-4099-98da-4815e16696bd

 

機能としては主に2つ

  • HeartRateFloar01を元に心拍数を表示
    • ±2程度誤差が出ますが現状仕様です
  • HeartRateZoneを元にパーティクルを表示
    • 0.4~(ゾーン設定が初期値の場合、心拍108)で赤パーティクル
    • 0.55~(心拍126)で青紫パーティクル
    • 0.7~(心拍144)で緑パーティクル

パーティクルのみ、アクションメニューよりオンオフできます

FAQ

Q.心拍計がそもそもちゃんと動くのか、PCと繋がるのかが分からない。心拍計のみ、心拍計とPCの接続できるか調べたい

A.スマートフォン(iPhone/Android)があればWahoo fitnessアプリで、心拍計のペアリング/動作確認が出来ます

WindowsPCからは設定の「bluetoothバイスとその他のデバイス」を開き、検出可能か確認します(ペアリングの必要はありません)

f:id:o_mega:20220227162552p:plain

バイス追加を押して、心拍計が出現するようであれば接続可能です


Q.bluetoothに接続が切れた時に、再接続したい

A.現時点で再接続する手段がありません。本アプリを再起動して接続しなおしてください
(VRChatの再起動は必要ありません)

Q.OSCの接続が切れたときに、再接続したい

A.「VRC OSCに接続する」ボタンを押してください。OSCは再起動なしに再接続できます

Q.心拍計を複数持っていて、使う心拍計を選びたい/別の心拍計に接続してしまう

A.申し訳ないですが、現時点で選択UIがありません。
先に接続されるかどうかは現時点ではランダムなため、接続時に表示されるデバイス名を確認の上、違う心拍計に接続した場合はアプリを再起動して、改めて接続を試してください。
使わないデバイスをオフにできるならオフにしましょう

Q.心拍数の数値が、VRChat内アバター表記やOSC HeartRateSenderで少し(±2程度)ズレて表示されてしまう

A.現状では仕様です。

現状のHeartRateFloar01パラメータを使っている場合、ExpressionParameterからAnimationを経由し、更にシェーダーで処理させている都合、誤差が出やすくなってしまっています。これについては工夫の余地があると思います。

また、現状のExpressionParameterのFloat値の同期について、公式ドキュメントによると8bit(minifloat)しかないため、符号を除いた128段分しか解像度がありません。上記同様、このあたりも精度が必要であれば改善の余地がありそうです。

Q.設定を初期値に戻したい

A. C:\Users\ユーザ名\AppData\Local\OSCHeartRateSender\OSCHeartRateSender_Url_ほにゃらら\1.0.0.0\user.config にある設定ファイルを削除してから、アプリを起動してください。

または以下の設定値を参考にどうぞ

  • LocalPort 0
  • RemoteAddress 127.0.0.1
  • RemotePort 9000

免責事項、問い合わせ

当アプリを使用して発生した問題や損害について、開発者のおめがは一切責任を負いません。自己責任の元、ご利用ください
その他、問い合わせは、私おめが(VRChat Omegamega / Twitter:@Omegamega / booth https://omega.booth.pm/)までどうぞ。

バージョン履歴

  • 20220304 初版(だいたい動くしリリースしちゃおうぜ)
  • 20220319 ハートレートゾーン、接続ポート情報などの設定を保存するようになりました

ソースコード権利情報

Rug.Osc
Copyright (C) 2013 Phill Tew (peatew@gmail.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

*1:webアプリのstravaへの連携を謳うデバイスは、予想に反して取れない可能性があります