なんとなくblogシリーズ。
今日のメモは加速度センサの値からロール・ピッチ・ヨー表現の角度 (radien) を求める方法。
正直機能のlongitudeから距離を求める問題と同じ問題。
#またiPhoneな話です。
CMMotionManagerとかで姿勢とか見てるとせっかく三軸ジャイロついてるのに加速度センサだけで姿勢みるのもなーとなる。
そもそも加速度センサって加速度を測ってるから移動しながらとかだと静止状態の値とずれる。なのでジャイロがついているならジャイロで姿勢を見るべきなのだけど、今度はジャイロだけもせっかくの加速度センサがもったいない感じがする。じゃあ値を合成すれば良いですよねということで平均値を取ってみる。
そのうち加速度センサの値が動いてる的な加速度なら重みを減らす的な工夫もしてみると良いかも?
で、とりあえず個人的にラディアンなロール・ピッチ・ヨーが取れたほうがありがたいので加速度センサ側の値をロール・ピッチ・ヨーに変換して三軸ジャイロにあわせることを考える。
・加速度センサの値
加速度センサの値は加速度を示していて、静止状態で重力方向に1.0Gになるようになっている。詰まり三次元のベクトル。ぴったり良い姿勢になったとき以下のような値をとる。
姿勢 |
x |
y |
z |
縦持ち正方向 |
0.0 |
-1.0 |
0.0 |
縦持ち逆方向 |
0.0 |
1.0 |
0.0 |
横もち右側上方向 |
1.0 |
0.0 |
0.0 |
横もち左側上方向 |
-1.0 |
0.0 |
0.0 |
平置き仰向け |
0.0 |
0.0 |
-1.0 |
平置きうつ伏せ |
0.0 |
0.0 |
1.0 |
と言うことは縦持ち正方向で持ったとき左右方向をx軸、上下方向をy軸、前後方向をz軸として、縦持ち正方向からx軸中心に縦持ち逆方向に回転させたときの値の変化は以下の値になるはず。
傾き |
x |
y |
z |
0 |
0.0 |
-1.0 |
0.0 |
30 |
0.0 |
-√3/2 |
-0.5 |
45 |
0.0 |
-1/√2 |
-1/√2 |
60 |
0.0 |
-0.5 |
-√3/2 |
90 |
0.0 |
0.0 |
-1.0 |
180 |
0.0 |
1.0 |
0.0 |
x=軸なので変化しない
y=sin(θ)
z=cos(θ)
と言うことね。これがそれぞれの軸に対して言える。
・成分の値から角度を求めるお話
ならばここからは座標から角度を求めるときのいつもの話。
tan(θ)=sin(θ)/cos(θ)=y/zでθ=atan(tan(θ))なのでatan(y/z)。これを三軸に対してやればよし。
で、ジャイロから取れる値がx軸を左右、y軸を上下、z軸を前後の軸として以下の感じ。
プロパティ |
意味 |
pitch |
x軸中心の回転角 |
roll |
y軸中心の回転角 |
yaw |
z軸中心の回転角 |
なので
pitch = atan(y/z);
roll = atan(z/x);
yaw = atan(y/x);
となると。
実際動かして測定してみてどうなるかはそのうちまた別エントリで。
#これって数学堪能な人なら4x4の行列掛けてやればよくね? とかそういう話な気がする。。。