第3世代 POV neon ③
はじめに
前回の続き
今回はソフトウェアの話です.
第2世代では主にハードウェアの実装がメインで,ソフトウェアは必要最低限のものでした.
このように単色,単一画像を表示し続ける...
これはこれで良いのですが,最終目標は
①スマホ側から信号(例えば音楽など)に合わせて画像・パターンを切替える
②できれば動画として表示したい
③ジャイロセンサを用いて,ボールが傾いても画像が傾かない
①②については,ハードウェア的にスマホと通信する機能は実装済み,動画として大量のデータを読み込むためにESP32ボードにはSDカードを実装しています.
そして,今までも構想にはあったけれど実装してこなかった③についての考察は,
ここで行いました.
processing上でのシミュレーション結果です.
ちなみに動画中の球体は,回転する120x45 dotsのLEDの位置に小さな球を配置し,それぞれのLEDの座標とジャイロセンサの情報を元に上記ブログのプログラムから地球儀のテクスチャを用いて各LEDの画素値を取得します.
動画中ちょっと見にくいのですが,世界地図の上に細かい線が引いてあり,ジャイロの動きに合わせて更新されているのがわかるかと思います.これはボールの経線を表しており,リアルタイムに更新されているのがわかります.
しかしいくらESP32がデュアルプロセッサとはいえ,これらの計算には大量のatan2とsqrt, sin, cosが登場します.ここを近似計算にすることによって計算負荷を下げ,他の通信系や画像処理にリソースを回したいところです.
ちなみにこの動画での結果が早いのは,これらの計算をPC(Macbook Pro)で行っているからです.ESP32ではまだ試していませんが,もっと遅くなってしまうことが当然予想されます.
逆にPCとwifi通信して角度情報を送っているため,タイムラグが発生しているのがわかります.
ESP32の浮動小数点処理
基本的には先人がいろいろ検討をしており,それを参考にしているので今更感はありますが,m5stack(ESP32)を使う人には参考になるのでは,と思います.
何より自分用のメモ.
ESP32はディアルコアで浮動小数点演算を行うコプロセッサがあり,floatの計算は速いようです...
といいつつ,探していたらこんな記事も見つけてしまいましたが..
esp32にFPU(浮動小数点演算装置)はあるけど有用性は微妙っぽい。残念whttps://t.co/wmb1V8JwgT
— mはげ (@Tw_Mhage) 2017年5月6日
しかし最近はこうゆうものも出たらしいので,
浮動小数点演算の勢力図はまだ変わっていくのかもしれませんね.
期待したいです。
各処理の速度演算については,
このサイトなど くわしく検証されています.
今回は標準関数によるatan2, sqrt, cosの3つの計算を近似計算に置き換えたものと置き換えなかったものとで比較しました.
計算に使用したソースコードは以下においてあります.
atan2
まずはata2の計算をESP32上で比較します.
使用するマイコンはM5stack-grey.
Arduino IDE上でコーディングし,比較対象はmath.hのatan2と以下のサイトにあった近似計算です.
参考ページの手法は,およそ±0.01° 以内の誤差で収まるようなので,このアルゴリズムでも4次近似式を使用します.
M5stackはマルチコアですが,片方はUIや通常のloop関数を扱っているので,計算部分は別スレッドで行いました.
標準関数であるatan2()と,近似計算を行う_atan2()とを交互に20万回計算し,かかった時間をμ秒で計測します.
atan2に入力するx, yはテキトーに決めて,値を放り込みました.
その結果
atan2()で2669332μ秒程度.1計算あたり約13.3μ秒.
近似式_atan2()は7.44μ秒以下...2倍行かないくらい.
上のブログは因数分解していたりなるべく整数になるような工夫が入っているので,まあ妥当な精度でしょうか...
sqrt
つづいてsqrt計算.
このブログを参考にニュートン法による漸化式を適用して,10万回計算したときのμ秒を計測します.
標準関数sqrtで412234μ秒.1回あたり4.1μ秒.
近似計算_sqrtで1420166μ秒.1回あたり14.2μ秒....
あれあれあれ...
標準関数は専用の計算プロセッサがあったりするのかな..これは標準関数を使った方が良さそうですね.
cos
つづいて三角関数.
近似方法としてはたとえば
などにテイラー展開やミニマックス近似などの方法が載っていますが,今回は参照テーブルを使うことにします.
360度を10,000分割し,その値をテーブルに格納します.
そのテーブルを使って,入力値となるcosの値を参照する近似方法です.同様に10万回計算したときにかかった時間をμ秒単位で計測.
標準関数cosでは131849μ秒.1回あたり1.3μ秒.
参照テーブルcosでは90135μ秒.1回あたり0.9μ秒.1.5倍くらい高速化しているか.
とまあ,こんな感じでESP32ベースでの計算高速化を検討してみました.
まとめ
ジャイロ(IMU)による情報からテクスチャを回転させることでボールが回転しても画像は変化しないプログラムを書きました.
ESP32のようなマイコンでこのような重い処理を行うには,かなり処理を高速化しないといけないので,ESP32プロセッサで近似計算による高速化がどれくらい効果的かを検討しました.
結果的には,atan2,cosなどの三角関数計算においては,ある程度効果が見られそうで活用しようと思います.
しかし,sqrtの計算は標準関数の方が速いので無理せずおまかせしようと思いますw
現在はまだボールのハードウェアを作成している最中なので未検証ですが,はやくソフトウェアのフェーズに入って実装したいですね.