asumism

あすみん(@an_asumin)のブログやで

Youtubeを見せるスマートグラスを作るぽよ

f:id:an_asumin:20220103211533p:plain
バイス名はrflctoid

自分じゃなくて他人にYoutubeを見せるスマートグラスを作る話

相反する気持ち,目と耳

f:id:an_asumin:20220103210547j:plain
カメラアプリで大きくなった私の目

みなさんには相反する気持ちを感じるときがありますか?私の心には「もっと多くの人と関わりたい(目立ちたい/他人を知りたい)」という気持ちと「誰にも関わりたくない(目立ちたくない/存在したくない)*1」という気持ちが同居していて,私は日々それらのせめぎ合いを感じています.おそらくこういった気持ちは,大なり小なり多くの人が持っているとは思います.今回新しく作品を作るにあたって,このような,答えはないがよく意識に上ることを題材にするのがよいと考えました.
色々と思案した結果,目と耳と塞ぐ代わりに,目にはディスプレイを,耳にはスピーカを付け,他者とのコミュニケーションを断ち切りつつも他者を繋ぎ止めるような相反するデバイスを作ることによって,その答えのない気持ちを表現できるのではないかと考えました.

設計と開発

構想

目にディスプレイを耳にスピーカをつけるとして,それらがどうあるべきなのかを考えました.まず,ディスプレイは横長で,ステレオスピーカとセットでサングラスのような形状に収まっているとデバイスとしての見栄えが良さそうだと考えました.また,デバイスは充電することができ,短時間であっても固定された電源から切り離して使用することができると良いと考えました.
そして,ディスプレイとスピーカで何を表現するかについて考えました.もし,スマートフォンでお気に入りのYoutubeの動画を見ているときに,共有ボタンをタップするだけで自分からそのYoutubeの動画が再生されたら*2,とてもキャッチーで満ち足りた気持ちになるのではないかと思い,この機能の実現を中心に構成を考えることにしました.

システム構成

f:id:an_asumin:20220102123303p:plain
バイスコンポーネント

システム構成は以上のようになりました.細長いディスプレイとしてHannStar社のHSD088IPW1を使いたいと考えていたので,柔軟に出力解像度を変更できるSBC*3を選ぶ必要があったことと,YoutubeのHD動画を再生できるようなマシンパワーが求められることからRaspberry Pi 4*4を使うことにしました.

f:id:an_asumin:20220102154234j:plain
Raspberry Pi 4上のAndroidが1920x480で動くことの確認

また,Androidを走らせることができるSBCとしてもRaspberry Pi 4を選定しました.もしAndroidが動けば,開発を簡単にできるからです.例えば,タッチパネルこそ付いていなくても画面いっぱいに画像が広がるようなアプリケーションを簡単に作ることができる他,各モジュールがAndroid APIで繋ぎこまれていて,サードパーティのライブラリなどを使用することもできます.そして何よりadbが動けばWi-Fiの接続だけで画面操作やアプリケーションのインストールやデバグなどを行うことすら可能となります.

手元のスマートフォンとの通信はOSCで行います.まず,スマートフォンテザリングを行い,デバイスはそのテザリングにぶら下がります.始めにデバイスデフォルトゲートウェイに向かって自身のIPアドレスを知らせれば,スマートフォンアプリケーションはデバイスIPアドレスを知ることができるので制御を簡単に開始できます.*5スマートフォンアプリケーション側では,Youtubeアプリケーションから共有されたURLのvideoIdを取得し,デバイスに向かって制御コマンドなども含めて送信します.

命名

> rflctoid

バイスを開発するにあたり,rflctoidという名前をつけてみました.目を見るものから見せるものに,耳を聞くものから聞かせるものにする,感覚を跳ね返す(reflection)ようなイメージと,その「ような」と,Androidを採用していることから,-oidの接尾辞を合成した語*6です.

ソフトウェア開発

rflctoid controller アプリケーション
f:id:an_asumin:20220103192750p:plain
rflctoid controller app GUI

rflctoidはAndroidスマートフォンから制御するので,制御用のアプリケーションを作ります.Youtubeアプリ側で,再生したい動画をrflctoid controllerに向かって共有するだけでrflctoidから動画が再生されるようにしました.また,ディスプレイのアスペクト比が4:1であるため,再生する多くの動画は上下が切れます.ですので,映し出す動画の垂直位置を調整できるようにしました.他にも,LEDにはRGBWのチャンネルがある*7ことから,RGBとWをそれぞれ指定できるようにしました.これによりRGB混色に依らない白色の発光も可能です.LEDは両耳付近にマトリクス状に配置するので,LEDの色指定は上下前後方向に行えるようにし,色のブレンドも楽しめるようにしました.
ちなみに,アプリ上のrpi4GlassControllerという表記は,rflctoid controllerの旧称だったりします.

