eecs 110: lec 16: projects aleksandar kuzmanovic northwestern university akuzma/classes/eecs110-s09

50
EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University http://cs.northwestern.edu/~akuzma/classes/ EECS110-s09/

Post on 19-Dec-2015

218 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

EECS 110: Lec 16: Projects

Aleksandar Kuzmanovic

Northwestern University

http://cs.northwestern.edu/~akuzma/classes/EECS110-s09/

Page 2: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Wed., 5/27 – final projects review

Fri., 5/29 – project recitations by TAs (G15) (10am)

Mon., 6/1 – review for Final Exam

Fri., 6/5 – Final projects due (5pm)

Sun., 5/31 – Interim milestones due (11:59pm)

The Rest of the Class…

Wed., 6/3 – Final Exam

the view from here…

Fri., 5/29 – project recitations (Wilkinson Lab) (1-4pm)

Tue., 6/2 – project recitations (Wilkinson Lab) (9-12)

Fri., 6/5 – Final exam solutions (G15) (10am)

Page 3: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Today in EECS 110

• All about the EECS 110 projects!

EECS 110 today…

vPool

Text Clouds

pyRobot

picobot

Page 4: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Final projects

Final assignment

open-ended

comprehensive

Working solo or duo is OK

Pairs need to share the work equally and together

more choice…

Page 5: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Option #1, vPool

Table

Cue (optional)

Cue ball

Billiard Ball (at least 2)

Hole (optional)

Page 6: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Option #1: virtual pool

VPython?Easily installable for windows…

Not (really) installable for the Mac

A simple example

from visual import *

c = cylinder()

What's visual?

What's c?

www.vpython.org

Page 7: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Option #1: virtual pool

from visual import *

floor = box( pos=(0,0,0), length=4, height=0.5, width=4, color=color.blue)

ball = sphere( pos=(0,4,0), radius=1, color=color.red)

ball.velocity = vector(0,-1,0)dt = 0.01

while True: rate(100) ball.pos = ball.pos + ball.velocity*dt

if ball.y < ball.radius: ball.velocity.y = -ball.velocity.y else: ball.velocity.y = ball.velocity.y - 9.8*dt

How many classes?

How many objects?

data members?

What's the if/else

doing?

Page 8: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Option #1: virtual pool

Phunky Fisicks is welcome!

Collisions with walls?

Collisions with other pool balls?

Pockets?

Page 9: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Option #1: virtual pool

To start, just design your table, try to construct a scene which consists of the following objects:

- table – made of walls, box objects- holes (optional) – use sphere objects- cueBall – another sphere-cue (optional) – cylinder object- billiard balls (at least 2) – sphere objects- you also should take a look at label objects to display game texts

After you place all the objects you should have something similar to …

Page 10: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Option #1: virtual pool

Page 11: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Option #1: virtual pool

Your main game loop should basically consist of:

while gameOver == False: m = scene.mouse.getclick() #click event – cue hit # get mouse position and give the cue ball a direction # based on that

# perform movement of the cue ball as shown before # handle collisions between different balls and # between balls and walls

# check if game is over – when all balls have # been put in

Page 12: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Option #1: virtual pool

Directing the cue ball:

temp = scene.mouse.project(normal=(0,1,0), point=(0,-side,0))

this gets a vector with the projection of the mouse on the pool table.

if temp: # temp is None if no intersection with pool table cueBall.p = norm(temp – cueBall.pos)

The cue ball direction is now given by the vector that results from the difference of the point where we clicked projected on the pool table and the actual position of the cue ball

So clicking in front of the cue ball will make it go into that direction.

Page 13: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Option #1: virtual pool

Moving the cue ball:

dt = 0.5t = 0.0while dt > 0.1: sleep(.01) t = t + dt dt = dt-dt/200.0 cueBall.pos = cueBall.pos + (cueBall.p/cueBall.mass)*dt

We basically start with a bigger movement increment (0.5), move the ball in the direction we computed with the specific increment.

Each time decrease the increment to account for drop in velocity. Stop at some point (0.1)

Page 14: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Option #1: virtual pool

Handling collisions:

With walls:

if not (side > cueBall.x > -side): cueBall.p.x = -cueBall.p.x if not (side > cueBall.z > -side): cueBall.p.z = -cueBall.p.z

When hitting wall, change directions

Page 15: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Option #1: virtual pool

When is a ball in?

if math.sqrt(math.pow(abs(ball1.x-hole1.x),2) + math.pow(abs(ball1.z-hole1.z),2)) <= hole1.radius*2: ballin = 1 ball1.visible = 0 ball1.y = 50

Holes are just spheres so we determine intersection between ball and hole same way as for different balls.

When ball is in we do a few things: Signal that a ball has been put in (might be useful later)Make the specific ball invisibleMove it out of the way

Page 16: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Option #1: virtual pool

Handling the game logic?

• Need a way to keep track of players taking turns. • Suggestion: use a simple variable for that which changes after every hit (take into account if balls have been sunk or not)

