あなたの Python コードはかなり合理的に見えます。例のデータがなければ、それ以上のことはできません。
しかし、私は推測することができます。「補完フィルター」を調べたところ、それらを説明するリンクが見つかりました。
https://sites.google.com/site/myimuestimationexperience/filters/complementary-filter
このリンクは、あなたのものと非常によく似た方程式の例を示しています。
angle = (1-alpha)*(angle + gyro * dt) + (alpha)*(acc)
fs
これはでdt
あり、dt
として計算され1/sampling_frequency
ます。サンプリング周波数の場合fs
は、反転してみてはいかがでしょうか。
編集:さて、データを投稿したので、これで遊んでみました。これが正しい結果を得る私のプログラムです。
あなたのコードは基本的に正しいように見えるので、値を収集したコードで間違いを犯したに違いないと思います。あなたの変数名が私を混乱させるので、よくわかりません。
名前には と を使用namedtuple
し、CSV ファイルの列ヘッダーを使用しました (有効な Python 識別子を作成するためにスペースとピリオドを削除しました)。
import collections as coll
import csv
import matplotlib.pyplot as plt
import numpy as np
import sys
fs = 100.0
dt = 1.0/fs
alpha = 0.02
Sample = coll.namedtuple("Sample",
"accZ accY accX rotZ rotY rotX r acc_angZ acc_angY acc_angX cfZ cfY cfX")
def samples_from_file(fname):
with open(fname) as f:
next(f) # discard header row
csv_reader = csv.reader(f, dialect='excel')
for i, row in enumerate(csv_reader, 1):
try:
values = [float(x) for x in row]
yield Sample(*values)
except Exception:
lst = list(row)
print("Bad line %d: len %d '%s'" % (i, len(lst), str(lst)))
samples = list(samples_from_file("data.csv"))
cfx = np.zeros(len(samples))
# Excel formula: =R12
cfx[0] = samples[0].acc_angX
# Excel formula: =0.98*(U12+N13*0.01)+0.02*R13
# Excel: U is cfX N is rotX R is acc_angX
for i, s in enumerate(samples[1:], 1):
cfx[i] = (1.0 - alpha) * (cfx[i-1] + s.rotX*dt) + (alpha * s.acc_angX)
check_line = [s.cfX - cf for s, cf in zip(samples, cfx)]
plt.figure(1)
plt.plot(check_line)
plt.plot(cfx)
plt.show()
check_line
cfX
は、CSV ファイルから保存された値と、新しく計算された値との差cfx
です。プロットでわかるように、これは 0 での直線なので、私の計算はあなたの計算とよく一致しています。
したがって、名前のマッピングは次のようになります。
your_name my_name
________________________
r1_angle_cfx cfx
r1_alpha_x rotX
r1_angle_ax acc_angX