758bd2c7f4
Most of the text is wrong, but changed code to use the renamed ScaledUnscentedKalmanFilter. Checking in with bad text because I am in the process of changing FilterPy to use a class for the sigma points to make it easier to change the sigma point generation, leaving us with one UKF class instead of several.
110 lines
2.9 KiB
Python
110 lines
2.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
from IPython.core.display import HTML
|
|
import matplotlib.pylab as pylab
|
|
import matplotlib.pyplot as plt
|
|
import json
|
|
import numpy as np
|
|
import sys
|
|
from contextlib import contextmanager
|
|
|
|
|
|
sys.path.insert(0,'./code') # allow us to import book_format
|
|
|
|
def test_filterpy_version():
|
|
import filterpy
|
|
min_version = [0,0,18]
|
|
v = filterpy.__version__
|
|
tokens = v.split('.')
|
|
for i,v in enumerate(tokens):
|
|
if int(v) > min_version[i]:
|
|
return
|
|
|
|
i = len(tokens) - 1
|
|
if min_version[i] > int(tokens[i]):
|
|
raise Exception("Minimum FilterPy version supported is {}.{}.{}.\n"
|
|
"Please install a more recent version.\n"
|
|
" ex: pip install filterpy --upgrade".format(
|
|
*min_version))
|
|
v = int(tokens[0]*1000)
|
|
|
|
|
|
# ensure that we have the correct filterpy loaded. This is
|
|
# called when this module is imported at the top of each book
|
|
# chapter so the reader can see that they need to update FilterPy.
|
|
test_filterpy_version()
|
|
|
|
|
|
def equal_axis():
|
|
pylab.rcParams['figure.figsize'] = 10,10
|
|
plt.axis('equal')
|
|
|
|
|
|
def reset_axis():
|
|
pylab.rcParams['figure.figsize'] = 11, 4
|
|
|
|
def set_figsize(x=11, y=4):
|
|
pylab.rcParams['figure.figsize'] = x, y
|
|
|
|
|
|
@contextmanager
|
|
def figsize(x=11, y=4):
|
|
"""Temporarily set the figure size using 'with figsize(a,b):'"""
|
|
|
|
size = pylab.rcParams['figure.figsize']
|
|
set_figsize(x, y)
|
|
yield
|
|
pylab.rcParams['figure.figsize'] = size
|
|
|
|
@contextmanager
|
|
def numpy_precision(precision):
|
|
old = np.get_printoptions()['precision']
|
|
np.set_printoptions(precision=precision)
|
|
yield
|
|
np.set_printoptions(old)
|
|
|
|
@contextmanager
|
|
def printoptions(*args, **kwargs):
|
|
original = np.get_printoptions()
|
|
np.set_printoptions(*args, **kwargs)
|
|
yield
|
|
np.set_printoptions(**original)
|
|
|
|
def _decode_list(data):
|
|
rv = []
|
|
for item in data:
|
|
if isinstance(item, unicode):
|
|
item = item.encode('utf-8')
|
|
elif isinstance(item, list):
|
|
item = _decode_list(item)
|
|
elif isinstance(item, dict):
|
|
item = _decode_dict(item)
|
|
rv.append(item)
|
|
return rv
|
|
|
|
def _decode_dict(data):
|
|
rv = {}
|
|
for key, value in data.iteritems():
|
|
if isinstance(key, unicode):
|
|
key = key.encode('utf-8')
|
|
if isinstance(value, unicode):
|
|
value = value.encode('utf-8')
|
|
elif isinstance(value, list):
|
|
value = _decode_list(value)
|
|
elif isinstance(value, dict):
|
|
value = _decode_dict(value)
|
|
rv[key] = value
|
|
return rv
|
|
|
|
|
|
def load_style(directory = '.', name='/styles/custom2.css'):
|
|
if sys.version_info[0] >= 3:
|
|
s = json.load(open(directory + "/code/538.json"))
|
|
else:
|
|
s = json.load(open(directory + "/code/538.json"), object_hook=_decode_dict)
|
|
plt.rcParams.update(s)
|
|
reset_axis ()
|
|
np.set_printoptions(suppress=True)
|
|
|
|
styles = open(directory + name, 'r').read()
|
|
return HTML(styles)
|