Compare commits
19 Commits
6a67db598b
...
master
Author | SHA1 | Date | |
---|---|---|---|
d3f8f1cc4e | |||
86a72b9ee7 | |||
3e39eadc12 | |||
2fc62f5deb | |||
7f03d4c2ac | |||
8457e33e26 | |||
ebdde7b4b7 | |||
44d82fb66a | |||
54ab59a00c | |||
ef78808a52 | |||
92f78dda18 | |||
6923496e4f | |||
a0394c8136 | |||
5ee0701244 | |||
fb75ce4185 | |||
b53bee9e37 | |||
dcd65832dc | |||
41f51e423c | |||
5f1f33144e |
21
LICENSE.txt
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 Dehaeze Thomas
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
145
css/htmlize.css
@@ -1,145 +0,0 @@
|
|||||||
.org-bold { /* bold */ font-weight: bold; }
|
|
||||||
.org-bold-italic { /* bold-italic */ font-weight: bold; font-style: italic; }
|
|
||||||
.org-buffer-menu-buffer { /* buffer-menu-buffer */ font-weight: bold; }
|
|
||||||
.org-builtin { /* font-lock-builtin-face */ color: #7a378b; }
|
|
||||||
.org-button { /* button */ text-decoration: underline; }
|
|
||||||
.org-calendar-today { /* calendar-today */ text-decoration: underline; }
|
|
||||||
.org-change-log-acknowledgement { /* change-log-acknowledgement */ color: #b22222; }
|
|
||||||
.org-change-log-conditionals { /* change-log-conditionals */ color: #a0522d; }
|
|
||||||
.org-change-log-date { /* change-log-date */ color: #8b2252; }
|
|
||||||
.org-change-log-email { /* change-log-email */ color: #a0522d; }
|
|
||||||
.org-change-log-file { /* change-log-file */ color: #0000ff; }
|
|
||||||
.org-change-log-function { /* change-log-function */ color: #a0522d; }
|
|
||||||
.org-change-log-list { /* change-log-list */ color: #a020f0; }
|
|
||||||
.org-change-log-name { /* change-log-name */ color: #008b8b; }
|
|
||||||
.org-comint-highlight-input { /* comint-highlight-input */ font-weight: bold; }
|
|
||||||
.org-comint-highlight-prompt { /* comint-highlight-prompt */ color: #00008b; }
|
|
||||||
.org-comment { /* font-lock-comment-face */ color: #999988; font-style: italic; }
|
|
||||||
.org-comment-delimiter { /* font-lock-comment-delimiter-face */ color: #999988; font-style: italic; }
|
|
||||||
.org-completions-annotations { /* completions-annotations */ font-style: italic; }
|
|
||||||
.org-completions-common-part { /* completions-common-part */ color: #000000; background-color: #ffffff; }
|
|
||||||
.org-completions-first-difference { /* completions-first-difference */ font-weight: bold; }
|
|
||||||
.org-constant { /* font-lock-constant-face */ color: #008b8b; }
|
|
||||||
.org-diary { /* diary */ color: #ff0000; }
|
|
||||||
.org-diff-context { /* diff-context */ color: #7f7f7f; }
|
|
||||||
.org-diff-file-header { /* diff-file-header */ background-color: #b3b3b3; font-weight: bold; }
|
|
||||||
.org-diff-function { /* diff-function */ background-color: #cccccc; }
|
|
||||||
.org-diff-header { /* diff-header */ background-color: #cccccc; }
|
|
||||||
.org-diff-hunk-header { /* diff-hunk-header */ background-color: #cccccc; }
|
|
||||||
.org-diff-index { /* diff-index */ background-color: #b3b3b3; font-weight: bold; }
|
|
||||||
.org-diff-nonexistent { /* diff-nonexistent */ background-color: #b3b3b3; font-weight: bold; }
|
|
||||||
.org-diff-refine-change { /* diff-refine-change */ background-color: #d9d9d9; }
|
|
||||||
.org-dired-directory { /* dired-directory */ color: #0000ff; }
|
|
||||||
.org-dired-flagged { /* dired-flagged */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-dired-header { /* dired-header */ color: #228b22; }
|
|
||||||
.org-dired-ignored { /* dired-ignored */ color: #7f7f7f; }
|
|
||||||
.org-dired-mark { /* dired-mark */ color: #008b8b; }
|
|
||||||
.org-dired-marked { /* dired-marked */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-dired-perm-write { /* dired-perm-write */ color: #b22222; }
|
|
||||||
.org-dired-symlink { /* dired-symlink */ color: #a020f0; }
|
|
||||||
.org-dired-warning { /* dired-warning */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-doc { /* font-lock-doc-face */ color: #8b2252; }
|
|
||||||
.org-escape-glyph { /* escape-glyph */ color: #a52a2a; }
|
|
||||||
.org-file-name-shadow { /* file-name-shadow */ color: #7f7f7f; }
|
|
||||||
.org-flyspell-duplicate { /* flyspell-duplicate */ color: #cdad00; font-weight: bold; text-decoration: underline; }
|
|
||||||
.org-flyspell-incorrect { /* flyspell-incorrect */ color: #ff4500; font-weight: bold; text-decoration: underline; }
|
|
||||||
.org-fringe { /* fringe */ background-color: #f2f2f2; }
|
|
||||||
.org-function-name { /* font-lock-function-name-face */ color: teal; }
|
|
||||||
.org-header-line { /* header-line */ color: #333333; background-color: #e5e5e5; }
|
|
||||||
.org-help-argument-name { /* help-argument-name */ font-style: italic; }
|
|
||||||
.org-highlight { /* highlight */ background-color: #b4eeb4; }
|
|
||||||
.org-holiday { /* holiday */ background-color: #ffc0cb; }
|
|
||||||
.org-isearch { /* isearch */ color: #b0e2ff; background-color: #cd00cd; }
|
|
||||||
.org-isearch-fail { /* isearch-fail */ background-color: #ffc1c1; }
|
|
||||||
.org-italic { /* italic */ font-style: italic; }
|
|
||||||
.org-keyword { /* font-lock-keyword-face */ color: #0086b3; }
|
|
||||||
.org-lazy-highlight { /* lazy-highlight */ background-color: #afeeee; }
|
|
||||||
.org-link { /* link */ color: #0000ff; text-decoration: underline; }
|
|
||||||
.org-link-visited { /* link-visited */ color: #8b008b; text-decoration: underline; }
|
|
||||||
.org-log-edit-header { /* log-edit-header */ color: #a020f0; }
|
|
||||||
.org-log-edit-summary { /* log-edit-summary */ color: #0000ff; }
|
|
||||||
.org-log-edit-unknown-header { /* log-edit-unknown-header */ color: #b22222; }
|
|
||||||
.org-match { /* match */ background-color: #ffff00; }
|
|
||||||
.org-next-error { /* next-error */ background-color: #eedc82; }
|
|
||||||
.org-nobreak-space { /* nobreak-space */ color: #a52a2a; text-decoration: underline; }
|
|
||||||
.org-org-archived { /* org-archived */ color: #7f7f7f; }
|
|
||||||
.org-org-block { /* org-block */ color: #7f7f7f; }
|
|
||||||
.org-org-block-begin-line { /* org-block-begin-line */ color: #b22222; }
|
|
||||||
.org-org-block-end-line { /* org-block-end-line */ color: #b22222; }
|
|
||||||
.org-org-checkbox { /* org-checkbox */ font-weight: bold; }
|
|
||||||
.org-org-checkbox-statistics-done { /* org-checkbox-statistics-done */ color: #228b22; font-weight: bold; }
|
|
||||||
.org-org-checkbox-statistics-todo { /* org-checkbox-statistics-todo */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-org-clock-overlay { /* org-clock-overlay */ background-color: #ffff00; }
|
|
||||||
.org-org-code { /* org-code */ color: #7f7f7f; }
|
|
||||||
.org-org-column { /* org-column */ background-color: #e5e5e5; }
|
|
||||||
.org-org-column-title { /* org-column-title */ background-color: #e5e5e5; font-weight: bold; text-decoration: underline; }
|
|
||||||
.org-org-date { /* org-date */ color: #a020f0; text-decoration: underline; }
|
|
||||||
.org-org-document-info { /* org-document-info */ color: #191970; }
|
|
||||||
.org-org-document-info-keyword { /* org-document-info-keyword */ color: #7f7f7f; }
|
|
||||||
.org-org-document-title { /* org-document-title */ color: #191970; font-size: 144%; font-weight: bold; }
|
|
||||||
.org-org-done { /* org-done */ color: #228b22; font-weight: bold; }
|
|
||||||
.org-org-drawer { /* org-drawer */ color: #0000ff; }
|
|
||||||
.org-org-ellipsis { /* org-ellipsis */ color: #b8860b; text-decoration: underline; }
|
|
||||||
.org-org-footnote { /* org-footnote */ color: #a020f0; text-decoration: underline; }
|
|
||||||
.org-org-formula { /* org-formula */ color: #b22222; }
|
|
||||||
.org-org-headline-done { /* org-headline-done */ color: #bc8f8f; }
|
|
||||||
.org-org-hide { /* org-hide */ color: #ffffff; }
|
|
||||||
.org-org-latex-and-export-specials { /* org-latex-and-export-specials */ color: #8b4513; }
|
|
||||||
.org-org-level-1 { /* org-level-1 */ color: #0000ff; }
|
|
||||||
.org-org-level-2 { /* org-level-2 */ color: #a0522d; }
|
|
||||||
.org-org-level-3 { /* org-level-3 */ color: #a020f0; }
|
|
||||||
.org-org-level-4 { /* org-level-4 */ color: #b22222; }
|
|
||||||
.org-org-level-5 { /* org-level-5 */ color: #228b22; }
|
|
||||||
.org-org-level-6 { /* org-level-6 */ color: #008b8b; }
|
|
||||||
.org-org-level-7 { /* org-level-7 */ color: #7a378b; }
|
|
||||||
.org-org-level-8 { /* org-level-8 */ color: #8b2252; }
|
|
||||||
.org-org-link { /* org-link */ color: #0000ff; text-decoration: underline; }
|
|
||||||
.org-org-meta-line { /* org-meta-line */ color: #b22222; }
|
|
||||||
.org-org-mode-line-clock { /* org-mode-line-clock */ color: #000000; background-color: #bfbfbf; }
|
|
||||||
.org-org-mode-line-clock-overrun { /* org-mode-line-clock-overrun */ color: #000000; background-color: #ff0000; }
|
|
||||||
.org-org-quote { /* org-quote */ color: #7f7f7f; }
|
|
||||||
.org-org-scheduled { /* org-scheduled */ color: #006400; }
|
|
||||||
.org-org-scheduled-previously { /* org-scheduled-previously */ color: #b22222; }
|
|
||||||
.org-org-scheduled-today { /* org-scheduled-today */ color: #006400; }
|
|
||||||
.org-org-sexp-date { /* org-sexp-date */ color: #a020f0; }
|
|
||||||
.org-org-special-keyword { /* org-special-keyword */ color: #a020f0; }
|
|
||||||
.org-org-table { /* org-table */ color: #0000ff; }
|
|
||||||
.org-org-tag { /* org-tag */ font-weight: bold; }
|
|
||||||
.org-org-target { /* org-target */ text-decoration: underline; }
|
|
||||||
.org-org-time-grid { /* org-time-grid */ color: #b8860b; }
|
|
||||||
.org-org-todo { /* org-todo */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-org-upcoming-deadline { /* org-upcoming-deadline */ color: #b22222; }
|
|
||||||
.org-org-verbatim { /* org-verbatim */ color: #7f7f7f; }
|
|
||||||
.org-org-verse { /* org-verse */ color: #7f7f7f; }
|
|
||||||
.org-org-warning { /* org-warning */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-outline-1 { /* outline-1 */ color: #0000ff; }
|
|
||||||
.org-outline-2 { /* outline-2 */ color: #a0522d; }
|
|
||||||
.org-outline-3 { /* outline-3 */ color: #a020f0; }
|
|
||||||
.org-outline-4 { /* outline-4 */ color: #b22222; }
|
|
||||||
.org-outline-5 { /* outline-5 */ color: #228b22; }
|
|
||||||
.org-outline-6 { /* outline-6 */ color: #008b8b; }
|
|
||||||
.org-outline-7 { /* outline-7 */ color: #7a378b; }
|
|
||||||
.org-outline-8 { /* outline-8 */ color: #8b2252; }
|
|
||||||
.org-preprocessor { /* font-lock-preprocessor-face */ color: #7a378b; }
|
|
||||||
.org-query-replace { /* query-replace */ color: #b0e2ff; background-color: #cd00cd; }
|
|
||||||
.org-regexp-grouping-backslash { /* font-lock-regexp-grouping-backslash */ font-weight: bold; }
|
|
||||||
.org-regexp-grouping-construct { /* font-lock-regexp-grouping-construct */ font-weight: bold; }
|
|
||||||
.org-region { /* region */ background-color: #eedc82; }
|
|
||||||
.org-secondary-selection { /* secondary-selection */ background-color: #ffff00; }
|
|
||||||
.org-shadow { /* shadow */ color: #7f7f7f; }
|
|
||||||
.org-show-paren-match { /* show-paren-match */ background-color: #40e0d0; }
|
|
||||||
.org-show-paren-mismatch { /* show-paren-mismatch */ color: #ffffff; background-color: #a020f0; }
|
|
||||||
.org-string { /* font-lock-string-face */ color: #dd1144; }
|
|
||||||
.org-tool-bar { /* tool-bar */ color: #000000; background-color: #bfbfbf; }
|
|
||||||
.org-tooltip { /* tooltip */ color: #000000; background-color: #ffffe0; }
|
|
||||||
.org-trailing-whitespace { /* trailing-whitespace */ background-color: #ff0000; }
|
|
||||||
.org-type { /* font-lock-type-face */ color: #228b22; }
|
|
||||||
.org-underline { /* underline */ text-decoration: underline; }
|
|
||||||
.org-variable-name { /* font-lock-variable-name-face */ color: teal; }
|
|
||||||
.org-warning { /* font-lock-warning-face */ color: #ff0000; font-weight: bold; }
|
|
||||||
.org-widget-button { /* widget-button */ font-weight: bold; }
|
|
||||||
.org-widget-button-pressed { /* widget-button-pressed */ color: #ff0000; }
|
|
||||||
.org-widget-documentation { /* widget-documentation */ color: #006400; }
|
|
||||||
.org-widget-field { /* widget-field */ background-color: #d9d9d9; }
|
|
||||||
.org-widget-inactive { /* widget-inactive */ color: #7f7f7f; }
|
|
||||||
.org-widget-single-line-field { /* widget-single-line-field */ background-color: #d9d9d9; }
|
|
1103
css/readtheorg.css
70
index.html
@@ -3,55 +3,77 @@
|
|||||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||||
<head>
|
<head>
|
||||||
<!-- 2020-10-03 sam. 19:04 -->
|
<!-- 2021-09-10 ven. 11:07 -->
|
||||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
<title>Robust and Optimal Sensor Fusion</title>
|
<title>Robust and Optimal Sensor Fusion using Complementary Filters</title>
|
||||||
<meta name="generator" content="Org mode" />
|
|
||||||
<meta name="author" content="Thomas Dehaeze" />
|
<meta name="author" content="Thomas Dehaeze" />
|
||||||
<link rel="stylesheet" type="text/css" href="css/htmlize.css"/>
|
<meta name="generator" content="Org Mode" />
|
||||||
<link rel="stylesheet" type="text/css" href="css/readtheorg.css"/>
|
<link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
<script src="js/jquery.min.js"></script>
|
<script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
<script src="js/bootstrap.min.js"></script>
|
<style> #content {margin: auto;} </style>
|
||||||
<script src="js/jquery.stickytableheaders.min.js"></script>
|
|
||||||
<script src="js/readtheorg.js"></script>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="org-div-home-and-up">
|
<div id="org-div-home-and-up">
|
||||||
<a accesskey="h" href="../index.html"> UP </a>
|
<a accesskey="h" href="../index.html"> UP </a>
|
||||||
|
|
|
|
||||||
<a accesskey="H" href="../index.html"> HOME </a>
|
<a accesskey="H" href="../index.html"> HOME </a>
|
||||||
</div><div id="content">
|
</div><div id="content" class="content">
|
||||||
<h1 class="title">Robust and Optimal Sensor Fusion
|
<h1 class="title">Robust and Optimal Sensor Fusion using Complementary Filters
|
||||||
<br />
|
<br />
|
||||||
<span class="subtitle">Dehaeze Thomas and Collette Christophe</span>
|
<span class="subtitle">Dehaeze Thomas and Collette Christophe</span>
|
||||||
</h1>
|
</h1>
|
||||||
|
<blockquote>
|
||||||
<div id="outline-container-org0ec4732" class="outline-2">
|
|
||||||
<h2 id="org0ec4732">Paper</h2>
|
|
||||||
<div class="outline-text-2" id="text-org0ec4732">
|
|
||||||
<p>
|
<p>
|
||||||
The PDF version of the paper is accessible <a href="paper/paper.pdf">here</a>.
|
<b>Abstract</b>:
|
||||||
|
</p>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<div id="outline-container-orga601f2f" class="outline-2">
|
||||||
|
<h2 id="orga601f2f">Paper (<a href="paper/dehaeze22_optim_robus_compl_filte.pdf">link</a>)</h2>
|
||||||
|
<div class="outline-text-2" id="text-orga601f2f">
|
||||||
|
<p>
|
||||||
|
The paper has been created <a href="https://orgmode.org/">Org Mode</a> (generating <a href="https://www.latex-project.org/">LaTeX</a> code) under <a href="https://www.gnu.org/software/emacs/">Emacs</a>.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-orge418504" class="outline-2">
|
<div id="outline-container-orgd50e329" class="outline-2">
|
||||||
<h2 id="orge418504">Matlab Scripts</h2>
|
<h2 id="orgd50e329">Matlab Scripts (<a href="matlab/dehaeze22_optim_robus_compl_filte_matlab.html">link</a>)</h2>
|
||||||
<div class="outline-text-2" id="text-orge418504">
|
<div class="outline-text-2" id="text-orgd50e329">
|
||||||
<p>
|
<p>
|
||||||
The Matlab scripts that permits to obtain all the results presented in the paper are accessible <a href="matlab/index.html">here</a>.
|
All the <a href="https://fr.mathworks.com/">Matlab</a> code that was used for the paper are accessible so that all the results are reproducible.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="outline-container-org99adac0" class="outline-2">
|
<div id="outline-container-org3b999bd" class="outline-2">
|
||||||
<h2 id="org99adac0">Tikz Figures</h2>
|
<h2 id="org3b999bd">Tikz Figures (<a href="tikz/dehaeze22_optim_robus_compl_filte_tikz.html">link</a>)</h2>
|
||||||
<div class="outline-text-2" id="text-org99adac0">
|
<div class="outline-text-2" id="text-org3b999bd">
|
||||||
<p>
|
<p>
|
||||||
All the figures in the paper are generated using <a href="https://sourceforge.net/projects/pgf/">TikZ</a>. The code snippets that was used to generate the figures are accessible <a href="tikz/index.html">here</a>.
|
All the figures for the paper have been generated using <a href="https://sourceforge.net/projects/pgf/">TikZ</a>.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="outline-container-org870b921" class="outline-2">
|
||||||
|
<h2 id="org870b921">Cite this paper</h2>
|
||||||
|
<div class="outline-text-2" id="text-org870b921">
|
||||||
|
<p>
|
||||||
|
To cite this paper use the following bibtex code.
|
||||||
|
</p>
|
||||||
|
<div class="org-src-container">
|
||||||
|
<pre class="src src-bibtex">
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
You can also use the formatted citation below.
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
nil</blockquote>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
45
index.org
@@ -1,35 +1,50 @@
|
|||||||
#+TITLE: Robust and Optimal Sensor Fusion
|
#+TITLE: Robust and Optimal Sensor Fusion using Complementary Filters
|
||||||
:DRAWER:
|
:DRAWER:
|
||||||
#+SUBTITLE: Dehaeze Thomas and Collette Christophe
|
#+SUBTITLE: Dehaeze Thomas and Collette Christophe
|
||||||
|
|
||||||
#+HTML_LINK_HOME: ../index.html
|
#+HTML_LINK_HOME: ../index.html
|
||||||
#+HTML_LINK_UP: ../index.html
|
#+HTML_LINK_UP: ../index.html
|
||||||
|
|
||||||
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
|
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
|
#+HTML_HEAD: <style> #content {margin: auto;} </style>
|
||||||
|
|
||||||
#+OPTIONS: toc:nil
|
#+OPTIONS: toc:nil
|
||||||
#+OPTIONS: html-postamble:nil
|
#+OPTIONS: html-postamble:nil
|
||||||
|
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="css/htmlize.css"/>
|
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="css/readtheorg.css"/>
|
|
||||||
#+HTML_HEAD: <script src="js/jquery.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="js/bootstrap.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="js/jquery.stickytableheaders.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="js/readtheorg.js"></script>
|
|
||||||
:END:
|
:END:
|
||||||
|
|
||||||
* Paper
|
#+begin_quote
|
||||||
|
*Abstract*:
|
||||||
|
|
||||||
|
#+end_quote
|
||||||
|
|
||||||
|
* Paper ([[file:paper/dehaeze22_optim_robus_compl_filte.pdf][link]])
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
The PDF version of the paper is accessible [[file:paper/paper.pdf][here]].
|
The paper has been created [[https://orgmode.org/][Org Mode]] (generating [[https://www.latex-project.org/][LaTeX]] code) under [[https://www.gnu.org/software/emacs/][Emacs]].
|
||||||
|
|
||||||
* Matlab Scripts
|
* Matlab Scripts ([[file:matlab/dehaeze22_optim_robus_compl_filte_matlab.org][link]])
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
The Matlab scripts that permits to obtain all the results presented in the paper are accessible [[file:matlab/index.org][here]].
|
All the [[https://fr.mathworks.com/][Matlab]] code that was used for the paper are accessible so that all the results are reproducible.
|
||||||
|
|
||||||
* Tikz Figures
|
* Tikz Figures ([[file:tikz/dehaeze22_optim_robus_compl_filte_tikz.org][link]])
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:UNNUMBERED: t
|
:UNNUMBERED: t
|
||||||
:END:
|
:END:
|
||||||
All the figures in the paper are generated using [[https://sourceforge.net/projects/pgf/][TikZ]]. The code snippets that was used to generate the figures are accessible [[file:tikz/index.org][here]].
|
All the figures for the paper have been generated using [[https://sourceforge.net/projects/pgf/][TikZ]].
|
||||||
|
|
||||||
|
|
||||||
|
* Cite this paper
|
||||||
|
:PROPERTIES:
|
||||||
|
:UNNUMBERED: t
|
||||||
|
:END:
|
||||||
|
To cite this paper use the following bibtex code.
|
||||||
|
#+begin_src bibtex
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
You can also use the formatted citation below.
|
||||||
|
#+begin_quote
|
||||||
|
#+end_quote
|
||||||
|
98
journal/.latexmkrc
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
#!/bin/env perl
|
||||||
|
|
||||||
|
# Shebang is only to get syntax highlighting right across GitLab, GitHub and IDEs.
|
||||||
|
# This file is not meant to be run, but read by `latexmk`.
|
||||||
|
|
||||||
|
# ======================================================================================
|
||||||
|
# Perl `latexmk` configuration file
|
||||||
|
# ======================================================================================
|
||||||
|
|
||||||
|
# ======================================================================================
|
||||||
|
# PDF Generation/Building/Compilation
|
||||||
|
# ======================================================================================
|
||||||
|
|
||||||
|
@default_files=('dehaeze22_optim_robus_compl_filte.tex');
|
||||||
|
|
||||||
|
# PDF-generating modes are:
|
||||||
|
# 1: pdflatex, as specified by $pdflatex variable (still largely in use)
|
||||||
|
# 2: postscript conversion, as specified by the $ps2pdf variable (useless)
|
||||||
|
# 3: dvi conversion, as specified by the $dvipdf variable (useless)
|
||||||
|
# 4: lualatex, as specified by the $lualatex variable (best)
|
||||||
|
# 5: xelatex, as specified by the $xelatex variable (second best)
|
||||||
|
$pdf_mode = 1;
|
||||||
|
|
||||||
|
# Treat undefined references and citations as well as multiply defined references as
|
||||||
|
# ERRORS instead of WARNINGS.
|
||||||
|
# This is only checked in the *last* run, since naturally, there are undefined references
|
||||||
|
# in initial runs.
|
||||||
|
# This setting is potentially annoying when debugging/editing, but highly desirable
|
||||||
|
# in the CI pipeline, where such a warning should result in a failed pipeline, since the
|
||||||
|
# final document is incomplete/corrupted.
|
||||||
|
#
|
||||||
|
# However, I could not eradicate all warnings, so that `latexmk` currently fails with
|
||||||
|
# this option enabled.
|
||||||
|
# Specifically, `microtype` fails together with `fontawesome`/`fontawesome5`, see:
|
||||||
|
# https://tex.stackexchange.com/a/547514/120853
|
||||||
|
# The fix in that answer did not help.
|
||||||
|
# Setting `verbose=silent` to mute `microtype` warnings did not work.
|
||||||
|
# Switching between `fontawesome` and `fontawesome5` did not help.
|
||||||
|
$warnings_as_errors = 0;
|
||||||
|
|
||||||
|
# Show used CPU time. Looks like: https://tex.stackexchange.com/a/312224/120853
|
||||||
|
$show_time = 1;
|
||||||
|
|
||||||
|
# Default is 5; we seem to need more owed to the complexity of the document.
|
||||||
|
# Actual documents probably don't need this many since they won't use all features,
|
||||||
|
# plus won't be compiling from cold each time.
|
||||||
|
$max_repeat=7;
|
||||||
|
|
||||||
|
# --shell-escape option (execution of code outside of latex) is required for the
|
||||||
|
#'svg' package.
|
||||||
|
# It converts raw SVG files to the PDF+PDF_TEX combo using InkScape.
|
||||||
|
#
|
||||||
|
# SyncTeX allows to jump between source (code) and output (PDF) in IDEs with support
|
||||||
|
# (many have it). A value of `1` is enabled (gzipped), `-1` is enabled but uncompressed,
|
||||||
|
# `0` is off.
|
||||||
|
# Testing in VSCode w/ LaTeX Workshop only worked for the compressed version.
|
||||||
|
# Adjust this as needed. Of course, only relevant for local use, no effect on a remote
|
||||||
|
# CI pipeline (except for slower compilation, probably).
|
||||||
|
#
|
||||||
|
# %O and %S will forward Options and the Source file, respectively, given to latexmk.
|
||||||
|
#
|
||||||
|
# `set_tex_cmds` applies to all *latex commands (latex, xelatex, lualatex, ...), so
|
||||||
|
# no need to specify these each. This allows to simply change `$pdf_mode` to get a
|
||||||
|
# different engine. Check if this works with `latexmk --commands`.
|
||||||
|
set_tex_cmds("--shell-escape -interaction=nonstopmode --synctex=1 %O %S");
|
||||||
|
|
||||||
|
# Use default pdf viewer
|
||||||
|
$pdf_previewer = 'zathura';
|
||||||
|
|
||||||
|
# option 2 is same as 1 (run biber when necessary), but also deletes the
|
||||||
|
# regeneratable bbl-file in a clenaup (`latexmk -c`). Do not use if original
|
||||||
|
# bib file is not available!
|
||||||
|
$bibtex_use = 1; # default: 1
|
||||||
|
|
||||||
|
# Change default `biber` call, help catch errors faster/clearer. See
|
||||||
|
# https://web.archive.org/web/20200526101657/https://www.semipol.de/2018/06/12/latex-best-practices.html#database-entries
|
||||||
|
$bibtex = "bibtex %S";
|
||||||
|
|
||||||
|
# ======================================================================================
|
||||||
|
# Auxiliary Files
|
||||||
|
# ======================================================================================
|
||||||
|
|
||||||
|
# Let latexmk know about generated files, so they can be used to detect if a
|
||||||
|
# rerun is required, or be deleted in a cleanup.
|
||||||
|
# loe: List of Examples (KOMAScript)
|
||||||
|
# lol: List of Listings (`listings` and `minted` packages)
|
||||||
|
# run.xml: biber runs
|
||||||
|
# glg: glossaries log
|
||||||
|
# glstex: generated from glossaries-extra
|
||||||
|
push @generated_exts, 'loe', 'lol', 'run.xml', 'glg', 'glstex';
|
||||||
|
|
||||||
|
# Also delete the *.glstex files from package glossaries-extra. Problem is,
|
||||||
|
# that that package generates files of the form "basename-digit.glstex" if
|
||||||
|
# multiple glossaries are present. Latexmk looks for "basename.glstex" and so
|
||||||
|
# does not find those. For that purpose, use wildcard.
|
||||||
|
# Also delete files generated by gnuplot/pgfplots contour plots
|
||||||
|
# (.dat, .script, .table).
|
||||||
|
$clean_ext = "%R-*.glstex %R_contourtmp*.*";
|
@@ -1,25 +1,15 @@
|
|||||||
#+TITLE: Optimal and Robust Sensor Fusion
|
#+TITLE: Optimal and Robust Sensor Fusion using Complementary Filters
|
||||||
:DRAWER:
|
:DRAWER:
|
||||||
#+LATEX_CLASS: IEEEtran
|
#+LATEX_CLASS: IEEEtran
|
||||||
#+LATEX_CLASS_OPTIONS: [conference]
|
#+LATEX_CLASS_OPTIONS: [10pt,final,journal,a4paper]
|
||||||
#+OPTIONS: toc:nil todo:nil
|
#+OPTIONS: toc:nil todo:nil
|
||||||
#+STARTUP: overview
|
#+STARTUP: overview
|
||||||
|
|
||||||
#+DATE: {{{time(%Y-%m-%d)}}}
|
#+DATE: {{{time(%Y-%m-%d)}}}
|
||||||
|
|
||||||
#+AUTHOR: @@latex:\IEEEauthorblockN{Dehaeze Thomas}@@
|
#+AUTHOR: @@latex:\author{Thomas~Dehaeze, Mohit~Verma, and~Christophe~Collette@@
|
||||||
#+AUTHOR: @@latex:\IEEEauthorblockA{\textit{European Synchrotron Radiation Facility} \\@@
|
#+AUTHOR: @@latex:\thanks{The authors are with the Precision Mechatronics Laboratory at the University of Liege, Belgium.}@@
|
||||||
#+AUTHOR: @@latex:Grenoble, France\\@@
|
#+AUTHOR: @@latex:\thanks{Corresponding author: thomas.dehaeze@esrf.fr}@@
|
||||||
#+AUTHOR: @@latex:\textit{Precision Mechatronics Laboratory} \\@@
|
|
||||||
#+AUTHOR: @@latex:\textit{University of Liege}, Belgium \\@@
|
|
||||||
#+AUTHOR: @@latex:thomas.dehaeze@esrf.fr@@
|
|
||||||
#+AUTHOR: @@latex:}\and@@
|
|
||||||
#+AUTHOR: @@latex:\IEEEauthorblockN{Collette Christophe}@@
|
|
||||||
#+AUTHOR: @@latex:\IEEEauthorblockA{\textit{BEAMS Department}\\@@
|
|
||||||
#+AUTHOR: @@latex:\textit{Free University of Brussels}, Belgium\\@@
|
|
||||||
#+AUTHOR: @@latex:\textit{Precision Mechatronics Laboratory} \\@@
|
|
||||||
#+AUTHOR: @@latex:\textit{University of Liege}, Belgium \\@@
|
|
||||||
#+AUTHOR: @@latex:ccollett@ulb.ac.be@@
|
|
||||||
#+AUTHOR: @@latex:}@@
|
#+AUTHOR: @@latex:}@@
|
||||||
|
|
||||||
#+LATEX_HEADER: \IEEEoverridecommandlockouts
|
#+LATEX_HEADER: \IEEEoverridecommandlockouts
|
||||||
@@ -38,40 +28,44 @@
|
|||||||
#+LATEX_HEADER_EXTRA: \usepackage{showframe}
|
#+LATEX_HEADER_EXTRA: \usepackage{showframe}
|
||||||
|
|
||||||
#+LATEX_HEADER: \def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
|
#+LATEX_HEADER: \def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
|
||||||
|
|
||||||
\bibliographystyle{IEEEtran}
|
|
||||||
:END:
|
:END:
|
||||||
|
|
||||||
* LaTeX Config :noexport:
|
|
||||||
#+begin_src latex :tangle config.tex
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
* Build :noexport:
|
* Build :noexport:
|
||||||
#+NAME: startblock
|
#+NAME: startblock
|
||||||
#+BEGIN_SRC emacs-lisp :results none
|
#+BEGIN_SRC emacs-lisp :results none
|
||||||
(add-to-list 'org-latex-classes
|
(add-to-list 'org-latex-classes
|
||||||
'("IEEEtran"
|
'("IEEEtran"
|
||||||
"\\documentclass{IEEEtran}"
|
"\\documentclass{IEEEtran}"
|
||||||
("\\section{%s}" . "\\section*{%s}")
|
("\\section{%s}" . "\\section*{%s}")
|
||||||
("\\subsection{%s}" . "\\subsection*{%s}")
|
("\\subsection{%s}" . "\\subsection*{%s}")
|
||||||
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
|
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
|
||||||
("\\paragraph{%s}" . "\\paragraph*{%s}")
|
("\\paragraph{%s}" . "\\paragraph*{%s}")
|
||||||
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
|
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
|
||||||
)
|
)
|
||||||
|
|
||||||
(defun delete-org-comments (backend)
|
;; Remove automatic org headings
|
||||||
(loop for comment in (reverse (org-element-map (org-element-parse-buffer)
|
(defun my-latex-filter-removeOrgAutoLabels (text backend info)
|
||||||
'comment 'identity))
|
"Org-mode automatically generates labels for headings despite explicit use of `#+LABEL`. This filter forcibly removes all automatically generated org-labels in headings."
|
||||||
do
|
(when (org-export-derived-backend-p backend 'latex)
|
||||||
(setf (buffer-substring (org-element-property :begin comment)
|
(replace-regexp-in-string "\\\\label{sec:org[a-f0-9]+}\n" "" text)))
|
||||||
(org-element-property :end comment))
|
|
||||||
"")))
|
|
||||||
|
|
||||||
;; add to export hook
|
(add-to-list 'org-export-filter-headline-functions
|
||||||
(add-hook 'org-export-before-processing-hook 'delete-org-comments)
|
'my-latex-filter-removeOrgAutoLabels)
|
||||||
|
|
||||||
;; Remove hypersetup
|
;; Automatic delete org org-comments
|
||||||
(setq org-latex-with-hyperref nil)
|
(defun delete-org-comments (backend)
|
||||||
|
(loop for comment in (reverse (org-element-map (org-element-parse-buffer)
|
||||||
|
'comment 'identity))
|
||||||
|
do
|
||||||
|
(setf (buffer-substring (org-element-property :begin comment)
|
||||||
|
(org-element-property :end comment))
|
||||||
|
"")))
|
||||||
|
|
||||||
|
;; add to export hook
|
||||||
|
(add-hook 'org-export-before-processing-hook 'delete-org-comments)
|
||||||
|
|
||||||
|
;; Remove hypersetup
|
||||||
|
(setq org-latex-with-hyperref nil)
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
* Abstract :ignore:
|
* Abstract :ignore:
|
||||||
@@ -87,6 +81,8 @@
|
|||||||
* Introduction
|
* Introduction
|
||||||
<<sec:introduction>>
|
<<sec:introduction>>
|
||||||
|
|
||||||
|
cite:mahony08_nonlin_compl_filter_special_orthog_group
|
||||||
|
|
||||||
- Section ref:sec:optimal_fusion
|
- Section ref:sec:optimal_fusion
|
||||||
- Section ref:sec:robust_fusion
|
- Section ref:sec:robust_fusion
|
||||||
- Section ref:sec:optimal_robust_fusion
|
- Section ref:sec:optimal_robust_fusion
|
||||||
@@ -96,7 +92,6 @@
|
|||||||
<<sec:optimal_fusion>>
|
<<sec:optimal_fusion>>
|
||||||
|
|
||||||
** Sensor Model
|
** Sensor Model
|
||||||
|
|
||||||
Let's consider a sensor measuring a physical quantity $x$ (Figure ref:fig:sensor_model_noise).
|
Let's consider a sensor measuring a physical quantity $x$ (Figure ref:fig:sensor_model_noise).
|
||||||
The sensor has an internal dynamics which is here modelled with a Linear Time Invariant (LTI) system transfer function $G_i(s)$.
|
The sensor has an internal dynamics which is here modelled with a Linear Time Invariant (LTI) system transfer function $G_i(s)$.
|
||||||
|
|
||||||
@@ -131,7 +126,6 @@ In order to obtain an estimate $\hat{x}_i$ of $x$, a model $\hat{G}_i$ of the (t
|
|||||||
[[file:figs/sensor_model_noise.pdf]]
|
[[file:figs/sensor_model_noise.pdf]]
|
||||||
|
|
||||||
** Sensor Fusion Architecture
|
** Sensor Fusion Architecture
|
||||||
|
|
||||||
Let's now consider two sensors measuring the same physical quantity $x$ but with different dynamics $(G_1, G_2)$ and noise characteristics $(N_1, N_2)$ (Figure ref:fig:sensor_fusion_noise_arch).
|
Let's now consider two sensors measuring the same physical quantity $x$ but with different dynamics $(G_1, G_2)$ and noise characteristics $(N_1, N_2)$ (Figure ref:fig:sensor_fusion_noise_arch).
|
||||||
|
|
||||||
The noise sources $\tilde{n}_1$ and $\tilde{n}_2$ are considered to be uncorrelated.
|
The noise sources $\tilde{n}_1$ and $\tilde{n}_2$ are considered to be uncorrelated.
|
||||||
@@ -195,8 +189,8 @@ This can be cast into an $\mathcal{H}_2$ synthesis problem by considering the fo
|
|||||||
\begin{pmatrix}
|
\begin{pmatrix}
|
||||||
z_1 \\ z_2 \\ v
|
z_1 \\ z_2 \\ v
|
||||||
\end{pmatrix} = \underbrace{\begin{bmatrix}
|
\end{pmatrix} = \underbrace{\begin{bmatrix}
|
||||||
N_1 & N_1 \\
|
N_1 & -N_1 \\
|
||||||
0 & N_2 \\
|
0 & N_2 \\
|
||||||
1 & 0
|
1 & 0
|
||||||
\end{bmatrix}}_{P_{\mathcal{H}_2}} \begin{pmatrix}
|
\end{bmatrix}}_{P_{\mathcal{H}_2}} \begin{pmatrix}
|
||||||
w \\ u
|
w \\ u
|
||||||
@@ -223,8 +217,46 @@ We then have that the $\mathcal{H}_2$ synthesis applied on $P_{\mathcal{H}_2}$ g
|
|||||||
|
|
||||||
** Example
|
** Example
|
||||||
|
|
||||||
|
#+name: fig:sensors_nominal_dynamics
|
||||||
|
#+caption: Sensor nominal dynamics from the velocity of the object to the output voltage
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/sensors_nominal_dynamics.pdf]]
|
||||||
|
|
||||||
|
#+name: fig:sensors_noise
|
||||||
|
#+caption: Amplitude spectral density of the sensors $\sqrt{\Phi_{n_i}(\omega)} = |N_i(j\omega)|$
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/sensors_noise.pdf]]
|
||||||
|
|
||||||
|
|
||||||
|
#+name: fig:htwo_comp_filters
|
||||||
|
#+caption: Obtained complementary filters using the $\mathcal{H}_2$ Synthesis
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/htwo_comp_filters.pdf]]
|
||||||
|
|
||||||
|
|
||||||
|
#+name: fig:psd_sensors_htwo_synthesis
|
||||||
|
#+caption: Power Spectral Density of the estimated $\hat{x}$ using the two sensors alone and using the optimally fused signal
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/psd_sensors_htwo_synthesis.pdf]]
|
||||||
|
|
||||||
|
|
||||||
|
#+name: fig:super_sensor_time_domain_h2
|
||||||
|
#+caption: Noise of individual sensors and noise of the super sensor
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/super_sensor_time_domain_h2.pdf]]
|
||||||
|
|
||||||
** Robustness Problem
|
** Robustness Problem
|
||||||
|
|
||||||
|
#+name: fig:sensors_nominal_dynamics_and_uncertainty
|
||||||
|
#+caption: Nominal Sensor Dynamics $\hat{G}_i$ (solid lines) as well as the spread of the dynamical uncertainty (background color)
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/sensors_nominal_dynamics_and_uncertainty.pdf]]
|
||||||
|
|
||||||
|
#+name: fig:super_sensor_dynamical_uncertainty_H2
|
||||||
|
#+caption: Super sensor dynamical uncertainty when using the $\mathcal{H}_2$ Synthesis
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/super_sensor_dynamical_uncertainty_H2.pdf]]
|
||||||
|
|
||||||
* Robust Sensor Fusion: $\mathcal{H}_\infty$ Synthesis
|
* Robust Sensor Fusion: $\mathcal{H}_\infty$ Synthesis
|
||||||
<<sec:robust_fusion>>
|
<<sec:robust_fusion>>
|
||||||
|
|
||||||
@@ -270,7 +302,6 @@ As $H_1$ and $H_2$ are complementary filters, we finally have:
|
|||||||
[[file:figs/sensor_fusion_arch_uncertainty.pdf]]
|
[[file:figs/sensor_fusion_arch_uncertainty.pdf]]
|
||||||
|
|
||||||
** Super Sensor Dynamical Uncertainty
|
** Super Sensor Dynamical Uncertainty
|
||||||
|
|
||||||
The uncertainty set of the transfer function from $\hat{x}$ to $x$ at frequency $\omega$ is bounded in the complex plane by a circle centered on 1 and with a radius equal to $|W_1(j\omega) H_1(j\omega)| + |W_2(j\omega) H_2(j\omega)|$ as shown in Figure ref:fig:uncertainty_set_super_sensor.
|
The uncertainty set of the transfer function from $\hat{x}$ to $x$ at frequency $\omega$ is bounded in the complex plane by a circle centered on 1 and with a radius equal to $|W_1(j\omega) H_1(j\omega)| + |W_2(j\omega) H_2(j\omega)|$ as shown in Figure ref:fig:uncertainty_set_super_sensor.
|
||||||
|
|
||||||
|
|
||||||
@@ -306,9 +337,9 @@ This problem can thus be dealt with an $\mathcal{H}_\infty$ synthesis problem by
|
|||||||
\begin{pmatrix}
|
\begin{pmatrix}
|
||||||
z_1 \\ z_2 \\ v
|
z_1 \\ z_2 \\ v
|
||||||
\end{pmatrix} = \underbrace{\begin{bmatrix}
|
\end{pmatrix} = \underbrace{\begin{bmatrix}
|
||||||
W_u W_1 & W_u W_1 \\
|
W_u W_1 & -W_u W_1 \\
|
||||||
0 & W_u W_2 \\
|
0 & W_u W_2 \\
|
||||||
1 & 0
|
1 & 0
|
||||||
\end{bmatrix}}_{P_{\mathcal{H}_\infty}} \begin{pmatrix}
|
\end{bmatrix}}_{P_{\mathcal{H}_\infty}} \begin{pmatrix}
|
||||||
w \\ u
|
w \\ u
|
||||||
\end{pmatrix}
|
\end{pmatrix}
|
||||||
@@ -332,6 +363,33 @@ The $\mathcal{H}_\infty$ norm of Eq. eqref:eq:Hinf_norm is equals to $\sigma_n$
|
|||||||
|
|
||||||
** Example
|
** Example
|
||||||
|
|
||||||
|
#+name: fig:sensors_uncertainty_weights
|
||||||
|
#+caption: Magnitude of the multiplicative uncertainty weights $|W_i(j\omega)|$
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/sensors_uncertainty_weights.pdf]]
|
||||||
|
|
||||||
|
|
||||||
|
#+name: fig:weight_uncertainty_bounds_Wu
|
||||||
|
#+caption: Uncertainty region of the two sensors as well as the wanted maximum uncertainty of the super sensor (dashed lines)
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/weight_uncertainty_bounds_Wu.pdf]]
|
||||||
|
|
||||||
|
#+name: fig:hinf_comp_filters
|
||||||
|
#+caption: Obtained complementary filters using the $\mathcal{H}_\infty$ Synthesis
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/hinf_comp_filters.pdf]]
|
||||||
|
|
||||||
|
#+name: fig:super_sensor_dynamical_uncertainty_Hinf
|
||||||
|
#+caption: Super sensor dynamical uncertainty (solid curve) when using the $\mathcal{H}_\infty$ Synthesis
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/super_sensor_dynamical_uncertainty_Hinf.pdf]]
|
||||||
|
|
||||||
|
#+name: fig:psd_sensors_hinf_synthesis
|
||||||
|
#+caption: Power Spectral Density of the estimated $\hat{x}$ using the two sensors alone and using the $\mathcal{H}_\infty$ synthesis
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/psd_sensors_hinf_synthesis.pdf]]
|
||||||
|
|
||||||
|
|
||||||
* Optimal and Robust Sensor Fusion: Mixed $\mathcal{H}_2/\mathcal{H}_\infty$ Synthesis
|
* Optimal and Robust Sensor Fusion: Mixed $\mathcal{H}_2/\mathcal{H}_\infty$ Synthesis
|
||||||
<<sec:optimal_robust_fusion>>
|
<<sec:optimal_robust_fusion>>
|
||||||
|
|
||||||
@@ -406,12 +464,32 @@ The synthesis objective is to:
|
|||||||
- Minimize the $\mathcal{H}_2$ norm from $w$ to $(z_{2,1}, z_{2,2})$
|
- Minimize the $\mathcal{H}_2$ norm from $w$ to $(z_{2,1}, z_{2,2})$
|
||||||
|
|
||||||
#+name: fig:mixed_h2_hinf_synthesis
|
#+name: fig:mixed_h2_hinf_synthesis
|
||||||
#+caption: Generalized plant $P_{\mathcal{H}_2/\matlcal{H}_\infty}$ used for the mixed $\mathcal{H}_2/\mathcal{H}_\infty$ synthesis of complementary filters
|
#+caption: Generalized plant $P_{\mathcal{H}_2/\mathcal{H}_\infty}$ used for the mixed $\mathcal{H}_2/\mathcal{H}_\infty$ synthesis of complementary filters
|
||||||
#+attr_latex: :scale 1
|
#+attr_latex: :scale 1
|
||||||
[[file:figs/mixed_h2_hinf_synthesis.pdf]]
|
[[file:figs/mixed_h2_hinf_synthesis.pdf]]
|
||||||
|
|
||||||
** Example
|
** Example
|
||||||
|
|
||||||
|
#+name: fig:htwo_hinf_comp_filters
|
||||||
|
#+caption: Obtained complementary filters after mixed $\mathcal{H}_2/\mathcal{H}_\infty$ synthesis
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/htwo_hinf_comp_filters.pdf]]
|
||||||
|
|
||||||
|
#+name: fig:psd_sensors_htwo_hinf_synthesis
|
||||||
|
#+caption: Power Spectral Density of the Super Sensor obtained with the mixed $\mathcal{H}_2/\mathcal{H}_\infty$ synthesis
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/psd_sensors_htwo_hinf_synthesis.pdf]]
|
||||||
|
|
||||||
|
#+name: fig:super_sensor_time_domain_h2_hinf
|
||||||
|
#+caption: Noise of individual sensors and noise of the super sensor
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/super_sensor_time_domain_h2_hinf.pdf]]
|
||||||
|
|
||||||
|
#+name: fig:super_sensor_dynamical_uncertainty_Htwo_Hinf
|
||||||
|
#+caption: Super sensor dynamical uncertainty (solid curve) when using the mixed $\mathcal{H}_2/\mathcal{H}_\infty$ Synthesis
|
||||||
|
#+attr_latex: :scale 1
|
||||||
|
[[file:figs/super_sensor_dynamical_uncertainty_Htwo_Hinf.pdf]]
|
||||||
|
|
||||||
* Experimental Validation
|
* Experimental Validation
|
||||||
<<sec:experimental_validation>>
|
<<sec:experimental_validation>>
|
||||||
|
|
||||||
@@ -429,4 +507,10 @@ The synthesis objective is to:
|
|||||||
* Acknowledgment
|
* Acknowledgment
|
||||||
|
|
||||||
* Bibliography :ignore:
|
* Bibliography :ignore:
|
||||||
|
\bibliographystyle{IEEEtran}
|
||||||
\bibliography{ref}
|
\bibliography{ref}
|
||||||
|
|
||||||
|
* Local Variables :noexport:
|
||||||
|
# Local Variables:
|
||||||
|
# org-latex-packages-alist: nil
|
||||||
|
# End:
|
BIN
journal/dehaeze22_optim_robus_compl_filte.pdf
Normal file
@@ -1,6 +1,6 @@
|
|||||||
% Created 2020-09-23 mer. 14:15
|
% Created 2021-09-10 ven. 11:01
|
||||||
% Intended LaTeX compiler: pdflatex
|
% Intended LaTeX compiler: pdflatex
|
||||||
\documentclass[conference]{IEEEtran}
|
\documentclass[10pt,final,journal,a4paper]{IEEEtran}
|
||||||
\usepackage[utf8]{inputenc}
|
\usepackage[utf8]{inputenc}
|
||||||
\usepackage[T1]{fontenc}
|
\usepackage[T1]{fontenc}
|
||||||
\usepackage{graphicx}
|
\usepackage{graphicx}
|
||||||
@@ -14,12 +14,6 @@
|
|||||||
\usepackage{amssymb}
|
\usepackage{amssymb}
|
||||||
\usepackage{capt-of}
|
\usepackage{capt-of}
|
||||||
\usepackage{hyperref}
|
\usepackage{hyperref}
|
||||||
\usepackage[most]{tcolorbox}
|
|
||||||
\usepackage{bm}
|
|
||||||
\usepackage{booktabs}
|
|
||||||
\usepackage{tabularx}
|
|
||||||
\usepackage{array}
|
|
||||||
\usepackage{siunitx}
|
|
||||||
\IEEEoverridecommandlockouts
|
\IEEEoverridecommandlockouts
|
||||||
\usepackage{cite}
|
\usepackage{cite}
|
||||||
\usepackage{amsmath,amssymb,amsfonts}
|
\usepackage{amsmath,amssymb,amsfonts}
|
||||||
@@ -34,9 +28,9 @@
|
|||||||
\renewcommand{\citedash}{--}
|
\renewcommand{\citedash}{--}
|
||||||
\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
|
\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
|
||||||
\usepackage{showframe}
|
\usepackage{showframe}
|
||||||
\author{\IEEEauthorblockN{Dehaeze Thomas} \IEEEauthorblockA{\textit{European Synchrotron Radiation Facility} \\ Grenoble, France\\ \textit{Precision Mechatronics Laboratory} \\ \textit{University of Liege}, Belgium \\ thomas.dehaeze@esrf.fr }\and \IEEEauthorblockN{Collette Christophe} \IEEEauthorblockA{\textit{BEAMS Department}\\ \textit{Free University of Brussels}, Belgium\\ \textit{Precision Mechatronics Laboratory} \\ \textit{University of Liege}, Belgium \\ ccollett@ulb.ac.be }}
|
\author{\author{Thomas~Dehaeze, Mohit~Verma, and~Christophe~Collette \thanks{The authors are with the Precision Mechatronics Laboratory at the University of Liege, Belgium.} \thanks{Corresponding author: thomas.dehaeze@esrf.fr} }}
|
||||||
\date{2020-09-23}
|
\date{2021-09-10}
|
||||||
\title{Optimal and Robust Sensor Fusion}
|
\title{Optimal and Robust Sensor Fusion using Complementary Filters}
|
||||||
\begin{document}
|
\begin{document}
|
||||||
|
|
||||||
\maketitle
|
\maketitle
|
||||||
@@ -50,9 +44,10 @@ Complementary Filters, Sensor Fusion, H-Infinity Synthesis
|
|||||||
\end{IEEEkeywords}
|
\end{IEEEkeywords}
|
||||||
|
|
||||||
\section{Introduction}
|
\section{Introduction}
|
||||||
\label{sec:org88afd51}
|
|
||||||
\label{sec:introduction}
|
\label{sec:introduction}
|
||||||
|
|
||||||
|
\cite{mahony08_nonlin_compl_filter_special_orthog_group}
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Section \ref{sec:optimal_fusion}
|
\item Section \ref{sec:optimal_fusion}
|
||||||
\item Section \ref{sec:robust_fusion}
|
\item Section \ref{sec:robust_fusion}
|
||||||
@@ -61,12 +56,9 @@ Complementary Filters, Sensor Fusion, H-Infinity Synthesis
|
|||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\section{Optimal Super Sensor Noise: \(\mathcal{H}_2\) Synthesis}
|
\section{Optimal Super Sensor Noise: \(\mathcal{H}_2\) Synthesis}
|
||||||
\label{sec:org5853545}
|
|
||||||
\label{sec:optimal_fusion}
|
\label{sec:optimal_fusion}
|
||||||
|
|
||||||
\subsection{Sensor Model}
|
\subsection{Sensor Model}
|
||||||
\label{sec:org565ea86}
|
|
||||||
|
|
||||||
Let's consider a sensor measuring a physical quantity \(x\) (Figure \ref{fig:sensor_model_noise}).
|
Let's consider a sensor measuring a physical quantity \(x\) (Figure \ref{fig:sensor_model_noise}).
|
||||||
The sensor has an internal dynamics which is here modelled with a Linear Time Invariant (LTI) system transfer function \(G_i(s)\).
|
The sensor has an internal dynamics which is here modelled with a Linear Time Invariant (LTI) system transfer function \(G_i(s)\).
|
||||||
|
|
||||||
@@ -97,20 +89,18 @@ In order to obtain an estimate \(\hat{x}_i\) of \(x\), a model \(\hat{G}_i\) of
|
|||||||
|
|
||||||
\begin{figure}[htbp]
|
\begin{figure}[htbp]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[scale=1]{figs/sensor_model_noise.pdf}
|
\includegraphics[scale=1,scale=1]{figs/sensor_model_noise.pdf}
|
||||||
\caption{\label{fig:sensor_model_noise}Sensor Model}
|
\caption{\label{fig:sensor_model_noise}Sensor Model}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\subsection{Sensor Fusion Architecture}
|
\subsection{Sensor Fusion Architecture}
|
||||||
\label{sec:org1ae73e8}
|
|
||||||
|
|
||||||
Let's now consider two sensors measuring the same physical quantity \(x\) but with different dynamics \((G_1, G_2)\) and noise characteristics \((N_1, N_2)\) (Figure \ref{fig:sensor_fusion_noise_arch}).
|
Let's now consider two sensors measuring the same physical quantity \(x\) but with different dynamics \((G_1, G_2)\) and noise characteristics \((N_1, N_2)\) (Figure \ref{fig:sensor_fusion_noise_arch}).
|
||||||
|
|
||||||
The noise sources \(\tilde{n}_1\) and \(\tilde{n}_2\) are considered to be uncorrelated.
|
The noise sources \(\tilde{n}_1\) and \(\tilde{n}_2\) are considered to be uncorrelated.
|
||||||
|
|
||||||
\begin{figure}[htbp]
|
\begin{figure}[htbp]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[scale=1]{figs/sensor_fusion_noise_arch.pdf}
|
\includegraphics[scale=1,scale=1]{figs/sensor_fusion_noise_arch.pdf}
|
||||||
\caption{\label{fig:sensor_fusion_noise_arch}Sensor Fusion Architecture with sensor noise}
|
\caption{\label{fig:sensor_fusion_noise_arch}Sensor Fusion Architecture with sensor noise}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
@@ -140,7 +130,6 @@ In such case, the super sensor estimate \(\hat{x}\) is equal to \(x\) plus the n
|
|||||||
\end{equation}
|
\end{equation}
|
||||||
|
|
||||||
\subsection{Super Sensor Noise}
|
\subsection{Super Sensor Noise}
|
||||||
\label{sec:orgb2e8dd6}
|
|
||||||
Let's note \(n\) the super sensor noise.
|
Let's note \(n\) the super sensor noise.
|
||||||
\begin{equation}
|
\begin{equation}
|
||||||
n = \left( H_1 N_1 \right) \tilde{n}_1 + \left( H_2 N_2 \right) \tilde{n}_2
|
n = \left( H_1 N_1 \right) \tilde{n}_1 + \left( H_2 N_2 \right) \tilde{n}_2
|
||||||
@@ -154,7 +143,6 @@ As the noise of both sensors are considered to be uncorrelated, the PSD of the s
|
|||||||
It is clear that the PSD of the super sensor depends on the norm of the complementary filters.
|
It is clear that the PSD of the super sensor depends on the norm of the complementary filters.
|
||||||
|
|
||||||
\subsection{\(\mathcal{H}_2\) Synthesis of Complementary Filters}
|
\subsection{\(\mathcal{H}_2\) Synthesis of Complementary Filters}
|
||||||
\label{sec:orga4cf5f1}
|
|
||||||
The goal is to design \(H_1(s)\) and \(H_2(s)\) such that the effect of the noise sources \(\tilde{n}_1\) and \(\tilde{n}_2\) has the smallest possible effect on the noise \(n\) of the estimation \(\hat{x}\).
|
The goal is to design \(H_1(s)\) and \(H_2(s)\) such that the effect of the noise sources \(\tilde{n}_1\) and \(\tilde{n}_2\) has the smallest possible effect on the noise \(n\) of the estimation \(\hat{x}\).
|
||||||
|
|
||||||
And the goal is the minimize the Root Mean Square (RMS) value of \(n\):
|
And the goal is the minimize the Root Mean Square (RMS) value of \(n\):
|
||||||
@@ -170,8 +158,8 @@ This can be cast into an \(\mathcal{H}_2\) synthesis problem by considering the
|
|||||||
\begin{pmatrix}
|
\begin{pmatrix}
|
||||||
z_1 \\ z_2 \\ v
|
z_1 \\ z_2 \\ v
|
||||||
\end{pmatrix} = \underbrace{\begin{bmatrix}
|
\end{pmatrix} = \underbrace{\begin{bmatrix}
|
||||||
N_1 & N_1 \\
|
N_1 & -N_1 \\
|
||||||
0 & N_2 \\
|
0 & N_2 \\
|
||||||
1 & 0
|
1 & 0
|
||||||
\end{bmatrix}}_{P_{\mathcal{H}_2}} \begin{pmatrix}
|
\end{bmatrix}}_{P_{\mathcal{H}_2}} \begin{pmatrix}
|
||||||
w \\ u
|
w \\ u
|
||||||
@@ -193,22 +181,63 @@ We then have that the \(\mathcal{H}_2\) synthesis applied on \(P_{\mathcal{H}_2}
|
|||||||
|
|
||||||
\begin{figure}[htbp]
|
\begin{figure}[htbp]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[scale=1]{figs/h_two_optimal_fusion.pdf}
|
\includegraphics[scale=1,scale=1]{figs/h_two_optimal_fusion.pdf}
|
||||||
\caption{\label{fig:h_two_optimal_fusion}Generalized plant \(P_{\mathcal{H}_2}\) used for the \(\mathcal{H}_2\) synthesis of complementary filters}
|
\caption{\label{fig:h_two_optimal_fusion}Generalized plant \(P_{\mathcal{H}_2}\) used for the \(\mathcal{H}_2\) synthesis of complementary filters}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\subsection{Example}
|
\subsection{Example}
|
||||||
\label{sec:org74634c9}
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/sensors_nominal_dynamics.pdf}
|
||||||
|
\caption{\label{fig:sensors_nominal_dynamics}Sensor nominal dynamics from the velocity of the object to the output voltage}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/sensors_noise.pdf}
|
||||||
|
\caption{\label{fig:sensors_noise}Amplitude spectral density of the sensors \(\sqrt{\Phi_{n_i}(\omega)} = |N_i(j\omega)|\)}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/htwo_comp_filters.pdf}
|
||||||
|
\caption{\label{fig:htwo_comp_filters}Obtained complementary filters using the \(\mathcal{H}_2\) Synthesis}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/psd_sensors_htwo_synthesis.pdf}
|
||||||
|
\caption{\label{fig:psd_sensors_htwo_synthesis}Power Spectral Density of the estimated \(\hat{x}\) using the two sensors alone and using the optimally fused signal}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/super_sensor_time_domain_h2.pdf}
|
||||||
|
\caption{\label{fig:super_sensor_time_domain_h2}Noise of individual sensors and noise of the super sensor}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
\subsection{Robustness Problem}
|
\subsection{Robustness Problem}
|
||||||
\label{sec:org5fda5c1}
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/sensors_nominal_dynamics_and_uncertainty.pdf}
|
||||||
|
\caption{\label{fig:sensors_nominal_dynamics_and_uncertainty}Nominal Sensor Dynamics \(\hat{G}_i\) (solid lines) as well as the spread of the dynamical uncertainty (background color)}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/super_sensor_dynamical_uncertainty_H2.pdf}
|
||||||
|
\caption{\label{fig:super_sensor_dynamical_uncertainty_H2}Super sensor dynamical uncertainty when using the \(\mathcal{H}_2\) Synthesis}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
\section{Robust Sensor Fusion: \(\mathcal{H}_\infty\) Synthesis}
|
\section{Robust Sensor Fusion: \(\mathcal{H}_\infty\) Synthesis}
|
||||||
\label{sec:orgc88050f}
|
|
||||||
\label{sec:robust_fusion}
|
\label{sec:robust_fusion}
|
||||||
|
|
||||||
\subsection{Representation of Sensor Dynamical Uncertainty}
|
\subsection{Representation of Sensor Dynamical Uncertainty}
|
||||||
\label{sec:orgb09aa5a}
|
|
||||||
|
|
||||||
In Section \ref{sec:optimal_fusion}, the model \(\hat{G}_i(s)\) of the sensor was considered to be perfect.
|
In Section \ref{sec:optimal_fusion}, the model \(\hat{G}_i(s)\) of the sensor was considered to be perfect.
|
||||||
In reality, there are always uncertainty (neglected dynamics) associated with the estimation of the sensor dynamics.
|
In reality, there are always uncertainty (neglected dynamics) associated with the estimation of the sensor dynamics.
|
||||||
@@ -223,12 +252,11 @@ The sensor can then be represented as shown in Figure \ref{fig:sensor_model_unce
|
|||||||
|
|
||||||
\begin{figure}[htbp]
|
\begin{figure}[htbp]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[scale=1]{figs/sensor_model_uncertainty.pdf}
|
\includegraphics[scale=1,scale=1]{figs/sensor_model_uncertainty.pdf}
|
||||||
\caption{\label{fig:sensor_model_uncertainty}Sensor Model including Dynamical Uncertainty}
|
\caption{\label{fig:sensor_model_uncertainty}Sensor Model including Dynamical Uncertainty}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\subsection{Sensor Fusion Architecture}
|
\subsection{Sensor Fusion Architecture}
|
||||||
\label{sec:org1d92a74}
|
|
||||||
Let's consider the sensor fusion architecture shown in Figure \ref{fig:sensor_fusion_arch_uncertainty} where the dynamical uncertainties of both sensors are included.
|
Let's consider the sensor fusion architecture shown in Figure \ref{fig:sensor_fusion_arch_uncertainty} where the dynamical uncertainties of both sensors are included.
|
||||||
|
|
||||||
The super sensor estimate is then:
|
The super sensor estimate is then:
|
||||||
@@ -248,13 +276,11 @@ As \(H_1\) and \(H_2\) are complementary filters, we finally have:
|
|||||||
|
|
||||||
\begin{figure}[htbp]
|
\begin{figure}[htbp]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[scale=1]{figs/sensor_fusion_arch_uncertainty.pdf}
|
\includegraphics[scale=1,scale=1]{figs/sensor_fusion_arch_uncertainty.pdf}
|
||||||
\caption{\label{fig:sensor_fusion_arch_uncertainty}Sensor Fusion Architecture with sensor model uncertainty}
|
\caption{\label{fig:sensor_fusion_arch_uncertainty}Sensor Fusion Architecture with sensor model uncertainty}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\subsection{Super Sensor Dynamical Uncertainty}
|
\subsection{Super Sensor Dynamical Uncertainty}
|
||||||
\label{sec:org81db1d8}
|
|
||||||
|
|
||||||
The uncertainty set of the transfer function from \(\hat{x}\) to \(x\) at frequency \(\omega\) is bounded in the complex plane by a circle centered on 1 and with a radius equal to \(|W_1(j\omega) H_1(j\omega)| + |W_2(j\omega) H_2(j\omega)|\) as shown in Figure \ref{fig:uncertainty_set_super_sensor}.
|
The uncertainty set of the transfer function from \(\hat{x}\) to \(x\) at frequency \(\omega\) is bounded in the complex plane by a circle centered on 1 and with a radius equal to \(|W_1(j\omega) H_1(j\omega)| + |W_2(j\omega) H_2(j\omega)|\) as shown in Figure \ref{fig:uncertainty_set_super_sensor}.
|
||||||
|
|
||||||
|
|
||||||
@@ -262,14 +288,13 @@ And we can see that the dynamical uncertainty of the super sensor is equal to th
|
|||||||
|
|
||||||
\begin{figure}[htbp]
|
\begin{figure}[htbp]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[scale=1]{figs/uncertainty_set_super_sensor.pdf}
|
\includegraphics[scale=1,scale=1]{figs/uncertainty_set_super_sensor.pdf}
|
||||||
\caption{\label{fig:uncertainty_set_super_sensor}Super Sensor model uncertainty displayed in the complex plane}
|
\caption{\label{fig:uncertainty_set_super_sensor}Super Sensor model uncertainty displayed in the complex plane}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
At frequencies where \(\left|W_i(j\omega)\right| > 1\) the uncertainty exceeds \(100\%\) and sensor fusion is impossible.
|
At frequencies where \(\left|W_i(j\omega)\right| > 1\) the uncertainty exceeds \(100\%\) and sensor fusion is impossible.
|
||||||
|
|
||||||
\subsection{\(\mathcal{H_\infty}\) Synthesis of Complementary Filters}
|
\subsection{\(\mathcal{H_\infty}\) Synthesis of Complementary Filters}
|
||||||
\label{sec:org0e2a7a8}
|
|
||||||
In order for the fusion to be ``robust'', meaning no phase drop will be induced in the super sensor dynamics,
|
In order for the fusion to be ``robust'', meaning no phase drop will be induced in the super sensor dynamics,
|
||||||
|
|
||||||
The goal is to design two complementary filters \(H_1(s)\) and \(H_2(s)\) such that the super sensor noise uncertainty is kept reasonably small.
|
The goal is to design two complementary filters \(H_1(s)\) and \(H_2(s)\) such that the super sensor noise uncertainty is kept reasonably small.
|
||||||
@@ -279,7 +304,7 @@ To define what by ``small'' we mean, we use a weighting filter \(W_u(s)\) such t
|
|||||||
\left| W_1(j\omega)H_1(j\omega) \right| + \left| W_2(j\omega)H_2(j\omega) \right| < \frac{1}{\left| W_u(j\omega) \right|}, \quad \forall \omega
|
\left| W_1(j\omega)H_1(j\omega) \right| + \left| W_2(j\omega)H_2(j\omega) \right| < \frac{1}{\left| W_u(j\omega) \right|}, \quad \forall \omega
|
||||||
\end{equation}
|
\end{equation}
|
||||||
|
|
||||||
This is actually almost equivalent (to within a factor \(\sqrt{2}\)) equivalent as to have:
|
This is actually almost equivalent as to have (within a factor \(\sqrt{2}\)):
|
||||||
\begin{equation}
|
\begin{equation}
|
||||||
\left\| \begin{matrix} W_u W_1 H_1 \\ W_u W_2 H_2 \end{matrix} \right\|_\infty < 1
|
\left\| \begin{matrix} W_u W_1 H_1 \\ W_u W_2 H_2 \end{matrix} \right\|_\infty < 1
|
||||||
\end{equation}
|
\end{equation}
|
||||||
@@ -289,9 +314,9 @@ This problem can thus be dealt with an \(\mathcal{H}_\infty\) synthesis problem
|
|||||||
\begin{pmatrix}
|
\begin{pmatrix}
|
||||||
z_1 \\ z_2 \\ v
|
z_1 \\ z_2 \\ v
|
||||||
\end{pmatrix} = \underbrace{\begin{bmatrix}
|
\end{pmatrix} = \underbrace{\begin{bmatrix}
|
||||||
W_u W_1 & W_u W_1 \\
|
W_u W_1 & -W_u W_1 \\
|
||||||
0 & W_u W_2 \\
|
0 & W_u W_2 \\
|
||||||
1 & 0
|
1 & 0
|
||||||
\end{bmatrix}}_{P_{\mathcal{H}_\infty}} \begin{pmatrix}
|
\end{bmatrix}}_{P_{\mathcal{H}_\infty}} \begin{pmatrix}
|
||||||
w \\ u
|
w \\ u
|
||||||
\end{pmatrix}
|
\end{pmatrix}
|
||||||
@@ -310,71 +335,169 @@ The \(\mathcal{H}_\infty\) norm of Eq. \eqref{eq:Hinf_norm} is equals to \(\sigm
|
|||||||
|
|
||||||
\begin{figure}[htbp]
|
\begin{figure}[htbp]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[scale=1]{figs/h_infinity_robust_fusion.pdf}
|
\includegraphics[scale=1,scale=1]{figs/h_infinity_robust_fusion.pdf}
|
||||||
\caption{\label{fig:h_infinity_robust_fusion}Generalized plant \(P_{\mathcal{H}_\infty}\) used for the \(\mathcal{H}_\infty\) synthesis of complementary filters}
|
\caption{\label{fig:h_infinity_robust_fusion}Generalized plant \(P_{\mathcal{H}_\infty}\) used for the \(\mathcal{H}_\infty\) synthesis of complementary filters}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\subsection{Example}
|
\subsection{Example}
|
||||||
\label{sec:org0122000}
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/sensors_uncertainty_weights.pdf}
|
||||||
|
\caption{\label{fig:sensors_uncertainty_weights}Magnitude of the multiplicative uncertainty weights \(|W_i(j\omega)|\)}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/weight_uncertainty_bounds_Wu.pdf}
|
||||||
|
\caption{\label{fig:weight_uncertainty_bounds_Wu}Uncertainty region of the two sensors as well as the wanted maximum uncertainty of the super sensor (dashed lines)}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/hinf_comp_filters.pdf}
|
||||||
|
\caption{\label{fig:hinf_comp_filters}Obtained complementary filters using the \(\mathcal{H}_\infty\) Synthesis}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/super_sensor_dynamical_uncertainty_Hinf.pdf}
|
||||||
|
\caption{\label{fig:super_sensor_dynamical_uncertainty_Hinf}Super sensor dynamical uncertainty (solid curve) when using the \(\mathcal{H}_\infty\) Synthesis}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/psd_sensors_hinf_synthesis.pdf}
|
||||||
|
\caption{\label{fig:psd_sensors_hinf_synthesis}Power Spectral Density of the estimated \(\hat{x}\) using the two sensors alone and using the \(\mathcal{H}_\infty\) synthesis}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
\section{Optimal and Robust Sensor Fusion: Mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) Synthesis}
|
\section{Optimal and Robust Sensor Fusion: Mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) Synthesis}
|
||||||
\label{sec:orgdf5a196}
|
|
||||||
\label{sec:optimal_robust_fusion}
|
\label{sec:optimal_robust_fusion}
|
||||||
|
|
||||||
\subsection{Sensor Fusion Architecture}
|
\subsection{Sensor with noise and model uncertainty}
|
||||||
\label{sec:orge16b510}
|
We wish now to combine the two previous synthesis, that is to say
|
||||||
|
|
||||||
|
The sensors are now modelled by a white noise with unitary PSD \(\tilde{n}_i\) shaped by a LTI transfer function \(N_i(s)\).
|
||||||
|
The dynamical uncertainty of the sensor is modelled using multiplicative uncertainty
|
||||||
|
\begin{equation}
|
||||||
|
v_i = \hat{G}_i (1 + W_i \Delta_i) x + \hat{G_i} (1 + W_i \Delta_i) N_i \tilde{n}_i
|
||||||
|
\end{equation}
|
||||||
|
|
||||||
|
Multiplying by the inverse of the nominal model of the sensor dynamics gives an estimate \(\hat{x}_i\) of \(x\):
|
||||||
|
\begin{equation}
|
||||||
|
\hat{x} = (1 + W_i \Delta_i) x + (1 + W_i \Delta_i) N_i \tilde{n}_i
|
||||||
|
\end{equation}
|
||||||
|
|
||||||
\begin{figure}[htbp]
|
\begin{figure}[htbp]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[scale=1]{figs/sensor_model_noise_uncertainty.pdf}
|
\includegraphics[scale=1,scale=1]{figs/sensor_model_noise_uncertainty.pdf}
|
||||||
\caption{\label{fig:sensor_model_noise_uncertainty}Sensor Model including Noise and Dynamical Uncertainty}
|
\caption{\label{fig:sensor_model_noise_uncertainty}Sensor Model including Noise and Dynamical Uncertainty}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Sensor Fusion Architecture}
|
||||||
|
|
||||||
|
For reason of space, the blocks \(\hat{G}_i\) and \(\hat{G}_i^{-1}\) are omitted.
|
||||||
|
|
||||||
|
\begin{equation}
|
||||||
|
\begin{aligned}
|
||||||
|
\hat{x} = &\Big( H_1 (1 + W_1 \Delta_1) + H_2 (1 + W_2 \Delta_2) \Big) x \\
|
||||||
|
&+ \Big( H_1 (1 + W_1 \Delta_1) N_1 \Big) \tilde{n}_1 + \Big( H_2 (1 + W_2 \Delta_2) N_2 \Big) \tilde{n}_2
|
||||||
|
\end{aligned}
|
||||||
|
\end{equation}
|
||||||
|
|
||||||
|
\begin{equation}
|
||||||
|
\begin{aligned}
|
||||||
|
\hat{x} = &\Big( 1 + H_1 W_1 \Delta_1 + H_2 W_2 \Delta_2 \Big) x \\
|
||||||
|
&+ \Big( H_1 (1 + W_1 \Delta_1) N_1 \Big) \tilde{n}_1 + \Big( H_2 (1 + W_2 \Delta_2) N_2 \Big) \tilde{n}_2
|
||||||
|
\end{aligned}
|
||||||
|
\end{equation}
|
||||||
|
|
||||||
|
The estimate \(\hat{x}\) of \(x\)
|
||||||
|
|
||||||
\begin{figure}[htbp]
|
\begin{figure}[htbp]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[scale=1]{figs/sensor_fusion_arch_full.pdf}
|
\includegraphics[scale=1,scale=1]{figs/sensor_fusion_arch_full.pdf}
|
||||||
\caption{\label{fig:sensor_fusion_arch_full}Super Sensor Fusion with both sensor noise and sensor model uncertainty}
|
\caption{\label{fig:sensor_fusion_arch_full}Super Sensor Fusion with both sensor noise and sensor model uncertainty}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\subsection{Synthesis Objective}
|
|
||||||
\label{sec:orgb4b43b3}
|
|
||||||
|
|
||||||
\subsection{Mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) Synthesis}
|
\subsection{Mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) Synthesis}
|
||||||
\label{sec:orgb9b52ad}
|
|
||||||
|
The synthesis objective is to generate two complementary filters \(H_1(s)\) and \(H_2(s)\) such that the uncertainty associated with the super sensor is kept reasonably small and such that the RMS value of super sensors noise is minimized.
|
||||||
|
|
||||||
|
To specify how small we want the super sensor dynamic spread, we use a weighting filter \(W_u(s)\) as was done in Section \ref{sec:robust_fusion}.
|
||||||
|
|
||||||
|
|
||||||
|
This synthesis problem can be solved using the mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) synthesis on the following generalized plant:
|
||||||
|
\begin{equation}
|
||||||
|
\begin{pmatrix}
|
||||||
|
z_{\infty, 1} \\ z_{\infty, 2} \\ z_{2, 1} \\ z_{2, 2} \\ v
|
||||||
|
\end{pmatrix} = \underbrace{\begin{bmatrix}
|
||||||
|
W_u W_1 & W_u W_1 \\
|
||||||
|
0 & W_u W_2 \\
|
||||||
|
N_1 & N_1 \\
|
||||||
|
0 & N_2 \\
|
||||||
|
1 & 0
|
||||||
|
\end{bmatrix}}_{P_{\mathcal{H}_2/\mathcal{H}_\infty}} \begin{pmatrix}
|
||||||
|
w \\ u
|
||||||
|
\end{pmatrix}
|
||||||
|
\end{equation}
|
||||||
|
|
||||||
|
The synthesis objective is to:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Keep the \(\mathcal{H}_\infty\) norm from \(w\) to \((z_{\infty,1}, z_{\infty,2})\) below \(1\)
|
||||||
|
\item Minimize the \(\mathcal{H}_2\) norm from \(w\) to \((z_{2,1}, z_{2,2})\)
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
\begin{figure}[htbp]
|
\begin{figure}[htbp]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[scale=1]{figs/mixed_h2_hinf_synthesis.pdf}
|
\includegraphics[scale=1,scale=1]{figs/mixed_h2_hinf_synthesis.pdf}
|
||||||
\caption{\label{fig:mixed_h2_hinf_synthesis}Generalized plant \(P_{\mathcal{H}_2/\matlcal{H}_\infty}\) used for the mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) synthesis of complementary filters}
|
\caption{\label{fig:mixed_h2_hinf_synthesis}Generalized plant \(P_{\mathcal{H}_2/\mathcal{H}_\infty}\) used for the mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) synthesis of complementary filters}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\subsection{Example}
|
\subsection{Example}
|
||||||
\label{sec:orgc881f20}
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/htwo_hinf_comp_filters.pdf}
|
||||||
|
\caption{\label{fig:htwo_hinf_comp_filters}Obtained complementary filters after mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) synthesis}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/psd_sensors_htwo_hinf_synthesis.pdf}
|
||||||
|
\caption{\label{fig:psd_sensors_htwo_hinf_synthesis}Power Spectral Density of the Super Sensor obtained with the mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) synthesis}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/super_sensor_time_domain_h2_hinf.pdf}
|
||||||
|
\caption{\label{fig:super_sensor_time_domain_h2_hinf}Noise of individual sensors and noise of the super sensor}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[scale=1,scale=1]{figs/super_sensor_dynamical_uncertainty_Htwo_Hinf.pdf}
|
||||||
|
\caption{\label{fig:super_sensor_dynamical_uncertainty_Htwo_Hinf}Super sensor dynamical uncertainty (solid curve) when using the mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) Synthesis}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
\section{Experimental Validation}
|
\section{Experimental Validation}
|
||||||
\label{sec:org05b79a0}
|
|
||||||
\label{sec:experimental_validation}
|
\label{sec:experimental_validation}
|
||||||
|
|
||||||
\subsection{Experimental Setup}
|
\subsection{Experimental Setup}
|
||||||
\label{sec:orgc3daf35}
|
|
||||||
|
|
||||||
\subsection{Sensor Noise and Dynamical Uncertainty}
|
\subsection{Sensor Noise and Dynamical Uncertainty}
|
||||||
\label{sec:org26fedf6}
|
|
||||||
|
|
||||||
\subsection{Mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) Synthesis}
|
\subsection{Mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) Synthesis}
|
||||||
\label{sec:org72f2969}
|
|
||||||
|
|
||||||
\subsection{Super Sensor Noise and Dynamical Uncertainty}
|
\subsection{Super Sensor Noise and Dynamical Uncertainty}
|
||||||
\label{sec:orgf66f78b}
|
|
||||||
|
|
||||||
\section{Conclusion}
|
\section{Conclusion}
|
||||||
\label{sec:orge0f0a43}
|
|
||||||
\label{sec:conclusion}
|
\label{sec:conclusion}
|
||||||
|
|
||||||
\section{Acknowledgment}
|
\section{Acknowledgment}
|
||||||
\label{sec:orgb16559e}
|
|
||||||
|
|
||||||
|
\bibliographystyle{IEEEtran}
|
||||||
\bibliography{ref}
|
\bibliography{ref}
|
||||||
\end{document}
|
\end{document}
|
BIN
journal/doc/IEEEtran_HOWTO.pdf
Normal file
BIN
journal/doc/IEEEtran_bst_HOWTO.pdf
Normal file
BIN
journal/doc/Transactions-instructions-only.pdf
Normal file
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
BIN
journal/figs/hinf_comp_filters.pdf
Normal file
BIN
journal/figs/htwo_comp_filters.pdf
Normal file
BIN
journal/figs/htwo_hinf_comp_filters.pdf
Normal file
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
BIN
journal/figs/psd_sensors_hinf_synthesis.pdf
Normal file
BIN
journal/figs/psd_sensors_htwo_hinf_synthesis.pdf
Normal file
BIN
journal/figs/psd_sensors_htwo_synthesis.pdf
Normal file
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
BIN
journal/figs/sensor_noise_H2_time_domain.pdf
Normal file
BIN
journal/figs/sensors_noise.pdf
Normal file
BIN
journal/figs/sensors_nominal_dynamics.pdf
Normal file
BIN
journal/figs/sensors_nominal_dynamics_and_uncertainty.pdf
Normal file
BIN
journal/figs/sensors_uncertainty_weights.pdf
Normal file
BIN
journal/figs/super_sensor_dynamical_uncertainty_H2.pdf
Normal file
BIN
journal/figs/super_sensor_dynamical_uncertainty_Hinf.pdf
Normal file
BIN
journal/figs/super_sensor_dynamical_uncertainty_Htwo_Hinf.pdf
Normal file
BIN
journal/figs/super_sensor_time_domain_h2.pdf
Normal file
BIN
journal/figs/super_sensor_time_domain_h2_hinf.pdf
Normal file
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
BIN
journal/figs/weight_uncertainty_bounds_Wu.pdf
Normal file
7
js/bootstrap.min.js
vendored
4
js/jquery.min.js
vendored
1
js/jquery.stickytableheaders.min.js
vendored
@@ -1 +0,0 @@
|
|||||||
!function(a,b){"use strict";function c(c,g){var h=this;h.$el=a(c),h.el=c,h.id=e++,h.$window=a(b),h.$document=a(document),h.$el.bind("destroyed",a.proxy(h.teardown,h)),h.$clonedHeader=null,h.$originalHeader=null,h.isSticky=!1,h.hasBeenSticky=!1,h.leftOffset=null,h.topOffset=null,h.init=function(){h.$el.each(function(){var b=a(this);b.css("padding",0),h.$originalHeader=a("thead:first",this),h.$clonedHeader=h.$originalHeader.clone(),b.trigger("clonedHeader."+d,[h.$clonedHeader]),h.$clonedHeader.addClass("tableFloatingHeader"),h.$clonedHeader.css("display","none"),h.$originalHeader.addClass("tableFloatingHeaderOriginal"),h.$originalHeader.after(h.$clonedHeader),h.$printStyle=a('<style type="text/css" media="print">.tableFloatingHeader{display:none !important;}.tableFloatingHeaderOriginal{position:static !important;}</style>'),a("head").append(h.$printStyle)}),h.setOptions(g),h.updateWidth(),h.toggleHeaders(),h.bind()},h.destroy=function(){h.$el.unbind("destroyed",h.teardown),h.teardown()},h.teardown=function(){h.isSticky&&h.$originalHeader.css("position","static"),a.removeData(h.el,"plugin_"+d),h.unbind(),h.$clonedHeader.remove(),h.$originalHeader.removeClass("tableFloatingHeaderOriginal"),h.$originalHeader.css("visibility","visible"),h.$printStyle.remove(),h.el=null,h.$el=null},h.bind=function(){h.$scrollableArea.on("scroll."+d,h.toggleHeaders),h.isWindowScrolling||(h.$window.on("scroll."+d+h.id,h.setPositionValues),h.$window.on("resize."+d+h.id,h.toggleHeaders)),h.$scrollableArea.on("resize."+d,h.toggleHeaders),h.$scrollableArea.on("resize."+d,h.updateWidth)},h.unbind=function(){h.$scrollableArea.off("."+d,h.toggleHeaders),h.isWindowScrolling||(h.$window.off("."+d+h.id,h.setPositionValues),h.$window.off("."+d+h.id,h.toggleHeaders)),h.$scrollableArea.off("."+d,h.updateWidth)},h.toggleHeaders=function(){h.$el&&h.$el.each(function(){var b,c=a(this),d=h.isWindowScrolling?isNaN(h.options.fixedOffset)?h.options.fixedOffset.outerHeight():h.options.fixedOffset:h.$scrollableArea.offset().top+(isNaN(h.options.fixedOffset)?0:h.options.fixedOffset),e=c.offset(),f=h.$scrollableArea.scrollTop()+d,g=h.$scrollableArea.scrollLeft(),i=h.isWindowScrolling?f>e.top:d>e.top,j=(h.isWindowScrolling?f:0)<e.top+c.height()-h.$clonedHeader.height()-(h.isWindowScrolling?0:d);i&&j?(b=e.left-g+h.options.leftOffset,h.$originalHeader.css({position:"fixed","margin-top":h.options.marginTop,left:b,"z-index":3}),h.leftOffset=b,h.topOffset=d,h.$clonedHeader.css("display",""),h.isSticky||(h.isSticky=!0,h.updateWidth()),h.setPositionValues()):h.isSticky&&(h.$originalHeader.css("position","static"),h.$clonedHeader.css("display","none"),h.isSticky=!1,h.resetWidth(a("td,th",h.$clonedHeader),a("td,th",h.$originalHeader)))})},h.setPositionValues=function(){var a=h.$window.scrollTop(),b=h.$window.scrollLeft();!h.isSticky||0>a||a+h.$window.height()>h.$document.height()||0>b||b+h.$window.width()>h.$document.width()||h.$originalHeader.css({top:h.topOffset-(h.isWindowScrolling?0:a),left:h.leftOffset-(h.isWindowScrolling?0:b)})},h.updateWidth=function(){if(h.isSticky){h.$originalHeaderCells||(h.$originalHeaderCells=a("th,td",h.$originalHeader)),h.$clonedHeaderCells||(h.$clonedHeaderCells=a("th,td",h.$clonedHeader));var b=h.getWidth(h.$clonedHeaderCells);h.setWidth(b,h.$clonedHeaderCells,h.$originalHeaderCells),h.$originalHeader.css("width",h.$clonedHeader.width())}},h.getWidth=function(c){var d=[];return c.each(function(c){var e,f=a(this);if("border-box"===f.css("box-sizing"))e=f[0].getBoundingClientRect().width;else{var g=a("th",h.$originalHeader);if("collapse"===g.css("border-collapse"))if(b.getComputedStyle)e=parseFloat(b.getComputedStyle(this,null).width);else{var i=parseFloat(f.css("padding-left")),j=parseFloat(f.css("padding-right")),k=parseFloat(f.css("border-width"));e=f.outerWidth()-i-j-k}else e=f.width()}d[c]=e}),d},h.setWidth=function(a,b,c){b.each(function(b){var d=a[b];c.eq(b).css({"min-width":d,"max-width":d})})},h.resetWidth=function(b,c){b.each(function(b){var d=a(this);c.eq(b).css({"min-width":d.css("min-width"),"max-width":d.css("max-width")})})},h.setOptions=function(c){h.options=a.extend({},f,c),h.$scrollableArea=a(h.options.scrollableArea),h.isWindowScrolling=h.$scrollableArea[0]===b},h.updateOptions=function(a){h.setOptions(a),h.unbind(),h.bind(),h.updateWidth(),h.toggleHeaders()},h.init()}var d="stickyTableHeaders",e=0,f={fixedOffset:0,leftOffset:0,marginTop:0,scrollableArea:b};a.fn[d]=function(b){return this.each(function(){var e=a.data(this,"plugin_"+d);e?"string"==typeof b?e[b].apply(e):e.updateOptions(b):"destroy"!==b&&a.data(this,"plugin_"+d,new c(this,b))})}}(jQuery,window);
|
|
@@ -1,85 +0,0 @@
|
|||||||
$(function() {
|
|
||||||
$('.note').before("<p class='admonition-title note'>Note</p>");
|
|
||||||
$('.seealso').before("<p class='admonition-title seealso'>See also</p>");
|
|
||||||
$('.warning').before("<p class='admonition-title warning'>Warning</p>");
|
|
||||||
$('.caution').before("<p class='admonition-title caution'>Caution</p>");
|
|
||||||
$('.attention').before("<p class='admonition-title attention'>Attention</p>");
|
|
||||||
$('.tip').before("<p class='admonition-title tip'>Tip</p>");
|
|
||||||
$('.important').before("<p class='admonition-title important'>Important</p>");
|
|
||||||
$('.hint').before("<p class='admonition-title hint'>Hint</p>");
|
|
||||||
$('.error').before("<p class='admonition-title error'>Error</p>");
|
|
||||||
$('.danger').before("<p class='admonition-title danger'>Danger</p>");
|
|
||||||
});
|
|
||||||
|
|
||||||
$( document ).ready(function() {
|
|
||||||
|
|
||||||
// Shift nav in mobile when clicking the menu.
|
|
||||||
$(document).on('click', "[data-toggle='wy-nav-top']", function() {
|
|
||||||
$("[data-toggle='wy-nav-shift']").toggleClass("shift");
|
|
||||||
$("[data-toggle='rst-versions']").toggleClass("shift");
|
|
||||||
});
|
|
||||||
// Close menu when you click a link.
|
|
||||||
$(document).on('click', ".wy-menu-vertical .current ul li a", function() {
|
|
||||||
$("[data-toggle='wy-nav-shift']").removeClass("shift");
|
|
||||||
$("[data-toggle='rst-versions']").toggleClass("shift");
|
|
||||||
});
|
|
||||||
$(document).on('click', "[data-toggle='rst-current-version']", function() {
|
|
||||||
$("[data-toggle='rst-versions']").toggleClass("shift-up");
|
|
||||||
});
|
|
||||||
// Make tables responsive
|
|
||||||
$("table.docutils:not(.field-list)").wrap("<div class='wy-table-responsive'></div>");
|
|
||||||
});
|
|
||||||
|
|
||||||
$( document ).ready(function() {
|
|
||||||
$('#text-table-of-contents ul').first().addClass('nav');
|
|
||||||
// ScrollSpy also requires that we use
|
|
||||||
// a Bootstrap nav component.
|
|
||||||
$('body').scrollspy({target: '#text-table-of-contents'});
|
|
||||||
|
|
||||||
// add sticky table headers
|
|
||||||
$('table').stickyTableHeaders();
|
|
||||||
|
|
||||||
// set the height of tableOfContents
|
|
||||||
var $postamble = $('#postamble');
|
|
||||||
var $tableOfContents = $('#table-of-contents');
|
|
||||||
$tableOfContents.css({paddingBottom: $postamble.outerHeight()});
|
|
||||||
|
|
||||||
// add TOC button
|
|
||||||
var toggleSidebar = $('<div id="toggle-sidebar"><a href="#table-of-contents"><h2>Table of Contents</h2></a></div>');
|
|
||||||
$('#content').prepend(toggleSidebar);
|
|
||||||
|
|
||||||
// add close button when sidebar showed in mobile screen
|
|
||||||
var closeBtn = $('<a class="close-sidebar" href="#">Close</a>');
|
|
||||||
var tocTitle = $('#table-of-contents').find('h2');
|
|
||||||
tocTitle.append(closeBtn);
|
|
||||||
});
|
|
||||||
|
|
||||||
window.SphinxRtdTheme = (function (jquery) {
|
|
||||||
var stickyNav = (function () {
|
|
||||||
var navBar,
|
|
||||||
win,
|
|
||||||
stickyNavCssClass = 'stickynav',
|
|
||||||
applyStickNav = function () {
|
|
||||||
if (navBar.height() <= win.height()) {
|
|
||||||
navBar.addClass(stickyNavCssClass);
|
|
||||||
} else {
|
|
||||||
navBar.removeClass(stickyNavCssClass);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
enable = function () {
|
|
||||||
applyStickNav();
|
|
||||||
win.on('resize', applyStickNav);
|
|
||||||
},
|
|
||||||
init = function () {
|
|
||||||
navBar = jquery('nav.wy-nav-side:first');
|
|
||||||
win = jquery(window);
|
|
||||||
};
|
|
||||||
jquery(init);
|
|
||||||
return {
|
|
||||||
enable : enable
|
|
||||||
};
|
|
||||||
}());
|
|
||||||
return {
|
|
||||||
StickyNav : stickyNav
|
|
||||||
};
|
|
||||||
}($));
|
|
@@ -1,19 +1,14 @@
|
|||||||
#+TITLE: Robust and Optimal Sensor Fusion - Matlab Computation
|
#+TITLE: Robust and Optimal Sensor Fusion - Matlab Computation
|
||||||
:DRAWER:
|
:DRAWER:
|
||||||
#+HTML_LINK_HOME: ./index.html
|
#+HTML_LINK_HOME: ../index.html
|
||||||
#+HTML_LINK_UP: ./index.html
|
#+HTML_LINK_UP: ../index.html
|
||||||
|
|
||||||
|
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||||
|
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||||
|
|
||||||
#+BIND: org-latex-image-default-option "scale=1"
|
#+BIND: org-latex-image-default-option "scale=1"
|
||||||
#+BIND: org-latex-image-default-width ""
|
#+BIND: org-latex-image-default-width ""
|
||||||
|
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="../css/htmlize.css"/>
|
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="../css/readtheorg.css"/>
|
|
||||||
#+HTML_HEAD: <script src="../js/jquery.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="../js/bootstrap.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="../js/jquery.stickytableheaders.min.js"></script>
|
|
||||||
#+HTML_HEAD: <script src="../js/readtheorg.js"></script>
|
|
||||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://cdn.rawgit.com/dreampulse/computer-modern-web-font/master/fonts.css">
|
|
||||||
|
|
||||||
#+STARTUP: overview
|
#+STARTUP: overview
|
||||||
#+OPTIONS: toc:2
|
#+OPTIONS: toc:2
|
||||||
|
|
||||||
@@ -23,6 +18,10 @@
|
|||||||
#+LATEX_CLASS: cleanreport
|
#+LATEX_CLASS: cleanreport
|
||||||
#+LATEX_CLASS_OPTIONS: [tocnp, minted, secbreak]
|
#+LATEX_CLASS_OPTIONS: [tocnp, minted, secbreak]
|
||||||
|
|
||||||
|
#+LATEX_HEADER_EXTRA: \usepackage[cache=false]{minted}
|
||||||
|
#+LATEX_HEADER_EXTRA: \usemintedstyle{autumn}
|
||||||
|
#+LATEX_HEADER_EXTRA: \setminted[matlab]{linenos=true, breaklines=true, tabsize=4, fontsize=\scriptsize, autogobble=true}
|
||||||
|
|
||||||
#+LATEX_HEADER: \newcommand{\authorFirstName}{Thomas}
|
#+LATEX_HEADER: \newcommand{\authorFirstName}{Thomas}
|
||||||
#+LATEX_HEADER: \newcommand{\authorLastName}{Dehaeze}
|
#+LATEX_HEADER: \newcommand{\authorLastName}{Dehaeze}
|
||||||
#+LATEX_HEADER: \newcommand{\authorEmail}{dehaeze.thomas@gmail.com}
|
#+LATEX_HEADER: \newcommand{\authorEmail}{dehaeze.thomas@gmail.com}
|
||||||
@@ -71,13 +70,16 @@ In this example, the measured quantity $x$ is the velocity of an object.
|
|||||||
#+caption: Description of signals in Figure [[fig:sensor_model_noise_uncertainty]]
|
#+caption: Description of signals in Figure [[fig:sensor_model_noise_uncertainty]]
|
||||||
#+attr_latex: :environment tabular :align clc
|
#+attr_latex: :environment tabular :align clc
|
||||||
#+attr_latex: :center t :booktabs t :float t
|
#+attr_latex: :center t :booktabs t :float t
|
||||||
| *Notation* | *Meaning* | *Unit* |
|
| *Notation* | *Meaning* | *Unit* |
|
||||||
|---------------+---------------------------------+---------|
|
|------------------+-----------------------------------+---------------------------|
|
||||||
| $x$ | Physical measured quantity | $[m/s]$ |
|
| $x$ | Physical measured quantity | $[m/s]$ |
|
||||||
| $\tilde{n}_i$ | White noise with unitary PSD | |
|
| $\tilde{n}_i$ | White noise with unitary PSD | |
|
||||||
| $n_i$ | Shaped noise | $[m/s]$ |
|
| $n_i$ | Shaped noise | $[m/s]$ |
|
||||||
| $v_i$ | Sensor output measurement | $[V]$ |
|
| $v_i$ | Sensor output measurement | $[V]$ |
|
||||||
| $\hat{x}_i$ | Estimate of $x$ from the sensor | $[m/s]$ |
|
| $\hat{x}_i$ | Estimate of $x$ from the sensor | $[m/s]$ |
|
||||||
|
| $\Phi_n(\omega)$ | Power Spectral Density of $n$ | $[\frac{(m/s)^2}{Hz}]$ |
|
||||||
|
| $\phi_n(\omega)$ | Amplitude Spectral Density of $n$ | $[\frac{m/s}{\sqrt{Hz}}]$ |
|
||||||
|
| $\sigma_n$ | Root Mean Square Value of $n$ | $[m/s\ rms]$ |
|
||||||
|
|
||||||
#+name: tab:sensor_dynamical_blocks
|
#+name: tab:sensor_dynamical_blocks
|
||||||
#+caption: Description of Systems in Figure [[fig:sensor_model_noise_uncertainty]]
|
#+caption: Description of Systems in Figure [[fig:sensor_model_noise_uncertainty]]
|
||||||
@@ -93,7 +95,7 @@ In this example, the measured quantity $x$ is the velocity of an object.
|
|||||||
#+name: fig:sensor_model_noise_uncertainty
|
#+name: fig:sensor_model_noise_uncertainty
|
||||||
#+caption: Sensor Model
|
#+caption: Sensor Model
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
[[file:figs-tikz/sensor_model_noise_uncertainty.png]]
|
[[file:figs-paper/sensor_model_noise_uncertainty.png]]
|
||||||
|
|
||||||
** Matlab Init :noexport:ignore:
|
** Matlab Init :noexport:ignore:
|
||||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||||
@@ -138,18 +140,20 @@ The true sensor dynamics has some uncertainty associated to it and described in
|
|||||||
Both sensor dynamics in $[\frac{V}{m/s}]$ are shown in Figure [[fig:sensors_nominal_dynamics]].
|
Both sensor dynamics in $[\frac{V}{m/s}]$ are shown in Figure [[fig:sensors_nominal_dynamics]].
|
||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
figure;
|
figure;
|
||||||
|
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||||
|
|
||||||
% Magnitude
|
% Magnitude
|
||||||
ax1 = subplot(2,1,1);
|
ax1 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(G1, freqs, 'Hz'))), '-', 'DisplayName', '$G_1(j\omega)$');
|
plot(freqs, abs(squeeze(freqresp(G1, freqs, 'Hz'))), '-', 'DisplayName', '$G_1(j\omega)$');
|
||||||
plot(freqs, abs(squeeze(freqresp(G2, freqs, 'Hz'))), '-', 'DisplayName', '$G_2(j\omega)$');
|
plot(freqs, abs(squeeze(freqresp(G2, freqs, 'Hz'))), '-', 'DisplayName', '$G_2(j\omega)$');
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
ylabel('Magnitude $[\frac{V}{m/s}]$'); set(gca, 'XTickLabel',[]);
|
ylabel('Magnitude $\left[\frac{V}{m/s}\right]$'); set(gca, 'XTickLabel',[]);
|
||||||
legend('location', 'northeast');
|
legend('location', 'northeast', 'FontSize', 8);
|
||||||
hold off;
|
hold off;
|
||||||
|
|
||||||
% Phase
|
% Phase
|
||||||
ax2 = subplot(2,1,2);
|
ax2 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G1, freqs, 'Hz'))), '-');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G1, freqs, 'Hz'))), '-');
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G2, freqs, 'Hz'))), '-');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G2, freqs, 'Hz'))), '-');
|
||||||
@@ -158,12 +162,13 @@ Both sensor dynamics in $[\frac{V}{m/s}]$ are shown in Figure [[fig:sensors_nomi
|
|||||||
ylim([-180 180]);
|
ylim([-180 180]);
|
||||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
hold off;
|
hold off;
|
||||||
|
|
||||||
linkaxes([ax1,ax2],'x');
|
linkaxes([ax1,ax2],'x');
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/sensors_nominal_dynamics.pdf', 'width', 'full', 'height', 'full');
|
exportFig('figs/sensors_nominal_dynamics.pdf', 'width', 'half', 'height', 'tall');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:sensors_nominal_dynamics
|
#+name: fig:sensors_nominal_dynamics
|
||||||
@@ -183,7 +188,7 @@ The true sensor dynamics $G_i(s)$ is then described by eqref:eq:sensor_dynamics_
|
|||||||
|
|
||||||
The weights $W_i(s)$ representing the dynamical uncertainty are defined below and their magnitude is shown in Figure [[fig:sensors_uncertainty_weights]].
|
The weights $W_i(s)$ representing the dynamical uncertainty are defined below and their magnitude is shown in Figure [[fig:sensors_uncertainty_weights]].
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
W1 = createWeight('n', 2, 'w0', 2*pi*3, 'G0', 2, 'G1', 0.1, 'Gc', 1) * ...
|
W1 = createWeight('n', 2, 'w0', 2*pi*3, 'G0', 2, 'G1', 0.1, 'Gc', 1) * ...
|
||||||
createWeight('n', 2, 'w0', 2*pi*1e3, 'G0', 1, 'G1', 4/0.1, 'Gc', 1/0.1);
|
createWeight('n', 2, 'w0', 2*pi*1e3, 'G0', 1, 'G1', 4/0.1, 'Gc', 1/0.1);
|
||||||
|
|
||||||
W2 = createWeight('n', 2, 'w0', 2*pi*1e2, 'G0', 0.05, 'G1', 4, 'Gc', 1);
|
W2 = createWeight('n', 2, 'w0', 2*pi*1e2, 'G0', 0.05, 'G1', 4, 'Gc', 1);
|
||||||
@@ -201,11 +206,11 @@ The bode plot of the sensors nominal dynamics as well as their defined dynamical
|
|||||||
xlabel('Frequency [Hz]'); ylabel('Magnitude');
|
xlabel('Frequency [Hz]'); ylabel('Magnitude');
|
||||||
ylim([0, 5]);
|
ylim([0, 5]);
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
legend('location', 'northwest');
|
legend('location', 'northwest', 'FontSize', 8);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/sensors_uncertainty_weights.pdf', 'width', 'wide', 'height', 'normal');
|
exportFig('figs/sensors_uncertainty_weights.pdf', 'width', 'half', 'height', 'short');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:sensors_uncertainty_weights
|
#+name: fig:sensors_uncertainty_weights
|
||||||
@@ -215,8 +220,10 @@ The bode plot of the sensors nominal dynamics as well as their defined dynamical
|
|||||||
|
|
||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
figure;
|
figure;
|
||||||
|
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||||
|
|
||||||
% Magnitude
|
% Magnitude
|
||||||
ax1 = subplot(2,1,1);
|
ax1 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plotMagUncertainty(W1, freqs, 'G', G1, 'color_i', 1, 'DisplayName', '$G_1$');
|
plotMagUncertainty(W1, freqs, 'G', G1, 'color_i', 1, 'DisplayName', '$G_1$');
|
||||||
plotMagUncertainty(W2, freqs, 'G', G2, 'color_i', 2, 'DisplayName', '$G_2$');
|
plotMagUncertainty(W2, freqs, 'G', G2, 'color_i', 2, 'DisplayName', '$G_2$');
|
||||||
@@ -228,11 +235,12 @@ The bode plot of the sensors nominal dynamics as well as their defined dynamical
|
|||||||
set(gca, 'XTickLabel',[]);
|
set(gca, 'XTickLabel',[]);
|
||||||
ylabel('Magnitude $[\frac{V}{m/s}]$');
|
ylabel('Magnitude $[\frac{V}{m/s}]$');
|
||||||
ylim([1e-2, 2e3]);
|
ylim([1e-2, 2e3]);
|
||||||
legend('location', 'northeast');
|
legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 2);
|
||||||
hold off;
|
hold off;
|
||||||
|
ylim([1e-2, 1e4])
|
||||||
|
|
||||||
% Phase
|
% Phase
|
||||||
ax2 = subplot(2,1,2);
|
ax2 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plotPhaseUncertainty(W1, freqs, 'G', G1, 'color_i', 1);
|
plotPhaseUncertainty(W1, freqs, 'G', G1, 'color_i', 1);
|
||||||
plotPhaseUncertainty(W2, freqs, 'G', G2, 'color_i', 2);
|
plotPhaseUncertainty(W2, freqs, 'G', G2, 'color_i', 2);
|
||||||
@@ -245,12 +253,13 @@ The bode plot of the sensors nominal dynamics as well as their defined dynamical
|
|||||||
ylim([-180 180]);
|
ylim([-180 180]);
|
||||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
hold off;
|
hold off;
|
||||||
|
|
||||||
linkaxes([ax1,ax2],'x');
|
linkaxes([ax1,ax2],'x');
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/sensors_nominal_dynamics_and_uncertainty.pdf', 'width', 'full', 'height', 'full');
|
exportFig('figs/sensors_nominal_dynamics_and_uncertainty.pdf', 'width', 'half', 'height', 'tall');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:sensors_nominal_dynamics_and_uncertainty
|
#+name: fig:sensors_nominal_dynamics_and_uncertainty
|
||||||
@@ -285,14 +294,14 @@ The weights $N_1$ and $N_2$ representing the amplitude spectral density of the s
|
|||||||
plot(freqs, abs(squeeze(freqresp(N1, freqs, 'Hz'))), '-', 'DisplayName', '$|N_1(j\omega)|$');
|
plot(freqs, abs(squeeze(freqresp(N1, freqs, 'Hz'))), '-', 'DisplayName', '$|N_1(j\omega)|$');
|
||||||
plot(freqs, abs(squeeze(freqresp(N2, freqs, 'Hz'))), '-', 'DisplayName', '$|N_2(j\omega)|$');
|
plot(freqs, abs(squeeze(freqresp(N2, freqs, 'Hz'))), '-', 'DisplayName', '$|N_2(j\omega)|$');
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
xlabel('Frequency [Hz]'); ylabel('Amplitude Spectral Density $\left[ \frac{m/s}{\sqrt{Hz}} \right]$');
|
xlabel('Frequency [Hz]'); ylabel('ASD $\left[ \frac{m/s}{\sqrt{Hz}} \right]$');
|
||||||
hold off;
|
hold off;
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
legend('location', 'northeast');
|
legend('location', 'northeast', 'FontSize', 8);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/sensors_noise.pdf', 'width', 'normal', 'height', 'normal');
|
exportFig('figs/sensors_noise.pdf', 'width', 'half', 'height', 'short');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:sensors_noise
|
#+name: fig:sensors_noise
|
||||||
@@ -317,7 +326,7 @@ The two sensors presented in Section [[sec:sensor_description]] are now merged t
|
|||||||
|
|
||||||
#+name: fig:sensor_fusion_noise_arch
|
#+name: fig:sensor_fusion_noise_arch
|
||||||
#+caption: Sensor Fusion Architecture
|
#+caption: Sensor Fusion Architecture
|
||||||
[[file:figs-tikz/sensor_fusion_noise_arch.png]]
|
[[file:figs-paper/sensor_fusion_noise_arch.png]]
|
||||||
|
|
||||||
The complementary property of $H_1(s)$ and $H_2(s)$ means that the sum of their transfer function is equal to $1$ eqref:eq:complementary_property.
|
The complementary property of $H_1(s)$ and $H_2(s)$ means that the sum of their transfer function is equal to $1$ eqref:eq:complementary_property.
|
||||||
|
|
||||||
@@ -369,13 +378,13 @@ If we consider some dynamical uncertainty (the true system dynamics $G_i$ not be
|
|||||||
|
|
||||||
#+name: fig:sensor_model_uncertainty
|
#+name: fig:sensor_model_uncertainty
|
||||||
#+caption: Sensor Model including Dynamical Uncertainty
|
#+caption: Sensor Model including Dynamical Uncertainty
|
||||||
[[file:figs-tikz/sensor_model_uncertainty.png]]
|
[[file:figs-paper/sensor_model_uncertainty.png]]
|
||||||
|
|
||||||
The uncertainty set of the transfer function from $\hat{x}$ to $x$ at frequency $\omega$ is bounded in the complex plane by a circle centered on 1 and with a radius equal to $|W_1(j\omega) H_1(j\omega)| + |W_2(j\omega) H_2(j\omega)|$ as shown in Figure [[fig:uncertainty_set_super_sensor]].
|
The uncertainty set of the transfer function from $\hat{x}$ to $x$ at frequency $\omega$ is bounded in the complex plane by a circle centered on 1 and with a radius equal to $|W_1(j\omega) H_1(j\omega)| + |W_2(j\omega) H_2(j\omega)|$ as shown in Figure [[fig:uncertainty_set_super_sensor]].
|
||||||
|
|
||||||
#+name: fig:uncertainty_set_super_sensor
|
#+name: fig:uncertainty_set_super_sensor
|
||||||
#+caption: Super Sensor model uncertainty displayed in the complex plane
|
#+caption: Super Sensor model uncertainty displayed in the complex plane
|
||||||
[[file:figs-tikz/uncertainty_set_super_sensor.png]]
|
[[file:figs-paper/uncertainty_set_super_sensor.png]]
|
||||||
|
|
||||||
* Optimal Super Sensor Noise: $\mathcal{H}_2$ Synthesis
|
* Optimal Super Sensor Noise: $\mathcal{H}_2$ Synthesis
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
@@ -387,10 +396,6 @@ The uncertainty set of the transfer function from $\hat{x}$ to $x$ at frequency
|
|||||||
** Introduction :ignore:
|
** Introduction :ignore:
|
||||||
In this section, the complementary filters $H_1(s)$ and $H_2(s)$ are designed in order to minimize the RMS value of super sensor noise $\sigma_n$.
|
In this section, the complementary filters $H_1(s)$ and $H_2(s)$ are designed in order to minimize the RMS value of super sensor noise $\sigma_n$.
|
||||||
|
|
||||||
#+name: fig:sensor_fusion_noise_arch
|
|
||||||
#+caption: Optimal Sensor Fusion Architecture
|
|
||||||
[[file:figs-tikz/sensor_fusion_noise_arch.png]]
|
|
||||||
|
|
||||||
The RMS value of the super sensor noise is (neglecting the model uncertainty):
|
The RMS value of the super sensor noise is (neglecting the model uncertainty):
|
||||||
\begin{equation}
|
\begin{equation}
|
||||||
\begin{aligned}
|
\begin{aligned}
|
||||||
@@ -423,7 +428,7 @@ Consider the generalized plant $P_{\mathcal{H}_2}$ shown in Figure [[fig:h_two_o
|
|||||||
|
|
||||||
#+name: fig:h_two_optimal_fusion
|
#+name: fig:h_two_optimal_fusion
|
||||||
#+caption: Architecture used for $\mathcal{H}_\infty$ synthesis of complementary filters
|
#+caption: Architecture used for $\mathcal{H}_\infty$ synthesis of complementary filters
|
||||||
[[file:figs-tikz/h_two_optimal_fusion.png]]
|
[[file:figs-paper/h_two_optimal_fusion.png]]
|
||||||
|
|
||||||
\begin{equation} \label{eq:H2_generalized_plant}
|
\begin{equation} \label{eq:H2_generalized_plant}
|
||||||
\begin{pmatrix}
|
\begin{pmatrix}
|
||||||
@@ -469,9 +474,10 @@ Finally, $H_1(s)$ is defined as follows
|
|||||||
The obtained complementary filters are shown in Figure [[fig:htwo_comp_filters]].
|
The obtained complementary filters are shown in Figure [[fig:htwo_comp_filters]].
|
||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
figure;
|
figure;
|
||||||
|
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||||
|
|
||||||
% Magnitude
|
% Magnitude
|
||||||
ax1 = subplot(2,1,1);
|
ax1 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), 'DisplayName', '$H_1$');
|
plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), 'DisplayName', '$H_1$');
|
||||||
plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), 'DisplayName', '$H_2$');
|
plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), 'DisplayName', '$H_2$');
|
||||||
@@ -479,10 +485,10 @@ The obtained complementary filters are shown in Figure [[fig:htwo_comp_filters]]
|
|||||||
set(gca, 'XTickLabel',[]);
|
set(gca, 'XTickLabel',[]);
|
||||||
ylabel('Magnitude');
|
ylabel('Magnitude');
|
||||||
hold off;
|
hold off;
|
||||||
legend('location', 'northeast');
|
legend('location', 'northeast', 'FontSize', 8);
|
||||||
|
|
||||||
% Phase
|
% Phase
|
||||||
ax2 = subplot(2,1,2);
|
ax2 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(H1, freqs, 'Hz'))));
|
plot(freqs, 180/pi*angle(squeeze(freqresp(H1, freqs, 'Hz'))));
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(H2, freqs, 'Hz'))));
|
plot(freqs, 180/pi*angle(squeeze(freqresp(H2, freqs, 'Hz'))));
|
||||||
@@ -496,7 +502,7 @@ The obtained complementary filters are shown in Figure [[fig:htwo_comp_filters]]
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/htwo_comp_filters.pdf', 'width', 'full', 'height', 'tall');
|
exportFig('figs/htwo_comp_filters.pdf', 'width', 'half', 'height', 'tall');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:htwo_comp_filters
|
#+name: fig:htwo_comp_filters
|
||||||
@@ -507,7 +513,7 @@ The obtained complementary filters are shown in Figure [[fig:htwo_comp_filters]]
|
|||||||
** Super Sensor Noise
|
** Super Sensor Noise
|
||||||
<<sec:H2_super_sensor_noise>>
|
<<sec:H2_super_sensor_noise>>
|
||||||
|
|
||||||
The Power Spectral Density of the individual sensors' noise $\Phi_{n_1}, \Phi_{n_2}$ and of the super sensor noise $\Phi_{n_{\mathcal{H}_2}}$ are computed below and shown in Figure [[fig:psd_sensors_htwo_synthesis]].
|
The Power Spectral Density of the individual sensors' noise $\Phi_{n_1}, \Phi_{n_2}$ and of the super sensor noise $\Phi_{n_{\mathcal{H}_2}}$ are computed below.
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
PSD_S1 = abs(squeeze(freqresp(N1, freqs, 'Hz'))).^2;
|
PSD_S1 = abs(squeeze(freqresp(N1, freqs, 'Hz'))).^2;
|
||||||
PSD_S2 = abs(squeeze(freqresp(N2, freqs, 'Hz'))).^2;
|
PSD_S2 = abs(squeeze(freqresp(N2, freqs, 'Hz'))).^2;
|
||||||
@@ -515,6 +521,8 @@ The Power Spectral Density of the individual sensors' noise $\Phi_{n_1}, \Phi_{n
|
|||||||
abs(squeeze(freqresp(N2*H2, freqs, 'Hz'))).^2;
|
abs(squeeze(freqresp(N2*H2, freqs, 'Hz'))).^2;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
The obtained ASD are shown in Figure [[fig:psd_sensors_htwo_synthesis]].
|
||||||
|
|
||||||
The RMS value of the individual sensors and of the super sensor are listed in Table [[tab:rms_noise_H2]].
|
The RMS value of the individual sensors and of the super sensor are listed in Table [[tab:rms_noise_H2]].
|
||||||
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
|
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
|
||||||
data2orgtable([sqrt(trapz(freqs, PSD_S1)); sqrt(trapz(freqs, PSD_S2)); sqrt(trapz(freqs, PSD_H2))], ...
|
data2orgtable([sqrt(trapz(freqs, PSD_S1)); sqrt(trapz(freqs, PSD_S2)); sqrt(trapz(freqs, PSD_H2))], ...
|
||||||
@@ -536,18 +544,18 @@ The RMS value of the individual sensors and of the super sensor are listed in Ta
|
|||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
figure;
|
figure;
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, PSD_S1, '-', 'DisplayName', '$\Phi_{n_1}$');
|
plot(freqs, sqrt(PSD_S1), '-', 'DisplayName', '$\phi_{n_1}$');
|
||||||
plot(freqs, PSD_S2, '-', 'DisplayName', '$\Phi_{n_2}$');
|
plot(freqs, sqrt(PSD_S2), '-', 'DisplayName', '$\phi_{n_2}$');
|
||||||
plot(freqs, PSD_H2, 'k-', 'DisplayName', '$\Phi_{n_{\mathcal{H}_2}}$');
|
plot(freqs, sqrt(PSD_H2), 'k-', 'DisplayName', '$\phi_{n_{\mathcal{H}_2}}$');
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
xlabel('Frequency [Hz]'); ylabel('Power Spectral Density $\left[ \frac{(m/s)^2}{Hz} \right]$');
|
xlabel('Frequency [Hz]'); ylabel('ASD $\left[ \frac{m/s}{\sqrt{Hz}} \right]$');
|
||||||
hold off;
|
hold off;
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
legend('location', 'northeast');
|
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/psd_sensors_htwo_synthesis.pdf', 'width', 'wide', 'height', 'normal');
|
exportFig('figs/psd_sensors_htwo_synthesis.pdf', 'width', 'half', 'height', 'short');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:psd_sensors_htwo_synthesis
|
#+name: fig:psd_sensors_htwo_synthesis
|
||||||
@@ -585,12 +593,12 @@ The resulting noises are displayed in Figure [[fig:sensor_noise_H2_time_domain]]
|
|||||||
plot(t, v, 'k--', 'DisplayName', '$x$');
|
plot(t, v, 'k--', 'DisplayName', '$x$');
|
||||||
hold off;
|
hold off;
|
||||||
xlabel('Time [s]'); ylabel('Velocity [m/s]');
|
xlabel('Time [s]'); ylabel('Velocity [m/s]');
|
||||||
legend('location', 'southwest');
|
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2);
|
||||||
ylim([-0.3, 0.3]);
|
ylim([-0.3, 0.3]);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/super_sensor_time_domain_h2.pdf', 'width', 'wide', 'height', 'normal');
|
exportFig('figs/super_sensor_time_domain_h2.pdf', 'width', 'half', 'height', 'normal');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:super_sensor_time_domain_h2
|
#+name: fig:super_sensor_time_domain_h2
|
||||||
@@ -609,12 +617,12 @@ The resulting noises are displayed in Figure [[fig:sensor_noise_H2_time_domain]]
|
|||||||
plot(t, (lsim(H1, n1, t)+lsim(H2, n2, t)), '-', 'DisplayName', '$n$');
|
plot(t, (lsim(H1, n1, t)+lsim(H2, n2, t)), '-', 'DisplayName', '$n$');
|
||||||
hold off;
|
hold off;
|
||||||
xlabel('Time [s]'); ylabel('Sensor Noise [m/s]');
|
xlabel('Time [s]'); ylabel('Sensor Noise [m/s]');
|
||||||
legend();
|
legend('FontSize', 8);
|
||||||
ylim([-0.2, 0.2]);
|
ylim([-0.2, 0.2]);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/sensor_noise_H2_time_domain.pdf', 'width', 'wide', 'height', 'normal');
|
exportFig('figs/sensor_noise_H2_time_domain.pdf', 'width', 'half', 'height', 'normal');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:sensor_noise_H2_time_domain
|
#+name: fig:sensor_noise_H2_time_domain
|
||||||
@@ -634,8 +642,10 @@ As a result the super sensor signal can not be used for feedback applications ab
|
|||||||
Dphi_ss(abs(squeeze(freqresp(W2*H2, freqs, 'Hz'))) + abs(squeeze(freqresp(W1*H1, freqs, 'Hz'))) > 1) = 360;
|
Dphi_ss(abs(squeeze(freqresp(W2*H2, freqs, 'Hz'))) + abs(squeeze(freqresp(W1*H1, freqs, 'Hz'))) > 1) = 360;
|
||||||
|
|
||||||
figure;
|
figure;
|
||||||
|
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||||
|
|
||||||
% Magnitude
|
% Magnitude
|
||||||
ax1 = subplot(2,1,1);
|
ax1 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plotMagUncertainty(W1, freqs, 'color_i', 1, 'DisplayName', '$1 + W_1 \Delta_1$');
|
plotMagUncertainty(W1, freqs, 'color_i', 1, 'DisplayName', '$1 + W_1 \Delta_1$');
|
||||||
plotMagUncertainty(W2, freqs, 'color_i', 2, 'DisplayName', '$1 + W_2 \Delta_2$');
|
plotMagUncertainty(W2, freqs, 'color_i', 2, 'DisplayName', '$1 + W_2 \Delta_2$');
|
||||||
@@ -647,11 +657,11 @@ As a result the super sensor signal can not be used for feedback applications ab
|
|||||||
set(gca, 'XTickLabel',[]);
|
set(gca, 'XTickLabel',[]);
|
||||||
ylabel('Magnitude');
|
ylabel('Magnitude');
|
||||||
ylim([1e-2, 1e1]);
|
ylim([1e-2, 1e1]);
|
||||||
legend('location', 'southeast');
|
legend('location', 'southeast', 'FontSize', 8);
|
||||||
hold off;
|
hold off;
|
||||||
|
|
||||||
% Phase
|
% Phase
|
||||||
ax2 = subplot(2,1,2);
|
ax2 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plotPhaseUncertainty(W1, freqs, 'color_i', 1);
|
plotPhaseUncertainty(W1, freqs, 'color_i', 1);
|
||||||
plotPhaseUncertainty(W2, freqs, 'color_i', 2);
|
plotPhaseUncertainty(W2, freqs, 'color_i', 2);
|
||||||
@@ -662,12 +672,13 @@ As a result the super sensor signal can not be used for feedback applications ab
|
|||||||
ylim([-180 180]);
|
ylim([-180 180]);
|
||||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
hold off;
|
hold off;
|
||||||
|
|
||||||
linkaxes([ax1,ax2],'x');
|
linkaxes([ax1,ax2],'x');
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/super_sensor_dynamical_uncertainty_H2.pdf', 'width', 'full', 'height', 'full');
|
exportFig('figs/super_sensor_dynamical_uncertainty_H2.pdf', 'width', 'half', 'height', 'tall');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:super_sensor_dynamical_uncertainty_H2
|
#+name: fig:super_sensor_dynamical_uncertainty_H2
|
||||||
@@ -690,7 +701,7 @@ To do so, we model the uncertainty that we have on the sensor dynamics by multip
|
|||||||
|
|
||||||
#+name: fig:sensor_fusion_arch_uncertainty
|
#+name: fig:sensor_fusion_arch_uncertainty
|
||||||
#+caption: Sensor fusion architecture with sensor dynamics uncertainty
|
#+caption: Sensor fusion architecture with sensor dynamics uncertainty
|
||||||
[[file:figs-tikz/sensor_fusion_arch_uncertainty.png]]
|
[[file:figs-paper/sensor_fusion_arch_uncertainty.png]]
|
||||||
|
|
||||||
As explained in Section [[sec:sensor_uncertainty]], at each frequency $\omega$, the dynamical uncertainty of the super sensor can be represented in the complex plane by a circle with a radius equals to $|H_1(j\omega) W_1(j\omega)| + |H_2(j\omega) W_2(j\omega)|$ and centered on 1.
|
As explained in Section [[sec:sensor_uncertainty]], at each frequency $\omega$, the dynamical uncertainty of the super sensor can be represented in the complex plane by a circle with a radius equals to $|H_1(j\omega) W_1(j\omega)| + |H_2(j\omega) W_2(j\omega)|$ and centered on 1.
|
||||||
|
|
||||||
@@ -764,8 +775,10 @@ The uncertainty bounds of the two individual sensor as well as the wanted maximu
|
|||||||
Dphi_Wu(abs(squeeze(freqresp(inv(Wu), freqs, 'Hz'))) > 1) = 360;
|
Dphi_Wu(abs(squeeze(freqresp(inv(Wu), freqs, 'Hz'))) > 1) = 360;
|
||||||
|
|
||||||
figure;
|
figure;
|
||||||
|
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||||
|
|
||||||
% Magnitude
|
% Magnitude
|
||||||
ax1 = subplot(2,1,1);
|
ax1 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plotMagUncertainty(W1, freqs, 'color_i', 1, 'DisplayName', '$1 + W_1 \Delta_1$');
|
plotMagUncertainty(W1, freqs, 'color_i', 1, 'DisplayName', '$1 + W_1 \Delta_1$');
|
||||||
plotMagUncertainty(W2, freqs, 'color_i', 2, 'DisplayName', '$1 + W_2 \Delta_2$');
|
plotMagUncertainty(W2, freqs, 'color_i', 2, 'DisplayName', '$1 + W_2 \Delta_2$');
|
||||||
@@ -777,11 +790,11 @@ The uncertainty bounds of the two individual sensor as well as the wanted maximu
|
|||||||
set(gca, 'XTickLabel',[]);
|
set(gca, 'XTickLabel',[]);
|
||||||
ylabel('Magnitude');
|
ylabel('Magnitude');
|
||||||
ylim([1e-2, 1e1]);
|
ylim([1e-2, 1e1]);
|
||||||
legend('location', 'southeast');
|
legend('location', 'southeast', 'FontSize', 8);
|
||||||
hold off;
|
hold off;
|
||||||
|
|
||||||
% Phase
|
% Phase
|
||||||
ax2 = subplot(2,1,2);
|
ax2 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plotPhaseUncertainty(W1, freqs, 'color_i', 1);
|
plotPhaseUncertainty(W1, freqs, 'color_i', 1);
|
||||||
plotPhaseUncertainty(W2, freqs, 'color_i', 2);
|
plotPhaseUncertainty(W2, freqs, 'color_i', 2);
|
||||||
@@ -797,7 +810,7 @@ The uncertainty bounds of the two individual sensor as well as the wanted maximu
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/weight_uncertainty_bounds_Wu.pdf', 'width', 'full', 'height', 'full');
|
exportFig('figs/weight_uncertainty_bounds_Wu.pdf', 'width', 'half', 'height', 'tall');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:weight_uncertainty_bounds_Wu
|
#+name: fig:weight_uncertainty_bounds_Wu
|
||||||
@@ -812,7 +825,7 @@ The generalized plant $P_{\mathcal{H}_\infty}$ used for the $\mathcal{H}_\infty$
|
|||||||
|
|
||||||
#+name: fig:h_infinity_robust_fusion
|
#+name: fig:h_infinity_robust_fusion
|
||||||
#+caption: Architecture used for $\mathcal{H}_\infty$ synthesis of complementary filters
|
#+caption: Architecture used for $\mathcal{H}_\infty$ synthesis of complementary filters
|
||||||
[[file:figs-tikz/h_infinity_robust_fusion.png]]
|
[[file:figs-paper/h_infinity_robust_fusion.png]]
|
||||||
|
|
||||||
\begin{equation} \label{eq:Hinf_generalized_plant}
|
\begin{equation} \label{eq:Hinf_generalized_plant}
|
||||||
\begin{pmatrix}
|
\begin{pmatrix}
|
||||||
@@ -873,37 +886,38 @@ The obtained complementary filters as well as the wanted upper bounds are shown
|
|||||||
|
|
||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
figure;
|
figure;
|
||||||
|
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||||
|
|
||||||
ax1 = subplot(2,1,1);
|
% Magnitude
|
||||||
|
ax1 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, 1./abs(squeeze(freqresp(Wu*W1, freqs, 'Hz'))), '--', 'DisplayName', '$1/|W_uW_1|$');
|
plot(freqs, 1./abs(squeeze(freqresp(Wu*W1, freqs, 'Hz'))), '--', 'DisplayName', '$1/|W_uW_1|$');
|
||||||
plot(freqs, 1./abs(squeeze(freqresp(Wu*W2, freqs, 'Hz'))), '--', 'DisplayName', '$1/|W_uW_2|$');
|
plot(freqs, 1./abs(squeeze(freqresp(Wu*W2, freqs, 'Hz'))), '--', 'DisplayName', '$1/|W_uW_2|$');
|
||||||
|
|
||||||
set(gca,'ColorOrderIndex',1)
|
set(gca,'ColorOrderIndex',1)
|
||||||
plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$');
|
plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$|H_1|$');
|
||||||
plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$');
|
plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$|H_2|$');
|
||||||
|
|
||||||
hold off;
|
hold off;
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
ylabel('Magnitude');
|
ylabel('Magnitude');
|
||||||
set(gca, 'XTickLabel',[]);
|
set(gca, 'XTickLabel',[]);
|
||||||
legend('location', 'northeast');
|
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2);
|
||||||
|
|
||||||
ax2 = subplot(2,1,2);
|
% Phase
|
||||||
|
ax2 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz'))), '-');
|
plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz'))), '-');
|
||||||
plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-');
|
plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-');
|
||||||
hold off;
|
hold off;
|
||||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
set(gca, 'XScale', 'log');
|
set(gca, 'XScale', 'log');
|
||||||
yticks([-360:90:360]);
|
ylim([-90, 90]); yticks([-360:90:360]);
|
||||||
|
|
||||||
linkaxes([ax1,ax2],'x');
|
linkaxes([ax1,ax2],'x');
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/hinf_comp_filters.pdf', 'width', 'full', 'height', 'full');
|
exportFig('figs/hinf_comp_filters.pdf', 'width', 'half', 'height', 'tall');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:hinf_comp_filters
|
#+name: fig:hinf_comp_filters
|
||||||
@@ -925,8 +939,10 @@ The $\mathcal{H}_\infty$ synthesis thus allows to design filters such that the s
|
|||||||
Dphi_ss(abs(squeeze(freqresp(W2*H2, freqs, 'Hz'))) + abs(squeeze(freqresp(W1*H1, freqs, 'Hz'))) > 1) = 360;
|
Dphi_ss(abs(squeeze(freqresp(W2*H2, freqs, 'Hz'))) + abs(squeeze(freqresp(W1*H1, freqs, 'Hz'))) > 1) = 360;
|
||||||
|
|
||||||
figure;
|
figure;
|
||||||
|
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||||
|
|
||||||
% Magnitude
|
% Magnitude
|
||||||
ax1 = subplot(2,1,1);
|
ax1 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plotMagUncertainty(W1, freqs, 'color_i', 1, 'DisplayName', '$1 + W_1 \Delta_1$');
|
plotMagUncertainty(W1, freqs, 'color_i', 1, 'DisplayName', '$1 + W_1 \Delta_1$');
|
||||||
plotMagUncertainty(W2, freqs, 'color_i', 2, 'DisplayName', '$1 + W_2 \Delta_2$');
|
plotMagUncertainty(W2, freqs, 'color_i', 2, 'DisplayName', '$1 + W_2 \Delta_2$');
|
||||||
@@ -942,11 +958,11 @@ The $\mathcal{H}_\infty$ synthesis thus allows to design filters such that the s
|
|||||||
set(gca, 'XTickLabel',[]);
|
set(gca, 'XTickLabel',[]);
|
||||||
ylabel('Magnitude');
|
ylabel('Magnitude');
|
||||||
ylim([1e-2, 1e1]);
|
ylim([1e-2, 1e1]);
|
||||||
legend('location', 'southeast');
|
legend('location', 'southeast', 'FontSize', 8);
|
||||||
hold off;
|
hold off;
|
||||||
|
|
||||||
% Phase
|
% Phase
|
||||||
ax2 = subplot(2,1,2);
|
ax2 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plotPhaseUncertainty(W1, freqs, 'color_i', 1);
|
plotPhaseUncertainty(W1, freqs, 'color_i', 1);
|
||||||
plotPhaseUncertainty(W2, freqs, 'color_i', 2);
|
plotPhaseUncertainty(W2, freqs, 'color_i', 2);
|
||||||
@@ -959,12 +975,13 @@ The $\mathcal{H}_\infty$ synthesis thus allows to design filters such that the s
|
|||||||
ylim([-180 180]);
|
ylim([-180 180]);
|
||||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
hold off;
|
hold off;
|
||||||
|
|
||||||
linkaxes([ax1,ax2],'x');
|
linkaxes([ax1,ax2],'x');
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/super_sensor_dynamical_uncertainty_Hinf.pdf', 'width', 'full', 'height', 'full');
|
exportFig('figs/super_sensor_dynamical_uncertainty_Hinf.pdf', 'width', 'half', 'height', 'tall');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:super_sensor_dynamical_uncertainty_Hinf
|
#+name: fig:super_sensor_dynamical_uncertainty_Hinf
|
||||||
@@ -973,10 +990,8 @@ The $\mathcal{H}_\infty$ synthesis thus allows to design filters such that the s
|
|||||||
[[file:figs/super_sensor_dynamical_uncertainty_Hinf.png]]
|
[[file:figs/super_sensor_dynamical_uncertainty_Hinf.png]]
|
||||||
|
|
||||||
** Super sensor noise
|
** Super sensor noise
|
||||||
We now compute the obtain Power Spectral Density of the super sensor's noise (Figure [[fig:psd_sensors_hinf_synthesis]]).
|
We now compute the obtain Power Spectral Density of the super sensor's noise.
|
||||||
|
The Amplitude Spectral Densities are shown in Figure [[fig:psd_sensors_hinf_synthesis]].
|
||||||
The obtained RMS of the super sensor noise in the $\mathcal{H}_2$ and $\mathcal{H}_\infty$ case are shown in Table [[tab:rms_noise_comp_H2_Hinf]].
|
|
||||||
As expected, the super sensor obtained from the $\mathcal{H}_\infty$ synthesis is much noisier than the super sensor obtained from the $\mathcal{H}_2$ synthesis.
|
|
||||||
|
|
||||||
#+begin_src matlab
|
#+begin_src matlab
|
||||||
PSD_S2 = abs(squeeze(freqresp(N2, freqs, 'Hz'))).^2;
|
PSD_S2 = abs(squeeze(freqresp(N2, freqs, 'Hz'))).^2;
|
||||||
@@ -985,6 +1000,9 @@ As expected, the super sensor obtained from the $\mathcal{H}_\infty$ synthesis i
|
|||||||
abs(squeeze(freqresp(N2*H2, freqs, 'Hz'))).^2;
|
abs(squeeze(freqresp(N2*H2, freqs, 'Hz'))).^2;
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
The obtained RMS of the super sensor noise in the $\mathcal{H}_2$ and $\mathcal{H}_\infty$ case are shown in Table [[tab:rms_noise_comp_H2_Hinf]].
|
||||||
|
As expected, the super sensor obtained from the $\mathcal{H}_\infty$ synthesis is much noisier than the super sensor obtained from the $\mathcal{H}_2$ synthesis.
|
||||||
|
|
||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
H2_filters = load('./mat/H2_filters.mat', 'H2', 'H1');
|
H2_filters = load('./mat/H2_filters.mat', 'H2', 'H1');
|
||||||
|
|
||||||
@@ -995,23 +1013,23 @@ As expected, the super sensor obtained from the $\mathcal{H}_\infty$ synthesis i
|
|||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
figure;
|
figure;
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, PSD_S1, '-', 'DisplayName', '$\Phi_{n_1}$');
|
plot(freqs, sqrt(PSD_S1), '-', 'DisplayName', '$\phi_{n_1}$');
|
||||||
plot(freqs, PSD_S2, '-', 'DisplayName', '$\Phi_{n_2}$');
|
plot(freqs, sqrt(PSD_S2), '-', 'DisplayName', '$\phi_{n_2}$');
|
||||||
plot(freqs, PSD_H2, 'k-', 'DisplayName', '$\Phi_{n_{\mathcal{H}_2}}$');
|
plot(freqs, sqrt(PSD_H2), 'k-', 'DisplayName', '$\phi_{n_{\mathcal{H}_2}}$');
|
||||||
plot(freqs, PSD_Hinf, 'k--', 'DisplayName', '$\Phi_{n_{\mathcal{H}_\infty}}$');
|
plot(freqs, sqrt(PSD_Hinf), 'k--', 'DisplayName', '$\phi_{n_{\mathcal{H}_\infty}}$');
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
xlabel('Frequency [Hz]'); ylabel('Power Spectral Density $\left[ \frac{(m/s)^2}{Hz} \right]$');
|
xlabel('Frequency [Hz]'); ylabel('ASD $\left[ \frac{m/s}{\sqrt{Hz}} \right]$');
|
||||||
hold off;
|
hold off;
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
legend('location', 'northeast');
|
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/psd_sensors_hinf_synthesis.pdf', 'width', 'wide', 'height', 'normal');
|
exportFig('figs/psd_sensors_hinf_synthesis.pdf', 'width', 'half', 'height', 'normal');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:psd_sensors_hinf_synthesis
|
#+name: fig:psd_sensors_hinf_synthesis
|
||||||
#+caption: Power Spectral Density of the estimated $\hat{x}$ using the two sensors alone and using the
|
#+caption: Power Spectral Density of the estimated $\hat{x}$ using the two sensors alone and using the $\mathcal{H}_\infty$ synthesis
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
[[file:figs/psd_sensors_hinf_synthesis.png]]
|
[[file:figs/psd_sensors_hinf_synthesis.png]]
|
||||||
|
|
||||||
@@ -1048,7 +1066,7 @@ The sensor fusion architecture is shown in Figure [[fig:sensor_fusion_arch_full]
|
|||||||
|
|
||||||
#+name: fig:sensor_fusion_arch_full
|
#+name: fig:sensor_fusion_arch_full
|
||||||
#+caption: Sensor fusion architecture with sensor dynamics uncertainty
|
#+caption: Sensor fusion architecture with sensor dynamics uncertainty
|
||||||
[[file:figs-tikz/sensor_fusion_arch_full.png]]
|
[[file:figs-paper/sensor_fusion_arch_full.png]]
|
||||||
|
|
||||||
The goal is to design complementary filters such that:
|
The goal is to design complementary filters such that:
|
||||||
- the maximum uncertainty of the super sensor is bounded to acceptable values (defined by $W_u(s)$)
|
- the maximum uncertainty of the super sensor is bounded to acceptable values (defined by $W_u(s)$)
|
||||||
@@ -1081,7 +1099,7 @@ The filter $H_2(s)$ is synthesized such that it:
|
|||||||
|
|
||||||
#+name: fig:mixed_h2_hinf_synthesis
|
#+name: fig:mixed_h2_hinf_synthesis
|
||||||
#+caption: Mixed $\mathcal{H}_2/\mathcal{H}_\infty$ Synthesis
|
#+caption: Mixed $\mathcal{H}_2/\mathcal{H}_\infty$ Synthesis
|
||||||
[[file:figs-tikz/mixed_h2_hinf_synthesis.png]]
|
[[file:figs-paper/mixed_h2_hinf_synthesis.png]]
|
||||||
|
|
||||||
Let's see that
|
Let's see that
|
||||||
with $H_1(s)= 1 - H_2(s)$
|
with $H_1(s)= 1 - H_2(s)$
|
||||||
@@ -1120,38 +1138,38 @@ The obtained complementary filters are shown in Figure [[fig:htwo_hinf_comp_filt
|
|||||||
|
|
||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
figure;
|
figure;
|
||||||
|
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||||
|
|
||||||
ax1 = subplot(2,1,1);
|
% Magnitude
|
||||||
|
ax1 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, 1./abs(squeeze(freqresp(Wu*W1, freqs, 'Hz'))), '--', 'DisplayName', '$1/|W_uW_1|$');
|
plot(freqs, 1./abs(squeeze(freqresp(Wu*W1, freqs, 'Hz'))), '--', 'DisplayName', '$1/|W_uW_1|$');
|
||||||
plot(freqs, 1./abs(squeeze(freqresp(Wu*W2, freqs, 'Hz'))), '--', 'DisplayName', '$1/|W_uW_2|$');
|
plot(freqs, 1./abs(squeeze(freqresp(Wu*W2, freqs, 'Hz'))), '--', 'DisplayName', '$1/|W_uW_2|$');
|
||||||
|
|
||||||
set(gca,'ColorOrderIndex',1)
|
set(gca,'ColorOrderIndex',1)
|
||||||
plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$');
|
plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$');
|
||||||
plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$');
|
plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$');
|
||||||
|
|
||||||
hold off;
|
hold off;
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
ylabel('Magnitude');
|
ylabel('Magnitude'); set(gca, 'XTickLabel',[]);
|
||||||
set(gca, 'XTickLabel',[]);
|
|
||||||
ylim([1e-3, 2]);
|
ylim([1e-3, 2]);
|
||||||
legend('location', 'southwest');
|
legend('location', 'southeast', 'FontSize', 8);
|
||||||
|
|
||||||
ax2 = subplot(2,1,2);
|
% Phase
|
||||||
|
ax2 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz'))), '-');
|
plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz'))), '-');
|
||||||
plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-');
|
plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-');
|
||||||
hold off;
|
hold off;
|
||||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
set(gca, 'XScale', 'log');
|
set(gca, 'XScale', 'log');
|
||||||
yticks([-360:90:360]);
|
ylim([-90, 90]); yticks([-360:90:360]);
|
||||||
|
|
||||||
linkaxes([ax1,ax2],'x');
|
linkaxes([ax1,ax2],'x');
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/htwo_hinf_comp_filters.pdf', 'width', 'full', 'height', 'full');
|
exportFig('figs/htwo_hinf_comp_filters.pdf', 'width', 'half', 'height', 'tall');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:htwo_hinf_comp_filters
|
#+name: fig:htwo_hinf_comp_filters
|
||||||
@@ -1160,7 +1178,7 @@ The obtained complementary filters are shown in Figure [[fig:htwo_hinf_comp_filt
|
|||||||
[[file:figs/htwo_hinf_comp_filters.png]]
|
[[file:figs/htwo_hinf_comp_filters.png]]
|
||||||
|
|
||||||
** Obtained Super Sensor's noise
|
** Obtained Super Sensor's noise
|
||||||
The Power Spectral Density of the super sensor's noise is shown in Figure [[fig:psd_sensors_htwo_hinf_synthesis]].
|
The Amplitude Spectral Density of the super sensor's noise is shown in Figure [[fig:psd_sensors_htwo_hinf_synthesis]].
|
||||||
|
|
||||||
A time domain simulation is shown in Figure [[fig:super_sensor_time_domain_h2_hinf]].
|
A time domain simulation is shown in Figure [[fig:super_sensor_time_domain_h2_hinf]].
|
||||||
|
|
||||||
@@ -1190,24 +1208,24 @@ The RMS values of the super sensor noise for the presented three synthesis are l
|
|||||||
#+begin_src matlab :exports none
|
#+begin_src matlab :exports none
|
||||||
figure;
|
figure;
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, PSD_S1, '-', 'DisplayName', '$\Phi_{n_1}$');
|
plot(freqs, sqrt(PSD_S1), '-', 'DisplayName', '$\Phi_{n_1}$');
|
||||||
plot(freqs, PSD_S2, '-', 'DisplayName', '$\Phi_{n_2}$');
|
plot(freqs, sqrt(PSD_S2), '-', 'DisplayName', '$\Phi_{n_2}$');
|
||||||
plot(freqs, PSD_H2, 'k-', 'DisplayName', '$\Phi_{n_{\mathcal{H}_2}}$');
|
plot(freqs, sqrt(PSD_H2), 'k-', 'DisplayName', '$\Phi_{n_{\mathcal{H}_2}}$');
|
||||||
plot(freqs, PSD_Hinf, 'k--', 'DisplayName', '$\Phi_{n_{\mathcal{H}_\infty}}$');
|
plot(freqs, sqrt(PSD_Hinf), 'k--', 'DisplayName', '$\Phi_{n_{\mathcal{H}_\infty}}$');
|
||||||
plot(freqs, PSD_H2Hinf, 'k-.', 'DisplayName', '$\Phi_{n_{\mathcal{H}_2/\mathcal{H}_\infty}}$');
|
plot(freqs, sqrt(PSD_H2Hinf), 'k-.', 'DisplayName', '$\Phi_{n_{\mathcal{H}_2/\mathcal{H}_\infty}}$');
|
||||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
xlabel('Frequency [Hz]'); ylabel('Power Spectral Density [$(m/s)^2/Hz$]');
|
xlabel('Frequency [Hz]'); ylabel('ASD $\left[ \frac{m/s}{\sqrt{Hz}} \right]$');
|
||||||
hold off;
|
hold off;
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
legend('location', 'northeast');
|
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 3);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/psd_sensors_htwo_hinf_synthesis.pdf', 'width', 'wide', 'height', 'normal');
|
exportFig('figs/psd_sensors_htwo_hinf_synthesis.pdf', 'width', 'half', 'height', 'normal');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:psd_sensors_htwo_hinf_synthesis
|
#+name: fig:psd_sensors_htwo_hinf_synthesis
|
||||||
#+CAPTION: Power Spectral Density of the Super Sensor obtained with the mixed $\mathcal{H}_2/\mathcal{H}_\infty$ synthesis
|
#+caption: Power Spectral Density of the Super Sensor obtained with the mixed $\mathcal{H}_2/\mathcal{H}_\infty$ synthesis
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
[[file:figs/psd_sensors_htwo_hinf_synthesis.png]]
|
[[file:figs/psd_sensors_htwo_hinf_synthesis.png]]
|
||||||
|
|
||||||
@@ -1236,12 +1254,12 @@ The RMS values of the super sensor noise for the presented three synthesis are l
|
|||||||
plot(t, v, 'k--', 'DisplayName', '$x$');
|
plot(t, v, 'k--', 'DisplayName', '$x$');
|
||||||
hold off;
|
hold off;
|
||||||
xlabel('Time [s]'); ylabel('Velocity [m/s]');
|
xlabel('Time [s]'); ylabel('Velocity [m/s]');
|
||||||
legend('location', 'southwest');
|
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 3);
|
||||||
ylim([-0.3, 0.3]);
|
ylim([-0.3, 0.3]);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/super_sensor_time_domain_h2_hinf.pdf', 'width', 'wide', 'height', 'normal');
|
exportFig('figs/super_sensor_time_domain_h2_hinf.pdf', 'width', 'half', 'height', 'normal');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:super_sensor_time_domain_h2_hinf
|
#+name: fig:super_sensor_time_domain_h2_hinf
|
||||||
@@ -1277,8 +1295,10 @@ The uncertainty on the super sensor's dynamics is shown in Figure [[fig:super_se
|
|||||||
Dphi_ss(abs(squeeze(freqresp(W2*H2, freqs, 'Hz'))) + abs(squeeze(freqresp(W1*H1, freqs, 'Hz'))) > 1) = 360;
|
Dphi_ss(abs(squeeze(freqresp(W2*H2, freqs, 'Hz'))) + abs(squeeze(freqresp(W1*H1, freqs, 'Hz'))) > 1) = 360;
|
||||||
|
|
||||||
figure;
|
figure;
|
||||||
|
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
|
||||||
|
|
||||||
% Magnitude
|
% Magnitude
|
||||||
ax1 = subplot(2,1,1);
|
ax1 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plotMagUncertainty(W1, freqs, 'color_i', 1, 'DisplayName', '$1 + W_1 \Delta_1$');
|
plotMagUncertainty(W1, freqs, 'color_i', 1, 'DisplayName', '$1 + W_1 \Delta_1$');
|
||||||
plotMagUncertainty(W2, freqs, 'color_i', 2, 'DisplayName', '$1 + W_2 \Delta_2$');
|
plotMagUncertainty(W2, freqs, 'color_i', 2, 'DisplayName', '$1 + W_2 \Delta_2$');
|
||||||
@@ -1294,11 +1314,11 @@ The uncertainty on the super sensor's dynamics is shown in Figure [[fig:super_se
|
|||||||
set(gca, 'XTickLabel',[]);
|
set(gca, 'XTickLabel',[]);
|
||||||
ylabel('Magnitude');
|
ylabel('Magnitude');
|
||||||
ylim([1e-2, 1e1]);
|
ylim([1e-2, 1e1]);
|
||||||
legend('location', 'southeast');
|
legend('location', 'southeast', 'FontSize', 8);
|
||||||
hold off;
|
hold off;
|
||||||
|
|
||||||
% Phase
|
% Phase
|
||||||
ax2 = subplot(2,1,2);
|
ax2 = nexttile;
|
||||||
hold on;
|
hold on;
|
||||||
plotPhaseUncertainty(W1, freqs, 'color_i', 1);
|
plotPhaseUncertainty(W1, freqs, 'color_i', 1);
|
||||||
plotPhaseUncertainty(W2, freqs, 'color_i', 2);
|
plotPhaseUncertainty(W2, freqs, 'color_i', 2);
|
||||||
@@ -1307,16 +1327,16 @@ The uncertainty on the super sensor's dynamics is shown in Figure [[fig:super_se
|
|||||||
plot(freqs, Dphi_Wu, 'k--');
|
plot(freqs, Dphi_Wu, 'k--');
|
||||||
plot(freqs, -Dphi_Wu, 'k--');
|
plot(freqs, -Dphi_Wu, 'k--');
|
||||||
set(gca,'xscale','log');
|
set(gca,'xscale','log');
|
||||||
yticks(-180:90:180);
|
ylim([-180 180]); yticks(-180:90:180);
|
||||||
ylim([-180 180]);
|
|
||||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
hold off;
|
hold off;
|
||||||
|
|
||||||
linkaxes([ax1,ax2],'x');
|
linkaxes([ax1,ax2],'x');
|
||||||
xlim([freqs(1), freqs(end)]);
|
xlim([freqs(1), freqs(end)]);
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src matlab :tangle no :exports results :results file replace
|
#+begin_src matlab :tangle no :exports results :results file replace
|
||||||
exportFig('figs/super_sensor_dynamical_uncertainty_Htwo_Hinf.pdf', 'width', 'full', 'height', 'full');
|
exportFig('figs/super_sensor_dynamical_uncertainty_Htwo_Hinf.pdf', 'width', 'half', 'height', 'tall');
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+name: fig:super_sensor_dynamical_uncertainty_Htwo_Hinf
|
#+name: fig:super_sensor_dynamical_uncertainty_Htwo_Hinf
|
1
matlab/figs-journal
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../paper/figs
|
@@ -1 +0,0 @@
|
|||||||
../tikz/figs
|
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 96 KiB |
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 111 KiB |
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 129 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 105 KiB |
Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 103 KiB |
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 105 KiB |
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 53 KiB |