【SlimeVR】VRChatで足を動かすためにTrackerを自作した

はじめに

Quest 2などのヘッドセットのみでは頭と両手しか動かない。両足や体、肘を正しく動かすためには別途トラッカーと呼ばれるセンサーが必要がある。 トラッカーは様々なものが販売されており、

VIVE Tracker VIVE™ | VIVE Tracker

Uni motion Uni-motion|フルトラッキングモーションキャプチャシステム

HaritoraX HaritoraX 1.1 - 株式会社Shiftall

Tundra Tracker Kickstarter 日本 | Tundra Tracker

などがある。

もちろんこれらを購入し、装着すれば簡単にフルトラッキングが可能となる。

しかし、今回は自作トラッカーに興味があったため、その中の一つであるSlime VRを利用し、自作トラッカーを作成した。

SlimeVRとは

VRにおけるフルボディトラッキングを低コストで実現するソリューションです。 フォワードキネマティクス(FK)を使用し、ヘッドセットとコントローラのみが絶対位置として認識され、個々のトラッカーの回転から計算された骨格のモデルを構築します。

docs.slimevr.dev

Slime VRでは最小で胸、両もも、両くるぶしの5個のトラッカー、最大で胸、腰、腰下(尻)、両もも、両くるぶし、両足、両肘の11個のトラッカーを利用できます。 詳しくはここを参照してください。 Putting on your trackers - SlimeVR Docs

材料

今回は両もも、両くるぶしのための4個のトラッカーを作成した。また、Slime VRの最小トラッカー数の推奨である5個を満たすため、胸のトラッカーにはNintendo switchのJoyConを利用した。

購入物

物品 使用個数 金額
ESP32 2 1919円
MPU6050 4 1200円
マジックテープ ゴムバンド 4 1100円
ユニバーサル基盤 2 46円
コネクタ類 * 50円
合計 4315円

元からあったもの

はんだ・適当なワイヤ・フィラメント・Nintendo switchのJoyCon

memo

コントローラからセンサを直結する場合、基盤やコネクタは不要。

また、Slime VRではESP32の代わりにESP8266も使用可能です(未検証)。ESP8266はESP32よりも安く購入することができるので低コスト化できる可能性が高い。

手順

ハードウェアの作成

基本的には以下のように配線します。この組み合わせでももとくるぶし(=1足分)のセンサーとして装着すると仮定し、2個作成した。また、コントローラーから離れる側の足までは60cm以上のワイヤ長が必要です。

上の回路に従って組み立てたものが以下の写真のものです。

ファームウェアの書き込み

Updating the tracker firmware - SlimeVR Docs に従って行います。

大まかな手順としては以下の通りです。

  1. https://github.com/SlimeVR/SlimeVR-Tracker-ESP.gitをcloneする
  2. platformio.iniを環境に合わせて編集
  3. defines.hを Configuring the firmware project - SlimeVR Docs を使って生成、置き換える。
  4. build & write

また、筆者環境ではオンラインのファームウェア書き込み機としてドキュメント内で紹介されていた SlimeVR Firmware Tool はビルドが終わらず、使用することができませんでした。

ケース

Slime VRではコミュニティの作成したいくつかのケースが紹介されています。 Community-built cases - SlimeVR Docs

今回私が作ったものはこれらのケースを利用できなかったので適当に3Dプリンターで作成した。

また体に装着するためのバンドが必要です。座位、立位を往復する場合ゴムバンドなどを利用したほうがいいです。今回は幅5cm,長さ80cmのゴムバンドを利用しました。(長すぎたので60cm程度でもよかったと思っています。)

装着位置に関しては Putting on your trackers - SlimeVR Docs を参照してください。

SlimeVR Serverの準備

SlimeVR setup - SlimeVR Docs に従って行います。

