Jag kunde inte riktigt släppa det här med att kulans hastighet inte skulle påverka.....så jag gjorde en "simulator" i 3d (vpython) om någon är intresserad av att labba.
Temperatur/Ljudets hastighet, kulhastighet, x- och y-koordinat för träffen är ställbart.
Tavlan är simulerad att vara 1000mm och mikrofonerna i hörnen.
Ut ger den T1,T2,T3,T4 från satta parametrar.
För mig känns det ganska klart att man måste mäta hastigheten på kulan vid målet.
Kod: Markera allt
from vpython import *
import numpy as np
import math
x_target=1000
y_target=1000
a=340000 #sound velocity in air mm/s
v=840000 #bullet velocity at the target mm/s
t=20
m=2
ma_deg=24
ma=0.5
marker_length=100
marker_dia=100
zmax=0
colors = []
colors.append(color.cyan)
colors.append(color.green)
colors.append(color.red)
colors.append(color.blue)
colors.append(color.yellow)
tofs=[]
tdoas=[]
ddoas=[]
for x in range (0,5):
tofs.append(0.0)
tdoas.append(0.0)
ddoas.append(0.0)
scene.width = 800
scene.height = 800
scene.range = 1500
scene.title = "\n"
def calcShotmarker(sm,mic,pt,x):
global zmax
sm.pos.x=slx.value
sm.pos.y=sly.value
xy_len=math.sqrt((mic.pos.x-sm.pos.x)**2+(mic.pos.y-sm.pos.y)**2)
z=xy_len/math.tan(ma)
zmax=max(z,zmax)
marker_dia=z*math.tan(ma)*2
tofs[x]=z/v #Bullet travel distance / velocity of bullet => bullet travel time.
#xyz_len=math.sqrt(xy_len**2+z**2)
sm.pos.z=0
sm.size.x=z
sm.size.y=marker_dia
sm.size.z=marker_dia
pt.modify(1, vector(sm.pos.x,sm.pos.y,-z))
def calcTdoa():
minTof=tofs[1]
for x in range (1,5):
minTof=min(minTof,tofs[x])
for x in range (1,5):
tdoas[x]=(tofs[x]-minTof)
t_text[x].text='T{}={:.5f} ms\n'.format(x,tdoas[x]*1000)
def calcDist():
for x in range (1,5):
ddoas[x]=(v*tdoas[x])*math.tan(ma)
pass
def update():
global v,a,m,ma,ma_deg,marker_dia,marker_length,zmax
v=slv.value*1000
m=v/a #mach number
ma=math.asin(1/m) #mach angle radians
ma_deg=ma*180/math.pi
mics[0].pos.x=slx.value
mics[0].pos.y=sly.value
zmax=0
for x in range (1,5):
calcShotmarker(shotmarkers[x],mics[x],pointers[x],x)
shotmarkers[0].size.x=zmax
shotmarkers[0].size.z=zmax*math.tan(ma)*2
shotmarkers[0].size.y=zmax*math.tan(ma)*2
shotmarkers[0].pos.x=slx.value
shotmarkers[0].pos.y=sly.value
shotmarkers[0].pos.z=shotmarkers[0].size.x-zmax*slanimation.value/100
for x in range (1,5):
if((zmax*slanimation.value/100)>=shotmarkers[x].size.x):
shotmarkers[x].opacity=1
else:
shotmarkers[x].opacity=0
def setx(s):
x_text.text = 'X {:.0f} mm\n'.format(s.value)
slx = slider(min=-x_target/2, max=x_target/2, value=0, length=600, bind=setx, right=15)
x_text = wtext(text='')
def sety(s):
y_text.text = 'Y {:.0f} mm\n'.format(s.value)
sly = slider(min=-y_target/2, max=y_target/2, value=0, length=600, bind=sety, right=15)
y_text = wtext(text='')
def setv(s):
v_text.text = 'Bullet velocity {:.0f} m/s\n'.format(s.value)
v=slv.value*1000
slv = slider(min=500, max=1000, value=v/1000, length=600, bind=setv, right=15)
v_text = wtext(text='')
def sett(s):
global t,a
t=slt.value
a=331.3*math.sqrt(1+(t/273.15))*1000
tv_text.text = 'Temp {:.1f} degC Sound velocity {:.0f} m/s\n'.format(s.value,a/1000)
slt = slider(min=-30, max=50, value=20, length=600, bind=sett, right=15)
tv_text = wtext(text='')
def setAnimation(s):
ani_text.text = 'Animation {:.0f} %\n'.format(s.value)
slanimation = slider(min=-50, max=101, value=-50, length=600, bind=setAnimation, right=15)
ani_text = wtext(text='')
setx(slx)
sety(sly)
setv(slv)
sett(slt)
setAnimation(slanimation)
target=box(pos=vector( 0, 0, 0), size=vector(x_target, y_target, 1), color = color.white)
mics = []
mics.append(sphere(pos=vector(0,0,0),radius=5, color=colors[0]))
mics.append(sphere(pos=vector(-x_target/2,y_target/2,0),radius=20, color=colors[1]))
mics.append(sphere(pos=vector(x_target/2,y_target/2,0),radius=20, color=colors[2]))
mics.append(sphere(pos=vector(-x_target/2,-y_target/2,0),radius=20, color=colors[3]))
mics.append(sphere(pos=vector(x_target/2,-y_target/2,0),radius=20, color=colors[4]))
shotmarkers = []
for x in range (0,5):
shotmarkers.append(cone(pos=vector(0,0,marker_length), axis=vector(0,0,-1), color=colors[x], size=vector(1,1,1), opacity=0.2))
shotmarkers[0].opacity=0.2
pointers = []
pointers.append(curve(vector(mics[0].pos),vector(0,0,0), color=colors[0], radius=0))
for x in range (1,5):
pointers.append(curve(vector(mics[x].pos),vector(0,0,0), color=colors[x], radius=2))
t_text=[]
t_text.append(wtext(text=''));
for x in range (1,5):
t_text.append(wtext(text=' ms\n'))
while True:
update()
calcTdoa()
calcDist()