Initial commit

This commit is contained in:
2025-11-26 10:30:18 +01:00
commit c72817bdcc
96 changed files with 6076 additions and 0 deletions

259
.gitignore vendored Normal file
View File

@@ -0,0 +1,259 @@
ltximg/
*.autosave
slprj/
matlab/slprj/
*.slxc
# ============================================================
# ============================================================
# LATEX
# ============================================================
# ============================================================
## Core latex/pdflatex auxiliary files:
*.aux
*.lof
*.log
*.lot
*.fls
*.out
*.toc
*.fmt
*.fot
*.cb
*.cb2
.*.lb
## Intermediate documents:
*.dvi
*.xdv
*-converted-to.*
# these rules might exclude image files for figures etc.
# *.ps
# *.eps
# *.pdf
## Generated if empty string is given at "Please type another file name for output:"
.pdf
## Bibliography auxiliary files (bibtex/biblatex/biber):
*.bbl
*.bcf
*.blg
*-blx.aux
*-blx.bib
*.run.xml
## Build tool auxiliary files:
*.fdb_latexmk
*.synctex
*.synctex(busy)
*.synctex.gz
*.synctex.gz(busy)
*.pdfsync
## Build tool directories for auxiliary files
# latexrun
latex.out/
## Auxiliary and intermediate files from other packages:
# algorithms
*.alg
*.loa
# achemso
acs-*.bib
# amsthm
*.thm
# beamer
*.nav
*.pre
*.snm
*.vrb
# changes
*.soc
# cprotect
*.cpt
# elsarticle (documentclass of Elsevier journals)
*.spl
# endnotes
*.ent
# fixme
*.lox
# feynmf/feynmp
*.mf
*.mp
*.t[1-9]
*.t[1-9][0-9]
*.tfm
#(r)(e)ledmac/(r)(e)ledpar
*.end
*.?end
*.[1-9]
*.[1-9][0-9]
*.[1-9][0-9][0-9]
*.[1-9]R
*.[1-9][0-9]R
*.[1-9][0-9][0-9]R
*.eledsec[1-9]
*.eledsec[1-9]R
*.eledsec[1-9][0-9]
*.eledsec[1-9][0-9]R
*.eledsec[1-9][0-9][0-9]
*.eledsec[1-9][0-9][0-9]R
# glossaries
*.acn
*.acr
*.glg
*.glo
*.gls
*.glsdefs
# gnuplottex
*-gnuplottex-*
# gregoriotex
*.gaux
*.gtex
# htlatex
*.4ct
*.4tc
*.idv
*.lg
*.trc
*.xref
# hyperref
*.brf
# knitr
*-concordance.tex
# TODO Comment the next line if you want to keep your tikz graphics files
*.tikz
*-tikzDictionary
# listings
*.lol
# makeidx
*.idx
*.ilg
*.ind
*.ist
# minitoc
*.maf
*.mlf
*.mlt
*.mtc[0-9]*
*.slf[0-9]*
*.slt[0-9]*
*.stc[0-9]*
# minted
_minted*
*.pyg
# morewrites
*.mw
# nomencl
*.nlg
*.nlo
*.nls
# pax
*.pax
# pdfpcnotes
*.pdfpc
# sagetex
*.sagetex.sage
*.sagetex.py
*.sagetex.scmd
# scrwfile
*.wrt
# sympy
*.sout
*.sympy
sympy-plots-for-*.tex/
# pdfcomment
*.upa
*.upb
# pythontex
*.pytxcode
pythontex-files-*/
# thmtools
*.loe
# TikZ & PGF
*.dpth
*.md5
*.auxlock
# todonotes
*.tdo
# easy-todo
*.lod
# xmpincl
*.xmpi
# xindy
*.xdy
# xypic precompiled matrices
*.xyc
# endfloat
*.ttt
*.fff
# Latexian
TSWLatexianTemp*
## Editors:
# WinEdt
*.bak
*.sav
# Texpad
.texpadtmp
# LyX
*.lyx~
# Kile
*.backup
# KBibTeX
*~[0-9]*
# auto folder when using emacs and auctex
./auto/*
*.el
# expex forward references with \gathertags
*-tags.tex
# standalone packages
*.sta

1
inkscape/figs Symbolic link
View File

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

216
inkscape/tikz.org Normal file
View File

@@ -0,0 +1,216 @@
#+TITLE: Decoupling Properties of the Cubic Architecture
:DRAWER:
#+LANGUAGE: en
#+EMAIL: dehaeze.thomas@gmail.com
#+AUTHOR: Dehaeze Thomas
#+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 file raw replace
#+PROPERTY: header-args:latex+ :buffer no
#+PROPERTY: header-args:latex+ :tangle no
#+PROPERTY: header-args:latex+ :eval no-export
#+PROPERTY: header-args:latex+ :exports results
#+PROPERTY: header-args:latex+ :mkdirp yes
#+PROPERTY: header-args:latex+ :output-dir figs
#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png")
:END:
#+latex: \clearpage
#+begin_src latex :file detail_kinematics_cubic_schematic_full.pdf :results file
\begin{tikzpicture}
\begin{scope}[rotate={45}, shift={(0, 0, -4)}]
% We first define the coordinate of the points of the Cube
\coordinate[] (bot) at (0,0,4);
\coordinate[] (top) at (4,4,0);
\coordinate[] (A1) at (0,0,0);
\coordinate[] (A2) at (4,0,4);
\coordinate[] (A3) at (0,4,4);
\coordinate[] (B1) at (4,0,0);
\coordinate[] (B2) at (4,4,4);
\coordinate[] (B3) at (0,4,0);
% Center of the Cube
\coordinate[] (cubecenter) at ($0.5*(bot) + 0.5*(top)$);
% We draw parts of the cube that corresponds to the Stewart platform
\draw[] (A1)node[]{$\bullet$} -- (B1)node[]{$\bullet$} -- (A2)node[]{$\bullet$} -- (B2)node[]{$\bullet$} -- (A3)node[]{$\bullet$} -- (B3)node[]{$\bullet$} -- (A1);
% ai and bi are computed
\def\lfrom{0.0}
\def\lto{1.0}
\coordinate(a1) at ($(A1) - \lfrom*(A1) + \lfrom*(B1)$);
\coordinate(b1) at ($(A1) - \lto*(A1) + \lto*(B1)$);
\coordinate(a2) at ($(A2) - \lfrom*(A2) + \lfrom*(B1)$);
\coordinate(b2) at ($(A2) - \lto*(A2) + \lto*(B1)$);
\coordinate(a3) at ($(A2) - \lfrom*(A2) + \lfrom*(B2)$);
\coordinate(b3) at ($(A2) - \lto*(A2) + \lto*(B2)$);
\coordinate(a4) at ($(A3) - \lfrom*(A3) + \lfrom*(B2)$);
\coordinate(b4) at ($(A3) - \lto*(A3) + \lto*(B2)$);
\coordinate(a5) at ($(A3) - \lfrom*(A3) + \lfrom*(B3)$);
\coordinate(b5) at ($(A3) - \lto*(A3) + \lto*(B3)$);
\coordinate(a6) at ($(A1) - \lfrom*(A1) + \lfrom*(B3)$);
\coordinate(b6) at ($(A1) - \lto*(A1) + \lto*(B3)$);
% We draw the fixed and mobiles platforms
\path[fill=colorblue, opacity=0.2] (a1) -- (a2) -- (a3) -- (a4) -- (a5) -- (a6) -- cycle;
\path[fill=colorblue, opacity=0.2] (b1) -- (b2) -- (b3) -- (b4) -- (b5) -- (b6) -- cycle;
\draw[color=colorblue, dashed] (a1) -- (a2) -- (a3) -- (a4) -- (a5) -- (a6) -- cycle;
\draw[color=colorblue, dashed] (b1) -- (b2) -- (b3) -- (b4) -- (b5) -- (b6) -- cycle;
% The legs of the hexapod are drawn
\draw[color=colorblue] (a1)node{$\bullet$} -- (b1)node{$\bullet$};
\draw[color=colorblue] (a2)node{$\bullet$} -- (b2)node{$\bullet$};
\draw[color=colorblue] (a3)node{$\bullet$} -- (b3)node{$\bullet$};
\draw[color=colorblue] (a4)node{$\bullet$} -- (b4)node{$\bullet$};
\draw[color=colorblue] (a5)node{$\bullet$} -- (b5)node{$\bullet$};
\draw[color=colorblue] (a6)node{$\bullet$} -- (b6)node{$\bullet$};
% Unit vector
\draw[color=colorred, ->] ($0.9*(a1)+0.1*(b1)$)node{$\bullet$} -- ($0.65*(a1)+0.35*(b1)$)node[right]{$\hat{\bm{s}}_3$};
\draw[color=colorred, ->] ($0.9*(a2)+0.1*(b2)$)node{$\bullet$} -- ($0.65*(a2)+0.35*(b2)$)node[left]{$\hat{\bm{s}}_4$};
\draw[color=colorred, ->] ($0.9*(a3)+0.1*(b3)$)node{$\bullet$} -- ($0.65*(a3)+0.35*(b3)$)node[below]{$\hat{\bm{s}}_5$};
\draw[color=colorred, ->] ($0.9*(a4)+0.1*(b4)$)node{$\bullet$} -- ($0.65*(a4)+0.35*(b4)$)node[below]{$\hat{\bm{s}}_6$};
\draw[color=colorred, ->] ($0.9*(a5)+0.1*(b5)$)node{$\bullet$} -- ($0.65*(a5)+0.35*(b5)$)node[left]{$\hat{\bm{s}}_1$};
\draw[color=colorred, ->] ($0.9*(a6)+0.1*(b6)$)node{$\bullet$} -- ($0.65*(a6)+0.35*(b6)$)node[right]{$\hat{\bm{s}}_2$};
% Labels
\node[above=0.1 of B1] {$\tilde{\bm{b}}_3 = \tilde{\bm{b}}_4$};
\node[above=0.1 of B2] {$\tilde{\bm{b}}_5 = \tilde{\bm{b}}_6$};
\node[above=0.1 of B3] {$\tilde{\bm{b}}_1 = \tilde{\bm{b}}_2$};
\end{scope}
% Height of the Hexapod
\coordinate[] (sizepos) at ($(a2)+(0.2, 0)$);
\coordinate[] (origin) at (0,0,0);
\draw[->, color=colorgreen] (cubecenter.center) node[above right]{$\{B\}$} -- ++(0,0,1);
\draw[->, color=colorgreen] (cubecenter.center) -- ++(1,0,0);
\draw[->, color=colorgreen] (cubecenter.center) -- ++(0,1,0);
\node[] at (cubecenter.center){$\bullet$};
\node[above left] at (cubecenter.center){$\{C\}$};
% Useful part of the cube
\draw[<->, dashed] ($(A2)+(0.5,0)$) -- node[midway, right]{$H_{C}$} ($(B1)+(0.5,0)$);
\end{tikzpicture}
#+end_src
#+RESULTS:
[[file:figs/detail_kinematics_cubic_schematic_full.png]]
#+begin_src latex :file detail_kinematics_cubic_schematic.pdf :results file
\begin{tikzpicture}
\begin{scope}[rotate={45}, shift={(0, 0, -4)}]
% We first define the coordinate of the points of the Cube
\coordinate[] (bot) at (0,0,4);
\coordinate[] (top) at (4,4,0);
\coordinate[] (A1) at (0,0,0);
\coordinate[] (A2) at (4,0,4);
\coordinate[] (A3) at (0,4,4);
\coordinate[] (B1) at (4,0,0);
\coordinate[] (B2) at (4,4,4);
\coordinate[] (B3) at (0,4,0);
% Center of the Cube
\coordinate[] (cubecenter) at ($0.5*(bot) + 0.5*(top)$);
% We draw parts of the cube that corresponds to the Stewart platform
\draw[] (A1)node[]{$\bullet$} -- (B1)node[]{$\bullet$} -- (A2)node[]{$\bullet$} -- (B2)node[]{$\bullet$} -- (A3)node[]{$\bullet$} -- (B3)node[]{$\bullet$} -- (A1);
% ai and bi are computed
\def\lfrom{0.2}
\def\lto{0.8}
\coordinate(a1) at ($(A1) - \lfrom*(A1) + \lfrom*(B1)$);
\coordinate(b1) at ($(A1) - \lto*(A1) + \lto*(B1)$);
\coordinate(a2) at ($(A2) - \lfrom*(A2) + \lfrom*(B1)$);
\coordinate(b2) at ($(A2) - \lto*(A2) + \lto*(B1)$);
\coordinate(a3) at ($(A2) - \lfrom*(A2) + \lfrom*(B2)$);
\coordinate(b3) at ($(A2) - \lto*(A2) + \lto*(B2)$);
\coordinate(a4) at ($(A3) - \lfrom*(A3) + \lfrom*(B2)$);
\coordinate(b4) at ($(A3) - \lto*(A3) + \lto*(B2)$);
\coordinate(a5) at ($(A3) - \lfrom*(A3) + \lfrom*(B3)$);
\coordinate(b5) at ($(A3) - \lto*(A3) + \lto*(B3)$);
\coordinate(a6) at ($(A1) - \lfrom*(A1) + \lfrom*(B3)$);
\coordinate(b6) at ($(A1) - \lto*(A1) + \lto*(B3)$);
% We draw the fixed and mobiles platforms
\path[fill=colorblue, opacity=0.2] (a1) -- (a2) -- (a3) -- (a4) -- (a5) -- (a6) -- cycle;
\path[fill=colorblue, opacity=0.2] (b1) -- (b2) -- (b3) -- (b4) -- (b5) -- (b6) -- cycle;
\draw[color=colorblue, dashed] (a1) -- (a2) -- (a3) -- (a4) -- (a5) -- (a6) -- cycle;
\draw[color=colorblue, dashed] (b1) -- (b2) -- (b3) -- (b4) -- (b5) -- (b6) -- cycle;
% The legs of the hexapod are drawn
\draw[color=colorblue] (a1)node{$\bullet$} -- (b1)node{$\bullet$}node[below right]{$\bm{b}_3$};
\draw[color=colorblue] (a2)node{$\bullet$} -- (b2)node{$\bullet$}node[right]{$\bm{b}_4$};
\draw[color=colorblue] (a3)node{$\bullet$} -- (b3)node{$\bullet$}node[above right]{$\bm{b}_5$};
\draw[color=colorblue] (a4)node{$\bullet$} -- (b4)node{$\bullet$}node[above left]{$\bm{b}_6$};
\draw[color=colorblue] (a5)node{$\bullet$} -- (b5)node{$\bullet$}node[left]{$\bm{b}_1$};
\draw[color=colorblue] (a6)node{$\bullet$} -- (b6)node{$\bullet$}node[below left]{$\bm{b}_2$};
\end{scope}
% Height of the Hexapod
\coordinate[] (sizepos) at ($(a2)+(0.2, 0)$);
\coordinate[] (origin) at (0,0,0);
\draw[->, color=colorgreen] ($(cubecenter.center)+(0,2.0,0)$) node[above right]{$\{B\}$} -- ++(0,0,1);
\draw[->, color=colorgreen] ($(cubecenter.center)+(0,2.0,0)$) -- ++(1,0,0);
\draw[->, color=colorgreen] ($(cubecenter.center)+(0,2.0,0)$) -- ++(0,1,0);
\node[] at (cubecenter.center){$\bullet$};
\node[right] at (cubecenter.center){$\{C\}$};
\draw[<->, dashed] (cubecenter.center) -- node[midway, right]{$H$} ($(cubecenter.center)+(0,2.0,0)$);
\end{tikzpicture}
#+end_src
#+RESULTS:
[[file:figs/detail_kinematics_cubic_schematic.png]]
#+begin_src latex :file detail_kinematics_centralized_control.pdf
\begin{tikzpicture}
\node[block] (Jt) at (0, 0) {$\bm{J}^{-\intercal}$};
\node[block, right= of Jt] (G) {$\bm{G}$};
\node[block, right= of G] (J) {$\bm{J}^{-1}$};
\node[block, left= of Jt] (Kx) {$\bm{K}_{\mathcal{X}}$};
\draw[->] (Kx.east) -- node[midway, above]{$\bm{\mathcal{F}}$} (Jt.west);
\draw[->] (Jt.east) -- (G.west) node[above left]{$\bm{\tau}$};
\draw[->] (G.east) -- (J.west) node[above left]{$\bm{\mathcal{L}}$};
\draw[->] (J.east) -- ++(1.0, 0);
\draw[->] ($(J.east) + (0.5, 0)$)node[]{$\bullet$} node[above]{$\bm{\mathcal{X}}$} -- ++(0, -1) -| ($(Kx.west) + (-0.5, 0)$) -- (Kx.west);
\begin{scope}[on background layer]
\node[fit={(Jt.south west) (J.north east)}, fill=black!20!white, draw, dashed, inner sep=4pt] (Px) {};
\node[anchor={south}] at (Px.north){\small{Cartesian Plant}};
\end{scope}
\end{tikzpicture}
#+end_src
#+RESULTS:
[[file:figs/detail_kinematics_centralized_control.png]]
#+begin_src latex :file detail_kinematics_decentralized_control.pdf
\begin{tikzpicture}
\node[block] (G) at (0,0) {$\bm{G}$};
\node[block, left= of G] (Kl) {$\bm{K}_{\mathcal{L}}$};
\draw[->] (Kl.east) -- node[midway, above]{$\bm{\tau}$} (G.west);
\draw[->] (G.east) -- ++(1.0, 0);
\draw[->] ($(G.east) + (0.5, 0)$)node[]{$\bullet$} node[above]{$\bm{\mathcal{L}}$} -- ++(0, -1) -| ($(Kl.west) + (-0.5, 0)$) -- (Kl.west);
\begin{scope}[on background layer]
\node[fit={(G.south west) (G.north east)}, fill=black!20!white, draw, dashed, inner sep=4pt] (Pl) {};
\node[anchor={south}] at (Pl.north){\small{Strut Plant}};
\end{scope}
\end{tikzpicture}
#+end_src
#+RESULTS:
[[file:figs/detail_kinematics_decentralized_control.png]]

View File

@@ -0,0 +1,749 @@
%% Clear Workspace and Close figures
clear; close all; clc;
%% Intialize Laplace variable
s = zpk('s');
%% Path for functions, data and scripts
addpath('./src/'); % Path for functions
addpath('./subsystems/'); % Path for Subsystems Simulink files
% Simulink Model name
mdl = 'nano_hexapod_model';
%% Colors for the figures
colors = colororder;
%% Example of a typical "cubic" architecture
MO_B = -50e-3; % Position {B} with respect to {M} [m]
H = 100e-3; % Height of the Stewart platform [m]
Hc = 100e-3; % Size of the useful part of the cube [m]
FOc = H + MO_B; % Center of the cube with respect to {F}
% here positionned at the frame {B}
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 5e-3, 'MHb', 5e-3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'k', 1);
stewart = initializeJointDynamics(stewart);
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 150e-3, 'Mpr', 150e-3);
stewart = initializeCylindricalStruts(stewart);
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
displayArchitecture(stewart, 'labels', false, 'frames', false);
plotCube(stewart, 'Hc', Hc, 'FOc', FOc, 'color', [0,0,0,0.2], 'link_to_struts', false);
view([40, 5]);
%% Example of a typical "cubic" architecture
MO_B = -20e-3; % Position {B} with respect to {M} [m]
H = 40e-3; % Height of the Stewart platform [m]
Hc = 100e-3; % Size of the useful part of the cube [m]
FOc = H + MO_B; % Center of the cube with respect to {F}
% here positionned at the frame {B}
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 5e-3, 'MHb', 5e-3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'k', 1);
stewart = computeJacobian(stewart);
stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 150e-3, 'Mpr', 150e-3);
displayArchitecture(stewart, 'labels', false, 'frames', false);
plotCube(stewart, 'Hc', Hc, 'FOc', FOc, 'color', [0,0,0,0.2], 'link_to_struts', false);
view([40, 5]);
%% Analytical formula for Stiffness matrix of the Cubic Stewart platform
% Define symbolic variables
syms k Hc alpha H
assume(k > 0); % k is positive real
assume(Hc, 'real'); % Hc is real
assume(H, 'real'); % H is real
assume(alpha, 'real'); % alpha is real
% Define si matrix (edges of the cubes)
si = 1/sqrt(3)*[
[ sqrt(2), 0, 1]; ...
[-sqrt(2)/2, -sqrt(3/2), 1]; ...
[-sqrt(2)/2, sqrt(3/2), 1]; ...
[ sqrt(2), 0, 1]; ...
[-sqrt(2)/2, -sqrt(3/2), 1]; ...
[-sqrt(2)/2, sqrt(3/2), 1] ...
];
% Define ci matrix (vertices of the cubes)
ci = Hc * [
[1/sqrt(2), -sqrt(3)/sqrt(2), 0.5]; ...
[1/sqrt(2), -sqrt(3)/sqrt(2), 0.5]; ...
[1/sqrt(2), sqrt(3)/sqrt(2), 0.5]; ...
[1/sqrt(2), sqrt(3)/sqrt(2), 0.5]; ...
[-sqrt(2), 0, 0.5]; ...
[-sqrt(2), 0, 0.5] ...
];
% Apply vertical shift to ci
ci = ci + H * [0, 0, 1];
% Calculate bi vectors (Stewart platform top joints)
bi = ci + alpha * si;
% Initialize stiffness matrix
K = sym(zeros(6,6));
% Calculate elements of the stiffness matrix
for i = 1:6
% Extract vectors for each leg
s_i = si(i,:)';
b_i = bi(i,:)';
% Calculate cross product vector
cross_bs = cross(b_i, s_i);
% Build matrix blocks
K(1:3, 4:6) = K(1:3, 4:6) + s_i * cross_bs';
K(4:6, 1:3) = K(4:6, 1:3) + cross_bs * s_i';
K(1:3, 1:3) = K(1:3, 1:3) + s_i * s_i';
K(4:6, 4:6) = K(4:6, 4:6) + cross_bs * cross_bs';
end
% Scale by stiffness coefficient
K = k * K;
% Simplify the expressions
K = simplify(K);
% Display the analytical stiffness matrix
disp('Analytical Stiffness Matrix:');
pretty(K);
%% Cubic configuration
H = 100e-3; % Height of the Stewart platform [m]
Hc = 100e-3; % Size of the useful part of the cube [m]
FOc = 50e-3; % Center of the cube at the Stewart platform center
MO_B = -50e-3; % Position {B} with respect to {M} [m]
MHb = 0;
stewart_cubic = initializeStewartPlatform();
stewart_cubic = initializeFramesPositions(stewart_cubic, 'H', H, 'MO_B', MO_B);
stewart_cubic = generateCubicConfiguration(stewart_cubic, 'Hc', Hc, 'FOc', FOc, 'FHa', 5e-3, 'MHb', MHb);
stewart_cubic = computeJointsPose(stewart_cubic);
stewart_cubic = initializeStrutDynamics(stewart_cubic, 'k', 1);
stewart_cubic = computeJacobian(stewart_cubic);
stewart_cubic = initializeCylindricalPlatforms(stewart_cubic, 'Fpr', 150e-3, 'Mpr', 150e-3);
% Let's now define the actuator stroke.
L_max = 50e-6; % [m]
%% Mobility of a Stewart platform with Cubic architecture - Translations
thetas = linspace(0, pi, 100);
phis = linspace(0, 2*pi, 200);
rs = zeros(length(thetas), length(phis));
for i = 1:length(thetas)
for j = 1:length(phis)
Tx = sin(thetas(i))*cos(phis(j));
Ty = sin(thetas(i))*sin(phis(j));
Tz = cos(thetas(i));
dL = stewart_cubic.kinematics.J*[Tx; Ty; Tz; 0; 0; 0;]; % dL required for 1m displacement in theta/phi direction
rs(i, j) = L_max/max(abs(dL));
% rs(i, j) = max(abs([dL(dL<0)*L_min; dL(dL>=0)*L_max]));
end
end
[phi_grid, theta_grid] = meshgrid(phis, thetas);
X = 1e6 * rs .* sin(theta_grid) .* cos(phi_grid);
Y = 1e6 * rs .* sin(theta_grid) .* sin(phi_grid);
Z = 1e6 * rs .* cos(theta_grid);
figure;
hold on;
surf(X, Y, Z, 'FaceColor', 'white', 'EdgeColor', colors(1,:));
quiver3(0, 0, 0, 150, 0, 0, 'k', 'LineWidth', 2, 'MaxHeadSize', 0.7);
quiver3(0, 0, 0, 0, 150, 0, 'k', 'LineWidth', 2, 'MaxHeadSize', 0.7);
quiver3(0, 0, 0, 0, 0, 150, 'k', 'LineWidth', 2, 'MaxHeadSize', 0.7);
text(150, 0, 0, '$D_x$', 'FontSize', 10, 'HorizontalAlignment', 'center', 'VerticalAlignment', 'top' );
text(0, 150, 0, '$D_y$', 'FontSize', 10, 'HorizontalAlignment', 'right', 'VerticalAlignment', 'bottom');
text(0, 0, 150, '$D_z$', 'FontSize', 10, 'HorizontalAlignment', 'left', 'VerticalAlignment', 'top' );
hold off;
axis equal;
grid off;
axis off;
view(105, 15);
%% Mobility of a Stewart platform with Cubic architecture - Rotations
thetas = linspace(0, pi, 100);
phis = linspace(0, 2*pi, 200);
rs_cubic = zeros(length(thetas), length(phis));
for i = 1:length(thetas)
for j = 1:length(phis)
Rx = sin(thetas(i))*cos(phis(j));
Ry = sin(thetas(i))*sin(phis(j));
Rz = cos(thetas(i));
dL = stewart_cubic.kinematics.J*[0; 0; 0; Rx; Ry; Rz;];
rs_cubic(i, j) = L_max/max(abs(dL));
end
end
[phi_grid, theta_grid] = meshgrid(phis, thetas);
X_cubic = 1e6 * rs_cubic .* sin(theta_grid) .* cos(phi_grid);
Y_cubic = 1e6 * rs_cubic .* sin(theta_grid) .* sin(phi_grid);
Z_cubic = 1e6 * rs_cubic .* cos(theta_grid);
figure;
hold on;
surf(X_cubic, Y_cubic, Z_cubic, 'FaceColor', 'white', 'LineWidth', 0.2, 'EdgeColor', colors(1,:));
quiver3(0, 0, 0, 1500, 0, 0, 'k', 'LineWidth', 2, 'MaxHeadSize', 0.7);
quiver3(0, 0, 0, 0, 1500, 0, 'k', 'LineWidth', 2, 'MaxHeadSize', 0.7);
quiver3(0, 0, 0, 0, 0, 1500, 'k', 'LineWidth', 2, 'MaxHeadSize', 0.7);
text(1500, 0, 0, '$R_x$', 'FontSize', 10, 'HorizontalAlignment', 'center', 'VerticalAlignment', 'top' );
text(0, 1500, 0, '$R_y$', 'FontSize', 10, 'HorizontalAlignment', 'right', 'VerticalAlignment', 'bottom');
text(0, 0, 1500, '$R_z$', 'FontSize', 10, 'HorizontalAlignment', 'left', 'VerticalAlignment', 'top' );
hold off;
axis equal;
grid off;
axis off;
view(105, 15);
%% Input/Output definition of the Simscape model
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
io(io_i) = linio([mdl, '/plant'], 1, 'openoutput'); io_i = io_i + 1; % External metrology [m,rad]
% Prepare simulation
controller = initializeController('type', 'open-loop');
sample = initializeSample('type', 'cylindrical', 'm', 10, 'H', 100e-3, 'R', 100e-3);
%% Cubic Stewart platform with payload above the top platform - B frame at the CoM
H = 200e-3; % height of the Stewart platform [m]
MO_B = 50e-3; % Position {B} with respect to {M} [m]
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', H, 'FOc', H/2, 'FHa', 25e-3, 'MHb', 25e-3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'k', 1e6, 'c', 1e1);
stewart = initializeJointDynamics(stewart, 'type_F', '2dof', 'type_M', '3dof');
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart, ...
'Mpm', 1e-6, ... % Massless platform
'Fpm', 1e-6, ... % Massless platform
'Mph', 20e-3, ... % Thin platform
'Fph', 20e-3, ... % Thin platform
'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)), ...
'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)));
stewart = initializeCylindricalStruts(stewart, ...
'Fsm', 1e-6, ... % Massless strut
'Msm', 1e-6, ... % Massless strut
'Fsh', stewart.geometry.l(1)/2, ...
'Msh', stewart.geometry.l(1)/2 ...
);
% Run the linearization
G_CoM = linearize(mdl, io)*inv(stewart.kinematics.J).';
G_CoM.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
G_CoM.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
%% Same geometry but B Frame at cube's center (CoK)
MO_B = -100e-3; % Position {B} with respect to {M} [m]
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', H, 'FOc', H/2, 'FHa', 25e-3, 'MHb', 25e-3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'k', 1e6, 'c', 1e1);
stewart = initializeJointDynamics(stewart, 'type_F', '2dof', 'type_M', '3dof');
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart, ...
'Mpm', 1e-6, ... % Massless platform
'Fpm', 1e-6, ... % Massless platform
'Mph', 20e-3, ... % Thin platform
'Fph', 20e-3, ... % Thin platform
'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)), ...
'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)));
stewart = initializeCylindricalStruts(stewart, ...
'Fsm', 1e-6, ... % Massless strut
'Msm', 1e-6, ... % Massless strut
'Fsh', stewart.geometry.l(1)/2, ...
'Msh', stewart.geometry.l(1)/2 ...
);
% Run the linearization
G_CoK = linearize(mdl, io)*inv(stewart.kinematics.J.');
G_CoK.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
G_CoK.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
%% Coupling in the cartesian frame for a Cubic Stewart platform - Frame {B} is at the center of mass of the payload
freqs = logspace(0, 4, 1000);
figure;
tiledlayout(1, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile();
hold on;
% for i = 1:5
% for j = i+1:6
% plot(freqs, abs(squeeze(freqresp(G_CoM(i, j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
% 'HandleVisibility', 'off');
% end
% end
plot(freqs, abs(squeeze(freqresp(G_CoM(1, 1), freqs, 'Hz'))), 'color', colors(1,:), ...
'DisplayName', '$D_x/F_x$');
plot(freqs, abs(squeeze(freqresp(G_CoM(2, 2), freqs, 'Hz'))), 'color', colors(2,:), ...
'DisplayName', '$D_y/F_y$');
plot(freqs, abs(squeeze(freqresp(G_CoM(3, 3), freqs, 'Hz'))), 'color', colors(3,:), ...
'DisplayName', '$D_z/F_z$');
plot(freqs, abs(squeeze(freqresp(G_CoM(4, 4), freqs, 'Hz'))), 'color', colors(4,:), ...
'DisplayName', '$R_x/M_x$');
plot(freqs, abs(squeeze(freqresp(G_CoM(5, 5), freqs, 'Hz'))), 'color', colors(5,:), ...
'DisplayName', '$R_y/M_y$');
plot(freqs, abs(squeeze(freqresp(G_CoM(6, 6), freqs, 'Hz'))), 'color', colors(6,:), ...
'DisplayName', '$R_z/M_z$');
plot(freqs, abs(squeeze(freqresp(G_CoM(4, 2), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'DisplayName', '$R_x/F_y$');
plot(freqs, abs(squeeze(freqresp(G_CoM(5, 1), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'DisplayName', '$R_y/F_x$');
plot(freqs, abs(squeeze(freqresp(G_CoM(1, 5), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'DisplayName', '$D_x/M_y$');
plot(freqs, abs(squeeze(freqresp(G_CoM(2, 4), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'DisplayName', '$D_y/M_x$');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Amplitude');
leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2);
leg.ItemTokenSize(1) = 15;
xlim([1, 1e4]);
ylim([1e-10, 2e-3])
%% Coupling in the cartesian frame for a Cubic Stewart platform - Frame {B} is at the center of the cube
freqs = logspace(0, 4, 1000);
figure;
tiledlayout(1, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile();
hold on;
% for i = 1:5
% for j = i+1:6
% plot(freqs, abs(squeeze(freqresp(G_CoK(i, j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
% 'HandleVisibility', 'off');
% end
% end
plot(freqs, abs(squeeze(freqresp(G_CoK(1, 1), freqs, 'Hz'))), 'color', colors(1,:), ...
'DisplayName', '$D_x/F_x$');
plot(freqs, abs(squeeze(freqresp(G_CoK(2, 2), freqs, 'Hz'))), 'color', colors(2,:), ...
'DisplayName', '$D_y/F_y$');
plot(freqs, abs(squeeze(freqresp(G_CoK(3, 3), freqs, 'Hz'))), 'color', colors(3,:), ...
'DisplayName', '$D_z/F_z$');
plot(freqs, abs(squeeze(freqresp(G_CoK(4, 4), freqs, 'Hz'))), 'color', colors(4,:), ...
'DisplayName', '$R_x/M_x$');
plot(freqs, abs(squeeze(freqresp(G_CoK(5, 5), freqs, 'Hz'))), 'color', colors(5,:), ...
'DisplayName', '$R_y/M_y$');
plot(freqs, abs(squeeze(freqresp(G_CoK(6, 6), freqs, 'Hz'))), 'color', colors(6,:), ...
'DisplayName', '$R_z/M_z$');
plot(freqs, abs(squeeze(freqresp(G_CoK(4, 2), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'DisplayName', '$R_x/F_y$');
plot(freqs, abs(squeeze(freqresp(G_CoK(5, 1), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'DisplayName', '$R_y/F_x$');
plot(freqs, abs(squeeze(freqresp(G_CoK(1, 5), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'DisplayName', '$D_x/M_y$');
plot(freqs, abs(squeeze(freqresp(G_CoK(2, 4), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'DisplayName', '$D_y/M_x$');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Amplitude');
leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2);
leg.ItemTokenSize(1) = 15;
xlim([1, 1e4]);
ylim([1e-10, 2e-3])
%% Cubic Stewart platform with payload above the top platform
H = 200e-3;
MO_B = -100e-3; % Position {B} with respect to {M} [m]
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', H, 'FOc', H/2, 'FHa', 25e-3, 'MHb', 25e-3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'k', 1e6, 'c', 1e1);
stewart = initializeJointDynamics(stewart, 'type_F', '2dof', 'type_M', '3dof');
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart, ...
'Mpm', 1e-6, ... % Massless platform
'Fpm', 1e-6, ... % Massless platform
'Mph', 20e-3, ... % Thin platform
'Fph', 20e-3, ... % Thin platform
'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)), ...
'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)));
stewart = initializeCylindricalStruts(stewart, ...
'Fsm', 1e-6, ... % Massless strut
'Msm', 1e-6, ... % Massless strut
'Fsh', stewart.geometry.l(1)/2, ...
'Msh', stewart.geometry.l(1)/2 ...
);
% Sample at the Center of the cube
sample = initializeSample('type', 'cylindrical', 'm', 10, 'H', 100e-3, 'H_offset', -H/2-50e-3);
% Run the linearization
G_CoM_CoK = linearize(mdl, io)*inv(stewart.kinematics.J.');
G_CoM_CoK.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
G_CoM_CoK.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
freqs = logspace(0, 4, 1000);
figure;
tiledlayout(1, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile();
hold on;
plot(freqs, abs(squeeze(freqresp(G_CoM_CoK(1, 1), freqs, 'Hz'))), 'color', colors(1,:), ...
'DisplayName', '$D_x/F_x$');
plot(freqs, abs(squeeze(freqresp(G_CoM_CoK(2, 2), freqs, 'Hz'))), 'color', colors(2,:), ...
'DisplayName', '$D_y/F_y$');
plot(freqs, abs(squeeze(freqresp(G_CoM_CoK(3, 3), freqs, 'Hz'))), 'color', colors(3,:), ...
'DisplayName', '$D_z/F_z$');
plot(freqs, abs(squeeze(freqresp(G_CoM_CoK(4, 4), freqs, 'Hz'))), 'color', colors(4,:), ...
'DisplayName', '$R_x/M_x$');
plot(freqs, abs(squeeze(freqresp(G_CoM_CoK(5, 5), freqs, 'Hz'))), 'color', colors(5,:), ...
'DisplayName', '$R_y/M_y$');
plot(freqs, abs(squeeze(freqresp(G_CoM_CoK(6, 6), freqs, 'Hz'))), 'color', colors(6,:), ...
'DisplayName', '$R_z/M_z$');
plot(freqs, abs(squeeze(freqresp(G_CoM_CoK(4, 2), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'DisplayName', '$R_x/F_y$');
plot(freqs, abs(squeeze(freqresp(G_CoM_CoK(5, 1), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'DisplayName', '$R_y/F_x$');
plot(freqs, abs(squeeze(freqresp(G_CoM_CoK(1, 5), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'DisplayName', '$D_x/M_y$');
plot(freqs, abs(squeeze(freqresp(G_CoM_CoK(2, 4), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2], ...
'DisplayName', '$D_y/M_x$');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Amplitude [m/V]');
leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2);
leg.ItemTokenSize(1) = 15;
xlim([1, 1e4]);
ylim([1e-10, 2e-3])
%% Input/Output definition of the Simscape model
clear io; io_i = 1;
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force Inputs [N]
io(io_i) = linio([mdl, '/plant'], 2, 'openoutput', [], 'dL'); io_i = io_i + 1; % Displacement sensors [m]
io(io_i) = linio([mdl, '/plant'], 2, 'openoutput', [], 'fn'); io_i = io_i + 1; % Force Sensor [N]
% Prepare simulation : Payload above the top platform
controller = initializeController('type', 'open-loop');
sample = initializeSample('type', 'cylindrical', 'm', 10, 'H', 100e-3, 'R', 100e-3);
%% Cubic Stewart platform
H = 200e-3; % height of the Stewart platform [m]
MO_B = 50e-3; % Position {B} with respect to {M} [m]
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', H, 'FOc', H/2, 'FHa', 25e-3, 'MHb', 25e-3);
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'k', 1e6, 'c', 1e1);
stewart = initializeJointDynamics(stewart, 'type_F', '2dof', 'type_M', '3dof');
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart, ...
'Mpm', 1e-6, ... % Massless platform
'Fpm', 1e-6, ... % Massless platform
'Mph', 20e-3, ... % Thin platform
'Fph', 20e-3, ... % Thin platform
'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)), ...
'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)));
stewart = initializeCylindricalStruts(stewart, ...
'Fsm', 1e-6, ... % Massless strut
'Msm', 1e-6, ... % Massless strut
'Fsh', stewart.geometry.l(1)/2, ...
'Msh', stewart.geometry.l(1)/2 ...
);
% Run the linearization
G_cubic = linearize(mdl, io);
G_cubic.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
G_cubic.OutputName = {'dL1', 'dL2', 'dL3', 'dL4', 'dL5', 'dL6', ...
'fn1', 'fn2', 'fn3', 'fn4', 'fn5', 'fn6'};
%% Non-Cubic Stewart platform
stewart = initializeStewartPlatform();
stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
stewart = generateCubicConfiguration(stewart, 'Hc', H, 'FOc', H/2, 'FHa', 25e-3, 'MHb', 25e-3);
stewart = generateGeneralConfiguration(stewart, 'FH', 25e-3, 'FR', 250e-3, 'MH', 25e-3, 'MR', 250e-3, ...
'FTh', [-22, 22, 120-22, 120+22, 240-22, 240+22]*(pi/180), ...
'MTh', [-60+22, 60-22, 60+22, 180-22, 180+22, -60-22]*(pi/180));
stewart = computeJointsPose(stewart);
stewart = initializeStrutDynamics(stewart, 'k', 1e6, 'c', 1e1);
stewart = initializeJointDynamics(stewart, 'type_F', '2dof', 'type_M', '3dof');
stewart = computeJacobian(stewart);
stewart = initializeStewartPose(stewart);
stewart = initializeCylindricalPlatforms(stewart, ...
'Mpm', 1e-6, ... % Massless platform
'Fpm', 1e-6, ... % Massless platform
'Mph', 20e-3, ... % Thin platform
'Fph', 20e-3, ... % Thin platform
'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)), ...
'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)));
stewart = initializeCylindricalStruts(stewart, ...
'Fsm', 1e-6, ... % Massless strut
'Msm', 1e-6, ... % Massless strut
'Fsh', stewart.geometry.l(1)/2, ...
'Msh', stewart.geometry.l(1)/2 ...
);
% Run the linearization
G_non_cubic = linearize(mdl, io);
G_non_cubic.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
G_non_cubic.OutputName = {'dL1', 'dL2', 'dL3', 'dL4', 'dL5', 'dL6', ...
'fn1', 'fn2', 'fn3', 'fn4', 'fn5', 'fn6'};
%% Decentralized plant - Actuator force to Strut displacement - Cubic Architecture
freqs = logspace(0, 4, 1000);
figure;
tiledlayout(1, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile();
hold on;
for i = 1:5
for j = i+1:6
plot(freqs, abs(squeeze(freqresp(G_non_cubic(sprintf('dL%i',i), sprintf('f%i',j)), freqs, 'Hz'))), 'color', [colors(1,:), 0.1], ...
'HandleVisibility', 'off');
end
end
plot(freqs, abs(squeeze(freqresp(G_non_cubic('dL1', 'f1'), freqs, 'Hz'))), 'color', [colors(1,:)], 'linewidth', 2.5, ...
'DisplayName', '$l_i/f_i$');
plot(freqs, abs(squeeze(freqresp(G_non_cubic('dL2', 'f1'), freqs, 'Hz'))), 'color', [colors(1,:), 0.1], ...
'DisplayName', '$l_i/f_j$');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Amplitude [m/N]');
leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;
xlim([1, 1e4]);
ylim([1e-10, 1e-4])
%% Decentralized plant - Actuator force to Strut displacement - Cubic Architecture
freqs = logspace(0, 4, 1000);
figure;
tiledlayout(1, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile();
hold on;
for i = 1:5
for j = i+1:6
plot(freqs, abs(squeeze(freqresp(G_cubic(sprintf('dL%i',i), sprintf('f%i',j)), freqs, 'Hz'))), 'color', [colors(2,:), 0.1], ...
'HandleVisibility', 'off');
end
end
plot(freqs, abs(squeeze(freqresp(G_cubic('dL1', 'f1'), freqs, 'Hz'))), 'color', [colors(2,:)], 'linewidth', 2.5, ...
'DisplayName', '$l_i/f_i$');
plot(freqs, abs(squeeze(freqresp(G_cubic('dL2', 'f1'), freqs, 'Hz'))), 'color', [colors(2,:), 0.1], ...
'DisplayName', '$l_i/f_j$');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Amplitude [m/N]');
leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;
xlim([1, 1e4]);
ylim([1e-10, 1e-4])
%% Decentralized plant - Actuator force to strut force sensor - Cubic Architecture
freqs = logspace(0, 4, 1000);
figure;
tiledlayout(1, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile();
hold on;
for i = 1:5
for j = i+1:6
plot(freqs, abs(squeeze(freqresp(G_non_cubic(sprintf('fn%i',i), sprintf('f%i',j)), freqs, 'Hz'))), 'color', [colors(1,:), 0.1], ...
'HandleVisibility', 'off');
end
end
plot(freqs, abs(squeeze(freqresp(G_non_cubic('fn1', 'f1'), freqs, 'Hz'))), 'color', [colors(1,:)], 'linewidth', 2.5, ...
'DisplayName', '$f_{m,i}/f_i$');
plot(freqs, abs(squeeze(freqresp(G_non_cubic('fn2', 'f1'), freqs, 'Hz'))), 'color', [colors(1,:), 0.1], ...
'DisplayName', '$f_{m,i}/f_j$');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Amplitude [N/N]');
leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;
xlim([1, 1e4]); ylim([1e-4, 1e2]);
%% Decentralized plant - Actuator force to strut force sensor - Cubic Architecture
freqs = logspace(0, 4, 1000);
figure;
tiledlayout(1, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
ax1 = nexttile();
hold on;
for i = 1:5
for j = i+1:6
plot(freqs, abs(squeeze(freqresp(G_cubic(sprintf('fn%i',i), sprintf('f%i',j)), freqs, 'Hz'))), 'color', [colors(2,:), 0.1], ...
'HandleVisibility', 'off');
end
end
plot(freqs, abs(squeeze(freqresp(G_cubic('fn1', 'f1'), freqs, 'Hz'))), 'color', [colors(2,:)], 'linewidth', 2.5, ...
'DisplayName', '$f_{m,i}/f_i$');
plot(freqs, abs(squeeze(freqresp(G_cubic('fn2', 'f1'), freqs, 'Hz'))), 'color', [colors(2,:), 0.1], ...
'DisplayName', '$f_{m,i}/f_j$');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Amplitude [N/N]');
leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
leg.ItemTokenSize(1) = 15;
xlim([1, 1e4]); ylim([1e-4, 1e2]);
%% Cubic configurations with center of the cube above the top platform
H = 100e-3; % height of the Stewart platform [m]
MO_B = 20e-3; % Position {B} with respect to {M} [m]
FOc = H + MO_B; % Center of the cube with respect to {F}
%% Small cube
Hc = 2*MO_B; % Size of the useful part of the cube [m]
stewart_small = initializeStewartPlatform();
stewart_small = initializeFramesPositions(stewart_small, 'H', H, 'MO_B', MO_B);
stewart_small = generateCubicConfiguration(stewart_small, 'Hc', Hc, 'FOc', FOc, 'FHa', 5e-3, 'MHb', 5e-3);
stewart_small = computeJointsPose(stewart_small);
stewart_small = initializeStrutDynamics(stewart_small, 'k', 1);
stewart_small = computeJacobian(stewart_small);
stewart_small = initializeCylindricalPlatforms(stewart_small, 'Fpr', 1.1*max(vecnorm(stewart_small.platform_F.Fa)), 'Mpr', 1.1*max(vecnorm(stewart_small.platform_M.Mb)));
%% ISO View
displayArchitecture(stewart_small, 'labels', false, 'frames', false);
plotCube(stewart_small, 'Hc', Hc, 'FOc', FOc, 'color', [0,0,0,0.2], 'link_to_struts', true);
scatter3(0, 0, FOc, 200, 'kh');
%% Side view
displayArchitecture(stewart_small, 'labels', false, 'frames', false);
plotCube(stewart_small, 'Hc', Hc, 'FOc', FOc, 'color', [0, 0, 0, 0.2], 'link_to_struts', true);
scatter3(0, 0, FOc, 200, 'kh');
view([90,0])
%% Top view
displayArchitecture(stewart_small, 'labels', false, 'frames', false);
plotCube(stewart_small, 'Hc', Hc, 'FOc', FOc, 'color', [0, 0, 0, 0.2], 'link_to_struts', true);
scatter3(0, 0, FOc, 200, 'kh');
view([0,90])
%% Example of a cubic architecture with cube's center above the top platform - Medium cube size
Hc = H + 2*MO_B; % Size of the useful part of the cube [m]
stewart_medium = initializeStewartPlatform();
stewart_medium = initializeFramesPositions(stewart_medium, 'H', H, 'MO_B', MO_B);
stewart_medium = generateCubicConfiguration(stewart_medium, 'Hc', Hc, 'FOc', FOc, 'FHa', 5e-3, 'MHb', 5e-3);
stewart_medium = computeJointsPose(stewart_medium);
stewart_medium = initializeStrutDynamics(stewart_medium, 'k', 1);
stewart_medium = computeJacobian(stewart_medium);
stewart_medium = initializeCylindricalPlatforms(stewart_medium, 'Fpr', 1.1*max(vecnorm(stewart_medium.platform_F.Fa)), 'Mpr', 1.1*max(vecnorm(stewart_medium.platform_M.Mb)));
%% ISO View
displayArchitecture(stewart_medium, 'labels', false, 'frames', false);
plotCube(stewart_medium, 'Hc', Hc, 'FOc', FOc, 'color', [0,0,0,0.2], 'link_to_struts', true);
scatter3(0, 0, FOc, 200, 'kh');
%% Side view
displayArchitecture(stewart_medium, 'labels', false, 'frames', false);
plotCube(stewart_medium, 'Hc', Hc, 'FOc', FOc, 'color', [0, 0, 0, 0.2], 'link_to_struts', true);
scatter3(0, 0, FOc, 200, 'kh');
view([90,0])
%% Top view
displayArchitecture(stewart_medium, 'labels', false, 'frames', false);
plotCube(stewart_medium, 'Hc', Hc, 'FOc', FOc, 'color', [0, 0, 0, 0.2], 'link_to_struts', true);
scatter3(0, 0, FOc, 200, 'kh');
view([0,90])
%% Example of a cubic architecture with cube's center above the top platform - Large cube size
Hc = 2*(H + MO_B); % Size of the useful part of the cube [m]
stewart_large = initializeStewartPlatform();
stewart_large = initializeFramesPositions(stewart_large, 'H', H, 'MO_B', MO_B);
stewart_large = generateCubicConfiguration(stewart_large, 'Hc', Hc, 'FOc', FOc, 'FHa', 5e-3, 'MHb', 5e-3);
stewart_large = computeJointsPose(stewart_large);
stewart_large = initializeStrutDynamics(stewart_large, 'k', 1);
stewart_large = computeJacobian(stewart_large);
stewart_large = initializeCylindricalPlatforms(stewart_large, 'Fpr', 1.1*max(vecnorm(stewart_large.platform_F.Fa)), 'Mpr', 1.1*max(vecnorm(stewart_large.platform_M.Mb)));
%% ISO View
displayArchitecture(stewart_large, 'labels', false, 'frames', false);
plotCube(stewart_large, 'Hc', Hc, 'FOc', FOc, 'color', [0,0,0,0.2], 'link_to_struts', true);
scatter3(0, 0, FOc, 200, 'kh');
%% Side view
displayArchitecture(stewart_large, 'labels', false, 'frames', false);
plotCube(stewart_large, 'Hc', Hc, 'FOc', FOc, 'color', [0, 0, 0, 0.2], 'link_to_struts', true);
scatter3(0, 0, FOc, 200, 'kh');
view([90,0])
%% Top view
displayArchitecture(stewart_large, 'labels', false, 'frames', false);
plotCube(stewart_large, 'Hc', Hc, 'FOc', FOc, 'color', [0, 0, 0, 0.2], 'link_to_struts', true);
scatter3(0, 0, FOc, 200, 'kh');
view([0,90])
%% Get the analytical formula for the location of the top and bottom joints
% Define symbolic variables
syms k Hc Hcom alpha H
assume(k > 0); % k is positive real
assume(Hcom > 0); % k is positive real
assume(Hc > 0); % Hc is real
assume(H > 0); % H is real
assume(alpha, 'real'); % alpha is real
% Define si matrix (edges of the cubes)
si = 1/sqrt(3)*[
[ sqrt(2), 0, 1]; ...
[-sqrt(2)/2, -sqrt(3/2), 1]; ...
[-sqrt(2)/2, sqrt(3/2), 1]; ...
[ sqrt(2), 0, 1]; ...
[-sqrt(2)/2, -sqrt(3/2), 1]; ...
[-sqrt(2)/2, sqrt(3/2), 1] ...
];
% Define ci matrix (vertices of the cubes)
ci = Hc * [
[1/sqrt(2), -sqrt(3)/sqrt(2), 0.5]; ...
[1/sqrt(2), -sqrt(3)/sqrt(2), 0.5]; ...
[1/sqrt(2), sqrt(3)/sqrt(2), 0.5]; ...
[1/sqrt(2), sqrt(3)/sqrt(2), 0.5]; ...
[-sqrt(2), 0, 0.5]; ...
[-sqrt(2), 0, 0.5] ...
];
% Apply vertical shift to ci
ci = ci + (H + Hcom) * [0, 0, 1];
% Calculate bi vectors (Stewart platform top joints)
bi = ci + alpha * si;
% Extract the z-component value from the first row of ci
% (all rows have the same z-component)
ci_z = ci(1, 3);
% The z-component of si is 1 for all rows
si_z = si(1, 3);
alpha_for_0 = solve(ci_z + alpha * si_z == 0, alpha);
alpha_for_H = solve(ci_z + alpha * si_z == H, alpha);
% Verify the results
% Substitute alpha values and check the resulting bi_z values
bi_z_0 = ci + alpha_for_0 * si;
disp('Radius for fixed base:');
simplify(sqrt(bi_z_0(1,1).^2 + bi_z_0(1,2).^2))
bi_z_H = ci + alpha_for_H * si;
disp('Radius for mobile platform:');
simplify(sqrt(bi_z_H(1,1).^2 + bi_z_H(1,2).^2))

1
matlab/figs Symbolic link
View File

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

1426
matlab/index.org Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -0,0 +1,35 @@
function [stewart] = computeJacobian(stewart)
% computeJacobian -
%
% Syntax: [stewart] = computeJacobian(stewart)
%
% Inputs:
% - stewart - With at least the following fields:
% - geometry.As [3x6] - The 6 unit vectors for each strut expressed in {A}
% - geometry.Ab [3x6] - The 6 position of the joints bi expressed in {A}
% - actuators.K [6x1] - Total stiffness of the actuators
%
% Outputs:
% - stewart - With the 3 added field:
% - kinematics.J [6x6] - The Jacobian Matrix
% - kinematics.K [6x6] - The Stiffness Matrix
% - kinematics.C [6x6] - The Compliance Matrix
assert(isfield(stewart.geometry, 'As'), 'stewart.geometry should have attribute As')
As = stewart.geometry.As;
assert(isfield(stewart.geometry, 'Ab'), 'stewart.geometry should have attribute Ab')
Ab = stewart.geometry.Ab;
assert(isfield(stewart.actuators, 'k'), 'stewart.actuators should have attribute k')
Ki = stewart.actuators.k*eye(6);
J = [As' , cross(Ab, As)'];
K = J'*Ki*J;
C = inv(K);
stewart.kinematics.J = J;
stewart.kinematics.K = K;
stewart.kinematics.C = C;

View File

@@ -0,0 +1,90 @@
function [stewart] = computeJointsPose(stewart, args)
% computeJointsPose -
%
% Syntax: [stewart] = computeJointsPose(stewart, args)
%
% Inputs:
% - stewart - A structure with the following fields
% - platform_F.Fa [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
% - platform_M.Mb [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
% - platform_F.FO_A [3x1] - Position of {A} with respect to {F}
% - platform_M.MO_B [3x1] - Position of {B} with respect to {M}
% - geometry.FO_M [3x1] - Position of {M} with respect to {F}
% - args - Can have the following fields:
% - AP [3x1] - The wanted position of {B} with respect to {A}
% - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
%
% Outputs:
% - stewart - A structure with the following added fields
% - geometry.Aa [3x6] - The i'th column is the position of ai with respect to {A}
% - geometry.Ab [3x6] - The i'th column is the position of bi with respect to {A}
% - geometry.Ba [3x6] - The i'th column is the position of ai with respect to {B}
% - geometry.Bb [3x6] - The i'th column is the position of bi with respect to {B}
% - geometry.l [6x1] - The i'th element is the initial length of strut i
% - geometry.As [3x6] - The i'th column is the unit vector of strut i expressed in {A}
% - geometry.Bs [3x6] - The i'th column is the unit vector of strut i expressed in {B}
% - struts_F.l [6x1] - Length of the Fixed part of the i'th strut
% - struts_M.l [6x1] - Length of the Mobile part of the i'th strut
% - platform_F.FRa [3x3x6] - The i'th 3x3 array is the rotation matrix to orientate the bottom of the i'th strut from {F}
% - platform_M.MRb [3x3x6] - The i'th 3x3 array is the rotation matrix to orientate the top of the i'th strut from {M}
arguments
stewart
args.AP (3,1) double {mustBeNumeric} = zeros(3,1)
args.ARB (3,3) double {mustBeNumeric} = eye(3)
end
assert(isfield(stewart.platform_F, 'Fa'), 'stewart.platform_F should have attribute Fa')
Fa = stewart.platform_F.Fa;
assert(isfield(stewart.platform_M, 'Mb'), 'stewart.platform_M should have attribute Mb')
Mb = stewart.platform_M.Mb;
assert(isfield(stewart.platform_F, 'FO_A'), 'stewart.platform_F should have attribute FO_A')
FO_A = stewart.platform_F.FO_A;
assert(isfield(stewart.platform_M, 'MO_B'), 'stewart.platform_M should have attribute MO_B')
MO_B = stewart.platform_M.MO_B;
assert(isfield(stewart.geometry, 'FO_M'), 'stewart.geometry should have attribute FO_M')
FO_M = stewart.geometry.FO_M;
Aa = Fa - repmat(FO_A, [1, 6]);
Bb = Mb - repmat(MO_B, [1, 6]);
Ab = Bb - repmat(-MO_B-FO_M+FO_A, [1, 6]);
Ba = Aa - repmat( MO_B+FO_M-FO_A, [1, 6]);
Ab = args.ARB *Bb - repmat(-args.AP, [1, 6]);
Ba = args.ARB'*Aa - repmat( args.AP, [1, 6]);
As = (Ab - Aa)./vecnorm(Ab - Aa); % As_i is the i'th vector of As
l = vecnorm(Ab - Aa)';
Bs = (Bb - Ba)./vecnorm(Bb - Ba);
FRa = zeros(3,3,6);
MRb = zeros(3,3,6);
for i = 1:6
FRa(:,:,i) = [cross([0;1;0], As(:,i)) , cross(As(:,i), cross([0;1;0], As(:,i))) , As(:,i)];
FRa(:,:,i) = FRa(:,:,i)./vecnorm(FRa(:,:,i));
MRb(:,:,i) = [cross([0;1;0], Bs(:,i)) , cross(Bs(:,i), cross([0;1;0], Bs(:,i))) , Bs(:,i)];
MRb(:,:,i) = MRb(:,:,i)./vecnorm(MRb(:,:,i));
end
stewart.geometry.Aa = Aa;
stewart.geometry.Ab = Ab;
stewart.geometry.Ba = Ba;
stewart.geometry.Bb = Bb;
stewart.geometry.As = As;
stewart.geometry.Bs = Bs;
stewart.geometry.l = l;
stewart.struts_F.l = l/2;
stewart.struts_M.l = l/2;
stewart.platform_F.FRa = FRa;
stewart.platform_M.MRb = MRb;

View File

@@ -0,0 +1,79 @@
function [] = describeStewartPlatform(stewart)
% describeStewartPlatform - Display some text describing the current defined Stewart Platform
%
% Syntax: [] = describeStewartPlatform(args)
%
% Inputs:
% - stewart
%
% Outputs:
arguments
stewart
end
fprintf('GEOMETRY:\n')
fprintf('- The height between the fixed based and the top platform is %.3g [mm].\n', 1e3*stewart.geometry.H)
if stewart.platform_M.MO_B(3) > 0
fprintf('- Frame {A} is located %.3g [mm] above the top platform.\n', 1e3*stewart.platform_M.MO_B(3))
else
fprintf('- Frame {A} is located %.3g [mm] below the top platform.\n', - 1e3*stewart.platform_M.MO_B(3))
end
fprintf('- The initial length of the struts are:\n')
fprintf('\t %.3g, %.3g, %.3g, %.3g, %.3g, %.3g [mm]\n', 1e3*stewart.geometry.l)
fprintf('\n')
fprintf('ACTUATORS:\n')
if stewart.actuators.type == 1
fprintf('- The actuators are classical.\n')
fprintf('- The Stiffness and Damping of each actuators is:\n')
fprintf('\t k = %.0e [N/m] \t c = %.0e [N/(m/s)]\n', stewart.actuators.k, stewart.actuators.c)
elseif stewart.actuators.type == 2
fprintf('- The actuators are mechanicaly amplified.\n')
end
fprintf('\n')
fprintf('JOINTS:\n')
switch stewart.joints_F.type
case 1
fprintf('- The joints on the fixed based are universal joints\n')
case 2
fprintf('- The joints on the fixed based are spherical joints\n')
case 3
fprintf('- The joints on the fixed based are perfect universal joints\n')
case 4
fprintf('- The joints on the fixed based are perfect spherical joints\n')
end
switch stewart.joints_M.type
case 1
fprintf('- The joints on the mobile based are universal joints\n')
case 2
fprintf('- The joints on the mobile based are spherical joints\n')
case 3
fprintf('- The joints on the mobile based are perfect universal joints\n')
case 4
fprintf('- The joints on the mobile based are perfect spherical joints\n')
end
fprintf('- The position of the joints on the fixed based with respect to {F} are (in [mm]):\n')
fprintf('\t % .3g \t % .3g \t % .3g\n', 1e3*stewart.platform_F.Fa)
fprintf('- The position of the joints on the mobile based with respect to {M} are (in [mm]):\n')
fprintf('\t % .3g \t % .3g \t % .3g\n', 1e3*stewart.platform_M.Mb)
fprintf('\n')
fprintf('KINEMATICS:\n')
if isfield(stewart.kinematics, 'K')
fprintf('- The Stiffness matrix K is (in [N/m]):\n')
fprintf('\t % .0e \t % .0e \t % .0e \t % .0e \t % .0e \t % .0e\n', stewart.kinematics.K)
end
if isfield(stewart.kinematics, 'C')
fprintf('- The Damping matrix C is (in [m/N]):\n')
fprintf('\t % .0e \t % .0e \t % .0e \t % .0e \t % .0e \t % .0e\n', stewart.kinematics.C)
end

View File

@@ -0,0 +1,252 @@
function [] = displayArchitecture(stewart, args)
% displayArchitecture - 3D plot of the Stewart platform architecture
%
% Syntax: [] = displayArchitecture(args)
%
% Inputs:
% - stewart
% - args - Structure with the following fields:
% - AP [3x1] - The wanted position of {B} with respect to {A}
% - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
% - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
% - F_color [color] - Color used for the Fixed elements
% - M_color [color] - Color used for the Mobile elements
% - L_color [color] - Color used for the Legs elements
% - frames [true/false] - Display the Frames
% - legs [true/false] - Display the Legs
% - joints [true/false] - Display the Joints
% - labels [true/false] - Display the Labels
% - platforms [true/false] - Display the Platforms
% - views ['all', 'xy', 'yz', 'xz', 'default'] -
%
% Outputs:
arguments
stewart
args.AP (3,1) double {mustBeNumeric} = zeros(3,1)
args.ARB (3,3) double {mustBeNumeric} = eye(3)
args.F_color = [0 0.4470 0.7410]
args.M_color = [0.8500 0.3250 0.0980]
args.L_color = [0 0 0]
args.frames logical {mustBeNumericOrLogical} = true
args.legs logical {mustBeNumericOrLogical} = true
args.joints logical {mustBeNumericOrLogical} = true
args.labels logical {mustBeNumericOrLogical} = true
args.platforms logical {mustBeNumericOrLogical} = true
args.views char {mustBeMember(args.views,{'all', 'xy', 'xz', 'yz', 'default'})} = 'default'
end
assert(isfield(stewart.platform_F, 'FO_A'), 'stewart.platform_F should have attribute FO_A')
FO_A = stewart.platform_F.FO_A;
assert(isfield(stewart.platform_M, 'MO_B'), 'stewart.platform_M should have attribute MO_B')
MO_B = stewart.platform_M.MO_B;
assert(isfield(stewart.geometry, 'H'), 'stewart.geometry should have attribute H')
H = stewart.geometry.H;
assert(isfield(stewart.platform_F, 'Fa'), 'stewart.platform_F should have attribute Fa')
Fa = stewart.platform_F.Fa;
assert(isfield(stewart.platform_M, 'Mb'), 'stewart.platform_M should have attribute Mb')
Mb = stewart.platform_M.Mb;
% The reference frame of the 3d plot corresponds to the frame $\{F\}$.
if ~strcmp(args.views, 'all')
figure;
else
f = figure('visible', 'off');
end
hold on;
% We first compute homogeneous matrices that will be useful to position elements on the figure where the reference frame is $\{F\}$.
FTa = [eye(3), FO_A; ...
zeros(1,3), 1];
ATb = [args.ARB, args.AP; ...
zeros(1,3), 1];
BTm = [eye(3), -MO_B; ...
zeros(1,3), 1];
FTm = FTa*ATb*BTm;
% Let's define a parameter that define the length of the unit vectors used to display the frames.
d_unit_vector = H/4;
% Let's define a parameter used to position the labels with respect to the center of the element.
d_label = H/20;
% Let's first plot the frame $\{F\}$.
Ff = [0, 0, 0];
if args.frames
quiver3(Ff(1)*ones(1,3), Ff(2)*ones(1,3), Ff(3)*ones(1,3), ...
[d_unit_vector 0 0], [0 d_unit_vector 0], [0 0 d_unit_vector], '-', 'Color', args.F_color)
if args.labels
text(Ff(1) + d_label, ...
Ff(2) + d_label, ...
Ff(3) + d_label, '$\{F\}$', 'Color', args.F_color);
end
end
% Now plot the frame $\{A\}$ fixed to the Base.
if args.frames
quiver3(FO_A(1)*ones(1,3), FO_A(2)*ones(1,3), FO_A(3)*ones(1,3), ...
[d_unit_vector 0 0], [0 d_unit_vector 0], [0 0 d_unit_vector], '-', 'Color', args.F_color)
if args.labels
text(FO_A(1) + d_label, ...
FO_A(2) + d_label, ...
FO_A(3) + d_label, '$\{A\}$', 'Color', args.F_color);
end
end
% Let's then plot the circle corresponding to the shape of the Fixed base.
if args.platforms && stewart.platform_F.type == 1
theta = [0:0.1:2*pi+0.1]; % Angles [rad]
v = null([0; 0; 1]'); % Two vectors that are perpendicular to the circle normal
center = [0; 0; 0]; % Center of the circle
radius = stewart.platform_F.R; % Radius of the circle [m]
points = center*ones(1, length(theta)) + radius*(v(:,1)*cos(theta) + v(:,2)*sin(theta));
plot3(points(1,:), ...
points(2,:), ...
points(3,:), '-', 'Color', args.F_color);
end
% Let's now plot the position and labels of the Fixed Joints
if args.joints
scatter3(Fa(1,:), ...
Fa(2,:), ...
Fa(3,:), 'MarkerEdgeColor', args.F_color);
if args.labels
for i = 1:size(Fa,2)
text(Fa(1,i) + d_label, ...
Fa(2,i), ...
Fa(3,i), sprintf('$a_{%i}$', i), 'Color', args.F_color);
end
end
end
% Plot the frame $\{M\}$.
Fm = FTm*[0; 0; 0; 1]; % Get the position of frame {M} w.r.t. {F}
if args.frames
FM_uv = FTm*[d_unit_vector*eye(3); zeros(1,3)]; % Rotated Unit vectors
quiver3(Fm(1)*ones(1,3), Fm(2)*ones(1,3), Fm(3)*ones(1,3), ...
FM_uv(1,1:3), FM_uv(2,1:3), FM_uv(3,1:3), '-', 'Color', args.M_color)
if args.labels
text(Fm(1) + d_label, ...
Fm(2) + d_label, ...
Fm(3) + d_label, '$\{M\}$', 'Color', args.M_color);
end
end
% Plot the frame $\{B\}$.
FB = FO_A + args.AP;
if args.frames
FB_uv = FTm*[d_unit_vector*eye(3); zeros(1,3)]; % Rotated Unit vectors
quiver3(FB(1)*ones(1,3), FB(2)*ones(1,3), FB(3)*ones(1,3), ...
FB_uv(1,1:3), FB_uv(2,1:3), FB_uv(3,1:3), '-', 'Color', args.M_color)
if args.labels
text(FB(1) - d_label, ...
FB(2) + d_label, ...
FB(3) + d_label, '$\{B\}$', 'Color', args.M_color);
end
end
% Let's then plot the circle corresponding to the shape of the Mobile platform.
if args.platforms && stewart.platform_M.type == 1
theta = [0:0.1:2*pi+0.1]; % Angles [rad]
v = null((FTm(1:3,1:3)*[0;0;1])'); % Two vectors that are perpendicular to the circle normal
center = Fm(1:3); % Center of the circle
radius = stewart.platform_M.R; % Radius of the circle [m]
points = center*ones(1, length(theta)) + radius*(v(:,1)*cos(theta) + v(:,2)*sin(theta));
plot3(points(1,:), ...
points(2,:), ...
points(3,:), '-', 'Color', args.M_color);
end
% Plot the position and labels of the rotation joints fixed to the mobile platform.
if args.joints
Fb = FTm*[Mb;ones(1,6)];
scatter3(Fb(1,:), ...
Fb(2,:), ...
Fb(3,:), 'MarkerEdgeColor', args.M_color);
if args.labels
for i = 1:size(Fb,2)
text(Fb(1,i) + d_label, ...
Fb(2,i), ...
Fb(3,i), sprintf('$b_{%i}$', i), 'Color', args.M_color);
end
end
end
% Plot the legs connecting the joints of the fixed base to the joints of the mobile platform.
if args.legs
for i = 1:6
plot3([Fa(1,i), Fb(1,i)], ...
[Fa(2,i), Fb(2,i)], ...
[Fa(3,i), Fb(3,i)], '-', 'Color', args.L_color);
if args.labels
text((Fa(1,i)+Fb(1,i))/2 + d_label, ...
(Fa(2,i)+Fb(2,i))/2, ...
(Fa(3,i)+Fb(3,i))/2, sprintf('$%i$', i), 'Color', args.L_color);
end
end
end
switch args.views
case 'default'
view([1 -0.6 0.4]);
case 'xy'
view([0 0 1]);
case 'xz'
view([0 -1 0]);
case 'yz'
view([1 0 0]);
end
axis equal;
axis off;
if strcmp(args.views, 'all')
hAx = findobj('type', 'axes');
figure;
s1 = subplot(2,2,1);
copyobj(get(hAx(1), 'Children'), s1);
view([0 0 1]);
axis equal;
axis off;
title('Top')
s2 = subplot(2,2,2);
copyobj(get(hAx(1), 'Children'), s2);
view([1 -0.6 0.4]);
axis equal;
axis off;
s3 = subplot(2,2,3);
copyobj(get(hAx(1), 'Children'), s3);
view([1 0 0]);
axis equal;
axis off;
title('Front')
s4 = subplot(2,2,4);
copyobj(get(hAx(1), 'Children'), s4);
view([0 -1 0]);
axis equal;
axis off;
title('Side')
close(f);
end

View File

@@ -0,0 +1,34 @@
function [P, R] = forwardKinematicsApprox(stewart, args)
% forwardKinematicsApprox - Computed the approximate pose of {B} with respect to {A} from the length of each strut and using
% the Jacobian Matrix
%
% Syntax: [P, R] = forwardKinematicsApprox(stewart, args)
%
% Inputs:
% - stewart - A structure with the following fields
% - kinematics.J [6x6] - The Jacobian Matrix
% - args - Can have the following fields:
% - dL [6x1] - Displacement of each strut [m]
%
% Outputs:
% - P [3x1] - The estimated position of {B} with respect to {A}
% - R [3x3] - The estimated rotation matrix that gives the orientation of {B} with respect to {A}
arguments
stewart
args.dL (6,1) double {mustBeNumeric} = zeros(6,1)
end
assert(isfield(stewart.kinematics, 'J'), 'stewart.kinematics should have attribute J')
J = stewart.kinematics.J;
X = J\args.dL;
P = X(1:3);
theta = norm(X(4:6));
s = X(4:6)/theta;
R = [s(1)^2*(1-cos(theta)) + cos(theta) , s(1)*s(2)*(1-cos(theta)) - s(3)*sin(theta), s(1)*s(3)*(1-cos(theta)) + s(2)*sin(theta);
s(2)*s(1)*(1-cos(theta)) + s(3)*sin(theta), s(2)^2*(1-cos(theta)) + cos(theta), s(2)*s(3)*(1-cos(theta)) - s(1)*sin(theta);
s(3)*s(1)*(1-cos(theta)) - s(2)*sin(theta), s(3)*s(2)*(1-cos(theta)) + s(1)*sin(theta), s(3)^2*(1-cos(theta)) + cos(theta)];

View File

@@ -0,0 +1,57 @@
function [stewart] = generateCubicConfiguration(stewart, args)
% generateCubicConfiguration - Generate a Cubic Configuration
%
% Syntax: [stewart] = generateCubicConfiguration(stewart, args)
%
% Inputs:
% - stewart - A structure with the following fields
% - geometry.H [1x1] - Total height of the platform [m]
% - args - Can have the following fields:
% - Hc [1x1] - Height of the "useful" part of the cube [m]
% - FOc [1x1] - Height of the center of the cube with respect to {F} [m]
% - FHa [1x1] - Height of the plane joining the points ai with respect to the frame {F} [m]
% - MHb [1x1] - Height of the plane joining the points bi with respect to the frame {M} [m]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - platform_F.Fa [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
% - platform_M.Mb [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
arguments
stewart
args.Hc (1,1) double {mustBeNumeric, mustBePositive} = 60e-3
args.FOc (1,1) double {mustBeNumeric} = 50e-3
args.FHa (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e-3
args.MHb (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e-3
end
assert(isfield(stewart.geometry, 'H'), 'stewart.geometry should have attribute H')
H = stewart.geometry.H;
% We define the useful points of the cube with respect to the Cube's center.
% ${}^{C}C$ are the 6 vertices of the cubes expressed in a frame {C} which is located at the center of the cube and aligned with {F} and {M}.
sx = [ 2; -1; -1];
sy = [ 0; 1; -1];
sz = [ 1; 1; 1];
R = [sx, sy, sz]./vecnorm([sx, sy, sz]);
L = args.Hc*sqrt(3);
Cc = R'*[[0;0;L],[L;0;L],[L;0;0],[L;L;0],[0;L;0],[0;L;L]] - [0;0;1.5*args.Hc];
CCf = [Cc(:,1), Cc(:,3), Cc(:,3), Cc(:,5), Cc(:,5), Cc(:,1)]; % CCf(:,i) corresponds to the bottom cube's vertice corresponding to the i'th leg
CCm = [Cc(:,2), Cc(:,2), Cc(:,4), Cc(:,4), Cc(:,6), Cc(:,6)]; % CCm(:,i) corresponds to the top cube's vertice corresponding to the i'th leg
% We can compute the vector of each leg ${}^{C}\hat{\bm{s}}_{i}$ (unit vector from ${}^{C}C_{f}$ to ${}^{C}C_{m}$).
CSi = (CCm - CCf)./vecnorm(CCm - CCf);
% We now which to compute the position of the joints $a_{i}$ and $b_{i}$.
Fa = CCf + [0; 0; args.FOc] + ((args.FHa-(args.FOc-args.Hc/2))./CSi(3,:)).*CSi;
Mb = CCf + [0; 0; args.FOc-H] + ((H-args.MHb-(args.FOc-args.Hc/2))./CSi(3,:)).*CSi;
stewart.platform_F.Fa = Fa;
stewart.platform_M.Mb = Mb;

View File

@@ -0,0 +1,39 @@
function [stewart] = generateGeneralConfiguration(stewart, args)
% generateGeneralConfiguration - Generate a Very General Configuration
%
% Syntax: [stewart] = generateGeneralConfiguration(stewart, args)
%
% Inputs:
% - args - Can have the following fields:
% - FH [1x1] - Height of the position of the fixed joints with respect to the frame {F} [m]
% - FR [1x1] - Radius of the position of the fixed joints in the X-Y [m]
% - FTh [6x1] - Angles of the fixed joints in the X-Y plane with respect to the X axis [rad]
% - MH [1x1] - Height of the position of the mobile joints with respect to the frame {M} [m]
% - FR [1x1] - Radius of the position of the mobile joints in the X-Y [m]
% - MTh [6x1] - Angles of the mobile joints in the X-Y plane with respect to the X axis [rad]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - platform_F.Fa [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
% - platform_M.Mb [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
arguments
stewart
args.FH (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e-3
args.FR (1,1) double {mustBeNumeric, mustBePositive} = 115e-3;
args.FTh (6,1) double {mustBeNumeric} = [-10, 10, 120-10, 120+10, 240-10, 240+10]*(pi/180);
args.MH (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e-3
args.MR (1,1) double {mustBeNumeric, mustBePositive} = 90e-3;
args.MTh (6,1) double {mustBeNumeric} = [-60+10, 60-10, 60+10, 180-10, 180+10, -60-10]*(pi/180);
end
Fa = zeros(3,6);
Mb = zeros(3,6);
for i = 1:6
Fa(:,i) = [args.FR*cos(args.FTh(i)); args.FR*sin(args.FTh(i)); args.FH];
Mb(:,i) = [args.MR*cos(args.MTh(i)); args.MR*sin(args.MTh(i)); -args.MH];
end
stewart.platform_F.Fa = Fa;
stewart.platform_M.Mb = Mb;

View File

@@ -0,0 +1,17 @@
function [controller] = initializeController(args)
arguments
args.type char {mustBeMember(args.type,{'open-loop', 'iff'})} = 'open-loop'
end
controller = struct();
switch args.type
case 'open-loop'
controller.type = 1;
controller.name = 'Open-Loop';
case 'iff'
controller.type = 2;
controller.name = 'Decentralized Integral Force Feedback';
end
end

View File

@@ -0,0 +1,59 @@
function [stewart] = initializeCylindricalPlatforms(stewart, args)
% initializeCylindricalPlatforms - Initialize the geometry of the Fixed and Mobile Platforms
%
% Syntax: [stewart] = initializeCylindricalPlatforms(args)
%
% Inputs:
% - args - Structure with the following fields:
% - Fpm [1x1] - Fixed Platform Mass [kg]
% - Fph [1x1] - Fixed Platform Height [m]
% - Fpr [1x1] - Fixed Platform Radius [m]
% - Mpm [1x1] - Mobile Platform Mass [kg]
% - Mph [1x1] - Mobile Platform Height [m]
% - Mpr [1x1] - Mobile Platform Radius [m]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - platform_F [struct] - structure with the following fields:
% - type = 1
% - M [1x1] - Fixed Platform Mass [kg]
% - I [3x3] - Fixed Platform Inertia matrix [kg*m^2]
% - H [1x1] - Fixed Platform Height [m]
% - R [1x1] - Fixed Platform Radius [m]
% - platform_M [struct] - structure with the following fields:
% - M [1x1] - Mobile Platform Mass [kg]
% - I [3x3] - Mobile Platform Inertia matrix [kg*m^2]
% - H [1x1] - Mobile Platform Height [m]
% - R [1x1] - Mobile Platform Radius [m]
arguments
stewart
args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
args.Fpr (1,1) double {mustBeNumeric, mustBePositive} = 125e-3
args.Mpm (1,1) double {mustBeNumeric, mustBePositive} = 1
args.Mph (1,1) double {mustBeNumeric, mustBePositive} = 10e-3
args.Mpr (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
end
I_F = diag([1/12*args.Fpm * (3*args.Fpr^2 + args.Fph^2), ...
1/12*args.Fpm * (3*args.Fpr^2 + args.Fph^2), ...
1/2 *args.Fpm * args.Fpr^2]);
I_M = diag([1/12*args.Mpm * (3*args.Mpr^2 + args.Mph^2), ...
1/12*args.Mpm * (3*args.Mpr^2 + args.Mph^2), ...
1/2 *args.Mpm * args.Mpr^2]);
stewart.platform_F.type = 1;
stewart.platform_F.I = I_F;
stewart.platform_F.M = args.Fpm;
stewart.platform_F.R = args.Fpr;
stewart.platform_F.H = args.Fph;
stewart.platform_M.type = 1;
stewart.platform_M.I = I_M;
stewart.platform_M.M = args.Mpm;
stewart.platform_M.R = args.Mpr;
stewart.platform_M.H = args.Mph;

View File

@@ -0,0 +1,50 @@
function [stewart] = initializeCylindricalStruts(stewart, args)
% initializeCylindricalStruts - Define the mass and moment of inertia of cylindrical struts
%
% Syntax: [stewart] = initializeCylindricalStruts(args)
%
% Inputs:
% - args - Structure with the following fields:
% - Fsm [1x1] - Mass of the Fixed part of the struts [kg]
% - Fsh [1x1] - Height of cylinder for the Fixed part of the struts [m]
% - Fsr [1x1] - Radius of cylinder for the Fixed part of the struts [m]
% - Msm [1x1] - Mass of the Mobile part of the struts [kg]
% - Msh [1x1] - Height of cylinder for the Mobile part of the struts [m]
% - Msr [1x1] - Radius of cylinder for the Mobile part of the struts [m]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - struts_F [struct] - structure with the following fields:
% - M [6x1] - Mass of the Fixed part of the struts [kg]
% - I [3x3x6] - Moment of Inertia for the Fixed part of the struts [kg*m^2]
% - H [6x1] - Height of cylinder for the Fixed part of the struts [m]
% - R [6x1] - Radius of cylinder for the Fixed part of the struts [m]
% - struts_M [struct] - structure with the following fields:
% - M [6x1] - Mass of the Mobile part of the struts [kg]
% - I [3x3x6] - Moment of Inertia for the Mobile part of the struts [kg*m^2]
% - H [6x1] - Height of cylinder for the Mobile part of the struts [m]
% - R [6x1] - Radius of cylinder for the Mobile part of the struts [m]
arguments
stewart
args.Fsm (1,1) double {mustBeNumeric, mustBePositive} = 0.1
args.Fsh (1,1) double {mustBeNumeric, mustBePositive} = 50e-3
args.Fsr (1,1) double {mustBeNumeric, mustBePositive} = 5e-3
args.Msm (1,1) double {mustBeNumeric, mustBePositive} = 0.1
args.Msh (1,1) double {mustBeNumeric, mustBePositive} = 50e-3
args.Msr (1,1) double {mustBeNumeric, mustBePositive} = 5e-3
end
stewart.struts_M.type = 1;
stewart.struts_M.M = args.Msm;
stewart.struts_M.R = args.Msr;
stewart.struts_M.H = args.Msh;
stewart.struts_F.type = 1;
stewart.struts_F.M = args.Fsm;
stewart.struts_F.R = args.Fsr;
stewart.struts_F.H = args.Fsh;
end

View File

@@ -0,0 +1,35 @@
function [stewart] = initializeFramesPositions(stewart, args)
% initializeFramesPositions - Initialize the positions of frames {A}, {B}, {F} and {M}
%
% Syntax: [stewart] = initializeFramesPositions(stewart, args)
%
% Inputs:
% - args - Can have the following fields:
% - H [1x1] - Total Height of the Stewart Platform (height from {F} to {M}) [m]
% - MO_B [1x1] - Height of the frame {B} with respect to {M} [m]
%
% Outputs:
% - stewart - A structure with the following fields:
% - geometry.H [1x1] - Total Height of the Stewart Platform [m]
% - geometry.FO_M [3x1] - Position of {M} with respect to {F} [m]
% - platform_M.MO_B [3x1] - Position of {B} with respect to {M} [m]
% - platform_F.FO_A [3x1] - Position of {A} with respect to {F} [m]
arguments
stewart
args.H (1,1) double {mustBeNumeric, mustBePositive} = 90e-3
args.MO_B (1,1) double {mustBeNumeric} = 50e-3
end
H = args.H; % Total Height of the Stewart Platform [m]
FO_M = [0; 0; H]; % Position of {M} with respect to {F} [m]
MO_B = [0; 0; args.MO_B]; % Position of {B} with respect to {M} [m]
FO_A = MO_B + FO_M; % Position of {A} with respect to {F} [m]
stewart.geometry.H = H;
stewart.geometry.FO_M = FO_M;
stewart.platform_M.MO_B = MO_B;
stewart.platform_F.FO_A = FO_A;

View File

@@ -0,0 +1,129 @@
function [stewart] = initializeJointDynamics(stewart, args)
% initializeJointDynamics - Add Stiffness and Damping properties for the spherical joints
%
% Syntax: [stewart] = initializeJointDynamics(args)
%
% Inputs:
% - args - Structure with the following fields:
% - type_F - 'universal', 'spherical', 'universal_p', 'spherical_p'
% - type_M - 'universal', 'spherical', 'universal_p', 'spherical_p'
% - Kf_M [6x1] - Bending (Rx, Ry) Stiffness for each top joints [(N.m)/rad]
% - Kt_M [6x1] - Torsion (Rz) Stiffness for each top joints [(N.m)/rad]
% - Cf_M [6x1] - Bending (Rx, Ry) Damping of each top joint [(N.m)/(rad/s)]
% - Ct_M [6x1] - Torsion (Rz) Damping of each top joint [(N.m)/(rad/s)]
% - Kf_F [6x1] - Bending (Rx, Ry) Stiffness for each bottom joints [(N.m)/rad]
% - Kt_F [6x1] - Torsion (Rz) Stiffness for each bottom joints [(N.m)/rad]
% - Cf_F [6x1] - Bending (Rx, Ry) Damping of each bottom joint [(N.m)/(rad/s)]
% - Cf_F [6x1] - Torsion (Rz) Damping of each bottom joint [(N.m)/(rad/s)]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - stewart.joints_F and stewart.joints_M:
% - type - 1 (universal), 2 (spherical), 3 (universal perfect), 4 (spherical perfect)
% - Kx, Ky, Kz [6x1] - Translation (Tx, Ty, Tz) Stiffness [N/m]
% - Kf [6x1] - Flexion (Rx, Ry) Stiffness [(N.m)/rad]
% - Kt [6x1] - Torsion (Rz) Stiffness [(N.m)/rad]
% - Cx, Cy, Cz [6x1] - Translation (Rx, Ry) Damping [N/(m/s)]
% - Cf [6x1] - Flexion (Rx, Ry) Damping [(N.m)/(rad/s)]
% - Cb [6x1] - Torsion (Rz) Damping [(N.m)/(rad/s)]
arguments
stewart
args.type_F char {mustBeMember(args.type_F,{'2dof', '3dof', '4dof', '6dof', 'flexible'})} = '2dof'
args.type_M char {mustBeMember(args.type_M,{'2dof', '3dof', '4dof', '6dof', 'flexible'})} = '3dof'
args.Kf_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Cf_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Kt_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Ct_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Kf_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Cf_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Kt_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Ct_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Ka_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Ca_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Kr_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Cr_F (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Ka_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Ca_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Kr_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.Cr_M (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.K_M double {mustBeNumeric} = zeros(6,6)
args.M_M double {mustBeNumeric} = zeros(6,6)
args.n_xyz_M double {mustBeNumeric} = zeros(2,3)
args.xi_M double {mustBeNumeric} = 0.1
args.step_file_M char {} = ''
args.K_F double {mustBeNumeric} = zeros(6,6)
args.M_F double {mustBeNumeric} = zeros(6,6)
args.n_xyz_F double {mustBeNumeric} = zeros(2,3)
args.xi_F double {mustBeNumeric} = 0.1
args.step_file_F char {} = ''
end
switch args.type_F
case '2dof'
stewart.joints_F.type = 1;
case '3dof'
stewart.joints_F.type = 2;
case '4dof'
stewart.joints_F.type = 3;
case '6dof'
stewart.joints_F.type = 4;
case 'flexible'
stewart.joints_F.type = 5;
otherwise
error("joints_F are not correctly defined")
end
switch args.type_M
case '2dof'
stewart.joints_M.type = 1;
case '3dof'
stewart.joints_M.type = 2;
case '4dof'
stewart.joints_M.type = 3;
case '6dof'
stewart.joints_M.type = 4;
case 'flexible'
stewart.joints_M.type = 5;
otherwise
error("joints_M are not correctly defined")
end
stewart.joints_M.Ka = args.Ka_M;
stewart.joints_M.Kr = args.Kr_M;
stewart.joints_F.Ka = args.Ka_F;
stewart.joints_F.Kr = args.Kr_F;
stewart.joints_M.Ca = args.Ca_M;
stewart.joints_M.Cr = args.Cr_M;
stewart.joints_F.Ca = args.Ca_F;
stewart.joints_F.Cr = args.Cr_F;
stewart.joints_M.Kf = args.Kf_M;
stewart.joints_M.Kt = args.Kt_M;
stewart.joints_F.Kf = args.Kf_F;
stewart.joints_F.Kt = args.Kt_F;
stewart.joints_M.Cf = args.Cf_M;
stewart.joints_M.Ct = args.Ct_M;
stewart.joints_F.Cf = args.Cf_F;
stewart.joints_F.Ct = args.Ct_F;
stewart.joints_F.M = args.M_F;
stewart.joints_F.K = args.K_F;
stewart.joints_F.n_xyz = args.n_xyz_F;
stewart.joints_F.xi = args.xi_F;
stewart.joints_F.xi = args.xi_F;
stewart.joints_F.step_file = args.step_file_F;
stewart.joints_M.M = args.M_M;
stewart.joints_M.K = args.K_M;
stewart.joints_M.n_xyz = args.n_xyz_M;
stewart.joints_M.xi = args.xi_M;
stewart.joints_M.step_file = args.step_file_M;
end

View File

@@ -0,0 +1,26 @@
function [sample] = initializeSample(args)
arguments
args.type char {mustBeMember(args.type,{'none', 'cylindrical'})} = 'none'
args.H_offset (1,1) double {mustBeNumeric} = 0 % Vertical offset [m]
args.H (1,1) double {mustBeNumeric, mustBePositive} = 200e-3 % Height [m]
args.R (1,1) double {mustBeNumeric, mustBePositive} = 110e-3 % Radius [m]
args.m (1,1) double {mustBeNumeric, mustBePositive} = 1 % Mass [kg]
end
sample = struct();
switch args.type
case 'none'
sample.type = 0;
sample.m = 0;
case 'cylindrical'
sample.type = 1;
sample.H_offset = args.H_offset;
sample.H = args.H;
sample.R = args.R;
sample.m = args.m;
end
end

View File

@@ -0,0 +1,31 @@
function [stewart] = initializeStewartPlatform()
% initializeStewartPlatform - Initialize the stewart structure
%
% Syntax: [stewart] = initializeStewartPlatform(args)
%
% Outputs:
% - stewart - A structure with the following sub-structures:
% - platform_F -
% - platform_M -
% - joints_F -
% - joints_M -
% - struts_F -
% - struts_M -
% - actuators -
% - geometry -
% - properties -
stewart = struct();
stewart.platform_F = struct();
stewart.platform_M = struct();
stewart.joints_F = struct();
stewart.joints_M = struct();
stewart.struts_F = struct();
stewart.struts_M = struct();
stewart.actuators = struct();
stewart.sensors = struct();
stewart.sensors.inertial = struct();
stewart.sensors.force = struct();
stewart.sensors.relative = struct();
stewart.geometry = struct();
stewart.kinematics = struct();

View File

@@ -0,0 +1,27 @@
function [stewart] = initializeStewartPose(stewart, args)
% initializeStewartPose - Determine the initial stroke in each leg to have the wanted pose
% It uses the inverse kinematic
%
% Syntax: [stewart] = initializeStewartPose(stewart, args)
%
% Inputs:
% - stewart - A structure with the following fields
% - Aa [3x6] - The positions ai expressed in {A}
% - Bb [3x6] - The positions bi expressed in {B}
% - args - Can have the following fields:
% - AP [3x1] - The wanted position of {B} with respect to {A}
% - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - actuators.Leq [6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A}
arguments
stewart
args.AP (3,1) double {mustBeNumeric} = zeros(3,1)
args.ARB (3,3) double {mustBeNumeric} = eye(3)
end
[Li, dLi] = inverseKinematics(stewart, 'AP', args.AP, 'ARB', args.ARB);
stewart.actuators.Leq = dLi;

View File

@@ -0,0 +1,60 @@
function [stewart] = initializeStrutDynamics(stewart, args)
% initializeStrutDynamics - Add Stiffness and Damping properties of each strut
%
% Syntax: [stewart] = initializeStrutDynamics(args)
%
% Inputs:
% - args - Structure with the following fields:
% - K [6x1] - Stiffness of each strut [N/m]
% - C [6x1] - Damping of each strut [N/(m/s)]
%
% Outputs:
% - stewart - updated Stewart structure with the added fields:
% - actuators.type = 1
% - actuators.K [6x1] - Stiffness of each strut [N/m]
% - actuators.C [6x1] - Damping of each strut [N/(m/s)]
arguments
stewart
args.type char {mustBeMember(args.type,{'1dof', '2dof', 'flexible'})} = '1dof'
args.k (1,1) double {mustBeNumeric, mustBeNonnegative} = 20e6
args.kp (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.ke (1,1) double {mustBeNumeric, mustBeNonnegative} = 5e6
args.ka (1,1) double {mustBeNumeric, mustBeNonnegative} = 60e6
args.c (1,1) double {mustBeNumeric, mustBeNonnegative} = 2e1
args.cp (1,1) double {mustBeNumeric, mustBeNonnegative} = 0
args.ce (1,1) double {mustBeNumeric, mustBeNonnegative} = 1e6
args.ca (1,1) double {mustBeNumeric, mustBeNonnegative} = 10
args.F_gain (1,1) double {mustBeNumeric} = 1
args.me (1,1) double {mustBeNumeric} = 0.01
args.ma (1,1) double {mustBeNumeric} = 0.01
end
if strcmp(args.type, '1dof')
stewart.actuators.type = 1;
elseif strcmp(args.type, '2dof')
stewart.actuators.type = 2;
elseif strcmp(args.type, 'flexible')
stewart.actuators.type = 3;
end
stewart.actuators.k = args.k;
stewart.actuators.c = args.c;
% Parallel stiffness
stewart.actuators.kp = args.kp;
stewart.actuators.cp = args.cp;
stewart.actuators.ka = args.ka;
stewart.actuators.ca = args.ca;
stewart.actuators.ke = args.ke;
stewart.actuators.ce = args.ce;
stewart.actuators.F_gain = args.F_gain;
stewart.actuators.ma = args.ma;
stewart.actuators.me = args.me;
end

View File

@@ -0,0 +1,36 @@
function [Li, dLi] = inverseKinematics(stewart, args)
% inverseKinematics - Compute the needed length of each strut to have the wanted position and orientation of {B} with respect to {A}
%
% Syntax: [stewart] = inverseKinematics(stewart)
%
% Inputs:
% - stewart - A structure with the following fields
% - geometry.Aa [3x6] - The positions ai expressed in {A}
% - geometry.Bb [3x6] - The positions bi expressed in {B}
% - geometry.l [6x1] - Length of each strut
% - args - Can have the following fields:
% - AP [3x1] - The wanted position of {B} with respect to {A}
% - ARB [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
%
% Outputs:
% - Li [6x1] - The 6 needed length of the struts in [m] to have the wanted pose of {B} w.r.t. {A}
% - dLi [6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A}
arguments
stewart
args.AP (3,1) double {mustBeNumeric} = zeros(3,1)
args.ARB (3,3) double {mustBeNumeric} = eye(3)
end
assert(isfield(stewart.geometry, 'Aa'), 'stewart.geometry should have attribute Aa')
Aa = stewart.geometry.Aa;
assert(isfield(stewart.geometry, 'Bb'), 'stewart.geometry should have attribute Bb')
Bb = stewart.geometry.Bb;
assert(isfield(stewart.geometry, 'l'), 'stewart.geometry should have attribute l')
l = stewart.geometry.l;
Li = sqrt(args.AP'*args.AP + diag(Bb'*Bb) + diag(Aa'*Aa) - (2*args.AP'*Aa)' + (2*args.AP'*(args.ARB*Bb))' - diag(2*(args.ARB*Bb)'*Aa));
dLi = Li-l;

58
matlab/src/plotCube.m Normal file
View File

@@ -0,0 +1,58 @@
function [] = plotCube(stewart, args)
arguments
stewart
args.Hc (1,1) double {mustBeNumeric, mustBePositive} = 60e-3
args.FOc (1,1) double {mustBeNumeric} = 50e-3
args.color (4,1) double {mustBeNumeric} = [0,0,0,0.5]
args.linewidth (1,1) double {mustBeNumeric, mustBePositive} = 2.5
args.link_to_struts logical {mustBeNumericOrLogical} = false
end
sx = [ 2; -1; -1];
sy = [ 0; 1; -1];
sz = [ 1; 1; 1];
R = [sx, sy, sz]./vecnorm([sx, sy, sz]);
L = args.Hc*sqrt(3);
p_xyz = R'*[[0;0;0],[L;0;0],[L;L;0],[0;L;0],[0;0;L],[L;0;L],[L;L;L],[0;L;L]] - [0;0;1.5*args.Hc];
% Position center of the cube
p_xyz = p_xyz + args.FOc*[0;0;1]*ones(1,8);
edges_order = [1 2 3 4 1];
plot3(p_xyz(1,edges_order), p_xyz(2,edges_order), p_xyz(3,edges_order), '-', 'color', args.color, 'linewidth', args.linewidth);
edges_order = [5 6 7 8 5];
plot3(p_xyz(1,edges_order), p_xyz(2,edges_order), p_xyz(3,edges_order), '-', 'color', args.color, 'linewidth', args.linewidth);
edges_order = [1 5];
plot3(p_xyz(1,edges_order), p_xyz(2,edges_order), p_xyz(3,edges_order), '-', 'color', args.color, 'linewidth', args.linewidth);
edges_order = [2 6];
plot3(p_xyz(1,edges_order), p_xyz(2,edges_order), p_xyz(3,edges_order), '-', 'color', args.color, 'linewidth', args.linewidth);
edges_order = [3 7];
plot3(p_xyz(1,edges_order), p_xyz(2,edges_order), p_xyz(3,edges_order), '-', 'color', args.color, 'linewidth', args.linewidth);
edges_order = [4 8];
plot3(p_xyz(1,edges_order), p_xyz(2,edges_order), p_xyz(3,edges_order), '-', 'color', args.color, 'linewidth', args.linewidth);
if args.link_to_struts
Fb = stewart.platform_M.Mb + stewart.geometry.FO_M;
plot3([Fb(1,1), p_xyz(1,5)],...
[Fb(2,1), p_xyz(2,5)],...
[Fb(3,1), p_xyz(3,5)], '--', 'color', args.color, 'linewidth', args.linewidth);
plot3([Fb(1,2), p_xyz(1,2)],...
[Fb(2,2), p_xyz(2,2)],...
[Fb(3,2), p_xyz(3,2)], '--', 'color', args.color, 'linewidth', args.linewidth);
plot3([Fb(1,3), p_xyz(1,2)],...
[Fb(2,3), p_xyz(2,2)],...
[Fb(3,3), p_xyz(3,2)], '--', 'color', args.color, 'linewidth', args.linewidth);
plot3([Fb(1,4), p_xyz(1,4)],...
[Fb(2,4), p_xyz(2,4)],...
[Fb(3,4), p_xyz(3,4)], '--', 'color', args.color, 'linewidth', args.linewidth);
plot3([Fb(1,5), p_xyz(1,4)],...
[Fb(2,5), p_xyz(2,4)],...
[Fb(3,5), p_xyz(3,4)], '--', 'color', args.color, 'linewidth', args.linewidth);
plot3([Fb(1,6), p_xyz(1,5)],...
[Fb(2,6), p_xyz(2,5)],...
[Fb(3,6), p_xyz(3,5)], '--', 'color', args.color, 'linewidth', args.linewidth);
end

View File

@@ -0,0 +1,15 @@
function [] = plotCylindricalPayload(stewart, args)
arguments
stewart
args.H (1,1) double {mustBeNumeric, mustBePositive} = 100e-3
args.R (1,1) double {mustBeNumeric, mustBePositive} = 50e-3
args.H_offset (1,1) double {mustBeNumeric} = 0
args.color (3,1) double {mustBeNumeric} = [0.5,0.5,0.5]
end
[X,Y,Z] = cylinder(args.R);
Z = args.H*Z + args.H_offset;
surf(X, Y, Z, 'facecolor', args.color, 'edgecolor', 'none')
fill3(X(1,:), Y(1,:), Z(1,:), 'k', 'facecolor', args.color)
fill3(X(2,:), Y(2,:), Z(2,:), 'k', 'facecolor', args.color)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

111
paper/.latexmkrc Normal file
View File

@@ -0,0 +1,111 @@
#!/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=('dehaeze26_cubic_architecture.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 = 2; # 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
$biber = "biber --validate-datamodel %O %S";
# Glossaries
add_cus_dep('glo', 'gls', 0, 'run_makeglossaries');
add_cus_dep('acn', 'acr', 0, 'run_makeglossaries');
sub run_makeglossaries {
if ( $silent ) {
system "makeglossaries -q -s '$_[0].ist' '$_[0]'";
}
else {
system "makeglossaries -s '$_[0].ist' '$_[0]'";
};
}
# ======================================================================================
# 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', 'glstex', 'glo', 'gls', 'glg', 'acn', 'acr', 'alg';
# 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

@@ -0,0 +1,179 @@
@article{stewart65_platf_with_six_degrees_freed,
author = {Stewart, D.},
title = {A Platform With Six Degrees of Freedom},
journal = {Proceedings of the institution of mechanical engineers},
volume = 180,
number = 1,
pages = {371--386},
year = 1965,
publisher = {Sage Publications Sage UK: London, England},
}
@article{geng94_six_degree_of_freed_activ,
author = {Geng, Z. J. and Haynes, L. S.},
title = {Six Degree-Of-Freedom Active Vibration Control Using the
Stewart Platforms},
journal = {IEEE Transactions on Control Systems Technology},
volume = 2,
number = 1,
pages = {45--53},
year = 1994,
doi = {10.1109/87.273110},
url = {https://doi.org/10.1109/87.273110},
keywords = {parallel robot, cubic configuration},
}
@article{preumont07_six_axis_singl_stage_activ,
author = {Preumont, A. and Horodinca, M. and Romanescu, I. and de
Marneffe, B. and Avraam, M. and Deraemaeker, A. and Bossens, F. and
Abu Hanieh, A.},
title = {A Six-Axis Single-Stage Active Vibration Isolator Based on
Stewart Platform},
journal = {Journal of Sound and Vibration},
volume = 300,
number = {3-5},
pages = {644--661},
year = 2007,
doi = {10.1016/j.jsv.2006.07.050},
url = {https://doi.org/10.1016/j.jsv.2006.07.050},
keywords = {parallel robot},
}
@article{jafari03_orthog_gough_stewar_platf_microm,
author = {Jafari, F. and McInroy, J. E.},
title = {Orthogonal Gough-Stewart Platforms for Micromanipulation},
journal = {IEEE Transactions on Robotics and Automation},
volume = 19,
number = 4,
pages = {595--603},
year = 2003,
doi = {10.1109/tra.2003.814506},
url = {https://doi.org/10.1109/tra.2003.814506},
issn = {1042-296X},
keywords = {parallel robot, cubic configuration},
month = 8,
publisher = {Institute of Electrical and Electronics Engineers (IEEE)},
}
@phdthesis{hanieh03_activ_stewar,
author = {Abu Hanieh, A.},
keywords = {parallel robot},
school = {Universit{\'e} Libre de Bruxelles, Brussels, Belgium},
title = {Active isolation and damping of vibrations via Stewart
platform},
year = 2003,
}
@book{preumont18_vibrat_contr_activ_struc_fourt_edition,
author = {Preumont, A.},
title = {Vibration Control of Active Structures - Fourth Edition},
year = 2018,
publisher = {Springer International Publishing},
url = {https://doi.org/10.1007/978-3-319-72296-2},
doi = {10.1007/978-3-319-72296-2},
keywords = {favorite, parallel robot},
series = {Solid Mechanics and Its Applications},
}
@article{thayer02_six_axis_vibrat_isolat_system,
author = {Thayer, D. and Campbell, M. and Vagners, J. and
von Flotow, A.},
title = {Six-Axis Vibration Isolation System Using Soft Actuators
and Multiple Sensors},
journal = {Journal of Spacecraft and Rockets},
volume = 39,
number = 2,
pages = {206--212},
year = 2002,
doi = {10.2514/2.3821},
url = {https://doi.org/10.2514/2.3821},
keywords = {parallel robot},
}
@article{mcinroy00_desig_contr_flexur_joint_hexap,
author = {McInroy, J. E. and Hamann, J. C.},
title = {Design and Control of Flexure Jointed Hexapods},
journal = {IEEE Transactions on Robotics and Automation},
volume = 16,
number = 4,
pages = {372--381},
year = 2000,
doi = {10.1109/70.864229},
url = {https://doi.org/10.1109/70.864229},
keywords = {parallel robot},
}
@phdthesis{li01_simul_fault_vibrat_isolat_point,
author = {Li, X.},
keywords = {parallel robot},
school = {University of Wyoming},
title = {Simultaneous, Fault-tolerant Vibration Isolation and
Pointing Control of Flexure Jointed Hexapods},
year = 2001,
}
@inproceedings{mcinroy99_dynam,
author = {McInroy, J. E.},
title = {Dynamic modeling of flexure jointed hexapods for control
purposes},
booktitle = {Proceedings of the 1999 IEEE International Conference on
Control Applications (Cat. No.99CH36328)},
year = 1999,
doi = {10.1109/cca.1999.806694},
url = {https://doi.org/10.1109/cca.1999.806694},
keywords = {parallel robot},
}
@article{furutani04_nanom_cuttin_machin_using_stewar,
author = {Furutani, K. and Suzuki, M. and Kudoh, R.},
title = {Nanometre-Cutting Machine Using a Stewart-Platform Parallel
Mechanism},
journal = {Measurement Science and Technology},
volume = 15,
number = 2,
pages = {467--474},
year = 2004,
doi = {10.1088/0957-0233/15/2/022},
url = {https://doi.org/10.1088/0957-0233/15/2/022},
keywords = {parallel robot, cubic configuration},
}
@article{yang19_dynam_model_decoup_contr_flexib,
author = {Yang, X. and Wu, H. and Chen, B. and Kang, S. and Cheng, S.},
title = {Dynamic Modeling and Decoupled Control of a Flexible
Stewart Platform for Vibration Isolation},
journal = {Journal of Sound and Vibration},
volume = 439,
pages = {398--412},
year = 2019,
doi = {10.1016/j.jsv.2018.10.007},
url = {https://doi.org/10.1016/j.jsv.2018.10.007},
issn = {0022-460X},
keywords = {parallel robot, flexure, decoupled control},
month = 1,
publisher = {Elsevier BV},
}

View File

@@ -0,0 +1,567 @@
#+TITLE: Decoupling Properties of the Cubic Architecture
:DRAWER:
#+LANGUAGE: en
#+EMAIL: dehaeze.thomas@gmail.com
#+AUTHOR: Dehaeze Thomas
#+BIND: org-latex-image-default-option "scale=1"
#+BIND: org-latex-image-default-width ""
#+LaTeX_CLASS: scrreprt
#+LaTeX_CLASS_OPTIONS: [a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]
#+LATEX_HEADER: \input{preamble.tex}
#+LATEX_HEADER_EXTRA: \input{preamble_extra.tex}
#+LATEX_HEADER_EXTRA: \bibliography{dehaeze26_cubic_architecture.bib}
#+BIND: org-latex-bib-compiler "biber"
:END:
#+latex: \clearpage
* Build :noexport:
#+NAME: startblock
#+BEGIN_SRC emacs-lisp :results none :tangle no
(add-to-list 'org-latex-classes
'("scrreprt"
"\\documentclass{scrreprt}"
("\\chapter{%s}" . "\\chapter*{%s}")
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
))
;; Remove automatic org heading labels
(defun my-latex-filter-removeOrgAutoLabels (text backend info)
"Org-mode automatically generates labels for headings despite explicit use of `#+LABEL`. This filter forcibly removes all automatically generated org-labels in headings."
(when (org-export-derived-backend-p backend 'latex)
(replace-regexp-in-string "\\\\label{sec:org[a-f0-9]+}\n" "" text)))
(add-to-list 'org-export-filter-headline-functions
'my-latex-filter-removeOrgAutoLabels)
;; Remove all org comments in the output LaTeX file
(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-hook 'org-export-before-processing-hook 'delete-org-comments)
;; Use no package by default
(setq org-latex-packages-alist nil)
(setq org-latex-default-packages-alist nil)
;; Do not include the subtitle inside the title
(setq org-latex-subtitle-separate t)
(setq org-latex-subtitle-format "\\subtitle{%s}")
(setq org-export-before-parsing-hook '(org-ref-glossary-before-parsing
org-ref-acronyms-before-parsing))
#+END_SRC
* Notes :noexport:
** Journal
https://asmedigitalcollection.asme.org/mechanicaldesign
Guide: https://www.asme.org/publications-submissions/journals/information-for-authors/journal-guidelines/writing-a-research-paper
#+begin_quote
Research papers undergo full peer review. Authors are encouraged to prepare concise manuscripts that convey clearly the significance of the work. Research Papers do not have a specified length but are usually 8,000 to 12,000 words with 5-8 figures or tables.
#+end_quote
** TODO [#B] Add more content from the PhD thesis?
Maybe add:
- [[file:~/Cloud/work-projects/ID31-NASS/phd-thesis-chapters/B1-nass-geometry/nass-geometry.org::*Review of Stewart platforms][Review of Stewart platforms]]
- [[file:~/Cloud/work-projects/ID31-NASS/phd-thesis-chapters/B1-nass-geometry/nass-geometry.org::*Effect of geometry on Stewart platform properties][Effect of geometry on Stewart platform properties]]
* Introduction :ignore:
The Cubic configuration for the Stewart platform was first proposed by Dr. Gough in a comment to the original paper by Dr. Stewart [[cite:&stewart65_platf_with_six_degrees_freed]].
This configuration is characterized by active struts arranged in a mutually orthogonal configuration connecting the corners of a cube, as shown in Figure ref:fig:detail_kinematics_cubic_architecture_example.
Typically, the struts have similar length to the cube's edges, as illustrated in Figure ref:fig:detail_kinematics_cubic_architecture_example.
Practical implementations of such configurations can be observed in Figures ref:fig:detail_kinematics_jpl, ref:fig:detail_kinematics_uw_gsp and ref:fig:detail_kinematics_uqp.
It is also possible to implement designs with strut lengths smaller than the cube's edges (Figure ref:fig:detail_kinematics_cubic_architecture_example_small), as exemplified in Figure ref:fig:detail_kinematics_ulb_pz.
#+name: fig:detail_kinematics_cubic_architecture_examples
#+caption: Typical Stewart platform cubic architectures in which struts' length is similar to the cube edges's length (\subref{fig:detail_kinematics_cubic_architecture_example}) or is taking just a portion of the edge (\subref{fig:detail_kinematics_cubic_architecture_example_small}).
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_architecture_example}Classical Cubic architecture}
#+attr_latex: :options {0.49\textwidth}
#+begin_subfigure
#+attr_latex: :scale 1
[[file:figs/detail_kinematics_cubic_architecture_example.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_architecture_example_small}Alternative configuration}
#+attr_latex: :options {0.49\textwidth}
#+begin_subfigure
#+attr_latex: :scale 1
[[file:figs/detail_kinematics_cubic_architecture_example_small.png]]
#+end_subfigure
#+end_figure
Several advantageous properties attributed to the cubic configuration have contributed to its widespread adoption [[cite:&geng94_six_degree_of_freed_activ;&preumont07_six_axis_singl_stage_activ;&jafari03_orthog_gough_stewar_platf_microm]]: simplified kinematics relationships and dynamical analysis [[cite:&geng94_six_degree_of_freed_activ]]; uniform stiffness in all directions [[cite:&hanieh03_activ_stewar]]; uniform mobility [[cite:&preumont18_vibrat_contr_activ_struc_fourt_edition, chapt.8.5.2]]; and minimization of the cross coupling between actuators and sensors in different struts [[cite:&preumont07_six_axis_singl_stage_activ]].
This minimization is attributed to the fact that the struts are orthogonal to each other, and is said to facilitate collocated sensor-actuator control system design, i.e., the implementation of decentralized control [[cite:&geng94_six_degree_of_freed_activ;&thayer02_six_axis_vibrat_isolat_system]].
These properties are examined in this section to assess their relevance for the nano-hexapod.
The mobility and stiffness properties of the cubic configuration are analyzed in Section ref:ssec:detail_kinematics_cubic_static.
Dynamical decoupling is investigated in Section ref:ssec:detail_kinematics_cubic_dynamic, while decentralized control, crucial for the NASS, is examined in Section ref:ssec:detail_kinematics_decentralized_control.
Given that the cubic architecture imposes strict geometric constraints, alternative designs are proposed in Section ref:ssec:detail_kinematics_cubic_design.
The ultimate objective is to determine the suitability of the cubic architecture for the nano-hexapod.
* Static Properties
<<ssec:detail_kinematics_cubic_static>>
** Stiffness matrix for the Cubic architecture
Consider the cubic architecture shown in Figure ref:fig:detail_kinematics_cubic_schematic_full.
The unit vectors corresponding to the edges of the cube are described by equation eqref:eq:detail_kinematics_cubic_s.
\begin{equation}\label{eq:detail_kinematics_cubic_s}
\hat{\bm{s}}_1 = \begin{bmatrix} \frac{\sqrt{2}}{\sqrt{3}} \\ 0 \\ \frac{1}{\sqrt{3}} \end{bmatrix} \quad
\hat{\bm{s}}_2 = \begin{bmatrix} \frac{-1}{\sqrt{6}} \\ \frac{-1}{\sqrt{2}} \\ \frac{1}{\sqrt{3}} \end{bmatrix} \quad
\hat{\bm{s}}_3 = \begin{bmatrix} \frac{-1}{\sqrt{6}} \\ \frac{ 1}{\sqrt{2}} \\ \frac{1}{\sqrt{3}} \end{bmatrix} \quad
\hat{\bm{s}}_4 = \begin{bmatrix} \frac{\sqrt{2}}{\sqrt{3}} \\ 0 \\ \frac{1}{\sqrt{3}} \end{bmatrix} \quad
\hat{\bm{s}}_5 = \begin{bmatrix} \frac{-1}{\sqrt{6}} \\ \frac{-1}{\sqrt{2}} \\ \frac{1}{\sqrt{3}} \end{bmatrix} \quad
\hat{\bm{s}}_6 = \begin{bmatrix} \frac{-1}{\sqrt{6}} \\ \frac{ 1}{\sqrt{2}} \\ \frac{1}{\sqrt{3}} \end{bmatrix}
\end{equation}
#+name: fig:detail_kinematics_cubic_schematic_cases
#+caption: Cubic architecture. Struts are represented in blue. The cube's center by a black dot. The Struts can match the cube's edges (\subref{fig:detail_kinematics_cubic_schematic_full}) or just take a portion of the edge (\subref{fig:detail_kinematics_cubic_schematic})
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_schematic_full}Full cube}
#+attr_latex: :options {0.48\textwidth}
#+begin_subfigure
#+attr_latex: :scale 0.9
[[file:figs/detail_kinematics_cubic_schematic_full.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_schematic}Cube's portion}
#+attr_latex: :options {0.48\textwidth}
#+begin_subfigure
#+attr_latex: :scale 0.9
[[file:figs/detail_kinematics_cubic_schematic.png]]
#+end_subfigure
#+end_figure
Coordinates of the cube's vertices relevant for the top joints, expressed with respect to the cube's center, are shown in equation eqref:eq:detail_kinematics_cubic_vertices.
\begin{equation}\label{eq:detail_kinematics_cubic_vertices}
\tilde{\bm{b}}_1 = \tilde{\bm{b}}_2 = H_c \begin{bmatrix} \frac{1}{\sqrt{2}} \\ \frac{-\sqrt{3}}{\sqrt{2}} \\ \frac{1}{2} \end{bmatrix}, \quad
\tilde{\bm{b}}_3 = \tilde{\bm{b}}_4 = H_c \begin{bmatrix} \frac{1}{\sqrt{2}} \\ \frac{ \sqrt{3}}{\sqrt{2}} \\ \frac{1}{2} \end{bmatrix}, \quad
\tilde{\bm{b}}_5 = \tilde{\bm{b}}_6 = H_c \begin{bmatrix} \frac{-2}{\sqrt{2}} \\ 0 \\ \frac{1}{2} \end{bmatrix}
\end{equation}
In the case where top joints are positioned at the cube's vertices, a diagonal stiffness matrix is obtained as shown in equation eqref:eq:detail_kinematics_cubic_stiffness.
Translation stiffness is twice the stiffness of the struts, and rotational stiffness is proportional to the square of the cube's size $H_c$.
\begin{equation}\label{eq:detail_kinematics_cubic_stiffness}
\bm{K}_{\{B\} = \{C\}} = k \begin{bmatrix}
2 & 0 & 0 & 0 & 0 & 0 \\
0 & 2 & 0 & 0 & 0 & 0 \\
0 & 0 & 2 & 0 & 0 & 0 \\
0 & 0 & 0 & \frac{3}{2} H_c^2 & 0 & 0 \\
0 & 0 & 0 & 0 & \frac{3}{2} H_c^2 & 0 \\
0 & 0 & 0 & 0 & 0 & 6 H_c^2 \\
\end{bmatrix}
\end{equation}
However, typically, the top joints are not placed at the cube's vertices but at positions along the cube's edges (Figure ref:fig:detail_kinematics_cubic_schematic).
In that case, the location of the top joints can be expressed by equation eqref:eq:detail_kinematics_cubic_edges, yet the computed stiffness matrix remains identical to Equation eqref:eq:detail_kinematics_cubic_stiffness.
\begin{equation}\label{eq:detail_kinematics_cubic_edges}
\bm{b}_i = \tilde{\bm{b}}_i + \alpha \hat{\bm{s}}_i
\end{equation}
The stiffness matrix is therefore diagonal when the considered $\{B\}$ frame is located at the center of the cube (shown by frame $\{C\}$).
This means that static forces (resp torques) applied at the cube's center will induce pure translations (resp rotations around the cube's center).
This specific location where the stiffness matrix is diagonal is referred to as the "Center of Stiffness" (analogous to the "Center of Mass" where the mass matrix is diagonal).
** Effect of having frame $\{B\}$ off-centered
When the reference frames $\{A\}$ and $\{B\}$ are shifted from the cube's center, off-diagonal elements emerge in the stiffness matrix.
Considering a vertical shift as shown in Figure ref:fig:detail_kinematics_cubic_schematic, the stiffness matrix transforms into that shown in Equation eqref:eq:detail_kinematics_cubic_stiffness_off_centered.
Off-diagonal elements increase proportionally with the height difference between the cube's center and the considered $\{B\}$ frame.
\begin{equation}\label{eq:detail_kinematics_cubic_stiffness_off_centered}
\bm{K}_{\{B\} \neq \{C\}} = k \begin{bmatrix}
2 & 0 & 0 & 0 & -2 H & 0 \\
0 & 2 & 0 & 2 H & 0 & 0 \\
0 & 0 & 2 & 0 & 0 & 0 \\
0 & 2 H & 0 & \frac{3}{2} H_c^2 + 2 H^2 & 0 & 0 \\
-2 H & 0 & 0 & 0 & \frac{3}{2} H_c^2 + 2 H^2 & 0 \\
0 & 0 & 0 & 0 & 0 & 6 H_c^2 \\
\end{bmatrix}
\end{equation}
This stiffness matrix structure is characteristic of Stewart platforms exhibiting symmetry, and is not an exclusive property of cubic architectures.
Therefore, the stiffness characteristics of the cubic architecture are only distinctive when considering a reference frame located at the cube's center.
This poses a practical limitation, as in most applications, the relevant frame (where motion is of interest and forces are applied) is located above the top platform.
It should be noted that for the stiffness matrix to be diagonal, the cube's center doesn't need to coincide with the geometric center of the Stewart platform.
This observation leads to the interesting alternative architectures presented in Section ref:ssec:detail_kinematics_cubic_design.
** Uniform Mobility
The translational mobility of the Stewart platform with constant orientation was analyzed.
Considering limited actuator stroke (elongation of each strut), the maximum achievable positions in XYZ space were estimated.
The resulting mobility in X, Y, and Z directions for the cubic architecture is illustrated in Figure ref:fig:detail_kinematics_cubic_mobility_translations.
The translational workspace analysis reveals that for the cubic architecture, the achievable positions form a cube whose axes align with the struts, with the cube's edge length corresponding to the strut axial stroke.
These findings suggest that the mobility pattern is more subtle than sometimes described in the literature [[cite:&mcinroy00_desig_contr_flexur_joint_hexap]], exhibiting uniformity primarily along directions aligned with the cube's edges rather than uniform spherical distribution in all XYZ directions.
This configuration still offers more consistent mobility characteristics compared to alternative architectures illustrated in Figure ref:fig:detail_kinematics_mobility_trans.
The rotational mobility, illustrated in Figure ref:fig:detail_kinematics_cubic_mobility_rotations, exhibits greater achievable angular stroke in the $R_x$ and $R_y$ directions compared to the $R_z$ direction.
Furthermore, an inverse relationship exists between the cube's dimension and rotational mobility, with larger cube sizes corresponding to more limited angular displacement capabilities.
#+name: fig:detail_kinematics_cubic_mobility
#+caption: Mobility of a Stewart platform with Cubic architecture. Both for translations (\subref{fig:detail_kinematics_cubic_mobility_translations}) and rotations (\subref{fig:detail_kinematics_cubic_mobility_rotations})
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_mobility_translations}Mobility in translation}
#+attr_latex: :options {0.48\textwidth}
#+begin_subfigure
#+attr_latex: :scale 1
[[file:figs/detail_kinematics_cubic_mobility_translations.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_mobility_rotations}Mobility in rotation}
#+attr_latex: :options {0.48\textwidth}
#+begin_subfigure
#+attr_latex: :scale 1
[[file:figs/detail_kinematics_cubic_mobility_rotations.png]]
#+end_subfigure
#+end_figure
* Dynamical Decoupling
<<ssec:detail_kinematics_cubic_dynamic>>
** Introduction :ignore:
This section examines the dynamics of the cubic architecture in the Cartesian frame which corresponds to the transfer function from forces and torques $\bm{\mathcal{F}}$ to translations and rotations $\bm{\mathcal{X}}$ of the top platform.
When relative motion sensors are integrated in each strut (measuring $\bm{\mathcal{L}}$), the pose $\bm{\mathcal{X}}$ is computed using the Jacobian matrix as shown in Figure ref:fig:detail_kinematics_centralized_control.
#+name: fig:detail_kinematics_centralized_control
#+caption: Typical control architecture in the cartesian frame
[[file:figs/detail_kinematics_centralized_control.png]]
** Low frequency and High frequency coupling
As derived during the conceptual design phase, the dynamics from $\bm{\mathcal{F}}$ to $\bm{\mathcal{X}}$ is described by Equation eqref:eq:detail_kinematics_transfer_function_cart.
At low frequency, the behavior of the platform depends on the stiffness matrix eqref:eq:detail_kinematics_transfer_function_cart_low_freq.
\begin{equation}\label{eq:detail_kinematics_transfer_function_cart_low_freq}
\frac{{\mathcal{X}}}{\bm{\mathcal{F}}}(j \omega) \xrightarrow[\omega \to 0]{} \bm{K}^{-1}
\end{equation}
In Section ref:ssec:detail_kinematics_cubic_static, it was demonstrated that for the cubic configuration, the stiffness matrix is diagonal if frame $\{B\}$ is positioned at the cube's center.
In this case, the "Cartesian" plant is decoupled at low frequency.
At high frequency, the behavior is governed by the mass matrix (evaluated at frame $\{B\}$) eqref:eq:detail_kinematics_transfer_function_high_freq.
\begin{equation}\label{eq:detail_kinematics_transfer_function_high_freq}
\frac{{\mathcal{X}}}{\bm{\mathcal{F}}}(j \omega) \xrightarrow[\omega \to \infty]{} - \omega^2 \bm{M}^{-1}
\end{equation}
To achieve a diagonal mass matrix, the center of mass of the mobile components must coincide with the $\{B\}$ frame, and the principal axes of inertia must align with the axes of the $\{B\}$ frame.
#+name: fig:detail_kinematics_cubic_payload
#+caption: Cubic stewart platform with top cylindrical payload
#+attr_latex: :width 0.6\linewidth
[[file:figs/detail_kinematics_cubic_payload.png]]
To verify these properties, a cubic Stewart platform with a cylindrical payload was analyzed (Figure ref:fig:detail_kinematics_cubic_payload).
Transfer functions from $\bm{\mathcal{F}}$ to $\bm{\mathcal{X}}$ were computed for two specific locations of the $\{B\}$ frames.
When the $\{B\}$ frame was positioned at the center of mass, coupling at low frequency was observed due to the non-diagonal stiffness matrix (Figure ref:fig:detail_kinematics_cubic_cart_coupling_com).
Conversely, when positioned at the center of stiffness, coupling occurred at high frequency due to the non-diagonal mass matrix (Figure ref:fig:detail_kinematics_cubic_cart_coupling_cok).
#+name: fig:detail_kinematics_cubic_cart_coupling
#+caption: Transfer functions for a Cubic Stewart platform expressed in the Cartesian frame. Two locations of the $\{B\}$ frame are considered: at the center of mass of the moving body (\subref{fig:detail_kinematics_cubic_cart_coupling_com}) and at the cube's center (\subref{fig:detail_kinematics_cubic_cart_coupling_cok}).
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_cart_coupling_com}$\{B\}$ at the center of mass}
#+attr_latex: :options {0.48\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
[[file:figs/detail_kinematics_cubic_cart_coupling_com.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_cart_coupling_cok}$\{B\}$ at the cube's center}
#+attr_latex: :options {0.48\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
[[file:figs/detail_kinematics_cubic_cart_coupling_cok.png]]
#+end_subfigure
#+end_figure
** Payload's CoM at the cube's center
An effective strategy for improving dynamical performances involves aligning the cube's center (center of stiffness) with the center of mass of the moving components [[cite:&li01_simul_fault_vibrat_isolat_point]].
This can be achieved by positioning the payload below the top platform, such that the center of mass of the moving body coincides with the cube's center (Figure ref:fig:detail_kinematics_cubic_centered_payload).
This approach was physically implemented in several studies [[cite:&mcinroy99_dynam;&jafari03_orthog_gough_stewar_platf_microm]], as shown in Figure ref:fig:detail_kinematics_uw_gsp.
The resulting dynamics are indeed well-decoupled (Figure ref:fig:detail_kinematics_cubic_cart_coupling_com_cok), taking advantage from diagonal stiffness and mass matrices.
The primary limitation of this approach is that, for many applications including the nano-hexapod, the payload must be positioned above the top platform.
If a design similar to Figure ref:fig:detail_kinematics_cubic_centered_payload were employed for the nano-hexapod, the X-ray beam would intersect with the struts during spindle rotation.
#+name: fig:detail_kinematics_cubic_com_cok
#+caption: Cubic Stewart platform with payload at the cube's center (\subref{fig:detail_kinematics_cubic_centered_payload}). Obtained cartesian plant is fully decoupled (\subref{fig:detail_kinematics_cubic_cart_coupling_com_cok})
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_centered_payload}Payload at the cube's center}
#+attr_latex: :options {0.49\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
[[file:figs/detail_kinematics_cubic_centered_payload.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_cart_coupling_com_cok}Fully decoupled cartesian plant}
#+attr_latex: :options {0.49\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
[[file:figs/detail_kinematics_cubic_cart_coupling_com_cok.png]]
#+end_subfigure
#+end_figure
** Conclusion
The analysis of dynamical properties of the cubic architecture yields several important conclusions.
Static decoupling, characterized by a diagonal stiffness matrix, is achieved when reference frames $\{A\}$ and $\{B\}$ are positioned at the cube's center.
Note that this property can also be obtained with non-cubic architectures that exhibit symmetrical strut arrangements.
Dynamic decoupling requires both static decoupling and coincidence of the mobile platform's center of mass with reference frame $\{B\}$.
While this configuration offers powerful control advantages, it requires positioning the payload at the cube's center, which is highly restrictive and often impractical.
* Decentralized Control
<<ssec:detail_kinematics_decentralized_control>>
** Introduction :ignore:
The orthogonal arrangement of struts in the cubic architecture suggests a potential minimization of inter-strut coupling, which could theoretically create favorable conditions for decentralized control.
Two sensor types integrated in the struts are considered: displacement sensors and force sensors.
The control architecture is illustrated in Figure ref:fig:detail_kinematics_decentralized_control, where $\bm{K}_{\mathcal{L}}$ represents a diagonal transfer function matrix.
#+name: fig:detail_kinematics_decentralized_control
#+caption: Decentralized control in the frame of the struts.
[[file:figs/detail_kinematics_decentralized_control.png]]
The obtained plant dynamics in the frame of the struts are compared for two Stewart platforms.
The first employs a cubic architecture shown in Figure ref:fig:detail_kinematics_cubic_payload.
The second uses a non-cubic Stewart platform shown in Figure ref:fig:detail_kinematics_non_cubic_payload, featuring identical payload and strut dynamics but with struts oriented more vertically to differentiate it from the cubic architecture.
#+name: fig:detail_kinematics_non_cubic_payload
#+caption: Stewart platform with non-cubic architecture
#+attr_latex: :width 0.6\linewidth
[[file:figs/detail_kinematics_non_cubic_payload.png]]
** Relative Displacement Sensors
The transfer functions from actuator force in each strut to the relative motion of the struts are presented in Figure ref:fig:detail_kinematics_decentralized_dL.
As anticipated from the equations of motion from $\bm{f}$ to $\bm{\mathcal{L}}$ eqref:eq:detail_kinematics_transfer_function_struts, the $6 \times 6$ plant is decoupled at low frequency.
At high frequency, coupling is observed as the mass matrix projected in the strut frame is not diagonal.
No significant advantage is evident for the cubic architecture (Figure ref:fig:detail_kinematics_cubic_decentralized_dL) compared to the non-cubic architecture (Figure ref:fig:detail_kinematics_non_cubic_decentralized_dL).
The resonance frequencies differ between the two cases because the more vertical strut orientation in the non-cubic architecture alters the stiffness properties of the Stewart platform, consequently shifting the frequencies of various modes.
#+name: fig:detail_kinematics_decentralized_dL
#+caption: Bode plot of the transfer functions from actuator force to relative displacement sensor in each strut. Both for a non-cubic architecture (\subref{fig:detail_kinematics_non_cubic_decentralized_dL}) and for a cubic architecture (\subref{fig:detail_kinematics_cubic_decentralized_dL})
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_non_cubic_decentralized_dL}Non cubic architecture}
#+attr_latex: :options {0.48\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
[[file:figs/detail_kinematics_non_cubic_decentralized_dL.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_decentralized_dL}Cubic architecture}
#+attr_latex: :options {0.48\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
[[file:figs/detail_kinematics_cubic_decentralized_dL.png]]
#+end_subfigure
#+end_figure
** Force Sensors
Similarly, the transfer functions from actuator force to force sensors in each strut were analyzed for both cubic and non-cubic Stewart platforms.
The results are presented in Figure ref:fig:detail_kinematics_decentralized_fn.
The system demonstrates good decoupling at high frequency in both cases, with no clear advantage for the cubic architecture.
#+name: fig:detail_kinematics_decentralized_fn
#+caption: Bode plot of the transfer functions from actuator force to force sensor in each strut. Both for a non-cubic architecture (\subref{fig:detail_kinematics_non_cubic_decentralized_fn}) and for a cubic architecture (\subref{fig:detail_kinematics_cubic_decentralized_fn})
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_non_cubic_decentralized_fn}Non cubic architecture}
#+attr_latex: :options {0.48\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
[[file:figs/detail_kinematics_non_cubic_decentralized_fn.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_decentralized_fn}Cubic architecture}
#+attr_latex: :options {0.48\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
[[file:figs/detail_kinematics_cubic_decentralized_fn.png]]
#+end_subfigure
#+end_figure
** Conclusion
The presented results do not demonstrate the pronounced decoupling advantages often associated with cubic architectures in the literature.
Both the cubic and non-cubic configurations exhibited similar coupling characteristics, suggesting that the benefits of orthogonal strut arrangement for decentralized control is less obvious than often reported in the literature.
* Cubic architecture with Cube's center above the top platform
<<ssec:detail_kinematics_cubic_design>>
** Introduction :ignore:
As demonstrated in Section ref:ssec:detail_kinematics_cubic_dynamic, the cubic architecture can exhibit advantageous dynamical properties when the center of mass of the moving body coincides with the cube's center, resulting in diagonal mass and stiffness matrices.
As shown in Section ref:ssec:detail_kinematics_cubic_static, the stiffness matrix is diagonal when the considered $\{B\}$ frame is located at the cube's center.
However, the $\{B\}$ frame is typically positioned above the top platform where forces are applied and displacements are measured.
This section proposes modifications to the cubic architecture to enable positioning the payload above the top platform while still leveraging the advantageous dynamical properties of the cubic configuration.
Three key parameters define the geometry of the cubic Stewart platform: $H$, the height of the Stewart platform (distance from fixed base to mobile platform); $H_c$, the height of the cube, as shown in Figure ref:fig:detail_kinematics_cubic_schematic_full; and $H_{CoM}$, the height of the center of mass relative to the mobile platform (coincident with the cube's center).
Depending on the cube's size $H_c$ in relation to $H$ and $H_{CoM}$, different designs emerge.
In the following examples, $H = 100\,mm$ and $H_{CoM} = 20\,mm$.
** Small cube
When the cube size $H_c$ is smaller than twice the height of the CoM $H_{CoM}$ eqref:eq:detail_kinematics_cube_small, the resulting design is shown in Figure ref:fig:detail_kinematics_cubic_above_small.
\begin{equation}\label{eq:detail_kinematics_cube_small}
H_c < 2 H_{CoM}
\end{equation}
# TODO - Add link to Figure ref:fig:nhexa_stewart_piezo_furutani (page pageref:fig:nhexa_stewart_piezo_furutani)
This configuration is similar to that described in [[cite:&furutani04_nanom_cuttin_machin_using_stewar]], although they do not explicitly identify it as a cubic configuration.
Adjacent struts are parallel to each other, differing from the typical architecture where parallel struts are positioned opposite to each other.
This approach yields a compact architecture, but the small cube size may result in insufficient rotational stiffness.
#+name: fig:detail_kinematics_cubic_above_small
#+caption: Cubic architecture with cube's center above the top platform. A cube height of 40mm is used.
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_above_small_iso}Isometric view}
#+attr_latex: :options {0.36\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.9\linewidth
[[file:figs/detail_kinematics_cubic_above_small_iso.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_above_small_side}Side view}
#+attr_latex: :options {0.30\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.9\linewidth
[[file:figs/detail_kinematics_cubic_above_small_side.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_above_small_top}Top view}
#+attr_latex: :options {0.30\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.9\linewidth
[[file:figs/detail_kinematics_cubic_above_small_top.png]]
#+end_subfigure
#+end_figure
** Medium sized cube
Increasing the cube's size such that eqref:eq:detail_kinematics_cube_medium is verified produces an architecture with intersecting struts (Figure ref:fig:detail_kinematics_cubic_above_medium).
\begin{equation}\label{eq:detail_kinematics_cube_medium}
2 H_{CoM} < H_c < 2 (H_{CoM} + H)
\end{equation}
This configuration resembles the design proposed in [[cite:&yang19_dynam_model_decoup_contr_flexib]] (Figure ref:fig:detail_kinematics_yang19), although their design is not strictly cubic.
#+name: fig:detail_kinematics_cubic_above_medium
#+caption: Cubic architecture with cube's center above the top platform. A cube height of 140mm is used.
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_above_medium_iso}Isometric view}
#+attr_latex: :options {0.36\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.9\linewidth
[[file:figs/detail_kinematics_cubic_above_medium_iso.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_above_medium_side}Side view}
#+attr_latex: :options {0.30\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.9\linewidth
[[file:figs/detail_kinematics_cubic_above_medium_side.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_above_medium_top}Top view}
#+attr_latex: :options {0.30\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.9\linewidth
[[file:figs/detail_kinematics_cubic_above_medium_top.png]]
#+end_subfigure
#+end_figure
** Large cube
When the cube's height exceeds twice the sum of the platform height and CoM height eqref:eq:detail_kinematics_cube_large, the architecture shown in Figure ref:fig:detail_kinematics_cubic_above_large is obtained.
\begin{equation}\label{eq:detail_kinematics_cube_large}
2 (H_{CoM} + H) < H_c
\end{equation}
#+name: fig:detail_kinematics_cubic_above_large
#+caption: Cubic architecture with cube's center above the top platform. A cube height of 240mm is used.
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_above_large_iso}Isometric view}
#+attr_latex: :options {0.36\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.9\linewidth
[[file:figs/detail_kinematics_cubic_above_large_iso.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_above_large_side}Side view}
#+attr_latex: :options {0.30\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.9\linewidth
[[file:figs/detail_kinematics_cubic_above_large_side.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:detail_kinematics_cubic_above_large_top}Top view}
#+attr_latex: :options {0.30\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.9\linewidth
[[file:figs/detail_kinematics_cubic_above_large_top.png]]
#+end_subfigure
#+end_figure
** Platform size
For the proposed configuration, the top joints $\bm{b}_i$ (resp. the bottom joints $\bm{a}_i$) and are positioned on a circle with radius $R_{b_i}$ (resp. $R_{a_i}$) described by Equation eqref:eq:detail_kinematics_cube_joints.
\begin{subequations}\label{eq:detail_kinematics_cube_joints}
\begin{align}
R_{b_i} &= \sqrt{\frac{3}{2} H_c^2 + 2 H_{CoM}^2} \label{eq:detail_kinematics_cube_top_joints} \\
R_{a_i} &= \sqrt{\frac{3}{2} H_c^2 + 2 (H_{CoM} + H)^2} \label{eq:detail_kinematics_cube_bot_joints}
\end{align}
\end{subequations}
Since the rotational stiffness for the cubic architecture scales with the square of the cube's height eqref:eq:detail_kinematics_cubic_stiffness, the cube's size can be determined based on rotational stiffness requirements.
Subsequently, using Equation eqref:eq:detail_kinematics_cube_joints, the dimensions of the top and bottom platforms can be calculated.
* Conclusion
:PROPERTIES:
:UNNUMBERED: t
:END:
The analysis of the cubic architecture for Stewart platforms yielded several important findings.
While the cubic configuration provides uniform stiffness in the XYZ directions, it stiffness property becomes particularly advantageous when forces and torques are applied at the cube's center.
Under these conditions, the stiffness matrix becomes diagonal, resulting in a decoupled Cartesian plant at low frequencies.
Regarding mobility, the translational capabilities of the cubic configuration exhibit uniformity along the directions of the orthogonal struts, rather than complete uniformity in the Cartesian space.
This understanding refines the characterization of cubic architecture mobility commonly presented in literature.
The analysis of decentralized control in the frame of the struts revealed more nuanced results than expected.
While cubic architectures are frequently associated with reduced coupling between actuators and sensors, this study showed that these benefits may be more subtle or context-dependent than commonly described.
Under the conditions analyzed, the coupling characteristics of cubic and non-cubic configurations, in the frame of the struts, appeared similar.
Fully decoupled dynamics in the Cartesian frame can be achieved when the center of mass of the moving body coincides with the cube's center.
However, this arrangement presents practical challenges, as the cube's center is traditionally located between the top and bottom platforms, making payload placement problematic for many applications.
To address this limitation, modified cubic architectures have been proposed with the cube's center positioned above the top platform.
Three distinct configurations have been identified, each with different geometric arrangements but sharing the common characteristic that the cube's center is positioned above the top platform.
This structural modification enables the alignment of the moving body's center of mass with the center of stiffness, resulting in beneficial decoupling properties in the Cartesian frame.
* Bibliography :ignore:
#+latex: \printbibliography[heading=bibintoc,title={Bibliography}]

Binary file not shown.

View File

@@ -0,0 +1,469 @@
% Created 2025-11-26 Wed 09:39
% Intended LaTeX compiler: pdflatex
\documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt}
\input{preamble.tex}
\input{preamble_extra.tex}
\bibliography{dehaeze26_cubic_architecture.bib}
\author{Dehaeze Thomas}
\date{\today}
\title{Decoupling Properties of the Cubic Architecture}
\hypersetup{
pdfauthor={Dehaeze Thomas},
pdftitle={Decoupling Properties of the Cubic Architecture},
pdfkeywords={},
pdfsubject={},
pdfcreator={Emacs 30.2 (Org mode 9.7.34)},
pdflang={English}}
\usepackage{biblatex}
\begin{document}
\maketitle
\tableofcontents
\clearpage
The Cubic configuration for the Stewart platform was first proposed by Dr. Gough in a comment to the original paper by Dr. Stewart \cite{stewart65_platf_with_six_degrees_freed}.
This configuration is characterized by active struts arranged in a mutually orthogonal configuration connecting the corners of a cube, as shown in Figure \ref{fig:detail_kinematics_cubic_architecture_example}.
Typically, the struts have similar length to the cube's edges, as illustrated in Figure \ref{fig:detail_kinematics_cubic_architecture_example}.
Practical implementations of such configurations can be observed in Figures \ref{fig:detail_kinematics_jpl}, \ref{fig:detail_kinematics_uw_gsp} and \ref{fig:detail_kinematics_uqp}.
It is also possible to implement designs with strut lengths smaller than the cube's edges (Figure \ref{fig:detail_kinematics_cubic_architecture_example_small}), as exemplified in Figure \ref{fig:detail_kinematics_ulb_pz}.
\begin{figure}[htbp]
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,scale=1]{figs/detail_kinematics_cubic_architecture_example.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_architecture_example}Classical Cubic architecture}
\end{subfigure}
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,scale=1]{figs/detail_kinematics_cubic_architecture_example_small.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_architecture_example_small}Alternative configuration}
\end{subfigure}
\caption{\label{fig:detail_kinematics_cubic_architecture_examples}Typical Stewart platform cubic architectures in which struts' length is similar to the cube edges's length (\subref{fig:detail_kinematics_cubic_architecture_example}) or is taking just a portion of the edge (\subref{fig:detail_kinematics_cubic_architecture_example_small}).}
\end{figure}
Several advantageous properties attributed to the cubic configuration have contributed to its widespread adoption \cite{geng94_six_degree_of_freed_activ,preumont07_six_axis_singl_stage_activ,jafari03_orthog_gough_stewar_platf_microm}: simplified kinematics relationships and dynamical analysis \cite{geng94_six_degree_of_freed_activ}; uniform stiffness in all directions \cite{hanieh03_activ_stewar}; uniform mobility \cite[, chapt.8.5.2]{preumont18_vibrat_contr_activ_struc_fourt_edition}; and minimization of the cross coupling between actuators and sensors in different struts \cite{preumont07_six_axis_singl_stage_activ}.
This minimization is attributed to the fact that the struts are orthogonal to each other, and is said to facilitate collocated sensor-actuator control system design, i.e., the implementation of decentralized control \cite{geng94_six_degree_of_freed_activ,thayer02_six_axis_vibrat_isolat_system}.
These properties are examined in this section to assess their relevance for the nano-hexapod.
The mobility and stiffness properties of the cubic configuration are analyzed in Section \ref{ssec:detail_kinematics_cubic_static}.
Dynamical decoupling is investigated in Section \ref{ssec:detail_kinematics_cubic_dynamic}, while decentralized control, crucial for the NASS, is examined in Section \ref{ssec:detail_kinematics_decentralized_control}.
Given that the cubic architecture imposes strict geometric constraints, alternative designs are proposed in Section \ref{ssec:detail_kinematics_cubic_design}.
The ultimate objective is to determine the suitability of the cubic architecture for the nano-hexapod.
\chapter{Static Properties}
\label{ssec:detail_kinematics_cubic_static}
\section{Stiffness matrix for the Cubic architecture}
Consider the cubic architecture shown in Figure \ref{fig:detail_kinematics_cubic_schematic_full}.
The unit vectors corresponding to the edges of the cube are described by equation \eqref{eq:detail_kinematics_cubic_s}.
\begin{equation}\label{eq:detail_kinematics_cubic_s}
\hat{\bm{s}}_1 = \begin{bmatrix} \frac{\sqrt{2}}{\sqrt{3}} \\ 0 \\ \frac{1}{\sqrt{3}} \end{bmatrix} \quad
\hat{\bm{s}}_2 = \begin{bmatrix} \frac{-1}{\sqrt{6}} \\ \frac{-1}{\sqrt{2}} \\ \frac{1}{\sqrt{3}} \end{bmatrix} \quad
\hat{\bm{s}}_3 = \begin{bmatrix} \frac{-1}{\sqrt{6}} \\ \frac{ 1}{\sqrt{2}} \\ \frac{1}{\sqrt{3}} \end{bmatrix} \quad
\hat{\bm{s}}_4 = \begin{bmatrix} \frac{\sqrt{2}}{\sqrt{3}} \\ 0 \\ \frac{1}{\sqrt{3}} \end{bmatrix} \quad
\hat{\bm{s}}_5 = \begin{bmatrix} \frac{-1}{\sqrt{6}} \\ \frac{-1}{\sqrt{2}} \\ \frac{1}{\sqrt{3}} \end{bmatrix} \quad
\hat{\bm{s}}_6 = \begin{bmatrix} \frac{-1}{\sqrt{6}} \\ \frac{ 1}{\sqrt{2}} \\ \frac{1}{\sqrt{3}} \end{bmatrix}
\end{equation}
\begin{figure}[htbp]
\begin{subfigure}{0.48\textwidth}
\begin{center}
\includegraphics[scale=1,scale=0.9]{figs/detail_kinematics_cubic_schematic_full.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_schematic_full}Full cube}
\end{subfigure}
\begin{subfigure}{0.48\textwidth}
\begin{center}
\includegraphics[scale=1,scale=0.9]{figs/detail_kinematics_cubic_schematic.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_schematic}Cube's portion}
\end{subfigure}
\caption{\label{fig:detail_kinematics_cubic_schematic_cases}Cubic architecture. Struts are represented in blue. The cube's center by a black dot. The Struts can match the cube's edges (\subref{fig:detail_kinematics_cubic_schematic_full}) or just take a portion of the edge (\subref{fig:detail_kinematics_cubic_schematic})}
\end{figure}
Coordinates of the cube's vertices relevant for the top joints, expressed with respect to the cube's center, are shown in equation \eqref{eq:detail_kinematics_cubic_vertices}.
\begin{equation}\label{eq:detail_kinematics_cubic_vertices}
\tilde{\bm{b}}_1 = \tilde{\bm{b}}_2 = H_c \begin{bmatrix} \frac{1}{\sqrt{2}} \\ \frac{-\sqrt{3}}{\sqrt{2}} \\ \frac{1}{2} \end{bmatrix}, \quad
\tilde{\bm{b}}_3 = \tilde{\bm{b}}_4 = H_c \begin{bmatrix} \frac{1}{\sqrt{2}} \\ \frac{ \sqrt{3}}{\sqrt{2}} \\ \frac{1}{2} \end{bmatrix}, \quad
\tilde{\bm{b}}_5 = \tilde{\bm{b}}_6 = H_c \begin{bmatrix} \frac{-2}{\sqrt{2}} \\ 0 \\ \frac{1}{2} \end{bmatrix}
\end{equation}
In the case where top joints are positioned at the cube's vertices, a diagonal stiffness matrix is obtained as shown in equation \eqref{eq:detail_kinematics_cubic_stiffness}.
Translation stiffness is twice the stiffness of the struts, and rotational stiffness is proportional to the square of the cube's size \(H_c\).
\begin{equation}\label{eq:detail_kinematics_cubic_stiffness}
\bm{K}_{\{B\} = \{C\}} = k \begin{bmatrix}
2 & 0 & 0 & 0 & 0 & 0 \\
0 & 2 & 0 & 0 & 0 & 0 \\
0 & 0 & 2 & 0 & 0 & 0 \\
0 & 0 & 0 & \frac{3}{2} H_c^2 & 0 & 0 \\
0 & 0 & 0 & 0 & \frac{3}{2} H_c^2 & 0 \\
0 & 0 & 0 & 0 & 0 & 6 H_c^2 \\
\end{bmatrix}
\end{equation}
However, typically, the top joints are not placed at the cube's vertices but at positions along the cube's edges (Figure \ref{fig:detail_kinematics_cubic_schematic}).
In that case, the location of the top joints can be expressed by equation \eqref{eq:detail_kinematics_cubic_edges}, yet the computed stiffness matrix remains identical to Equation \eqref{eq:detail_kinematics_cubic_stiffness}.
\begin{equation}\label{eq:detail_kinematics_cubic_edges}
\bm{b}_i = \tilde{\bm{b}}_i + \alpha \hat{\bm{s}}_i
\end{equation}
The stiffness matrix is therefore diagonal when the considered \(\{B\}\) frame is located at the center of the cube (shown by frame \(\{C\}\)).
This means that static forces (resp torques) applied at the cube's center will induce pure translations (resp rotations around the cube's center).
This specific location where the stiffness matrix is diagonal is referred to as the ``Center of Stiffness'' (analogous to the ``Center of Mass'' where the mass matrix is diagonal).
\section{Effect of having frame \(\{B\}\) off-centered}
When the reference frames \(\{A\}\) and \(\{B\}\) are shifted from the cube's center, off-diagonal elements emerge in the stiffness matrix.
Considering a vertical shift as shown in Figure \ref{fig:detail_kinematics_cubic_schematic}, the stiffness matrix transforms into that shown in Equation \eqref{eq:detail_kinematics_cubic_stiffness_off_centered}.
Off-diagonal elements increase proportionally with the height difference between the cube's center and the considered \(\{B\}\) frame.
\begin{equation}\label{eq:detail_kinematics_cubic_stiffness_off_centered}
\bm{K}_{\{B\} \neq \{C\}} = k \begin{bmatrix}
2 & 0 & 0 & 0 & -2 H & 0 \\
0 & 2 & 0 & 2 H & 0 & 0 \\
0 & 0 & 2 & 0 & 0 & 0 \\
0 & 2 H & 0 & \frac{3}{2} H_c^2 + 2 H^2 & 0 & 0 \\
-2 H & 0 & 0 & 0 & \frac{3}{2} H_c^2 + 2 H^2 & 0 \\
0 & 0 & 0 & 0 & 0 & 6 H_c^2 \\
\end{bmatrix}
\end{equation}
This stiffness matrix structure is characteristic of Stewart platforms exhibiting symmetry, and is not an exclusive property of cubic architectures.
Therefore, the stiffness characteristics of the cubic architecture are only distinctive when considering a reference frame located at the cube's center.
This poses a practical limitation, as in most applications, the relevant frame (where motion is of interest and forces are applied) is located above the top platform.
It should be noted that for the stiffness matrix to be diagonal, the cube's center doesn't need to coincide with the geometric center of the Stewart platform.
This observation leads to the interesting alternative architectures presented in Section \ref{ssec:detail_kinematics_cubic_design}.
\section{Uniform Mobility}
The translational mobility of the Stewart platform with constant orientation was analyzed.
Considering limited actuator stroke (elongation of each strut), the maximum achievable positions in XYZ space were estimated.
The resulting mobility in X, Y, and Z directions for the cubic architecture is illustrated in Figure \ref{fig:detail_kinematics_cubic_mobility_translations}.
The translational workspace analysis reveals that for the cubic architecture, the achievable positions form a cube whose axes align with the struts, with the cube's edge length corresponding to the strut axial stroke.
These findings suggest that the mobility pattern is more subtle than sometimes described in the literature \cite{mcinroy00_desig_contr_flexur_joint_hexap}, exhibiting uniformity primarily along directions aligned with the cube's edges rather than uniform spherical distribution in all XYZ directions.
This configuration still offers more consistent mobility characteristics compared to alternative architectures illustrated in Figure \ref{fig:detail_kinematics_mobility_trans}.
The rotational mobility, illustrated in Figure \ref{fig:detail_kinematics_cubic_mobility_rotations}, exhibits greater achievable angular stroke in the \(R_x\) and \(R_y\) directions compared to the \(R_z\) direction.
Furthermore, an inverse relationship exists between the cube's dimension and rotational mobility, with larger cube sizes corresponding to more limited angular displacement capabilities.
\begin{figure}[htbp]
\begin{subfigure}{0.48\textwidth}
\begin{center}
\includegraphics[scale=1,scale=1]{figs/detail_kinematics_cubic_mobility_translations.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_mobility_translations}Mobility in translation}
\end{subfigure}
\begin{subfigure}{0.48\textwidth}
\begin{center}
\includegraphics[scale=1,scale=1]{figs/detail_kinematics_cubic_mobility_rotations.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_mobility_rotations}Mobility in rotation}
\end{subfigure}
\caption{\label{fig:detail_kinematics_cubic_mobility}Mobility of a Stewart platform with Cubic architecture. Both for translations (\subref{fig:detail_kinematics_cubic_mobility_translations}) and rotations (\subref{fig:detail_kinematics_cubic_mobility_rotations})}
\end{figure}
\chapter{Dynamical Decoupling}
\label{ssec:detail_kinematics_cubic_dynamic}
This section examines the dynamics of the cubic architecture in the Cartesian frame which corresponds to the transfer function from forces and torques \(\bm{\mathcal{F}}\) to translations and rotations \(\bm{\mathcal{X}}\) of the top platform.
When relative motion sensors are integrated in each strut (measuring \(\bm{\mathcal{L}}\)), the pose \(\bm{\mathcal{X}}\) is computed using the Jacobian matrix as shown in Figure \ref{fig:detail_kinematics_centralized_control}.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/detail_kinematics_centralized_control.png}
\caption{\label{fig:detail_kinematics_centralized_control}Typical control architecture in the cartesian frame}
\end{figure}
\section{Low frequency and High frequency coupling}
As derived during the conceptual design phase, the dynamics from \(\bm{\mathcal{F}}\) to \(\bm{\mathcal{X}}\) is described by Equation \eqref{eq:detail_kinematics_transfer_function_cart}.
At low frequency, the behavior of the platform depends on the stiffness matrix \eqref{eq:detail_kinematics_transfer_function_cart_low_freq}.
\begin{equation}\label{eq:detail_kinematics_transfer_function_cart_low_freq}
\frac{{\mathcal{X}}}{\bm{\mathcal{F}}}(j \omega) \xrightarrow[\omega \to 0]{} \bm{K}^{-1}
\end{equation}
In Section \ref{ssec:detail_kinematics_cubic_static}, it was demonstrated that for the cubic configuration, the stiffness matrix is diagonal if frame \(\{B\}\) is positioned at the cube's center.
In this case, the ``Cartesian'' plant is decoupled at low frequency.
At high frequency, the behavior is governed by the mass matrix (evaluated at frame \(\{B\}\)) \eqref{eq:detail_kinematics_transfer_function_high_freq}.
\begin{equation}\label{eq:detail_kinematics_transfer_function_high_freq}
\frac{{\mathcal{X}}}{\bm{\mathcal{F}}}(j \omega) \xrightarrow[\omega \to \infty]{} - \omega^2 \bm{M}^{-1}
\end{equation}
To achieve a diagonal mass matrix, the center of mass of the mobile components must coincide with the \(\{B\}\) frame, and the principal axes of inertia must align with the axes of the \(\{B\}\) frame.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=0.6\linewidth]{figs/detail_kinematics_cubic_payload.png}
\caption{\label{fig:detail_kinematics_cubic_payload}Cubic stewart platform with top cylindrical payload}
\end{figure}
To verify these properties, a cubic Stewart platform with a cylindrical payload was analyzed (Figure \ref{fig:detail_kinematics_cubic_payload}).
Transfer functions from \(\bm{\mathcal{F}}\) to \(\bm{\mathcal{X}}\) were computed for two specific locations of the \(\{B\}\) frames.
When the \(\{B\}\) frame was positioned at the center of mass, coupling at low frequency was observed due to the non-diagonal stiffness matrix (Figure \ref{fig:detail_kinematics_cubic_cart_coupling_com}).
Conversely, when positioned at the center of stiffness, coupling occurred at high frequency due to the non-diagonal mass matrix (Figure \ref{fig:detail_kinematics_cubic_cart_coupling_cok}).
\begin{figure}[htbp]
\begin{subfigure}{0.48\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_kinematics_cubic_cart_coupling_com.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_cart_coupling_com}$\{B\}$ at the center of mass}
\end{subfigure}
\begin{subfigure}{0.48\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_kinematics_cubic_cart_coupling_cok.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_cart_coupling_cok}$\{B\}$ at the cube's center}
\end{subfigure}
\caption{\label{fig:detail_kinematics_cubic_cart_coupling}Transfer functions for a Cubic Stewart platform expressed in the Cartesian frame. Two locations of the \(\{B\}\) frame are considered: at the center of mass of the moving body (\subref{fig:detail_kinematics_cubic_cart_coupling_com}) and at the cube's center (\subref{fig:detail_kinematics_cubic_cart_coupling_cok}).}
\end{figure}
\section{Payload's CoM at the cube's center}
An effective strategy for improving dynamical performances involves aligning the cube's center (center of stiffness) with the center of mass of the moving components \cite{li01_simul_fault_vibrat_isolat_point}.
This can be achieved by positioning the payload below the top platform, such that the center of mass of the moving body coincides with the cube's center (Figure \ref{fig:detail_kinematics_cubic_centered_payload}).
This approach was physically implemented in several studies \cite{mcinroy99_dynam,jafari03_orthog_gough_stewar_platf_microm}, as shown in Figure \ref{fig:detail_kinematics_uw_gsp}.
The resulting dynamics are indeed well-decoupled (Figure \ref{fig:detail_kinematics_cubic_cart_coupling_com_cok}), taking advantage from diagonal stiffness and mass matrices.
The primary limitation of this approach is that, for many applications including the nano-hexapod, the payload must be positioned above the top platform.
If a design similar to Figure \ref{fig:detail_kinematics_cubic_centered_payload} were employed for the nano-hexapod, the X-ray beam would intersect with the struts during spindle rotation.
\begin{figure}[htbp]
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_kinematics_cubic_centered_payload.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_centered_payload}Payload at the cube's center}
\end{subfigure}
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_kinematics_cubic_cart_coupling_com_cok.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_cart_coupling_com_cok}Fully decoupled cartesian plant}
\end{subfigure}
\caption{\label{fig:detail_kinematics_cubic_com_cok}Cubic Stewart platform with payload at the cube's center (\subref{fig:detail_kinematics_cubic_centered_payload}). Obtained cartesian plant is fully decoupled (\subref{fig:detail_kinematics_cubic_cart_coupling_com_cok})}
\end{figure}
\section{Conclusion}
The analysis of dynamical properties of the cubic architecture yields several important conclusions.
Static decoupling, characterized by a diagonal stiffness matrix, is achieved when reference frames \(\{A\}\) and \(\{B\}\) are positioned at the cube's center.
Note that this property can also be obtained with non-cubic architectures that exhibit symmetrical strut arrangements.
Dynamic decoupling requires both static decoupling and coincidence of the mobile platform's center of mass with reference frame \(\{B\}\).
While this configuration offers powerful control advantages, it requires positioning the payload at the cube's center, which is highly restrictive and often impractical.
\chapter{Decentralized Control}
\label{ssec:detail_kinematics_decentralized_control}
The orthogonal arrangement of struts in the cubic architecture suggests a potential minimization of inter-strut coupling, which could theoretically create favorable conditions for decentralized control.
Two sensor types integrated in the struts are considered: displacement sensors and force sensors.
The control architecture is illustrated in Figure \ref{fig:detail_kinematics_decentralized_control}, where \(\bm{K}_{\mathcal{L}}\) represents a diagonal transfer function matrix.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/detail_kinematics_decentralized_control.png}
\caption{\label{fig:detail_kinematics_decentralized_control}Decentralized control in the frame of the struts.}
\end{figure}
The obtained plant dynamics in the frame of the struts are compared for two Stewart platforms.
The first employs a cubic architecture shown in Figure \ref{fig:detail_kinematics_cubic_payload}.
The second uses a non-cubic Stewart platform shown in Figure \ref{fig:detail_kinematics_non_cubic_payload}, featuring identical payload and strut dynamics but with struts oriented more vertically to differentiate it from the cubic architecture.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1,width=0.6\linewidth]{figs/detail_kinematics_non_cubic_payload.png}
\caption{\label{fig:detail_kinematics_non_cubic_payload}Stewart platform with non-cubic architecture}
\end{figure}
\section{Relative Displacement Sensors}
The transfer functions from actuator force in each strut to the relative motion of the struts are presented in Figure \ref{fig:detail_kinematics_decentralized_dL}.
As anticipated from the equations of motion from \(\bm{f}\) to \(\bm{\mathcal{L}}\) \eqref{eq:detail_kinematics_transfer_function_struts}, the \(6 \times 6\) plant is decoupled at low frequency.
At high frequency, coupling is observed as the mass matrix projected in the strut frame is not diagonal.
No significant advantage is evident for the cubic architecture (Figure \ref{fig:detail_kinematics_cubic_decentralized_dL}) compared to the non-cubic architecture (Figure \ref{fig:detail_kinematics_non_cubic_decentralized_dL}).
The resonance frequencies differ between the two cases because the more vertical strut orientation in the non-cubic architecture alters the stiffness properties of the Stewart platform, consequently shifting the frequencies of various modes.
\begin{figure}[htbp]
\begin{subfigure}{0.48\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_kinematics_non_cubic_decentralized_dL.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_non_cubic_decentralized_dL}Non cubic architecture}
\end{subfigure}
\begin{subfigure}{0.48\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_kinematics_cubic_decentralized_dL.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_decentralized_dL}Cubic architecture}
\end{subfigure}
\caption{\label{fig:detail_kinematics_decentralized_dL}Bode plot of the transfer functions from actuator force to relative displacement sensor in each strut. Both for a non-cubic architecture (\subref{fig:detail_kinematics_non_cubic_decentralized_dL}) and for a cubic architecture (\subref{fig:detail_kinematics_cubic_decentralized_dL})}
\end{figure}
\section{Force Sensors}
Similarly, the transfer functions from actuator force to force sensors in each strut were analyzed for both cubic and non-cubic Stewart platforms.
The results are presented in Figure \ref{fig:detail_kinematics_decentralized_fn}.
The system demonstrates good decoupling at high frequency in both cases, with no clear advantage for the cubic architecture.
\begin{figure}[htbp]
\begin{subfigure}{0.48\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_kinematics_non_cubic_decentralized_fn.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_non_cubic_decentralized_fn}Non cubic architecture}
\end{subfigure}
\begin{subfigure}{0.48\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_kinematics_cubic_decentralized_fn.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_decentralized_fn}Cubic architecture}
\end{subfigure}
\caption{\label{fig:detail_kinematics_decentralized_fn}Bode plot of the transfer functions from actuator force to force sensor in each strut. Both for a non-cubic architecture (\subref{fig:detail_kinematics_non_cubic_decentralized_fn}) and for a cubic architecture (\subref{fig:detail_kinematics_cubic_decentralized_fn})}
\end{figure}
\section{Conclusion}
The presented results do not demonstrate the pronounced decoupling advantages often associated with cubic architectures in the literature.
Both the cubic and non-cubic configurations exhibited similar coupling characteristics, suggesting that the benefits of orthogonal strut arrangement for decentralized control is less obvious than often reported in the literature.
\chapter{Cubic architecture with Cube's center above the top platform}
\label{ssec:detail_kinematics_cubic_design}
As demonstrated in Section \ref{ssec:detail_kinematics_cubic_dynamic}, the cubic architecture can exhibit advantageous dynamical properties when the center of mass of the moving body coincides with the cube's center, resulting in diagonal mass and stiffness matrices.
As shown in Section \ref{ssec:detail_kinematics_cubic_static}, the stiffness matrix is diagonal when the considered \(\{B\}\) frame is located at the cube's center.
However, the \(\{B\}\) frame is typically positioned above the top platform where forces are applied and displacements are measured.
This section proposes modifications to the cubic architecture to enable positioning the payload above the top platform while still leveraging the advantageous dynamical properties of the cubic configuration.
Three key parameters define the geometry of the cubic Stewart platform: \(H\), the height of the Stewart platform (distance from fixed base to mobile platform); \(H_c\), the height of the cube, as shown in Figure \ref{fig:detail_kinematics_cubic_schematic_full}; and \(H_{CoM}\), the height of the center of mass relative to the mobile platform (coincident with the cube's center).
Depending on the cube's size \(H_c\) in relation to \(H\) and \(H_{CoM}\), different designs emerge.
In the following examples, \(H = 100\,mm\) and \(H_{CoM} = 20\,mm\).
\section{Small cube}
When the cube size \(H_c\) is smaller than twice the height of the CoM \(H_{CoM}\) \eqref{eq:detail_kinematics_cube_small}, the resulting design is shown in Figure \ref{fig:detail_kinematics_cubic_above_small}.
\begin{equation}\label{eq:detail_kinematics_cube_small}
H_c < 2 H_{CoM}
\end{equation}
This configuration is similar to that described in \cite{furutani04_nanom_cuttin_machin_using_stewar}, although they do not explicitly identify it as a cubic configuration.
Adjacent struts are parallel to each other, differing from the typical architecture where parallel struts are positioned opposite to each other.
This approach yields a compact architecture, but the small cube size may result in insufficient rotational stiffness.
\begin{figure}[htbp]
\begin{subfigure}{0.36\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/detail_kinematics_cubic_above_small_iso.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_above_small_iso}Isometric view}
\end{subfigure}
\begin{subfigure}{0.30\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/detail_kinematics_cubic_above_small_side.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_above_small_side}Side view}
\end{subfigure}
\begin{subfigure}{0.30\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/detail_kinematics_cubic_above_small_top.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_above_small_top}Top view}
\end{subfigure}
\caption{\label{fig:detail_kinematics_cubic_above_small}Cubic architecture with cube's center above the top platform. A cube height of 40mm is used.}
\end{figure}
\section{Medium sized cube}
Increasing the cube's size such that \eqref{eq:detail_kinematics_cube_medium} is verified produces an architecture with intersecting struts (Figure \ref{fig:detail_kinematics_cubic_above_medium}).
\begin{equation}\label{eq:detail_kinematics_cube_medium}
2 H_{CoM} < H_c < 2 (H_{CoM} + H)
\end{equation}
This configuration resembles the design proposed in \cite{yang19_dynam_model_decoup_contr_flexib} (Figure \ref{fig:detail_kinematics_yang19}), although their design is not strictly cubic.
\begin{figure}[htbp]
\begin{subfigure}{0.36\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/detail_kinematics_cubic_above_medium_iso.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_above_medium_iso}Isometric view}
\end{subfigure}
\begin{subfigure}{0.30\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/detail_kinematics_cubic_above_medium_side.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_above_medium_side}Side view}
\end{subfigure}
\begin{subfigure}{0.30\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/detail_kinematics_cubic_above_medium_top.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_above_medium_top}Top view}
\end{subfigure}
\caption{\label{fig:detail_kinematics_cubic_above_medium}Cubic architecture with cube's center above the top platform. A cube height of 140mm is used.}
\end{figure}
\section{Large cube}
When the cube's height exceeds twice the sum of the platform height and CoM height \eqref{eq:detail_kinematics_cube_large}, the architecture shown in Figure \ref{fig:detail_kinematics_cubic_above_large} is obtained.
\begin{equation}\label{eq:detail_kinematics_cube_large}
2 (H_{CoM} + H) < H_c
\end{equation}
\begin{figure}[htbp]
\begin{subfigure}{0.36\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/detail_kinematics_cubic_above_large_iso.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_above_large_iso}Isometric view}
\end{subfigure}
\begin{subfigure}{0.30\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/detail_kinematics_cubic_above_large_side.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_above_large_side}Side view}
\end{subfigure}
\begin{subfigure}{0.30\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.9\linewidth]{figs/detail_kinematics_cubic_above_large_top.png}
\end{center}
\subcaption{\label{fig:detail_kinematics_cubic_above_large_top}Top view}
\end{subfigure}
\caption{\label{fig:detail_kinematics_cubic_above_large}Cubic architecture with cube's center above the top platform. A cube height of 240mm is used.}
\end{figure}
\section{Platform size}
For the proposed configuration, the top joints \(\bm{b}_i\) (resp. the bottom joints \(\bm{a}_i\)) and are positioned on a circle with radius \(R_{b_i}\) (resp. \(R_{a_i}\)) described by Equation \eqref{eq:detail_kinematics_cube_joints}.
\begin{subequations}\label{eq:detail_kinematics_cube_joints}
\begin{align}
R_{b_i} &= \sqrt{\frac{3}{2} H_c^2 + 2 H_{CoM}^2} \label{eq:detail_kinematics_cube_top_joints} \\
R_{a_i} &= \sqrt{\frac{3}{2} H_c^2 + 2 (H_{CoM} + H)^2} \label{eq:detail_kinematics_cube_bot_joints}
\end{align}
\end{subequations}
Since the rotational stiffness for the cubic architecture scales with the square of the cube's height \eqref{eq:detail_kinematics_cubic_stiffness}, the cube's size can be determined based on rotational stiffness requirements.
Subsequently, using Equation \eqref{eq:detail_kinematics_cube_joints}, the dimensions of the top and bottom platforms can be calculated.
\chapter*{Conclusion}
The analysis of the cubic architecture for Stewart platforms yielded several important findings.
While the cubic configuration provides uniform stiffness in the XYZ directions, it stiffness property becomes particularly advantageous when forces and torques are applied at the cube's center.
Under these conditions, the stiffness matrix becomes diagonal, resulting in a decoupled Cartesian plant at low frequencies.
Regarding mobility, the translational capabilities of the cubic configuration exhibit uniformity along the directions of the orthogonal struts, rather than complete uniformity in the Cartesian space.
This understanding refines the characterization of cubic architecture mobility commonly presented in literature.
The analysis of decentralized control in the frame of the struts revealed more nuanced results than expected.
While cubic architectures are frequently associated with reduced coupling between actuators and sensors, this study showed that these benefits may be more subtle or context-dependent than commonly described.
Under the conditions analyzed, the coupling characteristics of cubic and non-cubic configurations, in the frame of the struts, appeared similar.
Fully decoupled dynamics in the Cartesian frame can be achieved when the center of mass of the moving body coincides with the cube's center.
However, this arrangement presents practical challenges, as the cube's center is traditionally located between the top and bottom platforms, making payload placement problematic for many applications.
To address this limitation, modified cubic architectures have been proposed with the cube's center positioned above the top platform.
Three distinct configurations have been identified, each with different geometric arrangements but sharing the common characteristic that the cube's center is positioned above the top platform.
This structural modification enables the alignment of the moving body's center of mass with the center of stiffness, resulting in beneficial decoupling properties in the Cartesian frame.
\printbibliography[heading=bibintoc,title={Bibliography}]
\end{document}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="269.603pt" height="62.315pt" viewBox="0 0 269.603 62.315">
<defs>
<g>
<g id="glyph-0-0">
<path d="M 6.078125 -2.0625 C 6.078125 -2.140625 6.078125 -2.234375 5.953125 -2.234375 C 5.828125 -2.234375 5.828125 -2.171875 5.828125 -2.078125 C 5.75 -0.734375 4.6875 -0.078125 3.765625 -0.078125 C 3.015625 -0.078125 1.40625 -0.546875 1.40625 -3.03125 C 1.40625 -5.515625 3.03125 -5.984375 3.765625 -5.984375 C 4.640625 -5.984375 5.578125 -5.3125 5.78125 -3.875 C 5.796875 -3.765625 5.8125 -3.71875 5.921875 -3.71875 C 6.078125 -3.71875 6.078125 -3.765625 6.078125 -3.953125 L 6.078125 -6.03125 C 6.078125 -6.171875 6.078125 -6.25 5.96875 -6.25 C 5.90625 -6.25 5.875 -6.234375 5.828125 -6.15625 L 5.375 -5.484375 C 5.078125 -5.765625 4.578125 -6.25 3.6875 -6.25 C 1.96875 -6.25 0.5 -4.828125 0.5 -3.03125 C 0.5 -1.203125 1.984375 0.1875 3.6875 0.1875 C 5.15625 0.1875 6.078125 -1.015625 6.078125 -2.0625 Z M 6.078125 -2.0625 "/>
</g>
<g id="glyph-0-1">
<path d="M 4.40625 -0.796875 L 4.40625 -1.28125 L 4.15625 -1.28125 L 4.15625 -0.796875 C 4.15625 -0.703125 4.15625 -0.25 3.84375 -0.25 C 3.515625 -0.25 3.515625 -0.6875 3.515625 -0.828125 L 3.515625 -2.375 C 3.515625 -2.890625 3.515625 -3.1875 3.125 -3.546875 C 2.796875 -3.84375 2.375 -3.96875 1.921875 -3.96875 C 1.1875 -3.96875 0.5625 -3.609375 0.5625 -3.03125 C 0.5625 -2.765625 0.75 -2.609375 0.96875 -2.609375 C 1.21875 -2.609375 1.390625 -2.78125 1.390625 -3.015625 C 1.390625 -3.40625 0.984375 -3.4375 0.984375 -3.4375 C 1.21875 -3.671875 1.65625 -3.75 1.90625 -3.75 C 2.359375 -3.75 2.859375 -3.421875 2.859375 -2.640625 L 2.859375 -2.34375 C 2.390625 -2.328125 1.71875 -2.28125 1.125 -2 C 0.484375 -1.6875 0.296875 -1.21875 0.296875 -0.875 C 0.296875 -0.140625 1.15625 0.09375 1.75 0.09375 C 2.484375 0.09375 2.828125 -0.390625 2.953125 -0.640625 C 2.984375 -0.265625 3.25 0.046875 3.625 0.046875 C 3.859375 0.046875 4.40625 -0.078125 4.40625 -0.796875 Z M 2.859375 -1.25 C 2.859375 -0.390625 2.203125 -0.125 1.8125 -0.125 C 1.390625 -0.125 1 -0.421875 1 -0.875 C 1 -1.453125 1.515625 -2.078125 2.859375 -2.125 Z M 2.859375 -1.25 "/>
</g>
<g id="glyph-0-2">
<path d="M 3.3125 -3.375 C 3.3125 -3.65625 3.046875 -3.921875 2.640625 -3.921875 C 2.109375 -3.921875 1.734375 -3.546875 1.53125 -3 L 1.53125 -3.921875 L 0.265625 -3.828125 L 0.265625 -3.546875 C 0.875 -3.546875 0.953125 -3.484375 0.953125 -3.046875 L 0.953125 -0.6875 C 0.953125 -0.28125 0.859375 -0.28125 0.265625 -0.28125 L 0.265625 0 C 0.734375 -0.015625 0.859375 -0.03125 1.296875 -0.03125 L 2.4375 0 L 2.4375 -0.28125 L 2.25 -0.28125 C 1.609375 -0.28125 1.578125 -0.375 1.578125 -0.703125 L 1.578125 -2.03125 C 1.578125 -2.390625 1.671875 -3.703125 2.6875 -3.703125 L 2.6875 -3.6875 C 2.671875 -3.6875 2.53125 -3.578125 2.53125 -3.359375 C 2.53125 -3.125 2.71875 -2.96875 2.921875 -2.96875 C 3.109375 -2.96875 3.3125 -3.109375 3.3125 -3.375 Z M 3.3125 -3.375 "/>
</g>
<g id="glyph-0-3">
<path d="M 3.03125 -1.09375 L 3.03125 -1.609375 L 2.78125 -1.609375 L 2.78125 -1.125 C 2.78125 -0.46875 2.515625 -0.15625 2.1875 -0.15625 C 1.59375 -0.15625 1.59375 -0.9375 1.59375 -1.09375 L 1.59375 -3.546875 L 2.890625 -3.546875 L 2.890625 -3.828125 L 1.59375 -3.828125 L 1.59375 -5.453125 L 1.34375 -5.453125 C 1.34375 -4.71875 1.03125 -3.796875 0.171875 -3.765625 L 0.171875 -3.546875 L 0.9375 -3.546875 L 0.9375 -1.09375 C 0.9375 -0.109375 1.65625 0.09375 2.125 0.09375 C 2.71875 0.09375 3.03125 -0.46875 3.03125 -1.09375 Z M 3.03125 -1.09375 "/>
</g>
<g id="glyph-0-4">
<path d="M 3.796875 -1.0625 C 3.796875 -1.125 3.75 -1.171875 3.671875 -1.171875 C 3.578125 -1.171875 3.546875 -1.109375 3.546875 -1.078125 C 3.234375 -0.171875 2.453125 -0.15625 2.3125 -0.15625 C 1.890625 -0.15625 1.53125 -0.390625 1.328125 -0.6875 C 1.03125 -1.125 1.015625 -1.65625 1.015625 -2.03125 L 3.546875 -2.03125 C 3.75 -2.03125 3.796875 -2.03125 3.796875 -2.21875 C 3.796875 -3.140625 3.296875 -3.96875 2.15625 -3.96875 C 1.09375 -3.96875 0.25 -3.046875 0.25 -1.953125 C 0.25 -0.796875 1.1875 0.09375 2.265625 0.09375 C 3.359375 0.09375 3.796875 -0.859375 3.796875 -1.0625 Z M 3.1875 -2.25 L 1.03125 -2.25 C 1.109375 -3.609375 1.90625 -3.75 2.15625 -3.75 C 2.640625 -3.75 3.171875 -3.375 3.1875 -2.25 Z M 3.1875 -2.25 "/>
</g>
<g id="glyph-0-5">
<path d="M 3.28125 -1.140625 C 3.28125 -1.53125 3.109375 -1.78125 2.90625 -1.984375 C 2.609375 -2.265625 2.296875 -2.328125 1.640625 -2.453125 C 1.40625 -2.5 0.75 -2.625 0.75 -3.125 C 0.75 -3.40625 0.953125 -3.78125 1.765625 -3.78125 C 2.71875 -3.78125 2.78125 -3.046875 2.796875 -2.828125 C 2.8125 -2.71875 2.8125 -2.65625 2.921875 -2.65625 C 3.046875 -2.65625 3.046875 -2.71875 3.046875 -2.890625 L 3.046875 -3.75 C 3.046875 -3.890625 3.046875 -3.96875 2.953125 -3.96875 C 2.90625 -3.96875 2.890625 -3.96875 2.765625 -3.875 C 2.75 -3.859375 2.671875 -3.765625 2.625 -3.734375 C 2.34375 -3.921875 2.0625 -3.96875 1.765625 -3.96875 C 0.59375 -3.96875 0.296875 -3.328125 0.296875 -2.875 C 0.296875 -2.59375 0.421875 -2.359375 0.625 -2.171875 C 0.9375 -1.890625 1.265625 -1.828125 1.71875 -1.75 C 2.171875 -1.65625 2.328125 -1.640625 2.515625 -1.484375 C 2.609375 -1.40625 2.828125 -1.25 2.828125 -0.90625 C 2.828125 -0.125 1.9375 -0.125 1.8125 -0.125 C 0.90625 -0.125 0.671875 -0.875 0.5625 -1.359375 C 0.546875 -1.453125 0.53125 -1.5 0.421875 -1.5 C 0.296875 -1.5 0.296875 -1.421875 0.296875 -1.265625 L 0.296875 -0.140625 C 0.296875 0.015625 0.296875 0.09375 0.40625 0.09375 C 0.46875 0.09375 0.46875 0.09375 0.625 -0.078125 C 0.671875 -0.140625 0.765625 -0.25 0.8125 -0.296875 C 1.1875 0.078125 1.59375 0.09375 1.8125 0.09375 C 2.90625 0.09375 3.28125 -0.546875 3.28125 -1.140625 Z M 3.28125 -1.140625 "/>
</g>
<g id="glyph-0-6">
<path d="M 2.25 0 L 2.25 -0.28125 C 1.671875 -0.28125 1.640625 -0.3125 1.640625 -0.671875 L 1.640625 -3.921875 L 0.359375 -3.828125 L 0.359375 -3.546875 C 0.921875 -3.546875 1 -3.5 1 -3.0625 L 1 -0.6875 C 1 -0.28125 0.90625 -0.28125 0.3125 -0.28125 L 0.3125 0 C 0.71875 -0.015625 0.90625 -0.03125 1.296875 -0.03125 C 1.4375 -0.03125 1.8125 -0.03125 2.25 0 Z M 1.75 -5.34375 C 1.75 -5.625 1.53125 -5.828125 1.265625 -5.828125 C 1 -5.828125 0.796875 -5.625 0.796875 -5.34375 C 0.796875 -5.078125 1 -4.875 1.265625 -4.875 C 1.53125 -4.875 1.75 -5.078125 1.75 -5.34375 Z M 1.75 -5.34375 "/>
</g>
<g id="glyph-0-7">
<path d="M 4.859375 0 L 4.859375 -0.28125 C 4.40625 -0.28125 4.1875 -0.28125 4.171875 -0.546875 L 4.171875 -2.25 C 4.171875 -2.984375 4.171875 -3.25 3.921875 -3.5625 C 3.71875 -3.8125 3.375 -3.921875 2.9375 -3.921875 C 2.109375 -3.921875 1.734375 -3.3125 1.609375 -3.0625 L 1.59375 -3.0625 L 1.59375 -3.921875 L 0.3125 -3.828125 L 0.3125 -3.546875 C 0.921875 -3.546875 1 -3.484375 1 -3.046875 L 1 -0.6875 C 1 -0.28125 0.890625 -0.28125 0.3125 -0.28125 L 0.3125 0 C 0.734375 -0.015625 0.890625 -0.03125 1.328125 -0.03125 C 1.75 -0.03125 1.859375 -0.015625 2.328125 0 L 2.328125 -0.28125 C 1.75 -0.28125 1.65625 -0.28125 1.65625 -0.6875 L 1.65625 -2.296875 C 1.65625 -3.234375 2.3125 -3.703125 2.875 -3.703125 C 3.40625 -3.703125 3.515625 -3.265625 3.515625 -2.734375 L 3.515625 -0.6875 C 3.515625 -0.28125 3.421875 -0.28125 2.828125 -0.28125 L 2.828125 0 C 3.25 -0.015625 3.421875 -0.03125 3.84375 -0.03125 C 4.265625 -0.03125 4.390625 -0.015625 4.859375 0 Z M 4.859375 0 "/>
</g>
<g id="glyph-0-8">
<path d="M 5.6875 -4.40625 C 5.6875 -5.296875 4.78125 -6.0625 3.546875 -6.0625 L 0.359375 -6.0625 L 0.359375 -5.78125 L 0.5625 -5.78125 C 1.25 -5.78125 1.265625 -5.6875 1.265625 -5.359375 L 1.265625 -0.703125 C 1.265625 -0.375 1.25 -0.28125 0.5625 -0.28125 L 0.359375 -0.28125 L 0.359375 0 C 0.75 -0.03125 1.25 -0.03125 1.65625 -0.03125 C 2.0625 -0.03125 2.5625 -0.03125 2.96875 0 L 2.96875 -0.28125 L 2.765625 -0.28125 C 2.078125 -0.28125 2.0625 -0.375 2.0625 -0.703125 L 2.0625 -2.78125 L 3.546875 -2.78125 C 4.78125 -2.78125 5.6875 -3.5625 5.6875 -4.40625 Z M 4.78125 -4.40625 C 4.78125 -4.015625 4.78125 -3.03125 3.3125 -3.03125 L 2.03125 -3.03125 L 2.03125 -5.421875 C 2.03125 -5.71875 2.046875 -5.78125 2.46875 -5.78125 L 3.3125 -5.78125 C 4.78125 -5.78125 4.78125 -4.8125 4.78125 -4.40625 Z M 4.78125 -4.40625 "/>
</g>
<g id="glyph-0-9">
<path d="M 2.3125 0 L 2.3125 -0.28125 C 1.734375 -0.28125 1.640625 -0.28125 1.640625 -0.6875 L 1.640625 -6.15625 L 0.3125 -6.0625 L 0.3125 -5.78125 C 0.921875 -5.78125 1 -5.71875 1 -5.296875 L 1 -0.6875 C 1 -0.28125 0.90625 -0.28125 0.3125 -0.28125 L 0.3125 0 C 0.734375 -0.015625 0.90625 -0.03125 1.3125 -0.03125 C 1.734375 -0.03125 1.875 -0.015625 2.3125 0 Z M 2.3125 0 "/>
</g>
<g id="glyph-1-0">
<path d="M 5.9375 -6.109375 C 5.96875 -6.265625 5.984375 -6.265625 6.046875 -6.28125 C 6.171875 -6.296875 6.3125 -6.296875 6.421875 -6.296875 C 6.6875 -6.296875 6.84375 -6.296875 6.84375 -6.59375 C 6.84375 -6.609375 6.828125 -6.765625 6.640625 -6.765625 C 6.4375 -6.765625 6.21875 -6.75 6.015625 -6.75 C 5.796875 -6.75 5.5625 -6.734375 5.328125 -6.734375 C 4.953125 -6.734375 4 -6.765625 3.625 -6.765625 C 3.5 -6.765625 3.328125 -6.765625 3.328125 -6.484375 C 3.328125 -6.296875 3.484375 -6.296875 3.65625 -6.296875 L 4 -6.296875 C 4.390625 -6.296875 4.40625 -6.296875 4.640625 -6.265625 L 3.453125 -1.484375 C 3.203125 -0.484375 2.578125 -0.1875 2.125 -0.1875 C 2.046875 -0.1875 1.609375 -0.203125 1.328125 -0.421875 C 1.859375 -0.546875 2.03125 -1.015625 2.03125 -1.28125 C 2.03125 -1.609375 1.765625 -1.84375 1.421875 -1.84375 C 1.03125 -1.84375 0.546875 -1.53125 0.546875 -0.90625 C 0.546875 -0.234375 1.234375 0.171875 2.171875 0.171875 C 3.28125 0.171875 4.46875 -0.28125 4.765625 -1.4375 Z M 5.9375 -6.109375 "/>
</g>
<g id="glyph-1-1">
<path d="M 7.25 -2.078125 C 7.28125 -2.21875 7.296875 -2.234375 7.359375 -2.234375 C 7.484375 -2.25 7.625 -2.25 7.734375 -2.25 C 7.984375 -2.25 8.140625 -2.25 8.140625 -2.546875 C 8.140625 -2.59375 8.109375 -2.71875 7.9375 -2.71875 C 7.71875 -2.71875 7.5 -2.703125 7.265625 -2.703125 C 7.046875 -2.703125 6.828125 -2.6875 6.609375 -2.6875 C 6.21875 -2.6875 5.25 -2.71875 4.84375 -2.71875 C 4.734375 -2.71875 4.546875 -2.71875 4.546875 -2.4375 C 4.546875 -2.25 4.71875 -2.25 4.875 -2.25 L 5.25 -2.25 C 5.359375 -2.25 5.890625 -2.25 5.890625 -2.203125 C 5.890625 -2.1875 5.890625 -2.171875 5.828125 -1.9375 C 5.8125 -1.859375 5.65625 -1.234375 5.65625 -1.21875 C 5.484375 -0.546875 4.6875 -0.296875 4.078125 -0.296875 C 3.5 -0.296875 2.90625 -0.421875 2.4375 -0.78125 C 1.921875 -1.21875 1.921875 -1.90625 1.921875 -2.125 C 1.921875 -2.578125 2.125 -4.34375 3.09375 -5.40625 C 3.65625 -6.046875 4.609375 -6.46875 5.609375 -6.46875 C 6.859375 -6.46875 7.3125 -5.515625 7.3125 -4.703125 C 7.3125 -4.59375 7.28125 -4.453125 7.28125 -4.34375 C 7.28125 -4.203125 7.421875 -4.203125 7.546875 -4.203125 C 7.765625 -4.203125 7.78125 -4.203125 7.828125 -4.421875 L 8.390625 -6.640625 C 8.40625 -6.6875 8.421875 -6.734375 8.421875 -6.796875 C 8.421875 -6.9375 8.28125 -6.9375 8.171875 -6.9375 L 7.25 -6.21875 C 7.0625 -6.421875 6.546875 -6.9375 5.453125 -6.9375 C 2.296875 -6.9375 0.546875 -4.515625 0.546875 -2.5 C 0.546875 -0.6875 1.9375 0.171875 3.765625 0.171875 C 4.796875 0.171875 5.484375 -0.171875 5.8125 -0.515625 C 6.046875 -0.25 6.5625 0 6.625 0 C 6.71875 0 6.75 -0.078125 6.78125 -0.234375 Z M 7.25 -2.078125 "/>
</g>
<g id="glyph-1-2">
<path d="M 5.8125 -4.140625 C 6.46875 -4.609375 8.265625 -5.875 8.609375 -6.046875 C 8.84375 -6.171875 9.046875 -6.28125 9.546875 -6.296875 C 9.734375 -6.3125 9.890625 -6.3125 9.890625 -6.59375 C 9.890625 -6.671875 9.8125 -6.765625 9.71875 -6.765625 C 9.46875 -6.765625 9.171875 -6.734375 8.921875 -6.734375 C 8.515625 -6.734375 8.09375 -6.765625 7.6875 -6.765625 C 7.609375 -6.765625 7.421875 -6.765625 7.421875 -6.484375 C 7.421875 -6.296875 7.59375 -6.296875 7.65625 -6.296875 C 7.734375 -6.296875 7.9375 -6.296875 8.109375 -6.234375 L 3.609375 -3.125 L 4.390625 -6.265625 C 4.609375 -6.296875 4.953125 -6.296875 5.0625 -6.296875 C 5.1875 -6.296875 5.390625 -6.296875 5.421875 -6.328125 C 5.515625 -6.40625 5.53125 -6.578125 5.53125 -6.59375 C 5.53125 -6.71875 5.4375 -6.765625 5.3125 -6.765625 C 5.0625 -6.765625 4.8125 -6.75 4.5625 -6.75 C 4.3125 -6.75 4.078125 -6.734375 3.828125 -6.734375 C 3.5625 -6.734375 3.3125 -6.75 3.0625 -6.75 C 2.8125 -6.75 2.546875 -6.765625 2.28125 -6.765625 C 2.203125 -6.765625 2 -6.765625 2 -6.484375 C 2 -6.296875 2.125 -6.296875 2.421875 -6.296875 C 2.625 -6.296875 2.8125 -6.296875 3.015625 -6.28125 L 1.609375 -0.65625 C 1.5625 -0.5 1.5625 -0.5 1.375 -0.46875 C 1.21875 -0.46875 1.015625 -0.46875 0.859375 -0.46875 C 0.59375 -0.46875 0.578125 -0.46875 0.546875 -0.4375 C 0.421875 -0.375 0.421875 -0.21875 0.421875 -0.171875 C 0.421875 -0.15625 0.4375 0 0.640625 0 C 0.890625 0 1.140625 -0.015625 1.390625 -0.015625 C 1.640625 -0.015625 1.890625 -0.03125 2.140625 -0.03125 C 2.390625 -0.03125 2.65625 -0.015625 2.90625 -0.015625 C 3.15625 -0.015625 3.421875 0 3.671875 0 C 3.765625 0 3.828125 0 3.890625 -0.0625 C 3.9375 -0.125 3.953125 -0.265625 3.953125 -0.28125 C 3.953125 -0.46875 3.8125 -0.46875 3.546875 -0.46875 C 3.34375 -0.46875 3.15625 -0.46875 2.953125 -0.484375 L 3.453125 -2.53125 L 4.6875 -3.375 L 6.15625 -0.515625 C 5.953125 -0.46875 5.65625 -0.46875 5.625 -0.46875 C 5.484375 -0.46875 5.4375 -0.46875 5.375 -0.390625 C 5.328125 -0.34375 5.3125 -0.203125 5.3125 -0.171875 C 5.3125 -0.171875 5.3125 0 5.515625 0 C 5.84375 0 6.65625 -0.03125 6.984375 -0.03125 C 7.1875 -0.03125 7.40625 -0.015625 7.609375 -0.015625 C 7.8125 -0.015625 8.015625 0 8.203125 0 C 8.265625 0 8.46875 0 8.46875 -0.28125 C 8.46875 -0.46875 8.296875 -0.46875 8.15625 -0.46875 C 7.703125 -0.46875 7.6875 -0.5 7.59375 -0.65625 Z M 5.8125 -4.140625 "/>
</g>
<g id="glyph-1-3">
<path d="M 3.4375 -3.4375 L 5.265625 -3.4375 C 5.46875 -3.4375 5.59375 -3.4375 5.765625 -3.578125 C 5.953125 -3.75 5.953125 -3.96875 5.953125 -4 C 5.953125 -4.375 5.59375 -4.375 5.4375 -4.375 L 2.1875 -4.375 C 1.984375 -4.375 1.5625 -4.375 1.03125 -3.90625 C 0.6875 -3.59375 0.3125 -3.09375 0.3125 -2.984375 C 0.3125 -2.84375 0.421875 -2.84375 0.53125 -2.84375 C 0.6875 -2.84375 0.6875 -2.859375 0.78125 -2.96875 C 1.15625 -3.4375 1.796875 -3.4375 1.984375 -3.4375 L 2.875 -3.4375 L 2.53125 -2.390625 C 2.4375 -2.140625 2.21875 -1.515625 2.140625 -1.25 C 2.03125 -0.953125 1.84375 -0.421875 1.84375 -0.3125 C 1.84375 -0.046875 2.0625 0.125 2.3125 0.125 C 2.375 0.125 2.875 0.125 2.984375 -0.53125 Z M 3.4375 -3.4375 "/>
</g>
<g id="glyph-2-0">
<path d="M 5.40625 -1.71875 C 5.40625 -1.890625 5.25 -1.890625 5.140625 -1.890625 L 1 -1.890625 C 0.90625 -1.890625 0.75 -1.890625 0.75 -1.71875 C 0.75 -1.5625 0.90625 -1.5625 1 -1.5625 L 5.140625 -1.5625 C 5.234375 -1.5625 5.40625 -1.5625 5.40625 -1.71875 Z M 5.40625 -1.71875 "/>
</g>
<g id="glyph-2-1">
<path d="M 5.265625 -0.671875 C 5.265625 -0.734375 5.21875 -0.734375 5.1875 -0.734375 C 5.078125 -0.734375 4.796875 -0.625 4.65625 -0.421875 C 4.4375 -0.421875 4.171875 -0.421875 4.046875 -1.046875 L 3.84375 -2.453125 C 3.84375 -2.46875 3.859375 -2.484375 3.875 -2.5 L 4.109375 -2.625 C 6.171875 -3.75 6.171875 -4.0625 6.171875 -4.296875 C 6.171875 -4.5 6.0625 -4.703125 5.78125 -4.703125 C 5.546875 -4.703125 5.21875 -4.46875 5.21875 -4.34375 C 5.21875 -4.296875 5.25 -4.296875 5.296875 -4.28125 C 5.46875 -4.265625 5.53125 -4.109375 5.53125 -3.984375 C 5.53125 -3.84375 5.53125 -3.75 4.90625 -3.375 C 4.765625 -3.28125 4.625 -3.203125 3.8125 -2.75 C 3.71875 -3.265625 3.671875 -3.8125 3.609375 -4.046875 C 3.484375 -4.609375 3.234375 -4.703125 2.921875 -4.703125 C 2.15625 -4.703125 1.765625 -4.203125 1.765625 -4.03125 C 1.765625 -3.96875 1.8125 -3.96875 1.84375 -3.96875 C 1.96875 -3.96875 2.25 -4.09375 2.375 -4.28125 C 2.609375 -4.28125 2.84375 -4.28125 2.984375 -3.71875 L 3.15625 -2.40625 C 2.765625 -2.203125 2.046875 -1.8125 1.625 -1.5625 C 0.53125 -0.890625 0.484375 -0.625 0.484375 -0.40625 C 0.484375 -0.203125 0.59375 0 0.875 0 C 1.078125 0 1.4375 -0.234375 1.4375 -0.359375 C 1.4375 -0.40625 1.390625 -0.421875 1.34375 -0.421875 C 1.1875 -0.4375 1.125 -0.5625 1.125 -0.71875 C 1.125 -0.875 1.125 -0.96875 1.96875 -1.46875 L 3.203125 -2.140625 C 3.296875 -1.609375 3.375 -0.921875 3.390625 -0.765625 C 3.5 -0.3125 3.609375 0 4.109375 0 C 4.859375 0 5.265625 -0.484375 5.265625 -0.671875 Z M 5.265625 -0.671875 "/>
</g>
<g id="glyph-3-0">
<path d="M 2.5625 -2.296875 L 3.484375 -2.296875 C 3.578125 -2.296875 3.90625 -2.296875 3.90625 -2.625 C 3.90625 -2.96875 3.578125 -2.96875 3.484375 -2.96875 L 0.96875 -2.96875 C 0.875 -2.96875 0.53125 -2.96875 0.53125 -2.625 C 0.53125 -2.296875 0.875 -2.296875 0.96875 -2.296875 L 1.890625 -2.296875 L 1.890625 1.046875 C 1.890625 1.140625 1.890625 1.46875 2.21875 1.46875 C 2.5625 1.46875 2.5625 1.125 2.5625 1.046875 Z M 2.5625 -2.296875 "/>
</g>
<g id="glyph-4-0">
<path d="M 3.265625 0 L 3.265625 -0.25 L 3 -0.25 C 2.3125 -0.25 2.3125 -0.34375 2.3125 -0.5625 L 2.3125 -4.375 C 2.3125 -4.5625 2.296875 -4.578125 2.109375 -4.578125 C 1.65625 -4.140625 1.03125 -4.140625 0.75 -4.140625 L 0.75 -3.890625 C 0.921875 -3.890625 1.375 -3.890625 1.75 -4.078125 L 1.75 -0.5625 C 1.75 -0.34375 1.75 -0.25 1.0625 -0.25 L 0.796875 -0.25 L 0.796875 0 L 2.03125 -0.03125 Z M 3.265625 0 "/>
</g>
<g id="glyph-5-0">
<path d="M 9.15625 -6.359375 C 9.265625 -6.765625 8.5625 -6.765625 7.96875 -6.765625 L 3.546875 -6.765625 C 3.078125 -6.71875 2.609375 -6.59375 2.1875 -6.296875 C 1.984375 -6.140625 1.796875 -5.953125 1.734375 -5.734375 C 1.734375 -5.625 1.796875 -5.578125 1.90625 -5.578125 C 2.0625 -5.578125 2.28125 -5.65625 2.5 -5.78125 C 2.578125 -5.8125 2.640625 -5.859375 2.703125 -5.90625 C 2.875 -5.921875 3.078125 -5.921875 3.25 -5.921875 L 4.3125 -5.921875 L 4.140625 -5.171875 C 3.96875 -4.453125 3.75 -3.75 3.484375 -3.0625 C 3.171875 -2.25 2.78125 -1.4375 2.34375 -0.65625 C 2.328125 -0.625 2.3125 -0.578125 2.28125 -0.546875 C 1.90625 -0.578125 1.609375 -0.765625 1.421875 -1.046875 C 1.40625 -1.078125 1.34375 -1.109375 1.265625 -1.109375 C 1.109375 -1.109375 0.890625 -1.03125 0.671875 -0.890625 C 0.359375 -0.734375 0.15625 -0.5 0.15625 -0.359375 C 0.15625 -0.359375 0.15625 -0.328125 0.171875 -0.3125 C 0.4375 0.109375 0.9375 0.328125 1.515625 0.3125 C 1.578125 0.3125 1.640625 0.296875 1.71875 0.28125 C 2.28125 0.1875 2.8125 -0.140625 3.234375 -0.59375 C 3.359375 -0.734375 3.46875 -0.890625 3.5625 -1.046875 C 3.890625 -1.640625 4.1875 -2.25 4.453125 -2.875 L 6.40625 -2.875 C 6.40625 -2.765625 6.46875 -2.734375 6.578125 -2.734375 C 6.71875 -2.734375 6.953125 -2.796875 7.171875 -2.921875 C 7.4375 -3.09375 7.640625 -3.28125 7.6875 -3.421875 L 7.703125 -3.5625 C 7.71875 -3.6875 7.65625 -3.734375 7.546875 -3.734375 L 4.796875 -3.734375 C 5.046875 -4.375 5.25 -5.03125 5.421875 -5.703125 L 5.46875 -5.921875 L 7.046875 -5.921875 C 7.40625 -5.921875 7.921875 -5.921875 7.890625 -5.8125 C 7.890625 -5.703125 7.953125 -5.65625 8.0625 -5.65625 C 8.21875 -5.65625 8.4375 -5.734375 8.65625 -5.859375 C 8.921875 -6.015625 9.125 -6.21875 9.15625 -6.359375 Z M 9.15625 -6.359375 "/>
</g>
<g id="glyph-5-1">
<path d="M 7.40625 -1.53125 C 7.40625 -1.640625 7.28125 -1.640625 7.234375 -1.640625 C 6.9375 -1.640625 6.078125 -1.25 5.96875 -0.75 C 5.484375 -0.75 5.140625 -0.796875 4.34375 -0.953125 C 3.984375 -1.015625 3.203125 -1.15625 2.640625 -1.15625 C 2.5625 -1.15625 2.453125 -1.15625 2.375 -1.15625 C 2.703125 -1.703125 2.828125 -2.171875 3 -2.8125 C 3.1875 -3.59375 3.59375 -4.984375 4.34375 -5.828125 C 4.46875 -5.96875 4.5 -6.015625 4.765625 -6.015625 C 5.21875 -6.015625 5.390625 -5.65625 5.390625 -5.328125 C 5.390625 -5.21875 5.359375 -5.109375 5.359375 -5.078125 C 5.359375 -4.96875 5.484375 -4.953125 5.53125 -4.953125 C 5.671875 -4.953125 5.96875 -5.03125 6.34375 -5.28125 C 6.75 -5.546875 6.796875 -5.734375 6.796875 -6.015625 C 6.796875 -6.515625 6.5 -6.9375 5.84375 -6.9375 C 5.21875 -6.9375 4.3125 -6.625 3.515625 -5.921875 C 2.375 -4.921875 1.890625 -3.296875 1.59375 -2.171875 C 1.453125 -1.578125 1.25 -0.78125 0.8125 -0.453125 C 0.71875 -0.359375 0.390625 -0.109375 0.390625 0.046875 C 0.390625 0.140625 0.5 0.171875 0.5625 0.171875 C 0.625 0.171875 0.9375 0.15625 1.484375 -0.25 C 1.859375 -0.25 2.1875 -0.234375 3.09375 -0.0625 C 3.53125 0.03125 4.25 0.171875 4.8125 0.171875 C 6.125 0.171875 7.40625 -1 7.40625 -1.53125 Z M 7.40625 -1.53125 "/>
</g>
<g id="glyph-5-2">
<path d="M 7.671875 -1.0625 C 7.671875 -1.15625 7.5625 -1.1875 7.5 -1.1875 C 7.328125 -1.1875 7 -1.078125 6.71875 -0.859375 C 6.328125 -0.859375 6.015625 -0.859375 5.859375 -2.078125 L 5.6875 -3.59375 C 8.296875 -5.015625 8.9375 -5.671875 8.9375 -6.1875 C 8.9375 -6.59375 8.578125 -6.765625 8.28125 -6.765625 C 7.84375 -6.765625 7.15625 -6.28125 7.15625 -6.03125 C 7.15625 -5.984375 7.171875 -5.921875 7.328125 -5.90625 C 7.640625 -5.875 7.65625 -5.625 7.65625 -5.578125 C 7.65625 -5.46875 7.625 -5.40625 7.390625 -5.21875 C 6.984375 -4.921875 6.28125 -4.53125 5.625 -4.15625 C 5.484375 -5.0625 5.484375 -5.546875 5.375 -5.984375 C 5.140625 -6.765625 4.640625 -6.765625 4.328125 -6.765625 C 2.984375 -6.765625 2.390625 -5.953125 2.390625 -5.703125 C 2.390625 -5.59375 2.515625 -5.578125 2.578125 -5.578125 C 2.578125 -5.578125 2.90625 -5.578125 3.34375 -5.90625 C 3.65625 -5.90625 4.03125 -5.90625 4.171875 -4.9375 L 4.34375 -3.453125 C 3.671875 -3.09375 2.765625 -2.609375 2.046875 -2.125 C 1.59375 -1.84375 0.546875 -1.171875 0.546875 -0.578125 C 0.546875 -0.171875 0.890625 0 1.21875 0 C 1.640625 0 2.328125 -0.484375 2.328125 -0.734375 C 2.328125 -0.84375 2.21875 -0.84375 2.140625 -0.859375 C 1.96875 -0.875 1.828125 -1.015625 1.828125 -1.1875 C 1.828125 -1.3125 1.875 -1.359375 2.140625 -1.5625 C 2.609375 -1.90625 3.359375 -2.3125 4.40625 -2.90625 C 4.609375 -1.109375 4.640625 -1 4.65625 -0.875 C 4.890625 0 5.40625 0 5.734375 0 C 7.09375 0 7.671875 -0.8125 7.671875 -1.0625 Z M 7.671875 -1.0625 "/>
</g>
<g id="glyph-6-0">
<path d="M 4.375 -2.46875 C 4.375 -3.515625 3.5 -4.375 2.46875 -4.375 C 1.390625 -4.375 0.546875 -3.5 0.546875 -2.46875 C 0.546875 -1.40625 1.421875 -0.546875 2.453125 -0.546875 C 3.53125 -0.546875 4.375 -1.421875 4.375 -2.46875 Z M 4.375 -2.46875 "/>
</g>
</g>
<clipPath id="clip-0">
<path clip-rule="nonzero" d="M 247 17 L 267.941406 17 L 267.941406 49 L 247 49 Z M 247 17 "/>
</clipPath>
<clipPath id="clip-1">
<path clip-rule="nonzero" d="M 1.269531 32 L 254 32 L 254 61.636719 L 1.269531 61.636719 Z M 1.269531 32 "/>
</clipPath>
<clipPath id="clip-2">
<path clip-rule="nonzero" d="M 1.269531 17 L 29 17 L 29 49 L 1.269531 49 Z M 1.269531 17 "/>
</clipPath>
</defs>
<path fill-rule="nonzero" fill="rgb(79.998779%, 79.998779%, 79.998779%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-dasharray="2.98883 2.98883" stroke-miterlimit="10" d="M -21.490921 -18.657756 L 148.209705 -18.657756 L 148.209705 18.658137 L -21.490921 18.658137 Z M -21.490921 -18.657756 " transform="matrix(0.989127, 0, 0, -0.989127, 96.261156, 32.611517)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="127.560101" y="9.888302"/>
<use xlink:href="#glyph-0-1" x="134.143492" y="9.888302"/>
<use xlink:href="#glyph-0-2" x="138.701224" y="9.888302"/>
<use xlink:href="#glyph-0-3" x="142.266525" y="9.888302"/>
<use xlink:href="#glyph-0-4" x="145.811428" y="9.888302"/>
<use xlink:href="#glyph-0-5" x="149.866292" y="9.888302"/>
<use xlink:href="#glyph-0-6" x="153.461748" y="9.888302"/>
<use xlink:href="#glyph-0-1" x="155.993821" y="9.888302"/>
<use xlink:href="#glyph-0-7" x="160.551553" y="9.888302"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-8" x="168.648866" y="9.888302"/>
<use xlink:href="#glyph-0-9" x="174.85178" y="9.888302"/>
<use xlink:href="#glyph-0-1" x="177.383854" y="9.888302"/>
<use xlink:href="#glyph-0-7" x="181.941586" y="9.888302"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-3" x="186.757403" y="9.888302"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M -17.008591 -14.171476 L 17.009728 -14.171476 L 17.009728 14.171857 L -17.008591 14.171857 Z M -17.008591 -14.171476 " transform="matrix(0.989127, 0, 0, -0.989127, 96.261156, 32.611517)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="87.097884" y="36.535383"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="94.310598" y="32.9587"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-0" x="100.469799" y="32.9587"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 46.352207 -14.171476 L 80.366577 -14.171476 L 80.366577 14.171857 L 46.352207 14.171857 Z M 46.352207 -14.171476 " transform="matrix(0.989127, 0, 0, -0.989127, 96.261156, 32.611517)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-1" x="154.56129" y="35.992353"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 109.709056 -14.171476 L 143.727375 -14.171476 L 143.727375 14.171857 L 109.709056 14.171857 Z M 109.709056 -14.171476 " transform="matrix(0.989127, 0, 0, -0.989127, 96.261156, 32.611517)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="212.703163" y="36.622427"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="219.916866" y="33.046733"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-0" x="226.076067" y="33.046733"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M -80.36544 -14.171476 L -46.35107 -14.171476 L -46.35107 14.171857 L -80.36544 14.171857 Z M -80.36544 -14.171476 " transform="matrix(0.989127, 0, 0, -0.989127, 96.261156, 32.611517)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-2" x="25.230958" y="35.253475"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-1" x="34.800762" y="36.731231"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M -45.853472 -0.00178398 L -22.138588 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 96.261156, 32.611517)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054312 -0.00178398 L 1.607525 1.68452 L 3.088471 -0.00178398 L 1.607525 -1.684139 Z M 6.054312 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 71.554485, 32.611517)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-0" x="60.414205" y="28.83503"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 17.507326 -0.00178398 L 41.218261 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 96.261156, 32.611517)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.051981 -0.00178398 L 1.609143 1.68452 L 3.08614 -0.00178398 L 1.609143 -1.684139 Z M 6.051981 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 134.22476, 32.611517)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-3" x="131.377142" y="28.83503"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 80.864175 -0.00178398 L 104.579059 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 96.261156, 32.611517)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053599 -0.00178398 L 1.606811 1.68452 L 3.087758 -0.00178398 L 1.606811 -1.684139 Z M 6.053599 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 196.895034, 32.611517)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-1" x="192.739613" y="28.83503"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 144.224973 -0.00178398 L 167.935907 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 96.261156, 32.611517)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 265.554688 32.613281 L 261.15625 30.945312 L 262.621094 32.613281 L 261.15625 34.277344 Z M 265.554688 32.613281 "/>
<g clip-path="url(#clip-0)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.055207 -0.00178398 L 1.608419 1.68452 L 3.089365 -0.00178398 L 1.608419 -1.684139 Z M 6.055207 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 259.565319, 32.611517)"/>
</g>
<g clip-path="url(#clip-1)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 158.398614 -0.00178398 L 158.398614 -28.345118 L -95.040628 -28.345118 L -95.040628 -0.00178398 L -85.499386 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 96.261156, 32.611517)"/>
</g>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 14.871094 32.613281 L 10.476562 30.945312 L 11.9375 32.613281 L 10.476562 34.277344 Z M 14.871094 32.613281 "/>
<g clip-path="url(#clip-2)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052704 -0.00178398 L 1.609866 1.68452 L 3.086863 -0.00178398 L 1.609866 -1.684139 Z M 6.052704 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 8.884201, 32.611517)"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-6-0" x="250.470999" y="34.801444"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-2" x="248.186115" y="28.83503"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -0,0 +1,185 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="194.947pt" height="141.381pt" viewBox="0 0 194.947 141.381">
<defs>
<g>
<g id="glyph-0-0">
<path d="M 4.390625 -2.484375 C 4.390625 -3.546875 3.515625 -4.40625 2.484375 -4.40625 C 1.40625 -4.40625 0.5625 -3.515625 0.5625 -2.484375 C 0.5625 -1.421875 1.421875 -0.5625 2.46875 -0.5625 C 3.546875 -0.5625 4.390625 -1.4375 4.390625 -2.484375 Z M 4.390625 -2.484375 "/>
</g>
<g id="glyph-0-1">
<path d="M 4.234375 2.375 C 4.234375 2.265625 4.171875 2.265625 4.078125 2.265625 C 3.296875 2.21875 2.921875 1.765625 2.84375 1.40625 C 2.8125 1.296875 2.8125 1.28125 2.8125 0.9375 L 2.8125 -0.5625 C 2.8125 -0.859375 2.8125 -1.359375 2.78125 -1.453125 C 2.65625 -2.109375 2.03125 -2.375 1.640625 -2.484375 C 2.8125 -2.8125 2.8125 -3.515625 2.8125 -3.796875 L 2.8125 -5.59375 C 2.8125 -6.296875 2.8125 -6.515625 3.046875 -6.765625 C 3.21875 -6.9375 3.453125 -7.1875 4.140625 -7.21875 C 4.203125 -7.234375 4.234375 -7.265625 4.234375 -7.328125 C 4.234375 -7.4375 4.15625 -7.4375 4.03125 -7.4375 C 3.046875 -7.4375 2.15625 -6.9375 2.140625 -6.21875 L 2.140625 -4.40625 C 2.140625 -3.46875 2.140625 -3.3125 1.890625 -3.03125 C 1.75 -2.890625 1.484375 -2.625 0.859375 -2.59375 C 0.78125 -2.59375 0.71875 -2.578125 0.71875 -2.484375 C 0.71875 -2.375 0.78125 -2.375 0.875 -2.375 C 1.296875 -2.34375 2.140625 -2.140625 2.140625 -1.140625 L 2.140625 0.828125 C 2.140625 1.40625 2.140625 1.734375 2.65625 2.109375 C 3.078125 2.40625 3.734375 2.484375 4.03125 2.484375 C 4.15625 2.484375 4.234375 2.484375 4.234375 2.375 Z M 4.234375 2.375 "/>
</g>
<g id="glyph-0-2">
<path d="M 4.234375 -2.484375 C 4.234375 -2.578125 4.171875 -2.578125 4.078125 -2.59375 C 3.65625 -2.625 2.8125 -2.828125 2.8125 -3.8125 L 2.8125 -5.78125 C 2.8125 -6.359375 2.8125 -6.703125 2.296875 -7.0625 C 1.859375 -7.359375 1.234375 -7.4375 0.90625 -7.4375 C 0.8125 -7.4375 0.71875 -7.4375 0.71875 -7.328125 C 0.71875 -7.234375 0.78125 -7.234375 0.875 -7.21875 C 1.65625 -7.171875 2.03125 -6.734375 2.109375 -6.375 C 2.140625 -6.265625 2.140625 -6.234375 2.140625 -5.890625 L 2.140625 -4.40625 C 2.140625 -4.109375 2.140625 -3.609375 2.15625 -3.5 C 2.296875 -2.84375 2.921875 -2.59375 3.3125 -2.484375 C 2.140625 -2.140625 2.140625 -1.4375 2.140625 -1.15625 L 2.140625 0.625 C 2.140625 1.34375 2.140625 1.5625 1.90625 1.8125 C 1.71875 1.984375 1.5 2.21875 0.796875 2.265625 C 0.75 2.265625 0.71875 2.3125 0.71875 2.375 C 0.71875 2.484375 0.8125 2.484375 0.90625 2.484375 C 1.90625 2.484375 2.78125 1.96875 2.8125 1.265625 L 2.8125 -0.5625 C 2.8125 -1.484375 2.8125 -1.640625 3.0625 -1.921875 C 3.203125 -2.0625 3.46875 -2.328125 4.09375 -2.375 C 4.171875 -2.375 4.234375 -2.375 4.234375 -2.484375 Z M 4.234375 -2.484375 "/>
</g>
<g id="glyph-1-0">
<path d="M 2.78125 -6.53125 C 2.828125 -6.671875 2.828125 -6.703125 2.828125 -6.703125 C 2.828125 -6.84375 2.71875 -6.890625 2.609375 -6.890625 C 2.5625 -6.890625 2.5625 -6.890625 2.546875 -6.875 L 1.265625 -6.8125 C 1.125 -6.8125 0.9375 -6.796875 0.9375 -6.515625 C 0.9375 -6.34375 1.125 -6.34375 1.203125 -6.34375 C 1.3125 -6.34375 1.484375 -6.34375 1.625 -6.3125 C 1.53125 -5.984375 1.4375 -5.5625 1.34375 -5.171875 L 0.65625 -2.4375 C 0.515625 -1.890625 0.515625 -1.765625 0.515625 -1.53125 C 0.515625 -0.265625 1.453125 0.078125 2.203125 0.078125 C 4 0.078125 5.015625 -1.53125 5.015625 -2.84375 C 5.015625 -4.0625 4.109375 -4.484375 3.28125 -4.484375 C 2.8125 -4.484375 2.40625 -4.296875 2.203125 -4.171875 Z M 2.21875 -0.28125 C 1.828125 -0.28125 1.515625 -0.484375 1.515625 -1.09375 C 1.515625 -1.421875 1.609375 -1.78125 1.671875 -2.09375 C 1.78125 -2.46875 1.9375 -3.15625 2.015625 -3.453125 C 2.0625 -3.625 2.625 -4.125 3.234375 -4.125 C 3.84375 -4.125 3.90625 -3.59375 3.90625 -3.375 C 3.90625 -2.859375 3.5625 -1.640625 3.40625 -1.25 C 3.0625 -0.453125 2.515625 -0.28125 2.21875 -0.28125 Z M 2.21875 -0.28125 "/>
</g>
<g id="glyph-2-0">
<path d="M 3.5625 -1.203125 C 3.5625 -1.734375 3.125 -2.28125 2.359375 -2.4375 C 3.09375 -2.703125 3.34375 -3.21875 3.34375 -3.65625 C 3.34375 -4.203125 2.71875 -4.609375 1.953125 -4.609375 C 1.171875 -4.609375 0.59375 -4.234375 0.59375 -3.671875 C 0.59375 -3.4375 0.75 -3.3125 0.953125 -3.3125 C 1.171875 -3.3125 1.296875 -3.46875 1.296875 -3.65625 C 1.296875 -3.859375 1.171875 -4.015625 0.953125 -4.03125 C 1.1875 -4.328125 1.671875 -4.40625 1.921875 -4.40625 C 2.234375 -4.40625 2.671875 -4.25 2.671875 -3.65625 C 2.671875 -3.359375 2.578125 -3.03125 2.40625 -2.828125 C 2.171875 -2.5625 1.984375 -2.546875 1.625 -2.53125 C 1.453125 -2.515625 1.4375 -2.515625 1.40625 -2.5 C 1.40625 -2.5 1.34375 -2.484375 1.34375 -2.421875 C 1.34375 -2.3125 1.40625 -2.3125 1.515625 -2.3125 L 1.890625 -2.3125 C 2.4375 -2.3125 2.828125 -1.9375 2.828125 -1.203125 C 2.828125 -0.34375 2.328125 -0.078125 1.921875 -0.078125 C 1.640625 -0.078125 1.03125 -0.15625 0.75 -0.5625 C 1.0625 -0.578125 1.140625 -0.8125 1.140625 -0.953125 C 1.140625 -1.171875 0.984375 -1.34375 0.765625 -1.34375 C 0.5625 -1.34375 0.375 -1.21875 0.375 -0.9375 C 0.375 -0.28125 1.09375 0.140625 1.9375 0.140625 C 2.90625 0.140625 3.5625 -0.5 3.5625 -1.203125 Z M 3.5625 -1.203125 "/>
</g>
<g id="glyph-2-1">
<path d="M 3.671875 -1.140625 L 3.671875 -1.390625 L 2.90625 -1.390625 L 2.90625 -4.484375 C 2.90625 -4.625 2.90625 -4.671875 2.75 -4.671875 C 2.65625 -4.671875 2.640625 -4.671875 2.5625 -4.578125 L 0.265625 -1.390625 L 0.265625 -1.140625 L 2.3125 -1.140625 L 2.3125 -0.5625 C 2.3125 -0.328125 2.3125 -0.25 1.75 -0.25 L 1.5625 -0.25 L 1.5625 0 L 2.609375 -0.03125 L 3.65625 0 L 3.65625 -0.25 L 3.46875 -0.25 C 2.90625 -0.25 2.90625 -0.328125 2.90625 -0.5625 L 2.90625 -1.140625 Z M 2.359375 -1.390625 L 0.53125 -1.390625 L 2.359375 -3.921875 Z M 2.359375 -1.390625 "/>
</g>
<g id="glyph-2-2">
<path d="M 3.5 -1.390625 C 3.5 -2.171875 2.90625 -2.90625 2.046875 -2.90625 C 1.734375 -2.90625 1.375 -2.828125 1.078125 -2.5625 L 1.078125 -3.875 C 1.421875 -3.78125 1.640625 -3.78125 1.75 -3.78125 C 2.65625 -3.78125 3.203125 -4.40625 3.203125 -4.515625 C 3.203125 -4.578125 3.15625 -4.609375 3.125 -4.609375 C 3.125 -4.609375 3.09375 -4.609375 3.0625 -4.578125 C 2.90625 -4.515625 2.53125 -4.390625 2.015625 -4.390625 C 1.828125 -4.390625 1.453125 -4.390625 1 -4.578125 C 0.9375 -4.609375 0.921875 -4.609375 0.921875 -4.609375 C 0.828125 -4.609375 0.828125 -4.53125 0.828125 -4.421875 L 0.828125 -2.375 C 0.828125 -2.25 0.828125 -2.171875 0.9375 -2.171875 C 1 -2.171875 1 -2.1875 1.078125 -2.265625 C 1.375 -2.65625 1.796875 -2.703125 2.046875 -2.703125 C 2.453125 -2.703125 2.640625 -2.375 2.671875 -2.3125 C 2.796875 -2.09375 2.84375 -1.828125 2.84375 -1.421875 C 2.84375 -1.21875 2.84375 -0.8125 2.640625 -0.5 C 2.46875 -0.25 2.171875 -0.078125 1.828125 -0.078125 C 1.375 -0.078125 0.90625 -0.328125 0.734375 -0.796875 C 1 -0.765625 1.125 -0.9375 1.125 -1.125 C 1.125 -1.421875 0.875 -1.484375 0.78125 -1.484375 C 0.78125 -1.484375 0.4375 -1.484375 0.4375 -1.109375 C 0.4375 -0.484375 1 0.140625 1.84375 0.140625 C 2.71875 0.140625 3.5 -0.515625 3.5 -1.390625 Z M 3.5 -1.390625 "/>
</g>
<g id="glyph-2-3">
<path d="M 3.5625 -1.421875 C 3.5625 -2.296875 2.859375 -2.953125 2.046875 -2.953125 C 1.5 -2.953125 1.1875 -2.578125 1.046875 -2.265625 C 1.046875 -2.84375 1.09375 -3.34375 1.359375 -3.78125 C 1.59375 -4.15625 1.96875 -4.40625 2.40625 -4.40625 C 2.609375 -4.40625 2.890625 -4.34375 3.03125 -4.15625 C 2.859375 -4.15625 2.71875 -4.03125 2.71875 -3.828125 C 2.71875 -3.65625 2.828125 -3.5 3.03125 -3.5 C 3.25 -3.5 3.375 -3.640625 3.375 -3.84375 C 3.375 -4.25 3.078125 -4.609375 2.390625 -4.609375 C 1.390625 -4.609375 0.375 -3.6875 0.375 -2.203125 C 0.375 -0.40625 1.21875 0.140625 1.984375 0.140625 C 2.828125 0.140625 3.5625 -0.5 3.5625 -1.421875 Z M 2.90625 -1.421875 C 2.90625 -1.015625 2.90625 -0.734375 2.71875 -0.453125 C 2.546875 -0.21875 2.328125 -0.078125 1.984375 -0.078125 C 1.640625 -0.078125 1.359375 -0.28125 1.21875 -0.59375 C 1.109375 -0.796875 1.0625 -1.140625 1.0625 -1.5625 C 1.0625 -2.234375 1.46875 -2.75 2.015625 -2.75 C 2.34375 -2.75 2.546875 -2.625 2.71875 -2.375 C 2.890625 -2.109375 2.90625 -1.8125 2.90625 -1.421875 Z M 2.90625 -1.421875 "/>
</g>
<g id="glyph-2-4">
<path d="M 3.28125 0 L 3.28125 -0.25 L 3.015625 -0.25 C 2.328125 -0.25 2.328125 -0.34375 2.328125 -0.5625 L 2.328125 -4.40625 C 2.328125 -4.59375 2.3125 -4.609375 2.109375 -4.609375 C 1.671875 -4.171875 1.046875 -4.15625 0.75 -4.15625 L 0.75 -3.90625 C 0.921875 -3.90625 1.375 -3.90625 1.765625 -4.109375 L 1.765625 -0.5625 C 1.765625 -0.34375 1.765625 -0.25 1.0625 -0.25 L 0.8125 -0.25 L 0.8125 0 L 2.046875 -0.03125 Z M 3.28125 0 "/>
</g>
<g id="glyph-2-5">
<path d="M 3.5 -1.265625 L 3.265625 -1.265625 C 3.25 -1.109375 3.171875 -0.703125 3.09375 -0.625 C 3.03125 -0.59375 2.5 -0.59375 2.40625 -0.59375 L 1.125 -0.59375 C 1.859375 -1.234375 2.09375 -1.421875 2.515625 -1.75 C 3.03125 -2.171875 3.5 -2.59375 3.5 -3.25 C 3.5 -4.09375 2.765625 -4.609375 1.875 -4.609375 C 1.015625 -4.609375 0.4375 -4 0.4375 -3.359375 C 0.4375 -3.015625 0.734375 -2.96875 0.8125 -2.96875 C 0.96875 -2.96875 1.171875 -3.09375 1.171875 -3.34375 C 1.171875 -3.46875 1.125 -3.71875 0.765625 -3.71875 C 0.984375 -4.203125 1.453125 -4.359375 1.78125 -4.359375 C 2.46875 -4.359375 2.828125 -3.8125 2.828125 -3.25 C 2.828125 -2.65625 2.40625 -2.171875 2.171875 -1.921875 L 0.5 -0.265625 C 0.4375 -0.203125 0.4375 -0.1875 0.4375 0 L 3.296875 0 Z M 3.5 -1.265625 "/>
</g>
<g id="glyph-3-0">
<path d="M 6.96875 -2.140625 C 6.96875 -2.859375 6.390625 -3.4375 5.421875 -3.546875 C 6.453125 -3.734375 7.5 -4.46875 7.5 -5.40625 C 7.5 -6.140625 6.84375 -6.78125 5.65625 -6.78125 L 2.328125 -6.78125 C 2.140625 -6.78125 2.03125 -6.78125 2.03125 -6.578125 C 2.03125 -6.46875 2.125 -6.46875 2.3125 -6.46875 C 2.3125 -6.46875 2.515625 -6.46875 2.6875 -6.453125 C 2.875 -6.421875 2.953125 -6.421875 2.953125 -6.296875 C 2.953125 -6.25 2.953125 -6.21875 2.921875 -6.109375 L 1.59375 -0.78125 C 1.484375 -0.390625 1.46875 -0.3125 0.6875 -0.3125 C 0.515625 -0.3125 0.421875 -0.3125 0.421875 -0.109375 C 0.421875 0 0.5 0 0.6875 0 L 4.234375 0 C 5.796875 0 6.96875 -1.171875 6.96875 -2.140625 Z M 6.59375 -5.453125 C 6.59375 -4.578125 5.75 -3.625 4.53125 -3.625 L 3.078125 -3.625 L 3.703125 -6.09375 C 3.796875 -6.4375 3.8125 -6.46875 4.234375 -6.46875 L 5.515625 -6.46875 C 6.390625 -6.46875 6.59375 -5.890625 6.59375 -5.453125 Z M 6.046875 -2.25 C 6.046875 -1.265625 5.15625 -0.3125 3.984375 -0.3125 L 2.640625 -0.3125 C 2.5 -0.3125 2.484375 -0.3125 2.421875 -0.3125 C 2.328125 -0.328125 2.296875 -0.34375 2.296875 -0.421875 C 2.296875 -0.453125 2.296875 -0.46875 2.34375 -0.640625 L 3.03125 -3.40625 L 4.90625 -3.40625 C 5.859375 -3.40625 6.046875 -2.671875 6.046875 -2.25 Z M 6.046875 -2.25 "/>
</g>
<g id="glyph-3-1">
<path d="M 6.421875 -2.375 C 6.421875 -2.484375 6.296875 -2.484375 6.296875 -2.484375 C 6.234375 -2.484375 6.1875 -2.453125 6.171875 -2.375 C 6.078125 -2.09375 5.859375 -1.390625 5.171875 -0.8125 C 4.484375 -0.265625 3.859375 -0.09375 3.34375 -0.09375 C 2.453125 -0.09375 1.40625 -0.609375 1.40625 -2.15625 C 1.40625 -2.71875 1.609375 -4.328125 2.59375 -5.484375 C 3.203125 -6.1875 4.140625 -6.6875 5.015625 -6.6875 C 6.03125 -6.6875 6.625 -5.921875 6.625 -4.765625 C 6.625 -4.375 6.59375 -4.359375 6.59375 -4.265625 C 6.59375 -4.171875 6.703125 -4.171875 6.734375 -4.171875 C 6.859375 -4.171875 6.859375 -4.1875 6.921875 -4.359375 L 7.546875 -6.890625 C 7.546875 -6.921875 7.515625 -7 7.4375 -7 C 7.40625 -7 7.390625 -6.984375 7.28125 -6.875 L 6.59375 -6.109375 C 6.5 -6.25 6.046875 -7 4.9375 -7 C 2.734375 -7 0.5 -4.796875 0.5 -2.5 C 0.5 -0.859375 1.671875 0.21875 3.1875 0.21875 C 4.046875 0.21875 4.796875 -0.171875 5.328125 -0.640625 C 6.25 -1.453125 6.421875 -2.34375 6.421875 -2.375 Z M 6.421875 -2.375 "/>
</g>
<g id="glyph-3-2">
<path d="M 7.125 -0.203125 C 7.125 -0.3125 7.03125 -0.3125 6.84375 -0.3125 C 6.484375 -0.3125 6.203125 -0.3125 6.203125 -0.484375 C 6.203125 -0.546875 6.21875 -0.59375 6.234375 -0.65625 L 7.578125 -6.015625 C 7.65625 -6.375 7.671875 -6.46875 8.40625 -6.46875 C 8.65625 -6.46875 8.734375 -6.46875 8.734375 -6.671875 C 8.734375 -6.78125 8.625 -6.78125 8.609375 -6.78125 L 7.328125 -6.75 L 6.046875 -6.78125 C 5.96875 -6.78125 5.859375 -6.78125 5.859375 -6.578125 C 5.859375 -6.46875 5.953125 -6.46875 6.140625 -6.46875 C 6.140625 -6.46875 6.34375 -6.46875 6.515625 -6.453125 C 6.703125 -6.421875 6.78125 -6.421875 6.78125 -6.296875 C 6.78125 -6.25 6.78125 -6.234375 6.75 -6.109375 L 6.15625 -3.6875 L 3.125 -3.6875 L 3.703125 -6.015625 C 3.796875 -6.375 3.828125 -6.46875 4.546875 -6.46875 C 4.796875 -6.46875 4.875 -6.46875 4.875 -6.671875 C 4.875 -6.78125 4.765625 -6.78125 4.75 -6.78125 L 3.46875 -6.75 L 2.1875 -6.78125 C 2.109375 -6.78125 2 -6.78125 2 -6.578125 C 2 -6.46875 2.09375 -6.46875 2.28125 -6.46875 C 2.28125 -6.46875 2.484375 -6.46875 2.65625 -6.453125 C 2.84375 -6.421875 2.921875 -6.421875 2.921875 -6.296875 C 2.921875 -6.25 2.921875 -6.21875 2.890625 -6.109375 L 1.5625 -0.78125 C 1.453125 -0.390625 1.4375 -0.3125 0.65625 -0.3125 C 0.46875 -0.3125 0.390625 -0.3125 0.390625 -0.109375 C 0.390625 0 0.53125 0 0.53125 0 L 1.78125 -0.03125 L 2.421875 -0.015625 C 2.640625 -0.015625 2.859375 0 3.0625 0 C 3.140625 0 3.265625 0 3.265625 -0.203125 C 3.265625 -0.3125 3.171875 -0.3125 2.984375 -0.3125 C 2.625 -0.3125 2.34375 -0.3125 2.34375 -0.484375 C 2.34375 -0.546875 2.359375 -0.59375 2.375 -0.65625 L 3.046875 -3.375 L 6.078125 -3.375 L 5.390625 -0.640625 C 5.28125 -0.3125 5.09375 -0.3125 4.484375 -0.3125 C 4.328125 -0.3125 4.25 -0.3125 4.25 -0.109375 C 4.25 0 4.390625 0 4.390625 0 L 5.640625 -0.03125 L 6.28125 -0.015625 C 6.5 -0.015625 6.71875 0 6.921875 0 C 7 0 7.125 0 7.125 -0.203125 Z M 7.125 -0.203125 "/>
</g>
</g>
<clipPath id="clip-0">
<path clip-rule="nonzero" d="M 3 22 L 192 22 L 192 140.765625 L 3 140.765625 Z M 3 22 "/>
</clipPath>
</defs>
<g clip-path="url(#clip-0)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M -0.00131091 61.737109 L 80.176321 141.910817 L 80.176321 80.176866 L -0.00131091 160.354497 L -80.178943 80.176866 L -80.178943 141.910817 L -0.00131091 61.737109 " transform="matrix(0.995641, 0, 0, -0.995641, 97.446618, 196.221893)"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="94.967472" y="136.960355"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="174.793972" y="57.133854"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="174.793972" y="118.599742"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="94.967472" y="38.773241"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="15.140972" y="118.599742"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="15.140972" y="57.133854"/>
</g>
<path fill-rule="nonzero" fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="0.2" d="M 113.410156 118.789062 L 177.273438 104.101562 L 161.308594 100.429688 L 33.585938 100.429688 L 17.617188 104.101562 L 81.480469 118.789062 Z M 113.410156 118.789062 "/>
<path fill-rule="nonzero" fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="0.2" d="M 161.308594 70.894531 L 177.273438 67.222656 L 113.410156 52.53125 L 81.480469 52.53125 L 17.617188 67.222656 L 33.585938 70.894531 Z M 161.308594 70.894531 "/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-dasharray="2.98883 2.98883" stroke-miterlimit="10" d="M 16.033431 77.77185 L 80.176321 92.523656 L 64.141579 96.211607 L -64.140278 96.211607 L -80.178943 92.523656 L -16.036053 77.77185 Z M 16.033431 77.77185 " transform="matrix(0.995641, 0, 0, -0.995641, 97.446618, 196.221893)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-dasharray="2.98883 2.98883" stroke-miterlimit="10" d="M 64.141579 125.876075 L 80.176321 129.564027 L 16.033431 144.319756 L -16.036053 144.319756 L -80.178943 129.564027 L -64.140278 125.876075 Z M 64.141579 125.876075 " transform="matrix(0.995641, 0, 0, -0.995641, 97.446618, 196.221893)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-miterlimit="10" d="M 16.033431 77.77185 L 64.141579 125.876075 " transform="matrix(0.995641, 0, 0, -0.995641, 97.446618, 196.221893)"/>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="110.932573" y="120.995254"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="158.827876" y="73.098955"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="165.11037" y="81.584802"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="170.27675" y="83.073285"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-miterlimit="10" d="M 80.176321 92.523656 L 80.176321 129.564027 " transform="matrix(0.995641, 0, 0, -0.995641, 97.446618, 196.221893)"/>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="174.793972" y="106.306564"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="174.793972" y="69.427032"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="181.07547" y="69.922861"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-2-1" x="186.241851" y="71.410348"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-miterlimit="10" d="M 64.141579 96.211607 L 16.033431 144.319756 " transform="matrix(0.995641, 0, 0, -0.995641, 97.446618, 196.221893)"/>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="158.828871" y="102.634641"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="110.932573" y="54.738342"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="117.214071" y="47.244154"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-2-2" x="122.380451" y="48.731641"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-miterlimit="10" d="M -64.140278 96.211607 L -16.036053 144.319756 " transform="matrix(0.995641, 0, 0, -0.995641, 97.446618, 196.221893)"/>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="31.106073" y="102.634641"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="79.002371" y="54.738342"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="68.064261" y="47.244154"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-2-3" x="73.230641" y="48.731641"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-miterlimit="10" d="M -80.178943 92.523656 L -80.178943 129.564027 " transform="matrix(0.995641, 0, 0, -0.995641, 97.446618, 196.221893)"/>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="15.140972" y="106.306564"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="15.140972" y="69.427032"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="4.202861" y="69.922861"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-2-4" x="9.368246" y="71.410348"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-miterlimit="10" d="M -16.036053 77.77185 L -64.140278 125.876075 " transform="matrix(0.995641, 0, 0, -0.995641, 97.446618, 196.221893)"/>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="79.002371" y="120.995254"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="31.105077" y="73.098955"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="20.166967" y="81.584802"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-2-5" x="25.332351" y="83.073285"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(46.665955%, 67.059326%, 18.429565%)" stroke-opacity="1" stroke-miterlimit="10" d="M -0.00131091 167.738247 L -7.636155 160.099479 " transform="matrix(0.995641, 0, 0, -0.995641, 97.446618, 196.221893)"/>
<path fill-rule="nonzero" fill="rgb(46.665955%, 67.059326%, 18.429565%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(46.665955%, 67.059326%, 18.429565%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054717 -0.000860949 L 1.607585 1.683112 L 3.086264 -0.000860949 L 1.610359 -1.68206 Z M 6.054717 -0.000860949 " transform="matrix(-0.704018, 0.704018, 0.704018, 0.704018, 91.841359, 34.82001)"/>
<g fill="rgb(46.665955%, 67.059326%, 18.429565%)" fill-opacity="1">
<use xlink:href="#glyph-0-1" x="101.247974" y="22.935583"/>
</g>
<g fill="rgb(46.665955%, 67.059326%, 18.429565%)" fill-opacity="1">
<use xlink:href="#glyph-3-0" x="106.20756" y="22.935583"/>
</g>
<g fill="rgb(46.665955%, 67.059326%, 18.429565%)" fill-opacity="1">
<use xlink:href="#glyph-0-2" x="114.22721" y="22.935583"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(46.665955%, 67.059326%, 18.429565%)" stroke-opacity="1" stroke-miterlimit="10" d="M -0.00131091 167.738247 L 23.711432 167.738247 " transform="matrix(0.995641, 0, 0, -0.995641, 97.446618, 196.221893)"/>
<path fill-rule="nonzero" fill="rgb(46.665955%, 67.059326%, 18.429565%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(46.665955%, 67.059326%, 18.429565%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053851 -0.0000933579 L 1.608692 1.683025 L 3.087796 -0.0000933579 L 1.608692 -1.683212 Z M 6.053851 -0.0000933579 " transform="matrix(0.995641, 0, 0, -0.995641, 118.230352, 29.214751)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(46.665955%, 67.059326%, 18.429565%)" stroke-opacity="1" stroke-miterlimit="10" d="M -0.00131091 167.738247 L -0.00131091 191.450989 " transform="matrix(0.995641, 0, 0, -0.995641, 97.446618, 196.221893)"/>
<path fill-rule="nonzero" fill="rgb(46.665955%, 67.059326%, 18.429565%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(46.665955%, 67.059326%, 18.429565%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.055058 0.00131091 L 1.6099 1.684429 L 3.089004 0.00131091 L 1.6099 -1.681807 Z M 6.055058 0.00131091 " transform="matrix(0, -0.995641, -0.995641, 0, 97.446618, 8.431007)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="94.966476" y="87.867296"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-1" x="101.247974" y="88.142093"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-1" x="106.20756" y="88.142093"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-2" x="114.010972" y="88.142093"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-dasharray="2.98883 2.98883" stroke-miterlimit="10" d="M -0.00131091 115.679282 L -0.00131091 163.104767 " transform="matrix(0.995641, 0, 0, -0.995641, 97.446618, 196.221893)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054667 -0.00131091 L 1.609508 1.681807 L 3.088612 -0.00131091 L 1.609508 -1.684429 Z M 6.054667 -0.00131091 " transform="matrix(0, 0.995641, 0.995641, 0, 97.446618, 78.221726)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.051723 0.00131091 L 1.610488 1.684429 L 3.085669 0.00131091 L 1.610488 -1.681807 Z M 6.051723 0.00131091 " transform="matrix(0, -0.995641, -0.995641, 0, 97.446618, 36.654249)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-2" x="101.247974" y="60.828677"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,339 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="217.267pt" height="125.523pt" viewBox="0 0 217.267 125.523">
<defs>
<g>
<g id="glyph-0-0">
<path d="M 4.390625 -2.484375 C 4.390625 -3.546875 3.515625 -4.40625 2.484375 -4.40625 C 1.40625 -4.40625 0.5625 -3.515625 0.5625 -2.484375 C 0.5625 -1.421875 1.421875 -0.5625 2.46875 -0.5625 C 3.546875 -0.5625 4.390625 -1.4375 4.390625 -2.484375 Z M 4.390625 -2.484375 "/>
</g>
<g id="glyph-0-1">
<path d="M 4.234375 2.375 C 4.234375 2.265625 4.171875 2.265625 4.078125 2.265625 C 3.296875 2.21875 2.921875 1.765625 2.84375 1.40625 C 2.8125 1.296875 2.8125 1.28125 2.8125 0.9375 L 2.8125 -0.5625 C 2.8125 -0.859375 2.8125 -1.359375 2.78125 -1.453125 C 2.65625 -2.109375 2.03125 -2.375 1.640625 -2.484375 C 2.8125 -2.8125 2.8125 -3.515625 2.8125 -3.796875 L 2.8125 -5.59375 C 2.8125 -6.296875 2.8125 -6.515625 3.046875 -6.765625 C 3.21875 -6.9375 3.453125 -7.1875 4.140625 -7.21875 C 4.203125 -7.234375 4.234375 -7.265625 4.234375 -7.328125 C 4.234375 -7.4375 4.15625 -7.4375 4.03125 -7.4375 C 3.046875 -7.4375 2.15625 -6.9375 2.140625 -6.21875 L 2.140625 -4.40625 C 2.140625 -3.46875 2.140625 -3.3125 1.890625 -3.03125 C 1.75 -2.890625 1.484375 -2.625 0.859375 -2.59375 C 0.78125 -2.59375 0.71875 -2.578125 0.71875 -2.484375 C 0.71875 -2.375 0.78125 -2.375 0.875 -2.375 C 1.296875 -2.34375 2.140625 -2.140625 2.140625 -1.140625 L 2.140625 0.828125 C 2.140625 1.40625 2.140625 1.734375 2.65625 2.109375 C 3.078125 2.40625 3.734375 2.484375 4.03125 2.484375 C 4.15625 2.484375 4.234375 2.484375 4.234375 2.375 Z M 4.234375 2.375 "/>
</g>
<g id="glyph-0-2">
<path d="M 4.234375 -2.484375 C 4.234375 -2.578125 4.171875 -2.578125 4.078125 -2.59375 C 3.65625 -2.625 2.8125 -2.828125 2.8125 -3.8125 L 2.8125 -5.78125 C 2.8125 -6.359375 2.8125 -6.703125 2.296875 -7.0625 C 1.859375 -7.359375 1.234375 -7.4375 0.90625 -7.4375 C 0.8125 -7.4375 0.71875 -7.4375 0.71875 -7.328125 C 0.71875 -7.234375 0.78125 -7.234375 0.875 -7.21875 C 1.65625 -7.171875 2.03125 -6.734375 2.109375 -6.375 C 2.140625 -6.265625 2.140625 -6.234375 2.140625 -5.890625 L 2.140625 -4.40625 C 2.140625 -4.109375 2.140625 -3.609375 2.15625 -3.5 C 2.296875 -2.84375 2.921875 -2.59375 3.3125 -2.484375 C 2.140625 -2.140625 2.140625 -1.4375 2.140625 -1.15625 L 2.140625 0.625 C 2.140625 1.34375 2.140625 1.5625 1.90625 1.8125 C 1.71875 1.984375 1.5 2.21875 0.796875 2.265625 C 0.75 2.265625 0.71875 2.3125 0.71875 2.375 C 0.71875 2.484375 0.8125 2.484375 0.90625 2.484375 C 1.90625 2.484375 2.78125 1.96875 2.8125 1.265625 L 2.8125 -0.5625 C 2.8125 -1.484375 2.8125 -1.640625 3.0625 -1.921875 C 3.203125 -2.0625 3.46875 -2.328125 4.09375 -2.375 C 4.171875 -2.375 4.234375 -2.375 4.234375 -2.484375 Z M 4.234375 -2.484375 "/>
</g>
<g id="glyph-1-0">
<path d="M 3.984375 -5.265625 L 2.484375 -6.859375 L 0.96875 -5.265625 L 1.09375 -5.125 L 2.484375 -6.1875 L 3.859375 -5.125 Z M 3.984375 -5.265625 "/>
</g>
<g id="glyph-1-1">
<path d="M 4.140625 -6.3125 L 3.984375 -6.453125 C 3.984375 -6.453125 3.609375 -5.984375 3.171875 -5.984375 C 2.9375 -5.984375 2.6875 -6.125 2.515625 -6.234375 C 2.25 -6.390625 2.078125 -6.453125 1.90625 -6.453125 C 1.53125 -6.453125 1.34375 -6.234375 0.828125 -5.6875 L 0.984375 -5.53125 C 0.984375 -5.53125 1.375 -6.015625 1.8125 -6.015625 C 2.03125 -6.015625 2.28125 -5.859375 2.453125 -5.765625 C 2.71875 -5.609375 2.890625 -5.53125 3.0625 -5.53125 C 3.4375 -5.53125 3.625 -5.75 4.140625 -6.3125 Z M 4.140625 -6.3125 "/>
</g>
<g id="glyph-1-2">
<path d="M 7.15625 -3.4375 C 7.15625 -3.640625 6.96875 -3.640625 6.828125 -3.640625 L 0.890625 -3.640625 C 0.75 -3.640625 0.5625 -3.640625 0.5625 -3.4375 C 0.5625 -3.25 0.75 -3.25 0.890625 -3.25 L 6.8125 -3.25 C 6.96875 -3.25 7.15625 -3.25 7.15625 -3.4375 Z M 7.15625 -1.515625 C 7.15625 -1.71875 6.96875 -1.71875 6.8125 -1.71875 L 0.890625 -1.71875 C 0.75 -1.71875 0.5625 -1.71875 0.5625 -1.515625 C 0.5625 -1.3125 0.75 -1.3125 0.890625 -1.3125 L 6.828125 -1.3125 C 6.96875 -1.3125 7.15625 -1.3125 7.15625 -1.515625 Z M 7.15625 -1.515625 "/>
</g>
<g id="glyph-2-0">
<path d="M 4.109375 -3.90625 C 3.78125 -3.78125 3.6875 -3.484375 3.6875 -3.34375 C 3.6875 -3.078125 3.90625 -2.9375 4.125 -2.9375 C 4.359375 -2.9375 4.71875 -3.140625 4.71875 -3.609375 C 4.71875 -4.140625 4.203125 -4.484375 3.296875 -4.484375 C 3.015625 -4.484375 2.453125 -4.46875 2 -4.125 C 1.5625 -3.78125 1.40625 -3.203125 1.40625 -2.953125 C 1.40625 -2.65625 1.53125 -2.375 1.75 -2.203125 C 2.03125 -1.984375 2.203125 -1.953125 2.875 -1.828125 C 3.171875 -1.78125 3.765625 -1.671875 3.765625 -1.21875 C 3.765625 -1.1875 3.765625 -0.28125 2.296875 -0.28125 C 1.8125 -0.28125 1.4375 -0.375 1.21875 -0.53125 C 1.5625 -0.640625 1.765625 -0.921875 1.765625 -1.21875 C 1.765625 -1.578125 1.484375 -1.671875 1.28125 -1.671875 C 0.9375 -1.671875 0.5625 -1.40625 0.5625 -0.90625 C 0.5625 -0.265625 1.265625 0.078125 2.265625 0.078125 C 4.53125 0.078125 4.53125 -1.625 4.53125 -1.625 C 4.53125 -1.96875 4.359375 -2.234375 4.140625 -2.4375 C 3.828125 -2.703125 3.453125 -2.765625 3.109375 -2.828125 C 2.5625 -2.921875 2.171875 -3 2.171875 -3.359375 C 2.171875 -3.390625 2.171875 -4.125 3.28125 -4.125 C 3.484375 -4.125 3.84375 -4.109375 4.109375 -3.90625 Z M 4.109375 -3.90625 "/>
</g>
<g id="glyph-2-1">
<path d="M 2.78125 -6.53125 C 2.828125 -6.671875 2.828125 -6.703125 2.828125 -6.703125 C 2.828125 -6.84375 2.71875 -6.890625 2.609375 -6.890625 C 2.5625 -6.890625 2.5625 -6.890625 2.546875 -6.875 L 1.265625 -6.8125 C 1.125 -6.8125 0.9375 -6.796875 0.9375 -6.515625 C 0.9375 -6.34375 1.125 -6.34375 1.203125 -6.34375 C 1.3125 -6.34375 1.484375 -6.34375 1.625 -6.3125 C 1.53125 -5.984375 1.4375 -5.5625 1.34375 -5.171875 L 0.65625 -2.4375 C 0.515625 -1.890625 0.515625 -1.765625 0.515625 -1.53125 C 0.515625 -0.265625 1.453125 0.078125 2.203125 0.078125 C 4 0.078125 5.015625 -1.53125 5.015625 -2.84375 C 5.015625 -4.0625 4.109375 -4.484375 3.28125 -4.484375 C 2.8125 -4.484375 2.40625 -4.296875 2.203125 -4.171875 Z M 2.21875 -0.28125 C 1.828125 -0.28125 1.515625 -0.484375 1.515625 -1.09375 C 1.515625 -1.421875 1.609375 -1.78125 1.671875 -2.09375 C 1.78125 -2.46875 1.9375 -3.15625 2.015625 -3.453125 C 2.0625 -3.625 2.625 -4.125 3.234375 -4.125 C 3.84375 -4.125 3.90625 -3.59375 3.90625 -3.375 C 3.90625 -2.859375 3.5625 -1.640625 3.40625 -1.25 C 3.0625 -0.453125 2.515625 -0.28125 2.21875 -0.28125 Z M 2.21875 -0.28125 "/>
</g>
<g id="glyph-3-0">
<path d="M 3.578125 -1.203125 C 3.578125 -1.75 3.125 -2.28125 2.359375 -2.453125 C 3.09375 -2.71875 3.359375 -3.234375 3.359375 -3.65625 C 3.359375 -4.203125 2.71875 -4.609375 1.953125 -4.609375 C 1.1875 -4.609375 0.59375 -4.234375 0.59375 -3.6875 C 0.59375 -3.453125 0.75 -3.3125 0.953125 -3.3125 C 1.171875 -3.3125 1.3125 -3.484375 1.3125 -3.671875 C 1.3125 -3.875 1.171875 -4.015625 0.953125 -4.03125 C 1.203125 -4.34375 1.671875 -4.421875 1.9375 -4.421875 C 2.25 -4.421875 2.6875 -4.265625 2.6875 -3.65625 C 2.6875 -3.359375 2.59375 -3.046875 2.40625 -2.828125 C 2.171875 -2.5625 1.984375 -2.546875 1.640625 -2.53125 C 1.453125 -2.515625 1.453125 -2.515625 1.40625 -2.515625 C 1.40625 -2.515625 1.34375 -2.5 1.34375 -2.421875 C 1.34375 -2.328125 1.40625 -2.328125 1.515625 -2.328125 L 1.890625 -2.328125 C 2.4375 -2.328125 2.828125 -1.953125 2.828125 -1.203125 C 2.828125 -0.34375 2.328125 -0.078125 1.921875 -0.078125 C 1.640625 -0.078125 1.03125 -0.15625 0.75 -0.5625 C 1.078125 -0.578125 1.140625 -0.8125 1.140625 -0.953125 C 1.140625 -1.1875 0.984375 -1.34375 0.765625 -1.34375 C 0.5625 -1.34375 0.375 -1.21875 0.375 -0.9375 C 0.375 -0.28125 1.09375 0.140625 1.9375 0.140625 C 2.90625 0.140625 3.578125 -0.5 3.578125 -1.203125 Z M 3.578125 -1.203125 "/>
</g>
<g id="glyph-3-1">
<path d="M 3.671875 -1.140625 L 3.671875 -1.390625 L 2.90625 -1.390625 L 2.90625 -4.484375 C 2.90625 -4.640625 2.90625 -4.6875 2.75 -4.6875 C 2.671875 -4.6875 2.640625 -4.6875 2.578125 -4.59375 L 0.265625 -1.390625 L 0.265625 -1.140625 L 2.3125 -1.140625 L 2.3125 -0.5625 C 2.3125 -0.328125 2.3125 -0.25 1.75 -0.25 L 1.5625 -0.25 L 1.5625 0 L 2.609375 -0.03125 L 3.65625 0 L 3.65625 -0.25 L 3.46875 -0.25 C 2.90625 -0.25 2.90625 -0.328125 2.90625 -0.5625 L 2.90625 -1.140625 Z M 2.359375 -1.390625 L 0.53125 -1.390625 L 2.359375 -3.9375 Z M 2.359375 -1.390625 "/>
</g>
<g id="glyph-3-2">
<path d="M 3.515625 -1.390625 C 3.515625 -2.1875 2.90625 -2.90625 2.046875 -2.90625 C 1.75 -2.90625 1.390625 -2.828125 1.078125 -2.5625 L 1.078125 -3.875 C 1.4375 -3.796875 1.640625 -3.796875 1.75 -3.796875 C 2.671875 -3.796875 3.21875 -4.421875 3.21875 -4.515625 C 3.21875 -4.59375 3.15625 -4.609375 3.125 -4.609375 C 3.125 -4.609375 3.09375 -4.609375 3.078125 -4.59375 C 2.90625 -4.53125 2.53125 -4.390625 2.015625 -4.390625 C 1.828125 -4.390625 1.453125 -4.40625 1.015625 -4.578125 C 0.9375 -4.609375 0.921875 -4.609375 0.921875 -4.609375 C 0.828125 -4.609375 0.828125 -4.546875 0.828125 -4.421875 L 0.828125 -2.375 C 0.828125 -2.265625 0.828125 -2.171875 0.9375 -2.171875 C 1 -2.171875 1.015625 -2.1875 1.078125 -2.28125 C 1.375 -2.65625 1.796875 -2.71875 2.046875 -2.71875 C 2.46875 -2.71875 2.65625 -2.375 2.6875 -2.328125 C 2.8125 -2.09375 2.84375 -1.828125 2.84375 -1.421875 C 2.84375 -1.21875 2.84375 -0.8125 2.640625 -0.5 C 2.46875 -0.25 2.171875 -0.078125 1.828125 -0.078125 C 1.375 -0.078125 0.90625 -0.328125 0.734375 -0.796875 C 1 -0.765625 1.140625 -0.953125 1.140625 -1.140625 C 1.140625 -1.4375 0.875 -1.484375 0.78125 -1.484375 C 0.78125 -1.484375 0.4375 -1.484375 0.4375 -1.109375 C 0.4375 -0.484375 1.015625 0.140625 1.84375 0.140625 C 2.734375 0.140625 3.515625 -0.515625 3.515625 -1.390625 Z M 3.515625 -1.390625 "/>
</g>
<g id="glyph-3-3">
<path d="M 3.578125 -1.421875 C 3.578125 -2.296875 2.875 -2.953125 2.0625 -2.953125 C 1.5 -2.953125 1.203125 -2.59375 1.046875 -2.28125 C 1.046875 -2.84375 1.09375 -3.359375 1.359375 -3.78125 C 1.59375 -4.15625 1.96875 -4.421875 2.40625 -4.421875 C 2.625 -4.421875 2.90625 -4.359375 3.03125 -4.171875 C 2.859375 -4.15625 2.71875 -4.046875 2.71875 -3.84375 C 2.71875 -3.671875 2.84375 -3.515625 3.046875 -3.515625 C 3.25 -3.515625 3.375 -3.65625 3.375 -3.859375 C 3.375 -4.25 3.09375 -4.609375 2.40625 -4.609375 C 1.390625 -4.609375 0.375 -3.703125 0.375 -2.203125 C 0.375 -0.40625 1.21875 0.140625 1.984375 0.140625 C 2.84375 0.140625 3.578125 -0.5 3.578125 -1.421875 Z M 2.90625 -1.421875 C 2.90625 -1.015625 2.90625 -0.734375 2.71875 -0.453125 C 2.546875 -0.21875 2.328125 -0.078125 1.984375 -0.078125 C 1.640625 -0.078125 1.375 -0.28125 1.21875 -0.59375 C 1.125 -0.796875 1.0625 -1.140625 1.0625 -1.5625 C 1.0625 -2.234375 1.46875 -2.765625 2.015625 -2.765625 C 2.34375 -2.765625 2.5625 -2.640625 2.734375 -2.375 C 2.90625 -2.109375 2.90625 -1.828125 2.90625 -1.421875 Z M 2.90625 -1.421875 "/>
</g>
<g id="glyph-3-4">
<path d="M 3.28125 0 L 3.28125 -0.25 L 3.03125 -0.25 C 2.328125 -0.25 2.328125 -0.34375 2.328125 -0.5625 L 2.328125 -4.421875 C 2.328125 -4.609375 2.3125 -4.609375 2.125 -4.609375 C 1.671875 -4.171875 1.046875 -4.171875 0.765625 -4.171875 L 0.765625 -3.921875 C 0.921875 -3.921875 1.390625 -3.921875 1.765625 -4.109375 L 1.765625 -0.5625 C 1.765625 -0.34375 1.765625 -0.25 1.078125 -0.25 L 0.8125 -0.25 L 0.8125 0 L 2.046875 -0.03125 Z M 3.28125 0 "/>
</g>
<g id="glyph-3-5">
<path d="M 3.515625 -1.265625 L 3.28125 -1.265625 C 3.25 -1.109375 3.1875 -0.703125 3.09375 -0.625 C 3.03125 -0.59375 2.5 -0.59375 2.40625 -0.59375 L 1.125 -0.59375 C 1.859375 -1.234375 2.09375 -1.4375 2.515625 -1.765625 C 3.03125 -2.171875 3.515625 -2.59375 3.515625 -3.265625 C 3.515625 -4.109375 2.78125 -4.609375 1.890625 -4.609375 C 1.015625 -4.609375 0.4375 -4.015625 0.4375 -3.375 C 0.4375 -3.015625 0.734375 -2.984375 0.8125 -2.984375 C 0.96875 -2.984375 1.171875 -3.09375 1.171875 -3.34375 C 1.171875 -3.484375 1.125 -3.71875 0.765625 -3.71875 C 0.984375 -4.21875 1.453125 -4.359375 1.78125 -4.359375 C 2.46875 -4.359375 2.84375 -3.828125 2.84375 -3.265625 C 2.84375 -2.65625 2.40625 -2.171875 2.1875 -1.921875 L 0.5 -0.265625 C 0.4375 -0.203125 0.4375 -0.1875 0.4375 0 L 3.296875 0 Z M 3.515625 -1.265625 "/>
</g>
<g id="glyph-4-0">
<path d="M 6.96875 -2.140625 C 6.96875 -2.859375 6.390625 -3.4375 5.421875 -3.546875 C 6.453125 -3.734375 7.5 -4.46875 7.5 -5.40625 C 7.5 -6.140625 6.84375 -6.78125 5.65625 -6.78125 L 2.328125 -6.78125 C 2.140625 -6.78125 2.03125 -6.78125 2.03125 -6.578125 C 2.03125 -6.46875 2.125 -6.46875 2.3125 -6.46875 C 2.3125 -6.46875 2.515625 -6.46875 2.6875 -6.453125 C 2.875 -6.421875 2.953125 -6.421875 2.953125 -6.296875 C 2.953125 -6.25 2.953125 -6.21875 2.921875 -6.109375 L 1.59375 -0.78125 C 1.484375 -0.390625 1.46875 -0.3125 0.6875 -0.3125 C 0.515625 -0.3125 0.421875 -0.3125 0.421875 -0.109375 C 0.421875 0 0.5 0 0.6875 0 L 4.234375 0 C 5.796875 0 6.96875 -1.171875 6.96875 -2.140625 Z M 6.59375 -5.453125 C 6.59375 -4.578125 5.75 -3.625 4.53125 -3.625 L 3.078125 -3.625 L 3.703125 -6.09375 C 3.796875 -6.4375 3.8125 -6.46875 4.234375 -6.46875 L 5.515625 -6.46875 C 6.390625 -6.46875 6.59375 -5.890625 6.59375 -5.453125 Z M 6.046875 -2.25 C 6.046875 -1.265625 5.15625 -0.3125 3.984375 -0.3125 L 2.640625 -0.3125 C 2.5 -0.3125 2.484375 -0.3125 2.421875 -0.3125 C 2.328125 -0.328125 2.296875 -0.34375 2.296875 -0.421875 C 2.296875 -0.453125 2.296875 -0.46875 2.34375 -0.640625 L 3.03125 -3.40625 L 4.90625 -3.40625 C 5.859375 -3.40625 6.046875 -2.671875 6.046875 -2.25 Z M 6.046875 -2.25 "/>
</g>
<g id="glyph-4-1">
<path d="M 6.421875 -2.375 C 6.421875 -2.484375 6.296875 -2.484375 6.296875 -2.484375 C 6.234375 -2.484375 6.1875 -2.453125 6.171875 -2.375 C 6.078125 -2.09375 5.859375 -1.390625 5.171875 -0.8125 C 4.484375 -0.265625 3.859375 -0.09375 3.34375 -0.09375 C 2.453125 -0.09375 1.40625 -0.609375 1.40625 -2.15625 C 1.40625 -2.71875 1.609375 -4.328125 2.59375 -5.484375 C 3.203125 -6.1875 4.140625 -6.6875 5.015625 -6.6875 C 6.03125 -6.6875 6.625 -5.921875 6.625 -4.765625 C 6.625 -4.375 6.59375 -4.359375 6.59375 -4.265625 C 6.59375 -4.171875 6.703125 -4.171875 6.734375 -4.171875 C 6.859375 -4.171875 6.859375 -4.1875 6.921875 -4.359375 L 7.546875 -6.890625 C 7.546875 -6.921875 7.515625 -7 7.4375 -7 C 7.40625 -7 7.390625 -6.984375 7.28125 -6.875 L 6.59375 -6.109375 C 6.5 -6.25 6.046875 -7 4.9375 -7 C 2.734375 -7 0.5 -4.796875 0.5 -2.5 C 0.5 -0.859375 1.671875 0.21875 3.1875 0.21875 C 4.046875 0.21875 4.796875 -0.171875 5.328125 -0.640625 C 6.25 -1.453125 6.421875 -2.34375 6.421875 -2.375 Z M 6.421875 -2.375 "/>
</g>
<g id="glyph-4-2">
<path d="M 7.125 -0.203125 C 7.125 -0.3125 7.03125 -0.3125 6.84375 -0.3125 C 6.484375 -0.3125 6.203125 -0.3125 6.203125 -0.484375 C 6.203125 -0.546875 6.21875 -0.59375 6.234375 -0.65625 L 7.578125 -6.015625 C 7.65625 -6.375 7.671875 -6.46875 8.40625 -6.46875 C 8.65625 -6.46875 8.734375 -6.46875 8.734375 -6.671875 C 8.734375 -6.78125 8.625 -6.78125 8.609375 -6.78125 L 7.328125 -6.75 L 6.046875 -6.78125 C 5.96875 -6.78125 5.859375 -6.78125 5.859375 -6.578125 C 5.859375 -6.46875 5.953125 -6.46875 6.140625 -6.46875 C 6.140625 -6.46875 6.34375 -6.46875 6.515625 -6.453125 C 6.703125 -6.421875 6.78125 -6.421875 6.78125 -6.296875 C 6.78125 -6.25 6.78125 -6.234375 6.75 -6.109375 L 6.15625 -3.6875 L 3.125 -3.6875 L 3.703125 -6.015625 C 3.796875 -6.375 3.828125 -6.46875 4.546875 -6.46875 C 4.796875 -6.46875 4.875 -6.46875 4.875 -6.671875 C 4.875 -6.78125 4.765625 -6.78125 4.75 -6.78125 L 3.46875 -6.75 L 2.1875 -6.78125 C 2.109375 -6.78125 2 -6.78125 2 -6.578125 C 2 -6.46875 2.09375 -6.46875 2.28125 -6.46875 C 2.28125 -6.46875 2.484375 -6.46875 2.65625 -6.453125 C 2.84375 -6.421875 2.921875 -6.421875 2.921875 -6.296875 C 2.921875 -6.25 2.921875 -6.21875 2.890625 -6.109375 L 1.5625 -0.78125 C 1.453125 -0.390625 1.4375 -0.3125 0.65625 -0.3125 C 0.46875 -0.3125 0.390625 -0.3125 0.390625 -0.109375 C 0.390625 0 0.53125 0 0.53125 0 L 1.78125 -0.03125 L 2.421875 -0.015625 C 2.640625 -0.015625 2.859375 0 3.0625 0 C 3.140625 0 3.265625 0 3.265625 -0.203125 C 3.265625 -0.3125 3.171875 -0.3125 2.984375 -0.3125 C 2.625 -0.3125 2.34375 -0.3125 2.34375 -0.484375 C 2.34375 -0.546875 2.359375 -0.59375 2.375 -0.65625 L 3.046875 -3.375 L 6.078125 -3.375 L 5.390625 -0.640625 C 5.28125 -0.3125 5.09375 -0.3125 4.484375 -0.3125 C 4.328125 -0.3125 4.25 -0.3125 4.25 -0.109375 C 4.25 0 4.390625 0 4.390625 0 L 5.640625 -0.03125 L 6.28125 -0.015625 C 6.5 -0.015625 6.71875 0 6.921875 0 C 7 0 7.125 0 7.125 -0.203125 Z M 7.125 -0.203125 "/>
</g>
<g id="glyph-5-0">
<path d="M 5.4375 -3.046875 L 5.859375 -4.796875 C 5.859375 -4.828125 5.84375 -4.890625 5.765625 -4.890625 C 5.71875 -4.890625 5.703125 -4.875 5.640625 -4.8125 L 5.140625 -4.265625 C 5.078125 -4.359375 4.6875 -4.890625 3.828125 -4.890625 C 2.140625 -4.890625 0.484375 -3.390625 0.484375 -1.828125 C 0.484375 -0.6875 1.375 0.140625 2.625 0.140625 C 3 0.140625 3.671875 0.0625 4.375 -0.546875 C 4.9375 -1.015625 5.078125 -1.609375 5.078125 -1.671875 C 5.078125 -1.765625 5 -1.765625 4.96875 -1.765625 C 4.875 -1.765625 4.859375 -1.71875 4.84375 -1.640625 C 4.546875 -0.703125 3.578125 -0.109375 2.734375 -0.109375 C 2 -0.109375 1.1875 -0.5 1.1875 -1.609375 C 1.1875 -1.8125 1.234375 -2.90625 2.03125 -3.78125 C 2.515625 -4.3125 3.234375 -4.640625 3.90625 -4.640625 C 4.703125 -4.640625 5.1875 -4.046875 5.1875 -3.28125 C 5.1875 -3.078125 5.15625 -3.03125 5.15625 -2.984375 C 5.15625 -2.90625 5.25 -2.90625 5.28125 -2.90625 C 5.390625 -2.90625 5.390625 -2.921875 5.4375 -3.046875 Z M 5.4375 -3.046875 "/>
</g>
</g>
<clipPath id="clip-0">
<path clip-rule="nonzero" d="M 6 6 L 194 6 L 194 125.046875 L 6 125.046875 Z M 6 6 "/>
</clipPath>
<clipPath id="clip-1">
<path clip-rule="nonzero" d="M 6 86 L 194 86 L 194 125.046875 L 6 125.046875 Z M 6 86 "/>
</clipPath>
<clipPath id="clip-2">
<path clip-rule="nonzero" d="M 85 25 L 194 25 L 194 125.046875 L 85 125.046875 Z M 85 25 "/>
</clipPath>
<clipPath id="clip-3">
<path clip-rule="nonzero" d="M 6 25 L 114 25 L 114 125.046875 L 6 125.046875 Z M 6 25 "/>
</clipPath>
<clipPath id="clip-4">
<path clip-rule="nonzero" d="M 93 80 L 139 80 L 139 125.046875 L 93 125.046875 Z M 93 80 "/>
</clipPath>
<clipPath id="clip-5">
<path clip-rule="nonzero" d="M 61 80 L 107 80 L 107 125.046875 L 61 125.046875 Z M 61 80 "/>
</clipPath>
</defs>
<g clip-path="url(#clip-0)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M -0.00151911 61.735498 L 80.177014 141.914031 L 80.177014 80.176404 L -0.00151911 160.354937 L -80.176131 80.176404 L -80.176131 141.914031 L -0.00151911 61.735498 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="97.481877" y="121.241271"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="177.354354" y="41.368794"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="177.354354" y="102.870083"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="97.481877" y="22.997607"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="17.609401" y="102.870083"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="17.609401" y="41.368794"/>
</g>
<path fill-rule="nonzero" fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="0.2" d="M 99.960938 119.035156 L 179.835938 100.664062 L 20.089844 100.664062 Z M 99.960938 119.035156 "/>
<path fill-rule="nonzero" fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="0.2" d="M 179.835938 39.160156 L 99.960938 20.789062 L 20.089844 39.160156 Z M 179.835938 39.160156 "/>
<g clip-path="url(#clip-1)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-dasharray="2.98883 2.98883" stroke-miterlimit="10" d="M -0.00151911 61.735498 L 80.177014 80.176404 L -80.176131 80.176404 Z M -0.00151911 61.735498 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-dasharray="2.98883 2.98883" stroke-miterlimit="10" d="M 80.177014 141.914031 L -0.00151911 160.354937 L -80.176131 141.914031 Z M 80.177014 141.914031 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
<g clip-path="url(#clip-2)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-miterlimit="10" d="M -0.00151911 61.735498 L 80.177014 141.914031 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="97.481877" y="121.241271"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="177.354354" y="41.368794"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-miterlimit="10" d="M 80.177014 80.176404 L 80.177014 141.914031 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="177.354354" y="102.870083"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="177.354354" y="41.368794"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-miterlimit="10" d="M 80.177014 80.176404 L -0.00151911 160.354937 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="177.354354" y="102.870083"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="97.481877" y="22.997607"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-miterlimit="10" d="M -80.176131 80.176404 L -0.00151911 160.354937 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="17.609401" y="102.870083"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="97.481877" y="22.997607"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-miterlimit="10" d="M -80.176131 80.176404 L -80.176131 141.914031 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="17.609401" y="102.870083"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="17.609401" y="41.368794"/>
</g>
<g clip-path="url(#clip-3)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 44.706726%, 74.116516%)" stroke-opacity="1" stroke-miterlimit="10" d="M -0.00151911 61.735498 L -80.176131 141.914031 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="97.481877" y="121.241271"/>
</g>
<g fill="rgb(0%, 44.706726%, 74.116516%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="17.609401" y="41.368794"/>
</g>
<g clip-path="url(#clip-4)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(85.096741%, 32.157898%, 9.411621%)" stroke-opacity="1" stroke-miterlimit="10" d="M 8.017118 69.754136 L 24.787638 86.520734 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
</g>
<path fill-rule="nonzero" fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(85.096741%, 32.157898%, 9.411621%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052617 0.00117898 L 1.608045 1.684183 L 3.088644 -0.00159368 L 1.608045 -1.681825 Z M 6.052617 0.00117898 " transform="matrix(0.704423, -0.704423, -0.704423, -0.704423, 122.655196, 96.342559)"/>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="105.469523" y="113.253625"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="132.51176" y="93.684988"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="131.722758" y="93.823461"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-3-0" x="136.995721" y="95.311806"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(85.096741%, 32.157898%, 9.411621%)" stroke-opacity="1" stroke-miterlimit="10" d="M 80.177014 86.352127 L 80.177014 97.15082 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
<path fill-rule="nonzero" fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(85.096741%, 32.157898%, 9.411621%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053328 0.00021609 L 1.606807 1.682365 L 3.088981 0.00021609 L 1.606807 -1.681933 Z M 6.053328 0.00021609 " transform="matrix(0, -0.996214, -0.996214, 0, 179.836153, 86.581193)"/>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="177.354354" y="96.719456"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="167.095339" y="81.744363"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="166.306337" y="81.881841"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-3-1" x="171.5793" y="83.370185"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(85.096741%, 32.157898%, 9.411621%)" stroke-opacity="1" stroke-miterlimit="10" d="M 72.158376 88.195041 L 55.391778 104.96164 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
<path fill-rule="nonzero" fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(85.096741%, 32.157898%, 9.411621%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053303 0.000588412 L 1.608731 1.683592 L 3.086558 0.000588412 L 1.608731 -1.682416 Z M 6.053303 0.000588412 " transform="matrix(-0.704423, -0.704423, -0.704423, 0.704423, 157.143407, 77.970704)"/>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="169.366708" y="94.882437"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="147.806638" y="83.350261"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="147.017636" y="83.487738"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-3-2" x="152.289602" y="84.976082"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(85.096741%, 32.157898%, 9.411621%)" stroke-opacity="1" stroke-miterlimit="10" d="M -72.157494 88.195041 L -55.390895 104.96164 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
<path fill-rule="nonzero" fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(85.096741%, 32.157898%, 9.411621%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053928 -0.00121271 L 1.609355 1.681791 L 3.087183 -0.00121271 L 1.609355 -1.684217 Z M 6.053928 -0.00121271 " transform="matrix(0.704423, -0.704423, -0.704423, -0.704423, 42.781494, 77.970704)"/>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="25.597047" y="94.882437"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="43.973216" y="83.350261"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="43.184214" y="83.487738"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-3-3" x="48.45618" y="84.976082"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(85.096741%, 32.157898%, 9.411621%)" stroke-opacity="1" stroke-miterlimit="10" d="M -80.176131 86.352127 L -80.176131 97.15082 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
<path fill-rule="nonzero" fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(85.096741%, 32.157898%, 9.411621%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053328 -0.00109897 L 1.606807 1.684972 L 3.088981 -0.00109897 L 1.606807 -1.683248 Z M 6.053328 -0.00109897 " transform="matrix(0, -0.996214, -0.996214, 0, 20.088749, 86.581193)"/>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="17.609401" y="96.719456"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="7.350386" y="81.744363"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="6.561384" y="81.881841"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-3-4" x="11.83335" y="83.370185"/>
</g>
<g clip-path="url(#clip-5)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(85.096741%, 32.157898%, 9.411621%)" stroke-opacity="1" stroke-miterlimit="10" d="M -8.020157 69.754136 L -24.786755 86.520734 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
</g>
<path fill-rule="nonzero" fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(85.096741%, 32.157898%, 9.411621%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054765 0.000969382 L 1.610193 1.683973 L 3.08802 0.000969382 L 1.610193 -1.682035 Z M 6.054765 0.000969382 " transform="matrix(-0.704423, -0.704423, -0.704423, 0.704423, 77.269706, 96.342559)"/>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="89.494231" y="113.253625"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="76.60023" y="93.684988"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="75.811228" y="93.823461"/>
</g>
<g fill="rgb(85.096741%, 32.157898%, 9.411621%)" fill-opacity="1">
<use xlink:href="#glyph-3-5" x="81.08419" y="95.311806"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-1" x="163.700241" y="28.426975"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-1" x="163.597631" y="31.047018"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-0" x="168.766987" y="32.535362"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-2" x="175.975593" y="31.047018"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-1" x="186.555389" y="28.426975"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-1" x="186.451783" y="31.047018"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-1" x="191.621139" y="32.535362"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-1" x="83.827764" y="10.055787"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-1" x="83.725154" y="12.674834"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-2" x="88.893514" y="14.164175"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-2" x="96.103117" y="12.674834"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-1" x="106.682912" y="10.055787"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-1" x="106.579306" y="12.674834"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-3" x="111.748662" y="14.164175"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-1" x="3.955288" y="28.426975"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-1" x="3.852678" y="31.047018"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-4" x="9.021037" y="32.535362"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-2" x="16.23064" y="31.047018"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-1" x="26.810436" y="28.426975"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-1" x="26.70683" y="31.047018"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-5" x="31.876186" y="32.535362"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(46.665955%, 67.059326%, 18.429565%)" stroke-opacity="1" stroke-miterlimit="10" d="M -0.00151911 111.043257 L -7.635889 103.408887 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
<path fill-rule="nonzero" fill="rgb(46.665955%, 67.059326%, 18.429565%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(46.665955%, 67.059326%, 18.429565%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053311 -0.0000397062 L 1.608738 1.682964 L 3.086566 -0.0000397062 L 1.608738 -1.683044 Z M 6.053311 -0.0000397062 " transform="matrix(-0.704423, 0.704423, 0.704423, 0.704423, 94.353964, 75.521092)"/>
<g fill="rgb(46.665955%, 67.059326%, 18.429565%)" fill-opacity="1">
<use xlink:href="#glyph-0-1" x="103.766993" y="63.628206"/>
</g>
<g fill="rgb(46.665955%, 67.059326%, 18.429565%)" fill-opacity="1">
<use xlink:href="#glyph-4-0" x="108.729435" y="63.628206"/>
</g>
<g fill="rgb(46.665955%, 67.059326%, 18.429565%)" fill-opacity="1">
<use xlink:href="#glyph-0-2" x="116.753705" y="63.628206"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(46.665955%, 67.059326%, 18.429565%)" stroke-opacity="1" stroke-miterlimit="10" d="M -0.00151911 111.043257 L 23.713258 111.043257 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
<path fill-rule="nonzero" fill="rgb(46.665955%, 67.059326%, 18.429565%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(46.665955%, 67.059326%, 18.429565%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053825 -0.00146296 L 1.607305 1.684608 L 3.089478 -0.00146296 L 1.607305 -1.683612 Z M 6.053825 -0.00146296 " transform="matrix(0.996214, 0, 0, -0.996214, 120.758155, 69.912605)"/>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(46.665955%, 67.059326%, 18.429565%)" stroke-opacity="1" stroke-miterlimit="10" d="M -0.00151911 111.043257 L -0.00151911 134.758034 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
<path fill-rule="nonzero" fill="rgb(46.665955%, 67.059326%, 18.429565%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(46.665955%, 67.059326%, 18.429565%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.053872 0.00151911 L 1.607351 1.683668 L 3.085603 0.00151911 L 1.607351 -1.684551 Z M 6.053872 0.00151911 " transform="matrix(0, -0.996214, -0.996214, 0, 99.962451, 49.116891)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="97.481877" y="72.119937"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-1" x="78.430275" y="63.628206"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-1" x="83.392718" y="63.628206"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-2" x="91.200624" y="63.628206"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-dasharray="2.98883 2.98883" stroke-miterlimit="10" d="M 94.351769 84.811137 L 94.351769 137.279298 " transform="matrix(0.996214, 0, 0, -0.996214, 99.962451, 180.536942)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.05318 0.00142923 L 1.61058 1.683579 L 3.088833 0.00142923 L 1.61058 -1.684641 Z M 6.05318 0.00142923 " transform="matrix(0, 0.996214, 0.996214, 0, 193.955607, 93.219736)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054365 -0.00140923 L 1.607844 1.684661 L 3.086097 -0.00140923 L 1.607844 -1.683559 Z M 6.054365 -0.00140923 " transform="matrix(0, -0.996214, -0.996214, 0, 193.955627, 46.605664)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-2" x="197.758815" y="72.56126"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-5-0" x="206.009462" y="74.049604"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="142.886pt" height="62.315pt" viewBox="0 0 142.886 62.315">
<defs>
<g>
<g id="glyph-0-0">
<path d="M 4.546875 -1.640625 C 4.546875 -2.140625 4.359375 -2.53125 4.15625 -2.796875 C 3.765625 -3.296875 3.375 -3.390625 2.796875 -3.515625 L 2.015625 -3.703125 C 1.296875 -3.890625 1.078125 -4.453125 1.078125 -4.84375 C 1.078125 -5.4375 1.546875 -6.015625 2.296875 -6.015625 C 3.4375 -6.015625 3.90625 -5.15625 4.03125 -4.265625 C 4.0625 -4.09375 4.0625 -4.046875 4.171875 -4.046875 C 4.296875 -4.046875 4.296875 -4.109375 4.296875 -4.296875 L 4.296875 -6.015625 C 4.296875 -6.1875 4.296875 -6.25 4.1875 -6.25 C 4.125 -6.25 4.125 -6.25 4.0625 -6.140625 C 3.9375 -5.984375 4.03125 -6.09375 3.734375 -5.640625 C 3.578125 -5.8125 3.125 -6.25 2.296875 -6.25 C 1.25 -6.25 0.5 -5.453125 0.5 -4.546875 C 0.5 -3.859375 0.921875 -3.421875 0.96875 -3.375 C 1.359375 -2.984375 1.53125 -2.953125 2.578125 -2.703125 C 3.296875 -2.53125 3.375 -2.515625 3.671875 -2.203125 C 3.671875 -2.203125 3.984375 -1.875 3.984375 -1.34375 C 3.984375 -0.75 3.546875 -0.078125 2.75 -0.078125 C 2.0625 -0.078125 0.828125 -0.359375 0.75 -1.828125 C 0.75 -1.96875 0.75 -2.015625 0.625 -2.015625 C 0.5 -2.015625 0.5 -1.9375 0.5 -1.765625 L 0.5 -0.046875 C 0.5 0.125 0.5 0.1875 0.609375 0.1875 C 0.671875 0.1875 0.6875 0.1875 0.75 0.078125 C 0.859375 -0.078125 0.765625 0.03125 1.0625 -0.421875 C 1.609375 0.109375 2.3125 0.1875 2.75 0.1875 C 3.828125 0.1875 4.546875 -0.6875 4.546875 -1.640625 Z M 4.546875 -1.640625 "/>
</g>
<g id="glyph-0-1">
<path d="M 3.03125 -1.09375 L 3.03125 -1.609375 L 2.78125 -1.609375 L 2.78125 -1.125 C 2.78125 -0.46875 2.515625 -0.15625 2.1875 -0.15625 C 1.59375 -0.15625 1.59375 -0.9375 1.59375 -1.09375 L 1.59375 -3.546875 L 2.890625 -3.546875 L 2.890625 -3.828125 L 1.59375 -3.828125 L 1.59375 -5.453125 L 1.34375 -5.453125 C 1.34375 -4.71875 1.03125 -3.796875 0.171875 -3.765625 L 0.171875 -3.546875 L 0.9375 -3.546875 L 0.9375 -1.09375 C 0.9375 -0.109375 1.65625 0.09375 2.125 0.09375 C 2.71875 0.09375 3.03125 -0.46875 3.03125 -1.09375 Z M 3.03125 -1.09375 "/>
</g>
<g id="glyph-0-2">
<path d="M 3.3125 -3.375 C 3.3125 -3.65625 3.046875 -3.921875 2.640625 -3.921875 C 2.109375 -3.921875 1.734375 -3.546875 1.53125 -3 L 1.53125 -3.921875 L 0.265625 -3.828125 L 0.265625 -3.546875 C 0.875 -3.546875 0.953125 -3.484375 0.953125 -3.046875 L 0.953125 -0.6875 C 0.953125 -0.28125 0.859375 -0.28125 0.265625 -0.28125 L 0.265625 0 C 0.734375 -0.015625 0.859375 -0.03125 1.296875 -0.03125 L 2.4375 0 L 2.4375 -0.28125 L 2.25 -0.28125 C 1.609375 -0.28125 1.578125 -0.375 1.578125 -0.703125 L 1.578125 -2.03125 C 1.578125 -2.390625 1.671875 -3.703125 2.6875 -3.703125 L 2.6875 -3.6875 C 2.671875 -3.6875 2.53125 -3.578125 2.53125 -3.359375 C 2.53125 -3.125 2.71875 -2.96875 2.921875 -2.96875 C 3.109375 -2.96875 3.3125 -3.109375 3.3125 -3.375 Z M 3.3125 -3.375 "/>
</g>
<g id="glyph-0-3">
<path d="M 4.859375 0 L 4.859375 -0.28125 C 4.25 -0.28125 4.171875 -0.34375 4.171875 -0.765625 L 4.171875 -3.921875 L 2.828125 -3.828125 L 2.828125 -3.546875 C 3.4375 -3.546875 3.515625 -3.484375 3.515625 -3.046875 L 3.515625 -1.484375 C 3.515625 -0.6875 3.078125 -0.125 2.4375 -0.125 C 1.6875 -0.125 1.65625 -0.5 1.65625 -0.984375 L 1.65625 -3.921875 L 0.3125 -3.828125 L 0.3125 -3.546875 C 1 -3.546875 1 -3.515625 1 -2.734375 L 1 -1.40625 C 1 -0.828125 1 -0.453125 1.40625 -0.140625 C 1.65625 0.03125 2.03125 0.09375 2.375 0.09375 C 2.84375 0.09375 3.28125 -0.109375 3.53125 -0.640625 L 3.546875 -0.640625 L 3.546875 0.09375 Z M 4.859375 0 "/>
</g>
<g id="glyph-0-4">
<path d="M 5.6875 -4.40625 C 5.6875 -5.296875 4.78125 -6.0625 3.546875 -6.0625 L 0.359375 -6.0625 L 0.359375 -5.78125 L 0.5625 -5.78125 C 1.25 -5.78125 1.265625 -5.6875 1.265625 -5.359375 L 1.265625 -0.703125 C 1.265625 -0.375 1.25 -0.28125 0.5625 -0.28125 L 0.359375 -0.28125 L 0.359375 0 C 0.75 -0.03125 1.25 -0.03125 1.65625 -0.03125 C 2.0625 -0.03125 2.5625 -0.03125 2.96875 0 L 2.96875 -0.28125 L 2.765625 -0.28125 C 2.078125 -0.28125 2.0625 -0.375 2.0625 -0.703125 L 2.0625 -2.78125 L 3.546875 -2.78125 C 4.78125 -2.78125 5.6875 -3.5625 5.6875 -4.40625 Z M 4.78125 -4.40625 C 4.78125 -4.015625 4.78125 -3.03125 3.3125 -3.03125 L 2.03125 -3.03125 L 2.03125 -5.421875 C 2.03125 -5.71875 2.046875 -5.78125 2.46875 -5.78125 L 3.3125 -5.78125 C 4.78125 -5.78125 4.78125 -4.8125 4.78125 -4.40625 Z M 4.78125 -4.40625 "/>
</g>
<g id="glyph-0-5">
<path d="M 2.3125 0 L 2.3125 -0.28125 C 1.734375 -0.28125 1.640625 -0.28125 1.640625 -0.6875 L 1.640625 -6.15625 L 0.3125 -6.0625 L 0.3125 -5.78125 C 0.921875 -5.78125 1 -5.71875 1 -5.296875 L 1 -0.6875 C 1 -0.28125 0.90625 -0.28125 0.3125 -0.28125 L 0.3125 0 C 0.734375 -0.015625 0.90625 -0.03125 1.3125 -0.03125 C 1.734375 -0.03125 1.875 -0.015625 2.3125 0 Z M 2.3125 0 "/>
</g>
<g id="glyph-0-6">
<path d="M 4.40625 -0.796875 L 4.40625 -1.28125 L 4.15625 -1.28125 L 4.15625 -0.796875 C 4.15625 -0.703125 4.15625 -0.25 3.84375 -0.25 C 3.515625 -0.25 3.515625 -0.6875 3.515625 -0.828125 L 3.515625 -2.375 C 3.515625 -2.890625 3.515625 -3.1875 3.125 -3.546875 C 2.796875 -3.84375 2.375 -3.96875 1.921875 -3.96875 C 1.1875 -3.96875 0.5625 -3.609375 0.5625 -3.03125 C 0.5625 -2.765625 0.75 -2.609375 0.96875 -2.609375 C 1.21875 -2.609375 1.390625 -2.78125 1.390625 -3.015625 C 1.390625 -3.40625 0.984375 -3.4375 0.984375 -3.4375 C 1.21875 -3.671875 1.65625 -3.75 1.90625 -3.75 C 2.359375 -3.75 2.859375 -3.421875 2.859375 -2.640625 L 2.859375 -2.34375 C 2.390625 -2.328125 1.71875 -2.28125 1.125 -2 C 0.484375 -1.6875 0.296875 -1.21875 0.296875 -0.875 C 0.296875 -0.140625 1.15625 0.09375 1.75 0.09375 C 2.484375 0.09375 2.828125 -0.390625 2.953125 -0.640625 C 2.984375 -0.265625 3.25 0.046875 3.625 0.046875 C 3.859375 0.046875 4.40625 -0.078125 4.40625 -0.796875 Z M 2.859375 -1.25 C 2.859375 -0.390625 2.203125 -0.125 1.8125 -0.125 C 1.390625 -0.125 1 -0.421875 1 -0.875 C 1 -1.453125 1.515625 -2.078125 2.859375 -2.125 Z M 2.859375 -1.25 "/>
</g>
<g id="glyph-0-7">
<path d="M 4.859375 0 L 4.859375 -0.28125 C 4.40625 -0.28125 4.1875 -0.28125 4.171875 -0.546875 L 4.171875 -2.25 C 4.171875 -2.984375 4.171875 -3.25 3.921875 -3.5625 C 3.71875 -3.8125 3.375 -3.921875 2.9375 -3.921875 C 2.109375 -3.921875 1.734375 -3.3125 1.609375 -3.0625 L 1.59375 -3.0625 L 1.59375 -3.921875 L 0.3125 -3.828125 L 0.3125 -3.546875 C 0.921875 -3.546875 1 -3.484375 1 -3.046875 L 1 -0.6875 C 1 -0.28125 0.890625 -0.28125 0.3125 -0.28125 L 0.3125 0 C 0.734375 -0.015625 0.890625 -0.03125 1.328125 -0.03125 C 1.75 -0.03125 1.859375 -0.015625 2.328125 0 L 2.328125 -0.28125 C 1.75 -0.28125 1.65625 -0.28125 1.65625 -0.6875 L 1.65625 -2.296875 C 1.65625 -3.234375 2.3125 -3.703125 2.875 -3.703125 C 3.40625 -3.703125 3.515625 -3.265625 3.515625 -2.734375 L 3.515625 -0.6875 C 3.515625 -0.28125 3.421875 -0.28125 2.828125 -0.28125 L 2.828125 0 C 3.25 -0.015625 3.421875 -0.03125 3.84375 -0.03125 C 4.265625 -0.03125 4.390625 -0.015625 4.859375 0 Z M 4.859375 0 "/>
</g>
<g id="glyph-1-0">
<path d="M 7.25 -2.078125 C 7.28125 -2.21875 7.296875 -2.234375 7.359375 -2.234375 C 7.484375 -2.25 7.625 -2.25 7.734375 -2.25 C 7.984375 -2.25 8.140625 -2.25 8.140625 -2.546875 C 8.140625 -2.59375 8.109375 -2.71875 7.9375 -2.71875 C 7.71875 -2.71875 7.5 -2.703125 7.265625 -2.703125 C 7.046875 -2.703125 6.828125 -2.6875 6.609375 -2.6875 C 6.21875 -2.6875 5.25 -2.71875 4.84375 -2.71875 C 4.734375 -2.71875 4.546875 -2.71875 4.546875 -2.4375 C 4.546875 -2.25 4.71875 -2.25 4.875 -2.25 L 5.25 -2.25 C 5.359375 -2.25 5.890625 -2.25 5.890625 -2.203125 C 5.890625 -2.1875 5.890625 -2.171875 5.828125 -1.9375 C 5.8125 -1.859375 5.65625 -1.234375 5.65625 -1.21875 C 5.484375 -0.546875 4.6875 -0.296875 4.078125 -0.296875 C 3.5 -0.296875 2.90625 -0.421875 2.4375 -0.78125 C 1.921875 -1.21875 1.921875 -1.90625 1.921875 -2.125 C 1.921875 -2.578125 2.125 -4.34375 3.09375 -5.40625 C 3.65625 -6.046875 4.609375 -6.46875 5.609375 -6.46875 C 6.859375 -6.46875 7.3125 -5.515625 7.3125 -4.703125 C 7.3125 -4.59375 7.28125 -4.453125 7.28125 -4.34375 C 7.28125 -4.203125 7.421875 -4.203125 7.546875 -4.203125 C 7.765625 -4.203125 7.78125 -4.203125 7.828125 -4.421875 L 8.390625 -6.640625 C 8.40625 -6.6875 8.421875 -6.734375 8.421875 -6.796875 C 8.421875 -6.9375 8.28125 -6.9375 8.171875 -6.9375 L 7.25 -6.21875 C 7.0625 -6.421875 6.546875 -6.9375 5.453125 -6.9375 C 2.296875 -6.9375 0.546875 -4.515625 0.546875 -2.5 C 0.546875 -0.6875 1.9375 0.171875 3.765625 0.171875 C 4.796875 0.171875 5.484375 -0.171875 5.8125 -0.515625 C 6.046875 -0.25 6.5625 0 6.625 0 C 6.71875 0 6.75 -0.078125 6.78125 -0.234375 Z M 7.25 -2.078125 "/>
</g>
<g id="glyph-1-1">
<path d="M 5.8125 -4.140625 C 6.46875 -4.609375 8.265625 -5.875 8.609375 -6.046875 C 8.84375 -6.171875 9.046875 -6.28125 9.546875 -6.296875 C 9.734375 -6.3125 9.890625 -6.3125 9.890625 -6.59375 C 9.890625 -6.671875 9.8125 -6.765625 9.71875 -6.765625 C 9.46875 -6.765625 9.171875 -6.734375 8.921875 -6.734375 C 8.515625 -6.734375 8.09375 -6.765625 7.6875 -6.765625 C 7.609375 -6.765625 7.421875 -6.765625 7.421875 -6.484375 C 7.421875 -6.296875 7.59375 -6.296875 7.65625 -6.296875 C 7.734375 -6.296875 7.9375 -6.296875 8.109375 -6.234375 L 3.609375 -3.125 L 4.390625 -6.265625 C 4.609375 -6.296875 4.953125 -6.296875 5.0625 -6.296875 C 5.1875 -6.296875 5.390625 -6.296875 5.421875 -6.328125 C 5.515625 -6.40625 5.53125 -6.578125 5.53125 -6.59375 C 5.53125 -6.71875 5.4375 -6.765625 5.3125 -6.765625 C 5.0625 -6.765625 4.8125 -6.75 4.5625 -6.75 C 4.3125 -6.75 4.078125 -6.734375 3.828125 -6.734375 C 3.5625 -6.734375 3.3125 -6.75 3.0625 -6.75 C 2.8125 -6.75 2.546875 -6.765625 2.28125 -6.765625 C 2.203125 -6.765625 2 -6.765625 2 -6.484375 C 2 -6.296875 2.125 -6.296875 2.421875 -6.296875 C 2.625 -6.296875 2.8125 -6.296875 3.015625 -6.28125 L 1.609375 -0.65625 C 1.5625 -0.5 1.5625 -0.5 1.375 -0.46875 C 1.21875 -0.46875 1.015625 -0.46875 0.859375 -0.46875 C 0.59375 -0.46875 0.578125 -0.46875 0.546875 -0.4375 C 0.421875 -0.375 0.421875 -0.21875 0.421875 -0.171875 C 0.421875 -0.15625 0.4375 0 0.640625 0 C 0.890625 0 1.140625 -0.015625 1.390625 -0.015625 C 1.640625 -0.015625 1.890625 -0.03125 2.140625 -0.03125 C 2.390625 -0.03125 2.65625 -0.015625 2.90625 -0.015625 C 3.15625 -0.015625 3.421875 0 3.671875 0 C 3.765625 0 3.828125 0 3.890625 -0.0625 C 3.9375 -0.125 3.953125 -0.265625 3.953125 -0.28125 C 3.953125 -0.46875 3.8125 -0.46875 3.546875 -0.46875 C 3.34375 -0.46875 3.15625 -0.46875 2.953125 -0.484375 L 3.453125 -2.53125 L 4.6875 -3.375 L 6.15625 -0.515625 C 5.953125 -0.46875 5.65625 -0.46875 5.625 -0.46875 C 5.484375 -0.46875 5.4375 -0.46875 5.375 -0.390625 C 5.328125 -0.34375 5.3125 -0.203125 5.3125 -0.171875 C 5.3125 -0.171875 5.3125 0 5.515625 0 C 5.84375 0 6.65625 -0.03125 6.984375 -0.03125 C 7.1875 -0.03125 7.40625 -0.015625 7.609375 -0.015625 C 7.8125 -0.015625 8.015625 0 8.203125 0 C 8.265625 0 8.46875 0 8.46875 -0.28125 C 8.46875 -0.46875 8.296875 -0.46875 8.15625 -0.46875 C 7.703125 -0.46875 7.6875 -0.5 7.59375 -0.65625 Z M 5.8125 -4.140625 "/>
</g>
<g id="glyph-1-2">
<path d="M 3.4375 -3.4375 L 5.265625 -3.4375 C 5.46875 -3.4375 5.59375 -3.4375 5.765625 -3.578125 C 5.953125 -3.75 5.953125 -3.96875 5.953125 -4 C 5.953125 -4.375 5.59375 -4.375 5.4375 -4.375 L 2.1875 -4.375 C 1.984375 -4.375 1.5625 -4.375 1.03125 -3.90625 C 0.6875 -3.59375 0.3125 -3.09375 0.3125 -2.984375 C 0.3125 -2.84375 0.421875 -2.84375 0.53125 -2.84375 C 0.6875 -2.84375 0.6875 -2.859375 0.78125 -2.96875 C 1.15625 -3.4375 1.796875 -3.4375 1.984375 -3.4375 L 2.875 -3.4375 L 2.53125 -2.390625 C 2.4375 -2.140625 2.21875 -1.515625 2.140625 -1.25 C 2.03125 -0.953125 1.84375 -0.421875 1.84375 -0.3125 C 1.84375 -0.046875 2.0625 0.125 2.3125 0.125 C 2.375 0.125 2.875 0.125 2.984375 -0.53125 Z M 3.4375 -3.4375 "/>
</g>
<g id="glyph-2-0">
<path d="M 5.078125 -0.96875 C 5.078125 -1.015625 5.0625 -1.03125 5.015625 -1.03125 C 4.90625 -1.03125 4.46875 -0.875 4.375 -0.59375 C 4.28125 -0.3125 4.1875 -0.3125 4.03125 -0.3125 C 3.65625 -0.3125 3.15625 -0.4375 2.8125 -0.53125 C 2.46875 -0.609375 2.09375 -0.703125 1.734375 -0.703125 C 1.703125 -0.703125 1.5625 -0.703125 1.46875 -0.671875 C 1.84375 -1.21875 1.9375 -1.5625 2.046875 -1.984375 C 2.1875 -2.515625 2.390625 -3.21875 2.734375 -3.796875 C 3.0625 -4.34375 3.234375 -4.390625 3.46875 -4.390625 C 3.796875 -4.390625 4.015625 -4.140625 4.015625 -3.796875 C 4.015625 -3.6875 3.984375 -3.625 3.984375 -3.59375 C 3.984375 -3.5625 4.015625 -3.53125 4.0625 -3.53125 C 4.09375 -3.53125 4.265625 -3.5625 4.5 -3.734375 C 4.65625 -3.828125 4.71875 -3.90625 4.71875 -4.171875 C 4.71875 -4.4375 4.578125 -4.84375 4.03125 -4.84375 C 3.421875 -4.84375 2.765625 -4.4375 2.390625 -4.015625 C 1.9375 -3.484375 1.640625 -2.796875 1.34375 -1.65625 C 1.171875 -1.03125 0.9375 -0.5 0.609375 -0.234375 C 0.546875 -0.171875 0.34375 0 0.34375 0.09375 C 0.34375 0.140625 0.40625 0.140625 0.4375 0.140625 C 0.6875 0.140625 1 -0.15625 1.09375 -0.234375 C 1.28125 -0.234375 1.5625 -0.234375 2.1875 -0.078125 C 2.71875 0.0625 3.09375 0.140625 3.46875 0.140625 C 4.328125 0.140625 5.078125 -0.640625 5.078125 -0.96875 Z M 5.078125 -0.96875 "/>
</g>
<g id="glyph-3-0">
<path d="M 4.375 -2.46875 C 4.375 -3.515625 3.5 -4.375 2.46875 -4.375 C 1.390625 -4.375 0.546875 -3.5 0.546875 -2.46875 C 0.546875 -1.40625 1.421875 -0.546875 2.453125 -0.546875 C 3.53125 -0.546875 4.375 -1.421875 4.375 -2.46875 Z M 4.375 -2.46875 "/>
</g>
<g id="glyph-4-0">
<path d="M 7.40625 -1.53125 C 7.40625 -1.640625 7.28125 -1.640625 7.234375 -1.640625 C 6.9375 -1.640625 6.078125 -1.25 5.96875 -0.75 C 5.484375 -0.75 5.140625 -0.796875 4.34375 -0.953125 C 3.984375 -1.015625 3.203125 -1.15625 2.640625 -1.15625 C 2.5625 -1.15625 2.453125 -1.15625 2.375 -1.15625 C 2.703125 -1.703125 2.828125 -2.171875 3 -2.8125 C 3.1875 -3.59375 3.59375 -4.984375 4.34375 -5.828125 C 4.46875 -5.96875 4.5 -6.015625 4.765625 -6.015625 C 5.21875 -6.015625 5.390625 -5.65625 5.390625 -5.328125 C 5.390625 -5.21875 5.359375 -5.109375 5.359375 -5.078125 C 5.359375 -4.96875 5.484375 -4.953125 5.53125 -4.953125 C 5.671875 -4.953125 5.96875 -5.03125 6.34375 -5.28125 C 6.75 -5.546875 6.796875 -5.734375 6.796875 -6.015625 C 6.796875 -6.515625 6.5 -6.9375 5.84375 -6.9375 C 5.21875 -6.9375 4.3125 -6.625 3.515625 -5.921875 C 2.375 -4.921875 1.890625 -3.296875 1.59375 -2.171875 C 1.453125 -1.578125 1.25 -0.78125 0.8125 -0.453125 C 0.71875 -0.359375 0.390625 -0.109375 0.390625 0.046875 C 0.390625 0.140625 0.5 0.171875 0.5625 0.171875 C 0.625 0.171875 0.9375 0.15625 1.484375 -0.25 C 1.859375 -0.25 2.1875 -0.234375 3.09375 -0.0625 C 3.53125 0.03125 4.25 0.171875 4.8125 0.171875 C 6.125 0.171875 7.40625 -1 7.40625 -1.53125 Z M 7.40625 -1.53125 "/>
</g>
</g>
<clipPath id="clip-0">
<path clip-rule="nonzero" d="M 121 17 L 142.054688 17 L 142.054688 49 L 121 49 Z M 121 17 "/>
</clipPath>
<clipPath id="clip-1">
<path clip-rule="nonzero" d="M 1 32 L 128 32 L 128 61.636719 L 1 61.636719 Z M 1 32 "/>
</clipPath>
<clipPath id="clip-2">
<path clip-rule="nonzero" d="M 0.71875 17 L 29 17 L 29 49 L 0.71875 49 Z M 0.71875 17 "/>
</clipPath>
</defs>
<path fill-rule="nonzero" fill="rgb(79.998779%, 79.998779%, 79.998779%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-dasharray="2.98883 2.98883" stroke-miterlimit="10" d="M -21.492786 -18.657756 L 21.490194 -18.657756 L 21.490194 18.658137 L -21.492786 18.658137 Z M -21.492786 -18.657756 " transform="matrix(0.989127, 0, 0, -0.989127, 95.71222, 32.611517)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="72.977136" y="9.888302"/>
<use xlink:href="#glyph-0-1" x="78.041283" y="9.888302"/>
<use xlink:href="#glyph-0-2" x="81.586185" y="9.888302"/>
<use xlink:href="#glyph-0-3" x="85.151486" y="9.888302"/>
<use xlink:href="#glyph-0-1" x="90.215633" y="9.888302"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-4" x="96.802571" y="9.888302"/>
<use xlink:href="#glyph-0-5" x="103.005485" y="9.888302"/>
<use xlink:href="#glyph-0-6" x="105.537559" y="9.888302"/>
<use xlink:href="#glyph-0-7" x="110.095291" y="9.888302"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-1" x="114.902239" y="9.888302"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M -17.006507 -14.171476 L 17.007863 -14.171476 L 17.007863 14.171857 L -17.006507 14.171857 Z M -17.006507 -14.171476 " transform="matrix(0.989127, 0, 0, -0.989127, 95.71222, 32.611517)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-0" x="91.343246" y="35.992353"/>
</g>
<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M -80.367305 -14.171476 L -46.352935 -14.171476 L -46.352935 14.171857 L -80.367305 14.171857 Z M -80.367305 -14.171476 " transform="matrix(0.989127, 0, 0, -0.989127, 95.71222, 32.611517)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-1" x="25.280444" y="35.253475"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-2-0" x="34.850247" y="36.731231"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M -45.851388 -0.00178398 L -22.140453 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 95.71222, 32.611517)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.052447 -0.00178398 L 1.609609 1.68452 L 3.086606 -0.00178398 L 1.609609 -1.684139 Z M 6.052447 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 71.005549, 32.611517)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-1-2" x="61.147177" y="28.83503"/>
</g>
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 17.505461 -0.00178398 L 41.220345 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 95.71222, 32.611517)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 139.664062 32.613281 L 135.265625 30.945312 L 136.730469 32.613281 L 135.265625 34.277344 Z M 139.664062 32.613281 "/>
<g clip-path="url(#clip-0)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054065 -0.00178398 L 1.607278 1.68452 L 3.088224 -0.00178398 L 1.607278 -1.684139 Z M 6.054065 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 133.675823, 32.611517)"/>
</g>
<g clip-path="url(#clip-1)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 31.679103 -0.00178398 L 31.679103 -28.345118 L -95.038544 -28.345118 L -95.038544 -0.00178398 L -85.497302 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 95.71222, 32.611517)"/>
</g>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" d="M 14.324219 32.613281 L 9.925781 30.945312 L 11.390625 32.613281 L 9.925781 34.277344 Z M 14.324219 32.613281 "/>
<g clip-path="url(#clip-2)">
<path fill="none" stroke-width="0.99628" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 6.054788 -0.00178398 L 1.608001 1.68452 L 3.088947 -0.00178398 L 1.608001 -1.684139 Z M 6.054788 -0.00178398 " transform="matrix(0.989127, 0, 0, -0.989127, 8.335264, 32.611517)"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-3-0" x="124.582858" y="34.801444"/>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-4-0" x="123.163461" y="28.83503"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

35
paper/preamble.tex Normal file
View File

@@ -0,0 +1,35 @@
\usepackage[ %
acronym, % Separate acronyms and glossary
toc, % appear in ToC
automake, % auto-use the makeglossaries command (requires shell-escape)
nonumberlist, % don't back reference pages
nogroupskip, % don't group by letter
nopostdot % don't add a dot at the end of each element
]{glossaries}
\usepackage[stylemods=longextra]{glossaries-extra}
\setabbreviationstyle[acronym]{long-short}
\setglossarystyle{long-name-desc}
\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{cases}
\usepackage{empheq}
\usepackage[binary-units=true]{siunitx}
\sisetup{%
detect-all = true,
detect-family = true,
detect-mode = true,
detect-shape = true,
detect-weight = true,
detect-inline-weight = math,
}
\DeclareSIUnit\px{px}
\DeclareSIUnit\rms{rms}
\makeindex
\makeglossaries

134
paper/preamble_extra.tex Normal file
View File

@@ -0,0 +1,134 @@
\usepackage{float}
\usepackage{enumitem}
\usepackage{caption,tabularx,booktabs}
\usepackage{bm}
\usepackage{xpatch} % Recommanded for biblatex
\usepackage[ % use biblatex for bibliography
backend=biber, % use biber backend (bibtex replacement) or bibtex
style=ieee, % bib style
hyperref=true, % activate hyperref support
backref=true, % activate backrefs
isbn=false, % don't show isbn tags
url=false, % don't show url tags
doi=false, % don't show doi tags
urldate=long, % display type for dates
maxnames=3, %
minnames=1, %
maxbibnames=5, %
minbibnames=3, %
maxcitenames=2, %
mincitenames=1 %
]{biblatex}
\setlength\bibitemsep{1.1\itemsep}
\usepackage{caption}
\usepackage{subcaption}
\captionsetup[figure]{labelfont=bf}
\captionsetup[subfigure]{labelfont=bf}
\captionsetup[listing]{labelfont=bf}
\captionsetup[table]{labelfont=bf}
\usepackage{xcolor}
\definecolor{my-blue}{HTML}{6b7adb}
\definecolor{my-pale-blue}{HTML}{e6e9f9}
\definecolor{my-red}{HTML}{db6b6b}
\definecolor{my-pale-red}{HTML}{f9e6e6}
\definecolor{my-green}{HTML}{6bdbb6}
\definecolor{my-pale-green}{HTML}{e6f9f3}
\definecolor{my-yellow}{HTML}{dbd26b}
\definecolor{my-pale-yellow}{HTML}{f9f7e6}
\definecolor{my-orange}{HTML}{dba76b}
\definecolor{my-pale-orange}{HTML}{f9f0e6}
\definecolor{my-grey}{HTML}{a3a3a3}
\definecolor{my-pale-grey}{HTML}{f0f0f0}
\definecolor{my-turq}{HTML}{6bc7db}
\definecolor{my-pale-turq}{HTML}{e6f6f9}
\usepackage{inconsolata}
\usepackage[newfloat=true, chapter]{minted}
\usemintedstyle{autumn}
\setminted{frame=lines,breaklines=true,tabsize=4,fontsize=\scriptsize,autogobble=true,labelposition=topline,bgcolor=my-pale-grey}
\setminted[matlab]{label=Matlab}
\setminted[latex]{label=LaTeX}
\setminted[bash]{label=Bash}
\setminted[python]{label=Python}
\setminted[text]{label=Results}
\setminted[md]{label=Org Mode}
\setmintedinline{fontsize=\normalsize,bgcolor=my-pale-grey}
\usepackage[most]{tcolorbox}
\tcbuselibrary{minted}
\newtcolorbox{seealso}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=See Also}
\newtcolorbox{hint}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=Hint}
\newtcolorbox{definition}{enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Definition}
\newtcolorbox{important}{ enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Important}
\newtcolorbox{exampl}[1][]{ enhanced,breakable,colback=my-pale-green,colframe=my-green,fonttitle=\bfseries,title=Example,#1}
\newtcolorbox{exercice}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Exercice}
\newtcolorbox{question}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Question}
\newtcolorbox{answer}{ enhanced,breakable,colback=my-pale-turq,colframe=my-turq,fonttitle=\bfseries,title=Answer}
\newtcolorbox{summary}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Summary}
\newtcolorbox{note}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Note}
\newtcolorbox{caution}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Caution}
\newtcolorbox{warning}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Warning}
\newtcolorbox{my-quote}[1]{%
colback=my-pale-grey,
grow to right by=-10mm,
grow to left by=-10mm,
boxrule=0pt,
boxsep=0pt,
breakable,
enhanced jigsaw,
borderline west={4pt}{0pt}{my-grey}}
\renewenvironment{quote}{\begin{my-quote}}{\end{my-quote}}
\newtcolorbox{my-verse}[1]{%
colback=my-pale-grey,
grow to right by=-10mm,
grow to left by=-10mm,
boxrule=0pt,
boxsep=0pt,
breakable,
enhanced jigsaw,
borderline west={4pt}{0pt}{my-grey}}
\renewenvironment{verse}{\begin{my-verse}}{\end{my-verse}}
\usepackage{environ}% http://ctan.org/pkg/environ
\NewEnviron{aside}{%
\marginpar{\BODY}
}
\renewenvironment{verbatim}{\VerbatimEnvironment\begin{minted}[]{text}}{\end{minted}}
\usepackage{soul}
\sethlcolor{my-pale-grey}
\let\OldTexttt\texttt
\renewcommand{\texttt}[1]{{\ttfamily\hl{\mbox{\,#1\,}}}}
\makeatletter
\preto\Gin@extensions{png,}
\DeclareGraphicsRule{.png}{pdf}{.pdf}{\noexpand\Gin@base.pdf}
\preto\Gin@extensions{gif,}
\DeclareGraphicsRule{.gif}{png}{.png}{\noexpand\Gin@base.png}
\makeatother
\usepackage{hyperref}
\hypersetup{
colorlinks = true,
allcolors = my-blue
}
\usepackage{hypcap}