• Players need to be aware of the game flow, so show labels that display which player has turn, when the game was won and by whom

• The game is finished when all the balls are in, that is when all the balls are invisible. You can use that for check.

Page 17: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #2: text clouds

tag cloud

Page 18: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #2: text clouds

text cloud

Summary of the words in a body of text, sized and painted according to their frequency.

Demos:http://www.cs.hmc.edu/~hadas/textclouds/ orhttp://blue.cs.northwestern.edu/~ionut/index.html on:

http://www.gutenberg.org/files/74/74-h/74-h.htmhttp://www.gutenberg.org/files/76/76-h/76-h.htm

Page 19: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Text-cloud historyhttp://chir.ag/phernalia/preztags/

Page 20: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #2: text clouds

From text…

… to cloud

1. Start with entered webpage (URL)

2. Read in text

3. Create list of words out of text

4. "Clean" the words

5. "Stem" the words

6. Count the words

7. Return a string with frequencies

8. Add advanced features…

Page 21: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Text Clouds, an example

http://cs.northwestern.edu/~akuzma/classes/EECS110-s09/projects/project2/page1.html

Spamming spammers spammed spam. Spam spam spam! I love spam! Page 2

ignore this link for now

['spamming', 'spammers', spammed', 'spam', 'spam', 'spam', 'spam','love', 'spam', 'page', '2']

['spamming', 'spammers', spammed', 'spam.', 'spam', 'spam', 'spam!','I', 'love', 'spam!', 'page', '2']

['spam', 'spam', spam', 'spam', 'spam', 'spam', 'spam','love', 'spam', 'page', '2']

Page 22: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #2: text clouds

An Approach

Develop the basic application the usual way (IDLE)

Once you have everything working, transfer your .py files to your webspace. Set up the HTML wrapper files & go!

Use our code to read HTML, but don't bother writing it yet…

Personalize! The project has a number of references…

Once you have things working, try writing HTML/searching beyond depth 1/etc (NEXT SLIDE)

Page 23: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #2: searching beyond depth 1

def mtcURL(url):

toVisit[url] = 0 #toVisit is a dictionary

visited[url] = 1 #visited is a dictionary

returnText = ''

while len(toVisit) != 0:

[url, depth] = toVisit.popitem()

[textSite, listUrls] = getHTML(url)

An Approach (1/2)

Page 24: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #2: searching beyond depth 1

for urlItem in listUrls:

if visited.has_key(urlItem) == False \

and depth < DEPTH:

visited[urlItem] = 1

toVisit[urlItem] = depth + 1

wordList = textSite.split()

An Approach (2/2)

Page 25: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

pyRobot option #3

Goal: get from Pt A to Pt B2d Roomba simulator

Pt B

Pt A

Page 26: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

pyRobot option #3

Pt B

Pt A IMPORTANT:ROBOT CAN START ANYWHERE!

IMPORTANT:GOAL CAN BE ANYWHERE

Page 27: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #3: pyRobot

SENSE

[x,y,thd], bump = self.getData()

while True:

Page 28: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #3: pyRobot

Robot control continuously runs three things:

SENSE PLAN

[x,y,thd], bump = self.getData()

if bump[0] == True or bump[1] == True: print 'BUMP!', print ' [Left bump sensor:', bump[0], '] ', print ' [Right bump sensor:', bump[1], '] ' robotTask = STOP

STOP is one of the robot's states. Every 40th of a second, the robot runs through this loop, sets the robot's state and sets the velocities accordingly. Don't sleep!

while True:

Page 29: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #3: pyRobot

Robot control continuously runs three things:

SENSE PLAN ACT

[x,y,thd], bump = self.getData()

if bump[0] == True or bump[1] == True: print 'BUMP!', print ' [Left bump sensor:', bump[0], '] ', print ' [Right bump sensor:', bump[1], '] ' robotTask = STOP

STOP is one of the robot's states. Every 40th of a second, the robot runs through this loop, sets the robot's state and sets the velocities accordingly. Don't sleep!

if robotTask == STOP: self.setVels(0,0) robotTask = KBD

while True:

Page 30: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #3: pyRobot

BASIC ROBOT COMMANDS:STOP:self.setVels(0,0)

GO FORWARD:self.setVels(FV,0)

GO BACKWARD:self.setVels(-FV,0)

GO CLOCKWISE:self.setVels(0,RV)

GO COUNTERCLOCKWISE:self.setVels(0,-RV)

Page 31: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #3: pyRobot

To make the robot go forward a set amount useThe max forward velocity: FVExample...

TIME_ONE_CIRCLE_OVER = RADIUS*2 / FV

if state==DO_GO_LEFT_LITTLE:#FIGURE OUT HOW TO TRAVEL pause_stop = time.time() + TIME_ONE_CIRCLE_OVER State = GOING_LEFT_LITTLE

if pause_stop > time.time() and state==GOING_LEFT_LITTLE: self.setVels(0,0) #STOP!elif state==GOING_LEFT_LITTLE: self.setVels(FV,0) #KEEP GOING!

Page 32: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #3: pyRobot

To rotate the robot use the Max Rotational Velocity: RV

Example...

TIME_ROTATE_90_DEGREES = 90.0 / RV

if state==DO_ROTATE_LEFT_DOWN: #c-cwise#FIGURE OUT HOW LONG TO ROTATEpause_stop = time.time() + TIME_ROTATE_90_DEGREESState = ROTATING_LEFT_DOWN

if pause_stop > time.time() and state==ROTATING_LEFT_DOWN: self.setVels(0,0) #STOP!

elif state==ROTATING_DOWN: self.setVels(0,-RV) #KEEP GOING!

Page 33: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #3: pyRobot

One way to traverse the space isGO DOWN UNTIL BUMP SOMETHING,GO RIGHT A LITTLEGO UP UNTIL BUMP SOMETHINGGO RIGHT A LITTLE

DO THIS UNTIL HIT CORNER THEN REVERSE....

Page 34: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Maps are set at the very bottom of the main.py file:

Required

We may test on any map with rectangular objects

Page 35: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Project #4: Picobot Returns!

Page 36: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Basic idea: implement Picobot (the homework problem from Week 1)

Picobot is a finite-state machine!

Requirements:

Project 4: Picobot

Graphical output

Read Picobot program from a file*

Read maze description from a file

Track visited/unvisited squares

Prohibit illegal moves

Page 37: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

map3.txt contains solution to the HW0 problem

Syntax:

0 xxxx -> N 1

0 Nxxx -> S 2

0 xExx -> W 3

0 xxWx -> E 4

0 xxxS -> N 1

0 xEWx -> N 1

...

Reading a Picobot program from a file

Page 38: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Importing map3.txt into the program

Reading a Picobot program from a file

f = open('map3.txt', 'r')text = f.read()L = text.split()f.close()for i in range(len(L)): if L[i] == '->': if L[i-1] == 'xxxx':

#ETC

Page 39: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Graphics Library

• Graphics22.py (recommended)

Page 40: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Graphics Library

• Graphics22.py (recommended)

• You can use others as well:– E.g., vPython

Page 41: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Plotting a windowfrom graphics22 import *

def main():

win = GraphWin("MyWindow", 400, 400)

Page 42: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Plotting a yellow rectanglefrom graphics22 import *

def main():

win = GraphWin("MyWindow", 400, 400)

p1 = Point(0,355)

p2 = Point(400,400)

rec1 = Rectangle(p1,p2)

rec1.setFill("yellow“)

rec1.setOutline("yellow")

rec1.draw(win)

Page 43: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Plotting an Exit button…

#Exit button

p1 = Point(122,360)

p2 = Point(198,390)

square1 = Rectangle(p1,p2)

square1.setFill("gray")

square1.draw(win)

p = square1.getCenter()

t = Text(p, "Exit")

t.draw(win)

Page 44: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Accepting a mouse click…

#loop

while True:

K = win.getMouse()

if K.getX() > 122 and \

K.getX() < 198 and \

K.getY() > 360 and \

K.getY() < 390:

win.close()

exit("The end“)

Page 45: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Accepting a mouse click…

#loop

while True:

K = win.getMouse()

if K.getX() > 122 and \

K.getX() < 198 and \

K.getY() > 360 and \

K.getY() < 390:

win.close()

exit("The end“)

Page 46: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Example FunctionscreateOneRow( n )

createBoard(width, height)

done(X) #end of game: all visited in matrix X

next_state(Cstate,Icurr,Jcurr,X,STATE)

next_direction(Cstate,Icurr,Jcurr,X,DIRECTION)

main(nameOfFile)

Page 47: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

What’s due?

Sun., 5/31 – Interim milestones due (11:59 pm)

milestone.txt milestone.py

– Name(s)

– Project chosen

– Description of User Interface

What is your approach & plan?

– Classes and functions with docstrings

– 60-80+ lines of working, tested code

Page 48: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

What’s due?

Fri., 6/5 – Final projects due (5:00 pm)

final.txt final.py

– Name(s)

– Project chosen

– Description of User Interface

How do we run / play your project?

What features did you implement?

What was your approach & plan?

– Classes and functions with docstrings

– Working, tested code

A final milestone

Page 49: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

This and next week

Wed., 5/27 – final projects review

Fri., 5/29 – project recitations by TAs (G15) (10am)

Mon., 6/1 – review for Final Exam

Fri., 6/5 – Final projects due (5pm)

Sun., 5/31 – Interim milestones due (11:59pm)

Wed., 6/3 – Final Exam

Fri., 5/29 – project recitations (Wilkinson Lab) (1-4pm)

Tue., 6/2 – project recitations (Wilkinson Lab) (9-12)

Fri., 6/5 – Final exam solutions (G15) (10am)

Page 50: EECS 110: Lec 16: Projects Aleksandar Kuzmanovic Northwestern University akuzma/classes/EECS110-s09

Be inventive – we will reward that!

Ask TAs for help

Good luck with the projects!