Compare commits

..

20 Commits

Author SHA1 Message Date
d3f8f1cc4e Add license file 2021-09-10 11:07:58 +02:00
86a72b9ee7 Rework authors 2021-09-10 11:07:46 +02:00
3e39eadc12 Rework main page 2021-09-10 11:07:38 +02:00
2fc62f5deb Rename Matlab files 2021-09-10 11:06:25 +02:00
7f03d4c2ac Rename tikz file 2021-09-10 11:05:43 +02:00
8457e33e26 Rename paper files 2021-09-10 11:05:29 +02:00
ebdde7b4b7 Simlink readme.org 2021-04-28 18:01:04 +02:00
44d82fb66a Remove margin of main page 2020-12-07 11:50:14 +01:00
54ab59a00c Use online CSS and JS 2020-11-12 10:42:27 +01:00
ef78808a52 Add Mohit as author 2020-10-26 21:36:20 +01:00
92f78dda18 Update paper with new figures 2020-10-25 10:05:56 +01:00
6923496e4f Update figure using tiledlayout and nexttile 2020-10-25 10:01:53 +01:00
a0394c8136 Update index page 2020-10-05 18:15:52 +02:00
5ee0701244 Add figures to paper 2020-10-05 15:42:08 +02:00
fb75ce4185 Change figure folders 2020-10-05 15:41:57 +02:00
b53bee9e37 Update generalized plant 2020-10-05 11:47:57 +02:00
dcd65832dc Update CSS 2020-10-05 11:47:32 +02:00
41f51e423c Update tangled code 2020-10-05 11:47:09 +02:00
5f1f33144e Update figures (half width) 2020-10-05 11:46:19 +02:00
6a67db598b Add subtitle and backlink 2020-10-03 19:04:57 +02:00
197 changed files with 1779 additions and 13424 deletions

21
LICENSE.txt Normal file
View 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.

View File

@@ -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; }

File diff suppressed because it is too large Load Diff

View File

@@ -3,279 +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>
<!-- 2019-08-21 mer. 16:34 --> <!-- 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" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <title>Robust and Optimal Sensor Fusion using Complementary Filters</title>
<title>Robust and Optimal Sensor Fusion</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Thomas Dehaeze" /> <meta name="author" content="Thomas Dehaeze" />
<style type="text/css"> <meta name="generator" content="Org Mode" />
<!--/*--><![CDATA[/*><!--*/ <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
.title { text-align: center; <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
margin-bottom: .2em; } <style> #content {margin: auto;} </style>
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #ccc;
box-shadow: 3px 3px 3px #eee;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: visible;
padding-top: 1.2em;
}
pre.src:before {
display: none;
position: absolute;
background-color: white;
top: -10px;
right: 10px;
padding: 3px;
border: 1px solid black;
}
pre.src:hover:before { display: inline;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { width: 90%; }
/*]]>*/-->
</style>
<link rel="stylesheet" type="text/css" href="css/htmlize.css"/>
<link rel="stylesheet" type="text/css" href="css/readtheorg.css"/>
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/jquery.stickytableheaders.min.js"></script>
<script src="js/readtheorg.js"></script>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2019 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id)
{
var target = document.getElementById(id);
if(null != target) {
elem.cacheClassElem = elem.className;
elem.cacheClassTarget = target.className;
target.className = "code-highlighted";
elem.className = "code-highlighted";
}
}
function CodeHighlightOff(elem, id)
{
var target = document.getElementById(id);
if(elem.cacheClassElem)
elem.className = elem.cacheClassElem;
if(elem.cacheClassTarget)
target.className = elem.cacheClassTarget;
}
/*]]>*///-->
</script>
</head> </head>
<body> <body>
<div id="content"> <div id="org-div-home-and-up">
<h1 class="title">Robust and Optimal Sensor Fusion</h1> <a accesskey="h" href="../index.html"> UP </a>
|
<div id="outline-container-org3de21b9" class="outline-2"> <a accesskey="H" href="../index.html"> HOME </a>
<h2 id="org3de21b9">Paper</h2> </div><div id="content" class="content">
<div class="outline-text-2" id="text-org3de21b9"> <h1 class="title">Robust and Optimal Sensor Fusion using Complementary Filters
<br />
<span class="subtitle">Dehaeze Thomas and Collette Christophe</span>
</h1>
<blockquote>
<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-orgff6a27f" class="outline-2"> <div id="outline-container-orgd50e329" class="outline-2">
<h2 id="orgff6a27f">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-orgff6a27f"> <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-orgb7551f6" class="outline-2"> <div id="outline-container-org3b999bd" class="outline-2">
<h2 id="orgb7551f6">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-orgb7551f6"> <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>

View File

@@ -1,29 +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
#+HTML_LINK_HOME: ../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
View 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*.*";

View File

@@ -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:

Binary file not shown.

View 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}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

7
js/bootstrap.min.js vendored

File diff suppressed because one or more lines are too long

4
js/jquery.min.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -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);

View File

@@ -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
};
}($));

File diff suppressed because one or more lines are too long

View File

@@ -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
View File

@@ -0,0 +1 @@
../paper/figs

View File

@@ -1 +0,0 @@
../tikz/figs

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Some files were not shown because too many files have changed in this diff Show More