
こんにちわ。ゆきぽんずです。
今日は、前回Androidから取得した加速度値のCSVファイルを使って加速度から距離を算出したいと思います。
前回の記事
www.yukiyukiponsu.work
前回Androidから取得した加速度値を20msにリサンプルして新たにCSVファイルを作成したファイルからデータを抽出し、距離を求めます。
*Y軸にだけAndroid端末を動かしているのでY軸の加速度から距離を算出
*20msにリサンプルした理由として、AndroidOSは計測用のOSではないため加速度値の取得時間がまちまちになってしまうことを防ぐためです(リクエストがあれば20msにリサンプルするコードも次回以降の記事にのせます)
それでは早速ソースコードから見ていきましょう!
既に20msにリサンプルしたデータを入力し、Y軸の加速度成分だけを抽出、さらに台形積分を用いて距離を算出しています。動かした距離はおおよそ30[cm]です。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import datetime
from scipy.interpolate import interp1d
samplingTime = 0.02
print('AccelerationData CSVFileName')
fileName_acceleration = input('>>')
Acceleration = pd.read_csv(filepath_or_buffer= fileName_acceleration, encoding="utf8", sep=",")
y_array_Acceleration = Acceleration.iloc[:,1]
print("Androidのy軸加速度(重力成分なし)の出力")
print(y_array_Acceleration)
print("20msでリサンプルしたAndroidの数")
print(len(y_array_Acceleration))
AccelerationLength = len(y_array_Acceleration)
acceleration_velocity= [0]*AccelerationLength
for i in range(1, AccelerationLength):
acceleration_velocity[i] = (((y_array_Acceleration[i] + y_array_Acceleration[i-1])*samplingTime)/2.0) + acceleration_velocity[i-1]
acceleration_distance = [0]*AccelerationLength
for i in range(1, AccelerationLength):
acceleration_distance[i] = (((acceleration_velocity[i] + acceleration_velocity[i-1])*samplingTime)/2.0) + acceleration_distance[i-1]
time_array = [0]*AccelerationLength
for i in range(1, AccelerationLength):
time_array[i] = 0.02*i
for i in range(0, 1):
t_Min = time_array[i]
for i in range(AccelerationLength-1, AccelerationLength):
t_Masset = time_array[i]
t = np.linspace(t_Min, t_Masset, AccelerationLength)
real_distance = 0.3
print('\n全体の距離の合計値')
for i in range(AccelerationLength-1, AccelerationLength):
print("距離の推定値[cm]")
print(acceleration_distance[i]*100)
print('\n測定した距離と理論的な距離の誤差率表示')
for i in range(AccelerationLength-1, AccelerationLength):
data_acceleration_distance = acceleration_distance[i]
error_upper = data_acceleration_distance - real_distance
error_upper_abs = abs(error_upper)
error_lower = real_distance
error_rate = (error_upper_abs/error_lower)*100
print('誤差率 (%)')
print("距離測定の誤差率")
print(error_rate)
print("\nグラフ表示")
fig = plt.figure()
asset_Acceleration = fig.add_subplot(1,1,1)
print('加速度センサから得たデータ')
asset_Acceleration.set_xlabel('time[s]')
asset_Acceleration.set_ylabel('value')
asset_Acceleration.set_title('Acce Veloc Meter')
asset_Acceleration.plot(t, y_array_Acceleration, color="red", label="Accleration[m/s2]", linestyle = "solid")
asset_Acceleration.plot(t, acceleration_velocity, color="blue", label="Velocity[m/s]", linestyle = "dashed")
asset_Acceleration.plot(t, acceleration_distance, color="green", label="Meter[m]", linestyle = "dotted")
asset_Acceleration.legend(loc=0)
fig.tight_layout()
plt.show()
コードだけでは心もとないので実行方法と実行結果も載せておきます!このリンクからコードをダウンロードできますよ(https://github.com/yukiyukiponsu/AcceToDis)
こちらのコードを自分のパソコンにダウンロードして、実行してみてください。
実行方法 && 実行結果


グラフを見るとしっかり距離を算出できていることが分かります。Androidの加速度センサも案外バカにできませんね。
何かの参考になれば幸いです。今日もブログを読んでいただきありがとうございました。
それではまたいつか( ´∀`)bグッ!