別棟備忘録4

*

Wii角速度計File.2 換算式の評価Ⅱ

      2015/10/25

2011.7.28のエントリでは、Wiiモーションプラスからの生データをいかに換算するかという課題に挑んだ。(そして惨敗した。)少なくとも自分の環境では、なぜかWiiBrewを参考にした換算方法は奏功しなかった。
ポイントは換算に用いた13.768という数値。結果的にはこれが小さすぎるために、「アプリケーション側が実際より多く回っていると認識」という事態に遭遇するのだろう。
今回のエントリに先駆け、Wii座標計を製作したときのノウハウ(というかもう根性)で、実験によってこの値が実際はいかほどか調べてみた。
方法は単純。WiiAngle_aでデータを記録しながら等速円運動演示台にくくりつけてWiiリモコンを10回まわし、要した時間から角速度を計算。その際data.csvに記録されたデータを平均して生データの値とする。
・実験風景・
見ての通り、非常にざっくりした実験。(流れている音楽に、特に意味はありません。あしからず。)

回転の速さを10通り程度変えてデータが取れれば、生データ-角速度グラフを描き、その関係式を考察することが可能になる…はず。ということで、返ってきた生データの平均値-角速度グラフ。
Wiimotiontestbグラフ3-1

400°/sあたりでモードの切り替えが起こっていることがわかる。WiiBrewによるところの2000/440を400°/sを超えるデータに乗ずると…
Wiimotiontestbグラフ3-2
直線を引くことができる。切片を7885に固定すると、傾きは19.9。13.768よりもずいぶんと大きい。理由は不明。しかしとりあえずこれを基に、アプリケーションを改良した。
ソースの主な変更部分


‘///生データから角速度に変換。
wx_now = (ws.MotionPlusState.RawValues.X – wx_zero) / 19.9 * (440 – 1560 * (wm.WiimoteState.MotionPlusState.YawFast)) / 440
wy_now = (ws.MotionPlusState.RawValues.Y – wy_zero) / 19.0 * (440 – 1560 * (wm.WiimoteState.MotionPlusState.PitchFast)) / 440
wz_now = (ws.MotionPlusState.RawValues.Z – wz_zero) / 16.6 * (440 – 1560 * (wm.WiimoteState.MotionPlusState.RollFast)) / 440
‘///積分してリモコンの傾き角を求める。
If (Math.Abs(wx_now) > Sensitivitiy.Value) Then
wx_sum = wx_sum + wx_now * (passedtime / 1000)
End If
If (Math.Abs(wy_now) > Sensitivitiy.Value) Then
wy_sum = wy_sum + wy_now * (passedtime / 1000)
End If
If (Math.Abs(wz_now) > Sensitivitiy.Value) Then
wz_sum = wz_sum + wz_now * (passedtime / 1000)
End If

・起動画面・
Wiimotiontest_b.jpg
・落し物・
サンプルプログラム:WiiAngle_b.zip←右クリック+対象をファイルに保存
サンプルソース一式:Wiitest20cs.zip←右クリック+対象をファイルに保存
つまり、13.768を19.9に変えました。しかし、どうやら各軸でこの値が異なるようで、Y軸Z軸については適当な値が放り込んであります。
そして、「感度」というバーを追加。初期値を25に。つまり、25°/sを超えたときだけ、積分して角度に反映します。ノイズの影響が少しは落ち着く…のか?
・動作確認・

一応、1回転で表示は361°ということで、X軸まわりについては前回よりもかなりまとも。ただし、やはり各軸だんだんずれていく&並進運動させると、大きく狂う。
過去1度だけWiiSportsResortで遊んだ時(スカイダイビング…だったか?)は、狂いなくWiiリモコンの状態がそのまま反映されていたような…。やはり、同じハードでもプロは上手にその性能を引き出す、という訳ですな。
<第一部 幕>
戻る← Wii角速度計File.1 換算式の評価 I

 - Wiiリモコン→角速度計