Wiiリモコンで傾きを検出


(上図は浅草ギ研 3軸加速度センサーの紹介よりパクリ)
傾きが45度になった時に0.5Gになると思ってたら、違うらしい。30度の時に0.5Gになるらしい。これがsinを使う理由なのか。なんで30度で半分なんだろう??


前回、asin関数を初めて見たと書いたが、アークサインといってsinの逆を計算してくれる便利な関数らしい。
sin(30) = 0.5
asin(0.5) = 30
ってわけだ。便利だけどCPU負荷はどれくらいなんだろ、あまり使わない方がいいのかなあ。



さっそく、asinを使ってWiiリモコンの加速度を円弧で表示してみた。赤くなっているのは、リモコンを急に動かしたために1G以上の加速度がかかって、傾きが計算できなくなっているためだ。


表示してみて気づいたが、傾きが垂直に近くなると細かい傾きが取れなくなってしまう。よく考えれば当たり前で、
Math.Asin( 0/27)= 0
Math.Asin( 1/27)= 2.12255136214335
水平付近ではリモコン側の出力値が1違うと2度の傾きになるが、


Math.Asin(26/27)=74.3575289870007
Math.Asin(27/27)=90
垂直付近では値が1違うと25度も傾きが違ってしまうのだ。
このため、ハンドルのような傾きを検出するためには、2軸の値を取得して、0.5G以下の方の値を使って傾きを計算する必要があるようだ。