水平状態でMPU6050から加速度を取得できるようになりました。しかし設置場所によっては水平に置くことが出来ずに、出力結果にバイアスがかかってしまう場合があります。
調べてみると座標を回転させることで補正が出来そうだという事が分かったので、現在どのような姿勢(グローバル座標から何度傾いているか)を求めて補正を掛けていきたいと思います。
初めて座標の回転について勉強したため間違った情報があればご指摘お願いいたします。
今回はこちらの記事を元に他の記事も参考にしながら勉強していきます。
2次元の回転について考える
いきなり3次元の回転について考えるのは難しいため、まずは二次元の回転について考えます。
まず初めに図1に示したように座標Pの点$\beta$回転させて、点Qに移動する場合を考えます。
|
図1:回転前後の座標 |
回転前の点Pは原点からの長さr、角度$\alpha$なので極座標形式であらわすと次のようになります。
\begin{equation}x_p = r\cos \alpha \\ y_p =r\sin \alpha \end{equation}
次に点Pを$\beta$回転させた点Qを考えます。点Qの角度は$\alpha+\beta$なので、(1)式同様に極座標形式であらわすと以下のようになります。
\begin{equation}x_q = r\cos (\alpha+\beta) \\ y_q =r\sin (\alpha+\beta) \end{equation}
(2)式を加法定理を使って展開すると以下のようになります。
\begin{equation}x_q = r(\cos \alpha \cos\beta - \sin\alpha\sin\beta) \\y_q =r(\sin\alpha \cos\beta + \cos\alpha\sin\beta) \end{equation}
この(3)式に(1)式を代入して整理すると以下のようになります。
\begin{equation}x_q = x_p\cos\beta - y_p\sin\beta \\y_q =x_p \sin\beta + y_p\cos\beta \end{equation}
最後にこれを行列形式であらわすと以下のようになり、回転行列を求めることが出来ます。
\begin{equation}\begin{bmatrix}x_q \\ y_q \end{bmatrix} = \begin{bmatrix}\cos\beta & -\sin\beta \\ \sin\beta & \cos \beta \end{bmatrix} \begin{bmatrix}x_p \\ y_p \end{bmatrix} \end{equation}
座標の回転を考える
先ほどまでは点の回転を考えてきましたが、今度は"座標"の回転を考えていきます。
図1のように$x - y$座標を$\beta$回転させて、$x^{\prime} - y^{\prime}$に変換する場合を考えます。
|
図2:今回考える座標の回転 |
この座標系に点Pを置いて、回転前の座標から見た点Pが回転後の座標から見ると次のように点Pが近づいてきて点Qに移動するように見えます。
\begin{equation}\begin{bmatrix}x_q \\ y_q \end{bmatrix} = \begin{bmatrix}\cos\beta & \sin\beta \\ -\sin\beta & \cos \beta \end{bmatrix} \begin{bmatrix}x_p \\ y_p \end{bmatrix} \end{equation}
(5)式と(6)式を使っているサイトがありますが、点を移動させてるか座標を移動させてるかの違いだと思ってます。(この辺はきちんと理解できていないため、簡単な問題を考えて検算してみます。)
簡単な検算で(5)式、(6)式どちらがいいか確認
(5)式は点の回転、(6)式は座標の回転という事はわかったのですが、今回私が使用する際にどちらがいいかピンと来てないので、簡単な検算で確認してみます。
図4のようなグローバル座標系ではz軸方向に1G掛かっているが、ローカル座標系(加速度センサーの読み取り値)ではグローバル座標の値から30度傾いている値を出力する場合を考えます。
|
図4:グローバル座標(黒色)とセンサーが傾いた場合のローカル座標(青色) |
今回は図4の座標軸で考えるので、(5)、(6)式の$x_q$,$y_q$は重力加速度とし、それぞれ$0$,$1$、$x_p$,$y_p$はセンサー読み取り値のx,zの加速度とし、それぞれ$\frac{1}{2}$,$\frac{\sqrt 3}{2}$とします。
以上を考慮すると(5)式は次のようになります。
\begin{equation}\begin{bmatrix}0 \\ 1 \end{bmatrix} = \begin{bmatrix}\cos 30 & -\sin 30 \\ \sin 30 & \cos 30 \end{bmatrix} \begin{bmatrix} \frac{1}{2}\\ \frac{\sqrt{3}}{2} \end{bmatrix} \end{equation}
(7)式の右辺を計算すると[0,1]となり、左辺と一致するため、センサー値をグローバル座標系に変換する場合は(5)式をベースに考えればよさそうだという事が分かりました。
逆にグローバル座標系の加速度を回転させたい場合は(6)式を使えばよさそうです。
簡単な検算になりますが、以下のようになります。先ほどと同様左辺を計算すれば右辺と一致するため問題なさそうです。
\begin{equation}\begin{bmatrix}\cos 30 & \sin 30 \\ -\sin 30 & \cos 30 \end{bmatrix} \begin{bmatrix}0 \\ 1 \end{bmatrix} = \begin{bmatrix} \frac{1}{2}\\ \frac{\sqrt{3}}{2} \end{bmatrix} \end{equation}
後ほど勉強して分かったのですが、回転行列は直行行列で逆行列=転置行列なので、知ってる人からすると当たり前の計算をやっただけっぽいですね。。。
3次元の回転に考える前に3次元の座標系について勉強します。
3次元の座標系には右手系と左手系の2種類があります。
|
図5:右手系と左手系 |
右手系、左手系ともに親指がx軸、人差し指がy軸、中指がz軸となってます。
0 件のコメント:
コメントを投稿