Question

In: Computer Science

LOOK over code Python The task aims to develop a Kalman filter that is able to...

LOOK over code Python

The task aims to develop a Kalman filter that is able to hit the moving target (the pink box) in as many situations as possible. However, there are some limitations: IT IS NOT PERMITTED TO CHANGE THE PRODEIL AND TARGET CODE IT IS ALSO NOT ALLOWED TO CHANGE THE GAME LOOP, OTHER THAN WHAT HAS BEEN COMMENTS SHALL BE CHANGED WHEN THE Kalman CLASS IS IMPLEMENTED

I have made the callman class, but my question is; why doesent i hit the pink box as often? How can I change that?

code below


#
# Kalmanfilter task
#
# Please note that only the code in the Kalman class can be changed. This is the code to be submitted
# It is therefore important that NO OTHER CODE IS CHANGED !!!
#
'''
import pygame as pg
from random import random,randint
import numpy as np
from numpy.linalg import norm

fps = 0.0

class Projectile():

def __init__(self, background, kalman=None):
self.background = background
self.rect = pg.Rect((800,700),(16,16))
self.px = self.rect.x
self.py = self.rect.y
self.dx = 0.0
self.kalm = kalman

def move(self,goal):

if self.kalm:
goal = self.kalm.calc_next(goal)

deltax = np.array(float(goal) - self.px)
#print(delta2)
mag_delta = norm(deltax)#* 500.0
np.divide(deltax,mag_delta,deltax)

self.dx += deltax
#if self.dx:
#self.dx /= norm(self.dx) * 50

self.px += self.dx /50.0
self.py += -0.5
try:
self.rect.x = int(self.px)
except:
pass
try:
self.rect.y = int(self.py)
except:
pass

class Target():

def __init__(self, background, width):
self.background = background
self.rect = pg.Rect(self.background.get_width()//2-width//2,
50, width, 32)
self.dx = 1 if random() > 0.5 else -1

def move(self):
self.rect.x += self.dx

if self.rect.x < 300 or self.rect.x > self.background.get_width()-300:
  
self.dx *= -1

def noisy_x_pos(self):
pos = self.rect.x
center = self.rect.width//2
noise = np.random.normal(0,1,1)[0]

return pos + center + noise*300.0
#
# Here is the Kalman filter you are going to develop
#
class Kalman():
'''
State vector is X=(x,v)
assuming that the target is moving at constant velocity and there is no noise in the motion of the target (just the measurement)
Motion is X_(k+1)=F X_k
Measurement is z_k=H X_k+noise
'''
def __init__(self,noise=300.,ignorance=10.):
self.R=np.matrix([[noise**2]])#covariance matrix of the measurement (only one value measured so 1X1 matrix)
self.F=np.matrix([[1,1],[0,1]])#transition matrix from current state to the next
self.H=np.matrix([[1,0]])#measurement matrix
self.x=np.matrix([[0],[0]])#initial guess at zero with zero velocity (would work better if assumed at centre, but would then need to know width of background)
self.P=ignorance*np.matrix([[noise**2,noise**2],[noise**2,2*noise**2]])#Initial guess of error covariance. rule of ignorance says better convergence with large initial P. can tweak this to see if can get better convergence
  
  
def calc_next(self, zi):
z=np.matrix([[zi]])#turn the observation into a matrix so that we can do matrix algebra
  
x_init=self.F*self.x#predicted state estimate
P_init=self.F*self.P*self.F.T#predicted error covariance
  
y=z-self.H*x_init# measurement residual
  
K=P_init*self.H.T*np.linalg.inv(self.R+self.H*P_init*self.H.T)#Kalman gain
  
self.x=x_init+K*y#updated state estimate
self.P=(np.identity(2)-K*self.H)*P_init#updated covariance estimate
  
return self.x[0,0]#return only the x, not velocity
  

pg.init()

w,h = 1600,800

background = pg.display.set_mode((w,h))
surf = pg.surfarray.pixels3d(background)
running = True
clock = pg.time.Clock()

kalman_score = 0
reg_score = 0
iters = 0

while running:
target = Target(background, 32)
missile = Projectile(background)
k_miss = Projectile(background,Kalman()) #comment on this line when Kalman is implemented
last_x_pos = target.noisy_x_pos
noisy_draw = np.zeros((w,20))

trial = True
iters += 1


  
while trial:

# Sets a maximum frame rate of 300. If you want to increase this, this is a possible change
clock.tick(300)
fps = clock.get_fps()
  
for e in pg.event.get():
if e.type == pg.QUIT:
running = False
  
background.fill(0x448844)
surf[:,0:20,0] = noisy_draw

last_x_pos = target.noisy_x_pos()
# print(last_x_pos)

target.move()
missile.move(last_x_pos)
k_miss.move(last_x_pos) #comment in this line when Kalman is implemented
pg.draw.rect(background, (255, 200, 0), missile.rect)
pg.draw.rect(background, (0, 200, 255), k_miss.rect) #comment in this line when Kalman is implemented
pg.draw.rect(background, (255, 200, 255), target.rect)
  

noisy_draw[int(last_x_pos):int(last_x_pos)+20,:] = 255
noisy_draw -= 1
np.clip(noisy_draw, 0, 255, noisy_draw)

coll = missile.rect.colliderect(target.rect)
k_coll = k_miss.rect.colliderect(target.rect) #comment in this line when Kalman is implemented

if coll:
reg_score += 1

if k_coll: #comment in this line when Kalman is implemented
kalman_score += 1

oob = missile.rect.y < 20

if oob or coll or k_coll: # or k_coll #change this check so that k_coll is also included when kalman is implemented
trial = False

pg.display.flip()

print('kalman score: ', round(kalman_score/iters,2)) #comment in this line when Kalman is implemented
print('regular score: ', round(reg_score/iters,2))

pg.quit()

Solutions

Expert Solution

'''
#
# Kalmanfilter task
#
# Please note that only the code in the Kalman class can be changed. This is the code to be submitted
# It is therefore important that NO OTHER CODE IS CHANGED !!!
#
'''
import pygame as pg
from random import random,randint
import numpy as np
from numpy.linalg import norm

fps = 0.0

class Projectile():

def __init__(self, background, kalman=None):
self.background = background
self.rect = pg.Rect((800,700),(16,16))
self.px = self.rect.x
self.py = self.rect.y
self.dx = 0.0
self.kalm = kalman

def move(self,goal):

if self.kalm:
goal = self.kalm.calc_next(goal)

deltax = np.array(float(goal) - self.px)
#print(delta2)
mag_delta = norm(deltax)#* 500.0
np.divide(deltax,mag_delta,deltax)

self.dx += deltax
#if self.dx:
#self.dx /= norm(self.dx) * 50

self.px += self.dx /50.0
self.py += -0.5
try:
self.rect.x = int(self.px)
except:
pass
try:
self.rect.y = int(self.py)
except:
pass

class Target():

def __init__(self, background, width):
self.background = background
self.rect = pg.Rect(self.background.get_width()//2-width//2,
50, width, 32)
self.dx = 1 if random() > 0.5 else -1

def move(self):
self.rect.x += self.dx

if self.rect.x < 300 or self.rect.x > self.background.get_width()-300:
self.dx *= -1

def noisy_x_pos(self):
pos = self.rect.x
center = self.rect.width//2
noise = np.random.normal(0,1,1)[0]

return pos + center + noise*300.0
#
# Here is the Kalman filter you are going to develop
#
class Kalman():
  
def __init__(self):
pass
  
def calc_next(self, zi):
pass

pg.init()

w,h = 1600,800

background = pg.display.set_mode((w,h))
surf = pg.surfarray.pixels3d(background)
running = True
clock = pg.time.Clock()

kalman_score = 0
reg_score = 0
iters = 0

while running:
target = Target(background, 32)
missile = Projectile(background)
#k_miss = Projectile(background,Kalman()) #comment on this line when Kalman is implemented
last_x_pos = target.noisy_x_pos
noisy_draw = np.zeros((w,20))

trial = True
iters += 1

while trial:

# Sets a maximum frame rate of 300. If you want to increase this, this is a possible change
clock.tick(300)
fps = clock.get_fps()
  
for e in pg.event.get():
if e.type == pg.QUIT:
running = False
  
background.fill(0x448844)
surf[:,0:20,0] = noisy_draw

last_x_pos = target.noisy_x_pos()
# print(last_x_pos)

target.move()
missile.move(last_x_pos)
#k_miss.move(last_x_pos) #comment in this line when Kalman is implemented
pg.draw.rect(background, (255, 200, 0), missile.rect)
#pg.draw.rect(background, (0, 200, 255), k_miss.rect) #comment in this line when Kalman is implemented
pg.draw.rect(background, (255, 200, 255), target.rect)

noisy_draw[int(last_x_pos):int(last_x_pos)+20,:] = 255
noisy_draw -= 1
np.clip(noisy_draw, 0, 255, noisy_draw)

coll = missile.rect.colliderect(target.rect)
#k_coll = k_miss.rect.colliderect(target.rect) #comment in this line when Kalman is implemented

if coll:
reg_score += 1

# if k_coll: #comment in this line when Kalman is implemented
# kalman_score += 1

oob = missile.rect.y < 20

if oob or coll: # or k_coll #change this check so that k_coll is also included when kalman is implemented
trial = False

pg.display.flip()

#print('kalman score: ', round(kalman_score/iters,2)) #comment in this line when Kalman is implemented
print('regular score: ', round(reg_score/iters,2))

pg.quit()


Related Solutions

This assessment task aims to develop your ability to apply the first three phases of the...
This assessment task aims to develop your ability to apply the first three phases of the clinical reasoning process, at an introductory level, to the patient scenario below. You are a student nurse working with a school nurse (registered nurse) in a secondary school. You and your mentor are supervising a bubble soccer match this afternoon (26th March) which commenced at 1400 hrs. The match goes for 40 minutes with a 5-minute break in between the two halves. It is...
This assessment task aims to develop your ability to apply the first three phases of the...
This assessment task aims to develop your ability to apply the first three phases of the clinical reasoning process, at an introductory level, to the patient scenario below. You are a student nurse working with a school nurse (registered nurse) in a secondary school. You and your mentor are supervising a bubble soccer match this afternoon (26th March) which commenced at 1400 hrs. The match goes for 40 minutes with a 5-minute break in between the two halves. It is...
Clinical Reasoning Report This assessment task aims to develop your ability to apply the first three...
Clinical Reasoning Report This assessment task aims to develop your ability to apply the first three phases of the clinical reasoning process, at an introductory level, to the patient scenario below. Patient Scenario - Jessie Lin You are a student nurse working with a school nurse (registered nurse) in a secondary school. You and your mentor are supervising a bubble soccer match this afternoon (26th March) which commenced at 1400 hrs. The match goes for 40 minutes with a 5...
This task is about classes and objects, and is solved in Python 3. We will look...
This task is about classes and objects, and is solved in Python 3. We will look at two different ways to represent a succession of monarchs, e.g. the series of Norwegian kings from Haakon VII to Harald V, and print it out like this: King Haakon VII of Norway, accession: 1905 King Olav V of Norway, accession: 1957 King Harald V of Norway, accession: 1991 >>> Make a class Monarch with three attributes: the name of the monarch, the nation...
convert this code to Python and make sure you use chained map and filter as well....
convert this code to Python and make sure you use chained map and filter as well. https://book.pythontips.com/en/latest/map_filter.html CODE BELOW IS IN JAVASCRIPT let people = [ {name: "Amy", pounds_weight: 152, inches_height: 63}, {name: "Joe", pounds_weight: 120, inches_height: 64}, {name: "Tom", pounds_weight: 210, inches_height: 78}, {name: "Jim", pounds_weight: 180, inches_height: 68}, {name: "Jen", pounds_weight: 120, inches_height: 62}, {name: "Ann", pounds_weight: 252, inches_height: 63}, {name: "Ben", pounds_weight: 240, inches_height: 72}, ]; //functions to convert pounds to kg and inches to meters let...
This task is solved in Python 3. Develop a function which counts the number of vowels...
This task is solved in Python 3. Develop a function which counts the number of vowels in a text. >>> numberofVowels ("There is a cat outside the house") 13
This task is solved in Python 3. Develop a program that can change the phone number...
This task is solved in Python 3. Develop a program that can change the phone number of a person in phone.txt (hint: the easiest thing is probably to make a new version of the file, and then delete the old one before the new is renamed to phone.txt) Name: John Old phone number: 99776612 New number: 99889999 >>> phone.txt Replaced by ------> phone.txt Mary 98654321 June 99776655 Chris 99112233 Viv 98554455 John 99776612 Joe 97888776 Rick 99455443 Susan 98122134 Jill...
This task is solved in Python 3. Develop a program that lets the user add new...
This task is solved in Python 3. Develop a program that lets the user add new people to the file phone.txt Add name and number, end with <enter> Name and number: Robin 94567402 Name and number: Jessica 99468283 Name and number: >>> Phone.txt Expanded to ------> Phone.txt Mary 98654321 June 99776655 Chris 99112233 Viv 98554455 John 99776612 Joe 97888776 Rick 99455443 Susan 98122134 Jill 99655732 Bob 98787896 Mary 98654321 June 99776655 Chris 99112233 Viv 98554455 John 99776612 Joe 97888776 Rick...
This task is solved in Python 3. Develop a program that can, among other things, manage...
This task is solved in Python 3. Develop a program that can, among other things, manage your courses and course results. It must also be able to calculate the average grade, for all grades or for a selection of grades limited to a certain subject area and / or course level (100, 200 or 300 level). NB! All courses are worth the same amount of credits. The program should have two global collections Courses is a list that contains the...
CODE IN PYTHON: Your task is to write a simple program that would allow a user...
CODE IN PYTHON: Your task is to write a simple program that would allow a user to compute the cost of a road trip with a car. User will enter the total distance to be traveled in miles along with the miles per gallon (MPG) information of the car he drives and the per gallon cost of gas. Using these 3 pieces of information you can compute the gas cost of the trip. User will also enter the number of...
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT