姿勢制御機能付き球体Lチカを作ろう ①

はじめに

 


2015年から球体ディスプレイを作成しています.

もともとのアイデアは2015年のハッカソンから始まって現在まで開発を進める中,MakerFaireTokyo(以下MFT)2022でも展示させていただいてきています.

www.youtube.com
MFT2022は同じ球体ディスプレイ仲間の やまたい さんとの共同出品でした。

このときに作っていた球体ディスプレイはPOV(Persistent Of Vision)という原理で動作していたものです。
en.wikipedia.org

原理はこの動画のように

www.youtube.com
ブレード状のLEDを回転させながら点滅させることで残像効果を使って映像を出力できるものです。

このブレードを

www.youtube.com
曲面に配置して回転させることで球面状に映像を出力できるようにしました。

この方法は、LEDを少なくすることで消費電力を抑えながら回転させることで解像度を上げることができることが利点です。このPOV neonは50個のLEDを一回転を120分割して映像を出力することで、50個のLEDだけで50x120=6000pixel分の画像を表示することができるのです。その一方で、モーターの制御や高速回転するLEDを正確に高速に制御する技術が必要です。

2022年はPOV neon finalと位置づけてPOV形式のneonバイスの開発を進めてきました。
tajmahal0707.hatenablog.com

上でも示したようにフルカラーで映像を呈示できるようになり、かなり楽しい工作になりました。
しかし、neonとして機能が実装できていないものがあります。 それが
  
   姿勢センサによるディスプレイの天地制御

です。こんな感じ



www.youtube.com

(。。。。。ちなみにこれ3万以上するんですよ。。。落としたら一発アウトだし)

液体に浮いたコンパスなどもコレですね。


今回実装したいのは、このように外殻のボールを回転させても中の模様(コンパスやら地球儀やら)が動かない機能のことです。(これって名前なんていうんでしょうね。。。知っている人いたら教えてください。)この機能を電子回路で実現できないか、というチャレンジになります。



姿勢センサを用いた天地判定

 

ソフトウェア

実はソフトウェア部分はすでに完成しています。
tajmahal0707.hatenablog.com

前記事を要約すると、
センサより獲得できる quaternion を  \boldsymbol{quat} = \left( x, y, z, w \right) として、球面上の点  \boldsymbol{pos}=\mathrm {(x,y,z)} をquat分回転した球面上の点のの座標を  \boldsymbol{pos^{\prime}} = \mathrm {(rx, ry, rz)} \boldsymbol{pos^{\prime}}をテクスチャ上にマッピングした座標値を  \boldsymbol{uv}=\mathrm {(u, v)} 定義します。
まず、

   \boldsymbol{pos^{\prime}} = \boldsymbol{quat}.\textit{rotateVector}(\boldsymbol{pos} )

 \boldsymbol{pos} を球面上で原点周りに回転させ、その位置をuv座標にマッピングする式は以下のようになる。

   \begin{cases}u=\arctan2{ \left( \sqrt{ rx^{2} + rz^{2} }, ry\right)} \\ v=\arctan2{ \left( rx, rz \right)} \end{cases}

ここで  \sqrt{} \arctan{} など重そうな計算が出てきます。すべてのLEDの回転に対して一つづつ計算していくと馬鹿にならない計算量になってしまい、演算が間に合わなくなってしまいそうです。

近似計算

neonマイコンにESP32を採用しており、このESP32はディアルコアで浮動小数点演算を行うコプロセッサがあるためfloatの計算は速いようです...

といいつつ,探していたらこんな記事も見つけてしまいましたが.. 

esp32にFPU(浮動小数点演算装置)はあるけど有用性は微妙っぽい。残念w
 t.co

— mはげ (@Tw_Mhage) 2017年5月6日

しかし最近はS3も出て演算能力が上がり、高速化が期待できます。試してみましょう。
lang-ship.com

過去には わたこさんのwebページ でもESP32の演算能力について分析されています。
watako-lab.com



以下に検証に使った簡単なプログラムを置きます。
github.com

試験に使ったESP32-S3はXIAOのものを使用
www.sengoku.co.jp

arctanの近似

やっぱりarctan 重いですね。
そこでまずはarctanの計算について近似計算と関数演算とをESP32上で比較します.
比較対象はmath.hのatan2と以下のサイトにあった近似計算(_atan2)です.今回は4次の近似式を使います。
garchiving.com

 -1.0〜1.0 を20万分割して20万回atan2を演算した結果をmicrosecで計測します。
もっと厳密に計算したほうが良いでしょうが、概要を捉えるのにはこれくらいで十分かな、と。

結果は_atan2が勝利。atan2 が1回あたり2.09 usecなのに対して、_atan2 では0.00001 usec。かなり差が付きましたがどちらも早い感じ?

sqrt の近似

同じようにsqrtもやってみます。
このような近似式があります。ここでは4次収束のものを使用(_sqrt)。
www.finetune.co.jp


前にESP32-S2(M5stack)でやったときには差があまり出なかったのに、今回は結構出た?
sqrt (math.sqrt)の計算が1回あたり15 usec。
_sqrt(近似計算)の計算が1回あたり4.4 usec となりました。

これも使ってもいいかも。

まとめ

このように近似計算を行うことで姿勢の変化に対してテクスチャの座標をマイコンレベルでも高速に変換することができるようになってきます。POV neonだと6000回の演算が10fpsくらいの速度で更新する必要があります。

そこで今回はちょっとLED数を減らして実験をすることに。
今回はこの機能の実装をメインに考えているので、POVではなくLEDディスプレイベースのこれを参考にしてみました。
learn.adafruit.com

これだと8x8のLEDアレイをcubicに配置(6面)なので、64x6=384 LEDとなり演算的にはかなり楽になりそうです。


②へ続く