カラーピッカーとして以下のライブラリを使用しました.
github.com

また,OSCで通信するためにJavaOSCを使用しました.
github.com

rflctoid

Raspberry Pi 4にOmniROMを焼くことによってAndroid 11が走ります.OSCで通信するためにこちらもJavaOSCを同様に使用する他,Youtubeの動画を再生するためにandroid-youtube-playerを使用しました.
github.com

f:id:an_asumin:20220102155621p:plain
AndroidからLED制御ができることの確認

rflctoidにはSPIでシリアル制御のLEDを付けました.Raspberry PiでNeoPixelなどのシリアル制御LEDを使用する場合,rpi_ws281xを採用することが考えられます.rpi_ws281x自体はC言語で記述されていますが,Javaなどの多様な言語のバインディングも公開されています.ここでは,C言語のコードをAndroidのcppフォルダに配置した上でswig*8でラッパーを生成し,使用しました.OmniROMによるAndroidであっても,/dev/spidev*は存在している*9ので,rpi_ws281xを利用した高速なシリアルLED制御が可能になります.
github.com

今回はYoutube動画の音声をリアルタイムにFFT*10した上で,パワースペクトルをLEDの表現に利用しました.Android APIのVisualizerではFFTがサポートされているので今回はこれを使用しました.過去に私が書いたプログラムを参考します.
asumism.hatenablog.com

筐体設計

f:id:an_asumin:20220102145742p:plain
作り込んでから陰線エッジ表示すると満足感がある

筐体はFusion360で作成します.システム構成上,グラス形状としては体積が大きくなるのを避けられないので,直線的なデザインでまとめました.シリアル制御LEDは各スピーカ付近に配置しました.この筐体の中に以下のものが内蔵されています.

  • Raspberry Pi 4 Model B
  • LiPo(5000mAh)
  • Power Management Board
  • DAC Board
  • Stereo Speaker
  • Display Controller
  • MIPI Conversion Board
  • Display(1920x480)
  • Logic Level Conversion Board
  • Serial Control LED Strip
  • Tact Switch(x4)
f:id:an_asumin:20220102145856p:plain
レンダリング画像

ディスプレイとシリアル制御LEDは表面をポリカーボネート製ハーフミラーで覆う*11ので,レンダリング画像で仕上がりの印象を確認しておきます.

制作

f:id:an_asumin:20161128002431j:plain
もうずっと一緒に暮らしているZortrax M200
f:id:an_asumin:20220102160131j:plain
組み上げ途中(DMM.make AKIBA Studioにて)

筐体は家にある3Dプリンタで印刷しました.各モジュールを配線して,市販のネジとナットで組み上げるなどすると完成です.

完成

f:id:an_asumin:20220102162931p:plain
マネキンヘッドに身につけてもらう

待機中はrflctoidの文字がキラキラして,Wi-Fiの接続情報が表示されます.

f:id:an_asumin:20220102163321p:plain
調整可能なPPベルト

はっきりいって,このデバイスは鼻梁で支えきれるほど軽くはありません.ですので,よくあるHMDのように,後頭部に調整可能なPPベルトによる固定バンドを設けました.写真だと調整部分が結構余っていますが,これはマネキンヘッドが比較的小型に出来ていて頭髪などもないためです.

映像

youtu.be
動作中のそのままの映像です.原理上,埋め込み許可のされているYoutube動画であれば,どんな動画であっても再生することが出来ます.とはいえ,それぞれの動画にはライセンスが適応されるので,ここでは自身で作成した動画*12を表示しています.印象の偏りがでないようにグリッチされたような抽象的な映像を選んだのですが,ちゃんと映像が出力されているのか分かりづらいなと後から思ったのは秘密です.好きなアーティストのMVを再生する*13などすると満足度がとても高いです.


youtu.be
せっかくのウェアラブルバイスなrflctoidなので,私が自由気ままに色んなポージングで体験している動画も載せておくぽよ*14.こちらは編集して音源を別で乗せています.ちなみに,映像に加えて照明が反射してキラーンってなるのが個人的お気に入りポイントです.デバイス開発を通して,少しカタルシスを得た気がします.

*1:文字にすると大層なことになってしまうのが嫌である

*2:人を繋ぎ止めるという意味合いでYoutubeを持ってくるのはやや皮肉っぽいのかも

*3:Single Board Computer

*4:Model B

*5:他にもやり方はありそう

*6:理由は他にもあるけどここでは書かない

*7:RGBの三原色に加えてWという白の発光色のLEDが搭載されている

*8:公開されている多言語バインディングswigによるもの

*9:実際に使用するにはおそらくrootが必要だった

*10:高速フーリエ変換

*11:スマートミラーと近い構成

*12:権利上問題のない素材を組み合わせています

*13:もちろん私的に

*14:rflctoidに負けないように面白い柄の服を着てみました