大まかな手順としては以下の通りです。

  1. https://github.com/SlimeVR/SlimeVR-Installer/releases/latest/download/slimevr_web_installer.exe からServerのインストーラーを入手、インストールする。
  2. インストールしたSlimeVR Serverと作成したトラッカーを起動し、ServerのGUIに表示されるまで待つ。
  3. 表示されたトラッカーの位置、配置設定を行う。
    設定例
  4. 装着したトラッカーに従ってServer GUIの右側下部SteamVR Trackersの設定を行う。今回の場合、Feet, Chest, Kneesにチェックを入れた。
  5. Body proportions の設定を行う
  6. 直立し、Server GUI中央上のResetを押す

Body proportions の自動設定の使い方

SlimeVRではBody proportionsの設定が必要です。簡単化のために、自動で設定できる機能があります。大まかな手順としては以下の通りです。

  1. Server GUI 右側にあるReset Allを押し、リセットを行います。
  2. Autoを押し、自動設定ウィンドウを表示します。
  3. 以下の動画を見て、自動設定時の動きを確認します www.youtube.com
  4. Start Recordingを押して、上の動画のように動きましょう
  5. Auto-Adjustを押して、計算を待ちます。
  6. 計算が完了したらApply Valuesを押すと、Server GUIのBody proportionsに反映されます。自動設定ウィンドウは閉じて問題ないです。

もっと詳しい説明は Body proportions configuration - SlimeVR Docs を見てください。

JoyConをSlime VRのトラッカーとして利用する

GitHub - carl-anders/slimevr-wrangler: Use Joycons as SlimeVR trackers with this middleware application を使うとJoyConをSlimeVRのトラッカーとして利用することができます。

大まかな手順としては以下の通りです。

  1. https://github.com/carl-anders/slimevr-wrangler/releases/latest/download/slimevr-wrangler.exe から最新のexeをダウンロードする
  2. JoyConの内側にある黒いペアリングボタンを長押ししてJoyConをペアリングモードにする
  3. PCからJoyConとペアリング、接続を行う
  4. slimevr-wrangler.exeを開き、Search for Joy-Con'sを押してJoyConを追加する
  5. SlimeVR Serverに認識されているかを確認する

このソフトウェアはまだアルファ版のようです。またBluetoothドングルによっては、振り向くと接続が安定しない可能性があるようです。

VRChatで使う

この部分は他のトラッカーと違いはありません。

手順としては以下のようになります。

  1. SlimeVR Server, SteamVR, VRChatを起動する
  2. VRChatメニュー内Calibrate FBTを押す
  3. Trackerの位置に白い球が表示されるのでアバターの各部位に大まかに合わせ、両手のTriggerを押す

おわりに

VRChatであなたの足は動くようになったでしょうか?

あなたのVRライフがより良くなることを祈っています。

今回記事内で利用したSlime VRでは一つのコントローラーに二つのセンサーしか接続できませんが、GitHub - Loler920a/L.i.me-Slimes: A twist of lime on the case and hardware of SlimeVRを利用すると4つのセンサーを接続できるようです。もし将来的に多くのトラッカーを追加する場合、いい選択肢になるでしょう。

またはI2Cのマルチプレクサを利用すれば複数のセンサーを接続できるかもしれません。(そもそもコントローラーがそれほど処理できるのか疑問ですが、、、)

自作トラッカーは自分で好きなように遊べるので電子工作ができる人ならよい選択肢だと思います。ぜひ試してみてください。

Ender-3をDual Z化してみた

作業後のEnder-3

モチベーション

私のEnder-3にはベルトによって同期を行うdual z化を以前行った。しかし、1度ベルトを破損してしまい、買いなおしたベルトは長すぎて不格好になっていた。

ベルトが長すぎるEnder-3の例

上部をすっきりさせるために、モーターを増やしてZ軸を増やすキットを購入したので紹介する。

買ったもの

www.amazon.co.jp

キットの内容

キットにはdual z化に必要なモーターやリードスクリューなどが含まれている。また、とても親切なマニュアルも同梱していた。

マニュアル

一度マニュアル通りに組み立てた際、リードスクリューから削れるような音がしたため、グリスを追加した。グリスは手元にあった以下のものを利用した。

www.amazon.co.jp

組み立て

