2024/01/30
円形POVを作ったけれども映像が崩れてしまう時のプログラムにおける対処法についてまとめました。
目次
1.結論
2.円形POVについて
3.開発環境
4.結論詳細
5.おわりに
1. 結論
円形POVできれいに映像を表示するためには、
rot time > loop time × Div
が成り立つ必要がある。
4.結論詳細で説明する。
2. 円形POVについて
POVには円形POVの他にも振るタイプのPOVや3DPOVなどがあります。
渋谷とかのサイネージとかでよく使われていたりするのは円形タイプですね。
(6分40秒あたり) https://www.youtube.com/watch?v=EZ7iBtdWKkg
撮影にはフレームレートを考慮しないといけないので、普段のように撮影すると肉眼で見た時とは違う風に見えてしまいがち。
3D Phantomのバーサライタによる演出はすさまじいです。完成度えっぐいなと思います。
POVについては、"Persistent of Vision", "バーサライター", "versa-writer"等のキーワードで検索すると情報がヒットしやすい気がします。
3. 開発環境
ハードウェア、ソフトウェアについては、homemadegarbageさんのPovRanianのレシピやその他の関連記事を見て作ってみました。特に大きな変更点はありません。
ハードウェア
- マイコン
- LEDテープ
- フォトリフレクタ
- モーター
ソフトウェア
- Arduino IDE(マイコンで制御)
- フォトリフレクタで回転の検出(羽が通り過ぎたかどうか)
- 回転時間(rotTime)を計算
- pythonで生成した色情報に関する配列をもとに、LEDテープを高速切替点灯
- python
- pngやjpgなどの画像は4点のどこかを原点(大抵左上か左下)としたxy座標のようにピクセルが並べられている。
- 画像のピクセル情報(x, y, color)を中心からの距離と角度で指定する座標(極座標)に変換する。
- 変換した情報を配列にしたものをgraphics.hというファイルで保存
- モーター
- とりあえず適当な電圧を与えて回転させておけばいい。速度制御とかしなくても動く。
4. 結論詳細
円形POVできれいに映像を表示するためには、
rot time > loop time × Div
が成り立つ必要がある。
- Divとは画像の分割数のこと。pythonプログラム内で指定している変数。ホールケーキを切るように画像を分割していきます。ケーキはせいぜい8分割とかですが、ここでは100分割(Div=100)とかしています。Divが大きいほどより解像度の高い鮮明な映像を表示することができます。
- rot timeとは一回転にかかる時間(μs)。arduinoプログラム内で指定している変数。フォトリフレクタが反応することで計算しています。
- loop timeとはloop関数の最初から最後までにかかる時間(μs)。arduinoプログラム内で指定している変数。ここではフォトリフレクタの処理とLEDテープの処理にかかる時間のことを指します。
一回転の間に、全てのLEDパターンを変えないといけないため、つまり1loopで最低Div回切り替えないといけないため、rot time > loop time × Divが成り立ちます。
なので表示がうまくいかないときは、rot timeとloop timeの値をシリアルモニター等で確認するといいです。
もしrot time 「<」 loop time × Divだったらば、
- rot timeを大きくする(モーターの回転速度を小さくする)
- loop timeを小さくする(軽い処理プログラムを探す)
- Divを小さくする(pythonプログラムの値を変えるだけ)
の3つのアプローチがあります。
しかし、それぞれに課題があります。
- 回転速度が遅すぎると目の残像効果(Persistent of Vision)が薄れて、映像が見えにくくなる。
- 見つけるまでの試行錯誤が大変。使うものの選定から再考する必要があるかもしれない。
- 解像度が小さくなるのでローポリになる。細部を表現することができなくなる。
5. おわりに
プログラム以外で失敗しがちな箇所について
-
ハードウェアが原因
- 今回使用したフォトリフレクタの検出距離が3mmということで離れすぎると検出できず、近すぎると羽とぶつかってしまう距離感がシビアでした。
-
電気が原因
- LEDテープのclkとdataの線にノイズが乗ることがありました。ノイズ対策が必要です。
撮影・共有について。
- 原理はよくわからないけどガラスに映したものは撮影しやすい。
- スマホの設定では撮影できていても、共有するプラットフォームに応じては、自動的に映像の表示設定が変更されてしまうことがある。
- (例)60fpsで撮影したPOVの映像をdiscordで共有したら、30fpsに自動的に下げられ、何が映っているのかさっぱりわからない。
参考
https://homemadegarbage.com/pov-esp32-03
https://homemadegarbage.com/povranian-make