加载中
加载中
表情图片
评为精选
鼓励
加载中...
分享
加载中...
文件下载
加载中...
修改排序
加载中...
一个解算试车收集到的推力的程序
关键词
工具试车推力

我最近买了氢离子大佬的推力采集卡,发现很好用,也解决了我采集推力的问题(不是打广告,我自己真的认为好用),这是原帖链接https://www.kechuang.org/t/85718。不过有个麻烦事,就是有些时候不动也有0.1N的干扰数据,看着不爽,还有excel折线图要自己手动做,感觉好麻烦,还有输入open rocket的.eng文件也要复制粘贴,改后缀,好麻烦,还不方便与固体火箭发动机内弹道模拟的结果比较。对与这些,大家估计要么觉得麻烦点没事,要么自己做了些工具但觉得没太大技术含量就不发了。但是毕竟我也潜水那么久了,也该做些贡献了,虽然对各位大佬们来说没啥技术含量,但我还是发出来吧,毕竟能偷懒一点是一点 sticker 。好了废话不多说,先上代码和封装好的程序,再展示功能(我自己用着没啥问题,不过发现bug的话麻烦回我,我一定第一时间修改)。以下是源代码

Python
#by奇怪的丁仪又敲水滴了(辰星引力航天工作室) import matplotlib.pyplot as plt f = open("TEST_SD.TXT") a = f.read() b = a.split("\n") c = [] time = [] force = [] I = 0 for i in b:     if (i != "\n")and(i != ""):         c.append(i) for i in range(len(c)):     d = c[i].split(",")     time.append(float(d[0]))     force.append(float(d[1])) t0 = time[0] for i in range(len(time)):     time[i] = time[i]-t0 for i in range(len(force)):     if force[i] < 2:         force[i] = 0 #将试车中不可能出现的负数数据和小于0.2N的干扰信号除去     force[i]*=0.1#我的实验得到的数据单位是0.1N,我不知道是不是都这样,如果不是的话可以改下代码 for i in range(len(time)-1):     dt = time[i+1]-time[i]     di = force[i]*dt     I += di#积分算总冲 data = input('''请输入相关数据,格式如下: 发动机名称/直径(mm)/长度(mm)/开伞延时(s)/燃料质量(kg)/总质量(kg)/制造商 若要跳过请输入0,不计算比冲,不形成eng文件\n''') if data != "0":     d = data.split("/")     name = d[0]     diameter = int(d[1])     length = int(d[2])     dertatime = int(d[3])     fuelmass = float(d[4])     mass = float(d[5])     maker = d[6] else:     mass = 1 f.close() f1 = open("时间-推力表.txt""w") f1.write("总冲(N.s):%f\n"%I) if data != "0":     isp = (I/mass)/9.8#计算以秒为单位的比冲     f1.write("比冲(s):%f\n"%isp) fmax = force[0] for i in range(len(force)):     if fmax < force[i]:         fmax = force[i]#计算最大推力 f1.write("最大推力(N):%f\n"%fmax) f1.write("时间(s)    推力(N)\n") for i in range(len(time)):     f1.write("%f    %f\n"%(time[i],force[i])) f1.close() fig = plt.figure(figsize=(2010), dpi=100) plt.plot(time, force) plt.xlabel("F(N)") plt.ylabel("t(s)") plt.title("F - t") plt.show() fig.savefig("F - t 图")#绘制并保存推力时间曲线 if data != "0":     f2 = open("导入openrocket的数据.eng","w")     f2.write("%s %d %d %d %f %f %s\n"%(name, diameter, length, dertatime, fuelmass, mass, maker))     for i in range(len(time)):         f2.write("%.3f %f\n"%(time[i], force[i]))     f2.write(";")     f2.close()#生成可以直接导入openrocket的.eng文件

