verylowfreqのアイコン画像
verylowfreq 2024年03月16日作成 (2024年03月16日更新)
製作品 製作品 閲覧数 318
verylowfreq 2024年03月16日作成 (2024年03月16日更新) 製作品 製作品 閲覧数 318

慣性式モーショントラッカーを自作する (SlimeVR, ESP32-C3)

慣性式モーショントラッカーを自作する (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のアイコン画像
"verylowfreq" あるいは 「三峰スズ」(VTuber 2023年2月より) です。趣味で電子工作や3Dプリンターを楽しんでいます!
ログインしてコメントを投稿する