基本思路
大家应该都听过苏格拉底给学生讲的捡麦穗的故事,本文借鉴了这个想法:把前面一半路作为观察期,记住最好的那根稻穗,在接下来的路程中,若遇到比前面最好那根还要好的,则毫不犹豫的直接选择它。
计算步骤:
分为两步:
1.获取角速度的数据;
2.计算最稳定的时刻。
1.加速度数据的获取
手机下载app:phyphox,里面有测角速度的,并支持csv的表格导出,自己处理一下便可得到数据。
三列分别代表:x、y、z三个方向的数值,可以取一个波动大的来进行分析,这里取了x轴的
由于习惯,我是喜欢把数据写入txt,这里进行一下转换:
#encoding=utf-8
import csv
import os
# f1=open('D:/共享文件/acc/a1/data.txt','w+')
def write_col(path):
with open(path,'r') as csvfile:
reader = csv.reader(csvfile)
column = [row[0] for row in reader]
return column
path='D:/work/1.工作任务/8.防抖函数/a2/gyro/'
files = os.listdir(path)
n=0
for file in files:
if file.endswith('csv'):
n=n+1
cols=write_col(path+file)
for i in range(0,len(cols)):
col=cols[i]
print(col)
f=open(path+str(n)+'.txt','a')
f.write(col+'\n')
f.close()
2.寻找最稳定的一刻
from __future__ import print_function
import math
import random
import numpy as np
import glob
import os
def avg(list1):
average = float(sum(list1))/len(list1)
return average
#同时处理多个文件
f1=open('D:/work/1.工作任务/8.防抖函数/a2/data.txt','w+')
path='D:/work/1.工作任务/8.防抖函数/a2/gyro/' #遍历的路径,找到txt文本
files = os.listdir(path)
for file in files:
if file.endswith('txt'):
print(file)
n=0
ff=open(path+file,'r') #打开txt
sourceInLine=ff.readlines()
dataset=[]
set2=[]
for line in sourceInLine:
n=n+1
temp1=line.strip('\n') #读行后去掉'\n'
temp2=abs(float(temp1))
dataset.append(temp2) #按原来顺序放进dataset
set2.append(temp2)
list_100=dataset[151:250] #剩下的路程
dataset=dataset[1:150] #作为前面的一半路程
dataset.sort() #数组按升序排序
dataset_len=len(dataset)
m=max(dataset)
print("最大值为:",m)
h=int(dataset_len/2)
print("中位数为:",dataset[h])
f=int(dataset_len/4)
print("四分位数为:",dataset[f])
yuzhi=int(dataset_len/3)
yuzhi=dataset[yuzhi]
print("阈值为:",yuzhi)
#计算倒数8位的数据的均值、方差
a=set2[n-8:n]
last_20_avg=avg(a)
print("最后20位均值为:",last_20_avg)
#从某刻起,开始计算与阈值的差
list_100_dif=[]
for i in range(99):
dif=list_100[i]-yuzhi
list_100_dif.append(dif)
#上面得到的100个差值,每n个作为一组,若一组中最大值<0,则视为通过,计算均值,放到新列表
n=0
x=3 #选定连续多少个点,作为稳定点
y=8 #计算稳定点后面y个点的均值
front=[]
f8=[]
#计算前50个点的稳定点最小均值
for i in range(0,47):
list_f=list_100_dif[i:i+x]
avg_f=avg(list_f)
front.append(avg_f)
list_f.sort()
if list_f[x-1]<0:
if list_100[i]<list_100[i-1]:
list_f8=list_100[i+x:i+x+y] #从i+x开始,往后推y个点
avg_f8=avg(list_f8)
f8.append(avg_f8)
else:
f8.append(avg_f)
else:
f8.append(avg_f)
# min_f3=min(front)
min_f8=min(f8)
#在后50个点找稳定点
for i in range(50,97):
list_b=list_100_dif[i:i+x] #1-,21-40,41-60,61-80,81-100
avg_b=avg(list_b)
list_b.sort() #升序,如果数列中最后一个数<0,则代表数列所以都<0,即连续20个点都小于阈值
if list_b[x-1]<0:
if list_100[i]<list_100[i-1]:
if avg_b<min_f8:
list_b8=list_100[i+x:i+x+y] #从i+x开始,往后推y个点
avg_b8=avg(list_b8)
n=n+1
print("最优稳定点均值为:",avg_b8)
compare = avg_b8 - last_20_avg
print("对比结果为:", compare)
i=str(i)
break
if n==0:
print("没有找到稳定点,开拍吧!")
avg_b8=last_20_avg
compare=0
i=0
line=file+","+str(m)+","+str(dataset[h])+","+str(dataset[f])+","+str(yuzhi)+","+str(last_20_avg)+","+str(avg_b8)+','+str(i)+","+str(compare)+"\n"
f1.write(line)