This shows you the differences between two versions of the page.
cs401r_w2016:lab8 [2016/02/26 15:45] admin |
cs401r_w2016:lab8 [2021/06/30 23:42] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====Objective:==== | ||
- | |||
- | To understand particle filters, and to gain experience with debugging likelihoods. | ||
- | |||
- | ---- | ||
- | ====Suggested pre-requisite:==== | ||
- | |||
- | You may wish to install the python ''pyqtgraph'' package. This can be installed via ''conda install pyqtgraph''. This is a plotting package that is significantly faster than ''matplotlib'' when scatter plotting many points (ie, particles). | ||
- | |||
- | ---- | ||
- | ====Deliverable:==== | ||
- | |||
- | ---- | ||
- | ====Grading standards:==== | ||
- | |||
- | |||
- | ---- | ||
- | ====Description:==== | ||
- | |||
- | For this lab, you will need the following files: | ||
- | |||
- | [[http://hatch.cs.byu.edu/courses/stat_ml/sensors.mat|sensors.mat]] contains the data you will use (you can also regenerate it directly, using the script below). | ||
- | |||
- | [[http://hatch.cs.byu.edu/courses/stat_ml/lab8_common.py|lab8_common.py]] contains utility functions that will enable you to create a simple map, and compute what a robot would see from a given position and angle. | ||
- | |||
- | [[http://hatch.cs.byu.edu/courses/stat_ml/lab8_gen_sonars.py|lab8_gen_sonars.py]] is the script that I used to generate the data for this lab. If you run it, it will generate a new dataset, but it will also produce a nice visualization of the robot as it moves around, along with what the sensors measure. | ||
- | |||
- | ---- | ||
- | ====Hints:==== | ||
- | |||
- | It can be frustrating to experiment with a particle filter when the interface is too slow. By using ''pyqtgraph'' instead of ''matplotlib'', you can speed things up considerably. | ||
- | |||
- | Here is some code to create a ''pyqtgraph'' window, and show the map. | ||
- | |||
- | <code python> | ||
- | from pyqtgraph.Qt import QtGui, QtCore | ||
- | import pyqtgraph as pg | ||
- | |||
- | app = QtGui.QApplication( [] ) | ||
- | win = pg.GraphicsWindow( title="Particle filter" ) | ||
- | win.resize( 600, 600 ) | ||
- | win.setWindowTitle( 'Particle filter' ) | ||
- | pg.setConfigOptions( antialias=True ) | ||
- | |||
- | p3 = win.addPlot( title="Room map" ) | ||
- | |||
- | for i in range( 0, room_map.shape[0] ): | ||
- | p3.plot( [room_map[i,0], room_map[i,2]], [room_map[i,1], room_map[i,3]] ) | ||
- | p3.setXRange( -0.1, 1.1 ) | ||
- | p3.setYRange( -0.1, 1.1 ) | ||
- | </code> | ||
- | |||
- | To speed things up further, you should use the ''.setData'' method on your plots. This replaces the data used for a particular plotting element, and is faster than deleting and recreating the plot element. This is particularly important when trying to update many particles. | ||
- | |||
- | Here's a snippet of my code. ''ts_plot'' and ''ex_plot'' are initialized to ''None''. My particles are stored in a 3xN matrix called ''parts'', my expected states are stored in a 3xt matrix called ''exs''. | ||
- | |||
- | <code python> | ||
- | if ts_plot == None: | ||
- | ts_plot = p3.plot( true_states[0,0:t+1], true_states[1,0:t+1], pen=(0,0,255) ) | ||
- | ex_plot = p3.plot( exs[0,0:t+1], exs[1,0:t+1], pen=(0,255,0) ) | ||
- | pts = p3.scatterPlot( parts[0,:], parts[1,:], symbol='o', size=1, pen=(255,100,100) ) | ||
- | |||
- | else: | ||
- | ts_plot.setData( true_states[0,0:t+1], true_states[1,0:t+1] ) | ||
- | ex_plot.setData( exs[0,0:t+1], exs[1,0:t+1] ) | ||
- | pts.setData( parts[0,:], parts[1,:] ) | ||
- | </code> | ||