以下是封装好的程序(用的python封装肯定会大些,我封装是为了让没下载python的kcer也可以方便使用

attachment icon 解算.zip 33.58MB ZIP 36次下载

另外狡辩解释一下,不做图形界面是因为我认为这无益于偷懒 sticker

好了接下来展示下功能和使用方法(前几张图上总质量有问题,后来才发现是一个小bug,到后来的图片上已经修正了,不用管)

这是我们得到的数据,我随便压传感器了几下,注意要把程序放到sd卡里

联想截图_20230219134115.png 联想截图_20230219134155.png

点开程序

联想截图_20230219140551.png

不用计算比冲,生成.eng文件的话,就输入0就行了

联想截图_20230219140227.png

会弹出F - t图

联想截图_20230219140237.png 联想截图_20230219140303.png 联想截图_20230219140318.png

关掉后就可以得到含有总冲、最大推力,并且少干扰数据的数据以及.png格式的F-t图,发到论坛和与固体火箭发动机内弹道模拟的曲线对比都很方便

联想截图_20230219141621.png

如果要直接得到比冲并且生成.eng文件的话就要输入一些数据了,按照程序输出填就行 联想截图_20230219141158.png

这样会多输出一个可以直接导入openrocket的文件(这里的总质量不对,是个bug,已经改了)

联想截图_20230219141352.png 联想截图_20230219141915.png

可以直接导入open rocket,方法就看Lshang001大佬的帖子吧,为尊重原帖,我就不搬了,直接给链接https://www.kechuang.org/t/78737

最后看看封装好的效果吧,其实都一样,我重新压了几下传感器,然后编了一些数据,我就不解说了,直接放图。

联想截图_20230219144755.png

联想截图_20230219144824.png

联想截图_20230219144833.png

联想截图_20230219144901.png

联想截图_20230219145009.png 联想截图_20230219145053.png

可以看出,它还是挺好用的,可以塞sd卡里,然后每次试车完收集完数据就点一下就行

最后,献上我们的LOGO

1674282422714.png

来自:航空航天 / 喷气推进
10
 
5
新版本公告
~~空空如也
某倒吊的亚雷斯塔 作者
2年2个月前 IP:广东
916693

对了,其中图七中发动机名称和生产商为中文,是因为一开始我是这么做的,不过放openrocket里边这俩成乱码了,大概是编码问题,看不下去又懒得搞,所以就换英文了,图六是第二次换了英文之后的。另外由于Python包装后很大,一个简单的功能就33m了,所以还是推荐用源码,我以后看看能不能用c写,这样好很多。最后,如果用源码,而且之前没有安装matplotlib库的,用pip安一下吧,不过不知道为什么直接安不上,打开cmd后要输入

pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

可能是外国的源下不了?

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
blki
2年2个月前 IP:河南
916695

顶一个,能上传.py的文件吗

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
某倒吊的亚雷斯塔作者
2年2个月前 IP:广东
916698
引用blki发表于2楼的内容
顶一个,能上传.py的文件吗

可以的,不过依旧需要下载matplotlib库,以下是.py文件

attachment icon 解算.py 2.28KB PY 4次下载


引用
评论(1)
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
Tarkfpv
2年2个月前 IP:广东
917163

F - t 图.png 很好的程序,但这好像有点bug,还有时间应该是横轴,力是竖轴你这是不是搞反了


引用
评论(2)
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
某倒吊的亚雷斯塔作者
2年2个月前 IP:广东
917487
引用Tarkfpv发表于4楼的内容
很好的程序,但这好像有点bug,还有时间应该是横轴,力是竖轴你这是不是搞反了

应该不是的,我自己用没问题,不过这个是针对一种格式的,要不私发下文件,我看看。我最近很忙,有空我会尽量弄出图形化界面,并兼容不同格式文件。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
某倒吊的亚雷斯塔作者
2年2个月前 IP:广东
917490

另外这是最近的改进版本,运算速度了不少,并增加了删去试车前后的数据的功能。不过还是针对这种文件,不一样的话可以找我,我有时间改,或者闲下来后做个有图形化界面,可通用的程序。

以下是原本的F-t图

F - t 图.png

以下是第二版的F-t图

F - t 图.png

可以看出它能删去无用的数据。

多段推力的火箭也没问题,因为是只删头尾。

其余操作与1.0一样

一下是代码

Python
#by奇怪的丁仪又敲水滴了(辰星引力航天工作室)
import matplotlib.pyplot as plt


f = open("TEST_SD.TXT")
a = f.read()
b = a.split("\n")
c = []
time = []
force = []
I = 0
for i in b:
   if (i != "\n")and(i != ""):
       c.append(i)
for i in range(len(c)):
   d = c[i].split(",")
   time.append(float(d[0]))
   force.append(float(d[1]))
while force[0] < 3:
   force.pop(0)
   time.pop(0)#删除试车前的数据
while force[-1] < 3:
   force.pop(-1)
   time.pop(-1)#删除试车后的数据,不直接设定阈值是考虑到多推力峰
t0 = time[0]
for i in range(len(time)):
   force[i]*=0.1#我的实验得到的数据单位是0.1N,我不知道是不是都这样,如果不是的话可以改下代码
   time[i] -= t0
for i in range(len(time)-1):
   dt = time[i+1]-time[i]
   di = force[i]*dt
   I += di#积分算总冲
data = input('''请输入相关数据,格式如下:
发动机名称/直径(mm)/长度(mm)/开伞延时(s)/燃料质量(kg)/总质量(kg)/制造商
若要跳过请输入0,不计算比冲,不形成eng文件\n''')
if data != "0":
   d = data.split("/")
   name = d[0]
   diameter = int(d[1])
   length = int(d[2])
   dertatime = int(d[3])
   fuelmass = float(d[4])
   mass = float(d[5])
   maker = d[6]
else:
   mass = 1
f.close()
f1 = open("时间-推力表.txt", "w")
f1.write("总冲(N.s):%f\n"%I)
if data != "0":
   isp = (I/mass)/9.8#计算以秒为单位的比冲
   f1.write("比冲(s):%f\n"%isp)
fmax = force[0]
for i in range(len(force)):
   if fmax < force[i]:
       fmax = force[i]#计算最大推力
f1.write("最大推力(N):%f\n"%fmax)
f1.write("时间(s)    推力(N)\n")
for i in range(len(time)):
   f1.write("%f    %f\n"%(time[i],force[i]))
f1.close()
fig = plt.figure(figsize=(20, 10), dpi=100)
plt.plot(time, force)
plt.xlabel("F(N)")
plt.ylabel("t(s)")
plt.title("F - t")
plt.show()
fig.savefig("F - t 图")#绘制并保存推力时间曲线
if data != "0":
   f2 = open("导入openrocket的数据.eng","w")
   f2.write("%s %d %d %d %f %f %s\n"%(name, diameter, length, dertatime, fuelmass, mass, maker))
   for i in range(len(time)):
       f2.write("%.3f %f\n"%(time[i], force[i]))
   f2.write(";")
   f2.close()#生成可以直接导入openrocket的.eng文件

以下是.py文件

attachment icon 解算2.0.py 2.34KB PY 5次下载

以下是.exe文件(要解压缩)

attachment icon 解算2.0.zip 33.58MB ZIP 2次下载

同样的,我测试过可以用,但我不知道是否会有没被发现的bug,所以有问题麻烦联系我,谢谢

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
某倒吊的亚雷斯塔作者
2年2个月前 IP:广东
917907

提示下各位,经过试车,本程序可以用,但是我除错质量了,导致比冲计算错误,不过总冲是准的,以下是修改后的代码

Python
import matplotlib.pyplot as plt
Python
Python
Python
f = open("TEST_SD.TXT")
Python
a = f.read()
Python
b = a.split("\n")
Python
c = []
Python
time = []
Python
force = []
Python
I = 0
Python
for i in b:
Python
   if (i != "\n")and(i != ""):
Python
       c.append(i)
Python
for i in range(len(c)):
Python
   d = c[i].split(",")
Python
   time.append(float(d[0]))
Python
   force.append(float(d[1]))
Python
while force[0] < 3:
Python
   force.pop(0)
Python
   time.pop(0)#删除试车前的数据
Python
while force[-1] < 3:
Python
   force.pop(-1)
Python
   time.pop(-1)#删除试车后的数据,不直接设定阈值是考虑到多推力峰
Python
t0 = time[0]
Python
for i in range(len(time)):
Python
   force[i]*=0.1#我的实验得到的数据单位是0.1N,我不知道是不是都这样,如果不是的话可以改下代码
Python
   time[i] -= t0
Python
for i in range(len(time)-1):
Python
   dt = time[i+1]-time[i]
Python
   di = force[i]*dt
Python
   I += di#积分算总冲
Python
data = input('''请输入相关数据,格式如下:
Python
发动机名称/直径(mm)/长度(mm)/开伞延时(s)/燃料质量(kg)/总质量(kg)/制造商
Python
若要跳过请输入0,不计算比冲,不形成eng文件\n''')
Python
if data != "0":
Python
   d = data.split("/")
Python
   name = d[0]
Python
   diameter = int(d[1])
Python
   length = int(d[2])
Python
   dertatime = int(d[3])
Python
   fuelmass = float(d[4])
Python
   mass = float(d[5])
Python
   maker = d[6]
Python
else:
Python
   fuelmass = 1
Python
f.close()
Python
f1 = open("时间-推力表.txt""w")
Python
f1.write("总冲(N.s):%f\n"%I)
Python
if data != "0":
Python
   isp = (I/fuelmass)/9.8#计算以秒为单位的比冲
Python
   f1.write("比冲(s):%f\n"%isp)
Python
fmax = force[0]
Python
for i in range(len(force)):
Python
   if fmax < force[i]:
Python
       fmax = force[i]#计算最大推力
Python
f1.write("最大推力(N):%f\n"%fmax)
Python
f1.write("时间(s)    推力(N)\n")
Python
for i in range(len(time)):
Python
   f1.write("%f    %f\n"%(time[i],force[i]))
Python
f1.close()
Python
fig = plt.figure(figsize=(2010), dpi=100)
Python
plt.plot(time, force)
Python
plt.xlabel("F(N)")
Python
plt.ylabel("t(s)")
Python
plt.title("F - t")
Python
plt.show()
Python
fig.savefig("F - t 图")#绘制并保存推力时间曲线
Python
if data != "0":
Python
   f2 = open("导入openrocket的数据.eng","w")
Python
   f2.write("%s %d %d %d %f %f %s\n"%(name, diameter, length, dertatime, fuelmass, mass, maker))
Python
   for i in range(len(time)):
Python
       f2.write("%.3f %f\n"%(time[i], force[i]))
Python
   f2.write(";")
Python
   f2.close()#生成可以直接导入openrocket的.eng文件

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
某倒吊的亚雷斯塔作者
2年2个月前 IP:广东
917908
Python
import matplotlib.pyplot as plt f = open("TEST_SD.TXT") a = f.read() b = a.split("\n") c = [] time = [] force = [] I = 0 for i in b:    if (i != "\n")and(i != ""):        c.append(i) for i in range(len(c)):    d = c[i].split(",")    time.append(float(d[0]))    force.append(float(d[1])) while force[0] < 3:    force.pop(0)    time.pop(0)#删除试车前的数据 while force[-1] < 3:    force.pop(-1)    time.pop(-1)#删除试车后的数据,不直接设定阈值是考虑到多推力峰 t0 = time[0] for i in range(len(time)):    force[i]*=0.1#我的实验得到的数据单位是0.1N,我不知道是不是都这样,如果不是的话可以改下代码    time[i] -= t0 for i in range(len(time)-1):    dt = time[i+1]-time[i]    di = force[i]*dt    I += di#积分算总冲 data = input('''请输入相关数据,格式如下: 发动机名称/直径(mm)/长度(mm)/开伞延时(s)/燃料质量(kg)/总质量(kg)/制造商 若要跳过请输入0,不计算比冲,不形成eng文件\n''') if data != "0":    d = data.split("/")    name = d[0]    diameter = int(d[1])    length = int(d[2])    dertatime = int(d[3])    fuelmass = float(d[4])    mass = float(d[5])    maker = d[6] else:    mass = 1 f.close() f1 = open("时间-推力表.txt""w") f1.write("总冲(N.s):%f\n"%I) if data != "0":    isp = (I/mass)/9.8#计算以秒为单位的比冲    f1.write("比冲(s):%f\n"%isp) fmax = force[0] for i in range(len(force)):    if fmax < force[i]:        fmax = force[i]#计算最大推力 f1.write("最大推力(N):%f\n"%fmax) f1.write("时间(s)    推力(N)\n") for i in range(len(time)):    f1.write("%f    %f\n"%(time[i],force[i])) f1.close() fig = plt.figure(figsize=(2010), dpi=100) plt.plot(time, force) plt.xlabel("F(N)") plt.ylabel("t(s)") plt.title("F - t") plt.show() fig.savefig("F - t 图")#绘制并保存推力时间曲线 if data != "0":    f2 = open("导入openrocket的数据.eng","w")    f2.write("%s %d %d %d %f %f %s\n"%(name, diameter, length, dertatime, fuelmass, mass, maker))    for i in range(len(time)):        f2.write("%.3f %f\n"%(time[i], force[i]))    f2.write(";")    f2.close()#生成可以直接导入openrocket的.eng文件

唉,刚刚太着急,代码的模式搞错了

引用
评论
3
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
TSAaaa
1年2个月前 IP:湖南
929874

我的天呐,我昨天还在为这个东西着急,想着要不要一个一个去复制粘贴,没想到啊,碰到了救世主。

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
某倒吊的亚雷斯塔作者
1年0个月前 IP:湖南
931660

最近想起来了,现在已经改了一遍,不过没加图形窗口,我觉得没必要以下是.py、.exe、源码

改动内容:增加了删去错误数据的部分,改动部分代码,增加可读性,改正时间和力标反的错误,改正数据单位的错误,减小exe文件大小

attachment icon 解算2.0.py 2.31KB PY 2次下载

attachment icon 解算2.0.exe 28.77MB EXE 11次下载

(第一行注释是改名了)

Python
#by某倒吊的亚雷斯塔(辰星引力航天工作室) import matplotlib.pyplot as plt f = open("TEST_SD.TXT") c = [i for i in f.read().split('\n'if i != ''] time = [float(i.split(',')[0]) for i in c] force = [float(i.split(',')[1]) for i in c] I = 0 for i in force:     if i < 0:         i = 0#删除负数的错误数据 while force[0] < 20:     force.pop(0)     time.pop(0)#删除试车前的数据 while force[-1] < 20:     force.pop(-1)     time.pop(-1)#删除试车后的数据,不直接设定阈值是考虑到多推力峰 t0 = time[0] for i in range(len(time)):     force[i]*=0.098#我的实验得到的数据单位是0.098N,我不知道是不是都这样,如果不是的话可以改下代码     time[i] -= t0 for i in range(len(time)-1):     dt = time[i+1]-time[i]     di = force[i]*dt     I += di#积分算总冲 data = input('''请输入相关数据,格式如下: 发动机名称/直径(mm)/长度(mm)/开伞延时(s)/燃料质量(kg)/总质量(kg)/制造商 若要跳过请输入0,不计算比冲,不形成eng文件\n''') if data != "0":     d = data.split("/")     name = d[0]     diameter = int(d[1])     length = int(d[2])     dertatime = int(d[3])     fuelmass = float(d[4])     mass = float(d[5])     maker = d[6] else:     mass = 1 f.close() f1 = open("时间-推力表.txt""w") f1.write("总冲(N.s):%f\n"%I) if data != "0":     isp = (I/mass)/9.8#计算以秒为单位的比冲     f1.write("比冲(s):%f\n"%isp) fmax = force[0] for i in range(len(force)):     if fmax < force[i]:         fmax = force[i]#计算最大推力 f1.write("最大推力(N):%f\n"%fmax) f1.write("时间(s)    推力(N)\n") for i in range(len(time)):     f1.write("%f    %f\n"%(time[i],force[i])) f1.close() fig = plt.figure(figsize=(2010), dpi=100) plt.plot(time, force) plt.xlabel("t(s)") plt.ylabel("F(N)") plt.title("F - t") plt.show() fig.savefig("F - t 图")#绘制并保存推力时间曲线 if data != "0":     f2 = open("导入openrocket的数据.eng","w")     f2.write("%s %d %d %d %f %f %s\n"%(name, diameter, length, dertatime, fuelmass, mass, maker))     for i in range(len(time)):         f2.write("%.3f %f\n"%(time[i], force[i]))     f2.write(";")     f2.close()#生成可以直接导入openrocket的.eng文件


引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
某倒吊的亚雷斯塔
进士 机友
文章
9
回复
121
学术分
0
2020/08/28注册,14天21时前活动

火箭爱好者

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:广东
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的