File size: 2,775 Bytes
aa651cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# -*- 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()