Add analysis, images, and explanations

This commit is contained in:
Thomas Dehaeze 2020-10-23 23:05:34 +02:00
parent f3c087279c
commit f69ecdcae5
32 changed files with 7569 additions and 0 deletions

145
css/htmlize.css Normal file
View File

@ -0,0 +1,145 @@
.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; }

1095
css/readtheorg.css Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

3966
figs/exp_setup_schematic.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 225 KiB

BIN
figs/huddle_test_asd.pdf Normal file

Binary file not shown.

BIN
figs/huddle_test_asd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
figs/int_enc_one_cycle.pdf Normal file

Binary file not shown.

BIN
figs/int_enc_one_cycle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

345
index.html Normal file
View File

@ -0,0 +1,345 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2020-10-23 ven. 23:04 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Encoder - Test Bench</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Dehaeze Thomas" />
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
<link rel="stylesheet" type="text/css" href="./css/zenburn.css"/>
<script type="text/javascript" src="./js/jquery.min.js"></script>
<script type="text/javascript" src="./js/bootstrap.min.js"></script>
<script type="text/javascript" src="./js/jquery.stickytableheaders.min.js"></script>
<script type="text/javascript" src="./js/readtheorg.js"></script>
<script>MathJax = {
tex: {
tags: 'ams',
macros: {bm: ["\\boldsymbol{#1}",1],}
}
};
</script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
</head>
<body>
<div id="content">
<h1 class="title">Encoder - Test Bench</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org0d09252">1. Experimental Setup</a></li>
<li><a href="#org4c1706c">2. Huddle Test</a>
<ul>
<li><a href="#org169c9b3">2.1. Load Data</a></li>
<li><a href="#org71d6eed">2.2. Time Domain Results</a></li>
<li><a href="#org526b687">2.3. Frequency Domain Noise</a></li>
</ul>
</li>
<li><a href="#org25a61fe">3. Comparison Interferometer / Encoder</a>
<ul>
<li><a href="#orgb31234a">3.1. Load Data</a></li>
<li><a href="#org4fa5441">3.2. Time Domain Results</a></li>
<li><a href="#orge79e200">3.3. Difference between Encoder and Interferometer as a function of time</a></li>
<li><a href="#org625a811">3.4. Difference between Encoder and Interferometer as a function of position</a></li>
</ul>
</li>
<li><a href="#org2e4bf3b">4. Identification</a>
<ul>
<li><a href="#org8a892bd">4.1. Load Data</a></li>
<li><a href="#org7e3c2ba">4.2. Identification</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-org0d09252" class="outline-2">
<h2 id="org0d09252"><span class="section-number-2">1</span> Experimental Setup</h2>
<div class="outline-text-2" id="text-1">
<p>
The experimental Setup is schematically represented in Figure <a href="#org5bc9553">1</a>.
</p>
<div id="org5bc9553" class="figure">
<p><img src="figs/exp_setup_schematic.png" alt="exp_setup_schematic.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Schematic of the Experiment</p>
</div>
<div id="org7f3df10" class="figure">
<p><img src="figs/IMG_20201023_153905.jpg" alt="IMG_20201023_153905.jpg" />
</p>
<p><span class="figure-number">Figure 2: </span>Side View of the encoder</p>
</div>
<div id="org71727ed" class="figure">
<p><img src="figs/IMG_20201023_153914.jpg" alt="IMG_20201023_153914.jpg" />
</p>
<p><span class="figure-number">Figure 3: </span>Front View of the encoder</p>
</div>
</div>
</div>
<div id="outline-container-org4c1706c" class="outline-2">
<h2 id="org4c1706c"><span class="section-number-2">2</span> Huddle Test</h2>
<div class="outline-text-2" id="text-2">
<p>
The goal in this section is the estimate the noise of both the encoder and the intereferometer.
</p>
</div>
<div id="outline-container-org169c9b3" class="outline-3">
<h3 id="org169c9b3"><span class="section-number-3">2.1</span> Load Data</h3>
<div class="outline-text-3" id="text-2-1">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'mat/int_enc_huddle_test.mat'</span>, <span class="org-string">'interferometer'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'t'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">interferometer = detrend(interferometer, 0);
encoder = detrend(encoder, 0);
</pre>
</div>
</div>
</div>
<div id="outline-container-org71d6eed" class="outline-3">
<h3 id="org71d6eed"><span class="section-number-3">2.2</span> Time Domain Results</h3>
<div class="outline-text-3" id="text-2-2">
<div id="org06a0d1c" class="figure">
<p><img src="figs/huddle_test_time_domain.png" alt="huddle_test_time_domain.png" />
</p>
<p><span class="figure-number">Figure 4: </span>Huddle test - Time domain signals</p>
</div>
<div class="org-src-container">
<pre class="src src-matlab">G_lpf = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> s<span class="org-type">/</span>2<span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span>10);
</pre>
</div>
<div id="orgee9ad22" class="figure">
<p><img src="figs/huddle_test_time_domain_filtered.png" alt="huddle_test_time_domain_filtered.png" />
</p>
<p><span class="figure-number">Figure 5: </span>Huddle test - Time domain signals filtered with a LPF at 10Hz</p>
</div>
</div>
</div>
<div id="outline-container-org526b687" class="outline-3">
<h3 id="org526b687"><span class="section-number-3">2.3</span> Frequency Domain Noise</h3>
<div class="outline-text-3" id="text-2-3">
<div class="org-src-container">
<pre class="src src-matlab">Ts = 1e<span class="org-type">-</span>4;
win = hann(ceil(10<span class="org-type">/</span>Ts));
[p_i, f] = pwelch(interferometer, win, [], [], 1<span class="org-type">/</span>Ts);
[p_e, <span class="org-type">~</span>] = pwelch(encoder, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="org7e02bb2" class="figure">
<p><img src="figs/huddle_test_asd.png" alt="huddle_test_asd.png" />
</p>
<p><span class="figure-number">Figure 6: </span>Amplitude Spectral Density of the signals during the Huddle test</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org25a61fe" class="outline-2">
<h2 id="org25a61fe"><span class="section-number-2">3</span> Comparison Interferometer / Encoder</h2>
<div class="outline-text-2" id="text-3">
<p>
The goal here is to make sure that the interferometer and encoder measurements are coherent.
We may see non-linearity in the interferometric measurement.
</p>
</div>
<div id="outline-container-orgb31234a" class="outline-3">
<h3 id="orgb31234a"><span class="section-number-3">3.1</span> Load Data</h3>
<div class="outline-text-3" id="text-3-1">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'mat/int_enc_comp.mat'</span>, <span class="org-string">'interferometer'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">interferometer = detrend(interferometer, 0);
encoder = detrend(encoder, 0);
u = detrend(u, 0);
</pre>
</div>
</div>
</div>
<div id="outline-container-org4fa5441" class="outline-3">
<h3 id="org4fa5441"><span class="section-number-3">3.2</span> Time Domain Results</h3>
<div class="outline-text-3" id="text-3-2">
<div id="org486d613" class="figure">
<p><img src="figs/int_enc_one_cycle.png" alt="int_enc_one_cycle.png" />
</p>
<p><span class="figure-number">Figure 7: </span>One cycle measurement</p>
</div>
<div id="org2bb119e" class="figure">
<p><img src="figs/int_enc_one_cycle_error.png" alt="int_enc_one_cycle_error.png" />
</p>
<p><span class="figure-number">Figure 8: </span>Difference between the Encoder and the interferometer during one cycle</p>
</div>
</div>
</div>
<div id="outline-container-orge79e200" class="outline-3">
<h3 id="orge79e200"><span class="section-number-3">3.3</span> Difference between Encoder and Interferometer as a function of time</h3>
<div class="outline-text-3" id="text-3-3">
<div class="org-src-container">
<pre class="src src-matlab">Ts = 1e<span class="org-type">-</span>4;
d_i_mean = reshape(interferometer, [2<span class="org-type">/</span>Ts floor(Ts<span class="org-type">/</span>2<span class="org-type">*</span>length(interferometer))]);
d_e_mean = reshape(encoder, [2<span class="org-type">/</span>Ts floor(Ts<span class="org-type">/</span>2<span class="org-type">*</span>length(encoder))]);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">w0 = 2<span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>5; <span class="org-comment">% [rad/s]</span>
xi = 0.7;
G_lpf = 1<span class="org-type">/</span>(1 <span class="org-type">+</span> 2<span class="org-type">*</span>xi<span class="org-type">/</span>w0<span class="org-type">*</span>s <span class="org-type">+</span> s<span class="org-type">^</span>2<span class="org-type">/</span>w0<span class="org-type">^</span>2);
d_err_mean = reshape(lsim(G_lpf, encoder <span class="org-type">-</span> interferometer, t), [2<span class="org-type">/</span>Ts floor(Ts<span class="org-type">/</span>2<span class="org-type">*</span>length(encoder))]);
d_err_mean = d_err_mean <span class="org-type">-</span> mean(d_err_mean);
</pre>
</div>
<div id="orgf0015d1" class="figure">
<p><img src="figs/int_enc_error_mean_time.png" alt="int_enc_error_mean_time.png" />
</p>
<p><span class="figure-number">Figure 9: </span>Difference between the two measurement in the time domain, averaged for all the cycles</p>
</div>
</div>
</div>
<div id="outline-container-org625a811" class="outline-3">
<h3 id="org625a811"><span class="section-number-3">3.4</span> Difference between Encoder and Interferometer as a function of position</h3>
<div class="outline-text-3" id="text-3-4">
<p>
Compute the mean of the interferometer measurement corresponding to each of the encoder measurement.
</p>
<div class="org-src-container">
<pre class="src src-matlab">[e_sorted, <span class="org-type">~</span>, e_ind] = unique(encoder);
i_mean = zeros(length(e_sorted), 1);
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant">1:length(e_sorted)</span>
i_mean(<span class="org-constant">i</span>) = mean(interferometer(e_ind <span class="org-type">==</span> <span class="org-constant">i</span>));
<span class="org-keyword">end</span>
i_mean_error = (i_mean <span class="org-type">-</span> e_sorted);
</pre>
</div>
<div id="orgd4f6d77" class="figure">
<p><img src="figs/int_enc_error_mean_position.png" alt="int_enc_error_mean_position.png" />
</p>
<p><span class="figure-number">Figure 10: </span>Difference between the two measurement as a function of the measured position by the encoder, averaged for all the cycles</p>
</div>
<p>
The period of the non-linearity seems to be \(1.53 \mu m\) which corresponds to the wavelength of the Laser.
</p>
<div class="org-src-container">
<pre class="src src-matlab">win_length = 1530; <span class="org-comment">% length of the windows (corresponds to 1.53 um)</span>
num_avg = floor(length(e_sorted)<span class="org-type">/</span>win_length); <span class="org-comment">% number of averaging</span>
i_init = ceil((length(e_sorted) <span class="org-type">-</span> win_length<span class="org-type">*</span>num_avg)<span class="org-type">/</span>2); <span class="org-comment">% does not start at the extremity</span>
e_sorted_mean_over_period = mean(reshape(i_mean_error(i_init<span class="org-type">:</span>i_init<span class="org-type">+</span>win_length<span class="org-type">*</span>num_avg<span class="org-type">-</span>1), [win_length num_avg]), 2);
</pre>
</div>
<div id="orgb5a621e" class="figure">
<p><img src="figs/int_non_linearity_period_wavelength.png" alt="int_non_linearity_period_wavelength.png" />
</p>
<p><span class="figure-number">Figure 11: </span>Non-Linearity of the Interferometer over the period of the wavelength</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org2e4bf3b" class="outline-2">
<h2 id="org2e4bf3b"><span class="section-number-2">4</span> Identification</h2>
<div class="outline-text-2" id="text-4">
</div>
<div id="outline-container-org8a892bd" class="outline-3">
<h3 id="org8a892bd"><span class="section-number-3">4.1</span> Load Data</h3>
<div class="outline-text-3" id="text-4-1">
<div class="org-src-container">
<pre class="src src-matlab">load(<span class="org-string">'mat/int_enc_id_noise_bis.mat'</span>, <span class="org-string">'interferometer'</span>, <span class="org-string">'encoder'</span>, <span class="org-string">'u'</span>, <span class="org-string">'t'</span>);
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">interferometer = detrend(interferometer, 0);
encoder = detrend(encoder, 0);
u = detrend(u, 0);
</pre>
</div>
</div>
</div>
<div id="outline-container-org7e3c2ba" class="outline-3">
<h3 id="org7e3c2ba"><span class="section-number-3">4.2</span> Identification</h3>
<div class="outline-text-3" id="text-4-2">
<div class="org-src-container">
<pre class="src src-matlab">Ts = 1e<span class="org-type">-</span>4; <span class="org-comment">% Sampling Time [s]</span>
win = hann(ceil(10<span class="org-type">/</span>Ts));
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">[tf_i_est, f] = tfestimate(u, interferometer, win, [], [], 1<span class="org-type">/</span>Ts);
[co_i_est, <span class="org-type">~</span>] = mscohere(u, interferometer, win, [], [], 1<span class="org-type">/</span>Ts);
[tf_e_est, <span class="org-type">~</span>] = tfestimate(u, encoder, win, [], [], 1<span class="org-type">/</span>Ts);
[co_e_est, <span class="org-type">~</span>] = mscohere(u, encoder, win, [], [], 1<span class="org-type">/</span>Ts);
</pre>
</div>
<div id="org801d42d" class="figure">
<p><img src="figs/identification_dynamics_coherence.png" alt="identification_dynamics_coherence.png" />
</p>
</div>
<div id="org7f77bc5" class="figure">
<p><img src="figs/identification_dynamics_bode.png" alt="identification_dynamics_bode.png" />
</p>
</div>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2020-10-23 ven. 23:04</p>
</div>
</body>
</html>

403
index.org Normal file
View File

@ -0,0 +1,403 @@
#+TITLE: Encoder - Test Bench
:DRAWER:
#+LANGUAGE: en
#+EMAIL: dehaeze.thomas@gmail.com
#+AUTHOR: Dehaeze Thomas
#+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: <link rel="stylesheet" type="text/css" href="./css/zenburn.css"/>
#+HTML_HEAD: <script type="text/javascript" src="./js/jquery.min.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="./js/bootstrap.min.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="./js/jquery.stickytableheaders.min.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="./js/readtheorg.js"></script>
#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}")
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes
#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150
#+PROPERTY: header-args:latex+ :imoutoptions -quality 100
#+PROPERTY: header-args:latex+ :results raw replace :buffer no
#+PROPERTY: header-args:latex+ :eval no-export
#+PROPERTY: header-args:latex+ :exports both
#+PROPERTY: header-args:latex+ :mkdirp yes
#+PROPERTY: header-args:latex+ :output-dir figs
#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png")
#+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :tangle script.m
#+PROPERTY: header-args:matlab+ :comments org
#+PROPERTY: header-args:matlab+ :exports both
#+PROPERTY: header-args:matlab+ :results none
#+PROPERTY: header-args:matlab+ :eval no-export
#+PROPERTY: header-args:matlab+ :noweb yes
#+PROPERTY: header-args:matlab+ :mkdirp yes
#+PROPERTY: header-args:matlab+ :output-dir figs
:END:
* Experimental Setup
The experimental Setup is schematically represented in Figure [[fig:exp_setup_schematic]].
The mass can be vertically moved using the amplified piezoelectric actuator.
The displacement of the mass (relative to the mechanical frame) is measured both by the interferometer and by the encoder.
#+name: fig:exp_setup_schematic
#+caption: Schematic of the Experiment
[[file:figs/exp_setup_schematic.png]]
#+name: fig:encoder_side_view
#+caption: Side View of the encoder
[[file:figs/IMG_20201023_153905.jpg]]
#+name: fig:encoder_front_view
#+caption: Front View of the encoder
[[file:figs/IMG_20201023_153914.jpg]]
* Huddle Test
** Introduction :ignore:
The goal in this section is the estimate the noise of both the encoder and the intereferometer.
** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
** Load Data
#+begin_src matlab
load('mat/int_enc_huddle_test.mat', 'interferometer', 'encoder', 't');
#+end_src
#+begin_src matlab
interferometer = detrend(interferometer, 0);
encoder = detrend(encoder, 0);
#+end_src
** Time Domain Results
#+begin_src matlab :exports none
figure;
hold on;
plot(t, encoder, 'DisplayName', 'Encoder')
plot(t, interferometer, 'DisplayName', 'Interferometer')
hold off;
xlabel('Time [s]'); ylabel('Displacement [m]');
legend('location', 'northeast');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/huddle_test_time_domain.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:huddle_test_time_domain
#+caption: Huddle test - Time domain signals
#+RESULTS:
[[file:figs/huddle_test_time_domain.png]]
#+begin_src matlab
G_lpf = 1/(1 + s/2/pi/10);
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
plot(t, lsim(G_lpf, encoder, t), 'DisplayName', 'Encoder')
plot(t, lsim(G_lpf, interferometer, t), 'DisplayName', 'Interferometer')
hold off;
xlabel('Time [s]'); ylabel('Displacement [m]');
legend('location', 'northeast');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/huddle_test_time_domain_filtered.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:huddle_test_time_domain_filtered
#+caption: Huddle test - Time domain signals filtered with a LPF at 10Hz
#+RESULTS:
[[file:figs/huddle_test_time_domain_filtered.png]]
** Frequency Domain Noise
#+begin_src matlab
Ts = 1e-4;
win = hann(ceil(10/Ts));
[p_i, f] = pwelch(interferometer, win, [], [], 1/Ts);
[p_e, ~] = pwelch(encoder, win, [], [], 1/Ts);
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
plot(f, sqrt(p_i), 'DisplayName', 'Interferometer');
plot(f, sqrt(p_e), 'DisplayName', 'Encoder');
hold off;
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
ylabel('ASD [$m/\sqrt{Hz}$]'); xlabel('Frequency [Hz]');
legend();
xlim([1e-1, 5e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/huddle_test_asd.pdf', 'width', 'wide', 'height', 'tall');
#+end_src
#+name: fig:huddle_test_asd
#+caption: Amplitude Spectral Density of the signals during the Huddle test
#+RESULTS:
[[file:figs/huddle_test_asd.png]]
* Comparison Interferometer / Encoder
** Introduction :ignore:
The goal here is to make sure that the interferometer and encoder measurements are coherent.
We may see non-linearity in the interferometric measurement.
** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
** Load Data
#+begin_src matlab
load('mat/int_enc_comp.mat', 'interferometer', 'encoder', 'u', 't');
#+end_src
#+begin_src matlab
interferometer = detrend(interferometer, 0);
encoder = detrend(encoder, 0);
u = detrend(u, 0);
#+end_src
** Time Domain Results
#+begin_src matlab :exports none
figure;
hold on;
plot(t, encoder, '-', 'DisplayName', 'Encoder')
plot(t, interferometer, '--', 'DisplayName', 'Interferometer')
hold off;
xlabel('Time [s]'); ylabel('Displacement [m]');
legend('location', 'northeast');
xlim([50, 52])
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/int_enc_one_cycle.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:int_enc_one_cycle
#+caption: One cycle measurement
#+RESULTS:
[[file:figs/int_enc_one_cycle.png]]
#+begin_src matlab :exports none
figure;
hold on;
plot(t, encoder - interferometer, 'DisplayName', 'Difference')
hold off;
xlabel('Time [s]'); ylabel('Displacement [m]');
legend('location', 'northeast');
xlim([50, 52])
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/int_enc_one_cycle_error.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:int_enc_one_cycle_error
#+caption: Difference between the Encoder and the interferometer during one cycle
#+RESULTS:
[[file:figs/int_enc_one_cycle_error.png]]
** Difference between Encoder and Interferometer as a function of time
#+begin_src matlab
Ts = 1e-4;
d_i_mean = reshape(interferometer, [2/Ts floor(Ts/2*length(interferometer))]);
d_e_mean = reshape(encoder, [2/Ts floor(Ts/2*length(encoder))]);
#+end_src
#+begin_src matlab
w0 = 2*pi*5; % [rad/s]
xi = 0.7;
G_lpf = 1/(1 + 2*xi/w0*s + s^2/w0^2);
d_err_mean = reshape(lsim(G_lpf, encoder - interferometer, t), [2/Ts floor(Ts/2*length(encoder))]);
d_err_mean = d_err_mean - mean(d_err_mean);
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
for i_i = 1:size(d_err_mean, 2)
plot(t(1:size(d_err_mean, 1)), d_err_mean(:, i_i), 'k-')
end
plot(t(1:size(d_err_mean, 1)), mean(d_err_mean, 2), 'r-')
hold off;
xlabel('Time [s]'); ylabel('Displacement [m]');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/int_enc_error_mean_time.pdf', 'width', 'wide', 'height', 'normal', 'pdf', false);
#+end_src
#+name: fig:int_enc_error_mean_time
#+caption: Difference between the two measurement in the time domain, averaged for all the cycles
#+RESULTS:
[[file:figs/int_enc_error_mean_time.png]]
** Difference between Encoder and Interferometer as a function of position
Compute the mean of the interferometer measurement corresponding to each of the encoder measurement.
#+begin_src matlab
[e_sorted, ~, e_ind] = unique(encoder);
i_mean = zeros(length(e_sorted), 1);
for i = 1:length(e_sorted)
i_mean(i) = mean(interferometer(e_ind == i));
end
i_mean_error = (i_mean - e_sorted);
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
% plot(encoder, interferometer - encoder, 'k.', 'DisplayName', 'Difference')
plot(1e6*(e_sorted), 1e9*(i_mean_error))
hold off;
xlabel('Encoder Measurement [$\mu m$]'); ylabel('Measrement Error [nm]');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/int_enc_error_mean_position.pdf', 'width', 'wide', 'height', 'normal');
#+end_src
#+name: fig:int_enc_error_mean_position
#+caption: Difference between the two measurement as a function of the measured position by the encoder, averaged for all the cycles
#+RESULTS:
[[file:figs/int_enc_error_mean_position.png]]
The period of the non-linearity seems to be $1.53 \mu m$ which corresponds to the wavelength of the Laser.
#+begin_src matlab
win_length = 1530; % length of the windows (corresponds to 1.53 um)
num_avg = floor(length(e_sorted)/win_length); % number of averaging
i_init = ceil((length(e_sorted) - win_length*num_avg)/2); % does not start at the extremity
e_sorted_mean_over_period = mean(reshape(i_mean_error(i_init:i_init+win_length*num_avg-1), [win_length num_avg]), 2);
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
plot(1e-3*(0:win_length-1), e_sorted_mean_over_period)
hold off;
xlabel('Displacement [$\mu m$]'); ylabel('Measurement Non-Linearity [nm]');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/int_non_linearity_period_wavelength.pdf', 'width', 'wide', 'height', 'tall');
#+end_src
#+name: fig:int_non_linearity_period_wavelength
#+caption: Non-Linearity of the Interferometer over the period of the wavelength
#+RESULTS:
[[file:figs/int_non_linearity_period_wavelength.png]]
* Identification
** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
** Load Data
#+begin_src matlab
load('mat/int_enc_id_noise_bis.mat', 'interferometer', 'encoder', 'u', 't');
#+end_src
#+begin_src matlab
interferometer = detrend(interferometer, 0);
encoder = detrend(encoder, 0);
u = detrend(u, 0);
#+end_src
** Identification
#+begin_src matlab
Ts = 1e-4; % Sampling Time [s]
win = hann(ceil(10/Ts));
#+end_src
#+begin_src matlab
[tf_i_est, f] = tfestimate(u, interferometer, win, [], [], 1/Ts);
[co_i_est, ~] = mscohere(u, interferometer, win, [], [], 1/Ts);
[tf_e_est, ~] = tfestimate(u, encoder, win, [], [], 1/Ts);
[co_e_est, ~] = mscohere(u, encoder, win, [], [], 1/Ts);
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
plot(f, co_i_est, '-')
plot(f, co_e_est, '-')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
ylabel('Coherence'); xlabel('Frequency [Hz]');
hold off;
xlim([0.5, 5e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/identification_dynamics_coherence.pdf', 'width', 'normal', 'height', 'normal');
#+end_src
#+name: fig:identification_dynamics_coherence
#+caption:
#+RESULTS:
[[file:figs/identification_dynamics_coherence.png]]
#+begin_src matlab :exports none
figure;
tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None');
ax1 = nexttile;
hold on;
plot(f, abs(tf_i_est), '-', 'DisplayName', 'Int')
plot(f, abs(tf_e_est), '-', 'DisplayName', 'Enc')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
ylabel('Amplitude'); set(gca, 'XTickLabel',[]);
hold off;
ylim([1e-7, 3e-4]);
ax2 = nexttile;
hold on;
plot(f, 180/pi*angle(tf_i_est), '-')
plot(f, 180/pi*angle(tf_e_est), '-')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
ylabel('Phase'); xlabel('Frequency [Hz]');
hold off;
yticks(-360:90:360);
axis padded 'auto x'
linkaxes([ax1,ax2], 'x');
xlim([0.5, 5e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/identification_dynamics_bode.pdf', 'width', 'wide', 'height', 'tall');
#+end_src
#+name: fig:identification_dynamics_bode
#+caption:
#+RESULTS:
[[file:figs/identification_dynamics_bode.png]]

7
js/bootstrap.min.js vendored Normal file

File diff suppressed because one or more lines are too long

4
js/jquery.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
js/jquery.stickytableheaders.min.js vendored Normal file
View File

@ -0,0 +1 @@
!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);

85
js/readtheorg.js Normal file
View File

@ -0,0 +1,85 @@
$(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
};
}($));