マニュアル通りに作業するだけなのでとても簡単です。

  1. プーリーを外す

    プーリーを外した

  2. 付属のプレートに外したプーリーを装着する。特に内側の偏心ピン(六角スペーサーの向きに注意!)

  3. 本体に装着する

  4. z軸のモーターとカプラーを装着する

  5. リードスクリューにグリスを塗り、装着する。今回のグリスは綿棒を用いて塗布した。

  6. ガントリーを装着する。またこの時、左右が水平であることを確認するとよい。 現在はスマホに水平器つきアプリなどが含まれているので利用するとよい。(精度はあまりよくないだろうが、そもそもの本体の精度が高くないので、問題ないと判断した。)

  7. モーターにケーブルを接続する。また、キットには二股のモーターケーブルが付属していたので利用した。執筆現在は問題ないが、問題が発生したら直接ボードにつなぐようにしたほうがいいと考えている。

キットには電源を固定するアダプタも含まれていたが今回は装着しなかった。

プリンターを起動し、Homeに移動したときの動画が以下のTweetである。

ここまで30分程度で完了した。

おわりに

今回は比較用の船やXYZキューブの印刷をしなかったのでまとめは割愛。 感覚として若干の印刷品質の改善を感じた。が、コストに見合っているかは不明。 もし同じようにZ軸の改善をするならリニアレールを追加するほうが効果は実感できるだろう。ただし、コストは上がるので一長一短かもしれない。

Creality Ender-3にWifiモジュールを導入してOctoPrintから無線で操作できるようにする

Wifi経由でプリントを行うことはおすすめしません。

同じ経験をする人が少なくなることを願っています。

はじめに

私はOctoPrintをRaspberry Pi Zero W(以下PiZero)で運用していたのですが、OctoPrintのprogress取得に5秒以上かかることなどざらでWebcamの映像がプチフリするのはいつものことでした。 そこでWifiモジュールを導入して、PiZeroではなく別のサーバー上でOctoPrintを稼働させる案を思いついたので実践してみた。

全体構成

まず通常の構成は以下のようになっていると思います。

f:id:syuchan1005:20210113181553j:plain
RaspberryPiを用いた、通常のOctoPrint構築の様子

この構成ではPiZeroに大きな負荷がかかることが懸念されるため、以下のように構成を変更します。

f:id:syuchan1005:20210113181828j:plain
Wifiモジュールを用いて無線化を行う例

この構成を用いるとOctoPrintを実行しているサーバーとプリンタ, Webcamを分離することができます。

ESP3Dの導入

ESP3DとはUSB経由で行っていたシリアル通信をTCPに変換するブリッジです。そのほかにもWebUIを用いて3Dプリンタの操作を行えます。

導入には github.com

よりReleaseのzipをダウンロードし、 https://github.com/luc-github/ESP3D/tree/v2.1.1#installation を参考にセットアップを行います。

私の利用しているSKR v1.4 Turboには専用のソケットが存在するため、ESP8266との接続は以下の図のように行いました。

f:id:syuchan1005:20210113183412j:plain
接続の例

また、プリンタ側のシリアルポートは3なので、Marlin Firmwareの場合、Configuration.hのSERIAL_PORTかSERIAL_PORT_2を3にする必要があります。

RaspberryPiからWebcamの映像を配信する

映像の配信にはOctoPrintでも利用しているmjpg_streamerを利用します。 mjpg_streamerの導入は多数の記事があるので省略します。

ESP3D経由でOctoPrintからプリンタを操作する

全体構成で示している図の通りOctoPrintは別のサーバ上で実行します。また構築の簡略化のため以下のdockerイメージを利用しています。

https://hub.docker.com/r/octoprint/octoprint

3Dプリンタとの通信にはESP3Dから提供されているData port(デフォルト: 8888)を利用します。しかしOctoPrintはtcpを喋れないため、socatを利用しOctoPrintから利用できるようにします。 socatを利用したパイプの作成には以下のコマンドを利用しました。

$ socat -d -d pty,raw,link=/dev/virtualcom0,user=<User> tcp:<ESP3D IP>:8888,forever,interval=10,reuseaddr

