=====Ball Launch===== ====Activity Description==== ===Learning Goals=== * Understand how the following effect motion of a projectile: * Launch angle * Launch velocity * Free fall acceleration * Use vectors to describe the motion of a block on a ramp and the forces acting upon it * Apply Newton's 2nd Law to relate the acceleration of a block on a ramp to the forces acting on it ([[https://www.nextgenscience.org/pe/hs-ps2-1-motion-and-stability-forces-and-interactions | HS-PS2-1]]) ===Prior Knowledge Required=== *2-Dimensional kinematics *Projectile motion *Newton's 2nd Law *Drag ===Code Manipulation=== * Interpretation of preexisting code * Changing values of given code ---- ====Activity==== ===Handout=== {{ :repository:ball_launch_1.png?nolink&600|}} **Ball Launch** ==Part 1== Copy and paste the code from this [[https://www.glowscript.org/#/user/porcaro1/folder/RepositoryPrograms/program/BallLaunch-Incomplete | GlowScript program]]. Click the button to launch the ball. Your goal is to hit the target. - What 3 variables can you change that might enable the ball to hit the target? Ignore drag for right now. - Variable 1: - Variable 2: - Variable 3: - Now edit these variables and run the program until the ball successfully hits the target. Repeat twice more with different combinations of variables. Record your trials below: | ^ Successful Attempt 1 ^ Successful Attempt 2 ^ Sucessful Attempt 3 ^ ^ Variable 1 | 1. | 1. | 1. | ^ Variable 2 | 2. | 2. | 2. | ^ Variable 3 | 3. | 3. | 3. | ==Part 2== Answer the following questions that are related to the program and projectile motion. - What do the green arrows represent? How do they change over time? - What do the blue arrows represent? How do they change over time? - How does changing the mass of the ball affect the motion of the ball and the size of the arrows? ==Part 3== Extra: Within the code you’ll find a reference to the drag coefficient (line 27). Change the value to something between 0.01 and 0.001. Click to “Run this program”. - Describe how the motion is different now that drag is incorporated into the program - How are the blue arrows different from the trials without drag? - Now, with drag included, modify the variables until the ball hits the target again, and record your results in the table below: | ^ Successful Attempt 4 ^ ^ Variable 1 | 1. | ^ Variable 2 | 2. | ^ Variable 3 | 3. | ^ Variable 4 (Drag) | 4. | ===Code=== [[https://www.glowscript.org/#/user/porcaro1/folder/RepositoryPrograms/program/BallLaunch-Incomplete | Link]] GlowScript 2.7 VPython get_library('https://rawgit.com/perlatmsu/physutil/master/js/physutil.js') #objects x = 0 y = 0 ball = sphere(pos=vector(x,y,0), radius=10, color=vector(1,0,0), texture=textures.rough, make_trail=True) ballmass = 1 platform = box(pos=vector(0,-25,0), length=100, height=50, width=1, color=color.orange) pL = label(pos=vector(0,200,0), text='Click to Launch', space=30, height=16, border=4, font='sans') target = box(pos=vector(800,-25,0), length=100, height=50, width=1, color=vector(0.8,0.8,0)) tL = label(pos=vector(800,-75,0), text='Target', space=30, height=16, border=4, font='sans') #Window setup scene.range = 480 scene.center = vector(400,100,0) scene.width = 960 scene.height = 600 scene.background = vector(0.5,0.5,0.5) #Parameters and Initial Conditions g = vector(0,-10,0) #Free Fall acceleration b = 0 #Drag coefficient #Time and time step t = 0 tf = 10 dt = 0.01 #velocity v0 = 100 theta = 45 vx = v0*cos(theta*pi/180) vy = v0*sin(theta*pi/180) ballv = vector(vx,vy,0) #motion map motionmapv = MotionMap(ball, tf, 5, markerScale=.8, markerColor=color.green, labelMarkerOrder=False) motionmapa = MotionMap(ball, tf, 5, markerScale=6, markerColor=color.blue, labelMarkerOrder=False) #graph gd = graph(width=600, height=250, title='Horizontal Range vs. Time', xtitle='time', ytitle='Horizontal Range', foreground=color.black, background=color.white, xmin=0, xmax=15, ymin=0, ymax=1000) rangecurve = gcurve(color=color.red) gd = graph(width=600, height=250, title='Height vs. Time', xtitle='time', ytitle='Height', foreground=color.black, background=color.white, xmin=0, xmax=15, ymin=0, ymax=1000) heightcurve = gcurve(color=color.green) ev = scene.waitfor('click') while ball.pos.y >= 0: rate(500) Fgrav = ballmass*g Fnet = Fgrav balla = Fnet/ballmass ball.pos = ball.pos + ballv*dt ballv = ballv + balla*dt motionmapv.update(t, ballv) motionmapa.update(t, balla) rangecurve.plot(t,ball.pos.x) heightcurve.plot(t,ball.pos.y) t = t + dt print (x) print (y) print (vx) print (vy) print (t) ---- ====Answer Key==== ===Handout=== {{ :repository:ball_launch.png?nolink&600|}} ==Part 1== -The three variables: - Initial Speed (line 36) - Launch Angle (line 37) - Free Fall Acceleration (Line 26) - Possible results: | ^ Successful Attempt 1 ^ Successful Attempt 2 ^ Successful Attempt 3 ^ ^ Initial Speed (m/s) | 95 | 90 | 115 | ^ Launch Angle (°) | 60 | 45 | 30 | ^ Free Fall Acceleration (m/s2) | -10 | -10 | -14 | ==Part 2== - The green arrows represent the velocity of the ball. They start out large, decrease in size, then get large again. They always point in the direction that is tangent to the path of the ball. This is consistent with the fact that the velocity of the ball slows down and then speeds up as it flies through the air - The blue arrows represent the acceleration of the ball. They stay the same size for the entire trip and always point downwards. This is consistent with the fact that the only force, and thus acceleration, acting on the ball is gravity - Changing the mass of the ball has no effect on the motion of the ball, nor the size of the arrows. This is because the acceleration stays the same; a heavier ball experiences a greater gravitational force, and the ratio between force and mass (which is the definition of acceleration) is always constant. The velocity is the same as dictated by the code, although in a real setting a heavier ball would have to be pushed harder to achieve the same velocity. ==Part 3== - The ball will not fly as far. While the original flight path (sans drag) is a symmetrical parabola, the new flight path (with drag) starts relatively parabolic but becomes compressed or squished towards the end - The blue arrows now represent the acceleration caused but the combined effects of gravitational force and drag force (which points opposite the velocity vector). In the first half of the launch, both drag and gravity have downward components creating a large resultant acceleration vector, while in the second half, the drag force points mostly up, thereby summing to a smaller resultant acceleration vector. - Possible results: | ^ Successful Attempt 4 ^ ^ Launch Speed (m/s) | 120 | ^ Launch Angle (°) | 50 | ^ Free Fall Acceleration (m/s2)| -10 | ^ Drag Coefficient (-) | 0.008 | ===Code=== [[https://www.glowscript.org/#/user/porcaro1/folder/RepositoryPrograms/program/BallLaunch-Solution | Link]] GlowScript 2.7 VPython get_library('https://rawgit.com/perlatmsu/physutil/master/js/physutil.js') #objects x = 0 y = 0 ball = sphere(pos=vector(x,y,0), radius=10, color=vector(1,0,0), texture=textures.rough, make_trail=True) ballmass = 10 platform = box(pos=vector(0,-25,0), length=100, height=50, width=1, color=color.orange) pL = label(pos=vector(0,200,0), text='Click to Launch', space=30, height=16, border=4, font='sans') target = box(pos=vector(800,-25,0), length=100, height=50, width=1, color=vector(0.8,0.8,0)) tL = label(pos=vector(800,-75,0), text='Target', space=30, height=16, border=4, font='sans') #Window setup scene.range = 480 scene.center = vector(400,100,0) scene.width = 960 scene.height = 600 scene.background = vector(0.5,0.5,0.5) #Parameters and Initial Conditions g = vector(0,-8,0) #Free Fall acceleration b = 0.000 #Drag coefficient #Time and time step t = 0 tf = 10 dt = 0.01 #velocity v0 = 60 theta = 55 vx = v0*cos(theta*pi/180) vy = v0*sin(theta*pi/180) ballv = vector(vx,vy,0) #motion map motionmapv = MotionMap(ball, tf, 5, markerScale=.8, markerColor=color.green, labelMarkerOrder=False) motionmapa = MotionMap(ball, tf, 5, markerScale=6, markerColor=color.blue, labelMarkerOrder=False) #graph gd = graph(width=600, height=250, title='Horizontal Range vs. Time', xtitle='time', ytitle='Horizontal Range', foreground=color.black, background=color.white, xmin=0, xmax=15, ymin=0, ymax=1000) rangecurve = gcurve(color=color.red) gd = graph(width=600, height=250, title='Height vs. Time', xtitle='time', ytitle='Height', foreground=color.black, background=color.white, xmin=0, xmax=15, ymin=0, ymax=1000) heightcurve = gcurve(color=color.green) ev = scene.waitfor('click') while ball.pos.y >= 0: rate(500) Fgrav = ballmass*g Fdrag = -b*ballv*mag(ballv) Fnet = Fgrav + Fdrag balla = Fnet/ballmass ball.pos = ball.pos + ballv*dt ballv = ballv + balla*dt motionmapv.update(t, ballv) motionmapa.update(t, balla) rangecurve.plot(t,ball.pos.x) heightcurve.plot(t,ball.pos.y) t = t + dt print (x) print (y) print (vx) print (vy) print (t) ---- ====See Also=== *[[cirque_du_soleil_stunt | Cirque du Soleil Stunt]] *[[angry_birds | Angry Birds]]