Intro to Robots Lab 8. Intro to Robots Exercise 1: Follow the text’s suggestion and Google...
-
date post
20-Dec-2015 -
Category
Documents
-
view
213 -
download
0
Transcript of Intro to Robots Lab 8. Intro to Robots Exercise 1: Follow the text’s suggestion and Google...
Intro to Robots
Exercise 1:
• Follow the text’s suggestion and Google “color names list”
• Collect from the list a set of 25 colors or so and in a new Python program put them in a list data structure.
• Write code that creates a graphics window and then loops through the elements of the colors list, changing the color of the graphics window background.
colors = [‘DarkCyan’, ‘DarkGoldenRod’, …]
Intro to Robots
Exercise 2:
• Follow up on Exercise 1 by doing the following– Add a point on the graphics window each time you
change the background color. – Use some kind of systematic method of assigning the
point coordinates like (i,i) and increment i each time you change the background color.
• The outcome will be something like:
Intro to Robots
Exercise 3:
• In class we saw the code that draws the following picture.
• Extend this code to draw the following picture.
• Hint 1: Figure out what the four corner point coordinates will be.
• Hint 2: Use 4 loops
Intro to Robots
Exercise 4:
• Add to the program in Exercise 3 by including the code
to the loops that control the drawings of the lines.
• What behaviour do you get?
wait(0.3)L.undraw()
Intro to Robots
Exercise 5:
• Consider the Bouncing Circle program
# Moving circle; Animate a circle...from myro import *from random import *def main(): # create and draw the graphics window winWidth = winHeight = 500 w = GraphWin("Bouncing Circle", winWidth, winHeight) w.setBackground("white") # Create a red circle radius = 25 c = Circle(Point(53, 250), radius) c.setFill("red") c.draw(w) # Animate it dx = dy = 3
main()
while timeRemaining(15): # move the circle c.move(dx, dy) # make sure it is within bounds center = c.getCenter() cx, cy = center.getX(), center.getY() if (cx+radius >= winWidth) or (cx-radius <= 0): dx = -dx if (cy+radius >= winHeight) or (cy-radius <= 0): dy = -dy wait(0.01)
Intro to Robots
Part 1:
• Modify the previous program so that each time the Circle is moved it leaves a Point at its previous center.
Intro to Robots
Exercise 5, Part 2:
• After you draw the Circle, draw a rectangle in the middle of the Bouncing Circle window and color it yellow:
• Use the coordinates(200,100) and (300,400)
• Now rerun the program and notice that the ballmoves behind the rectangle.
R = (Rectangle(Point1,Point2)) # Point1 is the top left-hand corner # Point2 is the bottom right-hand corner
(200,100)
(300,400)
Intro to Robots
Exercise 5 (cont):
• Modify the program so that the ball will bounce off the rectangle just like it bounces off the edge of the graphics window.
• Initially there are four situations to consider:
Intro to Robots
Case 1:
• If the ball approaches the rectangle side whose coordinates are given below then the test for the program variables is:
(200,100)
(200,400)
cx + radius >= 200 and cx – radius <= 300 andcy between 100 and 400
program code: ( (cx + radius >= 200) and (cx – radius <= 300) and ( cy >= 100) and
(cy <= 400))
(300,400)
(300,100)
Intro to Robots
Cases 2, 3 and 4:
• Evaluate the same expressions for the following three cases:
• Put this code into the original program and watch the circle move around the window.
Intro to Robots
Exercise 5 (cont):
• If you implement this code you will see that everything works well except at the corners.
• In this case we can see that the test conditions fails. What part of it fails?
(200,100)
(200,400)
( (cx + radius >= 200) and (cx – radius <= 300) and ( cy >= 100) and
(cy <= 400)) fails:
Intro to Robots
Exercise 5 (cont): In order for the circle to bounceoff the yellow rectangle it must be inside the outer rectangle in one of the areas labeled A, B, C, D or 1 … 8.
This is not enough however. In theareas labeled 4 and 5 the circle caninside the outer rectangle but still not be touching the inner rectangle.
(200,100)
A
B
C
D
(300,100)
(200,400) (300,400)
1 3
57
2 4
68
Variables: (cx,cy) - center of circle radius – radius of circle
Inside outer rectangle condition: cx + radius >= 200 and cx – radius <= 300 and cy + radius >= 100 and cy – radius <= 400
Inside A condition: inside rectangle and
cx >= 200 and cx <= 300 and cy <= 100
Inside B, C, D condition: ?
Inside 1 condition: inside outer rectangle and not in A, B, C or D and cx <= 200 and cy <= 100 and 200 – cx <= 100 – cy
Inside 2 .. 8 condition?
Inside 1 and touching rectanglecondition: inside 1 and (200 – cx)2 + (cy – 100)2 < radius2
Intro to Robots
Exercise 5 (cont):
• Modify your program to take these new conditions into account. The pseudocode is:
if inside outer rectangle: if inside A: flip dy elif inside B: flip dx elif inside C: flip dy elif inside D: flip dx elif inside 1: if touching inner rectangle: flip dy elif inside 2: if touching inner rectangle: flip dx . . . ( 6 more cases)
Added clear rectangle tosee where Circle center iswhen Circle touches rectangle
Intro to Robots
Exercise 5 (cont):
• A bug:
Circle starts here
entered area 2 are exited correctly
entered area 8 and got “stuck”
passed through area 8 ok
back and forth, back andforth until it exits area 2
Intro to Robots
Exercise 5, Bug Analysis:
• Each time we move the Circle we move it 3 pixels on the x-axis and 3 pixels on the y-axis.
• When we cross the line into the outer rectangle we flip either the x- or y- increment and the next move typically takes us back outside the rectangle.
• However this is not necessarily true in the corners
(200,100)
A
B
C
D
(300,100)
(200,400) (300,400)
1 3
57
2 4
68...
bouncing back weare still inside and so flip again; this keepsus inside until the end of the line.
..
..
..
Intro to Robots
Exercise 5, Bug Solution:
• When you enter the outer rectangle and flip either the x-increment or the y-increment you must not flip again until you have at least left the outer rectangle.
• Our problem here is that once too far inside the outer rectangle we stay there by flipping back and forth.
• Code Solution: Add a boolean flag to your program that gets turned on whenever you flip and only turned off once you leave the rectangle.
Then don’t ever allow a flip to happen if the flag is turned on.
Intro to Robots
Exercise 5, Bug Solution Pseudocode
• Exercise: Implement this pseudocode
# outside while-loopturn flag off
if inside outer rectangle: if flag turned on: continue # skips to top of while-loop if inside A: flip dy turn flag on elif inside B, C, D: . . . elif inside 1: if touching inner rectangle: # inside circular arc flip dy turn flag on elif inside 2, … , 8: . . . ( 6 more cases)else: # outside outer rectangle turn flag off
Intro to Robots
Exercise 5 (one last time)
• Make the robot beep each time you flip the x- or y-increment.
• Make it beep differently if it is hitting the outside will than if it is hitting the rectangle.
Intro to Robots
Exercise 6 (Sound):
• The human ear can not distinguish between sounds which are very close together.
• Execute the beep() command over a range of frequency values to determine your audible range.
• Execute the beep() command over a range of close-by frequency pairs to see how far apart the pairs need to be for you to distinguish the sounds
beep(1,300), beep(1,400), beep(1,1000), beep(1,2000), …
beep(1, 300), beep(1, 305), … beep(1, 1000), beep(1, 1010), beep(1, 440), beep(1, 441) …
Intro to Robots
Exercise 7 (siren):
• A siren is two sounds repeated constantly.• Find a good pair for sounds for a siren.
Intro to Robots
Exercise 8: Musical Scale Data Structure
• In the past we have used the dictionary data structure to hold data that comes in pairs.
• Remember the englishToSpanish dictionary in Chap 1?• Create a dictionary called notes with notes from 9
different octaves (from A0 to C8). These are the notes Scribbler is able to make.
• Method 1: Key in by hand.• Method 2::
freqs = [‘C’, ‘C#’, D, ‘D#’, ‘E’, ‘F’, ‘F#’, ‘G’, ‘G#’, ‘A’, ‘A#’, ‘B’]notes = {}notes[‘A0’] = 27.5; notes[‘A#0’] = 29.14; notes[‘B0’] = 30.87; notes[‘C8’] = 4186.0for i in range(7): j = 1 for f in freqs: notes[f+str(i+1)] = (notes[‘B0’])*2**(i+j/12.0) j = j+1
Intro to Robots
Musical Notes:
• Google ‘musical note frequencies’ and compare what you find there with the numbers you have created with the code on the previous page.
Intro to Robots
Exercise 9:
• Pick a simple song you remember and make your robot play your song.
• Remember that the robot can only play chords with two notes.
Intro to Robots
Exercise 10:
• Working with another team in the lab, play a duet – one robot plays the treble clef and the other the bass clef notes.
http://en.wikipedia.org/wiki/Clef
Intro to Robots
Exercise 11:
• Since our robot may at times need to express emotion you might find some short tunes that express– Determination– Sadness– Victory– Curiosity– Plodding along– Full steam ahead– Any other emotions that seem appropriate …
Intro to Robots
Exercise 12:
• Write a function that will draw a maple leaf.
Now cover a graphics window with maple leaves of different sizes (small, medium, large) and colors (red, yellow, orange).
def mapleLeaf(anchor point, size, color, window): . . .