OctoPrintから/dev/virtualcom0が見えない場合、以下のようにAdditional serial ports/dev/virtualcom*を追加すると選択できるようになります。

f:id:syuchan1005:20210113185537p:plain
OctoPrintのserial設定の例

またWebcamの設定は以下のようにすると映像を見ることができます。

  • Stream URL: http://<raspberry pi ip>/?action=stream
  • Snapshot URL: http://<raspberry pi ip>/?action=snapshot

おわりに

初めにも言いましたがWifi経由でプリントを行うことはおすすめしません。

ですが便利なことは確かです。この構成のためにローカル用のWifiルーターを購入しようかと考えましたが、Raspberry Pi 4Bを導入したほうが安定するためそちらを選択しました。 時間があればBLE経由での操作等も試してみたいと思っています。

Creality Ender-3にNeoPixel(LEDテープライト)つけてみた

はじめに

皆さんはプリントの途中経過を見るためにOctoPrintなど利用しているでしょうか? OctoPrintには接続しているWebcamをストリーミングしてくれる機能があるのですが、プリンタをエンクロージャなどに入れている場合、暗くて見えないことがとても多いです。

これを解決するためにNeoPixel(いうならばLEDライト)を導入したので紹介をします。

注意

筆者はEnder-3にSKR v1.4 Turboというメインボードを積んでおりNeoPixelの導入を簡単だと思っていますが、Stockのメインボードにはピンが存在しないため、それなりに厄介な作業となります。 この記事内ではどのような作業をするのか / ファームウェアの書き換えるべき箇所等は紹介しません。

また、この記事内で使われているコンフィグ設定は以下にて公開しています。

github.com

準備

まず光らせるためにNeoPixel対応のLEDテープライトを用意する必要があります。私は以下のものを購入しました。

www.amazon.co.jp

また今回は本体上部からベッドを照らすために以下のモデルを利用しています。

www.thingiverse.com

