verylowfreq が 2024年03月16日17時26分24秒 に編集
コメント無し
タグの変更
SlimeVR
IMU
メイン画像の変更
本文の変更
VRChatや3Dアバター駆動で利用できる、モーショントラッカーを製作しました。SlimeVRというソフトウェアを利用することで、かんたんに作ることができます。 モーショントラッカーは人間に装着し、加速度や角速度を計測し続けます。これをPC上のSlimeVRに送信し、現在の人間の姿勢を構築します。VRChatやVTuberなどの、アバターを駆動するのに利用できます。 SONYがmocopiというモバイルモーションキャプチャ―デバイスを販売していますが、それと組み合わせて利用する想定です。 この記事は、動画の補足記事です。「三峰スズ」は電子工作を楽しむVTuberとして活動しています。ぜひ動画も見てね! @[youtube](https://youtube.com/watch?v=jYmZHcLeON0)
## 概要

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秒くらい安静に置いておいたほうが、ソフトウェアでのドリフト補正が良く効くような気がします。 ## 改善案 - バッテリー容量が使いきれていない、不安定なので、電源を強化する。 - もっとまともなケースに入れる。着脱が容易だとよい。