From 3f50d42d88af96e98c374a83f979bc6255cc30ab Mon Sep 17 00:00:00 2001 From: Roger Labbe Date: Mon, 1 Sep 2014 20:53:44 -0700 Subject: [PATCH] Added link to table of contents to all notebooks. this is so the user of nbviewer can navigate the book more easily. --- .../Appendix_Installation.ipynb | 9 +++++- .../Appendix_Symbols_and_Notations.ipynb | 9 +++++- Chapter01_gh_filter/g-h_filter.ipynb | 4 +-- Chapter02_Discrete_Bayes/discrete_bayes.ipynb | 9 +++++- .../Least_Squares_Filters.ipynb | 9 +++++- Chapter04_Gaussians/Gaussians.ipynb | 9 +++++- Chapter05_Kalman_Filters/Kalman_Filters.ipynb | 9 +++++- .../Multivariate_Kalman_Filters.ipynb | 11 +++++-- .../Kalman_Filter_Math.ipynb | 9 +++++- .../Designing_Kalman_Filters.ipynb | 9 +++++- .../Extended_Kalman_Filters.ipynb | 9 +++++- .../Unscented_Kalman_Filter.ipynb | 9 +++++- .../Designing_Nonlinear_Kalman_Filters.ipynb | 9 +++++- Introduction.ipynb | 7 +++++ Preface.ipynb | 9 +++++- merge_book.py | 10 ++++++ toc.ipynb => table_of_contents.ipynb | 31 ++++++++----------- 17 files changed, 137 insertions(+), 34 deletions(-) rename toc.ipynb => table_of_contents.ipynb (92%) diff --git a/Appendix_A_Installation/Appendix_Installation.ipynb b/Appendix_A_Installation/Appendix_Installation.ipynb index 98d28a3..fc237c5 100644 --- a/Appendix_A_Installation/Appendix_Installation.ipynb +++ b/Appendix_A_Installation/Appendix_Installation.ipynb @@ -1,13 +1,20 @@ { "metadata": { "name": "", - "signature": "sha256:3bb351943b52e55a96cd9d97199451f321cc663d0d6c7ad251edb04a4df0fbbf" + "signature": "sha256:55827a10b686f623979e4a64f44719e9065cb04b3c0e4a5632ea4d994dbb8aed" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "heading", "level": 1, diff --git a/Appendix_B_Symbols_and_Notations/Appendix_Symbols_and_Notations.ipynb b/Appendix_B_Symbols_and_Notations/Appendix_Symbols_and_Notations.ipynb index 48f150b..dad8602 100644 --- a/Appendix_B_Symbols_and_Notations/Appendix_Symbols_and_Notations.ipynb +++ b/Appendix_B_Symbols_and_Notations/Appendix_Symbols_and_Notations.ipynb @@ -1,13 +1,20 @@ { "metadata": { "name": "", - "signature": "sha256:34de03d319fbef2790012c38db97348abe5e8f429c2d05cedae3dcdec75dbd5d" + "signature": "sha256:e56fe47fdc8d23de599684e8784653238c5f3dc6bdd59bfc41832bc01a9f6f90" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "code", "collapsed": false, diff --git a/Chapter01_gh_filter/g-h_filter.ipynb b/Chapter01_gh_filter/g-h_filter.ipynb index 10759ff..0f33384 100644 --- a/Chapter01_gh_filter/g-h_filter.ipynb +++ b/Chapter01_gh_filter/g-h_filter.ipynb @@ -1,7 +1,7 @@ { "metadata": { "name": "", - "signature": "sha256:5dd49a578562b615cea09fa0be132dcb964561ab676c46d471e97a41e403c767" + "signature": "sha256:96191655e317ced2e9b030209ddff6944186146a849f8869975cc639a8e01087" }, "nbformat": 3, "nbformat_minor": 0, @@ -12,7 +12,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/toc.ipynb" + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" ] }, { diff --git a/Chapter02_Discrete_Bayes/discrete_bayes.ipynb b/Chapter02_Discrete_Bayes/discrete_bayes.ipynb index 3292cdc..1089f04 100644 --- a/Chapter02_Discrete_Bayes/discrete_bayes.ipynb +++ b/Chapter02_Discrete_Bayes/discrete_bayes.ipynb @@ -1,13 +1,20 @@ { "metadata": { "name": "", - "signature": "sha256:ec42c8b0a8ccc622dae96f082e4c4b70d7d60d9747230426c0f299c63e73f410" + "signature": "sha256:88299b8bf8496d8642bbdee38eb30e47846ebd319370af9c11d8e7f7da1a4542" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "heading", "level": 1, diff --git a/Chapter03_Least_Squares/Least_Squares_Filters.ipynb b/Chapter03_Least_Squares/Least_Squares_Filters.ipynb index 8161a4d..8f2661d 100644 --- a/Chapter03_Least_Squares/Least_Squares_Filters.ipynb +++ b/Chapter03_Least_Squares/Least_Squares_Filters.ipynb @@ -1,13 +1,20 @@ { "metadata": { "name": "", - "signature": "sha256:60b7dd24deaf8929b5cdf8bc775a6bcfea306255a2fe7ef7e7773a6019198647" + "signature": "sha256:840fa1da0403db057e32a7bd911c083ed1fbdff2920cf71fbe10cb3b31bb40f2" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "heading", "level": 1, diff --git a/Chapter04_Gaussians/Gaussians.ipynb b/Chapter04_Gaussians/Gaussians.ipynb index 2911ebe..be88f6b 100644 --- a/Chapter04_Gaussians/Gaussians.ipynb +++ b/Chapter04_Gaussians/Gaussians.ipynb @@ -1,13 +1,20 @@ { "metadata": { "name": "", - "signature": "sha256:03a16f585bb3f4a954520990ebb17e6cf9ceb7f9e247874263f66bfe4ac0da5a" + "signature": "sha256:c6d0174467636b2460a28523c35141b3937e125a51ec438d4a4184f4c898666b" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "heading", "level": 1, diff --git a/Chapter05_Kalman_Filters/Kalman_Filters.ipynb b/Chapter05_Kalman_Filters/Kalman_Filters.ipynb index aea386c..c4eb030 100644 --- a/Chapter05_Kalman_Filters/Kalman_Filters.ipynb +++ b/Chapter05_Kalman_Filters/Kalman_Filters.ipynb @@ -1,13 +1,20 @@ { "metadata": { "name": "", - "signature": "sha256:dea8b0a50eff26f334abc7863ef4ec47ce0257f7405dc287360ef650b1855279" + "signature": "sha256:abf8b08ac221d3eaaa0d08bfad431f9344a799b128a81efd6668244874bf1e11" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "heading", "level": 1, diff --git a/Chapter06_Multivariate_Kalman_Filter/Multivariate_Kalman_Filters.ipynb b/Chapter06_Multivariate_Kalman_Filter/Multivariate_Kalman_Filters.ipynb index c79e6cb..ec50b94 100644 --- a/Chapter06_Multivariate_Kalman_Filter/Multivariate_Kalman_Filters.ipynb +++ b/Chapter06_Multivariate_Kalman_Filter/Multivariate_Kalman_Filters.ipynb @@ -1,19 +1,26 @@ { "metadata": { "name": "", - "signature": "sha256:1cf32a918b0518a8dbaabb862de993dcbd8cd2de501bc94b1f4be396791bea47" + "signature": "sha256:7bf0115f6109356333dcf7a6f5bb4eab8d2f856c7c808df54a1ff879f9b6806f" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ - "Multidimensional Kalman Filters" + "Multivariate Kalman Filters" ] }, { diff --git a/Chapter07_Kalman_Filter_Math/Kalman_Filter_Math.ipynb b/Chapter07_Kalman_Filter_Math/Kalman_Filter_Math.ipynb index 5667a4b..72aff20 100644 --- a/Chapter07_Kalman_Filter_Math/Kalman_Filter_Math.ipynb +++ b/Chapter07_Kalman_Filter_Math/Kalman_Filter_Math.ipynb @@ -1,13 +1,20 @@ { "metadata": { "name": "", - "signature": "sha256:107480012317adfa7c7e4b7cb599197924e13638e3127ea101fc5684332f25b8" + "signature": "sha256:3c16c5f6f146457a27065808fb14f78b3d99d0930936d61dbfea6366dbb6c6a3" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "heading", "level": 1, diff --git a/Chapter08_Designing_Kalman_Filters/Designing_Kalman_Filters.ipynb b/Chapter08_Designing_Kalman_Filters/Designing_Kalman_Filters.ipynb index 231e745..da9eb4e 100644 --- a/Chapter08_Designing_Kalman_Filters/Designing_Kalman_Filters.ipynb +++ b/Chapter08_Designing_Kalman_Filters/Designing_Kalman_Filters.ipynb @@ -1,13 +1,20 @@ { "metadata": { "name": "", - "signature": "sha256:d37e9748673df0d583528e8e9ad936fea340b855a9618f62dedb4ee0dd131422" + "signature": "sha256:b8809b65792a3504dd59fd7fa5bc5b1df44c519aaed7f44824c301f62d934231" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "heading", "level": 1, diff --git a/Chapter09_Extended_Kalman_Filters/Extended_Kalman_Filters.ipynb b/Chapter09_Extended_Kalman_Filters/Extended_Kalman_Filters.ipynb index 4255d1a..723ab3d 100644 --- a/Chapter09_Extended_Kalman_Filters/Extended_Kalman_Filters.ipynb +++ b/Chapter09_Extended_Kalman_Filters/Extended_Kalman_Filters.ipynb @@ -1,13 +1,20 @@ { "metadata": { "name": "", - "signature": "sha256:c8a99ddb4d452ae2c13c166e9d8f4b0721d0486697b5aa9a2e8dcd38f1227357" + "signature": "sha256:13f1ac619b4757d46c582ecc4e301de7fa8c981e9df2d369824aeb3cb99714a8" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "heading", "level": 1, diff --git a/Chapter10_Unscented_Kalman_Filters/Unscented_Kalman_Filter.ipynb b/Chapter10_Unscented_Kalman_Filters/Unscented_Kalman_Filter.ipynb index 54339ed..464d6b1 100644 --- a/Chapter10_Unscented_Kalman_Filters/Unscented_Kalman_Filter.ipynb +++ b/Chapter10_Unscented_Kalman_Filters/Unscented_Kalman_Filter.ipynb @@ -1,13 +1,20 @@ { "metadata": { "name": "", - "signature": "sha256:5b8c10926d18dc83f6553700e669eb52f92d2566a745c9a47d73ec59589e45bb" + "signature": "sha256:ee2cc3ceadfd52b4488768339c53f95a124c3ea251b8b87d387a4eba90fb314a" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "heading", "level": 1, diff --git a/Chapter11_Designing_Nonlinear_Kalman_Filters/Designing_Nonlinear_Kalman_Filters.ipynb b/Chapter11_Designing_Nonlinear_Kalman_Filters/Designing_Nonlinear_Kalman_Filters.ipynb index 7d570ed..1a44723 100644 --- a/Chapter11_Designing_Nonlinear_Kalman_Filters/Designing_Nonlinear_Kalman_Filters.ipynb +++ b/Chapter11_Designing_Nonlinear_Kalman_Filters/Designing_Nonlinear_Kalman_Filters.ipynb @@ -1,13 +1,20 @@ { "metadata": { "name": "", - "signature": "sha256:32e7c8eabef27ef8d2921c97d1517b8e61b8095a0469741977c8a4099d9b129c" + "signature": "sha256:525f046eb6483efc3d5c6475fa1ad79e15ab2cfb0e2b0b4ad20be34aa61c5415" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "heading", "level": 1, diff --git a/Introduction.ipynb b/Introduction.ipynb index 5bda1b1..deb7124 100644 --- a/Introduction.ipynb +++ b/Introduction.ipynb @@ -8,6 +8,13 @@ "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git a/Preface.ipynb b/Preface.ipynb index 11551c4..3a842ff 100644 --- a/Preface.ipynb +++ b/Preface.ipynb @@ -8,6 +8,13 @@ "worksheets": [ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb" + ] + }, { "cell_type": "heading", "level": 1, @@ -320,7 +327,7 @@ "\n", "You may access this book via nbviewer at any by using this address:\n", "\n", - "http://nbviewer.ipython.org/github/rlabbe/Kalman-Filters-and-Random-Signals-in-Python/blob/master/Introduction.ipynb\n", + "http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/Preface.ipynb\n", "\n", "\n", "If you prefer a PDF, it is available [here](https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/Kalman_and_Bayesian_Filters_in_Python.pdf). I have to generate this PDF manually from the IPython Notebook, and I do not do that for every check in. During the book's development this PDF will often be somewhat out of date. I recommend the nbviewer version above if you can be online while reading.\n", diff --git a/merge_book.py b/merge_book.py index 9d22ea9..345bbca 100644 --- a/merge_book.py +++ b/merge_book.py @@ -13,6 +13,15 @@ def remove_formatting(nb): del c[i] return +def remove_links(nb): + w = nb['worksheets'] + node = w[0] + c = node['cells'] + for i in range (len(c)): + if 'source' in c[i].keys(): + if c[i]['source'][0:15] == 'http://nbviewer': + del c[i] + return def merge_notebooks(filenames): merged = None @@ -20,6 +29,7 @@ def merge_notebooks(filenames): with io.open(fname, 'r', encoding='utf-8') as f: nb = current.read(f, u'json') remove_formatting(nb) + remove_links(nb) if merged is None: merged = nb else: diff --git a/toc.ipynb b/table_of_contents.ipynb similarity index 92% rename from toc.ipynb rename to table_of_contents.ipynb index 7d07f3a..93b1e80 100644 --- a/toc.ipynb +++ b/table_of_contents.ipynb @@ -17,11 +17,6 @@ "

\n", "Table of Contents\n", "-----\n", - "[**Preface**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Preface.ipynb)\n", - "\n", - "Motivation for the book. Where to download, how to use.\n", - "\n", - "** add something about teaching methodology. exploration vs regurgitation.\n", "\n", "[**Introduction**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Introduction.ipynb)\n", " \n", @@ -29,58 +24,58 @@ "Yes, it is more or less the preface restated. will edit and delete one or the other.\n", "\n", "\n", - "[**Chapter 1: The g-h Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/g-h_filter.ipynb)\n", + "[**Chapter 1: The g-h Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Chapter01_gh_filter/g-h_filter.ipynb)\n", "\n", "Intuitive introduction to the g-h filter, which is a family of filters that includes the Kalman filter. Not filler - once you understand this chapter you will understand the concepts behind the Kalman filter. \n", "\n", "\n", - "[**Chapter 2: The Discrete Bayes Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/discrete_bayes.ipynb)\n", + "[**Chapter 2: The Discrete Bayes Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Chapter02_Discrete_Bayes/discrete_bayes.ipynb)\n", "\n", "Introduces the Discrete Bayes Filter. From this you will learn the probabilistic reasoning that underpins the Kalman filter in an easy to digest form.\n", "\n", "\n", - "[**Chapter 3: Least Squares Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Least_Squares_Filters.ipynb)\n", + "[**Chapter 3: Least Squares Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Chapter03_Least_Squares/Least_Squares_Filters.ipynb)\n", "\n", "Introduces the least squares filter in batch and recursive forms.\n", "\n", "\n", - "[**Chapter 4: Gaussian Probabilities**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Gaussians.ipynb)\n", + "[**Chapter 4: Gaussian Probabilities**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Chapter04_Gaussians/Gaussians.ipynb)\n", "\n", "Introduces using Gaussians to represent beliefs. Gaussians allow us to implement the algorithms used in the Discrete Bayes Filter to work in continuous domains.\n", "\n", "\n", - "[**Chapter 5: One Dimensional Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Kalman_Filters.ipynb)\n", + "[**Chapter 5: One Dimensional Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Chapter05_Kalman_Filters/Kalman_Filters.ipynb)\n", "\n", "Implements a Kalman filter by modifying the Discrete Bayesian Filter to use Gaussians. This is a full featured Kalman filter, albeit only useful for 1D problems. \n", "\n", "\n", - "[**Chapter 6: Multivariate Kalman Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Multivariate_Kalman_Filters.ipynb)\n", + "[**Chapter 6: Multivariate Kalman Filter**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Chapter06_Multivariate_Kalman_Filter/Multivariate_Kalman_Filters.ipynb)\n", "\n", "We extend the Kalman filter developed in the previous chapter to the full, generalized filter. \n", "\n", "\n", - "[**Chapter 7: Kalman Filter Math**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Kalman_Filter_Math.ipynb)\n", + "[**Chapter 7: Kalman Filter Math**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Chapter07_Kalman_Filter_Math/Kalman_Filter_Math.ipynb)\n", "\n", "We gotten about as far as we can without forming a strong mathematical foundation. This chapter is optional, especially the first time, but if you intend to write robust, numerically stable filters, or to read the literature, you will need to know this.\n", "\n", "\n", - "[**Chapter 8: Designing Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Designing_Kalman_Filters.ipynb)\n", + "[**Chapter 8: Designing Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Chapter08_Designing_Kalman_Filters/Designing_Kalman_Filters.ipynb)\n", "\n", "Building on material in Chapter 6, walks you through the design of several Kalman filters. Discusses, but does not solve issues like numerical stability.\n", "\n", "\n", - "[**Chapter 9: Extended Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Extended_Kalman_Filters.ipynb)\n", + "[**Chapter 9: Extended Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Chapter09_Extended_Kalman_Filters/Extended_Kalman_Filters.ipynb)\n", "\n", "Kalman filter as covered only work for linear problems. Extended Kalman filters (EKF) are the most common approach to linearizing non-linear problems.\n", "\n", "\n", - "[**Chapter 10: Unscented Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Unscented_Kalman_Filter.ipynb)\n", + "[**Chapter 10: Unscented Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Chapter10_Unscented_Kalman_Filters/Unscented_Kalman_Filter.ipynb)\n", "\n", "\n", "Unscented Kalman filters (UKF) are a recent development in Kalman filter theory. They allow you to filter nonlinear problems without requiring a closed form solution like the Extended Kalman filter requires.\n", "\n", "\n", - "[**Chapter 11: Designing Nonlinear Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Designing_Nonlinear_Kalman_Filters.ipynb)\n", + "[**Chapter 11: Designing Nonlinear Kalman Filters**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Chapter11_Designing_Nonlinear_Kalman_Filters/Designing_Nonlinear_Kalman_Filters.ipynb)\n", "\n", "\n", "[**Chapter 12: H-Infinity Filters**](not implemented)\n", @@ -109,13 +104,13 @@ "description\n", "\n", "\n", - "[**Appendix: Installation, Python, NumPy, and filterpy**](not implemented)\n", + "[**Appendix: Installation, Python, NumPy, and filterpy**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Appendix_A_Installation/Appendix_Installation.ipynb)\n", "\n", "Brief introduction of Python and how it is used in this book. Description of the companion\n", "library filterpy. \n", " \n", "\n", - "[**Appendix: Symbols and Notations**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Appendix_Symbols_and_Notations.ipynb)\n", + "[**Appendix: Symbols and Notations**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Appendix_B_Symbols_and_Notations/Appendix_Symbols_and_Notations.ipynb)\n", "\n", "Symbols and notations used in this book. Comparison with notations used in the literature.\n", "\n",