Tikz figures in separate files
authorThomas Pietrzak <thomas.pietrzak@gmail.com>
Thu, 7 Apr 2022 17:39:54 +0000 (19:39 +0200)
committerThomas Pietrzak <thomas.pietrzak@gmail.com>
Thu, 7 Apr 2022 17:39:54 +0000 (19:39 +0200)
20 files changed:
figures/activibesets.tex [new file with mode: 0644]
figures/adaptativeprocedure.tex [new file with mode: 0644]
figures/buttonfeedback.tex [new file with mode: 0644]
figures/flexuralstiffnesses.tex
figures/hapticpath.tex
figures/lagmeter.tex
figures/lexical.tex [new file with mode: 0644]
figures/piezotrigger.tex
figures/semantic.tex [new file with mode: 0644]
figures/stimtacpatterns.tex [new file with mode: 0644]
figures/summonexample.tex
figures/syntactic.tex [new file with mode: 0644]
figures/tactiledm.tex
figures/tactileillusions.tex [new file with mode: 0644]
figures/tactilepattern.tex [new file with mode: 0644]
figures/tactiletexture.tex [new file with mode: 0644]
mystyle.sty
tex/2-output.tex
tex/3-input.tex
tex/4-loop.tex

diff --git a/figures/activibesets.tex b/figures/activibesets.tex
new file mode 100644 (file)
index 0000000..d175d66
--- /dev/null
@@ -0,0 +1,161 @@
+%!TEX root = ../hdrmain.tex
+
+\begin{figure}[htb]
+  \newcommand{\sine}[3]{\foreach \x in {1,...,{#3}}
+    {
+      \draw[thick] 
+      ({4*\x*#1},0) sin 
+      ({4*\x*#1+#1},#2) cos 
+      ({4*\x*#1+2*#1},0) sin 
+      ({4*\x*#1+3*#1},{-#2}) cos 
+      ({4*\x*#1+4*#1},0);
+    }
+  }
+  \tikzexternalenable
+  \begin{tikzpicture}
+    \def\s{0.03}
+    \def\nl{11}
+    \def\labely{-40}
+    \def\labelw{0.7}
+    \pgfmathsetmacro{\setwidth}{(18-\labelw)/6}
+    \begin{scope}[xshift=-2mm]%[xshift=-\labelw cm]
+      \foreach \x in {1,...,10}
+      {
+        \begin{scope}[yshift=(-(\x-1)*\nl)]
+          \draw[x=1mm,y=1mm] (0,0) node {\x};
+        \end{scope}
+      }
+    \end{scope}
+    \begin{scope}[xshift=0cm] %Set A
+      \node[x=1mm,y=1mm, anchor=center] () at (14,\labely){Set A};
+      \foreach \x in {1,...,10}
+      {
+        \begin{scope}[yshift=(-(\x-1)*\nl)]
+          \foreach \y in {1,...,\x}
+          {
+            \begin{scope}[xshift=(\y*6)]
+              \sine{\s}{.10}{1}
+            \end{scope}
+          }
+        \end{scope}
+      }
+    \end{scope}
+    \begin{scope}[xshift=\setwidth cm] %Set B
+      \node[x=1mm,y=1mm, anchor=center] () at (14,\labely){Set B};
+      \foreach \x in {1,...,10}
+      {
+        \begin{scope}[yshift=(-(\x-1)*\nl)]
+          \sine{\s}{.10}{\x}
+        \end{scope}
+      }
+    \end{scope}
+    \begin{scope}[xshift=2*\setwidth cm] %Set C
+      \node[x=1mm,y=1mm, anchor=center] () at (14,\labely){Set C};
+      \foreach \x in {1,...,10}
+      {
+        \begin{scope}[yshift=(-(\x-1)*\nl)]
+          \pgfmathtruncatemacro{\l}{20-2*\x}
+          \ifnum \x < 10
+            \sine{\s}{.10}{\l}
+          \fi
+          \pgfmathsetmacro{\ll}{\l*\s*40-1}
+          \begin{scope}[xshift=\ll mm]
+            \foreach \y in {1,...,\x} {
+              \pgfmathsetmacro{\m}{\y*\s*80}
+              \begin{scope}[xshift=\m mm]
+                \sine{\s}{.10}{1}
+              \end{scope}
+            }
+          \end{scope}
+        \end{scope}
+      }
+    \end{scope}
+    \begin{scope}[xshift=3*\setwidth cm] %Set D
+      \node[x=1mm,y=1mm, anchor=center] () at (14,\labely){Set D};
+      \foreach \x in {10,...,1}
+      {
+        \begin{scope}[yshift=(-(10-\x)*\nl)]
+          \foreach \y in {1,...,\x} {
+            \pgfmathsetmacro{\m}{\y*\s*80}
+            \begin{scope}[xshift=\m mm]
+              \sine{\s}{.10}{1}
+            \end{scope}
+          }
+          \pgfmathtruncatemacro{\l}{20-2*\x}
+          \pgfmathsetmacro{\ll}{\x*\s*80+2}
+          \ifnum \x < 10
+            \begin{scope}[xshift=\ll mm]
+              \sine{\s}{.10}{\l}
+            \end{scope}
+          \fi
+        \end{scope}
+      }
+    \end{scope}
+    \begin{scope}[xshift=4*\setwidth cm] %Set E
+      \node[x=1mm,y=1mm, anchor=center] () at (14,\labely){Set E};
+      \foreach \x in {1,...,10}
+      {
+        \begin{scope}[yshift=(-(\x-1)*\nl)]
+          \foreach \y in {1,...,\x} {
+            \pgfmathsetmacro{\m}{\y*\s*80}
+            \begin{scope}[xshift=\m mm]
+              \sine{\s}{.10}{1}
+            \end{scope}
+          }
+          \pgfmathtruncatemacro{\l}{20-2*\x}
+          \pgfmathsetmacro{\ll}{\x*\s*80+2}
+          \ifnum \x < 10
+            \begin{scope}[xshift=\ll mm]
+              \sine{\s}{.10}{\l}
+            \end{scope}
+          \fi
+        \end{scope}
+      }
+    \end{scope}
+    \begin{scope}[xshift=5*\setwidth cm] %Set F
+      \node[x=1mm,y=1mm, anchor=center] () at (14,\labely){Set F};
+      \foreach \x in {1,...,4}
+      {
+        \pgfmathtruncatemacro{\xx}{\x-1}
+        \begin{scope}[yshift=(-\xx*\nl)]
+          \foreach \y in {0,...,\xx}
+          {
+            \begin{scope}[xshift=(\y*6)]
+              \sine{\s}{.10}{1}
+            \end{scope}
+          }
+        \end{scope}
+      }
+      \begin{scope}[yshift=-4*\nl]
+        \sine{\s}{.10}{7}
+      \end{scope}
+      \foreach \x in {1,...,4}
+      {
+        \begin{scope}[yshift=(-(\x+4)*\nl)]
+          \sine{\s}{.10}{7}
+          \begin{scope}[xshift=22]
+            \foreach \y in {1,...,\x}
+            {
+              \begin{scope}[xshift=(\y*6)]
+                \sine{\s}{.10}{1}
+              \end{scope}
+            }
+          \end{scope}
+        \end{scope}
+      }
+      \begin{scope}[yshift=-9*\nl]
+        \sine{\s}{.10}{7}
+        \begin{scope}[xshift=28]
+          \sine{\s}{.10}{7}
+        \end{scope}
+      \end{scope}
+    \end{scope}
+%    \node[x=1mm,y=1mm, anchor=center] () at (70,-36){Set C};
+%    \node[x=1mm,y=1mm, anchor=center] () at (103,-36){Set D};
+%    \node[x=1mm,y=1mm, anchor=center] () at (136,-36){Set E};
+%    \node[x=1mm,y=1mm, anchor=center] () at (160,-36){Set F};
+  \end{tikzpicture}
+  \tikzexternaldisable
+  \caption[6 pattern sets evaluated in Activibe.]{Visual representation of the 6 pattern sets we evaluated in two laboratory studies, and a longitudinal study.}
+  \label{fig:activibesets}
+\end{figure}
diff --git a/figures/adaptativeprocedure.tex b/figures/adaptativeprocedure.tex
new file mode 100644 (file)
index 0000000..1ebd64f
--- /dev/null
@@ -0,0 +1,61 @@
+%!TEX root = ../hdrmain.tex
+
+\begin{figure}[htb]
+  \definecolor{cellred}{rgb}    {0.98,0.17,0.15}
+  \definecolor{cellblue}{rgb}    {0.17,0.60,0.99}
+  \def\sx{4.7mm}
+  \def\sy{10mm}
+  \def\revthickness{1.5pt}
+
+  \newcommand{\good}[1]{
+    \node[x=\sx,y=\sy, inner sep=1mm,circle,fill=cellblue] at (#1) {};
+  }
+  \newcommand{\goodrev}[1]{
+    \node[x=\sx,y=\sy, inner sep=1mm,circle,fill=cellblue, line width=\revthickness, draw=black] at (#1) {};
+  }
+
+  \newcommand{\wrong}[1]{
+    \node[x=\sx,y=\sy, inner sep=1mm,circle,fill=cellred] at (#1) {};
+  }
+  \newcommand{\wrongrev}[1]{
+    \node[x=\sx,y=\sy, inner sep=1mm,circle,fill=cellred, line width=\revthickness, draw=black] at (#1) {};
+  }
+  \newcommand{\rev}[1]{
+    \node[x=\sx,y=\sy, inner sep=1mm,circle,line width=\revthickness, draw=black] at (#1) {};
+  }
+  
+  \def\values{{4,4,3,3,2,2,1,2,2,1,1.3,1.3,1.6,1.6,1.3,1.3,1,1.3,1.3,1,1.3,1.3,1,1.3,1.6,1.6,1.3,1.6,1.6,1.3}}
+  \def\vtypes{{0,0,0,0,0,0,3,0,1,3,0,2,0,1,0,0,3,0,1,3,0,1,3,2,0,1,3,0,1,3}}
+
+  \begin{tikzpicture}
+    %Axis
+    \draw[x=1mm,y=1mm, <->]
+    (-5,45) -- (-5,0) -- (150,0);
+    \node[x=\sx,y=\sy] at (0,-0.3) {1};
+    \node[x=\sx,y=\sy] at (9,-0.3) {10};
+    \node[x=\sx,y=\sy] at (19,-0.3) {20};
+    \node[x=\sx,y=\sy] at (29,-0.3) {30};
+    \node[x=\sx,y=\sy] at (15,-0.6) {Trial};
+    \node[x=\sx,y=\sy,rotate=90] at (-2,2.5) {Intensity};
+
+    \draw[x=\sx,y=\sy, dotted, line width=1.2pt]
+    (13,1.3) -- (32,1.3);
+
+    %data
+    \foreach \i in {0,...,29} {
+      \pgfmathsetmacro{\ti}{\vtypes[\i]}
+      \ifthenelse{\ti=0}{\good{\i,\values[\i]}}{}
+      \ifthenelse{\ti=1}{\goodrev{\i,\values[\i]}}{}
+      \ifthenelse{\ti=2}{\wrong{\i,\values[\i]}}{}
+      \ifthenelse{\ti=3}{\wrongrev{\i,\values[\i]}}{}
+    }
+    \good{25,4} \node[x=\sx,y=\sy, align=left, anchor=west] at (25.5,4) {Good answer};
+    \wrong{25,3.5} \node[x=\sx,y=\sy, align=left, anchor=west] at (25.5,3.5) {Wrong answer};
+    \rev{25,3} \node[x=\sx,y=\sy, align=left, anchor=west] at (25.5,3) {Reversal};
+    \draw[x=\sx,y=\sy, dotted, line width=1.2pt] (24.7,2.5) -- (25.3,2.5); \node[x=\sx,y=\sy, align=left, anchor=west] at (25.5,2.5) {Estimated threshold};
+
+%    \node[x=1mm,y=1mm, anchor=center] () at (160,-36){Set F};
+  \end{tikzpicture}
+  \caption[Adaptative procedure.]{Example of an adaptative procedure.}
+  \label{fig:adaptativeprocedure}
+\end{figure}
diff --git a/figures/buttonfeedback.tex b/figures/buttonfeedback.tex
new file mode 100644 (file)
index 0000000..828523a
--- /dev/null
@@ -0,0 +1,50 @@
+%!TEX root = ../hdrmain.tex
+
+\begin{figure}[htb]
+  \definecolor{cellred}{rgb}    {0.98,0.17,0.15}
+  \definecolor{cellblue}{rgb}   {0.17,0.60,0.99}
+  \def\scale{1mm}
+
+  \newcommand{\nodec}[3]{\node[x=1mm,y=1mm, draw, fill=white, circle, align=center, text width=4mm, minimum size=1mm] (#3) at (#1) {\small #2};}
+  \newcommand{\nodes}[3]{\node[x=1mm,y=1mm, draw, fill=white, rectangle, minimum size=6mm] (#3) at (#1) {\small #2};}
+
+  \centering
+
+  \tikzexternalenable
+  \begin{tikzpicture} %v lines
+    \draw[x=\scale, y=\scale, <->] (0,40) -- (0,0) -- (85,0) node [anchor=north east] {Displacement (mm)};
+    \node[x=\scale, y=\scale, anchor=south, rotate=90] () at (0,30){Force (N)};
+
+    \nodec{15,30}{$1$}{one};
+    \nodec{60,30}{$1'$}{oneb};
+    \nodes{80,40}{$2$}{two};
+    \nodec{45,10}{$3$}{three};
+    \nodec{0,10}{$3'$}{threeb};
+
+    \draw[x=\scale, y=\scale, ->, -stealth', draw=cellred, ultra thick] (0,20) -- (one);
+    \draw[x=\scale, y=\scale, ->, -stealth', draw=cellred, ultra thick] (one) -- (45,20) -- (oneb);
+    \draw[x=\scale, y=\scale, ->, -stealth', draw=cellred, ultra thick] (oneb) -- (two);
+
+    \draw[x=\scale, y=\scale, ->, -stealth', draw=cellblue, ultra thick] (two) -- (three);
+    \draw[x=\scale, y=\scale, ->, -stealth', draw=cellblue, ultra thick] (three) -- (15,20) -- (threeb);
+
+    \draw[x=\scale, y=\scale, draw, ultra thick, dashed] (one) -- (oneb);
+    \draw[x=\scale, y=\scale, draw, ultra thick, dashed] (three) -- (threeb);
+
+    \draw[x=\scale, y=\scale, draw=cellred, ultra thick] (90,40) -- (98,40);
+      \node[x=\scale, y=\scale, anchor=west] () at (100,40){Press curve};
+    \draw[x=\scale, y=\scale, draw=cellblue, ultra thick] (90,32) -- (98,32);
+      \node[x=\scale, y=\scale, anchor=west] () at (100,32){Release curve};
+    \draw[x=\scale, y=\scale, draw, ultra thick, dashed] (90,24) -- (98,24);
+      \node[x=\scale, y=\scale, anchor=west] () at (100,24){Jump};
+    \nodec{94,16}{$x$}{}
+      \node[x=\scale, y=\scale, anchor=west] () at (100,16){Tactile point};
+    \nodes{94,8}{$y$}{}
+      \node[x=\scale, y=\scale, anchor=west] () at (100,8){Bottom-out};
+
+%    \node[x=\scale,y=\scale, align=right, text width=1.8cm, anchor=east] () at (0,20){circles};
+  \end{tikzpicture}
+  \tikzexternaldisable
+  \caption[Force-displacement curve for a tactile button.]{Force-displacement curve for a tactile button, adapted and simplified from~\cite{kim13}.}
+  \label{fig:buttonfeedback}
+\end{figure}
index b0de67c7d54bd6d6776ad902658b6df623435ad2..ef5e0f2d4ca5f9aa31fa76e0ade4c903bcd95f23 100644 (file)
 
   \end{tikzpicture}
   \tikzexternaldisable
-  \label{fig:flexuralstiffnesses}
   \caption[Flexural stiffnesses]{Flexural stiffnesses of the 5 prototypes of HyperBrush we used for our evaluations.}
+  \label{fig:flexuralstiffnesses}
 \end{figure}
index 6995e03c435ca4d1890f9de6e04e4be3c8b16f40..f68b97c40a8a28e2f868a9c95dd885e66ac4c6da 100644 (file)
 \caption[Haptic rendering pipeline.]{Haptic rendering pipeline with the system side and user side. Both have a hardware and a software aspect.}
 \label{fig:hapticpath}
 \end{figure}
-
-\begin{figure}[htb]
-  \centering
-  \definecolor{cellred}{rgb}    {0.98,0.17,0.15}
-  \definecolor{cellblue}{rgb}    {0.17,0.60,0.99}
-  
-  \newcommand{\labelcell}[2]{
-  \node[minimum width=1.0cm, minimum height=.75cm,text width=3.0cm, align=center, outer sep=0, column sep=0cm](#1) {\textbf{#2}};
-  }
-  \newcommand{\bluecell}[2]{
-    \node[minimum width=3.0cm, minimum height=1.3cm,fill=cellblue, text=white,text width=3.5cm, align=center, rounded corners=2ex, outer sep=0](#1) {#2};
-  }
-  \newcommand{\redcell}[2]{
-    \node[minimum width=3.0cm, minimum height=1.3cm,fill=cellred, text=white,text width=3.5cm, align=center, rounded corners=2ex, outer sep=0](#1) {#2};
-  }
-  \tikzexternalenable
-  \begin{tikzpicture}
-    \small
-    \node[anchor=south, minimum width=\textwidth,minimum height=25mm, inner sep=0,fill=black!10, outer sep=0](thebar3) at (0,1.35) {};
-    \node[anchor=south, minimum width=\textwidth,minimum height=.75mm, inner sep=0, outer sep=0](thebar3) at (0,3.25) {\textbf{Physical World}};
-    \matrix[row sep=1.25cm, column sep=7mm,inner sep=0, node distance=0, outer sep=0mm] (cells) {
-      \labelcell{elecmeca}{Electronics\\Mechanics} & \bluecell{mechanics}{Electro-Mechanical\\System} & & & \redcell{sensory}{Sensory\\system} & \labelcell{biopsycho}{Biology\\Psychology}\\
-      \labelcell{csmath}{Computer Science\\Mathematics} & \bluecell{software}{Software\\Controller} & & & \redcell{cognitive}{Cognitive\\system} & \labelcell{ergocs}{Ergonomy\\Cognitive Sciences}\\
-      & \labelcell{info}{Information} & & & \labelcell{perception}{Perception} \\
-    };
-    \draw [->, -stealth',  thick] (info.north) -- (software.south) node [midway, left] {Data};
-    \draw [->, -stealth',  thick] (software.north) -- (mechanics.south) node [midway, left] {Command};
-    \draw [->, -stealth',  thick] (mechanics.east) -- (sensory.west) node [midway, above] {Physical };
-    \draw [->, -stealth',  thick] (mechanics.east) -- (sensory.west) node [midway, below] { effect};
-    \draw [->, -stealth',  thick] (sensory.south) -- (cognitive.north) node [midway, right] {Sensation};
-    \draw [->, -stealth',  thick] (cognitive.south) -- (perception.north) node [midway, right] {Interpretation};
-  
-  %  \draw [->, -stealth',  thick]
-  %     edge ;
-  %  \draw [->, -stealth',  thick]
-  %    (software.north) edge (mechanics.south);
-  \end{tikzpicture}
-  \tikzexternaldisable
-  \caption[Haptic rendering pipeline.]{Haptic rendering pipeline with the system side and user side. Both have a hardware and a software aspect.}
-  \label{fig:hapticpath}
-  \end{figure}
-  
\ No newline at end of file
index 9bd82dfaf43cdd15f26139d71f2e1748a5c1e38e..05ffb54199e8ccd4b60e61104cec465bc80893d0 100644 (file)
     \scriptsize
     %\node[anchor=south west] () at (0, 55) {Device};
     %\draw[very thick] (0,55) -- (170,55);
-
     \redcell{15,65}{User action}{}
     \dashedcell{30,65}{Device HID sent}{mousehid}
     \darkbluecell{125,65}{Sytem response}{}
 
-    \draw[fill=black!10, rounded corners=2mm] (0,0) rectangle (170,55);
+    \draw[fill=black!10, rounded corners=2mm] (0,0) rectangle (169,55);
 
     \node[anchor=south west] () at (0, 10) {Host computer};
-    \draw[very thick] (0,10) -- (170,10);
+    \draw[very thick] (0,10) -- (169,10);
 
     \bluecell{45,20}{Raw HID received}{rawhidreceived1}
       \draw[ultra thick] (45,8) -- (45,12);
@@ -59,7 +58,7 @@
       \node[anchor=north] () at (160, 8) {photodiode};
 
     \node[anchor=south west] () at (0, 35) {Arduino};
-    \draw[very thick] (0,35) -- (170,35);
+    \draw[very thick] (0,35) -- (169,35);
 
     \bluecell{20,45}{Piezo trigger}{}
       \draw[ultra thick] (20,33) -- (20,37);
diff --git a/figures/lexical.tex b/figures/lexical.tex
new file mode 100644 (file)
index 0000000..fea0fc9
--- /dev/null
@@ -0,0 +1,51 @@
+%!TEX root = ../hdrmain.tex
+
+\begin{figure}[htb]
+  \tikzexternalenable
+  \def\sx{1mm}
+  \def\sy{0.6mm}
+  \begin{tikzpicture}
+    %\draw[loosely dotted] (0,-1) grid (17,1);
+    \draw[x=\sx,y=\sy, ultra thick]
+      (0,0) sin (1,10) cos (2,0) sin (3,-10) cos
+      (4,0) sin (5,10) cos (6,0) sin (7,-10) cos
+      (8,0) sin (9,10) cos (10,0) sin (11,-10) cos
+      (12,0);
+    \draw[x=\sx,y=\sy, xshift=15mm, ultra thick]
+      (0,0) sin (3,10) cos (6,0) sin (9,-10) cos
+      (12,0) sin (15,10) cos (18,0) sin (21,-10) cos
+      (24,0);
+    \node[x=1mm,y=1mm, anchor=center] () at (20,-9){Frequency};
+  
+    \draw[x=\sx,y=\sy, xshift=55mm, ultra thick]
+      (0,0) sin (1,10) cos (2,0) sin (3,-10) cos
+      (4,0) sin (5,10) cos (6,0) sin (7,-10) cos
+      (8,0) sin (9,10) cos (10,0) sin (11,-10) cos
+      (12,0);
+    \draw[x=\sx,y=\sy, ultra thick]
+      (70,0) sin (71,5) cos (72,0) sin (73,-5) cos (74,0) sin (75,5) cos (76,0) sin (77,-5) cos (78,0) sin (79,5) cos (80,0) sin (81,-5) cos (82,0);
+    \node[x=1mm,y=1mm, anchor=center] () at (68,-9){Amplitude};
+  
+    \draw[x=\sx,y=\sy, ultra thick]
+      (99,0) sin (100,10) cos (101,0) sin (102,-10) cos (103,0) sin (104,10) cos (105,0) sin (106,-10) cos (107,0);
+    \draw[x=\sx,y=\sy, ultra thick]
+      (110,0) sin (111,10) cos (112,0) sin (113,-10) cos (114,0) sin (115,10) cos (116,0) sin (117,-10) cos (118,0) sin (119,10) cos (120,0) sin (121,-10) cos (122,0) sin (123,10) cos (124,0) sin (125,-10) cos (126,0);
+    \node[x=1mm,y=1mm, anchor=center] () at (112,-9){Duration};
+  
+    \draw[x=\sx,y=\sy, xshift=140mm, ultra thick]
+      (0,0) sin (1,10) cos (2,0) sin (3,-10) cos
+      (4,0) sin (5,10) cos (6,0) sin (7,-10) cos
+      (8,0) sin (9,10) cos (10,0) sin (11,-10) cos
+      (12,0);
+    \draw[x=\sx,y=\sy, xshift=155mm, ultra thick]
+      (0,0) -- (0,10) -- (2,10) -- (2,-10) --
+      (4,-10) -- (4,10) -- (6,10) -- (6,-10) --
+      (8,-10) -- (8,10) -- (10,10) -- (10,-10) --
+      (12,-10) -- (12,0);
+    \node[x=1mm,y=1mm, anchor=center] () at (153,-9){Shape};
+  \end{tikzpicture}
+  \tikzexternaldisable
+  \caption[Haptic vocabulary.]{Four parameters of the vibrotactile output vocabulary: frequency, amplitude, duration and shape.}
+  \label{fig:lexical}
+  \end{figure}
+  
\ No newline at end of file
index 996051ffb9f61baeba2b4382bdd6bff0ab4a76d2..bf7db8a72d7246201705cec1d8e45618639f4056 100644 (file)
@@ -26,7 +26,7 @@
 
     % Threshold
 
-    \draw[draw=violet, ultra thick] (threshold) to ($(threshold) + (169,0)$);
+    \draw[draw=violet, ultra thick] (threshold) to ($(threshold) + (168,0)$);
     \node[violet, anchor=south east] () at ($(threshold) + (160,0)$) {$1.5V$ Threshold};
 
     % Arrows
@@ -35,6 +35,6 @@
     \draw[draw=customgreen, -stealth', very thick] (piezobottom) to (piezopoint);
   \end{tikzpicture}
   \tikzexternaldisable
-  \label{fig:piezotrigger}
   \caption[Latency measurement of a button press]{Latency measurement of a button press. The blue line goes to 5V when the finger touches the surface. The red lines goes to 0V when the button is pressed. The green curves shows the piezoelectric vibratio sensor signal. The violet line shows a $1.5V$ threshold.}
+  \label{fig:piezotrigger}
 \end{figure}
diff --git a/figures/semantic.tex b/figures/semantic.tex
new file mode 100644 (file)
index 0000000..f76cb5c
--- /dev/null
@@ -0,0 +1,85 @@
+%!TEX root = ../hdrmain.tex
+
+\begin{figure}[htb]
+  \centering
+  \definecolor{cellred}{rgb}    {0.98,0.17,0.15}
+  \definecolor{cellblue}{rgb}    {0.17,0.60,0.99}
+  %
+  \newcommand{\labelcell}[2]{
+  \node[minimum width=1.0cm, minimum height=.75cm,text width=3.0cm, align=center, outer sep=0, column sep=0cm](#1) {\textbf{#2}};
+  }
+  \newcommand{\bluecell}[2]{
+    \node[minimum width=3.0cm, minimum height=1cm,fill=cellblue, text=white,text width=3.5cm, align=center, rounded corners=2ex, outer sep=0](#1) {#2};
+  }
+  \newcommand{\redcell}[2]{
+    \node[minimum width=3.0cm, minimum height=1cm,fill=cellred, text=white,text width=3.5cm, align=center, rounded corners=2ex, outer sep=0](#1) {#2};
+  }
+  \newcommand{\mediumbluecell}[2]{
+    \node[minimum width=2.0cm, minimum height=6mm,fill=cellblue, text=white,text width=2.0cm, align=center, rounded corners=2mm, outer sep=0](#1) {\footnotesize #2};
+  }
+  \newcommand{\mediumredcell}[2]{
+    \node[minimum width=2.0cm, minimum height=6mm,fill=cellred, text=white,text width=2.0cm, align=center, rounded corners=2mm, outer sep=0](#1) {\footnotesize #2};
+  }
+  \newcommand{\smallbluecell}[2]{
+    \node[minimum width=8mm, minimum height=5mm,fill=cellblue, text=white,text width=8mm, align=center, rounded corners=1mm, outer sep=0](#1) {\scriptsize #2};
+  }
+  \newcommand{\smallredcell}[2]{
+    \node[minimum width=8mm, minimum height=5mm,fill=cellred, text=white,text width=8mm, align=center, rounded corners=1mm, outer sep=0](#1) {\scriptsize #2};
+  }
+  \tikzexternalenable
+  \begin{tikzpicture}
+    %\small
+    \matrix[row sep=1mm, column sep=10mm,inner sep=0, node distance=0, outer sep=0mm] (cells) {
+      & & \smallbluecell{rh1}{Rh1} & \smallredcell{t1}{T1} & & \\
+      & \mediumbluecell{rhythm}{Rhythm} & \smallbluecell{rh2}{Rh2} & \smallredcell{t2}{T2} & \mediumredcell{type}{Type} & \\
+      & & \smallbluecell{rh3}{Rh3} & \smallredcell{t3}{T3} & & \\
+      & & \smallbluecell{ro1}{Ro1} & \smallredcell{i1}{I1} & & \\
+      \mediumbluecell{tacton}{Tacton} & \mediumbluecell{roughness}{Roughness} & \smallbluecell{ro2}{Ro2} & \smallredcell{i2}{I2} & \mediumredcell{importance}{Importance} & \mediumredcell{information}{Information}\\
+      & & \smallbluecell{ro3}{Ro3} & \smallredcell{i3}{I3} & & \\
+      & & \smallbluecell{l1}{L1} & \smallredcell{d1}{D1} & & \\
+      & \mediumbluecell{location}{Location} & \smallbluecell{l2}{L2} & \smallredcell{d2}{D2} & \mediumredcell{delay}{Delay} & \\
+      & & \smallbluecell{l3}{L3} & \smallredcell{d3}{D3} & & \\
+    };
+    \draw (tacton.north) edge[->, -stealth', thick, out=90,in=180] (rhythm.west);
+    \draw (tacton.east) edge[->, -stealth', thick, out=0,in=180] (roughness.west);
+    \draw (tacton.south) edge[->, -stealth', thick, out=-90,in=180] (location.west);
+
+    \draw (rhythm.north) edge[->, -stealth', thick, out=30,in=180] (rh1.west);
+    \draw (rhythm.east) edge[->, -stealth', thick, out=0,in=180] (rh2.west);
+    \draw (rhythm.south) edge[->, -stealth', thick, out=-30,in=180] (rh3.west);
+    \draw (roughness.north) edge[->, -stealth', thick, out=30,in=180] (ro1.west);
+    \draw (roughness.east) edge[->, -stealth', thick, out=0,in=180] (ro2.west);
+    \draw (roughness.south) edge[->, -stealth', thick, out=-30,in=180] (ro3.west);
+    \draw (location.north) edge[->, -stealth', thick, out=30,in=180] (l1.west);
+    \draw (location.east) edge[->, -stealth', thick, out=0,in=180] (l2.west);
+    \draw (location.south) edge[->, -stealth', thick, out=-30,in=180] (l3.west);
+
+    \draw (information.north) edge[->, -stealth', thick, out=90,in=0] (type.east);
+    \draw (information.west) edge[->, -stealth', thick, out=180,in=0] (importance.east);
+    \draw (information.south) edge[->, -stealth', thick, out=-90,in=0] (delay.east);
+
+    \draw (type.north) edge[->, -stealth', thick, out=150,in=0] (t1.east);
+    \draw (type.west) edge[->, -stealth', thick, out=180,in=0] (t2.east);
+    \draw (type.south) edge[->, -stealth', thick, out=-150,in=0] (t3.east);
+    \draw (importance.north) edge[->, -stealth', thick, out=150,in=0] (i1.east);
+    \draw (importance.west) edge[->, -stealth', thick, out=180,in=0] (i2.east);
+    \draw (importance.south) edge[->, -stealth', thick, out=-150,in=0] (i3.east);
+    \draw (delay.north) edge[->, -stealth', thick, out=150,in=0] (d1.east);
+    \draw (delay.west) edge[->, -stealth', thick, out=180,in=0] (d2.east);
+    \draw (delay.south) edge[->, -stealth', thick, out=-150,in=0] (d3.east);
+
+    \draw[<->, stealth-stealth, thick] (rh1) -- (t1);
+    \draw[<->, stealth-stealth, thick] (rh2) -- (t2);
+    \draw[<->, stealth-stealth, thick] (rh3) -- (t3);
+    \draw[<->, stealth-stealth, thick] (ro1) -- (i1);
+    \draw[<->, stealth-stealth, thick] (ro2) -- (i2);
+    \draw[<->, stealth-stealth, thick] (ro3) -- (i3);
+    \draw[<->, stealth-stealth, thick] (l1) -- (d1);
+    \draw[<->, stealth-stealth, thick] (l2) -- (d2);
+    \draw[<->, stealth-stealth, thick] (l3) -- (d3);
+    
+  \end{tikzpicture}
+  \tikzexternaldisable
+  \caption[Mapping information with Tactons.]{Illustration of a semantic mapping between 3-parameters Tactons and a 3-level information, adapted from~\cite{brown06}. 3 values of rhythm are mapped to 3 types of messages, 3 values of roughness are mapped to 3 degrees of importance, and 3 spatial locations are mapped to 3 values of delay.}
+  \label{fig:semantic}
+\end{figure}
diff --git a/figures/stimtacpatterns.tex b/figures/stimtacpatterns.tex
new file mode 100644 (file)
index 0000000..fb30d02
--- /dev/null
@@ -0,0 +1,144 @@
+%!TEX root = ../hdrmain.tex
+
+\begin{figure}[htb]
+  \definecolor{cellblue}{rgb}    {0.17,0.60,0.99}
+  \def\dx{80}
+  \def\dy{40}
+  \def\spacing{5}
+  \def\scale{0.72}
+  \linespread{1.0}
+  \def\n{7}
+  \pgfmathsetmacro{\nn}{\n - 1}
+
+  \centering
+
+  \tikzexternalenable
+  \begin{tikzpicture} %v lines
+    \foreach \i in {0,...,\nn} {
+      \pgfmathsetmacro{\xs}{\i*(\dx+\spacing)*\scale}
+      \begin{scope}[xshift=\xs]
+        %\clip[x=\scale,y=\scale] (0,0) rectangle (\dx,\dy);
+        \pgfmathsetmacro{\m}{2^\i}
+        \pgfmathsetmacro{\d}{\dx / \m}
+        \pgfmathsetmacro{\mm}{\m - 1}
+        \foreach \j in {0,...,\mm} {
+          \fill[x=\scale,y=\scale,color=cellblue] (\j*\d,0) rectangle (\j*\d + \d/2,\dy);
+        }
+        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
+      \end{scope}
+    }
+    \node[x=\scale,y=\scale, align=right, text width=1.8cm, anchor=east] () at (0,20){vertical lines};
+  \end{tikzpicture}
+
+  \vspace{1mm}
+
+  \begin{tikzpicture} %h lines
+    \foreach \i in {0,...,\nn} {
+      \pgfmathsetmacro{\xs}{\i*(\dx+\spacing)*\scale}
+      \begin{scope}[xshift=\xs]
+        %\clip[x=\scale,y=\scale] (0,0) rectangle (\dx,\dy);
+        \pgfmathsetmacro{\m}{2^\i}
+        \pgfmathsetmacro{\d}{\dy / \m}
+        \pgfmathsetmacro{\mm}{\m - 1}
+        \foreach \j in {0,...,\mm} {
+          \fill[x=\scale,y=\scale,color=cellblue] (0,\dy - \j*\d) rectangle (\dx,\dy - \j*\d - \d/2);
+        }
+        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
+      \end{scope}
+    }
+    \node[x=\scale,y=\scale, align=right, text width=1.8cm, anchor=east] () at (0,20){horizontal lines};
+  \end{tikzpicture}
+
+  \vspace{1mm}
+
+  \begin{tikzpicture} %squares
+    \foreach \i in {0,...,\nn} {
+      \pgfmathsetmacro{\xs}{\i*(\dx+\spacing)*\scale}
+      \begin{scope}[xshift=\xs]
+        %\clip[x=\scale,y=\scale,draw] (0,0) rectangle (\dx,\dy);
+        \pgfmathsetmacro{\mx}{2^(\i+1)}
+        \pgfmathsetmacro{\my}{2^\i}
+        \pgfmathsetmacro{\d}{\dx / \mx}
+        \pgfmathsetmacro{\mxx}{\mx-1}
+        \pgfmathsetmacro{\myy}{\my-1}
+        \foreach \j in {0,...,\mxx} {
+          \foreach \k in {0,...,\myy} {
+            \pgfmathsetmacro{\res}{int(Mod(\j + \k, 2))}
+            \ifthenelse{\res = 0}{
+              \fill[x=\scale,y=\scale,color=cellblue] (\j*\d,\dy - \k*\d) rectangle (\j*\d + \d,\dy - \k*\d - \d);
+            }{}
+          }
+        }
+        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
+      \end{scope}
+    }
+    \node[x=\scale,y=\scale, align=right, text width=1.8cm, anchor=east] () at (0,20){squares};
+  \end{tikzpicture}
+
+  \vspace{1mm}
+
+  \begin{tikzpicture} %dots
+    \foreach \i in {0,...,\nn} {
+      \pgfmathsetmacro{\xs}{\i*(\dx+\spacing)*\scale}
+      \begin{scope}[xshift=\xs]
+        %\clip[x=\scale,y=\scale,draw] (0,0) rectangle (\dx,\dy);
+        \pgfmathsetmacro{\mx}{2^(\i+1)}
+        \pgfmathsetmacro{\my}{2^\i}
+        \pgfmathsetmacro{\d}{\dx / \mx}
+        \pgfmathsetmacro{\dd}{\d / 2}
+        \pgfmathsetmacro{\mxx}{\mx-1}
+        \pgfmathsetmacro{\myy}{\my-1}
+        \foreach \j in {0,...,\mxx} {
+          \foreach \k in {0,...,\myy} {
+            \pgfmathsetmacro{\res}{int(Mod(\j + \k, 2))}
+            \pgfmathsetmacro{\resb}{int(Mod(\k, 2))}
+            \ifthenelse{\res = 0 \AND \resb = 0}{
+              \fill [x=\scale,y=\scale,color=cellblue] (\j*\d+\dd,\dy-\k*\d-\dd) circle (\dd);
+            }{}
+          }
+        }
+        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
+      \end{scope}
+    }
+    \node[x=\scale,y=\scale, align=right, text width=1.8cm, anchor=east] () at (0,20){dots};
+  \end{tikzpicture}
+
+  \vspace{1mm}
+%nbc cs   1     2     3    4    5    6    7    8
+%1   4   3/3   1/3
+%2   8   7/7   5/7   3/7  1/7
+%4   16 15/15 13/15 11/15 9/15 7/15 5/15 3/15 1/15
+
+  \begin{tikzpicture} % circles
+    %\node[x=\scale,y=\scale, anchor=center] () at (10,10){\n};
+    \def\nx{1}
+    \foreach \i in {0,...,\nn} {
+      \pgfmathsetmacro{\xs}{\i*(\dx+\spacing)*\scale}
+      \begin{scope}[xshift=\xs]
+        \clip[x=\scale,y=\scale] (0,0) rectangle (\dx,\dy);
+        %\node[x=\scale,y=\scale, anchor=center] () at (0,0) {\i};
+        \pgfmathsetmacro{\nbc}{2^\i}
+        \pgfmathsetmacro{\nbcc}{2*\nbc}
+        \pgfmathsetmacro{\cs}{\nbc*4}
+        %\node[x=\scale,y=\scale, anchor=center] () at (\i+10,20) {\cs};
+        \foreach \j in {-14,...,\nbcc} {
+          \pgfmathsetmacro{\res}{int(Mod(\j, 2))}
+          \pgfmathsetmacro{\ci}{\cs - 2 * \j + 1}
+          \pgfmathsetmacro{\d}{\dy * \ci / (\cs - 1)}
+          \wlog{\i ; \j ; nbc \nbc ; cs \cs ; ci \ci ; d \d}
+          %\node[x=\scale,y=\scale, anchor=center] () at (10,(\i*10)) {\ci};
+          \ifthenelse{\res = 1}{
+            \fill [x=\scale,y=\scale,color=cellblue] (\dx / 2,\dy / 2) circle (\d);
+          }{
+            \fill [x=\scale,y=\scale,color=white] (\dx / 2,\dy / 2) circle (\d);
+          }
+        }
+        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
+      \end{scope}
+    }
+    \node[x=\scale,y=\scale, align=right, text width=1.8cm, anchor=east] () at (0,20){circles};
+  \end{tikzpicture}
+  \tikzexternaldisable
+  \caption[Tactile patterns used in the MDS experiment.]{Tactile patterns used in the MDS experiment. They are made of 5 shapes and 7 densities.}
+  \label{fig:stimtacpatterns}
+\end{figure}
index 8ac321ac3d207740a6079d3a6978e57b5f0bdc95..144e0348acd4d9e78f64cb8a8cb7cf6a38006af6 100644 (file)
@@ -2,7 +2,7 @@
 
 \begin{figure}[htb]
   \centering
-  \def\partw{69
+  \def\partw{70
   \def\barw{20}
   \def\barh{2.5}
   \def\cursorw{1}
     \draw [draw=black!30, line width=1] ({-\barw / 2 + 0.2}, {#1 + \barh / 2}) -- ++({\barw - 0.4},0);
     \draw[style=cursor, preaction={postaction={draw=#4, line width=1}}] (#2,#1) rectangle ++(\cursorw,\barh);
   }
-  \newcommand{\buttons}{
-    \node[style=button] () at (-7.3,14) {1};
-    \node[style=button] () at (0,14) {2};
-    \node[style=button] () at (7.3,14) {3};
+  % #1: opacity
+  \newcommand{\buttons}[1]{
+    \node[style=button, opacity=#1] () at (-7.3,14) {1};
+    \node[style=button, opacity=#1] () at (0,14) {2};
+    \node[style=button, opacity=#1] () at (7.3,14) {3};
   }
-  \tikzexternalenable
+  \tikzexternalenable
   \begin{tikzpicture}[x=1mm, y=1mm,
     bar/.style={draw=none,preaction={clip,postaction={fill=black!20, draw=black!50, line width=1}}, rounded corners=1},
     cursor/.style={draw=none,preaction={clip, postaction={fill=black!50, draw=black!50, line width=1}}, rounded corners=1},
@@ -28,7 +29,7 @@
     \small
     \def\circleradius{14}
     \begin{scope}
-      \buttons
+      \buttons{1}
       \scrollbar{0}{-10}{black!50}{black!50}
       \scrollbar{4}{-10}{black!50}{black!50}
       \scrollbar{8}{-10}{black!50}{black!50}
@@ -36,7 +37,7 @@
       \node (lbl) at (0,-30) {(0)};
     \end{scope}
     \begin{scope}[xshift=\partw]
-      \buttons
+      \buttons{0.2}
       \scrollbar{0}{-10}{black!50}{black!50}
       \scrollbar{4}{-10}{myblue}{black!50}
       \scrollbar{8}{-10}{black!50}{black!50}
       \node (lbl2) at (0,-34) {Summon};
     \end{scope}
     \begin{scope}[xshift={\partw * 2}]
-      \buttons
+      \buttons{0.2}
       \scrollbar{0}{-10}{myblue}{black!50}
       \scrollbar{4}{-10}{black!50}{black!50}
       \scrollbar{8}{-10}{black!50}{black!50}
       \node[opacity=0.2] () at (0,-12) {\includegraphics[height=2cm]{figures/handpinch2}};
       \node[] () at (0,-17) {\includegraphics[height=2cm]{figures/handpinch2}};
-      \draw[-Stealth, line width=1] (0,-10) -- (0,-20);
+      \draw[-Stealth, line width=2] (0,-10) -- (0,-20);
       \node (lbl) at (0,-30) {(2)};
       \node (lbl2) at (0,-34) {Disambiguate};
     \end{scope}
     \begin{scope}[xshift={\partw * 3}]
-      \buttons
+      \buttons{0.2}
       \scrollbar{0}{-10}{myblue}{myred}
       \scrollbar{4}{-10}{black!50}{black!50}
       \scrollbar{8}{-10}{black!50}{black!50}
       \node (lbl) at (0,-30) {(3.1)};
     \end{scope}
     \begin{scope}[xshift={\partw * 4}]
-      \buttons
+      \buttons{0.2}
       \scrollbar{0}{-1}{myblue}{myred}
       \scrollbar{4}{-10}{black!50}{black!50}
       \scrollbar{8}{-10}{black!50}{black!50}
       \node[opacity=0.2] () at (-5,-15) {\includegraphics[height=2cm]{figures/handpinch1}};
       \node[] () at (5,-15) {\includegraphics[height=2cm]{figures/handpinch1}};
-      \draw[-Stealth, line width=1] (-5,-15) -- (5,-15);
+      \draw[-Stealth, line width=2] (-5,-15) -- (5,-15);
       \node (lbl) at (0,-30) {(3.2)};
       \node (lbl2) at (0,-34) {Manipulate};
       \draw (lbl2.west) -- ++(-15,0) (lbl2.east) -- ++(15,0);
     \end{scope}
     \begin{scope}[xshift={\partw * 5}]
-      \buttons
+      \buttons{0.2}
       \scrollbar{0}{-1}{myblue}{myred}
       \scrollbar{4}{-10}{black!50}{black!50}
       \scrollbar{8}{-10}{black!50}{black!50}
@@ -84,7 +85,7 @@
       \node (lbl) at (0,-30) {(3.3)};
     \end{scope}
     \begin{scope}[xshift={\partw * 6}]
-      \buttons
+      \buttons{1}
       \scrollbar{0}{-1}{black!50}{black!50}
       \scrollbar{4}{-10}{black!50}{black!50}
       \scrollbar{8}{-10}{black!50}{black!50}
@@ -93,7 +94,7 @@
       \node (lbl2) at (0,-34) {Release};
     \end{scope}
   \end{tikzpicture}
-  %\tikzexternaldisable
+  \tikzexternaldisable
   \caption[Summon interaction]{Steps of summon \& select for the bottom slider. (0) Idle (1) Summoning gesture for slider (2) Disambiguating by zoning to the desired slider (blue focus moves to the bottom slider) (3.1-3.3) Manipulation: (3.1) Enter Drag gesture to enter dragging mode (red box around the bar) (3.2) Dragging the slider bar (3.3) Exit Drag gesture to exit dragging mode (4) Release gesture to release the control.}
   \label{fig:summonexample}
 \end{figure}
diff --git a/figures/syntactic.tex b/figures/syntactic.tex
new file mode 100644 (file)
index 0000000..c7aace0
--- /dev/null
@@ -0,0 +1,48 @@
+%!TEX root = ../hdrmain.tex
+
+\begin{figure}[htb]
+  \tikzexternalenable
+  \def\sx{1mm}
+  \def\sy{0.6mm}
+  \begin{tikzpicture}
+    %\draw[loosely dotted] (0,-1) grid (17,1);
+    \draw[x=0.5mm,y=\sy, ultra thick]
+      (0,0) sin (5,10) cos (10,0) sin (14,-10) cos
+      (18,0) sin (21,10) cos (24,0) sin (26,-10) cos
+      (28,0) sin (29,10) cos (30,0) sin (31,-10) cos
+      (32,0) sin (33,10) cos (34,0) sin (36,-10) cos
+      (38,0) sin (41,10) cos (44,0) sin (48,-10) cos
+      (52,0) sin (57,10) cos (62,0);
+    \node[x=1mm,y=1mm, anchor=center] () at (18,-13){Frequency modulation};
+  
+    \draw[x=\sx,y=\sy, xshift=71mm, ultra thick]
+      (0,0) sin (1,5) cos (2,0) sin (3,-5) cos
+      (4,0) sin (5,7) cos (6,0) sin (7,-7) cos
+      (8,0) sin (9,9) cos (10,0) sin (11,-9) cos
+      (12,0) sin (13,10) cos (14,0) sin (15,-10) cos
+      (16,0) sin (17,9) cos (18,0) sin (19,-9) cos
+      (20,0) sin (21,7) cos (22,0) sin (23,-7) cos
+      (24,0) sin (25,5) cos (26,0) sin (27,-5) cos
+      (28,0);
+    \node[x=1mm,y=1mm, anchor=center] () at (84,-13){Amplitude modulation};
+  
+    \draw[x=0.5mm,y=\sy, xshift=140mm, ultra thick]
+    (0,0) sin (1,10) cos (2,0) sin (3,-10) cos
+    (4,0) sin (5,10) cos (6,0) sin (7,-10) cos
+    (8,0) sin (9,10) cos (10,0) sin (11,-10) cos
+    (12,0) sin (13,10) cos (14,0) sin (15,-10) cos
+    (16,0) sin (17,10) cos (18,0) sin (19,-10) cos
+    (20,0) --
+    (30,0) sin (31,10) cos (32,0) sin (33,-10) cos
+    (34,0) sin (35,10) cos (36,0) sin (37,-10) cos
+    (38,0) --
+    (48,0) sin (49,10) cos (50,0) sin (51,-10) cos
+    (52,0) sin (53,10) cos (54,0) sin (55,-10) cos
+    (56,0);
+    \node[x=1mm,y=1mm, anchor=center] () at (154,-13){Rhythm};
+  \end{tikzpicture}
+  \tikzexternaldisable
+  \caption[Haptic phrases.]{Three examples of haptic phrases: frequency modulation, amplitude modulation and rhythm.}
+  \label{fig:syntactic}
+  \end{figure}
+  
\ No newline at end of file
index 9d0828d857943da1ecac1e247036e7df16f30f05..1c365454066ec1a00b88594d8450a451a70fc5f7 100644 (file)
@@ -19,7 +19,7 @@
   \tikzfading[name=fade out,
     inner color=transparent!50,
     outer color=transparent!100]
-  \tikzexternalenable
+  \tikzexternalenable
   \begin{tikzpicture}[x=1mm, y=1mm,
     display/.style={draw=black!30, fill=white, line width=7},
     target/.style={draw=myblue, line width=7},
diff --git a/figures/tactileillusions.tex b/figures/tactileillusions.tex
new file mode 100644 (file)
index 0000000..67494aa
--- /dev/null
@@ -0,0 +1,58 @@
+%!TEX root = ../hdrmain.tex
+
+\begin{figure}[htb]
+  \definecolor{cellred}{rgb}    {0.98,0.17,0.15}
+  \definecolor{virt}{rgb}       {0.98,0.17,0.15}
+  \definecolor{cellblue}{rgb}   {0.17,0.60,0.99}
+  
+  \newcommand{\actuator}[3]{\node[fill=#3, text=white, circle, minimum size=1cm] at (#1) {#2};}
+  \newcommand{\vibrdot}[2]{\node[fill=#2, circle, minimum size=1mm] at (#1) {};}
+  \tikzexternalenable
+  \begin{tikzpicture}[x=1mm,y=1mm]
+    \begin{scope}[yshift=20mm]
+      \draw[x=1mm,y=1mm, dotted] (0,0) grid (80,10);
+      \actuator{0,5}{a}{myblue}
+      \actuator{80,5}{b}{myblue}
+      \actuator{20,5}{v}{myred}
+    \end{scope}
+    \begin{scope}
+    \draw[<->]
+      (0,15) -- (0,0) -- (85,0) node [below] {$pos.$};
+    \draw (0,10) -- (80,0);
+    \draw (0,0)  -- (80,10);
+    \node[anchor=south, rotate=90] () at (0,13){$amp.$};
+    \draw[thick, draw=myred] (20,0) -- (20,7.5);
+    \draw[thick, draw=myblue] (20,7.5) -- (0,7.5) node [left] {$A_a$};
+    \draw[thick, draw=myblue] (20,2.5) -- (0,2.5) node [left] {$A_b$};
+    \node[anchor=center] () at (40,-5){Funneling or Phantom illusion};
+  \end{scope}
+  \end{tikzpicture}\hfill
+  \begin{tikzpicture}[x=1mm,y=1mm]
+    \begin{scope}[yshift=18mm]
+      \draw[step=8, dotted] (0,0) grid (64,8);
+      \node[anchor=south, rotate=90] () at (0,10){$pos.$};
+      \draw[<->] (0,12) -- (0,0) -- (64,0) node [below, xshift=-5] {$time$};
+      \node[anchor=west] () at (2,12){Stimulation};
+    
+      \foreach \x in {0,...,8} {
+        \pgfmathtruncatemacro{\y}{floor(\x / 3) * 4}
+        \vibrdot{\x * 8, \y}{myblue}
+      }
+    \end{scope}
+    \begin{scope}
+      \draw[step=8, dotted] (0,0) grid (64,8);
+      \node[anchor=south, rotate=90] () at (0,10){$pos.$};
+      \draw[<->]
+        (0,12) -- (0,0) -- (64,0) node [below, xshift=-5] {$time$};
+      \node[anchor=west] () at (2,12){Sensation};
+      \foreach \x in {0,...,8} {
+        \vibrdot{\x * 8, \x}{virt}
+      }
+      \node[anchor=center] () at (32,-5){Saltation or Cutaneous rabbit illusion};
+    \end{scope}
+  \end{tikzpicture}
+  \tikzexternaldisable
+  \caption[Tactile illusions: funneling and saltation.]{Examples of tactile illusions. Left: funneling, or phantom illusion; right: saltation or cutaneous rabbit illusion.}
+  \label{fig:illusions}
+  \end{figure}
+  
\ No newline at end of file
diff --git a/figures/tactilepattern.tex b/figures/tactilepattern.tex
new file mode 100644 (file)
index 0000000..5682dc4
--- /dev/null
@@ -0,0 +1,81 @@
+%!TEX root = ../hdrmain.tex
+
+\begin{figure}[htb]
+  \definecolor{cellblue}{rgb}    {0.17,0.60,0.99}
+  \def\dx{75}
+  \def\dy{40}
+  \def\scale{0.26mm}
+
+  \centering
+
+  \tikzexternalenable
+  \begin{tikzpicture}
+
+    \begin{scope}[]
+      \node[x=\scale,y=\scale, anchor=center] () at (\dx/2,-10){Constant};
+      \fill[x=\scale,y=\scale,color=cellblue] (0,0) rectangle (\dx,\dy);
+      \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
+    \end{scope}
+    
+    \begin{scope}[xshift=3cm]
+      \pgfmathsetmacro{\x}{\dx/2}
+      \fill[x=\scale,y=\scale,color=cellblue] (0,0) rectangle (\x,\dy);
+      \node[x=\scale,y=\scale, anchor=center] () at (\dx/2,-10){Step};
+      \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
+    \end{scope}
+
+    \begin{scope}[xshift=6cm]
+      \pgfmathsetmacro{\x}{\dx/2}
+      \fill[x=\scale,y=\scale,color=cellblue] (\x-3,0) rectangle (\x+3,\dy);
+      \node[x=\scale,y=\scale, anchor=center] () at (\dx/2,-10){Shape};
+      \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
+    \end{scope}
+
+    \begin{scope}[xshift=9cm]
+      \def\n{8}
+      \def\dc{0.4}
+      \pgfmathsetmacro{\p}{\dx / (\n + \dc - 1)}
+      \pgfmathsetmacro{\w}{\dc*\p}
+      \pgfmathsetmacro{\nn}{\n-1}
+      \fill[x=\scale,y=\scale,color=cellblue] (0,0) rectangle (\w,\dy);
+      \foreach \i in {1,...,\nn} {
+        \pgfmathsetmacro{\d}{\i*\p}
+        \fill[x=\scale,y=\scale,color=cellblue] (\d,0) rectangle (\d+\w,\dy);
+      }
+      \node[x=\scale,y=\scale, anchor=center] () at (\dx/2,-10){Field};
+      \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
+    \end{scope}
+    
+    \begin{scope}[xshift=12cm]
+      \def\n{6}
+      \def\dc{0.5}
+      \def\s{0.681}
+      \def\p{40}
+      \pgfmathsetmacro{\d}{0}
+      \foreach \i [remember=\dd as \d (initially 0)] in {1,...,\n} {
+        \pgfmathsetmacro{\w}{\dc * \p * \s^\i}
+        \fill[x=\scale,y=\scale,color=cellblue] (\d,0) rectangle (\d+\w,\dy);
+        \pgfmathsetmacro{\dd}{\d + \p * \s^\i}
+        }
+        \node[x=\scale,y=\scale, anchor=center] () at (\dx/2,-10){Gradient};
+        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
+      \end{scope}
+  
+      \begin{scope}[xshift=15cm]
+        \def\n{100}
+        \pgfmathsetmacro{\w}{\dx / \n}
+        \foreach \i in {1,...,\n} {
+          \pgfmathrandominteger{\r}{0}{1}
+          \ifthenelse{\r = 0}{
+            \fill[x=\scale,y=\scale,color=cellblue] (\i*\w,0) rectangle (\i*\w+\w,\dy);
+          }{}
+        }
+        \node[x=\scale,y=\scale, anchor=center] () at (\dx/2,-10){Random};
+        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
+      \end{scope}
+%    \node[x=1mm,y=1mm, anchor=center] () at (160,-36){Set F};
+  \end{tikzpicture}
+  \tikzexternaldisable
+  \caption[Examples of tactile patterns.]{Examples of tactile patterns with increased complexity. The background is white and the pattern is blue.}
+  \label{fig:tactilepattern}
+\end{figure}
diff --git a/figures/tactiletexture.tex b/figures/tactiletexture.tex
new file mode 100644 (file)
index 0000000..f85eda5
--- /dev/null
@@ -0,0 +1,93 @@
+%!TEX root = ../hdrmain.tex
+
+\begin{figure}[htb]
+  \definecolor{cellblue}{rgb}    {0.17,0.60,0.99}
+  \def\dx{654}
+  \def\dy{40}
+  \def\scale{0.26mm}
+
+  \centering
+
+  \tikzexternalenable
+  \begin{tikzpicture}
+    \begin{scope} % field
+      \def\n{10}
+      \def\w{6}
+      \def\dc{0.4}
+      \foreach \i in {0,...,\n} {
+        \pgfmathsetmacro{\d}{\i*\w}
+        \fill[x=\scale,y=\scale,color=cellblue] (\d,0) rectangle (\d+\w*\dc,\dy);
+      }
+    \end{scope}
+    
+    \begin{scope}[xshift=3cm] %gradient
+      \def\n{8}
+      \def\dc{0.6}
+      \def\s{0.8}
+      \def\p{50}
+      \pgfmathsetmacro{\d}{0}
+      \foreach \i [remember=\dd as \d (initially 0)] in {1,...,\n} {
+        \pgfmathsetmacro{\w}{\dc * \p * \s^\i}
+        \fill[x=\scale,y=\scale,color=cellblue] (\d,0) rectangle (\d+\w,\dy);
+        \pgfmathsetmacro{\dd}{\d + \p * \s^\i}
+      }
+    \end{scope}
+      
+    \begin{scope}[xshift=7.5cm] %random
+      \def\n{200}
+      \pgfmathsetmacro{\w}{0.5}
+      \foreach \i in {1,...,\n} {
+        \pgfmathrandominteger{\r}{0}{1}
+        \ifthenelse{\r = 0}{
+          \fill[x=\scale,y=\scale,color=cellblue] (\i*\w,0) rectangle (\i*\w+\w,\dy);
+        }{}
+      }
+    \end{scope}
+          
+    \begin{scope}[xshift=10.2cm] % field
+      \def\n{50}
+      \def\w{2}
+      \def\dc{0.6}
+      \foreach \i in {0,...,\n} {
+        \pgfmathsetmacro{\d}{\i*\w}
+        \fill[x=\scale,y=\scale,color=cellblue] (\d,0) rectangle (\d+\w*\dc,\dy);
+      }
+    \end{scope}
+            
+    \begin{scope}[xshift=12.8cm] %gradient
+      \def\n{12}
+      \def\dc{0.6}
+      \def\s{1.28}
+      \def\p{2}
+      \pgfmathsetmacro{\d}{0}
+      \foreach \i [remember=\dd as \d (initially 0)] in {1,...,\n} {
+        \pgfmathsetmacro{\w}{\dc * \p * \s^\i}
+        \fill[x=\scale,y=\scale,color=cellblue] (\d,0) rectangle (\d+\w,\dy);
+        \pgfmathsetmacro{\dd}{\d + \p * \s^\i}
+      }
+    \end{scope}
+    \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
+    
+    \begin{scope}[yshift=-1.5cm]
+      \def\n{10}
+      \def\ndc{0.7}
+      \def\m{16}
+      \def\mdc{0.4}
+      \pgfmathsetmacro{\nw}{\dx / \n}
+      \pgfmathsetmacro{\mw}{\nw * \ndc / \m}
+      \pgfmathsetmacro{\nn}{\n - 1}
+      \pgfmathsetmacro{\mm}{\m - 1}
+      \foreach \i in {0,...,\nn} {
+        \foreach \j in {0,...,\mm} {
+          \fill[x=\scale,y=\scale,color=cellblue] (\i * \nw + \j * \mw,0) rectangle (\i * \nw + \j * \mw + \mw * \mdc,\dy);
+        }
+      }
+      \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
+    \end{scope}
+
+%    \node[x=1mm,y=1mm, anchor=center] () at (160,-36){Set F};
+  \end{tikzpicture}
+  \tikzexternaldisable
+  \caption[Examples of tactile textures.]{Examples of tactile textures. The first one is the combination of a series of various pattern types. It starts with a field, then a constant, a decreasing gradient, a random pattern, another field and finishes with an increasing gradient. The second one is a repetition of a field-type tactile pattern. }
+  \label{fig:tactiletexture}
+\end{figure}
index c2acca920c1ecb5811d7d4b1822a3b5dc0c66fe3..5b2b6f42b5038712ee2e1ecfd9d90de9d3cb2384 100644 (file)
 \usepackage{lipsum}
 
 \usepackage{siunitx}
-\sisetup{per-mode=fraction, range-phrase={--}, range-units = single, output-decimal-marker = {.}}
+\sisetup{per-mode=fraction, range-phrase={--}, range-units = single, product-units = single, list-units = single, output-decimal-marker = {.}}
 % Patch until the new version of siunitx is out
-\newcommand{\qtyrange}[3]{\SIrange{#1}{#2}{#3}}
+\newcommand{\qty}[2]{\SI{#1}{#2}}
 \newcommand{\sumproduct}[1]{\num{#1}}
+\newcommand{\qtyrange}[3]{\SIrange{#1}{#2}{#3}}
+\newcommand{\qtylist}[2]{\SIlist{#1}{#2}}
+\newcommand{\qtyproduct}[2]{\SI{#1}{#2}}
 
 \usepackage{pgfplots}
 \usepackage{tikz}
@@ -42,8 +45,9 @@
   \defaultfontfeatures{Mapping=tex-text}
 
   %\newfontfamily\symbolfont{STIXGeneral}
-  \newfontfamily\mygreek{CMU Serif}
-  \setmainfont{Optima}[SmallCapsFont={Latin Modern Roman Caps}, AutoFakeBold=5]
+  \newfontfamily\mygreek{CMU Sans Serif}
+  %\setmainfont{Optima}[SmallCapsFont={Latin Modern Roman Caps}, AutoFakeBold=5]
+  \setmainfont{CMU Sans Serif}[SmallCapsFont={Latin Modern Roman Caps}, AutoFakeBold=5]
   %\setmainfont{Inria Serif}[SmallCapsFont={Latin Modern Roman Caps}]
   \setsansfont{Inria Sans}
   \setmonofont[Contextuals={Alternate}]{Fira Code}
 \newcommand{\tab}{\keys{Tab}\xspace}
 \newcommand{\Space}{\keys{Space}\xspace}
 
-\newcommand{\degr}[1]{{$#1^\circ$}\xspace}
-
 % P values
 \newcommand{\p}[1]{\mbox{$p<#1$}}
 \newcommand{\pEq}[1]{\mbox{$p=#1$}}
index bd8c7095eb520b0e4bbb2ad8cb6aff9609833af4..bc775ee43c479428ce21943da64074f235645764 100644 (file)
@@ -153,62 +153,7 @@ Given the diversity of touch sensations: weight, shape, temperature, etc., Leder
 This chapter will not get into details regarding the relation between action and perception, and the \reffig{fig:hapticpath} ignores this phenomenon.
 However we will cover this specific topic in chapter~\ref{chap:loop}.
 
-\begin{figure}[htb]
-\definecolor{cellred}{rgb}    {0.98,0.17,0.15}
-\definecolor{virt}{rgb}       {0.98,0.17,0.15}
-\definecolor{cellblue}{rgb}   {0.17,0.60,0.99}
-
-\newcommand{\actuator}[3]{\node[x=1mm,y=1mm, fill=#3, text=white, circle, minimum size=1cm] at (#1) {#2};}
-\newcommand{\vibrdot}[2]{\node[x=1mm,y=1mm, fill=#2, circle, minimum size=1mm] at (#1) {};}
-\tikzexternalenable
-\begin{tikzpicture}
-  \draw[x=1mm,y=1mm, dotted] (0,20) grid (80,30);
-  \actuator{0,25}{a}{cellblue}
-  \actuator{80,25}{b}{cellblue}
-  \actuator{20,25}{v}{virt}
-  \draw[x=1mm,y=1mm, <->]
-    (0,15) -- (0,0) -- (85,0) node [below] {$pos.$};
-  \draw[x=1mm,y=1mm]
-    (0,10) -- (80,0);
-  \draw[x=1mm,y=1mm]
-    (0,0)  -- (80,10);
-  \node[x=1mm,y=1mm, anchor=south, rotate=90] () at (0,13){$amp.$};
-  \draw[x=1mm,y=1mm, thick, draw=cellred]
-    (20,0) -- (20,7.5);
-  \draw[x=1mm,y=1mm, thick, draw=cellblue]
-    (20,7.5) -- (0,7.5) node [left] {$A_a$};
-  \draw[x=1mm,y=1mm, thick, draw=cellblue]
-    (20,2.5) -- (0,2.5) node [left] {$A_b$};
-
-  \node[x=1mm,y=1mm, anchor=center] () at (40,-5){Funneling or Phantom illusion};
-
-  \draw[x=1mm,y=1mm, step=8, dotted, yshift=18mm] (96,0) grid (160,8);
-  \node[x=1mm,y=1mm, anchor=south, rotate=90] () at (96,28){$pos.$};
-  \draw[x=1mm,y=1mm, <->]
-    (96,30) -- (96,18) -- (160,18) node [below, xshift=-5] {$time$};
-  \node[x=1mm,y=1mm, anchor=west] () at (98,30){Stimulation};
-
-  \foreach \x in {0,...,8} {
-    \pgfmathtruncatemacro{\y}{18 + floor(\x / 3) * 4}
-    \vibrdot{96 + \x * 8, \y}{cellblue}
-  }
-
-  \draw[x=1mm,y=1mm, step=8, dotted] (96,0) grid (160,8);
-  \node[x=1mm,y=1mm, anchor=south, rotate=90] () at (96,10){$pos.$};
-  \draw[x=1mm,y=1mm, <->]
-    (96,12) -- (96,0) -- (160,0) node [below, xshift=-5] {$time$};
-  \node[x=1mm,y=1mm, anchor=west] () at (98,12){Sensation};
-
-  \foreach \x in {0,...,8} {
-    \vibrdot{96 + \x * 8, \x}{virt}
-  }
-
-  \node[x=1mm,y=1mm, anchor=center] () at (127.5,-5){Saltation or Cutaneous rabbit illusion};
-\end{tikzpicture}
-\tikzexternaldisable
-\caption[Tactile illusions: funneling and saltation.]{Examples of tactile illusions. Left: funneling, or phantom illusion; right: saltation or cutaneous rabbit illusion.}
-\label{fig:illusions}
-\end{figure}
+\input{figures/tactileillusions.tex}
 
 Independently of active touch, our perception of haptic signals is an interpretation of the brain.
 For example, people may perceive only one vibration while there are two distinct stimulation if they are too close in space~\cite{weinstein68} or time~\cite{goodfellow34}.
@@ -216,8 +161,8 @@ We can use such interpretations to create tactile illusions.
 For example, the funneling illusion, also called phantom sensations, produces a virtual vibration in between two points\cite{alles70,vonbekesy58}.
 To do so, one must place two actuators, one at each end.
 The amplitude of the signal on both actuators is a ratio corresponding to the desired position of the virtual vibration.
-For example, let $A$ be the maximum amplitude and two actuators $a$ and $b$ placed $4cm$ apart, as depicted on the left part of \reffig{fig:illusions}.
-If the amplitude of actuator $a$ is $A(a) = \frac{A}{4}$ and the amplitude of actuator $b$ is $A(b) = \frac{3A}{4}$, then the users feel a vibration between $a$ and $b$, $1cm$ away from $a$ and $3cm$ away from $b$.
+For example, let $A$ be the maximum amplitude and two actuators $a$ and $b$ placed \qty{4}{\cm} apart, as depicted on the left part of \reffig{fig:illusions}.
+If the amplitude of actuator $a$ is $A(a) = \frac{A}{4}$ and the amplitude of actuator $b$ is $A(b) = \frac{3A}{4}$, then the users feel a vibration between $a$ and $b$, \qty{1}{\cm} away from $a$ and \qty{3}{\cm} away from $b$.
 Tactile saltation (also called the cutaneous rabbit illusion) gives the illusion of a sequence of equally spaced vibration~\cite{geldard72}.
 The tactile stimulation however is a repeated vibration on a smaller subset of locations.
 For example, with three actuators $a$, $b$, and $c$ equally spaced on a straight line, the stimulation is three vibrations on $a$, three on $b$, and three on $c$, as shown on the right part of \reffig{fig:illusions}.
@@ -252,55 +197,8 @@ We presented technologies for haptic devices above.
 Interactive languages are systematic descriptions of the inputs and outputs of an interactive device.
 Similar to programming languages, they have three levels: lexical, syntactic, and semantic.
 
-\begin{figure}[htb]
-  \tikzexternalenable
-  \def\sx{1mm}
-  \def\sy{0.6mm}
-  \begin{tikzpicture}
-    %\draw[loosely dotted] (0,-1) grid (17,1);
-    \draw[x=\sx,y=\sy, ultra thick]
-      (0,0) sin (1,10) cos (2,0) sin (3,-10) cos
-      (4,0) sin (5,10) cos (6,0) sin (7,-10) cos
-      (8,0) sin (9,10) cos (10,0) sin (11,-10) cos
-      (12,0);
-    \draw[x=\sx,y=\sy, xshift=15mm, ultra thick]
-      (0,0) sin (3,10) cos (6,0) sin (9,-10) cos
-      (12,0) sin (15,10) cos (18,0) sin (21,-10) cos
-      (24,0);
-    \node[x=1mm,y=1mm, anchor=center] () at (20,-9){Frequency};
-  
-    \draw[x=\sx,y=\sy, xshift=55mm, ultra thick]
-      (0,0) sin (1,10) cos (2,0) sin (3,-10) cos
-      (4,0) sin (5,10) cos (6,0) sin (7,-10) cos
-      (8,0) sin (9,10) cos (10,0) sin (11,-10) cos
-      (12,0);
-    \draw[x=\sx,y=\sy, ultra thick]
-      (70,0) sin (71,5) cos (72,0) sin (73,-5) cos (74,0) sin (75,5) cos (76,0) sin (77,-5) cos (78,0) sin (79,5) cos (80,0) sin (81,-5) cos (82,0);
-    \node[x=1mm,y=1mm, anchor=center] () at (68,-9){Amplitude};
-  
-    \draw[x=\sx,y=\sy, ultra thick]
-      (99,0) sin (100,10) cos (101,0) sin (102,-10) cos (103,0) sin (104,10) cos (105,0) sin (106,-10) cos (107,0);
-    \draw[x=\sx,y=\sy, ultra thick]
-      (110,0) sin (111,10) cos (112,0) sin (113,-10) cos (114,0) sin (115,10) cos (116,0) sin (117,-10) cos (118,0) sin (119,10) cos (120,0) sin (121,-10) cos (122,0) sin (123,10) cos (124,0) sin (125,-10) cos (126,0);
-    \node[x=1mm,y=1mm, anchor=center] () at (112,-9){Duration};
-  
-    \draw[x=\sx,y=\sy, xshift=140mm, ultra thick]
-      (0,0) sin (1,10) cos (2,0) sin (3,-10) cos
-      (4,0) sin (5,10) cos (6,0) sin (7,-10) cos
-      (8,0) sin (9,10) cos (10,0) sin (11,-10) cos
-      (12,0);
-    \draw[x=\sx,y=\sy, xshift=155mm, ultra thick]
-      (0,0) -- (0,10) -- (2,10) -- (2,-10) --
-      (4,-10) -- (4,10) -- (6,10) -- (6,-10) --
-      (8,-10) -- (8,10) -- (10,10) -- (10,-10) --
-      (12,-10) -- (12,0);
-    \node[x=1mm,y=1mm, anchor=center] () at (153,-9){Shape};
-  \end{tikzpicture}
-  \tikzexternaldisable
-  \caption[Haptic vocabulary.]{Four parameters of the vibrotactile output vocabulary: frequency, amplitude, duration and shape.}
-  \label{fig:lexical}
-  \end{figure}
-  
+\input{figures/lexical.tex}
+
 The \emph{lexical level} defines the basic vocabulary of the device.
 For example, we can control vibrations in frequency, amplitude, shape, and duration (\reffig{fig:lexical}).
 Hence the command for a vibrotactile actuator is an electrical signal made of these elements.
@@ -312,51 +210,7 @@ We will illustrate this kind of research in section~\ref{sec:stimtac}.
 %Hence, a software controller sends three values to the electro-mechanical system, which will convert it to forces.
 %Such devices also have an input vocabulary, typically 3DOF or 6DOF (translations + rotations) and sometimes one or several buttons.
 
-\begin{figure}[htb]
-\tikzexternalenable
-\def\sx{1mm}
-\def\sy{0.6mm}
-\begin{tikzpicture}
-  %\draw[loosely dotted] (0,-1) grid (17,1);
-  \draw[x=0.5mm,y=\sy, ultra thick]
-    (0,0) sin (5,10) cos (10,0) sin (14,-10) cos
-    (18,0) sin (21,10) cos (24,0) sin (26,-10) cos
-    (28,0) sin (29,10) cos (30,0) sin (31,-10) cos
-    (32,0) sin (33,10) cos (34,0) sin (36,-10) cos
-    (38,0) sin (41,10) cos (44,0) sin (48,-10) cos
-    (52,0) sin (57,10) cos (62,0);
-  \node[x=1mm,y=1mm, anchor=center] () at (18,-13){Frequency modulation};
-
-  \draw[x=\sx,y=\sy, xshift=71mm, ultra thick]
-    (0,0) sin (1,5) cos (2,0) sin (3,-5) cos
-    (4,0) sin (5,7) cos (6,0) sin (7,-7) cos
-    (8,0) sin (9,9) cos (10,0) sin (11,-9) cos
-    (12,0) sin (13,10) cos (14,0) sin (15,-10) cos
-    (16,0) sin (17,9) cos (18,0) sin (19,-9) cos
-    (20,0) sin (21,7) cos (22,0) sin (23,-7) cos
-    (24,0) sin (25,5) cos (26,0) sin (27,-5) cos
-    (28,0);
-  \node[x=1mm,y=1mm, anchor=center] () at (84,-13){Amplitude modulation};
-
-  \draw[x=0.5mm,y=\sy, xshift=140mm, ultra thick]
-  (0,0) sin (1,10) cos (2,0) sin (3,-10) cos
-  (4,0) sin (5,10) cos (6,0) sin (7,-10) cos
-  (8,0) sin (9,10) cos (10,0) sin (11,-10) cos
-  (12,0) sin (13,10) cos (14,0) sin (15,-10) cos
-  (16,0) sin (17,10) cos (18,0) sin (19,-10) cos
-  (20,0) --
-  (30,0) sin (31,10) cos (32,0) sin (33,-10) cos
-  (34,0) sin (35,10) cos (36,0) sin (37,-10) cos
-  (38,0) --
-  (48,0) sin (49,10) cos (50,0) sin (51,-10) cos
-  (52,0) sin (53,10) cos (54,0) sin (55,-10) cos
-  (56,0);
-  \node[x=1mm,y=1mm, anchor=center] () at (154,-13){Rhythm};
-\end{tikzpicture}
-\tikzexternaldisable
-\caption[Haptic phrases.]{Three examples of haptic phrases: frequency modulation, amplitude modulation and rhythm.}
-\label{fig:syntactic}
-\end{figure}
+\input{figures/syntactic.tex}
 
 The \emph{syntactic level} combines lexical items to form haptic phrases.
 They eventually combine different modalities.
@@ -380,89 +234,7 @@ For example, if we create Tactons for meeting alerts, we can encode the kind of
 The combination of both parameters enables encoding every level of urgency for every caller ID.
 \reffig{fig:semantic} illustrates this example of mapping between multi-parameters Tactons and hierarchical information.
 
-\begin{figure}[htb]
-  \centering
-  \definecolor{cellred}{rgb}    {0.98,0.17,0.15}
-  \definecolor{cellblue}{rgb}    {0.17,0.60,0.99}
-  %
-  \newcommand{\labelcell}[2]{
-  \node[minimum width=1.0cm, minimum height=.75cm,text width=3.0cm, align=center, outer sep=0, column sep=0cm](#1) {\textbf{#2}};
-  }
-  \newcommand{\bluecell}[2]{
-    \node[minimum width=3.0cm, minimum height=1cm,fill=cellblue, text=white,text width=3.5cm, align=center, rounded corners=2ex, outer sep=0](#1) {#2};
-  }
-  \newcommand{\redcell}[2]{
-    \node[minimum width=3.0cm, minimum height=1cm,fill=cellred, text=white,text width=3.5cm, align=center, rounded corners=2ex, outer sep=0](#1) {#2};
-  }
-  \newcommand{\mediumbluecell}[2]{
-    \node[minimum width=2.0cm, minimum height=6mm,fill=cellblue, text=white,text width=2.0cm, align=center, rounded corners=2mm, outer sep=0](#1) {\footnotesize #2};
-  }
-  \newcommand{\mediumredcell}[2]{
-    \node[minimum width=2.0cm, minimum height=6mm,fill=cellred, text=white,text width=2.0cm, align=center, rounded corners=2mm, outer sep=0](#1) {\footnotesize #2};
-  }
-  \newcommand{\smallbluecell}[2]{
-    \node[minimum width=8mm, minimum height=5mm,fill=cellblue, text=white,text width=8mm, align=center, rounded corners=1mm, outer sep=0](#1) {\scriptsize #2};
-  }
-  \newcommand{\smallredcell}[2]{
-    \node[minimum width=8mm, minimum height=5mm,fill=cellred, text=white,text width=8mm, align=center, rounded corners=1mm, outer sep=0](#1) {\scriptsize #2};
-  }
-  \tikzexternalenable
-  \begin{tikzpicture}
-    %\small
-    \matrix[row sep=1mm, column sep=10mm,inner sep=0, node distance=0, outer sep=0mm] (cells) {
-      & & \smallbluecell{rh1}{Rh1} & \smallredcell{t1}{T1} & & \\
-      & \mediumbluecell{rhythm}{Rhythm} & \smallbluecell{rh2}{Rh2} & \smallredcell{t2}{T2} & \mediumredcell{type}{Type} & \\
-      & & \smallbluecell{rh3}{Rh3} & \smallredcell{t3}{T3} & & \\
-      & & \smallbluecell{ro1}{Ro1} & \smallredcell{i1}{I1} & & \\
-      \mediumbluecell{tacton}{Tacton} & \mediumbluecell{roughness}{Roughness} & \smallbluecell{ro2}{Ro2} & \smallredcell{i2}{I2} & \mediumredcell{importance}{Importance} & \mediumredcell{information}{Information}\\
-      & & \smallbluecell{ro3}{Ro3} & \smallredcell{i3}{I3} & & \\
-      & & \smallbluecell{l1}{L1} & \smallredcell{d1}{D1} & & \\
-      & \mediumbluecell{location}{Location} & \smallbluecell{l2}{L2} & \smallredcell{d2}{D2} & \mediumredcell{delay}{Delay} & \\
-      & & \smallbluecell{l3}{L3} & \smallredcell{d3}{D3} & & \\
-    };
-    \draw (tacton.north) edge[->, -stealth', thick, out=90,in=180] (rhythm.west);
-    \draw (tacton.east) edge[->, -stealth', thick, out=0,in=180] (roughness.west);
-    \draw (tacton.south) edge[->, -stealth', thick, out=-90,in=180] (location.west);
-
-    \draw (rhythm.north) edge[->, -stealth', thick, out=30,in=180] (rh1.west);
-    \draw (rhythm.east) edge[->, -stealth', thick, out=0,in=180] (rh2.west);
-    \draw (rhythm.south) edge[->, -stealth', thick, out=-30,in=180] (rh3.west);
-    \draw (roughness.north) edge[->, -stealth', thick, out=30,in=180] (ro1.west);
-    \draw (roughness.east) edge[->, -stealth', thick, out=0,in=180] (ro2.west);
-    \draw (roughness.south) edge[->, -stealth', thick, out=-30,in=180] (ro3.west);
-    \draw (location.north) edge[->, -stealth', thick, out=30,in=180] (l1.west);
-    \draw (location.east) edge[->, -stealth', thick, out=0,in=180] (l2.west);
-    \draw (location.south) edge[->, -stealth', thick, out=-30,in=180] (l3.west);
-
-    \draw (information.north) edge[->, -stealth', thick, out=90,in=0] (type.east);
-    \draw (information.west) edge[->, -stealth', thick, out=180,in=0] (importance.east);
-    \draw (information.south) edge[->, -stealth', thick, out=-90,in=0] (delay.east);
-
-    \draw (type.north) edge[->, -stealth', thick, out=150,in=0] (t1.east);
-    \draw (type.west) edge[->, -stealth', thick, out=180,in=0] (t2.east);
-    \draw (type.south) edge[->, -stealth', thick, out=-150,in=0] (t3.east);
-    \draw (importance.north) edge[->, -stealth', thick, out=150,in=0] (i1.east);
-    \draw (importance.west) edge[->, -stealth', thick, out=180,in=0] (i2.east);
-    \draw (importance.south) edge[->, -stealth', thick, out=-150,in=0] (i3.east);
-    \draw (delay.north) edge[->, -stealth', thick, out=150,in=0] (d1.east);
-    \draw (delay.west) edge[->, -stealth', thick, out=180,in=0] (d2.east);
-    \draw (delay.south) edge[->, -stealth', thick, out=-150,in=0] (d3.east);
-
-    \draw[<->, stealth-stealth, thick] (rh1) -- (t1);
-    \draw[<->, stealth-stealth, thick] (rh2) -- (t2);
-    \draw[<->, stealth-stealth, thick] (rh3) -- (t3);
-    \draw[<->, stealth-stealth, thick] (ro1) -- (i1);
-    \draw[<->, stealth-stealth, thick] (ro2) -- (i2);
-    \draw[<->, stealth-stealth, thick] (ro3) -- (i3);
-    \draw[<->, stealth-stealth, thick] (l1) -- (d1);
-    \draw[<->, stealth-stealth, thick] (l2) -- (d2);
-    \draw[<->, stealth-stealth, thick] (l3) -- (d3);
-    
-  \end{tikzpicture}
-  \tikzexternaldisable
-  \caption[Mapping information with Tactons.]{Illustration of a semantic mapping between 3-parameters Tactons and a 3-level information, adapted from~\cite{brown06}. 3 values of rhythm are mapped to 3 types of messages, 3 values of roughness are mapped to 3 degrees of importance, and 3 spatial locations are mapped to 3 values of delay.}
-  \label{fig:semantic}
-\end{figure}
+\input{figures/semantic.tex}
 
 Some studies about Tactons associate information to Tactons while evaluating the syntactic level~\cite{brown06,hoggan07}.
 Therefore these studies either assume that the interpretation of the mapping is trivial, or they cannot make the distinction between the part of the metrics associated with the syntactic and the semantic level.
@@ -638,165 +410,7 @@ Each individual squiggly line represents a single short pulse, while a long line
 We first designed the series of vibration sets (A-E) that were evaluated in a first laboratory setting.
 The results of the first study helped us to design pattern F, which was then compared in a second laboratory study to the best sets from the first study (A, C, and E).
 
-\begin{figure}[htb]
-  \newcommand{\sine}[3]{\foreach \x in {1,...,{#3}}
-    {
-      \draw[thick] 
-      ({4*\x*#1},0) sin 
-      ({4*\x*#1+#1},#2) cos 
-      ({4*\x*#1+2*#1},0) sin 
-      ({4*\x*#1+3*#1},{-#2}) cos 
-      ({4*\x*#1+4*#1},0);
-    }
-  }
-  \tikzexternalenable
-  \begin{tikzpicture}
-    \def\s{0.03}
-    \def\nl{11}
-    \def\labely{-40}
-    \def\labelw{0.7}
-    \pgfmathsetmacro{\setwidth}{(18-\labelw)/6}
-    \begin{scope}[xshift=-2mm]%[xshift=-\labelw cm]
-      \foreach \x in {1,...,10}
-      {
-        \begin{scope}[yshift=(-(\x-1)*\nl)]
-          \draw[x=1mm,y=1mm] (0,0) node {\x};
-        \end{scope}
-      }
-    \end{scope}
-    \begin{scope}[xshift=0cm] %Set A
-      \node[x=1mm,y=1mm, anchor=center] () at (14,\labely){Set A};
-      \foreach \x in {1,...,10}
-      {
-        \begin{scope}[yshift=(-(\x-1)*\nl)]
-          \foreach \y in {1,...,\x}
-          {
-            \begin{scope}[xshift=(\y*6)]
-              \sine{\s}{.10}{1}
-            \end{scope}
-          }
-        \end{scope}
-      }
-    \end{scope}
-    \begin{scope}[xshift=\setwidth cm] %Set B
-      \node[x=1mm,y=1mm, anchor=center] () at (14,\labely){Set B};
-      \foreach \x in {1,...,10}
-      {
-        \begin{scope}[yshift=(-(\x-1)*\nl)]
-          \sine{\s}{.10}{\x}
-        \end{scope}
-      }
-    \end{scope}
-    \begin{scope}[xshift=2*\setwidth cm] %Set C
-      \node[x=1mm,y=1mm, anchor=center] () at (14,\labely){Set C};
-      \foreach \x in {1,...,10}
-      {
-        \begin{scope}[yshift=(-(\x-1)*\nl)]
-          \pgfmathtruncatemacro{\l}{20-2*\x}
-          \ifnum \x < 10
-            \sine{\s}{.10}{\l}
-          \fi
-          \pgfmathsetmacro{\ll}{\l*\s*40-1}
-          \begin{scope}[xshift=\ll mm]
-            \foreach \y in {1,...,\x} {
-              \pgfmathsetmacro{\m}{\y*\s*80}
-              \begin{scope}[xshift=\m mm]
-                \sine{\s}{.10}{1}
-              \end{scope}
-            }
-          \end{scope}
-        \end{scope}
-      }
-    \end{scope}
-    \begin{scope}[xshift=3*\setwidth cm] %Set D
-      \node[x=1mm,y=1mm, anchor=center] () at (14,\labely){Set D};
-      \foreach \x in {10,...,1}
-      {
-        \begin{scope}[yshift=(-(10-\x)*\nl)]
-          \foreach \y in {1,...,\x} {
-            \pgfmathsetmacro{\m}{\y*\s*80}
-            \begin{scope}[xshift=\m mm]
-              \sine{\s}{.10}{1}
-            \end{scope}
-          }
-          \pgfmathtruncatemacro{\l}{20-2*\x}
-          \pgfmathsetmacro{\ll}{\x*\s*80+2}
-          \ifnum \x < 10
-            \begin{scope}[xshift=\ll mm]
-              \sine{\s}{.10}{\l}
-            \end{scope}
-          \fi
-        \end{scope}
-      }
-    \end{scope}
-    \begin{scope}[xshift=4*\setwidth cm] %Set E
-      \node[x=1mm,y=1mm, anchor=center] () at (14,\labely){Set E};
-      \foreach \x in {1,...,10}
-      {
-        \begin{scope}[yshift=(-(\x-1)*\nl)]
-          \foreach \y in {1,...,\x} {
-            \pgfmathsetmacro{\m}{\y*\s*80}
-            \begin{scope}[xshift=\m mm]
-              \sine{\s}{.10}{1}
-            \end{scope}
-          }
-          \pgfmathtruncatemacro{\l}{20-2*\x}
-          \pgfmathsetmacro{\ll}{\x*\s*80+2}
-          \ifnum \x < 10
-            \begin{scope}[xshift=\ll mm]
-              \sine{\s}{.10}{\l}
-            \end{scope}
-          \fi
-        \end{scope}
-      }
-    \end{scope}
-    \begin{scope}[xshift=5*\setwidth cm] %Set F
-      \node[x=1mm,y=1mm, anchor=center] () at (14,\labely){Set F};
-      \foreach \x in {1,...,4}
-      {
-        \pgfmathtruncatemacro{\xx}{\x-1}
-        \begin{scope}[yshift=(-\xx*\nl)]
-          \foreach \y in {0,...,\xx}
-          {
-            \begin{scope}[xshift=(\y*6)]
-              \sine{\s}{.10}{1}
-            \end{scope}
-          }
-        \end{scope}
-      }
-      \begin{scope}[yshift=-4*\nl]
-        \sine{\s}{.10}{7}
-      \end{scope}
-      \foreach \x in {1,...,4}
-      {
-        \begin{scope}[yshift=(-(\x+4)*\nl)]
-          \sine{\s}{.10}{7}
-          \begin{scope}[xshift=22]
-            \foreach \y in {1,...,\x}
-            {
-              \begin{scope}[xshift=(\y*6)]
-                \sine{\s}{.10}{1}
-              \end{scope}
-            }
-          \end{scope}
-        \end{scope}
-      }
-      \begin{scope}[yshift=-9*\nl]
-        \sine{\s}{.10}{7}
-        \begin{scope}[xshift=28]
-          \sine{\s}{.10}{7}
-        \end{scope}
-      \end{scope}
-    \end{scope}
-%    \node[x=1mm,y=1mm, anchor=center] () at (70,-36){Set C};
-%    \node[x=1mm,y=1mm, anchor=center] () at (103,-36){Set D};
-%    \node[x=1mm,y=1mm, anchor=center] () at (136,-36){Set E};
-%    \node[x=1mm,y=1mm, anchor=center] () at (160,-36){Set F};
-  \end{tikzpicture}
-  \tikzexternaldisable
-  \caption[6 pattern sets evaluated in Activibe.]{Visual representation of the 6 pattern sets we evaluated in two laboratory studies, and a longitudinal study.}
-  \label{fig:activibesets}
-\end{figure}
+\input{figures/activibesets.tex}
 
 \paragraph{Design Rationale}
 Our design is driven by the semantics of the values we want to convey.
@@ -852,8 +466,8 @@ We obtained 100ms for the pulse and 150ms for the break between two pulses.
 Therefore, the longest patterns last less than 3 seconds.
 
 In the longitudinal study, we increased the vibrations durations given that participants will not be paying as much attention to the vibration as they had in the laboratory studies.
-Short vibration lasted $150ms$, long vibration $600ms$, and pauses were $200ms$ long.
-Finally, the pre-vibration was long vibrations of $700ms$.
+Short vibration lasted \qty{150}{\ms}, long vibration \qty{600}{\ms}, and pauses were \qty{200}{\ms} long.
+Finally, the pre-vibration was long vibrations of \qty{700}{\ms}.
 
 \subsubsection{Evaluation}
 
@@ -866,7 +480,7 @@ Readers interested in the details about the experimental protocols and the resul
 The first findings are related to the participants' strategy for interpreting the patterns.
 Either they counted the short vibrations or estimated the duration of the long ones.
 The results showed that it is easier to count vibrations than to estimate the duration.
-This is at least true within the tested range: 1-10, and $3s$ maximum.
+This is at least true within the tested range: 1-10, and \qty{3}{\second} maximum.
 Indeed, we believe it would be much more complicated to keep the count with higher values.
 Durations are much complex to interpret, in particular because of the perception of time.
 Other modalities can influence the perception of the duration of haptic signals~\cite{grondin09}.
@@ -884,7 +498,7 @@ Participants identified these patterns with the same or better performance than
 \paragraph{Distance between input and answer}
 
 In the context of activity monitoring, the distance between the correct value and the user answer matters.
-Indeed, interpreting a $60\%$ progression instead of $70\%$ is a lesser concern than interpreting $20\%$ instead of $70\%$.
+Indeed, interpreting a \qty{60}{\percent} progression instead of \qty{70}{\percent} is a lesser concern than interpreting \qty{20}{\percent} instead of \qty{70}{\percent}.
 Therefore we analyzed this precision as a measure of distance between the input and the actual answer.
 We observed differences in terms of precision across pattern sets.
 For example with sets A and B, the precision gets worse as the number is high.
@@ -901,7 +515,7 @@ Many participants mentioned that with the pattern set C, they liked the long vib
 We believed this aspect would be important in a real context when users receive information while they perform their daily activities.
 Therefore we conducted a 28-days longitudinal study.
 Participants were presented with random numbers of set F.
-Half of them received a pre-attentive vibration of $700ms$ between the actual pattern.
+Half of them received a pre-attentive vibration of \qty{700}{\ms} between the actual pattern.
 In order to make sure participants do not expect the notifications, they were sent twelve vibrations per day at semi-random times within a one-hour window between 7am and 8pm.
 This schedule helped to cover different activities from the users such as their commute, when they bring their kids to school, their day at work, and some evening activities.
 
@@ -956,7 +570,7 @@ Our colleagues built several prototypes.
 They glued an array of piezoelectric ceramics under the tactile surface.
 Their objective is to control the actuation of the ceramics to deform the whole surface consistently~\cite{biet07}.
 The ceramics are activated by two electrical signals with a phase shift between each other.
-The amplitude is maximized with a $180^\circ$ phase shift, and zero with a $0^\circ$ phase shift.
+The amplitude is maximized with a \ang{180} phase shift, and zero with a \ang{0} phase shift.
 The perceived friction depends on the vibration amplitude of the whole surface.
 Therefore the device cannot produce different tactile sensations on several fingers touching the surface.
 It is however possible to change the amplitude over time.
@@ -999,88 +613,30 @@ This difference of friction corresponds to the intensity of the signal.
 %A randomly chosen side presented the tested reference level, and the other presented another value that depend on the tested intensity.
 The friction was uniform on the whole surface for the two other configurations.
 Participants had to tell which configuration presented a signal.
-This procedure reduces the chance level to $33\%$ and avoids anticipation biases.
+This procedure reduces the chance level to \qty{33}{\percent} and avoids anticipation biases.
 The position of the signal among the 3 configurations was random, and the side presenting the reference level was random as well.
 
-\begin{figure}[htb]
-  \definecolor{cellred}{rgb}    {0.98,0.17,0.15}
-  \definecolor{cellblue}{rgb}    {0.17,0.60,0.99}
-  \def\sx{4.7mm}
-  \def\sy{10mm}
-  \def\revthickness{1.5pt}
-
-  \newcommand{\good}[1]{
-    \node[x=\sx,y=\sy, inner sep=1mm,circle,fill=cellblue] at (#1) {};
-  }
-  \newcommand{\goodrev}[1]{
-    \node[x=\sx,y=\sy, inner sep=1mm,circle,fill=cellblue, line width=\revthickness, draw=black] at (#1) {};
-  }
-
-  \newcommand{\wrong}[1]{
-    \node[x=\sx,y=\sy, inner sep=1mm,circle,fill=cellred] at (#1) {};
-  }
-  \newcommand{\wrongrev}[1]{
-    \node[x=\sx,y=\sy, inner sep=1mm,circle,fill=cellred, line width=\revthickness, draw=black] at (#1) {};
-  }
-  \newcommand{\rev}[1]{
-    \node[x=\sx,y=\sy, inner sep=1mm,circle,line width=\revthickness, draw=black] at (#1) {};
-  }
-  
-  \def\values{{4,4,3,3,2,2,1,2,2,1,1.3,1.3,1.6,1.6,1.3,1.3,1,1.3,1.3,1,1.3,1.3,1,1.3,1.6,1.6,1.3,1.6,1.6,1.3}}
-  \def\vtypes{{0,0,0,0,0,0,3,0,1,3,0,2,0,1,0,0,3,0,1,3,0,1,3,2,0,1,3,0,1,3}}
-
-  \begin{tikzpicture}
-    %Axis
-    \draw[x=1mm,y=1mm, <->]
-    (-5,45) -- (-5,0) -- (150,0);
-    \node[x=\sx,y=\sy] at (0,-0.3) {1};
-    \node[x=\sx,y=\sy] at (9,-0.3) {10};
-    \node[x=\sx,y=\sy] at (19,-0.3) {20};
-    \node[x=\sx,y=\sy] at (29,-0.3) {30};
-    \node[x=\sx,y=\sy] at (15,-0.6) {Trial};
-    \node[x=\sx,y=\sy,rotate=90] at (-2,2.5) {Intensity};
-
-    \draw[x=\sx,y=\sy, dotted, line width=1.2pt]
-    (13,1.3) -- (32,1.3);
-
-    %data
-    \foreach \i in {0,...,29} {
-      \pgfmathsetmacro{\ti}{\vtypes[\i]}
-      \ifthenelse{\ti=0}{\good{\i,\values[\i]}}{}
-      \ifthenelse{\ti=1}{\goodrev{\i,\values[\i]}}{}
-      \ifthenelse{\ti=2}{\wrong{\i,\values[\i]}}{}
-      \ifthenelse{\ti=3}{\wrongrev{\i,\values[\i]}}{}
-    }
-    \good{25,4} \node[x=\sx,y=\sy, align=left, anchor=west] at (25.5,4) {Good answer};
-    \wrong{25,3.5} \node[x=\sx,y=\sy, align=left, anchor=west] at (25.5,3.5) {Wrong answer};
-    \rev{25,3} \node[x=\sx,y=\sy, align=left, anchor=west] at (25.5,3) {Reversal};
-    \draw[x=\sx,y=\sy, dotted, line width=1.2pt] (24.7,2.5) -- (25.3,2.5); \node[x=\sx,y=\sy, align=left, anchor=west] at (25.5,2.5) {Estimated threshold};
-
-%    \node[x=1mm,y=1mm, anchor=center] () at (160,-36){Set F};
-  \end{tikzpicture}
-  \caption[Adaptative procedure.]{Example of an adaptative procedure.}
-  \label{fig:adaptativeprocedure}
-\end{figure}
+\input{figures/adaptativeprocedure.tex}
 
 The first trial of each block used the largest difference for the chosen reference value.
-For example, with a reference level of $0^\circ$ the other value was $180^\circ$.
-Then, the value decreased by $1.8dB$ after two good answers in a row and increased by $1.8dB$ after a wrong answer.
-After three reversals we reduced the increment/decrement to $1.2dB$ since participants went closer to the perception threshold.
+For example, with a reference level of \ang{0} the other value was \ang{180}.
+Then, the value decreased by \qty{1.8}{\decibel} after two good answers in a row and increased by \qty{1.8}{\decibel} after a wrong answer.
+After three reversals we reduced the increment/decrement to \qty{1.2}{\decibel} since participants went closer to the perception threshold.
 The block ended at the \nth{13} reversal.
 We estimated the threshold by averaging the values corresponding to the last 10 reversals.
 %Participants typically performed between 30 to 50 trials per block.
 
 We used six reference levels, one for each block.
-The values were spread out linearly between the minimum and maximum command (\degr{0} to \degr{180} phase shift).
-For the first three values (\degr{0}, \degr{36}, and \degr{72}) we searched the minimum greater value for which participant could feel a step.
-For the last three values (\degr{108}, \degr{144}, and \degr{180}) we searched the minimum lower value for which participant could feel a step.
+The values were spread out linearly between the minimum and maximum command (\ang{0} to \ang{180} phase shift).
+For the first three values (\ang{0}, \ang{36}, and \ang{72}) we searched the minimum greater value for which participant could feel a step.
+For the last three values (\ang{108}, \ang{144}, and \ang{180}) we searched the minimum lower value for which participant could feel a step.
 
 The Stimtac device version we used in this experiment is depicted on \reffig{fig:stimtac}.
-The surface is $75 \times 40mm$, made of Copper-Beryllium, covered with a \emph{Filmolux® easy clear matt} plastic sheet.
+The surface is \qtyproduct{75 x 40}{\mm}, made of Copper-Beryllium, covered with a \emph{Filmolux® easy clear matt} plastic sheet.
 36 piezo-electric ceramics are glued underneath.
 35 of them are actuated to vibrate the surface, and the last one is used as a sensor to measure the vibration amplitude.
 The device was connected to a PC through USB, on which the experimental application was running.
-A plastic cover, not visible on the picture, was placed over the surface to reduce the interactive surface to $70 \times 20mm$ to reduce the variability of amplitude and guide the user on a lateral movement.
+A plastic cover, not visible on the picture, was placed over the surface to reduce the interactive surface to \qtyproduct{70 x 20}{\mm} to reduce the variability of amplitude and guide the user on a lateral movement.
 
 \begin{figure}[htb]
   \centering
@@ -1101,11 +657,11 @@ We presented them with a low-intensity signal to make sure they will be able to
 All the participants felt this signal.
 The application showed three visually identical items representing the three configurations of the trial.
 Participants could switch between them with the \Space key but could not go back to the previous ones.
-The current item was highlighted, and we limited the exploration time for each item to $12s$.
+The current item was highlighted, and we limited the exploration time for each item to \qty{12}{\second}.
 After exploring the three items, participants had to indicate which one presented the signal with the \keys{1} \keys{2} \keys{3} keys.
 Participants did not receive any feedback regarding whether their answer was good or wrong.
 
-12 participants took part in this experiment, all of them were right-handed, their mean age was $27.7$ years old, and none of them had a known tactile sensitivity issue.
+12 participants took part in this experiment, all of them were right-handed, their mean age was \num{27.7} years old, and none of them had a known tactile sensitivity issue.
 Participants performed 2 sessions of 6 blocks with pauses between blocks and the two sessions happened on a different day.
 Each block typically consisted of 30 to 50 trials and lasted about 20 minutes.
 The order of blocks was balanced with a Latin square.
@@ -1140,12 +696,12 @@ On the right side, the error bar is on the variable end because the reference le
     \toprule
     \textbf{Reference level} & \textbf{Mean JND}     & \textbf{Standard Deviation} \\
     \midrule
-    \degr{0}        & \degr{60.0}  & \degr{33.8}\\
-    \degr{36}       & \degr{29.8}  & \degr{16.6}\\
-    \degr{72}       & \degr{34.1}  & \degr{17.0}\\
-    \degr{108}      & \degr{39.8}  & \degr{15.5}\\
-    \degr{144}      & \degr{57.6}  & \degr{16.8}\\
-    \degr{180}      & \degr{64.6}  & \degr{33.7}\\
+    \ang{0}        & \ang{60.0}  & \ang{33.8}\\
+    \ang{36}       & \ang{29.8}  & \ang{16.6}\\
+    \ang{72}       & \ang{34.1}  & \ang{17.0}\\
+    \ang{108}      & \ang{39.8}  & \ang{15.5}\\
+    \ang{144}      & \ang{57.6}  & \ang{16.8}\\
+    \ang{180}      & \ang{64.6}  & \ang{33.7}\\
     \bottomrule
   \end{tabular}
   \caption[Variable friction mean JND and standard deviation]{Mean JND values and standard deviation for each reference level.}
@@ -1156,7 +712,7 @@ A Shapiro-Wilk normality test shows the data does not follow a normal distributi
 We performed a boxcox correction ($\lambda=0.18$), however the data distribution remained not normal (\p{0.0001}).
 Therefore we analyzed our data with a Kruskal-Wallis rank-sum test, which showed significant differences (\chisquares{5}{204.45})
 The posthoc analysis with pairwise Wilcoxon rank-sum tests shows two groups of reference levels with significant differences between the groups.
-The difference between the JND and the \degr{0}, \degr{144}, and \degr{180} reference levels was significantly higher than with the \degr{36}, \degr{72} and \degr{104} (\p{0.0001} for all differences, except between \degr{72} and \degr{108} for which \p{0.05}).
+The difference between the JND and the \ang{0}, \ang{144}, and \ang{180} reference levels was significantly higher than with the \ang{36}, \ang{72} and \ang{104} (\p{0.0001} for all differences, except between \ang{72} and \ang{108} for which \p{0.05}).
 
 %Shapiro-Wilk normality test
 %data:  res
@@ -1194,13 +750,13 @@ The difference between the JND and the \degr{0}, \degr{144}, and \degr{180} refe
 First of all, it is important to remind that the squeeze film effect reduces friction.
 Therefore, when the command is high, the surface is more slippery than when the command is low.
 Therefore on the figures, the left and bottom sides correspond to high friction, and the right and top sides correspond to low friction.
-Therefore we explain the fact that the higher difference between the reference levels and the JND are on the edge values (\degr{0}, \degr{144}, and \degr{180}) with the non-linearity of both the effect produced by the command (effect on \degr{0}) and the perception of the mechanical effect (effect on \degr{144}, and \degr{180}).
+Therefore we explain the fact that the higher difference between the reference levels and the JND are on the edge values (\ang{0}, \ang{144}, and \ang{180}) with the non-linearity of both the effect produced by the command (effect on \ang{0}) and the perception of the mechanical effect (effect on \ang{144}, and \ang{180}).
 
-The overall and conservative recommendation here is to use differences of phase shift greater than \degr{100} to create patterns with this implementation of Stimtac (larger mean JND plus standard deviation).
-In any case, it is unlikely users can perceive a difference of phase shift lower than \degr{10} (lower mean JND minus standard deviation).
+The overall and conservative recommendation here is to use differences of phase shift greater than \ang{100} to create patterns with this implementation of Stimtac (larger mean JND plus standard deviation).
+In any case, it is unlikely users can perceive a difference of phase shift lower than \ang{10} (lower mean JND minus standard deviation).
 Unfortunately, at the time I am writing this I have no access to the amplitude measurement data.
 This makes it impossible to draw more general recommendations.
-The measurement with a laser vibrometer of a \degr{180} command gives a $2.2\mu m$ amplitude of vibration.
+The measurement with a laser vibrometer of a \ang{180} command gives a \qty{2.2}{\micro\metre} amplitude of vibration.
 It is however difficult to measure an actual friction value because it depends on the force applied on the surface, which varies when users move their fingers to explore the surface.
 
 
@@ -1252,85 +808,7 @@ There are many ways to increase or decrease the size of shapes of a gradient: li
 Finally, the sixth pattern is a \emph{random} series of shapes.
 We can control the minimum and maximum sizes of shapes.
 
-\begin{figure}[htb]
-  \definecolor{cellblue}{rgb}    {0.17,0.60,0.99}
-  \def\dx{75}
-  \def\dy{40}
-  \def\scale{0.26mm}
-
-  \centering
-
-  \tikzexternalenable
-  \begin{tikzpicture}
-
-    \begin{scope}[]
-      \node[x=\scale,y=\scale, anchor=center] () at (\dx/2,-10){Constant};
-      \fill[x=\scale,y=\scale,color=cellblue] (0,0) rectangle (\dx,\dy);
-      \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
-    \end{scope}
-    
-    \begin{scope}[xshift=3cm]
-      \pgfmathsetmacro{\x}{\dx/2}
-      \fill[x=\scale,y=\scale,color=cellblue] (0,0) rectangle (\x,\dy);
-      \node[x=\scale,y=\scale, anchor=center] () at (\dx/2,-10){Step};
-      \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
-    \end{scope}
-
-    \begin{scope}[xshift=6cm]
-      \pgfmathsetmacro{\x}{\dx/2}
-      \fill[x=\scale,y=\scale,color=cellblue] (\x-3,0) rectangle (\x+3,\dy);
-      \node[x=\scale,y=\scale, anchor=center] () at (\dx/2,-10){Shape};
-      \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
-    \end{scope}
-
-    \begin{scope}[xshift=9cm]
-      \def\n{8}
-      \def\dc{0.4}
-      \pgfmathsetmacro{\p}{\dx / (\n + \dc - 1)}
-      \pgfmathsetmacro{\w}{\dc*\p}
-      \pgfmathsetmacro{\nn}{\n-1}
-      \fill[x=\scale,y=\scale,color=cellblue] (0,0) rectangle (\w,\dy);
-      \foreach \i in {1,...,\nn} {
-        \pgfmathsetmacro{\d}{\i*\p}
-        \fill[x=\scale,y=\scale,color=cellblue] (\d,0) rectangle (\d+\w,\dy);
-      }
-      \node[x=\scale,y=\scale, anchor=center] () at (\dx/2,-10){Field};
-      \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
-    \end{scope}
-    
-    \begin{scope}[xshift=12cm]
-      \def\n{6}
-      \def\dc{0.5}
-      \def\s{0.681}
-      \def\p{40}
-      \pgfmathsetmacro{\d}{0}
-      \foreach \i [remember=\dd as \d (initially 0)] in {1,...,\n} {
-        \pgfmathsetmacro{\w}{\dc * \p * \s^\i}
-        \fill[x=\scale,y=\scale,color=cellblue] (\d,0) rectangle (\d+\w,\dy);
-        \pgfmathsetmacro{\dd}{\d + \p * \s^\i}
-        }
-        \node[x=\scale,y=\scale, anchor=center] () at (\dx/2,-10){Gradient};
-        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
-      \end{scope}
-  
-      \begin{scope}[xshift=15cm]
-        \def\n{100}
-        \pgfmathsetmacro{\w}{\dx / \n}
-        \foreach \i in {1,...,\n} {
-          \pgfmathrandominteger{\r}{0}{1}
-          \ifthenelse{\r = 0}{
-            \fill[x=\scale,y=\scale,color=cellblue] (\i*\w,0) rectangle (\i*\w+\w,\dy);
-          }{}
-        }
-        \node[x=\scale,y=\scale, anchor=center] () at (\dx/2,-10){Random};
-        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
-      \end{scope}
-%    \node[x=1mm,y=1mm, anchor=center] () at (160,-36){Set F};
-  \end{tikzpicture}
-  \tikzexternaldisable
-  \caption[Examples of tactile patterns.]{Examples of tactile patterns with increased complexity. The background is white and the pattern is blue.}
-  \label{fig:tactilepattern}
-\end{figure}
+\input{figures/tactilepattern.tex}
 
 \begin{definition}{Tactile texture}
   We define a \defword{Tactile texture} as combination of one of several patterns on several dimensions or at different scales.
@@ -1348,99 +826,7 @@ However, the range of friction we can produce with this device is not as wide as
 Therefore we cannot simply translate vibrotactile Tactons into tactile textures with current programmable friction devices.
 It would be interesting to perform JND studies with newer devices that produces a higher quality variable friction feedback, such as devices made by Hap2U\footnote{\href{https://www.hap2u.net/}{https://www.hap2u.net/}}.
 
-
-\begin{figure}[htb]
-  \definecolor{cellblue}{rgb}    {0.17,0.60,0.99}
-  \def\dx{655}
-  \def\dy{40}
-  \def\scale{0.26mm}
-
-  \centering
-
-  \tikzexternalenable
-  \begin{tikzpicture}
-    
-    \begin{scope} % field
-      \def\n{10}
-      \def\w{6}
-      \def\dc{0.4}
-      \foreach \i in {0,...,\n} {
-        \pgfmathsetmacro{\d}{\i*\w}
-        \fill[x=\scale,y=\scale,color=cellblue] (\d,0) rectangle (\d+\w*\dc,\dy);
-      }
-    \end{scope}
-    
-    \begin{scope}[xshift=3cm] %gradient
-      \def\n{8}
-      \def\dc{0.6}
-      \def\s{0.8}
-      \def\p{50}
-      \pgfmathsetmacro{\d}{0}
-      \foreach \i [remember=\dd as \d (initially 0)] in {1,...,\n} {
-        \pgfmathsetmacro{\w}{\dc * \p * \s^\i}
-        \fill[x=\scale,y=\scale,color=cellblue] (\d,0) rectangle (\d+\w,\dy);
-        \pgfmathsetmacro{\dd}{\d + \p * \s^\i}
-      }
-    \end{scope}
-      
-    \begin{scope}[xshift=7.5cm] %random
-      \def\n{200}
-      \pgfmathsetmacro{\w}{0.5}
-      \foreach \i in {1,...,\n} {
-        \pgfmathrandominteger{\r}{0}{1}
-        \ifthenelse{\r = 0}{
-          \fill[x=\scale,y=\scale,color=cellblue] (\i*\w,0) rectangle (\i*\w+\w,\dy);
-        }{}
-      }
-    \end{scope}
-          
-    \begin{scope}[xshift=10.2cm] % field
-      \def\n{50}
-      \def\w{2}
-      \def\dc{0.6}
-      \foreach \i in {0,...,\n} {
-        \pgfmathsetmacro{\d}{\i*\w}
-        \fill[x=\scale,y=\scale,color=cellblue] (\d,0) rectangle (\d+\w*\dc,\dy);
-      }
-    \end{scope}
-            
-    \begin{scope}[xshift=12.8cm] %gradient
-      \def\n{12}
-      \def\dc{0.6}
-      \def\s{1.28}
-      \def\p{2}
-      \pgfmathsetmacro{\d}{0}
-      \foreach \i [remember=\dd as \d (initially 0)] in {1,...,\n} {
-        \pgfmathsetmacro{\w}{\dc * \p * \s^\i}
-        \fill[x=\scale,y=\scale,color=cellblue] (\d,0) rectangle (\d+\w,\dy);
-        \pgfmathsetmacro{\dd}{\d + \p * \s^\i}
-      }
-    \end{scope}
-    \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
-    
-    \begin{scope}[yshift=-1.5cm]
-      \def\n{10}
-      \def\ndc{0.7}
-      \def\m{16}
-      \def\mdc{0.4}
-      \pgfmathsetmacro{\nw}{\dx / \n}
-      \pgfmathsetmacro{\mw}{\nw * \ndc / \m}
-      \pgfmathsetmacro{\nn}{\n - 1}
-      \pgfmathsetmacro{\mm}{\m - 1}
-      \foreach \i in {0,...,\nn} {
-        \foreach \j in {0,...,\mm} {
-          \fill[x=\scale,y=\scale,color=cellblue] (\i * \nw + \j * \mw,0) rectangle (\i * \nw + \j * \mw + \mw * \mdc,\dy);
-        }
-      }
-      \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
-    \end{scope}
-
-%    \node[x=1mm,y=1mm, anchor=center] () at (160,-36){Set F};
-  \end{tikzpicture}
-  \tikzexternaldisable
-  \caption[Examples of tactile textures.]{Examples of tactile textures. The first one is the combination of a series of various pattern types. It starts with a field, then a constant, a decreasing gradient, a random pattern, another field and finishes with an increasing gradient. The second one is a repetition of a field-type tactile pattern. }
-  \label{fig:tactiletexture}
-\end{figure}
+\input{figures/tactiletexture.tex}
 
 Contrary to vibrotactile Tactons, tactile texture can easily extend to multiple dimensions.
 \reffig{fig:tactilepattern} shows 1D textures, but it can extend to 2D, 3D textures or even 4D with a temporal dimension.
@@ -1466,148 +852,7 @@ This method was already successfully used to evaluate Tactons~\cite{enriquez06}.
 \reffig{fig:stimtacpatterns} shows the patterns we evaluated in our study~\cite{potier16}.
 They are made of 5 \textsc{shapes} and 7 \textsc{densities}, for a total of 34 patterns (the lowest density vertical line and squares are identical).
 
-\begin{figure}[htb]
-  \definecolor{cellblue}{rgb}    {0.17,0.60,0.99}
-  \def\dx{80}
-  \def\dy{40}
-  \def\spacing{5}
-  \def\scale{0.72}
-  \linespread{1.0}
-  \def\n{7}
-  \pgfmathsetmacro{\nn}{\n - 1}
-
-  \centering
-
-  \tikzexternalenable
-  \begin{tikzpicture} %v lines
-    \foreach \i in {0,...,\nn} {
-      \pgfmathsetmacro{\xs}{\i*(\dx+\spacing)*\scale}
-      \begin{scope}[xshift=\xs]
-        %\clip[x=\scale,y=\scale] (0,0) rectangle (\dx,\dy);
-        \pgfmathsetmacro{\m}{2^\i}
-        \pgfmathsetmacro{\d}{\dx / \m}
-        \pgfmathsetmacro{\mm}{\m - 1}
-        \foreach \j in {0,...,\mm} {
-          \fill[x=\scale,y=\scale,color=cellblue] (\j*\d,0) rectangle (\j*\d + \d/2,\dy);
-        }
-        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
-      \end{scope}
-    }
-    \node[x=\scale,y=\scale, align=right, text width=1.8cm, anchor=east] () at (0,20){vertical lines};
-  \end{tikzpicture}
-
-  \vspace{1mm}
-
-  \begin{tikzpicture} %h lines
-    \foreach \i in {0,...,\nn} {
-      \pgfmathsetmacro{\xs}{\i*(\dx+\spacing)*\scale}
-      \begin{scope}[xshift=\xs]
-        %\clip[x=\scale,y=\scale] (0,0) rectangle (\dx,\dy);
-        \pgfmathsetmacro{\m}{2^\i}
-        \pgfmathsetmacro{\d}{\dy / \m}
-        \pgfmathsetmacro{\mm}{\m - 1}
-        \foreach \j in {0,...,\mm} {
-          \fill[x=\scale,y=\scale,color=cellblue] (0,\dy - \j*\d) rectangle (\dx,\dy - \j*\d - \d/2);
-        }
-        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
-      \end{scope}
-    }
-    \node[x=\scale,y=\scale, align=right, text width=1.8cm, anchor=east] () at (0,20){horizontal lines};
-  \end{tikzpicture}
-
-  \vspace{1mm}
-
-  \begin{tikzpicture} %squares
-    \foreach \i in {0,...,\nn} {
-      \pgfmathsetmacro{\xs}{\i*(\dx+\spacing)*\scale}
-      \begin{scope}[xshift=\xs]
-        %\clip[x=\scale,y=\scale,draw] (0,0) rectangle (\dx,\dy);
-        \pgfmathsetmacro{\mx}{2^(\i+1)}
-        \pgfmathsetmacro{\my}{2^\i}
-        \pgfmathsetmacro{\d}{\dx / \mx}
-        \pgfmathsetmacro{\mxx}{\mx-1}
-        \pgfmathsetmacro{\myy}{\my-1}
-        \foreach \j in {0,...,\mxx} {
-          \foreach \k in {0,...,\myy} {
-            \pgfmathsetmacro{\res}{int(Mod(\j + \k, 2))}
-            \ifthenelse{\res = 0}{
-              \fill[x=\scale,y=\scale,color=cellblue] (\j*\d,\dy - \k*\d) rectangle (\j*\d + \d,\dy - \k*\d - \d);
-            }{}
-          }
-        }
-        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
-      \end{scope}
-    }
-    \node[x=\scale,y=\scale, align=right, text width=1.8cm, anchor=east] () at (0,20){squares};
-  \end{tikzpicture}
-
-  \vspace{1mm}
-
-  \begin{tikzpicture} %dots
-    \foreach \i in {0,...,\nn} {
-      \pgfmathsetmacro{\xs}{\i*(\dx+\spacing)*\scale}
-      \begin{scope}[xshift=\xs]
-        %\clip[x=\scale,y=\scale,draw] (0,0) rectangle (\dx,\dy);
-        \pgfmathsetmacro{\mx}{2^(\i+1)}
-        \pgfmathsetmacro{\my}{2^\i}
-        \pgfmathsetmacro{\d}{\dx / \mx}
-        \pgfmathsetmacro{\dd}{\d / 2}
-        \pgfmathsetmacro{\mxx}{\mx-1}
-        \pgfmathsetmacro{\myy}{\my-1}
-        \foreach \j in {0,...,\mxx} {
-          \foreach \k in {0,...,\myy} {
-            \pgfmathsetmacro{\res}{int(Mod(\j + \k, 2))}
-            \pgfmathsetmacro{\resb}{int(Mod(\k, 2))}
-            \ifthenelse{\res = 0 \AND \resb = 0}{
-              \fill [x=\scale,y=\scale,color=cellblue] (\j*\d+\dd,\dy-\k*\d-\dd) circle (\dd);
-            }{}
-          }
-        }
-        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
-      \end{scope}
-    }
-    \node[x=\scale,y=\scale, align=right, text width=1.8cm, anchor=east] () at (0,20){dots};
-  \end{tikzpicture}
-
-  \vspace{1mm}
-%nbc cs   1     2     3    4    5    6    7    8
-%1   4   3/3   1/3
-%2   8   7/7   5/7   3/7  1/7
-%4   16 15/15 13/15 11/15 9/15 7/15 5/15 3/15 1/15
-
-  \begin{tikzpicture} % circles
-    %\node[x=\scale,y=\scale, anchor=center] () at (10,10){\n};
-    \def\nx{1}
-    \foreach \i in {0,...,\nn} {
-      \pgfmathsetmacro{\xs}{\i*(\dx+\spacing)*\scale}
-      \begin{scope}[xshift=\xs]
-        \clip[x=\scale,y=\scale] (0,0) rectangle (\dx,\dy);
-        %\node[x=\scale,y=\scale, anchor=center] () at (0,0) {\i};
-        \pgfmathsetmacro{\nbc}{2^\i}
-        \pgfmathsetmacro{\nbcc}{2*\nbc}
-        \pgfmathsetmacro{\cs}{\nbc*4}
-        %\node[x=\scale,y=\scale, anchor=center] () at (\i+10,20) {\cs};
-        \foreach \j in {-14,...,\nbcc} {
-          \pgfmathsetmacro{\res}{int(Mod(\j, 2))}
-          \pgfmathsetmacro{\ci}{\cs - 2 * \j + 1}
-          \pgfmathsetmacro{\d}{\dy * \ci / (\cs - 1)}
-          \wlog{\i ; \j ; nbc \nbc ; cs \cs ; ci \ci ; d \d}
-          %\node[x=\scale,y=\scale, anchor=center] () at (10,(\i*10)) {\ci};
-          \ifthenelse{\res = 1}{
-            \fill [x=\scale,y=\scale,color=cellblue] (\dx / 2,\dy / 2) circle (\d);
-          }{
-            \fill [x=\scale,y=\scale,color=white] (\dx / 2,\dy / 2) circle (\d);
-          }
-        }
-        \draw[x=\scale,y=\scale,color=black] (0,0) rectangle (\dx,\dy);
-      \end{scope}
-    }
-    \node[x=\scale,y=\scale, align=right, text width=1.8cm, anchor=east] () at (0,20){circles};
-  \end{tikzpicture}
-  \tikzexternaldisable
-  \caption[Tactile patterns used in the MDS experiment.]{Tactile patterns used in the MDS experiment. They are made of 5 shapes and 7 densities.}
-  \label{fig:stimtacpatterns}
-\end{figure}
+\input{figures/stimtacpatterns.tex}
 
 The secondary research question is whether the perception of tactile textures with a variable friction device is similar to the perception of a similar pattern on a physical surface.
 We can expect differences because this technology cannot produce edges that we can feel under the fingertip.
@@ -1750,8 +995,8 @@ We prototyped the driving electronics and clamping system, designed tactile widg
 
 \begin{figure}[htb]
   \centering
-  \includegraphics[height=5.2cm]{figures/mojave}%
-  \includegraphics[height=5.2cm]{figures/mojavedashboard}
+  \includegraphics[height=5.1cm]{figures/mojave}%
+  \includegraphics[height=5.1cm]{figures/mojavedashboard}
   \caption[Mojave concept car.]{The Mojave concept car designed by the Esperra Sbarro school, showcased at the Geneva Motor Show 2017. We implemented the software part of the dashboard and the driving electronics.}
   \label{fig:mojave}
 \end{figure}
@@ -1808,7 +1053,7 @@ Mobile phones sometimes use vibrations for button presses, but the quality of th
 Indeed other actuators provide sharper vibrotactile feedback.
 We discussed this at the beginning of this chapter.
 Voice coil actuators provide precise and strong vibrations~\cite{yao10}, and piezo actuators have a smaller form factor and are convenient for implementing buttons~\cite{tashiro09,lylykangas11}.
-Our challenge is that printed actuators are thin (between $4\mu m$ and $10\mu m$).
+Our challenge is that printed actuators are thin (between \qtylist{4;10}{\micro\metre}).
 Therefore the vibration propagation requires a careful design.
 % as discussed on the previous page.
 
@@ -1823,54 +1068,7 @@ The tactile points (1) and (3) represent the click sensations when the button ph
 We adapted and simplified these curves for the design and implementation of our buttons.
 We describe further our implementation of buttons, sliders, and touchpads in~\cite{frisson20,frisson17}.
 
-\begin{figure}[htb]
-  \definecolor{cellred}{rgb}    {0.98,0.17,0.15}
-  \definecolor{cellblue}{rgb}   {0.17,0.60,0.99}
-  \def\scale{1mm}
-
-  \newcommand{\nodec}[3]{\node[x=1mm,y=1mm, draw, fill=white, circle, align=center, text width=4mm, minimum size=1mm] (#3) at (#1) {\small #2};}
-  \newcommand{\nodes}[3]{\node[x=1mm,y=1mm, draw, fill=white, rectangle, minimum size=6mm] (#3) at (#1) {\small #2};}
-
-  \centering
-
-  \tikzexternalenable
-  \begin{tikzpicture} %v lines
-    \draw[x=\scale, y=\scale, <->] (0,40) -- (0,0) -- (85,0) node [anchor=north east] {Displacement (mm)};
-    \node[x=\scale, y=\scale, anchor=south, rotate=90] () at (0,30){Force (N)};
-
-    \nodec{15,30}{$1$}{one};
-    \nodec{60,30}{$1'$}{oneb};
-    \nodes{80,40}{$2$}{two};
-    \nodec{45,10}{$3$}{three};
-    \nodec{0,10}{$3'$}{threeb};
-
-    \draw[x=\scale, y=\scale, ->, -stealth', draw=cellred, ultra thick] (0,20) -- (one);
-    \draw[x=\scale, y=\scale, ->, -stealth', draw=cellred, ultra thick] (one) -- (45,20) -- (oneb);
-    \draw[x=\scale, y=\scale, ->, -stealth', draw=cellred, ultra thick] (oneb) -- (two);
-
-    \draw[x=\scale, y=\scale, ->, -stealth', draw=cellblue, ultra thick] (two) -- (three);
-    \draw[x=\scale, y=\scale, ->, -stealth', draw=cellblue, ultra thick] (three) -- (15,20) -- (threeb);
-
-    \draw[x=\scale, y=\scale, draw, ultra thick, dashed] (one) -- (oneb);
-    \draw[x=\scale, y=\scale, draw, ultra thick, dashed] (three) -- (threeb);
-
-    \draw[x=\scale, y=\scale, draw=cellred, ultra thick] (90,40) -- (98,40);
-      \node[x=\scale, y=\scale, anchor=west] () at (100,40){Press curve};
-    \draw[x=\scale, y=\scale, draw=cellblue, ultra thick] (90,32) -- (98,32);
-      \node[x=\scale, y=\scale, anchor=west] () at (100,32){Release curve};
-    \draw[x=\scale, y=\scale, draw, ultra thick, dashed] (90,24) -- (98,24);
-      \node[x=\scale, y=\scale, anchor=west] () at (100,24){Jump};
-    \nodec{94,16}{$x$}{}
-      \node[x=\scale, y=\scale, anchor=west] () at (100,16){Tactile point};
-    \nodes{94,8}{$y$}{}
-      \node[x=\scale, y=\scale, anchor=west] () at (100,8){Bottom-out};
-
-%    \node[x=\scale,y=\scale, align=right, text width=1.8cm, anchor=east] () at (0,20){circles};
-  \end{tikzpicture}
-  \tikzexternaldisable
-  \caption[Force-displacement curve for a tactile button.]{Force-displacement curve for a tactile button, adapted and simplified from~\cite{kim13}.}
-  \label{fig:buttonfeedback}
-\end{figure}
+\input{figures/buttonfeedback.tex}
 
 The design of the tactile feedback for slopes and points we described in the previous paragraph requires an iterative process.
 Several tools were designed to support the design of vibrotactile animations~\cite{schneider15,schneider16}, but they are not necessarily designed for the design of haptic feedback for tactile widgets.
index 8fd84f50a6c825b2484e4919769db445c8ac89a9..76a91adf7affe5a62d82245eb116bf805af0da2c 100644 (file)
@@ -309,7 +309,7 @@ They depend on the system running on the host computer.
 The moment users touch the input device, a piezoelectric vibration sensor\footnote{\href{http://www.te.com/usa-en/product-CAT-PFS0011.html}{http://www.te.com/usa-en/product-CAT- PFS0011.html}} attached to the fingertip detects the contact.
 The idea is that all touch-based inputs require an initial contact.
 We connected this sensor to a custom electronic board connected to an Arduino Leonardo\footnote{\href{https://www.arduino.cc/en/Main/Arduino_BoardLeonardo}{https://www.arduino.cc/en/Main/Arduino\_BoardLeonardo}} microcontroller board.
-The board enables the adjustment of the detection threshold since the voltage we get from the piezo sensor is typically lower than $0.5V$.
+The board enables the adjustment of the detection threshold since the voltage we get from the piezo sensor is typically lower than \qty{0.5}{\volt}.
 The Arduino sends a Raw HID message to the host computer when it detects contacts.
 In parallel, the input device sends an event HID packet to the host computer.
 A custom application gets the RawHID packet with HIDAPI\footnote{\href{https://github.com/signal11/hidapi}{https://github.com/signal11/hidapi}}, and the device HID packet with libpointing~\cite{casiez11a}.
@@ -329,8 +329,8 @@ It is both due to the elasticity of the finger, and the mechanical actuation of
 We made this measurement with an aluminum foil around a finger, tapping on a copper tape pasted on a mouse button.
 The finger also had a piezoelectric sensor strapped around its tip.
 The \reffig{fig:piezotrigger} shows a measurement with three signals: the finger contact in blue, the button press in red, and the piezo signal in green.
-We notice it takes about $2ms$ for the button to switch.
-The delay of the piezo trigger depends on the threshold, but it typically takes between $1ms$ and $3ms$.
+We notice it takes about \qty{2}{\ms} for the button to switch.
+The delay of the piezo trigger depends on the threshold, but it typically takes between \qty{1}{\ms} and \qty{3}{\ms}.
 The paper contains more detailed data about these measures~\cite{casiez17}.
 
 \input{figures/piezotrigger.tex}
@@ -341,33 +341,33 @@ We used a photodiode because it is fast.
 \reffig{fig:flicker} shows the signal when the screen turned white.
 Interestingly, the measure is so fast that we can observe the lines being drawn around the sensor.
 Therefore the position of the photodiode on the screen has an impact on the latency we measure.
-However, depending on the adjustment of the detection threshold, we can reliably measure the screen change in $4\mu s$.
+However, depending on the adjustment of the detection threshold, we can reliably measure the screen change in \qty{4}{\micro\second}.
 This is way sufficient for our purpose and makes the actual position of the sensor less critical.
 
 \begin{figure}[htb]
   \includegraphics[width=\columnwidth]{figures/screenflicker}
-  \label{fig:flicker}
   \caption[Photodiode measure]{Photodiode measure. The green signal is the photodiode signal and the red signal is the amplified signal.}
+  \label{fig:flicker}
 \end{figure}
 
 Latency slicing requires having all measures with the same clock.
 This was an issue because part of the process was done on the Arduino board, and another part on the host computer.
 It means we needed a way to communicate in a fast and reliable way between the two.
-The problem is that typical operating systems (Windows, Linux, and MacOS) cannot guarantee the execution of code with a $1ms$ precision.
+The problem is that typical operating systems (Windows, Linux, and MacOS) cannot guarantee the execution of code with a \qty{1}{\ms} precision.
 One solution was to use a Raspberry Pi\footnote{\href{https://www.raspberrypi.org/}{https://www.raspberrypi.org/}} as a host computer because it has GPIOs that can communicate with microcontrollers with low latency.
 However, measures with this platform would not necessarily be representative of the usage of other platforms.
 Thus we considered several communication channels between a microcontroller and a host computer, such as ethernet or a parallel port with a specific extension card.
 Nevertheless, we opted for raw HID messages because their latency was sufficiently low and consistent.
-The round-trip delay between the Arduino and the host computer was between $1s$ and $2s$, depending on the operating system and the processor load.
+The round-trip delay between the Arduino and the host computer was between \qty{1}{\second} and \qty{2}{\second}, depending on the operating system and the processor load.
 %Details are available in the paper.
 
 We made multiple series of measures to study the impact of many types of factors.
 Concerning the input, we compared different input frequencies with a Logitech G9 mouse that enables the adjustment of the mouse frequency.
 %: $125Hz$, $250Hz$, $500Hz$ and $1000Hz$.
 %The difference of latency is small.
-The host computer received the device HID packet after $3.3ms$ on average for $125Hz$ and under a millisecond for frequencies above $250Hz$.
-The latency between the moment the device HID packet was received and the moment the application requested the repaint of the screen was about $3ms$.
-The end-to-end latency was around $60ms$, therefore the input part of the pipeline has little impact on latency.
+The host computer received the device HID packet after \qty{3.3}{\ms} on average for \qty{125}{\hertz} and under a millisecond for frequencies above \qty{250}{\hertz}.
+The latency between the moment the device HID packet was received and the moment the application requested the repaint of the screen was about \qty{3}{\ms}.
+The end-to-end latency was around \qty{60}{\ms}, therefore the input part of the pipeline has little impact on latency.
 %The system and toolkit part are fast as well.
 Most of the latency is due to the output.
 We observed several factors that impact latency: the operating system, graphic toolkit, and screen frequency.
@@ -419,8 +419,8 @@ The rigid part between the tip and the flexible part is long enough to enable us
     \node[below=2mm of flexstylus.south] (hyperbrush) {\scalebox{-1}[1]{\includegraphics[width=\protosize]{figures/hyperbrush}}};
     \node[anchor=south west] (hyperbrush) at ($(hyperbrush.south west) - (0,5)$) {HyperBrush};
   \end{tikzpicture}
-  \label{fig:penprototypes}
   \caption[Flexible pen prototypes]{Two series of flexible pen prototypes. On the top: FlexStylus with a custom bend sensor made of eroded fiber optics. On the bottom: HyperBrush with a consumer electronics bend sensor, and interchangeable flexible components.}
+  \label{fig:penprototypes}
 \end{figure}
 
 The second series of prototypes, called \emph{HyperBrush}~\cite{guerrero21} (\reffig{fig:penprototypes}, down), used a consumer electronics bend sensor\footnote{\href{https://www.bendlabs.com/}{https://www.bendlabs.com/}}.
@@ -468,8 +468,8 @@ However, we want to let such serendipitous behavior happen because it makes inte
   \includegraphics[height=5cm]{figures/flexstylus-joystickgrip}
   \hfill
   \includegraphics[height=3cm]{figures/flexstylus-rollgrip}
-  \label{fig:flexstylus}
   \caption[Flexible pen grips]{Three example of grips with a flexible pen. The pen grip, the joystick grip and the rool grip.}
+  \label{fig:flexstylus}
 \end{figure}
 
 
@@ -558,8 +558,8 @@ We prefer the last method since it allowed us to build prototypes for tabletops,
   \includegraphics[height=3.9cm]{figures/hotfingers-tablette}
   \hfill
   \includegraphics[height=3.9cm]{figures/hotfingers-phone}
-  \label{fig:hotfingers-prototypes}
   \caption[Finger identification prototypes.]{Three implementations of finger identification prototypes. The first one uses gametracks to locate fingers on a tabletop. The two other ones use color markers with a camera to track fingers on a tablet and a smartphone.}
+  \label{fig:hotfingers-prototypes}
 \end{figure}
 
 The \reffig{fig:hotfingers-prototypes} shows our three prototypes.
@@ -609,8 +609,8 @@ Another crib sheet shows an icon representing this constraint.
 \begin{figure}[htb]
   \centering
   \includegraphics[width=\columnwidth]{figures/hotfingers}
-  \label{fig:hotfingers}
   \caption[Command selection with finger identification.]{Command selection with finger identification. A chord with the left hand shows a crib sheet of commands users can select with the right hand. The user selects a command and adjusts the parameters with direct manipulation. The user can lift the left hand while adjusting the command parameters. The user can invoke additional constraints on the command parameters with the left hand.}
+  \label{fig:hotfingers}
 \end{figure}
 
 \subsubsection{Discussion}
@@ -640,8 +640,8 @@ However, we did not conduct a user study to evaluate this aspect and validate th
   \includegraphics[height=3.3cm]{figures/hotfingers-lefthand}
   \hfill
   \includegraphics[height=3.3cm]{figures/hotfingers-lefthand2}
-  \label{fig:hotfingers-helps}
   \caption[Discoverability features for multi-touch interaction with finger identification.]{Discoverability features for multi-touch interaction with finger identification. Users can see all the available commands when touching the surface with all their fingers. Crib sheets show the available commands and constraints when fingers of the left hand are touching the surface.}
+  \label{fig:hotfingers-helps}
 \end{figure}
 
 Keyboard shortcuts with multiple modifier keys are sometimes difficult to execute because the position of the keys is fixed.
@@ -739,8 +739,8 @@ Finally, we compared the performance of the two versions of RayCursor, raycastin
   \hfill
   %f)\hspace{-4mm}
   \includegraphics[height=\fh]{raycursor_c}
-  \label{fig:raycursor}
   \caption[Illustration of Raycursor]{Two versions of Raycursor. The manual RayCursor (left) selects the nearest target from the cursor. The semi-automatic RayCursor acts like raycasting, a black cursor is positioned on the first intersected target. When the ray moves out of a target, it remains selected while it is the nearest target. The users can move the cursor manually with the touchpad, which turns red, to select another target. If the users lift their finger for more than 1s, the cursor switches back to its initial behavior.}
+  \label{fig:raycursor}
   %Illustration of manual Raycursor:
   %a)~the user controls a cursor along the ray using relative displacements of their thumb on the controller’s touchpad;
   %b)~the target closest to the cursor is highlighted.
@@ -796,8 +796,8 @@ Similar to command selection, some of the facial expressions share properties, w
   \hfill
   %d)
   \includegraphics[height=\fh]{emoraye_rmw}
-  \label{fig:faceexpressions}
   \caption[Avatar facial expression selection techniques in VR.]{Four of the facial expression selection techniques: 2D circular menu arranged by emotion, raycasting 2D grid menu, touchpad gestures, raycasting on the 2D circular menu arranged by emotion.
+  \label{fig:faceexpressions}
   %designed: 
   %a) menu presents a grid menu in front of the user with raycasting used to select an expression, 
   %b) touchpad presents a circular menu above the controller and selection is made using the controller's touchpad, 
@@ -825,7 +825,7 @@ Our evaluations show that participants made more errors with the gesture and voi
 We designed several techniques for controlling the intensity, duration, and ending of facial expressions all at once.
 Users define the duration indirectly when they end the facial expression.
 The first technique maps the intensity to the controller trigger.
-The facial expression ends $1s$ after the user released the trigger to avoid incidental endings.
+The facial expression ends \qty{1}{\second} after the user released the trigger to avoid incidental endings.
 The other techniques below end when the user releases the selection button.
 %This method is not convenient with the gesture and voice selection techniques because it adds another step, contrary to the other techniques that already use a validation action.
 With the second technique, users have to shake the controller and the intensity is mapped to the shaking speed.
@@ -926,7 +926,7 @@ We performed measurements on Linux, MacOS, and Windows with several graphics lib
 We showed that this part of the process was the major source of latency.
 Haptic systems are quite different, and there is no clear standard.
 There is typically a haptic look running around 1kHz that computes forces or vibrations faster than the human haptic sensitivity~\cite{salisbury04}.
-Audio-haptic systems with physical simulations use loops up to $10kHz$ \cite{leonard15}.
+Audio-haptic systems with physical simulations use loops up to \qty{10}{\kilo\hertz} \cite{leonard15}.
 In the future, I would like to study the effect of the haptic loop on the perception of different kinds of force models.
 I will also measure the latency of several types of haptic systems, to compare them to visual systems.
 
index 27d7788a8e58e2f69f48c3c5782d07efdc07b393..ec269243343372068534c1d96155d3af0297e7a9 100644 (file)
@@ -41,6 +41,7 @@ I will conclude with some of my favorite contributions to explain the critical r
 
 
 \section{The limits}
+\label{sec:limits}
 
 During my postdoc at the University of Toronto I worked on the lack of haptic feedback in 3D gestural interaction.
 The Microsoft Kinect\footurl{https://tiny.one/Kinect} was just released.
@@ -80,7 +81,7 @@ The idea is to control the frequency and amplitude with two PWM signals generate
 The frequency signal typically ranges between \qtyrange{1}{1000}{\hertz}.
 The amplitude is controlled with the duty cycle of a high-frequency signal.
 We used voice coil actuators, therefore they behave like low-pass filters, which stabilizes this high-frequency signal, hence reducing the amplitude of the actuator's movement.
-Our prototypes used \SI{16}{\mega\hertz} controllers with 8 bits timers, which gives a \SI{62.5}{\kilo\hertz} loop with 256 levels of amplitude.
+Our prototypes used \qty{16}{\mega\hertz} controllers with 8 bits timers, which gives a \qty{62.5}{\kilo\hertz} loop with 256 levels of amplitude.
 It communicated with a host computer with a serial protocol over bluetooth.
 
 \input{figures/actuatorcircuit.tex}
@@ -140,12 +141,12 @@ At the time, we assumed that complementing this feedback with haptic feedback wo
 \input{figures/dwellpointing.tex}
 
 The cursor has no color and gives no tactile feedback when it is not over a target.
-When it hovers a target, it is colored and all the four actuators vibrate at \SI{50}{\hertz}.
-After \SI{1}{\ms} over the button, a ring is drawn around the cursor, and all the four actuators vibrate at \SI{250}{\hertz} during \SI{150}{\ms}, then they stop for another \SI{150}{\ms}.
+When it hovers a target, it is colored and all the four actuators vibrate at \qty{50}{\hertz}.
+After \qty{1}{\ms} over the button, a ring is drawn around the cursor, and all the four actuators vibrate at \qty{250}{\hertz} during \qty{150}{\ms}, then they stop for another \qty{150}{\ms}.
 It warns the users that the animation is about to start.
-The animation vibrates the four actuators in a clockwise sequence at \SI{250}{\hertz} during \SI{200}{\ms}, followed by a \SI{175}{\ms} pause.
-After this animation all the actuators vibrate at \SI{250}{\hertz} for \SI{200}{\ms}, then the target is activated.
-Therefore, overall users had to hover a button during \SI{3}{\s} to activate it.
+The animation vibrates the four actuators in a clockwise sequence at \qty{250}{\hertz} during \qty{200}{\ms}, followed by a \qty{175}{\ms} pause.
+After this animation all the actuators vibrate at \qty{250}{\hertz} for \qty{200}{\ms}, then the target is activated.
+Therefore, overall users had to hover a button during \qty{3}{\s} to activate it.
 
 We ran an experiment with the idea to measure an increase of performance in a tactile condition over a visual condition.
 This was motivated by the fact that when we tried the buttons, tactile feedback seemed to bring some benefit.
@@ -173,10 +174,10 @@ The Kinect API computed a skeleton of the user.
 The steering angle was computed as a function of the relative position of the hands of the skeleton, capped between \ang{-90} and \ang{90}.
 Braking was mapped to \qtyrange{15}{30}{cm} between the hands and the chest, and throttle to \qtyrange{30}{50}{cm}.
 The spatial location of vibrations indicated the steering angle as shown on \reffig{fig:cargame}.
-The speed of the car was mapped to a modulation of the \SI{250}{\hertz} signal with a low-frequency signal between \SI{1}{\hertz} and \SI{25}{\hertz} with \SI{50}{\ms} durations. 
+The speed of the car was mapped to a modulation of the \qty{250}{\hertz} signal with a low-frequency signal between \qty{1}{\hertz} and \qty{25}{\hertz} with \qty{50}{\ms} durations. 
 This modulation makes users feel like if equidistant strips covered the road.
 %the faster the car goes, the frequent are the vibrations.
-In addition to this, the bottom actuator vibrated for \SI{200}{\ms} at \SI{100}{\hertz} when the car was braking.
+In addition to this, the bottom actuator vibrated for \qty{200}{\ms} at \qty{100}{\hertz} when the car was braking.
 
 \input{figures/cargame.tex}
 
@@ -204,7 +205,7 @@ We made the hypotheses that $H_1$ tactile feedback would increase the sensation
 40 participants took part of the experiment (mean age 24.7 years).
 They were instructed to drive as many laps as possible in 10 minutes.
 They were advised to avoid going out of the road since it notably reduces the speed.
-They stood \SI{2.5}{\meter} away from the Kinect during the game.
+They stood \qty{2.5}{\meter} away from the Kinect during the game.
 %Before the experiment the height of the Kinect was calibrated to make sure the participants' arms were in the sensor’s range.
 The game was displayed on a 17” laptop screen, with a $1600 \times 900$ resolution and the same sound volume was used for all subjects.
 We opted for a between subject design: half of the participants received tactile feedback (\Tactile), and the other half did not (\NoTactile).
@@ -280,10 +281,10 @@ Whether if it was relevant or not, without haptic sensations the virtual objects
 Restoring haptic feedback on dwell buttons was not sufficient to make them efficient.
 My hypothesis was that restoring tactile feedback would help users press them.
 I anticipated that this would increase selection performance.
-However, with the way I emplemented these buttons activation required at least \SI{3}{\s}.
+However, with the way I emplemented these buttons activation required at least \qty{3}{\s}.
 This is very long indeed.
 Should tactile feedback help selecting buttons faster, the effect size could not be sufficient to make a significant improvement.
-The average selection time in the \NoTactile condition was \SI{3.6}{\s}, and it was \SI{3.5}{\s} in the \Tactile.
+The average selection time in the \NoTactile condition was \qty{3.6}{\s}, and it was \qty{3.5}{\s} in the \Tactile.
 This is a first clue that improving haptic feedback is not sufficient.
 It requires an efficient input method as well, otherwise the eventual benefits of haptics do not compensate the inefficiency of input.
 In \refsec{sec:hapticparadigms} I describe a new paradigm for 3D gestural interaction with haptic feedback, and the systematic design of both the input and output vocabulary to enable direct manipulation on a tactile display.
@@ -560,9 +561,9 @@ People perceive and act on their environment thanks to their sensorimotor loop.
 Therefore our perception depends both on our sensorial and motor capabilities.
 They have limitations that influence the way we perceive our environment.
 There are \emph{type} limitations, for example we can perceive light waves but not magnetic fields.
-There are \emph{range} limitations, for example we hear a sound wave of \SI{400}{\hertz}, but not \SI{400}{\kilo\hertz}.
-We can reach objects \SI{50}{\cm} away from us, but not \SI{50}{m}.
-There is also a \emph{precision} limitation, for example we can distinguish colors of wavelength \SI{100}{\nano\metre} apart, but not \SI{1}{\nano\metre} apart.
+There are \emph{range} limitations, for example we hear a sound wave of \qty{400}{\hertz}, but not \qty{400}{\kilo\hertz}.
+We can reach objects \qty{50}{\cm} away from us, but not \qty{50}{m}.
+There is also a \emph{precision} limitation, for example we can distinguish colors of wavelength \qty{100}{\nano\metre} apart, but not \qty{1}{\nano\metre} apart.
 Precision is actually a range in difference, therefore according to Weber's law the threshold is proportional to the base stimulus value~\cite{fechner60}.
 Finally, there are \emph{processing} limitations, related to our cognitive abilities to interpret signals resulting from our perceptions and actions.
 Typically, illusions are distortions of what we could consider as ground truth.
@@ -726,6 +727,8 @@ The second contribution investigates the contributionn of haptics on the embodim
 \subsection{Haptic interaction paradigms}
 \label{sec:hapticparadigms}
 
+Device described in \refsec{sec:limits}.
+
 \subsubsection{Summon interactions}
 \label{sec:summon}
 ~\cite{gupta17}