一个解算试车收集到的推力的程序
关键词
工具试车推力

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

#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=(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文件

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

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

另外狡辩解释一下,不做图形界面是因为我认为这无益于偷懒 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
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
某倒吊的亚雷斯塔 作者
1年5个月前 IP:广东
916693

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

pip install matplotlib -i XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/simple

可能是外国的源下不了?

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

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

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

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

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


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

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


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

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

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

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

以下是原本的F-t图

F - t 图.png

以下是第二版的F-t图

F - t 图.png

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

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

其余操作与1.0一样

一下是代码

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


f = open("TEST_SD.TXT")
a = XXXXad()
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
XXXXose()
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]))
XXXXXose()
fig = XXXXXXgure(figsize=(20, 10), dpi=100)
XXXXXXot(time, force)
plt.xlabel("F(N)")
plt.ylabel("t(s)")
plt.title("F - t")
XXXXXXow()
XXXXXXvefig("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(";")
   XXXXXose()#生成可以直接导入openrocket的.eng文件

以下是.py文件

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

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

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

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

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

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

import matplotlib.pyplot as plt
<br>
<br>
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:
   fuelmass = 1
f.close()
f1 = open("时间-推力表.txt", "w")
f1.write("总冲(N.s):%f\n"%I)
if data != "0":
   isp = (I/fuelmass)/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文件

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
某倒吊的亚雷斯塔作者
1年4个月前 IP:广东
917908
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文件

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

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

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

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

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

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

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

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

(第一行注释是改名了)

#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=(20, 10), 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字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

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

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

火箭爱好者

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:广东
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}