佐藤さとる

佐藤さとる

梶研 [端末座標を世界座標に]

2023年06月13日

端末座標を世界座標に

出席率

スケジュール

短期的な予定

長期的な予定

未定

進捗報告

方法

  1. 各軸の加速度データから3次元ベクトルにする
  2. 回転行列を掛けて回転させる
  3. 3次元ベクトルから各軸の加速度にする

データをとる

  1. z軸正が上(約4秒)
  2. y軸正が上(約4秒)
  3. x軸正が上(約4秒)

グラフ

加速度

output_1.png (58.2 kB)

移動平均フィルター(前後40サンプル)をかけている

角速度

output_2.png (55.4 kB)

移動平均フィルター(前後40サンプル)をかけている

角度

output_3.png (43.2 kB)

移動平均フィルターをかけたものを積分したもの

重力に対する各軸の傾きを出す

gravity = math.sqrt(x ** 2 + y ** 2 + z ** 2)

tilt_angle_x = math.degrees(math.acos(x / gravity))
tilt_angle_y = math.degrees(math.acos(y / gravity))
tilt_angle_z = math.degrees(math.acos(z / gravity))

重力に対するそれぞれの軸の傾き

output_4.png (69.4 kB)

ベクトルを回転させる方法

回転行列

回転行列はベクトルに対し始点を基準に回転させる

=> 始点は端末の中心とし、端末座標系を回転させれば世界座標系になるのでは

2次元ベクトルを回転させる

(いきなり3次元は無理があった)

計算方法(2次元)

θrad 回転する場合

$$

Vec^{\prime} =

\begin{bmatrix}

\cos \theta & -\sin \theta \\\\

\sin \theta & \cos \theta \\\\

\end{bmatrix}

\begin{bmatrix}

x \\\\

y \\\\

\end{bmatrix}

$$

Python

回転行列 R

cos = np.cos(θ)
sin = np.sin(θ)

R = np.array(
  [[cos, -sin], [sin, cos]]
)

元のベクトル

vec = [2, 0]

回転後のベクトル

vec_dash = np.dot(R, vec)

グラフ

青を 120deg 回転させた

output_5.png (12.2 kB)

3次元ベクトルを回転させる

計算方法(3次元)

θrad 回転する場合

x軸周り

$$

Vec_x^{\prime} =

\begin{bmatrix}

1 & 0 & 0 \\\\

0 & \cos \theta & -\sin \theta \\\\

0 & \sin \theta & \cos \theta \\\\

\end{bmatrix}

\begin{bmatrix}

x \\\\

y \\\\

z \\\\

\end{bmatrix}

$$

y軸周り

$$

Vec_y^{\prime} =

\begin{bmatrix}

\cos \theta & 0 & \sin \theta \\\\

0 & 1 & 0 \\\\

-\sin \theta & 0 & \cos \theta \\\\

\end{bmatrix}

\begin{bmatrix}

x \\\\

y \\\\

z \\\\

\end{bmatrix}

$$

z軸周り

$$

Vec_z^{\prime} =

\begin{bmatrix}

\cos \theta & -\sin \theta & 0 \\\\

\sin \theta & \cos \theta & 0 \\\\

0 & 0 & 1 \\\\

\end{bmatrix}

\begin{bmatrix}

x \\\\

y \\\\

z \\\\

\end{bmatrix}

$$

参考

余談

名刺作った!!

name-card.jpg (793.7 kB)