慣性式モーショントラッカーを自作する (SlimeVR, ESP32-C3)
VRChatや3Dアバター駆動で利用できる、モーショントラッカーを製作しました。SlimeVRというソフトウェアを利用することで、かんたんに作ることができます。
モーショントラッカーは人間に装着し、加速度や角速度を計測し続けます。これをPC上のSlimeVRに送信し、現在の人間の姿勢を構築します。VRChatやVTuberなどの、アバターを駆動するのに利用できます。
SONYがmocopiというモバイルモーションキャプチャ―デバイスを販売していますが、それと組み合わせて利用する想定です。
この記事は、動画の補足記事です。「三峰スズ」は電子工作を楽しむVTuberとして活動しています。ぜひ動画も見てね!
概要
ESP32-C3をマイコンとして、MPU6050を2つ接続、電源はニッケル水素充電池 2本です。
SlimeVRというソフトウェアを利用すると、ピン番号などをカスタマイズすればESP32向けのファームウェアがすぐにできあがり、PC側でセンサーと通信して、SteamVR, VRChat (OSC), VMCプロトコルなどで人間の姿勢を出力できます。
安価であること、手元部品の活用、ニッケル水素電池でのESP32の駆動の実験、を主眼に製作しました。
ハードウェア構成
ESP32-C3-WROOM-02
ESP32シリーズの、RISC-Vシングルコアを搭載したものです。この用途ならばデュアルコアでなくても足りるようです。
自作のマイコンボード基板(試作版)
実質的にはピッチ変換基板+ユニバーサル基板くらいの機能しかないですが、自作のESP32-C3-WROOM-02プロトタイプ基板を利用しています。
M5Stamp C3Uなどに差し替え可能です。
MPU6050 (x2)
MPU6050は、加速度と角速度が取得できるI2C接続のセンサーです。性能はともかくとして、安価で入手しやすいのでお試しの製作には悪くないと思います。SlimeVR側での強力な補正のおかげで、ドリフトはかなり軽減されます。
電源投入時、キャリブレーションのために静止状態を保つ必要があります。
ADDピンをHIGHにすることでI2Cアドレスをずらせるので、ひとつのI2Cバスに2つまで接続できます。
LED
ステータス表示用です。省略可能。
昇圧モジュール (3.3V)
ニッケル水素充電池2本なので、2.4Vを3.3Vに昇圧します。300mA出力なのでESP32-C3には足りませんが(起動時のピーク電流はもっと多いらしい)、だいたい動いているようです。
ファームウェアのカスタマイズ
SlimeVR公式サイトにコンフィギュレーションファイルのジェネレータがあるので、それを利用しました。
カスタマイズしたファームウェアをPlatformIOで書き込みます。
コンフィギュレーション:
// My custom configurations
#define IMU IMU_MPU6050
#define SECOND_IMU IMU
#define BOARD BOARD_CUSTOM
#define IMU_ROTATION DEG_0
#define SECOND_IMU_ROTATION DEG_0
#define PRIMARY_IMU_OPTIONAL true
#define SECONDARY_IMU_OPTIONAL true
#define MAX_IMU_COUNT 2
#ifndef IMU_DESC_LIST
#define IMU_DESC_LIST \
IMU_DESC_ENTRY(IMU, PRIMARY_IMU_ADDRESS_ONE, IMU_ROTATION, PIN_IMU_SCL, PIN_IMU_SDA, PRIMARY_IMU_OPTIONAL, PIN_IMU_INT) \
IMU_DESC_ENTRY(IMU, SECONDARY_IMU_ADDRESS_TWO, IMU_ROTATION, PIN_IMU_SCL, PIN_IMU_SDA, SECONDARY_IMU_OPTIONAL, PIN_IMU_INT_2)
#endif
// Battery monitoring options (comment to disable):
// BAT_EXTERNAL for ADC pin, BAT_INTERNAL for internal - can detect only low battery, BAT_MCP3021 for external ADC
#define BATTERY_MONITOR BAT_INTERNAL
// #define BATTERY_SHIELD_RESISTANCE 180 //130k BatteryShield, 180k SlimeVR or fill in external resistor value in kOhm
#define PIN_IMU_SDA 7
#define PIN_IMU_SCL 6
#define PIN_IMU_INT -1
#define PIN_IMU_INT_2 -1
#define PIN_BATTERY_LEVEL A0
#define LED_PIN 2
#define LED_INVERTED false
動作させてみる
ここは動画のほうがわかりやすいと思います。
SlimeVR上で、mocopiと自作トラッカーを組み合わせて各部位に割り当てて、キャリブレーションすれば動きます。
起動直後は30秒くらい安静に置いておいたほうが、ソフトウェアでのドリフト補正が良く効くような気がします。
改善案
- バッテリー容量が使いきれていない、不安定なので、電源を強化する。
- もっとまともなケースに入れる。着脱が容易だとよい。
投稿者の人気記事
-
verylowfreq
さんが
2024/03/16
に
編集
をしました。
(メッセージ: 初版)
-
verylowfreq
さんが
2024/03/16
に
編集
をしました。
-
verylowfreq
さんが
2024/03/16
に
編集
をしました。
ログインしてコメントを投稿する