├── .github └── ISSUE_TEMPLATE │ ├── code-bug-report.md │ └── error-report.md ├── .gitignore ├── LICENSE ├── README.md ├── ch02_recursive_state_estimation ├── ch02_recursive_state_estimation.ipynb ├── ch02_recursive_state_estimation.py ├── 第二章-递归状态估计.ipynb ├── 第二章-递归状态估计.md └── 第二章-递归状态估计.pdf ├── ch03_gaussian_filters ├── ch03_guassian_filters.py ├── ex3_1.png ├── ex3_2.png ├── ex4_1.png ├── 第三章-高斯滤波.ipynb ├── 第三章-高斯滤波.md └── 第三章-高斯滤波.pdf ├── ch04_nonparametric_filters ├── ch04_nonparametric_filters.py ├── 第四章-非参数滤波.ipynb └── 第四章-非参数滤波.md ├── ch05_robot_motion ├── Ex5_4.png └── 第五章-机器人运动.ipynb ├── ch06_robot_perception └── 第六章-机器人感知.ipynb ├── ch07_mrl_markov_and_gaussian └── 第七章-移动机器人定位-马尔可夫与高斯.ipynb ├── environment.yml ├── pics └── README.MD └── 简介.ipynb /.github/ISSUE_TEMPLATE/code-bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Code Bug report 3 | about: Report bugs that related to code 4 | title: "[BUG]" 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/error-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Error report 3 | about: Report the solution error 4 | title: "[ERROR]" 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the error** 11 | A clear and concise description of what the error is. 12 | 13 | **Solution** 14 | The solution that you think is right 15 | 16 | **Additional context** 17 | Add any other context about the problem here. 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [2020] [Yu-Xiaoxian and other contributors] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [Probabilistic Robotics Exercises](https://github.com/Yu-Xiaoxian/probabilistic_robotics_exercises) 2 | # [《概率机器人》课后习题解答](https://github.com/Yu-Xiaoxian/probabilistic_robotics_exercises) 3 | 4 | [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/Yu-Xiaoxian/probabilistic_robotics_exercises/master) 5 | [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/Yu-Xiaoxian/probabilistic_robotics_exercises/blob/master/LICENSE) 6 | 7 | Detailed Solutions for exercises of book "Probabilistic Robotics" in both English & Chinese. Chinese Version will be finished first. 8 | 9 | ## 介绍 10 | 11 | 《概率机器人》课后习题解答,使用人工智能界比较流行的工具链「Python + Jupyter Notebook」,Python 实现作业的代码,Jupyter Notebook 增加文字描述并显示代码执行结果,做到图文并茂。 12 | 13 | 有三种方式可以看到渲染结果: 14 | 1. 查看[GitHub](https://github.com/Yu-Xiaoxian/probabilistic_robotics_exercises/blob/master/简介.ipynb)的渲染效果 15 | 2. 查看[nbviewer](https://nbviewer.org/github/Yu-Xiaoxian/probabilistic_robotics_exercises/blob/master/简介.ipynb)的渲染效果,比 GitHub 的更美观一些 16 | 3. 本地运行,具体步骤如下 17 | 18 | ## 本地运行 19 | 首先安装 Jupyter 20 | ```shell 21 | pip install notebook 22 | ``` 23 | 24 | ```shell 25 | git clone http://github.com/Yu-Xiaoxian/probabilistic_robotics_exercises.git 26 | cd probabilistic_robotics_exercises 27 | jupyter notebook 28 | ``` 29 | 30 | 启动后会在命令行显示以下信息 31 | 32 | ```shell 33 | [I 14:07:44.075 NotebookApp] Writing notebook server cookie secret to /run/user/1000/jupyter/notebook_cookie_secret 34 | [I 14:07:45.058 NotebookApp] Serving notebooks from local directory: ****/probabilistic_robotics_exercises 35 | [I 14:07:45.059 NotebookApp] 0 active kernels 36 | [I 14:07:45.059 NotebookApp] The Jupyter Notebook is running at: 37 | [I 14:07:45.060 NotebookApp] http://localhost:8888/ 38 | [I 14:07:45.060 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). 39 | ``` 40 | 41 | 访问 Jupyter Server http://localhost:8888 就可以看到了界面了 42 | 43 | ## 其他说明 44 | 45 | 解题过程中我参考了[pptacher](https://github.com/pptacher/probabilistic_robotics)的解答,作者[Pierre-Paul TACHER](https://github.com/pptacher)是法国的一名学者,他的解答严谨而简练,展现了法国人高水准的数学水平。为保证解答的准确性,我先自己求解,然后和pptacher 的答案进行对比,如果出现不一致再仔细检查推导过程。此外我在解答过程中会尽可能地偷懒,如使用在线工具求解矩阵特征向量,尽可能降低解答过程的繁琐程度。 46 | 47 | ## Reference 48 | 49 | [E-Book 课本电子版](https://github.com/Yvon-Shong/Probabilistic-Robotics) 50 | 51 | [Referenced Exercise 其他习题解答](https://github.com/pptacher/probabilistic_robotics) 52 | -------------------------------------------------------------------------------- /ch02_recursive_state_estimation/ch02_recursive_state_estimation.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Chapter 2 Recursive state estimation\n", 8 | "\n", 9 | "## Ex2.1 " 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": null, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "p = [0.01, 0.99]\n", 19 | "eta = 1" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 2, 25 | "metadata": {}, 26 | "outputs": [ 27 | { 28 | "name": "stdout", 29 | "output_type": "stream", 30 | "text": [ 31 | "(1, 0.029411764705882353, 0.9705882352941176, 2.941176470588235)\n", 32 | "(2, 0.08333333333333333, 0.9166666666666666, 2.833333333333333)\n", 33 | "(3, 0.2142857142857143, 0.7857142857142857, 2.5714285714285716)\n", 34 | "(4, 0.45000000000000007, 0.55, 2.1)\n", 35 | "(5, 0.7105263157894737, 0.2894736842105263, 1.5789473684210524)\n", 36 | "(6, 0.8804347826086958, 0.11956521739130438, 1.2391304347826089)\n", 37 | "(7, 0.9566929133858267, 0.043307086614173235, 1.0866141732283463)\n", 38 | "(8, 0.9851351351351351, 0.014864864864864866, 1.0297297297297296)\n", 39 | "(9, 0.9949954504094631, 0.0050045495905368526, 1.0100090991810737)\n", 40 | "(10, 0.9983262325015215, 0.0016737674984783934, 1.0033475349969567)\n" 41 | ] 42 | } 43 | ], 44 | "source": [ 45 | "for i in range(1 , 11):\n", 46 | " p = [p[0]*1, p[1]*1/3]\n", 47 | " eta = 1/(p[0] + p[1])\n", 48 | " p = [p[0]*eta, p[1]*eta]\n", 49 | " print(i, p[0], p[1], eta)" 50 | ] 51 | } 52 | ], 53 | "metadata": { 54 | "kernelspec": { 55 | "display_name": "Python 2", 56 | "language": "python", 57 | "name": "python2" 58 | }, 59 | "language_info": { 60 | "codemirror_mode": { 61 | "name": "ipython", 62 | "version": 2 63 | }, 64 | "file_extension": ".py", 65 | "mimetype": "text/x-python", 66 | "name": "python", 67 | "nbconvert_exporter": "python", 68 | "pygments_lexer": "ipython2", 69 | "version": "2.7.10" 70 | } 71 | }, 72 | "nbformat": 4, 73 | "nbformat_minor": 2 74 | } 75 | -------------------------------------------------------------------------------- /ch02_recursive_state_estimation/ch02_recursive_state_estimation.py: -------------------------------------------------------------------------------- 1 | # MIT License 2 | 3 | # Copyright (c) [2020] [Yu-Xiaoxian and other contributors] 4 | 5 | # Permission is hereby granted, free of charge, to any person obtaining a copy 6 | # of this software and associated documentation files (the "Software"), to deal 7 | # in the Software without restriction, including without limitation the rights 8 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | # copies of the Software, and to permit persons to whom the Software is 10 | # furnished to do so, subject to the following conditions: 11 | 12 | # The above copyright notice and this permission notice shall be included in all 13 | # copies or substantial portions of the Software. 14 | 15 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | # SOFTWARE. 22 | 23 | import numpy as np 24 | import random as rd 25 | 26 | print("Chapter 2: Recursive State Estimation") 27 | print("") 28 | print("#############") 29 | print("Exercise 2.1:") 30 | p = [0.01, 0.99] 31 | eta = 1 32 | 33 | for i in range(1 , 11): 34 | p = [p[0]*1, p[1]*1/3] 35 | eta = 1/(p[0] + p[1]) 36 | p = [p[0]*eta, p[1]*eta] 37 | print(i, p[0], p[1], eta) 38 | 39 | print("") 40 | print("#############") 41 | print("Exercise 2.2:") 42 | cnt_weath = [0,0,0] 43 | weath = ["sunny", "cloudy", "windy"] 44 | cnt = 0 45 | trans = [[0.8, 1.0, 1.0],[0.4, 0.8,1.0],[0.2,0.8,1.0]] 46 | 47 | yest = 0 48 | today = 0 49 | while cnt < 10000000: 50 | tran = trans[yest] 51 | p = rd.random() 52 | if p < tran[0]: 53 | today = 0 54 | elif p < tran[1]: 55 | today = 1 56 | else: 57 | today = 2 58 | # print(weath[today]) 59 | cnt_weath[today] = cnt_weath[today] + 1 60 | cnt = cnt+1 61 | yest = today 62 | 63 | print(float(cnt_weath[0])/cnt, float(cnt_weath[1])/cnt, float(cnt_weath[2])/cnt) 64 | 65 | print("") 66 | print("#############") 67 | print("Exercise 2.3: a)") 68 | trans = [[0.8, 0.4, 0.2],[0.2, 0.4, 0.6],[0.0,0.2,0.2]] 69 | obser = [[0.6, 0.3, 0.0],[0.4, 0.7, 0.0],[0.0,0.0,0.1]] 70 | 71 | bel = [1.0, 0, 0] 72 | z = [1, 1, 2, 0] 73 | 74 | for i in range(0,4): 75 | bar_bel = [bel[0]*trans[0][0] + bel[1]*trans[0][1] + bel[2]*trans[0][2], bel[0]*trans[1][0] + bel[1]*trans[1][1] + bel[2]*trans[1][2], bel[0]*trans[2][0] + bel[1]*trans[2][1] + bel[2]*trans[2][2]] 76 | bel = [obser[z[i]][0]*bar_bel[0], obser[z[i]][1]*bar_bel[1], obser[z[i]][2]*bar_bel[2]] 77 | eta = 1/(bel[0] + bel[1] + bel[2]) 78 | bel = [bel[0]*eta, bel[1]*eta, bel[2]*eta] 79 | print("Day ", i+2) 80 | # print(bar_bel) 81 | print(bel) 82 | print(eta) 83 | 84 | print("b)") 85 | bel = [1.0, 0, 0] 86 | z = [0, 0, 2] 87 | for i in range(0,3): 88 | bar_bel = [bel[0]*trans[0][0] + bel[1]*trans[0][1] + bel[2]*trans[0][2], bel[0]*trans[1][0] + bel[1]*trans[1][1] + bel[2]*trans[1][2], bel[0]*trans[2][0] + bel[1]*trans[2][1] + bel[2]*trans[2][2]] 89 | bel = [obser[z[i]][0]*bar_bel[0], obser[z[i]][1]*bar_bel[1], obser[z[i]][2]*bar_bel[2]] 90 | eta = 1/(bel[0] + bel[1] + bel[2]) 91 | bel = [bel[0]*eta, bel[1]*eta, bel[2]*eta] 92 | print("Day ", i+2) 93 | # print(bar_bel) 94 | print(bel) 95 | print(eta) 96 | -------------------------------------------------------------------------------- /ch02_recursive_state_estimation/第二章-递归状态估计.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第二章 递归状态估计\n", 8 | "\n", 9 | "## Ex2.1 \n", 10 | "这道题目与2.4.2 的例题很相似,练习离散贝叶斯滤波的使用。根据题意可知:\n", 11 | "$$\n", 12 | "\\begin{align}\n", 13 | "&bel(X_0=broken) &=0.01 \\\\\n", 14 | "&bel(X_0=not\\_broken) &= 0.99 \\\\\n", 15 | "&p(Z_t<1|X_t=broken) &= 1 \\\\\n", 16 | "&p(Z_t<1|X_t=not\\_broken) &= 1/3\n", 17 | "\\end{align}\n", 18 | "$$\n", 19 | "其中$Z_t$ 表示 t 时刻距离传感器的测量值,在 0 ~ 3m 范围内连续取值;$X_t$ 表示距离传感器的状态,取值为离散的 broken ,not_broken。系统初值可以在代码中表示如下" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 1, 25 | "metadata": {}, 26 | "outputs": [], 27 | "source": [ 28 | "p = [0.01, 0.99]\n", 29 | "eta = 1" 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "下面根据贝叶斯滤波算法进行计算,由于这道题中没有对距离传感器进行任何控制,因此贝叶斯滤波的第一步(预测)并不改变系统状态的置信度:\n", 37 | "\n", 38 | "$$\n", 39 | "\\begin{align}\n", 40 | "\\bar{bel}(X_t) = bel(X_{t-1})\n", 41 | "\\end{align}\n", 42 | "$$\n", 43 | "\n", 44 | "贝叶斯滤波的第二步(观测),题干中介绍到$Z_t < 1$,于是有以下递推式\n", 45 | "$$\n", 46 | "\\begin{align}\n", 47 | "&bel(X_t=broken) &= \\eta p(Z_t<1|X_t=broken)\\bar{bel}(X_t=broken) \\\\\n", 48 | "&bel(X_t=not\\_broken) &= \\eta p(Z_t<1|X_t=not\\_broken)\\bar{bel}(X_t=not\\_broken) \n", 49 | "\\end{align}\n", 50 | "$$\n", 51 | "\n", 52 | "其中 $\\eta$ 为归一化因子\n", 53 | "$$\n", 54 | "\\eta = [p(Z_t<1|X_t=broken)\\bar{bel}(X_t=broken) + \\\\ p(Z_t<1|X_t=not\\_broken)\\bar{bel}(X_t=not\\_broken)]^{-1}\n", 55 | "$$\n", 56 | "\n", 57 | "\n", 58 | "对以上5、6、7式代入先验初值1、2进行迭代,即可得到各个时刻距离传感器故障的概率如下" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": 2, 64 | "metadata": {}, 65 | "outputs": [ 66 | { 67 | "name": "stdout", 68 | "output_type": "stream", 69 | "text": [ 70 | "(1, 0.029411764705882353, 0.9705882352941176, 2.941176470588235)\n", 71 | "(2, 0.08333333333333333, 0.9166666666666666, 2.833333333333333)\n", 72 | "(3, 0.2142857142857143, 0.7857142857142857, 2.5714285714285716)\n", 73 | "(4, 0.45000000000000007, 0.55, 2.1)\n", 74 | "(5, 0.7105263157894737, 0.2894736842105263, 1.5789473684210524)\n", 75 | "(6, 0.8804347826086958, 0.11956521739130438, 1.2391304347826089)\n", 76 | "(7, 0.9566929133858267, 0.043307086614173235, 1.0866141732283463)\n", 77 | "(8, 0.9851351351351351, 0.014864864864864866, 1.0297297297297296)\n", 78 | "(9, 0.9949954504094631, 0.0050045495905368526, 1.0100090991810737)\n", 79 | "(10, 0.9983262325015215, 0.0016737674984783934, 1.0033475349969567)\n" 80 | ] 81 | } 82 | ], 83 | "source": [ 84 | "for i in range(1 , 11):\n", 85 | " p = [p[0]*1, p[1]*1/3]\n", 86 | " eta = 1/(p[0] + p[1])\n", 87 | " p = [p[0]*eta, p[1]*eta]\n", 88 | " print(i, p[0], p[1], eta)" 89 | ] 90 | }, 91 | { 92 | "cell_type": "markdown", 93 | "metadata": {}, 94 | "source": [ 95 | "最后推导公式:\n", 96 | "$$\n", 97 | "\\begin{align}\n", 98 | "\\begin{array}\n", 99 | "\\ bel(X_t=broken) &= {\\eta}_t\\times1\\times bel(X_{t-1}=broken) \\\\\n", 100 | "&= {\\eta}_t{\\eta}_{t-1}\\times1\\times bel(X_{t-2}=broken) \\\\\n", 101 | "&=\\prod_{i=0}^n {\\eta}_i bel(X_0=broken)\n", 102 | "\\end{array}\n", 103 | "\\\\\n", 104 | "\\begin{array}\n", 105 | "\\ bel(X_t=not\\_broken) &= {\\eta}_t\\times \\frac{1}{3} \\times bel(X_{t-1}=not\\_broken) \\\\\n", 106 | "&= {\\eta}_t{\\eta}_{t-1}\\times \\frac{1}{3} \\times bel(X_{t-2}=broken) \\\\\n", 107 | "&=\\prod_{i=0}^n {\\eta}_i \\times \\frac{1}{3^n} \\times bel(X_0=not\\_broken)\n", 108 | "\\end{array}\n", 109 | "\\end{align}\n", 110 | "$$\n", 111 | "其中 $\\prod_{i=0}^n {\\eta}_i$ 满足归一化要求,即\n", 112 | "$$\n", 113 | "\\prod_{i=0}^n {\\eta}_i = [bel(X_0=broken) + \\frac{1}{3^n} \\times bel(X_0=not\\_broken)]^{-1}\n", 114 | "$$\n", 115 | "因此,传感器失效的概率为\n", 116 | "$$\n", 117 | "bel(X_t=broken) = \\frac{bel(X_0=broken)}{bel(X_0=broken) + \\frac{1}{3^n} \\times bel(X_0=not\\_broken)}\n", 118 | "$$" 119 | ] 120 | }, 121 | { 122 | "cell_type": "markdown", 123 | "metadata": {}, 124 | "source": [ 125 | "## 2. 已知天气状态转移矩阵\n", 126 | "\n", 127 | "| 标题 | 晴(明天) | 多云 | 雨 |\n", 128 | "| ------------ | ---------- | ---- | ---- |\n", 129 | "| 晴(今天) | 0.8 | 0.2 | 0 |\n", 130 | "| 多云(今天) | 0.4 | 0.4 | 0.2 |\n", 131 | "| 雨(今天) | 0.2 | 0.6 | 0.2 |\n", 132 | "\n", 133 | "### a) 第一天是晴天,求接下来三天是多云、多云、雨的概率\n", 134 | "\n", 135 | "可以通过贝叶斯公式得到\n", 136 | "$$\n", 137 | "\\begin{align}\n", 138 | "\\begin{array}\n", 139 | "P(X_4=rainy) &= P(X_4=rainy|X_3=cloudy)P(X_3=cloudy) \\\\\n", 140 | "&= P(X_4=rainy|X_3=cloudy)P(X_3=cloudy|X_2=cloudy)\\\\\n", 141 | "& P(X_2=cloudy|X_1=sunny)P(X_1=sunny) \\\\\n", 142 | "&= 0.2 \\times 0.4 \\times 0.2 \\\\\n", 143 | "&= 0.016\n", 144 | "\\end{array}\n", 145 | "\\end{align}\n", 146 | "$$\n", 147 | "\n", 148 | "### b)编程随机产生天气序列的仿真器" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": 3, 154 | "metadata": {}, 155 | "outputs": [ 156 | { 157 | "name": "stdout", 158 | "output_type": "stream", 159 | "text": [ 160 | "(0.6427326, 0.2858765, 0.0713909)\n" 161 | ] 162 | } 163 | ], 164 | "source": [ 165 | "import random as rd\n", 166 | "\n", 167 | "cnt_weath = [0,0,0]\n", 168 | "weath = [\"sunny\", \"cloudy\", \"windy\"]\n", 169 | "cnt = 0\n", 170 | "trans = [[0.8, 1.0, 1.0],[0.4, 0.8,1.0],[0.2,0.8,1.0]]\n", 171 | "\n", 172 | "yest = 0\n", 173 | "today = 0\n", 174 | "while cnt < 10000000:\n", 175 | "\ttran = trans[yest]\n", 176 | "\tp = rd.random()\n", 177 | "\tif p < tran[0]:\n", 178 | "\t\ttoday = 0\n", 179 | "\telif p < tran[1]:\n", 180 | "\t\ttoday = 1\n", 181 | "\telse:\n", 182 | "\t\ttoday = 2\n", 183 | "\t# print(weath[today])\n", 184 | "\tcnt_weath[today] = cnt_weath[today] + 1\n", 185 | "\tcnt = cnt+1\n", 186 | "\tyest = today\n", 187 | "\n", 188 | "print(float(cnt_weath[0])/cnt, float(cnt_weath[1])/cnt, float(cnt_weath[2])/cnt)" 189 | ] 190 | }, 191 | { 192 | "cell_type": "markdown", 193 | "metadata": {}, 194 | "source": [ 195 | "### c)计算平稳分布\n", 196 | "\n", 197 | "首先需要知道平稳分布的定义,根据[维基百科]()的介绍,平稳分布是指不随时间变化的状态分布,即\n", 198 | "$$\n", 199 | "\\lim\\limits_{n \\to \\infty} {X_n}=\\lim\\limits_{n \\to \\infty}{A^nX_0}\n", 200 | "$$\n", 201 | "使用b) 中设计的随机天气序列仿真器,在天气序列足够长时,天气出现的频率就是平稳分布的概率,计算得到\n", 202 | "$$\n", 203 | "P_{static}=[0.6430726, 0.2855164, 0.071411]^T\n", 204 | "$$\n", 205 | "### d)通过公式计算平稳分布\n", 206 | "\n", 207 | "根据平稳分布的定义,我们需要求的其实是状态转移矩阵的特征值1对应的特征向量\n", 208 | "$$\n", 209 | "Ax=x\n", 210 | "$$\n", 211 | "这里我们采用偷懒的方法,使用[矩阵特征向量在线计算工具](),计算得到特征向量为\n", 212 | "$$\n", 213 | "[9, 4, 1]^T\n", 214 | "$$\n", 215 | "对该向量进行概率归一化得到\n", 216 | "$$\n", 217 | "P_{static}=[9/14, 2/7, 1/14]^T\n", 218 | "$$\n", 219 | "\n", 220 | "### f) 计算给定今天天气时,昨天天气的概率表\n", 221 | "\n", 222 | "需要计算以下条件概率\n", 223 | "$$\n", 224 | "P(X_{t-1}=i|X_t=j)=\\frac{P(X_{t}=j|X_{t-1}=i)P(X_{t-1}=i)}{P(X_{t}=j)} \\\\\n", 225 | "P(X_{t}=j)=\\sum_{i}^3 P(X_{t}=j|X_{t-1}=i)P(X_{t-1}=i)\n", 226 | "$$\n", 227 | "其中$$P(X_{t-1}=i)$$作为先验概率,由平稳分布给出,从而计算得出概率表\n", 228 | "\n", 229 | "| 标题 | 晴(今天) | 多云 | 雨 |\n", 230 | "| ---------- | ---------- | ---- | ---- |\n", 231 | "| 晴(昨天) | 0.8 | 0.45 | 0 |\n", 232 | "| 多云 | $$8/45$$ | 0.4 | 0.8 |\n", 233 | "| 雨 | $$1/45$$ | 0.15 | 0.2 |\n", 234 | "\n", 235 | "\n", 236 | "\n", 237 | "### g) 如果天气状态转移概率与季节相关,这个过程还满足马尔科夫特性吗\n", 238 | "\n", 239 | "不满足。马尔科夫特性要求,当前时刻的系统状态只与上一时刻的系统状态有关,与其他变量无关。如果引入季节这一变量,就会破坏马尔科夫特性。但是在一个季节内,状态转移矩阵不发生变化,该过程依然保持马尔科夫特性。" 240 | ] 241 | }, 242 | { 243 | "cell_type": "markdown", 244 | "metadata": {}, 245 | "source": [ 246 | "## 3. 若有传感器观测矩阵\n", 247 | "\n", 248 | "| 标题 | 晴(实际) | 多云(实际) | 雨(实际) |\n", 249 | "| ------------ | ---------- | ------------ | ---------- |\n", 250 | "| 晴(观测) | 0.6 | 0.3 | 0 |\n", 251 | "| 多云(观测) | 0.4 | 0.7 | 0 |\n", 252 | "| 雨(观测) | 0 | 0 | 1 |\n", 253 | "\n", 254 | "### a) 已知第一天是晴天,2~5天观测到为多云,多云,雨,晴,求第五天是晴天的概率\n", 255 | "\n", 256 | "由第二题可知状态转移矩阵为\n", 257 | "$$\n", 258 | "A=\\begin{bmatrix}\n", 259 | "0.8 &0.4 &0.2 \\\\\n", 260 | "0.2 &0.4 &0.6 \\\\\n", 261 | "0 &0.2 &0.2\n", 262 | "\\end{bmatrix}\n", 263 | "$$\n", 264 | "由本题题干可知观测矩阵为\n", 265 | "$$\n", 266 | "C=\\begin{bmatrix}\n", 267 | "0.6 &0.3 &0 \\\\\n", 268 | "0.4 &0.7 &0 \\\\\n", 269 | "0 &0 &1\n", 270 | "\\end{bmatrix}\n", 271 | "$$\n", 272 | "根据贝叶斯准则\n", 273 | "$$\n", 274 | "\\begin{align}\n", 275 | "\\bar{bel}(x_t|x_{t-1})&=A\\cdot bel(x_{t-1}) \\\\\n", 276 | "bel(X_t=i|Z_t=j)&=\\eta P(Z_t=j|X_t=i)P(X_t=i) \\\\\n", 277 | "\\eta &= (\\sum_{i=1}^n{P(Z_t=j|X_t=i)P(X_t=i)})^{-1}\n", 278 | "\\end{align}\n", 279 | "$$\n", 280 | "初值和观测序列\n", 281 | "$$\n", 282 | "bel(x_1)=\\begin{bmatrix}1 &0 &0 \\end{bmatrix}^T \\\\\n", 283 | "z_2=cloudy, z_3=cloudy, z_4=rainy, z_5=sunny\n", 284 | "$$\n", 285 | "迭代计算可得\n", 286 | "\n", 287 | "| 标题 | $z_t$ | $$\\bar{bel}(x_t)$$ | $bel(x_t)$ | $$\\eta$$ |\n", 288 | "| ---- | ------ | ------------------------------------------- | ------------------------------------------- | ------------ |\n", 289 | "| 1 | sunny | $$\\begin{bmatrix}1 &0 &0 \\end{bmatrix}^T$$ | $$\\begin{bmatrix}1 &0 &0 \\end{bmatrix}^T$$ | 1 |\n", 290 | "| 2 | cloudy | $$\\begin{bmatrix}0.8 &0.2 &0 \\end{bmatrix}^T$$ | $$\\begin{bmatrix}16/23 &7/23 &0 \\end{bmatrix}^T$$ | $$50/23$$ |\n", 291 | "| 3 | cloudy | $$\\begin{bmatrix}78/115 &30/115 &7/115 \\end{bmatrix}^T$$ | $$\\begin{bmatrix}312/522 &210/522 &0 \\end{bmatrix}^T$$ | $$1150/522$$ |\n", 292 | "| 4 | rainy | $$\\begin{bmatrix}0.6390 &0.2805 &0.0805 \\end{bmatrix}^T$$ | $$\\begin{bmatrix}0 &0 &1 \\end{bmatrix}^T$$ | 124.2857 |\n", 293 | "| 5 | sunny | $$\\begin{bmatrix}0.2 &0.6 &0.2 \\end{bmatrix}^T$$ | $$\\begin{bmatrix}0.4 &0.6 &0.0 \\end{bmatrix}^T$$ | 3.3333 |\n", 294 | "\n", 295 | "由上面结果可得,第五天是晴天的概率为0.4\n", 296 | "\n", 297 | "### b) 当2~4天的观测序列为晴,晴,雨时,用两种方式讨论最有可能的天气序列:1)考虑当天以及之前的观测结果;2)统一考虑所有天气\n", 298 | "\n", 299 | "根据a)中的方法,当观测序列为晴、晴、雨时,最有可能的天气序列为\n", 300 | "\n", 301 | "| 日期 | 天气 | 概率 |\n", 302 | "| ---- | ---- | ------ |\n", 303 | "| 1 | 晴 | 1.0 |\n", 304 | "| 2 | 晴 | 0.8889 |\n", 305 | "| 3 | 晴 | 0.8718 |\n", 306 | "| 4 | 雨 | 1.0 |\n", 307 | "\n", 308 | "统一考虑所有天气时\n", 309 | "$$\n", 310 | "\\begin{align}\n", 311 | "\\begin{array}\n", 312 | "/P(X_2=i|z_{2:4})&=\\eta P(Z_2=sunny|X_2=i,z_{3:4})P(X_2=i|z_{3:4}) \\\\\n", 313 | "&=\\eta P(Z_2=sunny|X_2=i)P(X_2=i|z_{3:4}) \\\\\n", 314 | "&=\\eta P(Z_2=sunny|X_2=i)P(Z_3=sunny|X_2=i,z_4)P(X_2=i|z_4) \\\\\n", 315 | "&=\\eta P(Z_2=sunny|X_2=i)P(Z_3=sunny|X_2=i) \\\\\n", 316 | "&\\times P(Z_4=rainy|X_2=i)P(X_2=i|z_2)\n", 317 | "\\end{array}\n", 318 | "\\end{align}\n", 319 | "$$\n", 320 | "其中\n", 321 | "$$\n", 322 | "\\begin{align}\n", 323 | "\\begin{array}\n", 324 | "/P(Z_3=sunny|X_2=i)&=\\sum_{j=1}^n{P(Z_3=sunny|X_3=j,X_2=i)P(X_3=j|X_2=i)} \\\\\n", 325 | "&=(CA)_{1,i}\n", 326 | "\\end{array}\n", 327 | "\\\\\n", 328 | "\\begin{array}\n", 329 | "/P(Z_4=rainy|X_2=i)&=\\sum_{j=1}^n{P(Z_4=rainy|X_4=j,X_2=i)P(X_4=j|X_2=i)} \\\\\n", 330 | "&=\\sum_{j=1}^n{P(Z_4=rainy|X_4=j)\\sum_{k=1}^nP(X_4=j|X_3=k)P(X_3=k|X_2=i)} \\\\\n", 331 | "&=(CAA)_{3,i}\n", 332 | "\\end{array}\n", 333 | "\\end{align}\n", 334 | "$$\n", 335 | "同理可得第3天和第4天的概率\n", 336 | "$$\n", 337 | "\\begin{align}\n", 338 | "\\begin{array}\n", 339 | "/P(X_3=i|z_{2:4})&=P(Z_4=rainy|X_3=i)P(X_3=i|z_{2:3}) \\\\\n", 340 | "&=(CA)_{3,i}P(X_3=i|z_{2:3}) \\\\\n", 341 | "\\end{array}\n", 342 | "\\end{align}\n", 343 | "$$\n", 344 | "其中$$P(X_3=i|z_{2:3})$$和$$P(X_4=i|z_{2:4})$$已经在前一小问中求得,汇总得到2~4天的天气概率\n", 345 | "\n", 346 | "| 日期 | 天气 | 概率 |\n", 347 | "| ---- | ---- | ---- |\n", 348 | "| 1 | 晴 | 1 |\n", 349 | "| 2 | 晴 | 0.8 |\n", 350 | "| 3 | 多云 | 1 |\n", 351 | "| 4 | 雨 | 1 |\n", 352 | "\n", 353 | "\n", 354 | "\n", 355 | "### c) 若第2~4天的天气测量分别为晴,晴,雨,那么最有可能的天气序列是什么,该天气序列的概率是多少\n", 356 | "\n", 357 | "根据b)的解答,最可能的天气序列为晴、多云、雨,该序列概率为每天概率的乘积,为0.8.\n", 358 | "\n", 359 | "我们会发现,综合考虑全序列的传感器数据,和只考虑当天的观测数据,得到的天气序列的预测是不同的。根据状态转移矩阵,不存在由晴天变成雨天的转换,而第三天为雨天的概率为1,所以虽然第三天传感器检测为晴天,但综合考虑第四天的概率后,第三天的天气应为雨天。这道题使用简单的对比,向我们形象地说明:如果采用全时间序列的观测信息,能够得到更加准确的后验概率估计。" 360 | ] 361 | }, 362 | { 363 | "cell_type": "markdown", 364 | "metadata": {}, 365 | "source": [ 366 | "## 4. 考虑一维高斯分布,初始位置$x_{init}=1000m$,方差$\\sigma_{init}^2=900m^2$,观测位置$x_{GPS}=1100m$,方差$\\sigma_{GPS}^2=100m^2$\n", 367 | "\n", 368 | "### a) 写出先验$p(x)$和观测$p(z|x)$的概率密度函数\n", 369 | "\n", 370 | "根据高斯分布公式可得\n", 371 | "$$\n", 372 | "p(x)={1}/{\\sqrt{2\\pi\\sigma_{init}^2}}\\cdot e^{-\\frac{(x-x_{init})^2}{2\\sigma_{init}^2}} \\\\\n", 373 | "\n", 374 | "p(z|x)={1}/{\\sqrt{2\\pi\\sigma_{GPS}^2}}\\cdot e^{-\\frac{(z-x)^2}{2\\sigma_{GPS}^2}}\n", 375 | "$$\n", 376 | "\n", 377 | "### b) 使用贝叶斯准则,后验概率$p(x|z)$是多少,能证明该分布是高斯吗\n", 378 | "\n", 379 | "根据贝叶斯准则\n", 380 | "$$\n", 381 | "p(x|z)=\\frac{p(z|x)p(x)}{p(z)}\n", 382 | "$$\n", 383 | "其中\n", 384 | "$$\n", 385 | "\\begin{align}\n", 386 | "\\begin{array}\n", 387 | "/p(z)&=\\int_{-\\infty}^{+\\infty} p(z|x)p(x)dx \\\\\n", 388 | "&=\\int_{-\\infty}^{+\\infty}{1}/{\\sqrt{2\\pi\\sigma_{init}^2}}\\cdot e^{-\\frac{(x-x_{init})^2}{2\\sigma_{init}^2}} \\cdot {1}/{\\sqrt{2\\pi\\sigma_{GPS}^2}}\\cdot e^{-\\frac{(z-x)^2}{2\\sigma_{GPS}^2}}dx \\\\\n", 389 | "&=\\int_{-\\infty}^{+\\infty}\\frac{1}{2\\pi \\sigma_{init}\\sigma_{GPS}}\\cdot e^{-\\frac{(x-x_{init})^2}{2\\sigma_{init}^2}-\\frac{(z-x)^2}{2\\sigma_{GPS}^2}}dx\n", 390 | "\\end{array}\n", 391 | "\\end{align}\n", 392 | "$$\n", 393 | "对指数二项式进行分析\n", 394 | "$$\n", 395 | "\\begin{align}\n", 396 | "\\begin{array}\n", 397 | "\\frac{(x-x_{init})^2}{2\\sigma_{init}^2}+\\frac{(z-x)^2}{2\\sigma_{GPS}^2}\n", 398 | "=&\\frac{x^2-2xx_{init}+x_{init}^2}{18\\sigma_{GPS}^2}+\\frac{z^2 -2xz +x^2}{2\\sigma_{GPS}^2} \\\\\n", 399 | "=&\\frac{10(x^2-2x(\\frac{x_{init}+9z}{10})+(\\frac{x_init+9z}{10})^2)}{18\\sigma_{GPS}^2}+\\frac{9z^2+x_{init}^2-\\frac{(x_init+9z)^2}{10}}{18\\sigma_{GPS}^2}\n", 400 | "\\end{array}\n", 401 | "\\end{align}\n", 402 | "$$\n", 403 | "第一项是x的函数,可以写成正态分布的形式,第二项与x无关,可从积分式内提取出来,计算得到\n", 404 | "$$\n", 405 | "p(z)=\\frac{1}{2\\pi \\sigma_{init}\\sigma_{GPS}}\\cdot e^{-\\frac{9z^2+x_{init}^2-\\frac{(x_{init}+9z)^2}{10}}{18\\sigma_{GPS}^2}} \\cdot \\sqrt{2\\pi}\\sqrt{9/10}\\sigma_{GPS} \\\\\n", 406 | "=\\frac{1}{\\sqrt{2\\pi} \\sqrt{10}\\sigma_{GPS}}\\cdot e^{-\\frac{9z^2+x_{init}^2-\\frac{(x_{init}+9z)^2}{10}}{18\\sigma_{GPS}^2}}\n", 407 | "$$\n", 408 | "那么后验的分布为\n", 409 | "$$\n", 410 | "p(z|x)=\\frac{\\frac{1}{2\\pi \\sigma_{init}\\sigma_{GPS}}\\cdot e^{-\\frac{10(x^2-2x(\\frac{x_{init}+9z}{10})+(\\frac{x_init+9z}{10})^2)}{18\\sigma_{GPS}^2}-\\frac{9z^2+x_{init}^2-\\frac{(x_init+9z)^2}{10}}{18\\sigma_{GPS}^2}}}{\\frac{1}{\\sqrt{2\\pi} \\sqrt{10}\\sigma_{GPS}}\\cdot e^{-\\frac{9z^2+x_{init}^2-\\frac{(x_{init}+9z)^2}{10}}{18\\sigma_{GPS}^2}}} \\\\\n", 411 | "=\\frac{1}{\\sqrt{2\\pi}\\sqrt{9/10} \\sigma_{GPS}}e^{-\\frac{(x-\\frac{9z+x_{init}}{10})^2}{2\\times9/10\\sigma_{GPS}^2}}\n", 412 | "$$\n", 413 | "是满足正态分布$$p(x|z)\\sim N(\\frac{9z+x_{init}}{10}, 9/10\\sigma_{GPS}^2)$$\n", 414 | "\n", 415 | "\n", 416 | "\n", 417 | "### c) 测量$x_{GPS}=1100m$怎样得出先验和GPS接收器的误差概率信息\n", 418 | "\n", 419 | "不是很理解这道题目需要求什么,这里大胆猜测一下,是对GPS接收器进行误差分析,问的是怎样获取GPS接收器的值和方差,GPS的先验数据经过滤波得到,误差信息通过对时间统计得到。" 420 | ] 421 | }, 422 | { 423 | "cell_type": "markdown", 424 | "metadata": {}, 425 | "source": [ 426 | "## 5. 由式(2.17)推导(2.18)和(2.19),以及本书叙述的概率准则\n", 427 | "\n", 428 | "根据式(2.17)$$p(x,y|z)=p(x|z)p(y|z)$$可得\n", 429 | "$$\n", 430 | "\\begin{align}\n", 431 | "p(x|z)&=\\frac{p(x,y|z)}{p(y|z)}=\\frac{p(x|z)p(y|z)}{p(y|z)}=p(x|y,z) \\\\\n", 432 | "p(y|z)&=\\frac{p(x,y|z)}{p(x|z)}=p(y|x,z)\n", 433 | "\\end{align}\n", 434 | "$$\n", 435 | "根据一阶马尔科夫假设,当前观测只与系统当前状态$$x_t$$相关,与其他变量相互独立,于是可以得到\n", 436 | "$$\n", 437 | "p(z_i|x_{0:t}, z_{1:t-1},u_{1:t-1})=p(z_i|x_t)\n", 438 | "$$" 439 | ] 440 | }, 441 | { 442 | "cell_type": "markdown", 443 | "metadata": {}, 444 | "source": [ 445 | "## 6. 证明式(2.25),这个等式的意义是什么\n", 446 | "\n", 447 | "根据期望的性质\n", 448 | "$$\n", 449 | "\\begin{align}\n", 450 | "\\begin{array}\n", 451 | "/Cov[X]&=E[X-E[X]]^2\\\\\n", 452 | "&=E[X^2-2X\\cdot E[X]+(E[X])^2]\\\\\n", 453 | "&=E[X^2]-2E[X]E[X]+(E[X])^2\\\\\n", 454 | "&=E[X^2]-(E[X])^2\n", 455 | "\\end{array}\n", 456 | "\\end{align}\n", 457 | "$$\n", 458 | "这说明方差是协方差的特殊形式,对于多元分布而言,协方差是一个方阵。" 459 | ] 460 | }, 461 | { 462 | "cell_type": "markdown", 463 | "metadata": {}, 464 | "source": [ 465 | "# 小结\n", 466 | "\n", 467 | "- 1,2,3题都是在使用贝叶斯准则解决离散问题,其中第三题给了另外一种不同的应用方法,不仅仅是按照时序计算的贝叶斯滤波,还可以应用在解决全概率问题\n", 468 | "- 4题解决的是一维连续问题,推导了高斯分布下的贝叶斯准则(即卡尔曼滤波),证明了后验概率也是高斯分布,更深入地理解了卡尔曼滤波\n", 469 | "- 5题帮助更好的理解一阶马尔科夫假设下的贝叶斯准则" 470 | ] 471 | }, 472 | { 473 | "cell_type": "code", 474 | "execution_count": null, 475 | "metadata": {}, 476 | "outputs": [], 477 | "source": [] 478 | } 479 | ], 480 | "metadata": { 481 | "kernelspec": { 482 | "display_name": "Python 2", 483 | "language": "python", 484 | "name": "python2" 485 | }, 486 | "language_info": { 487 | "codemirror_mode": { 488 | "name": "ipython", 489 | "version": 2 490 | }, 491 | "file_extension": ".py", 492 | "mimetype": "text/x-python", 493 | "name": "python", 494 | "nbconvert_exporter": "python", 495 | "pygments_lexer": "ipython2", 496 | "version": "2.7.10" 497 | } 498 | }, 499 | "nbformat": 4, 500 | "nbformat_minor": 2 501 | } 502 | -------------------------------------------------------------------------------- /ch02_recursive_state_estimation/第二章-递归状态估计.md: -------------------------------------------------------------------------------- 1 | # 第二章 递归状态估计 2 | 3 | 于小咸 4 | 5 | ## 1. 6 | 7 | 这道题目与2.4.2 的例题很相似,练习离散贝叶斯滤波的使用。根据题意可知: 8 | $$ 9 | \begin{align} 10 | &bel(X_0=broken) &=0.01 \\ 11 | &bel(X_0=not\_broken) &= 0.99 \\ 12 | &p(Z_t<1|X_t=broken) &= 1 \\ 13 | &p(Z_t<1|X_t=not\_broken) &= 1/3 14 | \end{align} 15 | $$ 16 | 其中 $$Z_t$$ 表示 $$t$$ 时刻距离传感器的测量值,在 $0$ ~ $3m$ 范围内连续取值;$$X_t$$ 表示距离传感器的状态,取值为离散的 $$broken$$ ,$$not\_broken$$。 17 | 18 | 下面根据贝叶斯滤波算法进行计算,由于这道题中没有对距离传感器进行任何控制,因此贝叶斯滤波的第一步(预测)并不改变系统状态的置信度: 19 | 20 | $$ 21 | \begin{align} 22 | \bar{bel}(X_t) = bel(X_{t-1}) 23 | \end{align} 24 | $$ 25 | 26 | 贝叶斯滤波的第二步(观测),题干中介绍到$Z_t < 1$,于是有以下递推式 27 | $$ 28 | \begin{align} 29 | &bel(X_t=broken) &= \eta p(Z_t<1|X_t=broken)\bar{bel}(X_t=broken) \\ 30 | &bel(X_t=not\_broken) &= \eta p(Z_t<1|X_t=not\_broken)\bar{bel}(X_t=not\_broken) 31 | \end{align} 32 | $$ 33 | 34 | 其中 $\eta$ 为归一化因子 35 | $$ 36 | \eta = [p(Z_t<1|X_t=broken)\bar{bel}(X_t=broken) + \\ p(Z_t<1|X_t=not\_broken)\bar{bel}(X_t=not\_broken)]^{-1} 37 | $$ 38 | 39 | 40 | 对以上5、6、7式代入先验初值1、2进行迭代,即可得到各个时刻距离传感器故障的概率如下 41 | 42 | | 时刻 | $bel(X_t=broken|Z_t<1)$ | $bel(X_t=not\_broken|Z_t<1)$ | $\eta$ | 43 | | ---- | ----------------------- | ---------------------------- | ------------------ | 44 | | 0 | 0.01 | 0.99 | | 45 | | 1 | 0.029411764705882353 | 0.9705882352941176 | 2.941176470588235 | 46 | | 2 | 0.08333333333333333 | 0.9166666666666666 | 2.833333333333333 | 47 | | 3 | 0.2142857142857143 | 0.7857142857142857 | 2.5714285714285716 | 48 | | 4 | 0.45000000000000007 | 0.55 | 2.1 | 49 | | 5 | 0.7105263157894737 | 0.2894736842105263 | 1.5789473684210524 | 50 | | 6 | 0.8804347826086958 | 0.11956521739130438 | 1.2391304347826089 | 51 | | 7 | 0.9566929133858267 | 0.043307086614173235 | 1.0866141732283463 | 52 | | 8 | 0.9851351351351351 | 0.014864864864864866 | 1.0297297297297296 | 53 | | 9 | 0.9949954504094631 | 0.0050045495905368526 | 1.0100090991810737 | 54 | | 10 | 0.9983262325015215 | 0.0016737674984783934 | 1.0033475349969567 | 55 | 56 | 最后推导公式: 57 | $$ 58 | \begin{align} 59 | \begin{array} 60 | \ bel(X_t=broken) &= {\eta}_t\times1\times bel(X_{t-1}=broken) \\ 61 | &= {\eta}_t{\eta}_{t-1}\times1\times bel(X_{t-2}=broken) \\ 62 | &=\prod_{i=0}^n {\eta}_i bel(X_0=broken) 63 | \end{array} 64 | \\ 65 | \begin{array} 66 | \ bel(X_t=not\_broken) &= {\eta}_t\times \frac{1}{3} \times bel(X_{t-1}=not\_broken) \\ 67 | &= {\eta}_t{\eta}_{t-1}\times \frac{1}{3} \times bel(X_{t-2}=broken) \\ 68 | &=\prod_{i=0}^n {\eta}_i \times \frac{1}{3^n} \times bel(X_0=not\_broken) 69 | \end{array} 70 | \end{align} 71 | $$ 72 | 其中 $\prod_{i=0}^n {\eta}_i$ 满足归一化要求,即 73 | $$ 74 | \prod_{i=0}^n {\eta}_i = [bel(X_0=broken) + \frac{1}{3^n} \times bel(X_0=not\_broken)]^{-1} 75 | $$ 76 | 因此,传感器失效的概率为 77 | $$ 78 | bel(X_t=broken) = \frac{bel(X_0=broken)}{bel(X_0=broken) + \frac{1}{3^n} \times bel(X_0=not\_broken)} 79 | $$ 80 | 81 | ## 2. 已知天气状态转移矩阵 82 | 83 | | | 晴(明天) | 多云 | 雨 | 84 | | ------------ | ---------- | ---- | ---- | 85 | | 晴(今天) | 0.8 | 0.2 | 0 | 86 | | 多云(今天) | 0.4 | 0.4 | 0.2 | 87 | | 雨(今天) | 0.2 | 0.6 | 0.2 | 88 | 89 | ### a) 第一天是晴天,求接下来三天是多云、多云、雨的概率 90 | 91 | 可以通过贝叶斯公式得到 92 | $$ 93 | \begin{align} 94 | \begin{array} 95 | P(X_4=rainy) &= P(X_4=rainy|X_3=cloudy)P(X_3=cloudy) \\ 96 | &= P(X_4=rainy|X_3=cloudy)P(X_3=cloudy|X_2=cloudy)\\ 97 | & P(X_2=cloudy|X_1=sunny)P(X_1=sunny) \\ 98 | &= 0.2 \times 0.4 \times 0.2 \\ 99 | &= 0.016 100 | \end{array} 101 | \end{align} 102 | $$ 103 | 104 | ### b)编程随机产生天气序列的仿真器 105 | 106 | ### c)计算平稳分布 107 | 108 | 首先需要知道平稳分布的定义,根据[维基百科]()的介绍,平稳分布是指不随时间变化的状态分布,即 109 | $$ 110 | \lim\limits_{n \to \infty} {X_n}=\lim\limits_{n \to \infty}{A^nX_0} 111 | $$ 112 | 使用b) 中设计的随机天气序列仿真器,在天气序列足够长时,天气出现的频率就是平稳分布的概率,计算得到 113 | $$ 114 | P_{static}=[0.6430726, 0.2855164, 0.071411]^T 115 | $$ 116 | 117 | ### d)通过公式计算平稳分布 118 | 119 | 根据平稳分布的定义,我们需要求的其实是状态转移矩阵的特征值1对应的特征向量 120 | $$ 121 | Ax=x 122 | $$ 123 | 这里我们采用偷懒的方法,使用[矩阵特征向量在线计算工具](),计算得到特征向量为 124 | $$ 125 | [9, 4, 1]^T 126 | $$ 127 | 对该向量进行概率归一化得到 128 | $$ 129 | P_{static}=[9/14, 2/7, 1/14]^T 130 | $$ 131 | 132 | ### f) 计算给定今天天气时,昨天天气的概率表 133 | 134 | 需要计算以下条件概率 135 | $$ 136 | P(X_{t-1}=i|X_t=j)=\frac{P(X_{t}=j|X_{t-1}=i)P(X_{t-1}=i)}{P(X_{t}=j)} \\ 137 | P(X_{t}=j)=\sum_{i}^3 P(X_{t}=j|X_{t-1}=i)P(X_{t-1}=i) 138 | $$ 139 | 其中$$P(X_{t-1}=i)$$作为先验概率,由平稳分布给出,从而计算得出概率表 140 | 141 | | | 晴(今天) | 多云 | 雨 | 142 | | ---------- | ---------- | ---- | ---- | 143 | | 晴(昨天) | 0.8 | 0.45 | 0 | 144 | | 多云 | $$8/45$$ | 0.4 | 0.8 | 145 | | 雨 | $$1/45$$ | 0.15 | 0.2 | 146 | 147 | 148 | 149 | ### g) 如果天气状态转移概率与季节相关,这个过程还满足马尔科夫特性吗 150 | 151 | 不满足。马尔科夫特性要求,当前时刻的系统状态只与上一时刻的系统状态有关,与其他变量无关。如果引入季节这一变量,就会破坏马尔科夫特性。但是在一个季节内,状态转移矩阵不发生变化,该过程依然保持马尔科夫特性。 152 | 153 | ## 3. 若有传感器观测矩阵 154 | 155 | | | 晴(实际) | 多云(实际) | 雨(实际) | 156 | | ------------ | ---------- | ------------ | ---------- | 157 | | 晴(观测) | 0.6 | 0.3 | 0 | 158 | | 多云(观测) | 0.4 | 0.7 | 0 | 159 | | 雨(观测) | 0 | 0 | 1 | 160 | 161 | ### a) 已知第一天是晴天,2~5天观测到为多云,多云,雨,晴,求第五天是晴天的概率 162 | 163 | 由第二题可知状态转移矩阵为 164 | $$ 165 | A=\begin{bmatrix} 166 | 0.8 &0.4 &0.2 \\ 167 | 0.2 &0.4 &0.6 \\ 168 | 0 &0.2 &0.2 169 | \end{bmatrix} 170 | $$ 171 | 由本题题干可知观测矩阵为 172 | $$ 173 | C=\begin{bmatrix} 174 | 0.6 &0.3 &0 \\ 175 | 0.4 &0.7 &0 \\ 176 | 0 &0 &1 177 | \end{bmatrix} 178 | $$ 179 | 根据贝叶斯准则 180 | $$ 181 | \begin{align} 182 | \bar{bel}(x_t|x_{t-1})&=A\cdot bel(x_{t-1}) \\ 183 | bel(X_t=i|Z_t=j)&=\eta P(Z_t=j|X_t=i)P(X_t=i) \\ 184 | \eta &= (\sum_{i=1}^n{P(Z_t=j|X_t=i)P(X_t=i)})^{-1} 185 | \end{align} 186 | $$ 187 | 初值和观测序列 188 | $$ 189 | bel(x_1)=\begin{bmatrix}1 &0 &0 \end{bmatrix}^T \\ 190 | z_2=cloudy, z_3=cloudy, z_4=rainy, z_5=sunny 191 | $$ 192 | 迭代计算可得 193 | 194 | | | $z_t$ | $$\bar{bel}(x_t)$$ | $bel(x_t)$ | $$\eta$$ | 195 | | ---- | ------ | --------------------------------------------------------- | ------------------------------------------------------ | ------------ | 196 | | 1 | | $$\begin{bmatrix}1 &0 &0 \end{bmatrix}^T$$ | $$\begin{bmatrix}1 &0 &0 \end{bmatrix}^T$$ | 1 | 197 | | 2 | cloudy | $$\begin{bmatrix}0.8 &0.2 &0 \end{bmatrix}^T$$ | $$\begin{bmatrix}16/23 &7/23 &0 \end{bmatrix}^T$$ | $$50/23$$ | 198 | | 3 | cloudy | $$\begin{bmatrix}78/115 &30/115 &7/115 \end{bmatrix}^T$$ | $$\begin{bmatrix}312/522 &210/522 &0 \end{bmatrix}^T$$ | $$1150/522$$ | 199 | | 4 | rainy | $$\begin{bmatrix}0.6390 &0.2805 &0.0805 \end{bmatrix}^T$$ | $$\begin{bmatrix}0 &0 &1 \end{bmatrix}^T$$ | 124.2857 | 200 | | 5 | sunny | $$\begin{bmatrix}0.2 &0.6 &0.2 \end{bmatrix}^T$$ | $$\begin{bmatrix}0.4 &0.6 &0.0 \end{bmatrix}^T$$ | 3.3333 | 201 | 202 | 由上面结果可得,第五天是晴天的概率为0.4 203 | 204 | ### b) 当2~4天的观测序列为晴,晴,雨时,用两种方式讨论最有可能的天气序列:1)考虑当天以及之前的观测结果;2)统一考虑所有天气 205 | 206 | 根据a)中的方法,当观测序列为晴、晴、雨时,最有可能的天气序列为 207 | 208 | | 日期 | 天气 | 概率 | 209 | | ---- | ---- | ------ | 210 | | 1 | 晴 | 1.0 | 211 | | 2 | 晴 | 0.8889 | 212 | | 3 | 晴 | 0.8718 | 213 | | 4 | 雨 | 1.0 | 214 | 215 | 统一考虑所有天气时 216 | $$ 217 | \begin{align} 218 | \begin{array} 219 | /P(X_2=i|z_{2:4})&=\eta P(Z_2=sunny|X_2=i,z_{3:4})P(X_2=i|z_{3:4}) \\ 220 | &=\eta P(Z_2=sunny|X_2=i)P(X_2=i|z_{3:4}) \\ 221 | &=\eta P(Z_2=sunny|X_2=i)P(Z_3=sunny|X_2=i,z_4)P(X_2=i|z_4) \\ 222 | &=\eta P(Z_2=sunny|X_2=i)P(Z_3=sunny|X_2=i) \\ 223 | &\times P(Z_4=rainy|X_2=i)P(X_2=i|z_2) 224 | \end{array} 225 | \end{align} 226 | $$ 227 | 其中 228 | $$ 229 | \begin{align} 230 | \begin{array} 231 | /P(Z_3=sunny|X_2=i)&=\sum_{j=1}^n{P(Z_3=sunny|X_3=j,X_2=i)P(X_3=j|X_2=i)} \\ 232 | &=(CA)_{1,i} 233 | \end{array} 234 | \\ 235 | \begin{array} 236 | /P(Z_4=rainy|X_2=i)&=\sum_{j=1}^n{P(Z_4=rainy|X_4=j,X_2=i)P(X_4=j|X_2=i)} \\ 237 | &=\sum_{j=1}^n{P(Z_4=rainy|X_4=j)\sum_{k=1}^nP(X_4=j|X_3=k)P(X_3=k|X_2=i)} \\ 238 | &=(CAA)_{3,i} 239 | \end{array} 240 | \end{align} 241 | $$ 242 | 同理可得第3天和第4天的概率 243 | $$ 244 | \begin{align} 245 | \begin{array} 246 | /P(X_3=i|z_{2:4})&=P(Z_4=rainy|X_3=i)P(X_3=i|z_{2:3}) \\ 247 | &=(CA)_{3,i}P(X_3=i|z_{2:3}) \\ 248 | \end{array} 249 | \end{align} 250 | $$ 251 | 其中$$P(X_3=i|z_{2:3})$$和$$P(X_4=i|z_{2:4})$$已经在前一小问中求得,汇总得到2~4天的天气概率 252 | 253 | | 日期 | 天气 | 概率 | 254 | | ---- | ---- | ---- | 255 | | 1 | 晴 | 1 | 256 | | 2 | 晴 | 0.8 | 257 | | 3 | 多云 | 1 | 258 | | 4 | 雨 | 1 | 259 | 260 | 261 | 262 | ### c) 若第2~4天的天气测量分别为晴,晴,雨,那么最有可能的天气序列是什么,该天气序列的概率是多少 263 | 264 | 根据b)的解答,最可能的天气序列为晴、多云、雨,该序列概率为每天概率的乘积,为0.8. 265 | 266 | 我们会发现,综合考虑全序列的传感器数据,和只考虑当天的观测数据,得到的天气序列的预测是不同的。根据状态转移矩阵,不存在由晴天变成雨天的转换,而第三天为雨天的概率为1,所以虽然第三天传感器检测为晴天,但综合考虑第四天的概率后,第三天的天气应为雨天。这道题使用简单的对比,向我们形象地说明:如果采用全时间序列的观测信息,能够得到更加准确的后验概率估计。 267 | 268 | ## 4. 考虑一维高斯分布,初始位置$x_{init}=1000m$,方差$\sigma_{init}^2=900m^2$,观测位置$x_{GPS}=1100m$,方差$\sigma_{GPS}^2=100m^2$ 269 | 270 | ### a) 写出先验$p(x)$和观测$p(z|x)$的概率密度函数 271 | 272 | 根据高斯分布公式可得 273 | $$ 274 | p(x)={1}/{\sqrt{2\pi\sigma_{init}^2}}\cdot e^{-\frac{(x-x_{init})^2}{2\sigma_{init}^2}} \\ 275 | 276 | p(z|x)={1}/{\sqrt{2\pi\sigma_{GPS}^2}}\cdot e^{-\frac{(z-x)^2}{2\sigma_{GPS}^2}} 277 | $$ 278 | 279 | ### b) 使用贝叶斯准则,后验概率$p(x|z)$是多少,能证明该分布是高斯吗 280 | 281 | 根据贝叶斯准则 282 | $$ 283 | p(x|z)=\frac{p(z|x)p(x)}{p(z)} 284 | $$ 285 | 其中 286 | $$ 287 | \begin{align} 288 | \begin{array} 289 | /p(z)&=\int_{-\infty}^{+\infty} p(z|x)p(x)dx \\ 290 | &=\int_{-\infty}^{+\infty}{1}/{\sqrt{2\pi\sigma_{init}^2}}\cdot e^{-\frac{(x-x_{init})^2}{2\sigma_{init}^2}} \cdot {1}/{\sqrt{2\pi\sigma_{GPS}^2}}\cdot e^{-\frac{(z-x)^2}{2\sigma_{GPS}^2}}dx \\ 291 | &=\int_{-\infty}^{+\infty}\frac{1}{2\pi \sigma_{init}\sigma_{GPS}}\cdot e^{-\frac{(x-x_{init})^2}{2\sigma_{init}^2}-\frac{(z-x)^2}{2\sigma_{GPS}^2}}dx 292 | \end{array} 293 | \end{align} 294 | $$ 295 | 对指数二项式进行分析 296 | $$ 297 | \begin{align} 298 | \begin{array} 299 | \frac{(x-x_{init})^2}{2\sigma_{init}^2}+\frac{(z-x)^2}{2\sigma_{GPS}^2} 300 | =&\frac{x^2-2xx_{init}+x_{init}^2}{18\sigma_{GPS}^2}+\frac{z^2 -2xz +x^2}{2\sigma_{GPS}^2} \\ 301 | =&\frac{10(x^2-2x(\frac{x_{init}+9z}{10})+(\frac{x_init+9z}{10})^2)}{18\sigma_{GPS}^2}+\frac{9z^2+x_{init}^2-\frac{(x_init+9z)^2}{10}}{18\sigma_{GPS}^2} 302 | \end{array} 303 | \end{align} 304 | $$ 305 | 第一项是x的函数,可以写成正态分布的形式,第二项与x无关,可从积分式内提取出来,计算得到 306 | $$ 307 | p(z)=\frac{1}{2\pi \sigma_{init}\sigma_{GPS}}\cdot e^{-\frac{9z^2+x_{init}^2-\frac{(x_{init}+9z)^2}{10}}{18\sigma_{GPS}^2}} \cdot \sqrt{2\pi}\sqrt{9/10}\sigma_{GPS} \\ 308 | =\frac{1}{\sqrt{2\pi} \sqrt{10}\sigma_{GPS}}\cdot e^{-\frac{9z^2+x_{init}^2-\frac{(x_{init}+9z)^2}{10}}{18\sigma_{GPS}^2}} 309 | $$ 310 | 那么后验的分布为 311 | $$ 312 | p(z|x)=\frac{\frac{1}{2\pi \sigma_{init}\sigma_{GPS}}\cdot e^{-\frac{10(x^2-2x(\frac{x_{init}+9z}{10})+(\frac{x_init+9z}{10})^2)}{18\sigma_{GPS}^2}-\frac{9z^2+x_{init}^2-\frac{(x_init+9z)^2}{10}}{18\sigma_{GPS}^2}}}{\frac{1}{\sqrt{2\pi} \sqrt{10}\sigma_{GPS}}\cdot e^{-\frac{9z^2+x_{init}^2-\frac{(x_{init}+9z)^2}{10}}{18\sigma_{GPS}^2}}} \\ 313 | =\frac{1}{\sqrt{2\pi}\sqrt{9/10} \sigma_{GPS}}e^{-\frac{(x-\frac{9z+x_{init}}{10})^2}{2\times9/10\sigma_{GPS}^2}} 314 | $$ 315 | 是满足正态分布$$p(x|z)\sim N(\frac{9z+x_{init}}{10}, 9/10\sigma_{GPS}^2)$$ 316 | 317 | 318 | 319 | ### c) 测量$x_{GPS}=1100m$怎样得出先验和GPS接收器的误差概率信息 320 | 321 | 不是很理解这道题目需要求什么,这里大胆猜测一下,是对GPS接收器进行误差分析,问的是怎样获取GPS接收器的值和方差,GPS的先验数据经过滤波得到,误差信息通过对时间统计得到。 322 | 323 | ## 5. 由式(2.17)推导(2.18)和(2.19),以及本书叙述的概率准则 324 | 325 | 根据式(2.17)$$p(x,y|z)=p(x|z)p(y|z)$$可得 326 | $$ 327 | \begin{align} 328 | p(x|z)&=\frac{p(x,y|z)}{p(y|z)}=\frac{p(x|z)p(y|z)}{p(y|z)}=p(x|y,z) \\ 329 | p(y|z)&=\frac{p(x,y|z)}{p(x|z)}=p(y|x,z) 330 | \end{align} 331 | $$ 332 | 根据一阶马尔科夫假设,当前观测只与系统当前状态$$x_t$$相关,与其他变量相互独立,于是可以得到 333 | $$ 334 | p(z_i|x_{0:t}, z_{1:t-1},u_{1:t-1})=p(z_i|x_t) 335 | $$ 336 | 337 | ## 6. 证明式(2.25),这个等式的意义是什么 338 | 339 | 根据期望的性质 340 | $$ 341 | \begin{align} 342 | \begin{array} 343 | /Cov[X]&=E[X-E[X]]^2\\ 344 | &=E[X^2-2X\cdot E[X]+(E[X])^2]\\ 345 | &=E[X^2]-2E[X]E[X]+(E[X])^2\\ 346 | &=E[X^2]-(E[X])^2 347 | \end{array} 348 | \end{align} 349 | $$ 350 | 这说明方差是协方差的特殊形式,对于多元分布而言,协方差是一个方阵。 351 | 352 | # 小结 353 | 354 | - 1,2,3题都是在使用贝叶斯准则解决离散问题,其中第三题给了另外一种不同的应用方法,不仅仅是按照时序计算的贝叶斯滤波,还可以应用在解决全概率问题 355 | - 4题解决的是一维连续问题,推导了高斯分布下的贝叶斯准则(即卡尔曼滤波),证明了后验概率也是高斯分布,更深入地理解了卡尔曼滤波 356 | - 5题帮助更好的理解一阶马尔科夫假设下的贝叶斯准则 -------------------------------------------------------------------------------- /ch02_recursive_state_estimation/第二章-递归状态估计.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yu-Xiaoxian/probabilistic_robotics_exercises/a10c5e27020b2b3c6fe708c99698a69c6e9a6b48/ch02_recursive_state_estimation/第二章-递归状态估计.pdf -------------------------------------------------------------------------------- /ch03_gaussian_filters/ch03_guassian_filters.py: -------------------------------------------------------------------------------- 1 | # MIT License 2 | 3 | # Copyright (c) [2020] [Yu-Xiaoxian and other contributors] 4 | 5 | # Permission is hereby granted, free of charge, to any person obtaining a copy 6 | # of this software and associated documentation files (the "Software"), to deal 7 | # in the Software without restriction, including without limitation the rights 8 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | # copies of the Software, and to permit persons to whom the Software is 10 | # furnished to do so, subject to the following conditions: 11 | 12 | # The above copyright notice and this permission notice shall be included in all 13 | # copies or substantial portions of the Software. 14 | 15 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | # SOFTWARE 22 | 23 | import numpy as np 24 | from matplotlib.patches import Ellipse 25 | import matplotlib.pyplot as plt 26 | 27 | print("Chapter 3: Guassian Filters") 28 | print("") 29 | print("#############") 30 | print("Exercise 3.1:") 31 | 32 | A = np.mat([[1,1],[0,1]]) 33 | B = np.mat([[0.5], [1.0]]) 34 | R = B*B.T 35 | C = np.mat([1, 0]) 36 | Q = 10 37 | mu = np.mat([[0], [0]]) 38 | u = np.mat([0]) 39 | Sigma = np.mat([[0,0],[0,0]]) 40 | 41 | fig = plt.figure() 42 | ax = fig.add_subplot(111) 43 | 44 | for i in range(1, 6): 45 | mu_t = A*mu + B*u 46 | Sigma_t = A*Sigma*A.T + R 47 | mu = mu_t 48 | Sigma = Sigma_t 49 | print(mu) 50 | print(Sigma) 51 | eigen_value, eigen_vector = np.linalg.eig(Sigma) 52 | ell1 = Ellipse(xy = (mu[0,0], mu[1,0]), width = eigen_value[1], height = eigen_value[0], angle = np.arctan(-eigen_vector[0,0]/eigen_vector[1,0])*180.0/3.1415926, facecolor='yellow', alpha=0.3) 53 | ax.add_patch(ell1) 54 | 55 | print("#############") 56 | print("Exercise 3.2:") 57 | 58 | z = np.mat([5]) 59 | K = Sigma*C.T*(C*Sigma*C.T+Q).I 60 | mu_5 = mu + K*(z - C*mu) 61 | Sigma_5 = (np.mat(np.identity(2))-K*C)*Sigma 62 | print("K_5: ") 63 | print(K) 64 | print("mu: ") 65 | print(mu_5) 66 | print("Sigma: ") 67 | print(Sigma_5) 68 | 69 | fig2 = plt.figure() 70 | ax2 = fig2.add_subplot(111) 71 | ax2.add_patch(ell1) 72 | eigen_value, eigen_vector = np.linalg.eig(Sigma_5) 73 | ell1 = Ellipse(xy = (mu_5[0,0], mu_5[1,0]), width = eigen_value[1], height = eigen_value[0], angle = np.arctan(-eigen_vector[0,0]/eigen_vector[1,0])*180.0/3.1415926, facecolor='blue', alpha=0.3) 74 | ax2.add_patch(ell1) 75 | 76 | # plt.axis('scaled') 77 | # plt.axis('equal') #changes limits of x or y axis so that equal increments of x and y have the same length 78 | 79 | print("#############") 80 | print("Exercise 4.1:") 81 | fig3 = plt.figure() 82 | ax3 = fig3.add_subplot(111) 83 | theta = np.linspace(0, 2*np.pi,800) 84 | x,y = np.cos(theta)*1.01, np.sin(theta)*1.01 85 | ax3.plot(x, y, color='blue', linewidth=2.0) 86 | 87 | x,y = np.cos(theta)*0.99, np.sin(theta)*0.99 88 | ax3.plot(x, y, color='blue', linewidth=2.0) 89 | 90 | v = np.linspace(0.99,1.01,10) 91 | v.shape = (10, 1) 92 | x1 = v * x 93 | y1 = v * y 94 | ax3.plot(x1, y1, color='blue', linewidth=1.0) 95 | 96 | print("#############") 97 | print("Exercise 4.3:") 98 | G = np.mat([[1,0,0],[0,1,1],[0,0,1]]) 99 | Sigma = np.mat([[0.01,0,0],[0,0.01,0],[0,0,10000]]) 100 | Sigma_p = G*Sigma*G.T 101 | print(Sigma_p) 102 | 103 | print("#############") 104 | print("Exercise 4.4:") 105 | mu = np.mat([[1],[0],[0]]) 106 | z = np.mat([1]) 107 | C = np.mat([1,0,0]) 108 | Q = np.mat([0.01]) 109 | K = Sigma_p*C.T*(C*Sigma_p*C.T+Q).I 110 | mu_f = mu + K*(z - C*mu) 111 | Sigma_f = (np.mat(np.identity(3))-K*C)*Sigma_p 112 | print(K) 113 | print(mu_f) 114 | print(Sigma_f) 115 | 116 | print("#############") 117 | print("Exercise 4.5:") 118 | G = np.mat([[1,0,0],[0,1,1],[0,0,1]]) 119 | Sigma = np.mat([[0.01,0,0],[0,10000,0],[0,0,0.01]]) 120 | Sigma_p = G*Sigma*G.T 121 | print(Sigma_p) 122 | mu = np.mat([[1],[0],[0]]) 123 | z = np.mat([1]) 124 | C = np.mat([1,0,0]) 125 | Q = np.mat([0.01]) 126 | K = Sigma_p*C.T*(C*Sigma_p*C.T+Q).I 127 | mu_f = mu + K*(z - C*mu) 128 | Sigma_f = (np.mat(np.identity(3))-K*C)*Sigma_p 129 | print(K) 130 | print(mu_f) 131 | print(Sigma_f) 132 | 133 | plt.show() 134 | -------------------------------------------------------------------------------- /ch03_gaussian_filters/ex3_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yu-Xiaoxian/probabilistic_robotics_exercises/a10c5e27020b2b3c6fe708c99698a69c6e9a6b48/ch03_gaussian_filters/ex3_1.png -------------------------------------------------------------------------------- /ch03_gaussian_filters/ex3_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yu-Xiaoxian/probabilistic_robotics_exercises/a10c5e27020b2b3c6fe708c99698a69c6e9a6b48/ch03_gaussian_filters/ex3_2.png -------------------------------------------------------------------------------- /ch03_gaussian_filters/ex4_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yu-Xiaoxian/probabilistic_robotics_exercises/a10c5e27020b2b3c6fe708c99698a69c6e9a6b48/ch03_gaussian_filters/ex4_1.png -------------------------------------------------------------------------------- /ch03_gaussian_filters/第三章-高斯滤波.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第三章 高斯滤波\n", 8 | "\n", 9 | "## 1. 一维线性运动的汽车,位置、速度、加速度满足均值为零,协方差为1的高斯分布,时间间隔为1,假定可以设定每个时刻的加速度\n", 10 | "\n", 11 | "### a) 最小的系统状态向量是什么\n", 12 | "\n", 13 | "由于加速度可以设定,应当做控制变量,所以最小状态向量是位置和速度,如下\n", 14 | "$$\n", 15 | "X=\\begin{bmatrix}x_t &\\dot{x}_{t}\\end{bmatrix}^T\n", 16 | "$$\n", 17 | "\n", 18 | "### b) 设计状态转移概率$p(x_t|u_t, x_{t-1})$\n", 19 | "\n", 20 | "由于没有观测步骤,所以直接考虑预测步骤,根据位置、速度、加速度的关系,可以得到状态转移方程为\n", 21 | "$$\n", 22 | "x_t=Ax_{t-1}+Bu_t+{\\epsilon}_t\n", 23 | "$$\n", 24 | "其中\n", 25 | "$$\n", 26 | "A=\\begin{bmatrix}1 &\\Delta{t} \\\\0 &1\\end{bmatrix} = \\begin{bmatrix}1 &1 \\\\0 &1\\end{bmatrix} \\\\\n", 27 | "B=\\begin{bmatrix}\\frac{(\\Delta{t})^2}{2} \\\\ \\Delta{t}\\end{bmatrix}=\\begin{bmatrix}\\frac{1}{2} \\\\ 1\\end{bmatrix}\n", 28 | "$$\n", 29 | "\n", 30 | "而 $$\\epsilon_t$$ 由加速度产生,所以协方差矩阵$$R$$满足\n", 31 | "$$\n", 32 | "R=\\sigma^2BB^T=\\begin{bmatrix}\\frac{1}{4} &\\frac{1}{2} \\\\ \\frac{1}{2} &1 \\end{bmatrix}\n", 33 | "$$\n", 34 | "\n", 35 | "### c) 假设$t=0, x_0=0, \\dot{x}_0=0$,求$t=1,2,3,4,5$的状态分布\n", 36 | "\n", 37 | "由于没有观测步骤,所以\n", 38 | "$$\n", 39 | "\\mu_t=\\bar{\\mu}_t \\\\\n", 40 | "\\Sigma_t=\\bar{\\Sigma}_t\n", 41 | "$$\n", 42 | "根据\n", 43 | "$$\n", 44 | "\\bar{\\mu}_t=A_t\\mu_{t-1}+B_tu_t \\\\\n", 45 | "\\bar{\\Sigma}_t=A_t\\Sigma_{t-1}A_t^T+R_t\n", 46 | "$$\n", 47 | "计算结果如下表所示\n", 48 | "\n", 49 | "| $$t$$ | $$\\mu_t$$ | $$\\Sigma_t$$ |\n", 50 | "| ----- | --------------------------------------- | ---------------------------------------------------------- |\n", 51 | "| 0 | $$\\begin{bmatrix} 0 &0\\end{bmatrix}^T$$ | $$\\begin{bmatrix} 0 &0 \\\\ 0 &0 \\end{bmatrix}$$ |\n", 52 | "| 1 | $$\\begin{bmatrix} 0 &0\\end{bmatrix}^T$$ | $$\\begin{bmatrix} 0.25 &0.5 \\\\ 0.5 &1 \\end{bmatrix}$$ |\n", 53 | "| 2 | $$\\begin{bmatrix} 0 &0\\end{bmatrix}^T$$ | $$\\begin{bmatrix} 2.5 &2.0 \\\\ 2.0 &2.0 \\end{bmatrix}$$ |\n", 54 | "| 3 | $$\\begin{bmatrix} 0 &0\\end{bmatrix}^T$$ | $$\\begin{bmatrix} 8.75 &4.5 \\\\ 4.5 &3.0 \\end{bmatrix}$$ |\n", 55 | "| 4 | $$\\begin{bmatrix} 0 &0\\end{bmatrix}^T$$ | $$\\begin{bmatrix} 21.0 &8.0 \\\\ 8.0 &4.0 \\end{bmatrix}$$ |\n", 56 | "| 5 | $$\\begin{bmatrix} 0 &0\\end{bmatrix}^T$$ | $$\\begin{bmatrix} 41.25 &12.5 \\\\ 12.5 &5.0 \\end{bmatrix}$$ |\n", 57 | "\n", 58 | "### d) 将协方差矩阵绘制为不确定椭圆\n", 59 | "\n", 60 | "绘制各时刻不确定椭圆如下\n", 61 | "\n", 62 | "![ex3_1](ex3_1.png)\n", 63 | "\n", 64 | "### e) 随着$t\\to \\infty$,位置和速度之间的关系会如何变化\n", 65 | "\n", 66 | "根据变化趋势,不确定椭圆会越来越大,最终位置不确定性占主导\n", 67 | "\n", 68 | "## 2. 加入观测步骤,假设时刻$t$测量位置为$z$,噪声方差为$\\sigma^2=10$\n", 69 | "\n", 70 | "### a) 求观测矩阵和观测方差\n", 71 | "\n", 72 | "观测方程为\n", 73 | "$$\n", 74 | "z_t=Cx_t+\\delta_t\n", 75 | "$$\n", 76 | "其中\n", 77 | "$$\n", 78 | "C=\\begin{bmatrix} 1 &0 \\end{bmatrix}\\\\\n", 79 | "Q_t=\\sigma_z^2CC^T=10\n", 80 | "$$\n", 81 | "\n", 82 | "### b) 实现测量更新,假设$t=5$时,观测$z=5$,计算更新前后卡尔曼滤波的参数\n", 83 | "\n", 84 | "根据第一题可以知道\n", 85 | "$$\n", 86 | "\\bar{\\mu}_5=\\begin{bmatrix} 0 &0 \\end{bmatrix}^T \\\\\n", 87 | "\\bar{\\Sigma}_5=\\begin{bmatrix} 41.25 &12.5 \\\\ 12.5 &5.0 \\end{bmatrix}\n", 88 | "$$\n", 89 | "根据程序3.1,可以计算卡尔曼增益以及观测更新\n", 90 | "$$\n", 91 | "K_5=\\bar{\\Sigma}_5C_5^T(C_5\\bar{\\Sigma}_5C_5^T+Q_t)^{-1}=\\begin{bmatrix} 0.8049 \\\\0.2439\\end{bmatrix} \\\\\n", 92 | "\\mu_5=\\bar{\\mu}_5+K_5(z_5-C_5\\bar{\\mu}_5)=\\begin{bmatrix} 4.0244 \\\\1.220\\end{bmatrix} \\\\\n", 93 | "{\\Sigma}_5=(I-K_5C_5)\\bar{\\Sigma}_5=\\begin{bmatrix} 8.0488 &2.4390 \\\\2.4390 &1.9512\\end{bmatrix}\n", 94 | "$$\n", 95 | "观测更新后的不确定椭圆如蓝色区域所示,说明经过观测后,系统的不确定性得到了降低。\n", 96 | "\n", 97 | "![ex3_2](ex3_2.png)\n", 98 | "\n", 99 | "## 3. 使用傅里叶变换或者z变换的卷积定理证明卡尔曼滤波的预测步\n", 100 | "\n", 101 | "这道题的本质是使用卷积公式证明高斯分布的可叠加性,首先介绍卷积公式,对于独立随机变量$$X$$和$$Y$$,变量$$Z=X+Y$$的分布满足以下关系\n", 102 | "$$\n", 103 | "p_Z(Z)=\\int_{-\\infty}^{\\infty}{p_X(Z-Y)p_Y(Y)dY}=p_X(Z)*p_Y(Z)\n", 104 | "$$\n", 105 | "\n", 106 | "傅里叶变换卷积定理为\n", 107 | "$$\n", 108 | "F[f(t)*g(t)]=F[f(\\omega)]\\cdot F[g(\\omega)]\n", 109 | "$$\n", 110 | "对于正态分布$$X \\sim N(\\mu_X, \\Sigma_X)$$,$$Y \\sim N(\\mu_Y, \\Sigma_Y)$$,傅里叶变换为\n", 111 | "$$\n", 112 | "\\begin{align}\n", 113 | "F[p_X(X)]&=\\eta e^{-\\frac{1}{2}\\omega^T\\Sigma_X\\omega -j\\omega\\mu_X} \\\\\n", 114 | "F[p_Y(Y)]&=\\eta e^{-\\frac{1}{2}\\omega^T\\Sigma_Y\\omega -j\\omega\\mu_Y} \\\\\n", 115 | "\\end{align}\n", 116 | "$$\n", 117 | "对$$p_Z(Z=X+Y)$$求傅里叶变换可得\n", 118 | "$$\n", 119 | "\\begin{align}\n", 120 | "\\begin{array}\n", 121 | "/ F[p_Z(Z)]&=F[p_X(Z)*p_Y(Z)]=F[p_X(Z)]\\cdot F[p_Y(Z)] \\\\\n", 122 | "&=\\eta e^{-\\frac{1}{2}\\omega^T(\\Sigma_X+\\Sigma_Y)\\omega-j\\omega(\\mu_X+\\mu_Y)}\n", 123 | "\\end{array}\n", 124 | "\\end{align}\n", 125 | "$$\n", 126 | "\n", 127 | "对式(15)做傅里叶逆变换,以及高斯函数的性质,可以推导出以下三式,这三个公式描述了高斯分布的可加性\n", 128 | "\n", 129 | "$$\n", 130 | "\\begin{align}\n", 131 | "X+Y &\\sim N(\\mu_X+\\mu_Y, \\Sigma_X + \\Sigma_Y) \\\\\n", 132 | "AX &\\sim N(A\\mu_X, A\\Sigma_X A^T) \\\\\n", 133 | "X+B &\\sim N(\\mu_X+B, \\Sigma_X)\n", 134 | "\\end{align}\n", 135 | "$$\n", 136 | "\n", 137 | "对于卡尔曼滤波的预测步\n", 138 | "$$\n", 139 | "x_t=A_tx_{t-1}+Bu_t+\\epsilon_t\n", 140 | "$$\n", 141 | "其中$$x_{t-1}$$和$$\\epsilon_t$$为相互独立的正态分布,所以满足高斯分布的可叠加性,因此后验概率满足\n", 142 | "$$\n", 143 | "X_t \\sim N(A\\mu_{t-1}+Bu_t, A\\Sigma_{t-1}A^T+R_t)\n", 144 | "$$\n", 145 | "\n", 146 | "## 4. 假设平面机器人的状态向量为$x,y,\\theta$,设初值为\n", 147 | "\n", 148 | "$$\n", 149 | "\\mu=\\begin{bmatrix}0 &0 &0 \\end{bmatrix}^T \\\\\n", 150 | "\\Sigma=\\begin{bmatrix}0.01 &0 &0 \\\\ 0 &0.01 &0 \\\\ 0 &0 &10000 \\end{bmatrix}\n", 151 | "$$\n", 152 | "\n", 153 | "### a) 机器人向前移动$d=1$个单位后,若机器人可不受噪声影响完美移动,机器人的期望位置为\n", 154 | "\n", 155 | "$$\n", 156 | "\\begin{bmatrix} x' \\\\y' \\\\ \\theta'\\end{bmatrix} = \\begin{bmatrix} x+cos\\theta \\\\y+sin\\theta \\\\ \\theta \\end{bmatrix}\n", 157 | "$$\n", 158 | "\n", 159 | "画出 $x-y$ 坐标的后验,由于角度不确定性很高,机器人分布在半径为1,宽度0.02的圆环上\n", 160 | "\n", 161 | "![ex4_1](ex4_1.png)\n", 162 | "\n", 163 | "### b) 将该运动作为扩展卡尔曼滤波的预测步骤,定义状态转移矩阵并将其线性化,然后给出新的高斯估计\n", 164 | "\n", 165 | "根据a) 中的运动模型,通过泰勒展开进行线性化\n", 166 | "$$\n", 167 | "\\begin{bmatrix} x' \\\\y' \\\\ \\theta'\\end{bmatrix} \\approx \n", 168 | "\\begin{bmatrix} \\mu_x + \\cos\\theta \\\\ \\mu_y + \\sin\\theta \\\\ \\mu_{\\theta} \\end{bmatrix} + \n", 169 | "\\begin{bmatrix} {\\partial x'}/{\\partial x} &{\\partial x'}/{\\partial y} &{\\partial x'}/{\\partial \\theta}\\\\{\\partial y'}/{\\partial x} &{\\partial y'}/{\\partial y} &{\\partial y'}/{\\partial \\theta} \\\\ {\\partial \\theta'}/{\\partial x} &{\\partial \\theta'}/{\\partial y} &{\\partial \\theta'}/{\\partial \\theta} \\end{bmatrix} \\begin{bmatrix} x-\\mu_x \\\\y-\\mu_y \\\\ \\theta - \\mu_{\\theta}\\end{bmatrix}\\\\\n", 170 | "=\\begin{bmatrix} \\mu_x + cos\\theta \\\\ \\mu_y + sin\\theta \\\\ \\mu_{\\theta} \\end{bmatrix} \n", 171 | "+\\begin{bmatrix} 1 &0 &-\\sin\\theta \\\\0 &1 &cos\\theta \\\\ 0 &0 &1 \\end{bmatrix} \\begin{bmatrix} x-\\mu_x \\\\y-\\mu_y \\\\ \\theta - \\mu_{\\theta}\\end{bmatrix} \\\\\n", 172 | "$$\n", 173 | "上式中\n", 174 | "$$\n", 175 | "\\begin{bmatrix} x-\\mu_x \\\\y-\\mu_y \\\\ \\theta - \\mu_{\\theta}\\end{bmatrix}\\sim N(0, \\Sigma)\n", 176 | "$$\n", 177 | "根据高斯分布的可加性\n", 178 | "$$\n", 179 | "\\begin{bmatrix} x' \\\\y' \\\\ \\theta'\\end{bmatrix} \\sim N(\\begin{bmatrix} \\mu_x + cos\\theta \\\\ \\mu_y + sin\\theta \\\\ \\mu_{\\theta} \\end{bmatrix},G\\Sigma G^T+R) \n", 180 | "$$\n", 181 | "其中\n", 182 | "$$\n", 183 | "G= \\begin{bmatrix} 1 &0 &-\\sin\\theta \\\\0 &1 &cos\\theta \\\\ 0 &0 &1 \\end{bmatrix}\n", 184 | "$$\n", 185 | "\n", 186 | "### c) 画出不确定椭圆并与凭直觉得到的解决方案进行比较\n", 187 | "\n", 188 | "当$\\theta = 0$时,\n", 189 | "$$\n", 190 | "G=\\begin{bmatrix} 1 &0 &0 \\\\0 &1 &1 \\\\ 0 &0 &1 \\end{bmatrix} \\\\\n", 191 | "\\Sigma'=G\\Sigma G^T=\\begin{bmatrix} 0.01 &0 &0 \\\\0 &10000 &10000 \\\\ 0 &10000 &10000 \\end{bmatrix}\n", 192 | "$$\n", 193 | "不考虑角度的话,可以发现Y方向的不确定性远大于X方向,分布为长轴远大于短轴的椭圆\n", 194 | "\n", 195 | "### d) 考虑测量问题,测量是机器人位置在$x$轴的投影,协方差为0.01,给出扩展卡尔曼滤波的准确结果,并与直觉分析的结果进行比较\n", 196 | "\n", 197 | "测量矩阵是线性的\n", 198 | "$$\n", 199 | "Z=CX=\\begin{bmatrix} 1 &0 &0\\end{bmatrix} \\begin{bmatrix} x' \\\\y' \\\\ \\theta' \\end{bmatrix} \\\\\n", 200 | "Q = 0.01\n", 201 | "$$\n", 202 | "按照卡尔曼滤波的预测步\n", 203 | "$$\n", 204 | "\\mu_f = \\begin{bmatrix} 1 &0 &0\\end{bmatrix} \\\\\n", 205 | "\\Sigma_f = \\begin{bmatrix} 0.005 &0 &0 \\\\0 &20000 &20000 \\\\0 &20000 &20000\\end{bmatrix}\n", 206 | "$$\n", 207 | "可以发现,$x$方向不确定性在缩小,但是$y$方向不确定性在放大\n", 208 | "\n", 209 | "### e) 讨论后验估计和扩展卡尔曼滤波产生的高斯分布之间的差异,这些差异有多显著?可以改变什么使近似更准确?如果初始方向已知,但不知道机器人的y坐标,会发生什么?\n", 210 | "\n", 211 | "可以通过降低方差来使得近似更加准确。\n", 212 | "\n", 213 | "若初始方向已知,不确定机器人的Y坐标,该系统的协方差为\n", 214 | "$$\n", 215 | "\\Sigma = \\begin{bmatrix} 0.01 &0 &0 \\\\ 0 &10000 &0 \\\\ 0 &0 &0.01 \\end{bmatrix}\n", 216 | "$$\n", 217 | "那么经过卡尔曼滤波\n", 218 | "$$\n", 219 | "\\bar{\\mu}=\\begin{bmatrix} 1 &0 &0\\end{bmatrix} \\\\\n", 220 | "\\bar{\\Sigma} = \\begin{bmatrix} 0.01 &0 &0 \\\\ 0 &10000 &0.01 \\\\ 0 &0.01 &0.01 \\end{bmatrix} \\\\\n", 221 | "\\Sigma = \\begin{bmatrix} 0.005 &0 &0 \\\\ 0 &10000 &0.01 \\\\ 0 &0.01 &0.01 \\end{bmatrix}\n", 222 | "$$\n", 223 | "可以发现如果$y$方向未知,不确定性并不会传导到其他两个方向\n", 224 | "\n", 225 | "## 5. 书中给出的卡尔曼滤波中缺少一个常数附加项,将其扩展为包含这样的项\n", 226 | "\n", 227 | "首先给出有常数项的预测模型和观测模型\n", 228 | "$$\n", 229 | "\\bar{x}_t=A_tx_{t-1}+B_tu_t+D_x+\\epsilon_t \\\\\n", 230 | "z_t=C_t x_t+D_z+\\delta_t\n", 231 | "$$\n", 232 | "\n", 233 | "\n", 234 | "可得\n", 235 | "$$\n", 236 | "\\begin{align}\n", 237 | "\\bar{\\mu}_t&=A_t(\\mu_{t-1}+D_x)+B_tu_t \\\\\n", 238 | "\\bar{\\Sigma}_t&=A_t\\Sigma_{t-1}A^T+R_t \\\\\n", 239 | "K_t&=\\bar{\\Sigma}_tC_t^T(C_t\\bar{\\Sigma}_tC_t^T+Q_t)^{-1} \\\\\n", 240 | "\\mu_t&=\\bar{\\mu}_t+K_t(z_t-C_t\\bar{\\mu}_t-D_z) \\\\\n", 241 | "\\Sigma_t&=(I-K_tC_t)\\bar{\\Sigma}_t\n", 242 | "\\end{align}\n", 243 | "$$\n", 244 | "\n", 245 | "## 6. 通过实例证明在多变量高斯分布中稀疏信息矩阵的存在,它将所有变量用$\\epsilon$接近于1的相关系数联系起来。\n", 246 | "\n", 247 | "**稀疏矩阵的定义**:除了常数个元素外,矩阵其他每一行和每一列的元素都为0。\n", 248 | "\n", 249 | "并不明白这道题想要考察的是什么。" 250 | ] 251 | }, 252 | { 253 | "cell_type": "markdown", 254 | "metadata": {}, 255 | "source": [ 256 | "[Github Repo](https://github.com/Yu-Xiaoxian/probabilistic_robotics_exercises)" 257 | ] 258 | } 259 | ], 260 | "metadata": { 261 | "kernelspec": { 262 | "display_name": "Python 3", 263 | "language": "python", 264 | "name": "python3" 265 | }, 266 | "language_info": { 267 | "codemirror_mode": { 268 | "name": "ipython", 269 | "version": 3 270 | }, 271 | "file_extension": ".py", 272 | "mimetype": "text/x-python", 273 | "name": "python", 274 | "nbconvert_exporter": "python", 275 | "pygments_lexer": "ipython3", 276 | "version": "3.5.2" 277 | } 278 | }, 279 | "nbformat": 4, 280 | "nbformat_minor": 2 281 | } -------------------------------------------------------------------------------- /ch03_gaussian_filters/第三章-高斯滤波.md: -------------------------------------------------------------------------------- 1 | # 第三章 高斯滤波 2 | 3 | ## 1. 一维线性运动的汽车,位置、速度、加速度满足均值为零,协方差为1的高斯分布,时间间隔为1,假定可以设定每个时刻的加速度 4 | 5 | ### a) 最小的系统状态向量是什么 6 | 7 | 由于加速度可以设定,应当做控制变量,所以最小状态向量是位置和速度,如下 8 | $$ 9 | X=\begin{bmatrix}x_t &\dot{x}_{t}\end{bmatrix}^T 10 | $$ 11 | 12 | ### b) 设计状态转移概率$p(x_t|u_t, x_{t-1})$ 13 | 14 | 由于没有观测步骤,所以直接考虑预测步骤,根据位置、速度、加速度的关系,可以得到状态转移方程为 15 | $$ 16 | x_t=Ax_{t-1}+Bu_t+{\epsilon}_t 17 | $$ 18 | 其中 19 | $$ 20 | A=\begin{bmatrix}1 &\Delta{t} \\0 &1\end{bmatrix} = \begin{bmatrix}1 &1 \\0 &1\end{bmatrix} \\ 21 | B=\begin{bmatrix}\frac{(\Delta{t})^2}{2} \\ \Delta{t}\end{bmatrix}=\begin{bmatrix}\frac{1}{2} \\ 1\end{bmatrix} 22 | $$ 23 | 24 | 而 $$\epsilon_t$$ 由加速度产生,所以协方差矩阵$$R$$满足 25 | $$ 26 | R=\sigma^2BB^T=\begin{bmatrix}\frac{1}{4} &\frac{1}{2} \\ \frac{1}{2} &1 \end{bmatrix} 27 | $$ 28 | 29 | ### c) 假设$t=0, x_0=0, \dot{x}_0=0$,求$t=1,2,3,4,5$的状态分布 30 | 31 | 由于没有观测步骤,所以 32 | $$ 33 | \mu_t=\bar{\mu}_t \\ 34 | \Sigma_t=\bar{\Sigma}_t 35 | $$ 36 | 根据 37 | $$ 38 | \bar{\mu}_t=A_t\mu_{t-1}+B_tu_t \\ 39 | \bar{\Sigma}_t=A_t\Sigma_{t-1}A_t^T+R_t 40 | $$ 41 | 计算结果如下表所示 42 | 43 | | $$t$$ | $$\mu_t$$ | $$\Sigma_t$$ | 44 | | ----- | --------------------------------------- | ---------------------------------------------------------- | 45 | | 0 | $$\begin{bmatrix} 0 &0\end{bmatrix}^T$$ | $$\begin{bmatrix} 0 &0 \\ 0 &0 \end{bmatrix}$$ | 46 | | 1 | $$\begin{bmatrix} 0 &0\end{bmatrix}^T$$ | $$\begin{bmatrix} 0.25 &0.5 \\ 0.5 &1 \end{bmatrix}$$ | 47 | | 2 | $$\begin{bmatrix} 0 &0\end{bmatrix}^T$$ | $$\begin{bmatrix} 2.5 &2.0 \\ 2.0 &2.0 \end{bmatrix}$$ | 48 | | 3 | $$\begin{bmatrix} 0 &0\end{bmatrix}^T$$ | $$\begin{bmatrix} 8.75 &4.5 \\ 4.5 &3.0 \end{bmatrix}$$ | 49 | | 4 | $$\begin{bmatrix} 0 &0\end{bmatrix}^T$$ | $$\begin{bmatrix} 21.0 &8.0 \\ 8.0 &4.0 \end{bmatrix}$$ | 50 | | 5 | $$\begin{bmatrix} 0 &0\end{bmatrix}^T$$ | $$\begin{bmatrix} 41.25 &12.5 \\ 12.5 &5.0 \end{bmatrix}$$ | 51 | 52 | ### d) 将协方差矩阵绘制为不确定椭圆 53 | 54 | 绘制各时刻不确定椭圆如下 55 | 56 | ![ex3_1](ex3_1.png) 57 | 58 | ### e) 随着$t\to \infty$,位置和速度之间的关系会如何变化 59 | 60 | 根据变化趋势,不确定椭圆会越来越大,最终位置不确定性占主导 61 | 62 | ## 2. 加入观测步骤,假设时刻$t$测量位置为$z$,噪声方差为$\sigma^2=10$ 63 | 64 | ### a) 求观测矩阵和观测方差 65 | 66 | 观测方程为 67 | $$ 68 | z_t=Cx_t+\delta_t 69 | $$ 70 | 其中 71 | $$ 72 | C=\begin{bmatrix} 1 &0 \end{bmatrix}\\ 73 | Q_t=\sigma_z^2CC^T=10 74 | $$ 75 | 76 | ### b) 实现测量更新,假设$t=5$时,观测$z=5$,计算更新前后卡尔曼滤波的参数 77 | 78 | 根据第一题可以知道 79 | $$ 80 | \bar{\mu}_5=\begin{bmatrix} 0 &0 \end{bmatrix}^T \\ 81 | \bar{\Sigma}_5=\begin{bmatrix} 41.25 &12.5 \\ 12.5 &5.0 \end{bmatrix} 82 | $$ 83 | 根据程序3.1,可以计算卡尔曼增益以及观测更新 84 | $$ 85 | K_5=\bar{\Sigma}_5C_5^T(C_5\bar{\Sigma}_5C_5^T+Q_t)^{-1}=\begin{bmatrix} 0.8049 \\0.2439\end{bmatrix} \\ 86 | \mu_5=\bar{\mu}_5+K_5(z_5-C_5\bar{\mu}_5)=\begin{bmatrix} 4.0244 \\1.220\end{bmatrix} \\ 87 | {\Sigma}_5=(I-K_5C_5)\bar{\Sigma}_5=\begin{bmatrix} 8.0488 &2.4390 \\2.4390 &1.9512\end{bmatrix} 88 | $$ 89 | 观测更新后的不确定椭圆如蓝色区域所示,说明经过观测后,系统的不确定性得到了降低。 90 | 91 | ![ex3_2](ex3_2.png) 92 | 93 | ## 3. 使用傅里叶变换或者z变换的卷积定理证明卡尔曼滤波的预测步 94 | 95 | 这道题的本质是使用卷积公式证明高斯分布的可叠加性,首先介绍卷积公式,对于独立随机变量$$X$$和$$Y$$,变量$$Z=X+Y$$的分布满足以下关系 96 | $$ 97 | p_Z(Z)=\int_{-\infty}^{\infty}{p_X(Z-Y)p_Y(Y)dY}=p_X(Z)*p_Y(Z) 98 | $$ 99 | 100 | 傅里叶变换卷积定理为 101 | $$ 102 | F[f(t)*g(t)]=F[f(\omega)]\cdot F[g(\omega)] 103 | $$ 104 | 对于正态分布$$X \sim N(\mu_X, \Sigma_X)$$,$$Y \sim N(\mu_Y, \Sigma_Y)$$,傅里叶变换为 105 | $$ 106 | \begin{align} 107 | F[p_X(X)]&=\eta e^{-\frac{1}{2}\omega^T\Sigma_X\omega -j\omega\mu_X} \\ 108 | F[p_Y(Y)]&=\eta e^{-\frac{1}{2}\omega^T\Sigma_Y\omega -j\omega\mu_Y} \\ 109 | \end{align} 110 | $$ 111 | 对$$p_Z(Z=X+Y)$$求傅里叶变换可得 112 | $$ 113 | \begin{align} 114 | \begin{array} 115 | / F[p_Z(Z)]&=F[p_X(Z)*p_Y(Z)]=F[p_X(Z)]\cdot F[p_Y(Z)] \\ 116 | &=\eta e^{-\frac{1}{2}\omega^T(\Sigma_X+\Sigma_Y)\omega-j\omega(\mu_X+\mu_Y)} 117 | \end{array} 118 | \end{align} 119 | $$ 120 | 121 | 对式(15)做傅里叶逆变换,以及高斯函数的性质,可以推导出以下三式,这三个公式描述了高斯分布的可加性 122 | 123 | $$ 124 | \begin{align} 125 | X+Y &\sim N(\mu_X+\mu_Y, \Sigma_X + \Sigma_Y) \\ 126 | AX &\sim N(A\mu_X, A\Sigma_X A^T) \\ 127 | X+B &\sim N(\mu_X+B, \Sigma_X) 128 | \end{align} 129 | $$ 130 | 131 | 对于卡尔曼滤波的预测步 132 | $$ 133 | x_t=A_tx_{t-1}+Bu_t+\epsilon_t 134 | $$ 135 | 其中$$x_{t-1}$$和$$\epsilon_t$$为相互独立的正态分布,所以满足高斯分布的可叠加性,因此后验概率满足 136 | $$ 137 | X_t \sim N(A\mu_{t-1}+Bu_t, A\Sigma_{t-1}A^T+R_t) 138 | $$ 139 | 140 | ## 4. 假设平面机器人的状态向量为$x,y,\theta$,设初值为 141 | 142 | $$ 143 | \mu=\begin{bmatrix}0 &0 &0 \end{bmatrix}^T \\ 144 | \Sigma=\begin{bmatrix}0.01 &0 &0 \\ 0 &0.01 &0 \\ 0 &0 &10000 \end{bmatrix} 145 | $$ 146 | 147 | ### a) 机器人向前移动$d=1$个单位后,若机器人可不受噪声影响完美移动,机器人的期望位置为 148 | 149 | $$ 150 | \begin{bmatrix} x' \\y' \\ \theta'\end{bmatrix} = \begin{bmatrix} x+cos\theta \\y+sin\theta \\ \theta \end{bmatrix} 151 | $$ 152 | 153 | 画出 $x-y$ 坐标的后验,由于角度不确定性很高,机器人分布在半径为1,宽度0.02的圆环上 154 | 155 | ![ex4_1](ex4_1.png) 156 | 157 | ### b) 将该运动作为扩展卡尔曼滤波的预测步骤,定义状态转移矩阵并将其线性化,然后给出新的高斯估计 158 | 159 | 根据a) 中的运动模型,通过泰勒展开进行线性化 160 | $$ 161 | \begin{bmatrix} x' \\y' \\ \theta'\end{bmatrix} \approx 162 | \begin{bmatrix} \mu_x + \cos\theta \\ \mu_y + \sin\theta \\ \mu_{\theta} \end{bmatrix} + 163 | \begin{bmatrix} {\partial x'}/{\partial x} &{\partial x'}/{\partial y} &{\partial x'}/{\partial \theta}\\{\partial y'}/{\partial x} &{\partial y'}/{\partial y} &{\partial y'}/{\partial \theta} \\ {\partial \theta'}/{\partial x} &{\partial \theta'}/{\partial y} &{\partial \theta'}/{\partial \theta} \end{bmatrix} \begin{bmatrix} x-\mu_x \\y-\mu_y \\ \theta - \mu_{\theta}\end{bmatrix}\\ 164 | =\begin{bmatrix} \mu_x + cos\theta \\ \mu_y + sin\theta \\ \mu_{\theta} \end{bmatrix} 165 | +\begin{bmatrix} 1 &0 &-\sin\theta \\0 &1 &cos\theta \\ 0 &0 &1 \end{bmatrix} \begin{bmatrix} x-\mu_x \\y-\mu_y \\ \theta - \mu_{\theta}\end{bmatrix} \\ 166 | $$ 167 | 上式中 168 | $$ 169 | \begin{bmatrix} x-\mu_x \\y-\mu_y \\ \theta - \mu_{\theta}\end{bmatrix}\sim N(0, \Sigma) 170 | $$ 171 | 根据高斯分布的可加性 172 | $$ 173 | \begin{bmatrix} x' \\y' \\ \theta'\end{bmatrix} \sim N(\begin{bmatrix} \mu_x + cos\theta \\ \mu_y + sin\theta \\ \mu_{\theta} \end{bmatrix},G\Sigma G^T+R) 174 | $$ 175 | 其中 176 | $$ 177 | G= \begin{bmatrix} 1 &0 &-\sin\theta \\0 &1 &cos\theta \\ 0 &0 &1 \end{bmatrix} 178 | $$ 179 | 180 | ### c) 画出不确定椭圆并与凭直觉得到的解决方案进行比较 181 | 182 | 当$\theta = 0$时, 183 | $$ 184 | G=\begin{bmatrix} 1 &0 &0 \\0 &1 &1 \\ 0 &0 &1 \end{bmatrix} \\ 185 | \Sigma'=G\Sigma G^T=\begin{bmatrix} 0.01 &0 &0 \\0 &10000 &10000 \\ 0 &10000 &10000 \end{bmatrix} 186 | $$ 187 | 不考虑角度的话,可以发现Y方向的不确定性远大于X方向,分布为长轴远大于短轴的椭圆 188 | 189 | ### d) 考虑测量问题,测量是机器人位置在$x$轴的投影,协方差为0.01,给出扩展卡尔曼滤波的准确结果,并与直觉分析的结果进行比较 190 | 191 | 测量矩阵是线性的 192 | $$ 193 | Z=CX=\begin{bmatrix} 1 &0 &0\end{bmatrix} \begin{bmatrix} x' \\y' \\ \theta' \end{bmatrix} \\ 194 | Q = 0.01 195 | $$ 196 | 按照卡尔曼滤波的预测步 197 | $$ 198 | \mu_f = \begin{bmatrix} 1 &0 &0\end{bmatrix} \\ 199 | \Sigma_f = \begin{bmatrix} 0.005 &0 &0 \\0 &20000 &20000 \\0 &20000 &20000\end{bmatrix} 200 | $$ 201 | 可以发现,$x$方向不确定性在缩小,但是$y$方向不确定性在放大 202 | 203 | ### e) 讨论后验估计和扩展卡尔曼滤波产生的高斯分布之间的差异,这些差异有多显著?可以改变什么使近似更准确?如果初始方向已知,但不知道机器人的y坐标,会发生什么? 204 | 205 | 可以通过降低方差来使得近似更加准确。 206 | 207 | 若初始方向已知,不确定机器人的Y坐标,该系统的协方差为 208 | $$ 209 | \Sigma = \begin{bmatrix} 0.01 &0 &0 \\ 0 &10000 &0 \\ 0 &0 &0.01 \end{bmatrix} 210 | $$ 211 | 那么经过卡尔曼滤波 212 | $$ 213 | \bar{\mu}=\begin{bmatrix} 1 &0 &0\end{bmatrix} \\ 214 | \bar{\Sigma} = \begin{bmatrix} 0.01 &0 &0 \\ 0 &10000 &0.01 \\ 0 &0.01 &0.01 \end{bmatrix} \\ 215 | \Sigma = \begin{bmatrix} 0.005 &0 &0 \\ 0 &10000 &0.01 \\ 0 &0.01 &0.01 \end{bmatrix} 216 | $$ 217 | 可以发现如果$y$方向未知,不确定性并不会传导到其他两个方向 218 | 219 | ## 5. 书中给出的卡尔曼滤波中缺少一个常数附加项,将其扩展为包含这样的项 220 | 221 | 首先给出有常数项的预测模型和观测模型 222 | $$ 223 | \bar{x}_t=A_tx_{t-1}+B_tu_t+D_x+\epsilon_t \\ 224 | z_t=C_t x_t+D_z+\delta_t 225 | $$ 226 | 227 | 228 | 可得 229 | $$ 230 | \begin{align} 231 | \bar{\mu}_t&=A_t(\mu_{t-1}+D_x)+B_tu_t \\ 232 | \bar{\Sigma}_t&=A_t\Sigma_{t-1}A^T+R_t \\ 233 | K_t&=\bar{\Sigma}_tC_t^T(C_t\bar{\Sigma}_tC_t^T+Q_t)^{-1} \\ 234 | \mu_t&=\bar{\mu}_t+K_t(z_t-C_t\bar{\mu}_t-D_z) \\ 235 | \Sigma_t&=(I-K_tC_t)\bar{\Sigma}_t 236 | \end{align} 237 | $$ 238 | 239 | ## 6. 通过实例证明在多变量高斯分布中稀疏信息矩阵的存在,它将所有变量用$\epsilon$接近于1的相关系数联系起来。 240 | 241 | **稀疏矩阵的定义**:除了常数个元素外,矩阵其他每一行和每一列的元素都为0。 242 | 243 | 并不明白这道题想要考察的是什么。 -------------------------------------------------------------------------------- /ch03_gaussian_filters/第三章-高斯滤波.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yu-Xiaoxian/probabilistic_robotics_exercises/a10c5e27020b2b3c6fe708c99698a69c6e9a6b48/ch03_gaussian_filters/第三章-高斯滤波.pdf -------------------------------------------------------------------------------- /ch04_nonparametric_filters/ch04_nonparametric_filters.py: -------------------------------------------------------------------------------- 1 | # MIT License 2 | 3 | # Copyright (c) [2020] [Yu-Xiaoxian and other contributors] 4 | 5 | # Permission is hereby granted, free of charge, to any person obtaining a copy 6 | # of this software and associated documentation files (the "Software"), to deal 7 | # in the Software without restriction, including without limitation the rights 8 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | # copies of the Software, and to permit persons to whom the Software is 10 | # furnished to do so, subject to the following conditions: 11 | 12 | # The above copyright notice and this permission notice shall be included in all 13 | # copies or substantial portions of the Software. 14 | 15 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | # SOFTWARE 22 | 23 | import numpy as np 24 | import math 25 | import matplotlib.pyplot as plt 26 | from mpl_toolkits.mplot3d import Axes3D 27 | 28 | print("Chapter 4: Nonparametric Filters") 29 | print("") 30 | print("#############") 31 | print("Exercise 4.1:") 32 | 33 | A=np.mat([[1, 1], [0, 1]]) 34 | B=np.mat([[0.5], [1.0]]) 35 | mu=np.mat([[0], [0]]) 36 | R=B*B.T 37 | Sigma=np.mat([[2.5, 2.0], [2.0, 2.0]]) 38 | 39 | fig=plt.figure() 40 | 41 | ax = fig.add_subplot(1,1,1, projection='3d') 42 | X=np.arange(-10, 10, 1.10) 43 | X_dot=np.arange(-10, 10, 1.10) 44 | X, X_dot=np.meshgrid(X, X_dot) 45 | P_bar=np.zeros(X.shape) 46 | 47 | # calculate probabilitics 48 | for i in range(P_bar.shape[0]): 49 | for j in range(P_bar.shape[1]): 50 | X_temp=np.mat([[X[i][j]], [X_dot[i][j]]]) 51 | P_bar[i][j]=math.pow(math.e, -1.0/2.0 * X_temp.T * Sigma.I * X_temp) 52 | 53 | ax.plot_surface(X, X_dot, P_bar, rstride=1, cstride=1, cmap='rainbow') 54 | 55 | plt.show() 56 | -------------------------------------------------------------------------------- /ch04_nonparametric_filters/第四章-非参数滤波.md: -------------------------------------------------------------------------------- 1 | # 第四章 非参数滤波 2 | ## 1. 对前面章节讨论的线性系统进行直方图滤波 3 | 4 | ### a). 对3.1的动态系统进行直方图滤波,绘制$t=1,2,...,5$每个时刻的$x,\dot{x}$联合概率分布 5 | 6 | ### b). 对3.2的观测步骤进行直方图滤波,对比观测更新前和更新后的概率分布 7 | 8 | ## 2. 对习题3.4进行直方图滤波实现 9 | 10 | ### a). 为直方图滤波建议一个合适的初值估计 11 | 12 | ### b). 实现直方图滤波预测步骤并与EKF的结果进行对比 13 | 14 | ### c). 将测量归并入估计,将结果与EKF进行比较 15 | 16 | ## 3. 本章讨论了使用单一粒子,如果M=2时会怎样? 17 | 18 | ## 4. 使用粒子滤波实现习题4.1 19 | 20 | ## 5. 使用粒子滤波实现习题4.2 21 | 22 | -------------------------------------------------------------------------------- /ch05_robot_motion/Ex5_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yu-Xiaoxian/probabilistic_robotics_exercises/a10c5e27020b2b3c6fe708c99698a69c6e9a6b48/ch05_robot_motion/Ex5_4.png -------------------------------------------------------------------------------- /ch05_robot_motion/第五章-机器人运动.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第五章 机器人运动\n", 8 | "\n", 9 | "## 1. 本章所有机器人模型都是运动学的(kinematic),现考虑动力学(dynamic)。假设一维坐标系中的机器人,$x$ 表示位置,$\\dot{x}$ 表示速度,$\\ddot{x}$ 表示加速度,假设加速度是给定加速度与高斯噪声$N(0,\\sigma^2)$ 之和,并且在$\\Delta t$ 时间内保持恒定。请问经过$\\Delta t$ 时间后的 $x'$ 与 $\\dot{x}'$ 相关吗?为什么?" 10 | ] 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "metadata": {}, 15 | "source": [ 16 | "首先给出机器人的状态转移方程\n", 17 | "$$\n", 18 | "\\begin{align}\n", 19 | "\\begin{bmatrix} x' \\\\ \\dot{x}'\\end{bmatrix} &=\n", 20 | "\\begin{bmatrix} x + \\dot{x} \\Delta t + \\frac{1}{2} \\ddot{x} \\Delta t^2 \\\\ \\dot{x} + \\ddot{x} \\Delta t\\end{bmatrix} \n", 21 | "\\end{align}\n", 22 | "$$" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "可以发现$x'=x + \\dot{x}' \\Delta t - \\frac{1}{2} \\ddot{x} \\Delta t^2$,即已知$\\dot{x}'$可以唯一确定 $x'$,所以$x'$和$\\dot{x}'$两者相关,且为强相关。" 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "## 2. 为题目5.1中的后验分布提供数学公式,并指出值得注意的部分" 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "metadata": {}, 42 | "source": [ 43 | "根据习题5.1中的运动方程\n", 44 | "$$\n", 45 | "\\begin{align}\n", 46 | "\\begin{bmatrix} x' \\\\ \\dot{x}'\\end{bmatrix} &=\n", 47 | "\\begin{bmatrix} x + \\dot{x} \\Delta t + \\frac{1}{2} \\ddot{x} \\Delta t^2 \\\\ \\dot{x} + \\ddot{x} \\Delta t\\end{bmatrix} \\\\\n", 48 | "&=\\begin{bmatrix} x + \\dot{x} \\Delta t + \\frac{1}{2} \\hat{\\ddot{x}} \\Delta t^2 \\\\ \\dot{x} + \\hat{\\ddot{x}} \\Delta t\\end{bmatrix} \n", 49 | "+ \\begin{bmatrix} \\frac{1}{2} \\epsilon \\Delta t^2 \\\\ \\epsilon \\Delta t \\end{bmatrix} \\\\\n", 50 | "&=\\begin{bmatrix} 1 &\\Delta t \\\\ 0 &1 \\end{bmatrix} \\begin{bmatrix} x \\\\ \\dot{x}\\end{bmatrix} + \\begin{bmatrix} \\frac{1}{2} (\\Delta t)^2 \\\\ \\Delta t \\end{bmatrix} \\hat{\\ddot{x}} + \\begin{bmatrix} \\frac{1}{2} (\\Delta t)^2 \\\\ \\Delta t \\end{bmatrix} \\epsilon\n", 51 | "\\end{align}\n", 52 | "$$" 53 | ] 54 | }, 55 | { 56 | "cell_type": "markdown", 57 | "metadata": {}, 58 | "source": [ 59 | "其中$\\epsilon \\sim N(0, \\sigma^2)$ 服从高斯分布,令$A= \\begin{bmatrix} 1 &\\Delta t \\\\ 0 &1 \\end{bmatrix}$, $ B = \\begin{bmatrix} \\frac{1}{2} (\\Delta t)^2 \\\\ \\Delta t \\end{bmatrix} $, $ R = B\\sigma^2 B^T$,可以得到后验分布的公式如下" 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "metadata": {}, 65 | "source": [ 66 | "$$\n", 67 | "\\begin{align}\n", 68 | "p(X'|X,U) &= p(\\begin{bmatrix} x' \\\\ \\ddot{x}'\\end{bmatrix} | \\begin{bmatrix} x \\\\ \\ddot{x}\\end{bmatrix}, \\ddot{x}) \\\\\n", 69 | "&\\sim N(\\begin{bmatrix} x' \\\\ \\ddot{x}'\\end{bmatrix} - A\\begin{bmatrix} x \\\\ \\ddot{x}\\end{bmatrix} - B \\ddot{x}, R)\n", 70 | "\\end{align}\n", 71 | "$$" 72 | ] 73 | }, 74 | { 75 | "cell_type": "markdown", 76 | "metadata": {}, 77 | "source": [ 78 | "## 3. 假设控制机器人在$T$ 时间间隔具有随机加速度,最终$x$ 和$\\dot{x}$ 是相关的吗?随着$T \\to \\infty$ 依然是相关的吗?是确定的函数吗?" 79 | ] 80 | }, 81 | { 82 | "cell_type": "markdown", 83 | "metadata": {}, 84 | "source": [ 85 | "为判断$x$和$\\dot{x}$的相关性,首先需要推导$X$的协方差矩阵,根据卡尔曼滤波公式我们可以知道\n", 86 | "$$\n", 87 | "\\begin{align}\n", 88 | "\\Sigma_{n+1} &= A\\Sigma_n A^T + R_0 \\\\\n", 89 | "\\Sigma_0 &= \\begin{bmatrix} 0 &0 \\\\0 &0 \\end{bmatrix}\n", 90 | "\\end{align}\n", 91 | "$$\n", 92 | "为方便计算,可以向量化\n", 93 | "$$\n", 94 | "\\begin{bmatrix} \\sigma_{X,n+1}^2 \\\\ \\sigma_{XY,n+1} \\\\ \\sigma_{XY,n+1} \\\\ \\sigma_{Y,n+1}^2 \\end{bmatrix} = \n", 95 | "\\begin{bmatrix} 1 &\\Delta t & \\Delta t & (\\Delta t)^2 \\\\ 0 &1 &0 &\\Delta t \\\\ 0 &0 &1 &\\Delta t \\\\ 0 &0 &0 &1 \\end{bmatrix}\n", 96 | "\\begin{bmatrix} \\sigma_{X,n}^2 \\\\ \\sigma_{XY,n}^2 \\\\ \\sigma_{XY,n}^2 \\\\ \\sigma_{Y,n}^2 \\end{bmatrix}\n", 97 | "+ \\sigma^2 \\begin{bmatrix} \\frac{1}{4}(\\Delta t)^4 \\\\ \\frac{1}{2}(\\Delta t)^3 \\\\ \\frac{1}{2}(\\Delta t)^3 \\\\ (\\Delta t)^2 \\end{bmatrix}\n", 98 | "$$" 99 | ] 100 | }, 101 | { 102 | "cell_type": "markdown", 103 | "metadata": {}, 104 | "source": [ 105 | "于是可得\n", 106 | "$$\n", 107 | "vec(\\Sigma_{n+1}) = (A\\otimes A)^n vec(\\Sigma_0) + (\\sum_{i=0}^{n-1}(A \\otimes A)^i) vec(R) \\\\\n", 108 | "$$\n", 109 | "其中$(A\\otimes A)$代表矩阵的[克罗内克积](https://baike.baidu.com/item/克罗内克积/6282573),他的幂次满足\n", 110 | "$$\n", 111 | "(A\\otimes A)^n = \\begin{bmatrix} 1 &n \\Delta t & n \\Delta t & n^2 (\\Delta t)^2 \\\\ 0 &1 &0 &n \\Delta t \\\\ 0 &0 &1 &n \\Delta t \\\\ 0 &0 &0 &1 \\end{bmatrix}\n", 112 | "$$" 113 | ] 114 | }, 115 | { 116 | "cell_type": "markdown", 117 | "metadata": {}, 118 | "source": [ 119 | "可以得到协方差矩阵各项的值\n", 120 | "$$\n", 121 | "\\begin{align}\n", 122 | "\\sigma_{X,n}^2 &= \\sigma^2 \\sum_{i=0}^{n-1}(\\frac{1}{4}(\\Delta t)^4 + n(\\Delta t)^4 + n^2(\\Delta t)^4)\\\\\n", 123 | "\\sigma_{XY,n} &= \\sigma^2 \\sum_{i=0}^{n-1}(\\frac{1}{2}(\\Delta t)^3 + n(\\Delta t)^3) \\\\\n", 124 | "\\sigma_{Y,n}^2 &= \\sigma^2 \\sum_{i=0}^{n-1}((\\Delta t)^2)\n", 125 | "\\end{align}\n", 126 | "$$" 127 | ] 128 | }, 129 | { 130 | "cell_type": "markdown", 131 | "metadata": {}, 132 | "source": [ 133 | "当$T\\to \\infty$时\n", 134 | "$$\n", 135 | "\\begin{align}\n", 136 | "\\lim_{n \\to \\infty}{\\sigma_{X,n}^2} &= \\frac{n(n-1)(2n-1)}{6}\\sigma^2 (\\Delta t)^4 = \\frac{n^3}{3}\\sigma^2 (\\Delta t)^4\\\\\n", 137 | "\\lim_{n \\to \\infty}\\sigma_{XY,n} &= \\frac{n(n-1)}{2}\\sigma^2 (\\Delta t)^3 = \\frac{n^2}{2}\\sigma^2 (\\Delta t)^3\\\\\n", 138 | "\\lim_{n \\to \\infty}\\sigma_{Y,n}^2 &= n \\sigma^2 (\\Delta t)^2\n", 139 | "\\end{align}\n", 140 | "$$" 141 | ] 142 | }, 143 | { 144 | "cell_type": "markdown", 145 | "metadata": {}, 146 | "source": [ 147 | "相关系数为\n", 148 | "$$\n", 149 | "\\rho = \\frac{\\sigma_{XY,n}}{\\sqrt{\\sigma_{X,n}^2 \\sigma_{X,n}^2}} = \\frac{1/2}{\\sqrt{1/3 1}}= \\frac{\\sqrt{3}}{2}\n", 150 | "$$\n", 151 | "显然相关系数小于1, 所以当$T\\to \\infty$时,$x$和$\\dot{x}$不再相关" 152 | ] 153 | }, 154 | { 155 | "cell_type": "markdown", 156 | "metadata": {}, 157 | "source": [ 158 | "## 4. 考虑简单理想自行车模型,轮胎直径为$d$,安装在长度为$l$ 的框架上,前轮绕竖直轴线转动,转角为$\\alpha$,后轮与车框架保持平行不能转动。 自行车位姿使用三个变量定义:前轮中心位置$x,y$,自行车框架的角度$\\theta$,控制是速度$v$和前轮转角$\\alpha$,并在每一个预测周期内恒定。假定$v$和$\\alpha$ 受高斯噪声影响,请给出$\\Delta t$ 时间间隔的预测模型。" 159 | ] 160 | }, 161 | { 162 | "cell_type": "markdown", 163 | "metadata": {}, 164 | "source": [ 165 | "如下图所示,自行车框架角度为$\\theta$,车头与自行车框架为$\\alpha$,自行车框架速度沿自行车方向,大小为$v$,而自行车车头速度沿车头方向,由于自行车为刚体,所以车头速度在自行车框架方向上的投影为$v$,从而可以求出自行车车头速度为$\\frac{v}{\\cos\\alpha}$\n", 166 | "\n", 167 | "自行车的瞬时旋转的中心是车体垂线和车头垂线的交点,可以求出自行车旋转半径为$\\frac{v \\Delta t}{l}$\n", 168 | "![自行车模型](Ex5_4.png)" 169 | ] 170 | }, 171 | { 172 | "cell_type": "markdown", 173 | "metadata": {}, 174 | "source": [ 175 | "设当前系统状态为$X_t=\\begin{bmatrix}x_t \\\\y_t \\\\ \\theta_t \\end{bmatrix}$,控制$U_t = \\begin{bmatrix}v \\\\ \\alpha \\end{bmatrix}$,那么下一时刻系统的状态$X_{t+1}$为\n", 176 | "$$\n", 177 | "\\begin{bmatrix}x_{t+1} \\\\y_{t+1} \\\\ \\theta_{t+1} \\end{bmatrix} = \n", 178 | "\\begin{bmatrix}\n", 179 | "x_t + v \\Delta t \\cos \\theta_t - v \\Delta t \\tan \\alpha \\sin \\theta_t \\\\ \n", 180 | "y_t + v \\Delta t \\sin \\theta_t + v \\Delta t \\tan \\alpha \\cos \\theta_t \\\\ \n", 181 | "\\theta_t + \\frac{v \\Delta t}{l} \\tan \\alpha \\end{bmatrix}\n", 182 | "$$" 183 | ] 184 | }, 185 | { 186 | "cell_type": "markdown", 187 | "metadata": {}, 188 | "source": [ 189 | "## 5. 考虑5.4中的运动学模型,在同样噪声假设下实现自行车后验位姿的采样函数。假设$l=100cm$,$d=80cm$,$\\Delta t=1s$,$|\\alpha|\\leq 80°$,$v \\in [0;100]cm/s$。转向角方差$\\sigma_{\\alpha}^2=25°^2$,速度方差$\\sigma_v^2=(50cm^2/s^2)v^2$,注意速度方差与速度相关。请画出多组控制参数产生的采样集。\n", 190 | "\n", 191 | "| 问题编号 | $\\alpha$ | $v$ |\n", 192 | "|---------|-------------|----------|\n", 193 | "| 1 | $25°$ | $20cm/s$|\n", 194 | "| 2 | $-25°$ | $20cm/s$|\n", 195 | "| 3 | $25°$ | $90cm/s$|\n", 196 | "| 4 | $80°$ | $10cm/s$|\n", 197 | "| 5 | $80°$ | $90cm/s$|" 198 | ] 199 | }, 200 | { 201 | "cell_type": "markdown", 202 | "metadata": {}, 203 | "source": [ 204 | "首先实现5.4中的机器人模型" 205 | ] 206 | }, 207 | { 208 | "cell_type": "code", 209 | "execution_count": 37, 210 | "metadata": {}, 211 | "outputs": [ 212 | { 213 | "data": { 214 | "text/plain": [ 215 | "array([[0.],\n", 216 | " [0.],\n", 217 | " [0.]])" 218 | ] 219 | }, 220 | "execution_count": 37, 221 | "metadata": {}, 222 | "output_type": "execute_result" 223 | } 224 | ], 225 | "source": [ 226 | "import numpy as np\n", 227 | "\n", 228 | "def bicycle_model(X_t, U_t):\n", 229 | " l = 1.0\n", 230 | " d = 0.8\n", 231 | " n = U_t.shape[1]\n", 232 | " X_t_1 = np.zeros((3,n))\n", 233 | " for i in range(n):\n", 234 | " X_t_1[0,i] = X_t[0,0] + U_t[1,i]*np.math.cos(X_t[2,0]) - U_t[1,i]*np.math.tan(U_t[0,i])*np.math.sin(X_t[2,0])\n", 235 | " X_t_1[1,i] = X_t[1,0] + U_t[1,i]*np.math.sin(X_t[2,0]) + U_t[1,i]*np.math.tan(U_t[0,i])*np.math.cos(X_t[2,0])\n", 236 | " X_t_1[2,i] = X_t[2,0] + U_t[1,i]/l * np.math.tan(U_t[0,i])\n", 237 | " return X_t_1\n", 238 | " \n", 239 | "X_t = np.zeros((3,1))\n", 240 | "U_t = np.zeros((2,1))\n", 241 | "bicycle_model(X_t, U_t)" 242 | ] 243 | }, 244 | { 245 | "cell_type": "code", 246 | "execution_count": 49, 247 | "metadata": {}, 248 | "outputs": [ 249 | { 250 | "data": { 251 | "image/png": "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\n", 252 | "text/plain": [ 253 | "
" 254 | ] 255 | }, 256 | "metadata": { 257 | "needs_background": "light" 258 | }, 259 | "output_type": "display_data" 260 | } 261 | ], 262 | "source": [ 263 | "import matplotlib.pyplot as plt\n", 264 | "\n", 265 | "Us = np.mat([[25,-25,25,80,80],[0.2,0.2,0.9,0.1,0.9]])\n", 266 | "Us[0,:] = Us[0,:]*np.math.pi/180.0\n", 267 | "sigma = np.mat([[25*np.math.pow(np.math.pi/180.0,2),0],[0,0.25]])\n", 268 | "sample_num = 100\n", 269 | "X_t = np.mat([[0],[0],[0]])\n", 270 | "\n", 271 | "fig = plt.figure()\n", 272 | "for i in range(Us.shape[1]):\n", 273 | " ax = fig.add_subplot(2,3,i+1)\n", 274 | " U_t = Us[:,i]\n", 275 | " U_mean = np.array([U_t[0,0], U_t[1,0]])\n", 276 | " sigma_t = np.matmul(np.diag([1,np.math.pow(U_t[1,0],2)]),sigma)\n", 277 | " U_ts = np.random.multivariate_normal(mean=U_mean, cov=sigma_t, size=sample_num)\n", 278 | " X_t_1s = bicycle_model(X_t, U_ts.T)\n", 279 | " ax.scatter(X_t_1s[0,:], X_t_1s[1,:], marker='.') \n", 280 | "\n", 281 | "plt.show()" 282 | ] 283 | }, 284 | { 285 | "cell_type": "markdown", 286 | "metadata": {}, 287 | "source": [ 288 | "## 6. 考虑5.4中运动模型,给定初始状态$x$、$y$、$\\theta$和最终$x'$、$y'$(没有$\\theta'$),计算最可能的$\\alpha$,$v$、$\\theta'$,给出数学公式。" 289 | ] 290 | }, 291 | { 292 | "cell_type": "markdown", 293 | "metadata": {}, 294 | "source": [ 295 | "需要求解5.4中运动模型的逆运动学,根据运动学分析可得,车头运动方向为$\\alpha+\\theta$,于是有\n", 296 | "$$\n", 297 | "\\begin{align}\n", 298 | "\\alpha &= atan(\\frac{y'-y}{x'-x}) - \\theta \\\\\n", 299 | "v &= \\frac{x'-x}{(\\cos\\theta - \\tan\\alpha \\sin\\theta)\\Delta t} \\\\\n", 300 | "\\theta' &= \\theta + \\frac{v \\Delta t}{l} \\tan\\alpha\n", 301 | "\\end{align}\n", 302 | "$$" 303 | ] 304 | }, 305 | { 306 | "cell_type": "markdown", 307 | "metadata": {}, 308 | "source": [ 309 | "## 7. 假定机器人的驱动器是完整的,具有与姿态为数相同的自由度,能够控制前向速度,正交侧向速度,以及旋转角速度,请给出:\n", 310 | "- 机器人的数学模型(控制量受独立高斯噪声影响)\n", 311 | "- 计算$p(x_t|u_t, x_{t-1})$\n", 312 | "- 给出采样$x\\sim p(x_t|u_t, x_{t-1})$的过程" 313 | ] 314 | }, 315 | { 316 | "cell_type": "markdown", 317 | "metadata": {}, 318 | "source": [ 319 | "设前向速度为$v_f$,侧向速度为$v_p$,旋转角速度为$\\omega$,可以得到运动学模型如下\n", 320 | "$$\n", 321 | "\\begin{align}\n", 322 | "x_{t+1} &= x_t + (v_f \\cos \\theta_t - v_p \\sin \\theta_t)\\Delta t \\\\\n", 323 | "y_{t+1} &= y_t + (v_f \\sin \\theta_t + v_p \\cos \\theta_t)\\Delta t \\\\\n", 324 | "\\theta_{t+1} &= \\theta_t + \\omega \\Delta t \\\\\n", 325 | "\\end{align}\n", 326 | "$$" 327 | ] 328 | }, 329 | { 330 | "cell_type": "markdown", 331 | "metadata": {}, 332 | "source": [ 333 | "为求$p(x_{t+1}|u_t,x_t)$,需要求运动学逆解,由于\n", 334 | "$$\n", 335 | "\\begin{bmatrix} x_{t+1} - x_t \\\\ y_{t+1} - y_t \\end{bmatrix} = \\begin{bmatrix} \\cos \\theta_t & -\\sin \\theta_t \\\\ \\sin \\theta_t & \\cos \\theta_t \\end{bmatrix} \\begin{bmatrix} v_f \\\\ v_p \\end{bmatrix}\n", 336 | "$$\n", 337 | "所以\n", 338 | "$$\n", 339 | "\\begin{bmatrix} v_f \\\\ v_p \\end{bmatrix} = \\begin{bmatrix} \\cos \\theta_t & -\\sin \\theta_t \\\\ \\sin \\theta_t & \\cos \\theta_t \\end{bmatrix}^{-1} \\begin{bmatrix} x_{t+1} - x_t \\\\ y_{t+1} - y_t \\end{bmatrix}\n", 340 | "$$\n", 341 | "得到运动学逆解为\n", 342 | "$$\n", 343 | "\\begin{align}\n", 344 | "v_f &= \\frac{(x_{t+1} - x_t) \\cos \\theta_t + (y_{t+1} - y_t) \\sin \\theta_t}{\\Delta t} \\\\\n", 345 | "v_p &= \\frac{-(x_{t+1} - x_t) \\sin \\theta_t + (y_{t+1} - y_t) \\cos \\theta_t}{\\Delta t} \\\\\n", 346 | "\\omega &= \\frac{\\theta_{t+1} - \\theta_t}{\\Delta t}\n", 347 | "\\end{align}\n", 348 | "$$" 349 | ] 350 | }, 351 | { 352 | "cell_type": "markdown", 353 | "metadata": {}, 354 | "source": [ 355 | "## 8. 证明式(5.12)的三角分布均值为$0$,方差为$b^2$" 356 | ] 357 | }, 358 | { 359 | "cell_type": "markdown", 360 | "metadata": {}, 361 | "source": [ 362 | "根据式(5.12)三角分布的概率密度函数为\n", 363 | "$$\n", 364 | "p_{tri}(x) = max\\{0, \\frac{1}{\\sqrt{6}b} - \\frac{|x|}{6b^2}\\}\n", 365 | "$$\n", 366 | "可以发现,概率密度函数为分段函数,取值范围在$x \\in [-\\sqrt{6}b, \\sqrt{6}b]$" 367 | ] 368 | }, 369 | { 370 | "cell_type": "markdown", 371 | "metadata": {}, 372 | "source": [ 373 | "根据均值和方差的定义,可得\n", 374 | "$$\n", 375 | "\\begin{align}\n", 376 | "\\mu_{tri} &= \\int_{-\\infty}^{+\\infty} p_{tri}(x) x dx \\\\\n", 377 | "&= \\int_{-\\sqrt{6}b}^{+\\sqrt{6}b} p_{tri}(x) x dx \\\\\n", 378 | "&= \\int_{-\\sqrt{6}b}^{0} (\\frac{1}{\\sqrt{6}b} +\\frac{x}{6b^2}) x dx + \\int_{0}^{+\\sqrt{6}b} (\\frac{1}{\\sqrt{6}b} - \\frac{x}{6b^2}) x dx \\\\ \n", 379 | "&= \\int_{-\\sqrt{6}b}^{+\\sqrt{6}b} \\frac{1}{\\sqrt{6}b} xdx + \\int_{-\\sqrt{6}b}^{0} \\frac{x^2}{6b^2} dx - \\int_{0}^{+\\sqrt{6}b}\\frac{x^2}{6b^2} dx \\\\\n", 380 | "&=\\frac{1}{\\sqrt{6}b} \\frac{1}{2} x^2 |_{-\\sqrt{6}b}^{\\sqrt{6}b} + \\frac{1}{6b^2} \\frac{1}{3} x^3 |_{-\\sqrt{6}b}^{0} - \\frac{1}{6b^2} \\frac{1}{3} x^3 |_{0}^{\\sqrt{6}b} \\\\\n", 381 | "&=0 + \\frac{\\sqrt{6}}{3}b - \\frac{\\sqrt{6}}{3}b \\\\\n", 382 | "&=0\n", 383 | "\\end{align}\n", 384 | "$$" 385 | ] 386 | }, 387 | { 388 | "cell_type": "markdown", 389 | "metadata": {}, 390 | "source": [ 391 | "$$\n", 392 | "\\begin{align}\n", 393 | "\\sigma_{tri} &= \\int_{-\\infty}^{+\\infty}p_{tri}(x) (x - \\mu_{tri})^2 dx \\\\\n", 394 | "&= \\int_{-\\sqrt{6}b}^{+\\sqrt{6}b}p_{tri}(x) x^2 dx \\\\\n", 395 | "&= \\int_{-\\sqrt{6}b}^{0} (\\frac{1}{\\sqrt{6}b} +\\frac{x}{6b^2}) x^2 dx + \\int_{0}^{+\\sqrt{6}b} (\\frac{1}{\\sqrt{6}b} - \\frac{x}{6b^2}) x^2 dx \\\\ \n", 396 | "&= \\int_{-\\sqrt{6}b}^{+\\sqrt{6}b} \\frac{1}{\\sqrt{6}b} x^2dx + \\int_{-\\sqrt{6}b}^{0} \\frac{x^3}{6b^2} dx - \\int_{0}^{+\\sqrt{6}b}\\frac{x^3}{6b^2} dx \\\\\n", 397 | "&=\\frac{1}{\\sqrt{6}b} \\frac{1}{3} x^3 |_{-\\sqrt{6}b}^{\\sqrt{6}b} + \\frac{1}{6b^2} \\frac{1}{4} x^4 |_{-\\sqrt{6}b}^{0} - \\frac{1}{6b^2} \\frac{1}{4} x^4 |_{0}^{\\sqrt{6}b} \\\\\n", 398 | "&= 4b^2 -\\frac{3}{2}b^2 -\\frac{3}{2}b^2 \\\\\n", 399 | "&= b^2\n", 400 | "\\end{align}\n", 401 | "$$" 402 | ] 403 | } 404 | ], 405 | "metadata": { 406 | "kernelspec": { 407 | "display_name": "Python 3", 408 | "language": "python", 409 | "name": "python3" 410 | }, 411 | "language_info": { 412 | "codemirror_mode": { 413 | "name": "ipython", 414 | "version": 3 415 | }, 416 | "file_extension": ".py", 417 | "mimetype": "text/x-python", 418 | "name": "python", 419 | "nbconvert_exporter": "python", 420 | "pygments_lexer": "ipython3", 421 | "version": "3.5.2" 422 | } 423 | }, 424 | "nbformat": 4, 425 | "nbformat_minor": 4 426 | } 427 | -------------------------------------------------------------------------------- /ch06_robot_perception/第六章-机器人感知.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第六章 机器人感知" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "## 1. 假设一个十字标志在天花板上,位置为$x_m$,$y_m$,$\\theta_m$,使用相机观测标志的坐标为$x_i$,$y_i$,$\\theta_i$,相机焦距为$f$,天花板高度为$h$,那么$x-y$平面的平移$d$投影到图像平面后为$d\\frac{f}{h}$,请问:\n", 15 | "- a): 当图像坐标为$(x_i, y_i, \\theta_i)$,机器人位置为$(x_r, y_r, \\theta_r)$时,求出十字标志的位置$(x_m, y_m, \\theta_m)$\n", 16 | "- b): 给出由机器人位置$(x_r, y_r, \\theta_r)$和标记坐标$(x_m, y_m, \\theta_m)$确定图像坐标$(x_i, y_i, \\theta_i)$的公式\n", 17 | "- c): 给出由标记坐标$(x_m, y_m, \\theta_m)$和图像坐标$(x_i, y_i, \\theta_i)$确定机器人位置$(x_r, y_r, \\theta_r)$的公式\n", 18 | "- d): 假设有多个坐标,讨论需要多少个标志可以唯一确定机器人的位置\n", 19 | "注意:十字坐标是对称的" 20 | ] 21 | }, 22 | { 23 | "cell_type": "markdown", 24 | "metadata": {}, 25 | "source": [ 26 | "### a) 已知图像坐标和机器人位置坐标,求标志位置\n", 27 | "图像坐标系与机器人坐标系一致,可以求得十字标志的坐标为\n", 28 | "$$\n", 29 | "\\begin{bmatrix} x_m \\\\ y_m \\\\ \\theta_m \\end{bmatrix} = \\begin{bmatrix} x_r \\\\ y_r\\\\ \\theta_r \\end{bmatrix} + \\begin{bmatrix} \\cos \\theta_r & -\\sin \\theta_r &0 \\\\ \\sin \\theta_r & \\cos \\theta_r &0 \\\\ 0 &0 &1\\end{bmatrix} \\begin{bmatrix} x_i \\frac{h}{f} \\\\ y_i \\frac{h}{f} \\\\ \\theta_i \\end{bmatrix}\n", 30 | "$$\n", 31 | "考虑坐标的对称性,图像坐标的可能取值有四种$\\theta_i + \\frac{k\\pi}{2}(k=0,1,2,3)$,因此标志坐标的角度也有四种取值$\\theta_m + \\frac{k\\pi}{2}(k=0,1,2,3)$" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "### b) 已知机器人位置和标记坐标,求图像坐标\n", 39 | "根据a)中公式可以方便推导出\n", 40 | "$$\n", 41 | "\\begin{bmatrix} x_i \\\\ y_i \\\\ \\theta_i \\end{bmatrix} = \\begin{bmatrix} \\cos \\theta_r \\frac{h}{f}& -\\sin \\theta_r \\frac{h}{f}&0 \\\\ \\sin \\theta_r \\frac{h}{f}& \\cos \\theta_r \\frac{h}{f}&0 \\\\ 0 &0 &1\\end{bmatrix}^{-1} \\begin{bmatrix} x_m - x_r\\\\ y_m -y_r \\\\ \\theta_m -\\theta_r \\end{bmatrix} \n", 42 | "$$" 43 | ] 44 | }, 45 | { 46 | "cell_type": "markdown", 47 | "metadata": {}, 48 | "source": [ 49 | "### c) 已知标记坐标和图像坐标,求机器人位置\n", 50 | "根据 a)中公式依然可以计算出机器人位置,不过需要注意的是,这里需要先求出$\\theta_r$,然后再计算$x_r,y_r$\n", 51 | "$$\n", 52 | "\\begin{align}\n", 53 | "\\theta_r &= \\theta_m - \\theta_i \\\\\n", 54 | "\\begin{bmatrix} x_r \\\\ y_r \\end{bmatrix} &= \\begin{bmatrix} \\cos \\theta_r &-\\sin \\theta_r \\\\ \\sin \\theta_r &\\cos \\theta_r \\end{bmatrix} \\begin{bmatrix} x_i \\\\ y_i\\end{bmatrix}\n", 55 | "\\end{align}\n", 56 | "$$\n", 57 | "\n", 58 | "需要注意的是,$\\theta_i$有四种取值,因此$\\theta_r$也有四种取值,最终导致$x_r,y_r$也存在四种取值" 59 | ] 60 | }, 61 | { 62 | "cell_type": "markdown", 63 | "metadata": {}, 64 | "source": [ 65 | "### d) 多少个标志可以唯一确定机器人的位置\n", 66 | "两个标志可以唯一确定机器人的位置,因为两个十字标志就不再是中心对称的图形" 67 | ] 68 | }, 69 | { 70 | "cell_type": "markdown", 71 | "metadata": {}, 72 | "source": [ 73 | "## 2. 若坐标是非对称的倒T型,并且图像采样时存在高斯的噪声,均值为0,协方差为$\\Sigma=\\begin{bmatrix}\\sigma^2 &0 &0 \\\\ 0 &\\sigma^2 &0\\\\ 0 &0 &0 \\end{bmatrix}$,计算下述三个问题的噪声分布\n", 74 | "- a) 已知图像坐标和机器人位置,求标志坐标\n", 75 | "- b) 已知机器人位置和标记坐标,求图像坐标\n", 76 | "- c) 已知标记坐标和图像坐标,求机器人位置" 77 | ] 78 | }, 79 | { 80 | "cell_type": "markdown", 81 | "metadata": {}, 82 | "source": [ 83 | "### a) 已知图像坐标和机器人位置,求标志坐标\n", 84 | "\n", 85 | "根据习题1中公式,考虑图像采样的高斯噪声,可以得到\n", 86 | "$$\n", 87 | "\\begin{bmatrix} x_i \\\\ y_i \\\\ \\theta_i \\end{bmatrix} \n", 88 | "= \\begin{bmatrix} \\cos \\theta_r \\frac{h}{f}& -\\sin \\theta_r \\frac{h}{f}&0 \\\\ \\sin \\theta_r \\frac{h}{f}& \\cos \\theta_r \\frac{h}{f}&0 \\\\ 0 &0 &1\\end{bmatrix}^{-1} \\begin{bmatrix} x_m - x_r\\\\ y_m -y_r \\\\ \\theta_m -\\theta_r \\end{bmatrix} + \\epsilon \\\\\n", 89 | "$$\n", 90 | "令$A=\\begin{bmatrix} \\cos \\theta_r \\frac{h}{f}& -\\sin \\theta_r \\frac{h}{f}&0 \\\\ \\sin \\theta_r \\frac{h}{f}& \\cos \\theta_r \\frac{h}{f}&0 \\\\ 0 &0 &1\\end{bmatrix}$,可得\n", 91 | "\n", 92 | "$$\n", 93 | "\\begin{bmatrix} x_i \\\\ y_i \\\\ \\theta_i \\end{bmatrix} \\sim N(A^{-1} \\begin{bmatrix} x_m - x_r\\\\ y_m -y_r \\\\ \\theta_m -\\theta_r \\end{bmatrix}, \\Sigma)\n", 94 | "$$" 95 | ] 96 | }, 97 | { 98 | "cell_type": "markdown", 99 | "metadata": {}, 100 | "source": [ 101 | "根据高斯分布的可叠加性,可以得到\n", 102 | "$$\n", 103 | "\\begin{bmatrix} x_m \\\\ y_m \\\\ \\theta_m \\end{bmatrix} \\sim N( \\begin{bmatrix} x_r \\\\ y_r \\\\ \\theta_r \\end{bmatrix} + A\\begin{bmatrix} x_i\\\\ y_i \\\\ \\theta_i \\end{bmatrix}, A \\Sigma A^T)\n", 104 | "$$" 105 | ] 106 | }, 107 | { 108 | "cell_type": "markdown", 109 | "metadata": {}, 110 | "source": [ 111 | "### b) 已知机器人位置和标志坐标,求图像坐标\n", 112 | "根据 a) 中结果可以方便得到 \n", 113 | "$$\n", 114 | "\\begin{bmatrix} x_i \\\\ y_i \\\\ \\theta_i \\end{bmatrix} \\sim N(A^{-1} \\begin{bmatrix} x_m - x_r\\\\ y_m -y_r \\\\ \\theta_m -\\theta_r \\end{bmatrix}, \\Sigma)\n", 115 | "$$" 116 | ] 117 | }, 118 | { 119 | "cell_type": "markdown", 120 | "metadata": {}, 121 | "source": [ 122 | "### c) 已知标志坐标和图像坐标,求机器人坐标\n", 123 | "根据 a) 中结果可方便得到,需要首先计算$\\theta_i$\n", 124 | "$$\n", 125 | "\\theta_r = \\theta_m - \\theta_r \\\\\n", 126 | "\\begin{bmatrix} x_r \\\\ y_r \\\\ \\theta_r \\end{bmatrix} \\sim N( \\begin{bmatrix} x_m \\\\ y_m \\\\ \\theta_m \\end{bmatrix} - A\\begin{bmatrix} x_i\\\\ y_i \\\\ \\theta_i \\end{bmatrix}, A \\Sigma A^T)\n", 127 | "$$" 128 | ] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "metadata": {}, 133 | "source": [ 134 | "## 3. 实现sample_marker_model的例程,已知标志坐标 $X_m$ 和图像坐标 $X_i$ ,求机器人坐标 $X_r$ ,有以下五种情况,分别仿真采样\n" 135 | ] 136 | }, 137 | { 138 | "cell_type": "markdown", 139 | "metadata": {}, 140 | "source": [ 141 | "\n", 142 | "|序号 |$x_m$|$y_m$|$\\theta_m$|$x_i$|$y_i$|$\\theta_i$|$h/f$ |$\\sigma^2$|\n", 143 | "|----|-----|-----|----------|-----|-----|-----------|-----|----------|\n", 144 | "|1 |0cm |0cm |0° |0cm |0cm | 0° |200 |$0.1cm^2$ |\n", 145 | "|2 |0cm |0cm |0° |1cm |0cm | 0° |200 |$0.1cm^2$ |\n", 146 | "|3 |0cm |0cm |0° |2cm |0cm | 45° |200 |$0.1cm^2$ |\n", 147 | "|4 |0cm |0cm |0° |3cm |0cm | 45° |200 |$1.0cm^2$ |\n", 148 | "|5 |50cm |150cm|10° |1cm |6cm | 200° |250 |$0.5cm^2$ |" 149 | ] 150 | }, 151 | { 152 | "cell_type": "code", 153 | "execution_count": 1, 154 | "metadata": {}, 155 | "outputs": [ 156 | { 157 | "name": "stdout", 158 | "output_type": "stream", 159 | "text": [ 160 | "[[ -600. -800. -1000.]\n", 161 | " [ -600. -800. -1000.]\n", 162 | " [ 0. 0. 0.]]\n" 163 | ] 164 | } 165 | ], 166 | "source": [ 167 | "import numpy as np\n", 168 | "\n", 169 | "def marker_model(X_m, X_i, hf):\n", 170 | " n = X_i.shape[1]\n", 171 | " X_r = np.mat(np.zeros((3,n)))\n", 172 | " for i in range(n):\n", 173 | " X_r[2,i] = X_m[2,0] - X_i[2,i]\n", 174 | " A = hf * np.mat([[np.math.cos(X_r[2,i]), -np.math.sin(X_r[2,i])], [np.math.sin(X_r[2,i]), np.math.cos(X_r[2,i])]])\n", 175 | " X_r[0:2, i] = X_m[0:2,0] - A*X_i[0:2,i]\n", 176 | " return X_r\n", 177 | "\n", 178 | "X_m = np.mat([[0],[0],[0]])\n", 179 | "X_i = np.mat([[3,4,5],[3,4,5],[0,0,0]])\n", 180 | "hf = 200\n", 181 | "\n", 182 | "X_r = marker_model(X_m, X_i, hf)\n", 183 | "print(X_r)" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": 3, 189 | "metadata": {}, 190 | "outputs": [ 191 | { 192 | "data": { 193 | "image/png": "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\n", 194 | "text/plain": [ 195 | "
" 196 | ] 197 | }, 198 | "metadata": { 199 | "needs_background": "light" 200 | }, 201 | "output_type": "display_data" 202 | } 203 | ], 204 | "source": [ 205 | "import matplotlib.pyplot as plt\n", 206 | "\n", 207 | "X_ms = np.mat([[0,0,0,0,50],[0,0,0,0,150],[0,0,0,0,10/180*np.math.pi]])\n", 208 | "X_is = np.mat([[0,1,2,3,1],[0,0,0,0,6],[0,0,45/180*np.math.pi,45/180*np.math.pi,200/180*np.math.pi]])\n", 209 | "hfs = np.array([200,200,200,200,250])\n", 210 | "sigma_s = np.array([0.1, 0.1, 0.1, 1.0, 0.5])\n", 211 | "sigma_eigen = np.mat([[1,0,0],[0,1,0],[0,0,0]])\n", 212 | "sample_nums = 100\n", 213 | "\n", 214 | "fig = plt.figure()\n", 215 | "for i in range(X_ms.shape[1]):\n", 216 | " ax = fig.add_subplot(2,3,1+i)\n", 217 | " for j in range(4):\n", 218 | " X_i_mean = np.array([X_is[0,i],X_is[1,i],X_is[2,i] + j*np.math.pi/2])\n", 219 | " sigma = sigma_eigen * sigma_s[i]\n", 220 | " X_i = np.random.multivariate_normal(mean=X_i_mean, cov=sigma, size=sample_nums)\n", 221 | " X_m = np.mat(X_ms[:,i])\n", 222 | " X_r = marker_model(X_m, np.mat(X_i.T), hfs[i])\n", 223 | " ax.scatter(np.array(X_r[0,:]), np.array(X_r[1,:]), c='r', marker='.')\n", 224 | " ax.scatter(X_ms[0,i], X_ms[1,i], c='b', marker='x')\n", 225 | "\n", 226 | "plt.show()" 227 | ] 228 | }, 229 | { 230 | "cell_type": "markdown", 231 | "metadata": {}, 232 | "source": [ 233 | "## 4. 假设声呐传感器放在墙面前,范围为$d$,角度为$\\Phi$,测量传感器检测墙壁的频率随$d$和$\\Phi$的变化" 234 | ] 235 | }, 236 | { 237 | "cell_type": "markdown", 238 | "metadata": {}, 239 | "source": [ 240 | "若假设墙壁反射声波是漫反射,那么传感器检测墙壁的频率仅与声波传递方向到墙壁的距离相关,已知声速是$340m/s$,那么测量频率为\n", 241 | "$$\n", 242 | "f=\\frac{v}{d/\\cos\\Phi}\n", 243 | "$$" 244 | ] 245 | }, 246 | { 247 | "cell_type": "code", 248 | "execution_count": 18, 249 | "metadata": {}, 250 | "outputs": [ 251 | { 252 | "data": { 253 | "image/png": "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\n", 254 | "text/plain": [ 255 | "
" 256 | ] 257 | }, 258 | "metadata": { 259 | "needs_background": "light" 260 | }, 261 | "output_type": "display_data" 262 | } 263 | ], 264 | "source": [ 265 | "from mpl_toolkits.mplot3d import Axes3D\n", 266 | "\n", 267 | "d = np.arange(0.5,10.0,0.5)\n", 268 | "phi = np.arange(-np.math.pi/2,np.math.pi/2,5/180*np.math.pi)\n", 269 | "\n", 270 | "d, phi = np.meshgrid(d, phi)\n", 271 | "v = 340\n", 272 | "f = v*np.divide(np.cos(phi),d)\n", 273 | "\n", 274 | "fig=plt.figure()\n", 275 | "ax = fig.add_subplot(1,1,1, projection='3d')\n", 276 | "ax.plot_surface(d, phi, f, rstride=1, cstride=1, cmap='rainbow')\n", 277 | "\n", 278 | "plt.show()" 279 | ] 280 | }, 281 | { 282 | "cell_type": "markdown", 283 | "metadata": {}, 284 | "source": [ 285 | "可以发现随着距离的增加,检测频率在迅速衰减,正对墙面时检测频率较高,侧对墙面时较低" 286 | ] 287 | }, 288 | { 289 | "cell_type": "markdown", 290 | "metadata": {}, 291 | "source": [ 292 | "## 总结\n", 293 | "\n", 294 | "这一章介绍了" 295 | ] 296 | } 297 | ], 298 | "metadata": { 299 | "kernelspec": { 300 | "display_name": "Python 3", 301 | "language": "python", 302 | "name": "python3" 303 | }, 304 | "language_info": { 305 | "codemirror_mode": { 306 | "name": "ipython", 307 | "version": 3 308 | }, 309 | "file_extension": ".py", 310 | "mimetype": "text/x-python", 311 | "name": "python", 312 | "nbconvert_exporter": "python", 313 | "pygments_lexer": "ipython3", 314 | "version": "3.5.2" 315 | } 316 | }, 317 | "nbformat": 4, 318 | "nbformat_minor": 4 319 | } -------------------------------------------------------------------------------- /ch07_mrl_markov_and_gaussian/第七章-移动机器人定位-马尔可夫与高斯.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第七章 移动机器人定位:马尔可夫与高斯\n", 8 | "\n", 9 | "## 1. 假设机器人安装了传感器可以测量地标的距离和方位,以及地标的身份。当看到一个地标时,通常用高斯近似的不好,然而当有两个地标时,通常可以很好的近似。\n", 10 | "a) 请解释为什么\n", 11 | "\n", 12 | "b) 给定k个可辨认地标的k组距离和方位,在均匀分布的前提下,设计计算高斯位置估计的程序\n", 13 | "\n", 14 | "### a) 为什么两个地标能用高斯很好的近似,而单个地标不行\n", 15 | "需要注意的是,这里的地标本身不包含角度信息,也就是说,根据地标推断出的机器人位置,将分布在以地标为中心的圆上,高斯分布没有办法近似这样的分布。当存在两个地标时,推导出的机器人位置时两个圆的交点,使用角度信息排除一个点后,机器人位置将分布在一个点附近,这可以使用高斯分布比较好地近似。" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "### b) 设计计算高斯位置分布的程序\n", 23 | "\n", 24 | "根据贝叶斯公式可以得到\n", 25 | "$$\n", 26 | "p(x,y,\\theta|z_{1:k}) = p(z_{1:k}|x,y,\\theta)p(x,y,\\theta)\n", 27 | "$$\n", 28 | "由于每个路标都是相互独立的,因此\n", 29 | "$$\n", 30 | "p\\left(z_{1: k} | x, y, \\theta\\right)=\\prod_{i=1}^{k} p\\left(z_{i} | x, y, \\theta\\right)\n", 31 | "$$" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "根据6.6节的公式可以得到\n", 39 | "$$\n", 40 | "\\begin{aligned}\n", 41 | "p\\left(z_{i} | x, y, \\theta\\right) &=p_{n}\\left(r_{i}-\\hat{r}_{i}\\right) \\cdot p_{n}\\left(\\theta_{i}-\\hat{\\theta}_{i}\\right) \\\\\n", 42 | "&=e^{-\\frac{1}{2\\sigma_{r}^{2}}\\left(r_{i}-\\hat{r}_{i}\\right)^{2} } \\cdot e^{-\\frac{1}{2\\sigma_{\\theta}^{2}}\\left(\\theta_{i}-\\hat{\\theta}_{i}\\right)^{2} }\n", 43 | "\\end{aligned}\n", 44 | "$$\n", 45 | "其中\n", 46 | "$$\n", 47 | "\\begin{array}{l}\n", 48 | "\\hat{r}_{i}=\\sqrt{\\left(x_{z i}-x\\right)^{2}+\\left(y_{z i}-y\\right)^{2}} \\\\\n", 49 | "\\hat{\\theta}_{i}=normalized\\left(\\theta_{z i}-\\theta\\right)\n", 50 | "\\end{array}\n", 51 | "$$" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [ 58 | "可以发现$p\\left(z_{1: k} | x, y, \\theta\\right)$ 是非线性的\n", 59 | "$$\n", 60 | "Z = h(x,y,\\theta)= \\begin{bmatrix} z_{1}(x,y,\\theta) \\\\ z_{2}(x,y,\\theta) \\\\ ... \\\\ z_{k}(x,y,\\theta) \\end{bmatrix}\n", 61 | " = \\begin{bmatrix} \\hat{r}_{1}(x,y,\\theta) \\\\ \\hat{\\theta}_{1}(x,y,\\theta) \\\\ \\hat{r}_{2}(x,y,\\theta) \\\\ \\hat{\\theta}_{2}(x,y,\\theta) \\\\ ... \\\\ \\hat{r}_{k}(x,y,\\theta) \\\\ \\hat{\\theta}_{k}(x,y,\\theta) \\\\ \\end{bmatrix}\n", 62 | "$$\n", 63 | "需要做泰勒展开\n", 64 | "$$\n", 65 | "H=\\left[\\frac{\\partial h}{\\partial x}, \\frac{\\partial h}{\\partial y}, \\frac{\\partial h}{\\partial \\theta}\\right]\n", 66 | "$$" 67 | ] 68 | }, 69 | { 70 | "cell_type": "markdown", 71 | "metadata": {}, 72 | "source": [ 73 | "可以得到\n", 74 | "$$\n", 75 | "\\begin{align}\n", 76 | "\\mu_{t} &= h(\\mu_{t-1}) + H(X-\\mu_{t-1}) \\\\\n", 77 | "\\Sigma_{t} &= H\\Sigma_{t-1}H^{T} + R_{t}\n", 78 | "\\end{align}\n", 79 | "$$" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": {}, 85 | "source": [ 86 | "# 2. 这个问题中,试图为全局定位设计困难环境。假设用n个不相交的线段构成一个平面环境,环境的自由空间受到限制,然而地图里可能存在已占用区域的孤岛。假设机器人装备栏额360个测距仪组成的环形阵列,而且测距仪从不出错。\n", 87 | "a) 机器人置信函数中,全局定位机器人可能面对的不同模式最大数目是多少?\n", 88 | "b) 如果测距仪可以出错的话,分析会有变化吗?" 89 | ] 90 | }, 91 | { 92 | "cell_type": "markdown", 93 | "metadata": {}, 94 | "source": [ 95 | "不能理解这道题,有两点:\n", 96 | "1. 怎样用不相交的线段构成平面环境\n", 97 | "2. 什么是不同的模式" 98 | ] 99 | }, 100 | { 101 | "cell_type": "markdown", 102 | "metadata": {}, 103 | "source": [ 104 | "# 3. 水下机器人\n", 105 | "对简单的水下机器人,推导扩展卡尔曼滤波定位算法。机器人在三维空间,并装备了完美的指南针。为简单起见,假设机器人按照设定的速率$\\dot{x}, \\dot{y}, \\dot{z}$ 在三个笛卡尔方向上独立运动,且运动噪声是高斯的。\n", 106 | "\n", 107 | "机器人被信号灯塔包围,信标灯塔发射声学信号,每个信号的发射时间已知,每个信标的真实位置已知。机器人可以区分信标灯塔,并根据接收时间计算灯塔距离,但无法确定灯塔角度。\n", 108 | "\n", 109 | "a) 设计扩展卡尔曼滤波定位算法,包括运动模型和测量模型的泰勒级数展开\n", 110 | "\n", 111 | "b) 实现扩展卡尔曼滤波和环境仿真,研究扩展卡尔曼滤波定位器在三种定位问题下的精度和失效问题:全局定位,位置跟踪,绑架机器人问题" 112 | ] 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "metadata": {}, 117 | "source": [ 118 | "## a) 设计扩展卡尔曼滤波定位算法" 119 | ] 120 | }, 121 | { 122 | "cell_type": "markdown", 123 | "metadata": {}, 124 | "source": [ 125 | "首先导出运动模型,设速度为$V$,且速度的噪声是高斯的,$t$时刻的噪声记为$\\delta_t$\n", 126 | "$$\n", 127 | "X_t = X_{t-1} + V \\cdot \\Delta t + \\delta_t \\\\\n", 128 | "$$" 129 | ] 130 | }, 131 | { 132 | "cell_type": "markdown", 133 | "metadata": {}, 134 | "source": [ 135 | "其中\n", 136 | "$$\n", 137 | "\\begin{align}\n", 138 | "X_t &= [x, y, z]^T \\\\\n", 139 | "V_t &= [\\dot(x), \\dot(y), \\dot(z)]^T\n", 140 | "\\end{align}\n", 141 | "$$" 142 | ] 143 | }, 144 | { 145 | "cell_type": "markdown", 146 | "metadata": {}, 147 | "source": [ 148 | "然后导出测量模型,设灯塔坐标为$P=[px,py,pz]^T$,灯塔距离的测量值为$M$,\n", 149 | "$$\n", 150 | "M_t = h(X_t) = |P-X_t|=\n", 151 | "\\begin{bmatrix}\n", 152 | "\\sqrt{(P_{1,x} - X_{t,x})^2 + (P_{1,y} - X_{t,y})^2 + (P_{1,z} - X_{t,z})^2} \\\\\n", 153 | "\\sqrt{(P_{2,x} - X_{t,x})^2 + (P_{2,y} - X_{t,y})^2 + (P_{2,z} - X_{t,z})^2} \\\\\n", 154 | "... \\\\\n", 155 | "\\sqrt{(P_{n,x} - X_{t,x})^2 + (P_{n,y} - X_{t,y})^2 + (P_{n,z} - X_{t,z})^2} \\\\\n", 156 | "\\end{bmatrix}\n", 157 | "=\n", 158 | "\\begin{bmatrix}\n", 159 | "dist(P_1 -X_t) \\\\\n", 160 | "dist(P_2 -X_t) \\\\\n", 161 | "... \\\\\n", 162 | "dist(P_n -X_t) \\\\\n", 163 | "\\end{bmatrix}\n", 164 | "$$" 165 | ] 166 | }, 167 | { 168 | "cell_type": "markdown", 169 | "metadata": {}, 170 | "source": [ 171 | "做泰勒级数展开后得到\n", 172 | "$$\n", 173 | "H=\\left[\\frac{\\partial M}{\\partial x}, \\frac{\\partial M}{\\partial y}, \\frac{\\partial M}{\\partial z}\\right]\n", 174 | "=\n", 175 | "\\begin{bmatrix}\n", 176 | "\\frac{x}{dist(P_1-X_t)}, \\frac{y}{dist(P_1-X_t)}, \\frac{z}{dist(P_1-X_t)} \\\\\n", 177 | "\\frac{x}{dist(P_2-X_t)}, \\frac{y}{dist(P_2-X_t)}, \\frac{z}{dist(P_2-X_t)} \\\\\n", 178 | "... \\\\\n", 179 | "\\frac{x}{dist(P_n-X_t)}, \\frac{y}{dist(P_n-X_t)}, \\frac{z}{dist(P_n-X_t)} \\\\\n", 180 | "\\end{bmatrix}\n", 181 | "$$" 182 | ] 183 | } 184 | ], 185 | "metadata": { 186 | "kernelspec": { 187 | "display_name": "Python 3", 188 | "language": "python", 189 | "name": "python3" 190 | }, 191 | "language_info": { 192 | "codemirror_mode": { 193 | "name": "ipython", 194 | "version": 3 195 | }, 196 | "file_extension": ".py", 197 | "mimetype": "text/x-python", 198 | "name": "python", 199 | "nbconvert_exporter": "python", 200 | "pygments_lexer": "ipython3", 201 | "version": "3.6.9" 202 | } 203 | }, 204 | "nbformat": 4, 205 | "nbformat_minor": 2 206 | } 207 | -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: example-environment 2 | channels: 3 | - conda-forge 4 | dependencies: 5 | - numpy 6 | - psutil 7 | - toolz 8 | - matplotlib 9 | - dill 10 | - pandas 11 | - partd 12 | - bokeh 13 | - dask 14 | -------------------------------------------------------------------------------- /pics/README.MD: -------------------------------------------------------------------------------- 1 | All pics store here. 2 | -------------------------------------------------------------------------------- /简介.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 概率机器人课后习题\n", 8 | "\n", 9 | "## 目录\n", 10 | "1. 第一章(无习题)\n", 11 | "2. [第二章 递归状态估计](ch02_recursive_state_estimation/%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E9%80%92%E5%BD%92%E7%8A%B6%E6%80%81%E4%BC%B0%E8%AE%A1.ipynb)\n", 12 | "3. [第三章 高斯滤波](ch03_gaussian_filters/%E7%AC%AC%E4%B8%89%E7%AB%A0-%E9%AB%98%E6%96%AF%E6%BB%A4%E6%B3%A2.ipynb)\n", 13 | "4. [第四章 非参数滤波](ch04_nonparametric_filters/%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E9%9D%9E%E5%8F%82%E6%95%B0%E6%BB%A4%E6%B3%A2.ipynb)\n", 14 | "5. [第五章 机器人运动](ch05_robot_motion/%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%9C%BA%E5%99%A8%E4%BA%BA%E8%BF%90%E5%8A%A8.ipynb)\n", 15 | "6. [第六章 机器人感知](ch06_robot_perception/%E7%AC%AC%E5%85%AD%E7%AB%A0-%E6%9C%BA%E5%99%A8%E4%BA%BA%E6%84%9F%E7%9F%A5.ipynb)\n", 16 | "7. [第七章 移动机器人定位](ch07_mrl_markov_and_gaussian/%E7%AC%AC%E4%B8%83%E7%AB%A0-%E7%A7%BB%E5%8A%A8%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%AE%9A%E4%BD%8D-%E9%A9%AC%E5%B0%94%E5%8F%AF%E5%A4%AB%E4%B8%8E%E9%AB%98%E6%96%AF.ipynb)" 17 | ] 18 | }, 19 | { 20 | "cell_type": "markdown", 21 | "metadata": {}, 22 | "source": [ 23 | "[Github Repo](https://github.com/Yu-Xiaoxian/probabilistic_robotics_exercises)" 24 | ] 25 | } 26 | ], 27 | "metadata": { 28 | "kernelspec": { 29 | "display_name": "Python 3", 30 | "language": "python", 31 | "name": "python3" 32 | }, 33 | "language_info": { 34 | "codemirror_mode": { 35 | "name": "ipython", 36 | "version": 3 37 | }, 38 | "file_extension": ".py", 39 | "mimetype": "text/x-python", 40 | "name": "python", 41 | "nbconvert_exporter": "python", 42 | "pygments_lexer": "ipython3", 43 | "version": "3.5.2" 44 | } 45 | }, 46 | "nbformat": 4, 47 | "nbformat_minor": 2 48 | } 49 | --------------------------------------------------------------------------------