はじめに
Matlab iOS も便利に使えるのがわかったのだが、Phtynistaを使えばその出来上りをHome Screenに置き、さらに手軽に可視化できそうだ。Pythonはほとんど使ったことがないが、Pythonista のExampleプログラムを基軸にネット情報を頼ってなんとかツールらしきものを作ってみた。
Example program
Phtyonista 3 をiPAD にインストール。いろいろ触ってみて、Open, This iPad, Examples, Plottingの中の Motion plot.py を少しだけ変えれば、とりあえず形になりそうだ。
#必要 modules
motion : Pythonista 3 独特のmoduleらしい。iOS のセンサのデータを所得できる。凄い❣️詳しくは、作者ページ のmotionから。他にも、locationのデータにもアクセスできる。
matplotlib.pyplot : プロット専用。
time : 定期的にデータを獲得するため。
numpy : 数値計算用。
motion module
詳しくは、上記のページから。ざっと、acceleration, gravity, attitude, magnetic field を取得。Matlab のそれと似ているが同じではない。今回は、motion.get_user_acceleration()を使う。オリジナルはmotion.get_gravity()を使用。
全コード
めんどくさいので、全コードを貼り付ける。オリジナルをほぼそのままところもあるので、**問題があるなら、教えてください!**もちろん、根本的な考え方やコードの間違いなどの指摘も大歓迎です!
やってる(と思っている)ことは、
- 時間とデータをストックするための名前(例えば、Shinkansen20181017とか)を入力させて
- その2秒後にデータを取り始め「名前.npy」でデータをセーブ
- 生のデータと、フーリエ変換したデータをプロットして「名前.png」でセーブ
今回もデータ取得は100Hzに設定しておいた。プロットが少し見にくくなるので、Y軸のラベルはコメントアウト。
これを、Add to Home Screen でホームスクリーンにおくと、いつでも好きなときにデータを取り始めることができる。
import motion
import matplotlib.pyplot as plt
from time import sleep
import numpy as np
def main():
duration = input('enter duration: ')
duration = int(duration)
name = input('enter data name: ')
motion.start_updates()
sleep(2)
print('Capturing motion data...')
num_samples = duration * 100
data = []
for i in range(num_samples):
sleep(0.01)
a = motion.get_user_acceleration()
data.append(a)
motion.stop_updates()
np.save(eval('name'),data)
print('Capture finished, plotting...')
ft = np.fft.fftn(data)
p2=np.absolute(ft/num_samples)
p1=p2[np.arange(0,int(num_samples/2)+1),]
p1[1:] = 2*p1[1:]
f=100*np.arange(0,int(num_samples/2)+1)/num_samples
sample_number = [x*0.01 for x in range(num_samples)]
plt.subplot(131)
for i, color, label in zip(range(3), 'rgb', 'XYZ'):
plt.plot(sample_number,[a[i] for a in data], color, label = label, lw=2)
plt.grid(True)
plt.xlabel('Sec')
#plt.ylabel('Acceleration')
plt.subplot(132)
for i, color, label in zip(range(3), 'rgb', 'XYZ'):
plt.plot(f,p1[:,i], color, label = label, lw=2)
plt.grid(True)
plt.xlabel('Hz')
#plt.ylabel('Spectrum')
plt.gca().set_xlim([0, 20.0])
plt.subplot(133)
for i, color, label in zip(range(3), 'rgb', 'XYZ'):
plt.plot(f,p1[:,i], color, label = label, lw=2)
plt.grid(True)
plt.xlabel('Hz')
#plt.ylabel('Spectrum')
plt.gca().set_xlim([0, 2.0])
plt.legend()
plt.show()
plt.savefig(eval('name'))
if __name__ == '__main__':
main()
考察というより感想
- センサーのデータに簡単にアクセスできるというのは、かなり嬉しい。
- Matlab を少しだけ齧った身としては一番役に立ったのはNumpy for Matlab Users。
- プロットの見た目は、Matlabのそれに似ている。
- トグルでデータ取得のオンオフできるともっと使いやすいかも。
- Phtonistaはlocation,phtos,reminderなどにもアクセスすることができるみたいなので、いろいろ遊べるようになりたい。