最初に物体の追跡ができたときです。
背景をモノクロにせずに軌跡だけを描画しています。軌跡は、なめらかではなくカクカクしているのがわかります。これは、測定誤差で位置が飛び飛びになってしまうためです。
はじめて速度ベクトル(赤)を表示したときです。測定している位置が測定誤差で飛び飛びになってしまっているため、速度ベクトルも目まぐるしくあちこちを向いています。最初の問題がこれでした。
球体をアップにして静止させました。瞬間瞬間毎に検出している円の中心や半径が異なるため、実際には球体が静止しているにもかかわらず速度ベクトル(赤)が目まぐるしくチラチラと表示されています。
この時点で友人の@utwangくんに相談したところ、「大学のような場所でちゃんと画像処理をやっている専門家からアドバイスをもらった方がいい」。というわけで、名工大の徳丸先生のツテで福嶋慶繁先生を紹介してもらい、以下のようなアドバイスを頂きました。
- 円検出が安定していないので、蛍光色の物体を用いて検出しやすくする
- ノイズを吸収する仕組みが必要
- 円検出のみで追跡せずに円検出は最初のみ行い、あとは物体追跡アルゴリズムを使って追跡すると、より安定する
というわけで、それまでは娘のおもちゃであった木製の球体を使っていたのですが、硬式テニスボールを使うことにしました。次の動画は、それを使って加速度を表示させたものです。まだチラチラしていますが、おおむね円運動の中心を向いています。
物体追跡アルゴリズム(平均値シフト法)を使った物体追跡と円検出を使った物体追跡を同時に行い、比較してみました。物体追跡アルゴリズムの方が比較的なめらかに動いています。
物体追跡法を使って物体の軌跡を描きます。以前の円検出法でやったときよりもなめらかです。
速度ベクトルを描画してみました。以前よりはだいぶ安定していますが、まだカクついています。この原因は、物体追跡法を使うと移動量がピクセル単位になるために、特にゆっくり動かしたときの速度ベクトルの成分が離散的な値をとるからでした。
そこで5フレーム分の移動量を平均して速度ベクトルを求めてみました。だいぶなめらかになってきました。
今度は先ほど5フレーム分の平均で求めた速度を元に、加速度を求めて描画しています。だいぶなめらかですが10フレーム分過去からのデータを使っているために、円運動をしても加速度が中心を向きません。
斜面を転がらせます。理論的には等加速度運動になるはずなのです。前半は良い感じですが、途中で物体追跡が切れてしまったようで、後半はうまくいっていません。これに限らず物体追跡法は速い移動に対応できないという欠点があります。
過去のデータを使うと結果がおかしくなってしまうため、映像そのものも遅らせて表示することにしました。次の動画では現在の速度を過去10フレーム分の平均で求め、1コマ前の速度をそのまた過去の10フレーム分の平均で求めています。そして、表示している映像も10コマ遅らせています。映像を遅延させたため縦の振動運動や円運動の加速度がそれらしく表示されています。
どうも加速度の表示が直感的にシックリこないので、手のひらで支えている感じにしてみました。すると、だいぶ直感的にわかりやすくなりました。
手による接触力、重力、それらの合力の3つを同時に表示させてみました。学習の順序としては接触力→重力→加速度、という順番が直感的にわかりやすそうです。
振り子です。重力が他の力に比べて強すぎて、力の矢印が画面の外に行ってしまっているのが何ともいけてないです。
こちらは斜面を転がって降りる運動です。加速度を求める際に時間平均で求めてしまっているため、実際よりも速くブレーキの加速度が生じてしまっています。
斜面を転がり降りる運動の速度の生データをグラフにすると、このようになります。だいぶブレてますね・・・
ここでマツジルシ(@matsujirushi12)さんからFIRフィルタ(時間平均)を教えてもらいました。以下は4フレームで移動平均をとった場合。
4フレームではまだノイズが大きかったので、結局このノイズは6フレームの時間平均をとることでなめらかにしました。
ここで急制動モードを作りました。物体が急に止まったり動き始めたりする場合、一瞬大きな加速度が発生するため、それに対応しました。
以下の動画では、斜面を転がる球の等加速度運動と急停止がうまく描画できています。
以下の動画は振り子にはたらく張力です。少しズレていますが描画できています。
重力と張力の合成で運動が決まる様子を描画したもの。重力が大きいので画面が横長なのが辛いところです。
以下は、調整が完了したバージョンです。
以下は、振り子にはたらく力とそれらの合成を描画したものです。
現状はここまでです。まだまだ頑張りますよ!