disc-golf-simulator / examples /disc_experimental_trajectory_comparison.py
derek-thomas's picture
derek-thomas HF staff
Init commit
aa651cf
raw
history blame
2.78 kB
# -*- coding: utf-8 -*-
import sys
from shotshaper.projectile import DiscGolfDisc
import matplotlib.pyplot as pl
import numpy as np
import shotshaper.environment as env
from shotshaper.transforms import T_12
from random import uniform
def rotz(pos,betad):
beta = np.radians(betad)
TZ = np.array([[np.cos(beta), -np.sin(beta), 0],
[np.sin(beta), np.cos(beta), 0],
[0, 0, 1]])
return np.matmul(TZ,pos)
throws=[1,6,15]
nthrow = len(throws)
# pitch, roll, nose,speed,spin, yaw, wind, length
params = [[15.5, 21.8, 0.0, 24.7, 138, -31.6, 4.8, 89.7],
[12.3, 14.7, 0.8, 24.2, 128.5, -9.60, 4.8, 87.0],
[5.20,-0.70, 0.0, 24.5, 147.7, 8.00, 4.8, 106.6]]
d = DiscGolfDisc('dd2')
fig1, ax1 = pl.subplots( )
fig1.set_figheight(4)
fig1.set_figwidth(6)
for i in range(nthrow):
p = params[i]
t = throws[i]
U = p[3]
omega = p[4]
z0 = 1.5
pos = np.array((0,0,z0))
pitch = p[0]
yaw = p[5]
nose = p[2]
roll = p[1]
env.Uref = p[6]
env.winddir = np.array((1,0,0))
# Currently handle yaw by rotating the position after the throw, hence
# also need to rotate the wind vector accordingly
env.winddir = rotz(env.winddir, -yaw)
s = d.shoot(speed=U, omega=omega, pitch=pitch, position=pos, nose_angle=nose, roll_angle=roll)
pos = s.position
for j in range(len(pos[0,:])):
pos[:,j] = rotz(pos[:,j], yaw)
x,y,z = pos
arc,alphas,betas,lifts,drags,moms,rolls = d.post_process(s, omega)
# Plot trajectory
ax1.plot(x,y,f'C{i}-')
# Experiment
te,xe,ye,ve = np.loadtxt(f'data/throw{t}',skiprows=2,unpack=True)
ax1.plot(xe,ye,f'C{i}--')
ax1.set_xlabel('Distance (m)')
ax1.set_ylabel('Drift (m)')
ax1.axis('equal')
# Plot other parameters
# axes[0,0].plot(arc, lifts)
# axes[0,0].set_xlabel('Distance (m)')
# axes[0,0].set_ylabel('Lift force (N)')
# axes[0,1].plot(arc, drags)
# axes[0,1].set_xlabel('Distance (m)')
# axes[0,1].set_ylabel('Drag force (N)')
# axes[0,2].plot(arc, moms)
# axes[0,2].set_xlabel('Distance (m)')
# axes[0,2].set_ylabel('Moment (Nm)')
# axes[1,0].plot(arc, alphas)
# axes[1,0].set_xlabel('Distance (m)')
# axes[1,0].set_ylabel('Angle of attack (deg)')
# axes[1,1].plot(arc, s.velocity[0,:])
# axes[1,1].plot(arc, s.velocity[1,:])
# axes[1,1].plot(arc, s.velocity[2,:])
# axes[1,1].set_xlabel('Distance (m)')
# axes[1,1].set_ylabel('Velocities (m/s)')
# axes[1,2].plot(arc, rolls)
# axes[1,2].set_xlabel('Distance (m)')
# axes[1,2].set_ylabel('Roll rate (rad/s)')
pl.tight_layout()
pl.show()