上で紹介したLEDテープライトは上記モデルのV2もしくはV3であれば簡単に使うことができます。(記事内はすべてV2のモデルを利用している写真です。

導入してみる

上で紹介したLEDテープライトやモデルを用いて、MarlinのConfigurationをいじると以下のように光らせることができます。

f:id:syuchan1005:20201216172559j:plain
NeoPixelをつけたEnder-3

また、温度などのステータスに応じて青 / 赤などに光らせることも可能です。(これでアツアツのベッドを触ってけがをすることも少なくなる、、、、、、はず

f:id:syuchan1005:20201216172717j:plain
ステータスに応じて光るNeoPixelの様子

もちろんOctoPrintからWebcamで見た時も明るくなり、これで失敗した時も気づきやすくなるでしょう、、、、きっと

f:id:syuchan1005:20201216172956p:plain
Webcamから見たときのベッドの様子

おわりに

フィラメントとLEDライトテープのみで実現でき、かつGCodeによって色や明るさまで変えられるのでぜひ皆さんも導入してみてください。

6年ぶりにメインPCを大きくアップグレードした(i7-4770K -> Ryzen 9 5900X)

はじめに

巷(Twitter)でRyzen 9 5900X / 5950Xの品切れ / 入荷時期不明が叫ばれていたころ、ふと眺めていた私のTLにTSUKUMOさんの入荷Tweetが流れてきたため、なんとなく購入手続きをしていたら買えてしまったのでアップグレードした。

アップグレード前のPC

大まかな構成は以下の通りである

  • CPU: Intel i7-4770K
  • Memory: DDR3 8GB * 2
  • MotherBoard: ASUS Z97-PRO GAMER
  • GraphicBoard: GTX 750 -> Palit RTX 2070 Super Jetstream
  • PowerUnit: Corsair Full-plugin 650W
  • SSD(sumsung 255GB) * 1 + HDD(3TB) * 2

一部のパーツは故障によって交換しているが、頭(RTX 2070 Super)でっかち感のある構成であった。 CPUが足を引っ張り多くのゲームはジャギープチフリが目立つ始末である。

アップグレード後のPC

大まかな構成は以下の通りである

  • CPU: Ryzen 9 5900X
  • CPU Cooler: CoolerMaster MasterLiquid ML360L V2 ARGB
  • Memory: Corsair CMK32GX4M2D3200C16 (DDR4-3200 16GB*2) * 2
  • MotherBoard: MSI MEG X570 UNIFY
  • GraphicBoard: Palit RTX 2070 Super Jetstream
  • PowerUnit: Thermaltake TOUGHPOWER GRAND RGB 850W
  • WD WDS100T2B0C-EC (m.2 SSD 1TB) + SSD(sumsung 255GB) * 1 + HDD(3TB) * 2

アップグレード前はCPUが足を引っ張る構成であったが、アップグレードはGPUが足を引っ張る構成となった。 また前の構成ではメモリ容量でプログラムのコンパイルが遅くなることが多かったためメモリも64GB(4倍増)に増量した。 今回購入したCPUやMotherBoardに感動したため一部魅力を紹介したい。

Ryzen 9 5900X

私の主な利用用途はプログラムのコンパイル程度なのでゲーム等の改善はあまりわからないが、少なくともジャギープチフリが改善されたため、CPUが頭打ちになっているという状況は改善されていると思う。 プログラムに関して、私はよくTypescript + WebpackやKotlin (Android)のトランスパイル / コンパイルをよく行う。

例えば私が作成しているGitHub - syuchan1005/BookReader: Original Manga Viewerではi7-4770Kを利用しているときのフルビルドで16分程度かかっていたが、Ryzen 9 5900Xで行うと5分程度で完了する。 また、i7-4770Kではフルビルドで32分程度かかるAndroidアプリがRyzen 9 5900Xでは28分で終了する。すごいとしか言えない。 もちろんメモリの設定など変更しているため一概にCPUパワーのみの改善とは言えないが大幅に改善しているのは間違いない。

MSI MEG X750 UNIFY

最初に届いたボードはメモリスロットに認識不良という初期不良に遭遇し、「4D」というエラーコードが表示される状態であったが、購入したパソコン工房さんで即日交換していただけたため事なきを得た (結構無茶なことを言って即日交換していただけたので感謝しかない)

このMSI MEG x570 UNIFYはいわゆるハイエンドのMotherBoardである。そのため様々な機能がついているがその中でも私が感動した一部の機能を紹介する。

M-FLASH(USBメモリ単体でのBIOSアップデート機能)

普通のMotherBoardでは対応したCPUを載せ、UEFIを起動し、アップグレードを実行する必要があると思う。もちろんその方法も可能だが、このMEG X570 UNIFYではCPU, メモリ無し、必要なのはMotherBoardと電源, USBメモリだけである。 このボードでRyzen 9 5900Xを動作させるにはBIOSアップデートが必要なためこの機能に救われた。 USBメモリにサイトからダウンロードしたBIOSファイルを入れ、Motherboardに刺してBIOSアップデートボタンを押して待つだけである。 この機能だけでもこのMotherboardをおすすめする十分な理由になると思う。

Wi-Fi, Bluetooth標準搭載

小題の通りであるが、これが非常に便利でかつWi-Fi 6にも対応しているという。 普段であればWi-Fi用のPCIeカードや、USB接続のBluetoothドングルなどを接続するかもしれないがこのMotherBoardではまったく必要ない。

Audio Boost HD搭載

アップグレード前に利用していたZ97-PRO GAMERでは入力 / 出力ともにホワイトノイズを感じたが、このMEG X570 UNIFYでは感じない。

おわりに

全体的な満足度は高いアップグレードとなったため非常に良かった。しかしノリで購入したせいで15万程度が吹っ飛んだのでお財布がさみしい、、、、(2月に引っ越しあるのに、、、 安定性などはまだわからないが少なくとも悪いことはないだろう。

まだ安定供給されていない点はあまり良いものとは言えないが、おすすめするには良い製品を選べたと思う。

次はGPUのアップグレードをしたいと思うがいつになることやら、、、、、