diff --git a/docs/figs/control_architecture_cartesian_frame.pdf b/docs/figs/control_architecture_cartesian_frame.pdf new file mode 100644 index 0000000..fab20ff Binary files /dev/null and b/docs/figs/control_architecture_cartesian_frame.pdf differ diff --git a/docs/figs/control_architecture_cartesian_frame.png b/docs/figs/control_architecture_cartesian_frame.png new file mode 100644 index 0000000..aec78cc Binary files /dev/null and b/docs/figs/control_architecture_cartesian_frame.png differ diff --git a/docs/figs/control_architecture_cascade.pdf b/docs/figs/control_architecture_cascade.pdf new file mode 100644 index 0000000..92ce7fc Binary files /dev/null and b/docs/figs/control_architecture_cascade.pdf differ diff --git a/docs/figs/control_architecture_cascade.png b/docs/figs/control_architecture_cascade.png new file mode 100644 index 0000000..313b8b8 Binary files /dev/null and b/docs/figs/control_architecture_cascade.png differ diff --git a/docs/figs/control_architecture_cascade_L.pdf b/docs/figs/control_architecture_cascade_L.pdf new file mode 100644 index 0000000..9e87852 Binary files /dev/null and b/docs/figs/control_architecture_cascade_L.pdf differ diff --git a/docs/figs/control_architecture_cascade_L.png b/docs/figs/control_architecture_cascade_L.png new file mode 100644 index 0000000..dd128c8 Binary files /dev/null and b/docs/figs/control_architecture_cascade_L.png differ diff --git a/docs/figs/control_architecture_cascade_X.pdf b/docs/figs/control_architecture_cascade_X.pdf new file mode 100644 index 0000000..b6f99d4 Binary files /dev/null and b/docs/figs/control_architecture_cascade_X.pdf differ diff --git a/docs/figs/control_architecture_cascade_X.png b/docs/figs/control_architecture_cascade_X.png new file mode 100644 index 0000000..e6186df Binary files /dev/null and b/docs/figs/control_architecture_cascade_X.png differ diff --git a/docs/figs/control_architecture_cascade_control.pdf b/docs/figs/control_architecture_cascade_control.pdf new file mode 100644 index 0000000..cc792e7 Binary files /dev/null and b/docs/figs/control_architecture_cascade_control.pdf differ diff --git a/docs/figs/control_architecture_cascade_control.png b/docs/figs/control_architecture_cascade_control.png new file mode 100644 index 0000000..0b9ad62 Binary files /dev/null and b/docs/figs/control_architecture_cascade_control.png differ diff --git a/docs/figs/control_architecture_dvf.pdf b/docs/figs/control_architecture_dvf.pdf new file mode 100644 index 0000000..fa06e7a Binary files /dev/null and b/docs/figs/control_architecture_dvf.pdf differ diff --git a/docs/figs/control_architecture_dvf.png b/docs/figs/control_architecture_dvf.png new file mode 100644 index 0000000..e72ae08 Binary files /dev/null and b/docs/figs/control_architecture_dvf.png differ diff --git a/docs/figs/control_architecture_force.pdf b/docs/figs/control_architecture_force.pdf new file mode 100644 index 0000000..b428dc7 Binary files /dev/null and b/docs/figs/control_architecture_force.pdf differ diff --git a/docs/figs/control_architecture_force.png b/docs/figs/control_architecture_force.png new file mode 100644 index 0000000..b8a1fab Binary files /dev/null and b/docs/figs/control_architecture_force.png differ diff --git a/docs/figs/control_architecture_hac_iff_L.pdf b/docs/figs/control_architecture_hac_iff_L.pdf new file mode 100644 index 0000000..d3777a6 Binary files /dev/null and b/docs/figs/control_architecture_hac_iff_L.pdf differ diff --git a/docs/figs/control_architecture_hac_iff_L.png b/docs/figs/control_architecture_hac_iff_L.png new file mode 100644 index 0000000..30eee99 Binary files /dev/null and b/docs/figs/control_architecture_hac_iff_L.png differ diff --git a/docs/figs/control_architecture_hac_iff_X.pdf b/docs/figs/control_architecture_hac_iff_X.pdf new file mode 100644 index 0000000..0473c26 Binary files /dev/null and b/docs/figs/control_architecture_hac_iff_X.pdf differ diff --git a/docs/figs/control_architecture_hac_iff_X.png b/docs/figs/control_architecture_hac_iff_X.png new file mode 100644 index 0000000..aeab61f Binary files /dev/null and b/docs/figs/control_architecture_hac_iff_X.png differ diff --git a/docs/figs/control_architecture_hac_lac.pdf b/docs/figs/control_architecture_hac_lac.pdf new file mode 100644 index 0000000..4faae8b Binary files /dev/null and b/docs/figs/control_architecture_hac_lac.pdf differ diff --git a/docs/figs/control_architecture_hac_lac.png b/docs/figs/control_architecture_hac_lac.png new file mode 100644 index 0000000..005b9ef Binary files /dev/null and b/docs/figs/control_architecture_hac_lac.png differ diff --git a/docs/figs/control_architecture_hac_lac_one_input.pdf b/docs/figs/control_architecture_hac_lac_one_input.pdf new file mode 100644 index 0000000..fbc9b1f Binary files /dev/null and b/docs/figs/control_architecture_hac_lac_one_input.pdf differ diff --git a/docs/figs/control_architecture_hac_lac_one_input.png b/docs/figs/control_architecture_hac_lac_one_input.png new file mode 100644 index 0000000..39948f0 Binary files /dev/null and b/docs/figs/control_architecture_hac_lac_one_input.png differ diff --git a/docs/figs/control_architecture_iff.pdf b/docs/figs/control_architecture_iff.pdf new file mode 100644 index 0000000..fded987 Binary files /dev/null and b/docs/figs/control_architecture_iff.pdf differ diff --git a/docs/figs/control_architecture_iff.png b/docs/figs/control_architecture_iff.png new file mode 100644 index 0000000..926e674 Binary files /dev/null and b/docs/figs/control_architecture_iff.png differ diff --git a/docs/figs/control_architecture_leg_frame.pdf b/docs/figs/control_architecture_leg_frame.pdf new file mode 100644 index 0000000..3b55132 Binary files /dev/null and b/docs/figs/control_architecture_leg_frame.pdf differ diff --git a/docs/figs/control_architecture_leg_frame.png b/docs/figs/control_architecture_leg_frame.png new file mode 100644 index 0000000..9540ebd Binary files /dev/null and b/docs/figs/control_architecture_leg_frame.png differ diff --git a/docs/figs/control_architecture_plant.pdf b/docs/figs/control_architecture_plant.pdf new file mode 100644 index 0000000..026fa7a Binary files /dev/null and b/docs/figs/control_architecture_plant.pdf differ diff --git a/docs/figs/control_architecture_plant.png b/docs/figs/control_architecture_plant.png new file mode 100644 index 0000000..07f90a1 Binary files /dev/null and b/docs/figs/control_architecture_plant.png differ diff --git a/docs/figs/control_architecture_pos_error.pdf b/docs/figs/control_architecture_pos_error.pdf new file mode 100644 index 0000000..29d2e69 Binary files /dev/null and b/docs/figs/control_architecture_pos_error.pdf differ diff --git a/docs/figs/control_architecture_pos_error.png b/docs/figs/control_architecture_pos_error.png new file mode 100644 index 0000000..cff44d5 Binary files /dev/null and b/docs/figs/control_architecture_pos_error.png differ diff --git a/org/control.org b/org/control.org new file mode 100644 index 0000000..d51c0cf --- /dev/null +++ b/org/control.org @@ -0,0 +1,697 @@ +#+TITLE: Control of the Nano-Active-Stabilization-System +:DRAWER: +#+STARTUP: overview + +#+LANGUAGE: en +#+EMAIL: dehaeze.thomas@gmail.com +#+AUTHOR: Dehaeze Thomas + +#+HTML_LINK_HOME: ./index.html +#+HTML_LINK_UP: ./index.html + +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: + +#+HTML_MATHJAX: align: center tagside: right font: TeX + +#+PROPERTY: header-args:matlab :session *MATLAB* +#+PROPERTY: header-args:matlab+ :comments org +#+PROPERTY: header-args:matlab+ :results none +#+PROPERTY: header-args:matlab+ :exports both +#+PROPERTY: header-args:matlab+ :eval no-export +#+PROPERTY: header-args:matlab+ :output-dir figs +#+PROPERTY: header-args:matlab+ :tangle no +#+PROPERTY: header-args:matlab+ :mkdirp yes + +#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/thesis/latex/org/}{config.tex}") +#+PROPERTY: header-args:latex+ :imagemagick t :fit yes +#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150 +#+PROPERTY: header-args:latex+ :imoutoptions -quality 100 +#+PROPERTY: header-args:latex+ :results file raw replace +#+PROPERTY: header-args:latex+ :buffer no +#+PROPERTY: header-args:latex+ :eval no-export +#+PROPERTY: header-args:latex+ :exports results +#+PROPERTY: header-args:latex+ :mkdirp yes +#+PROPERTY: header-args:latex+ :output-dir figs +#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png") +:END: + +* Introduction :ignore: +The system consist of the following inputs and outputs (Figure [[fig:control_architecture_plant]]): +- $\bm{\tau}$: Forces applied in each leg +- $\bm{\tau}_m$: Force sensor located in each leg +- $\bm{\mathcal{X}}$: Measurement of the payload position with respect to the granite +- $d\bm{\mathcal{L}}$: Measurement of the (small) relative motion of each leg + +#+begin_src latex :file control_architecture_plant.pdf + \begin{tikzpicture} + % Blocs + \node[block={3.0cm}{3.0cm}] (P) {Plant}; + \coordinate[] (inputF) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$); + \coordinate[] (outputX) at ($(P.south east)!0.5!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.2!(P.north east)$); + + \draw[->] (outputF) -- ++(1, 0) node[above left]{$\bm{\tau}_m$}; + \draw[->] (outputL) -- ++(1, 0) node[above left]{$d\bm{\mathcal{L}}$}; + \draw[->] (outputX) -- ++(1, 0) node[above left]{$\bm{\mathcal{X}}$}; + + \draw[<-] (inputF) -- ++(-1, 0) node[above right]{$\bm{\tau}$}; + \end{tikzpicture} +#+end_src + +#+name: fig:control_architecture_plant +#+caption: Block diagram with the inputs and outputs of the system +#+RESULTS: +[[file:figs/control_architecture_plant.png]] + +In order to position the Sample with respect to the granite, we must use the measurement $\bm{\mathcal{X}}$ in the control loop. +The wanted position of the sample with respect to the granite is represented by $\bm{r}_\mathcal{X}$. +From $\bm{r}_\mathcal{X}$ and $\bm{\mathcal{X}}$, we can compute the required small change of pose of the nano-hexapod's top platform expressed in the frame of the nano-hexapod's base as shown in Figure [[fig:control_architecture_pos_error]]. + +This can we considered as: +- the position error $\bm{\epsilon}_{\mathcal{X}_n}$ expressed in a frame attach to the base of the nano-hexapod +- the wanted (small) pose displacement $\bm{r}_{d\mathcal{X}_n}$ of the nano-hexapod mobile platform with respect to its base + +#+begin_src latex :file control_architecture_pos_error.pdf + \begin{tikzpicture} + \node[block, align=center] (Ex) {Compute\\Pos. Error}; + \draw[<-] (Ex.west) -- ++(-1, 0)node[above right]{$\bm{r}_{\mathcal{X}}$}; + \draw[<-] (Ex.south) -- ++(0, -1)node[above right]{$\bm{\mathcal{X}}$}; + \draw[->] (Ex.east) -- ++(1, 0)node[above left ]{$\bm{r}_{\mathcal{X}_n}$}; + \end{tikzpicture} +#+end_src + +#+name: fig:control_architecture_pos_error +#+caption: Block diagram corresponding to the computation of the position error in the frame of the nano-hexapod +#+RESULTS: +[[file:figs/control_architecture_pos_error.png]] + +In this document, we see how the different outputs of the system can be used to control of position $\bm{\mathcal{X}}$. + +* Control Configuration - Introduction +In this section, we discuss the control configuration for the NASS. + +From cite:skogestad07_multiv_feedb_contr: +#+begin_quote +We define the *control configuration* to be the restrictions imposed on the overall controller $K$ by decomposing it into a set of *local controllers* with predetermined links and with a possibly predetermined design sequence where subcontrollers are designed locally. + +Some elements used to build up a specific control configuration are: +- *Cascade controllers*. The output from one controller is the input to another +- *Decentralized controllers*. The control system consists of independent feedback controllers which interconnect a subset of the output measurements with a subset of the manipulated inputs. + These subsets should not be used by any other controller +- *Feedforward elements*. Link measured disturbances and manipulated inputs +- *Decoupling elements*. Link one set of manipulated inputs with another set of manipulated inputs. + They are used to improve the performance of decentralized control systems. +#+end_quote + +Decoupling elements will be used to convert quantities from the joint space to the task space and vice-versa. + +Decentralized controllers will be largely used both for Tracking control (Section [[sec:tracking_control]]) and for Active Damping techniques (Section [[sec:active_damping]]) + +Combining both can be done in an HAC-LAC topology presented in Section [[sec:hac_lac]]. + +The use of decentralized controllers is proposed in Section [[sec:cascade_control]]. + +* Tracking Control - Basic Architectures +<> +** Introduction :ignore: +In this section, we suppose that we want to track some reference position $\bm{r}_{\mathcal{X}_n}$ corresponding to the pose of the nano-hexapod's mobile platform with respect to its fixed base. + +To do so, we have to the use the leg's length measurement $d\bm{\mathcal{L}}$. + +However, thanks to the forward and inverse kinematics, the controller can either be designed in the task space or in the joint space. + +These to configuration are described in the next two sections. + +** Control in the frame of the Legs +<> + +From the wanted small change in pose of the nano-hexapod's mobile platform $\bm{r}_{d\mathcal{X}_n}$, we can use the Inverse Kinematics of the nano-hexapod to compute the corresponding small change of the leg length of the nano-hexapod $\bm{r}_{d\mathcal{L}}$. +Then, this is subtracted by the measurement of the leg relative displacement $d\bm{\mathcal{L}}$ to obtain to displacement error of each leg $\bm{\epsilon}_{d\mathcal{L}}$. +Finally, a diagonal (Decentralized) controller $\bm{K}_\mathcal{L}$ can be used. + +#+begin_src latex :file control_architecture_leg_frame.pdf + \begin{tikzpicture} + % Blocs + \node[block={3.0cm}{3.0cm}] (P) {Plant}; + \coordinate[] (inputF) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$); + \coordinate[] (outputX) at ($(P.south east)!0.5!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.2!(P.north east)$); + + \node[block, left= of inputF] (K) {$\bm{K}_\mathcal{L}$}; + \node[addb={+}{}{}{}{-}, left= of K] (subr) {}; + \node[block, align=center, left= of subr] (J) {Inverse\\Kinematics}; + + % Connections and labels + \draw[->] (outputF) -- ++(1, 0) node[above left]{$\bm{\tau}_m$}; + \draw[->] (outputX) -- ++(1.0, 0) node[above left]{$\bm{\mathcal{X}}$}; + \draw[->] (outputL) -- ++(1, 0) node[above left]{$d\bm{\mathcal{L}}$}; + \draw[->] ($(outputL) + (0.6, 0)$)node[branch]{} -- ++(0, -1) -| (subr.south); + \draw[->] (subr.east) -- (K.west) node[above left]{$\bm{\epsilon}_{d\mathcal{L}}$}; + \draw[->] (K.east) -- (inputF) node[above left]{$\bm{\tau}$}; + + \draw[->] (J.east) -- (subr.west) node[above left]{$\bm{r}_{d\mathcal{L}}$}; + \draw[<-] (J.west)node[above left]{$\bm{r}_{\mathcal{X}_n}$} -- ++(-1, 0); + \end{tikzpicture} +#+end_src + +#+name: fig:control_architecture_leg_frame +#+caption: Control in the frame of the legs +#+RESULTS: +[[file:figs/control_architecture_leg_frame.png]] + +** Control in the Cartesian frame +<> + +From the relative displacement of each leg $d\bm{\mathcal{L}}$, the pose of the nano-hexapod's mobile platform $\bm{\mathcal{X}_n}$ is estimated. +It is then subtracted from reference pose of the nano-hexapod $\bm{r}_{\mathcal{X}_n}$ to obtain the pose error $\bm{\epsilon}_{\mathcal{X}_n}$. +A diagonal controller $\bm{K}_\mathcal{X}$ is used to generate forces and torques applied on the payload in a frame attached to the nano-hexapod's base. +These forces are then converted to forces applied in each of the nano-hexapod's actuators by the use of the Jacobian $\bm{J}^{-T}$. + +#+begin_src latex :file control_architecture_cartesian_frame.pdf + \begin{tikzpicture} + % Blocs + \node[block={3.0cm}{3.0cm}] (P) {Plant}; + \coordinate[] (inputF) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$); + \coordinate[] (outputX) at ($(P.south east)!0.5!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.2!(P.north east)$); + + \node[block, align=center, below=0.4 of P] (Forkin) {Forward\\Kinematics}; + + \node[block, left= of inputF] (J) {$\bm{J}^{-T}$}; + \node[block, left= of J] (K) {$\bm{K}_\mathcal{X}$}; + \node[addb={+}{}{}{}{-}, left= of K] (subr) {}; + + % Connections and labels + \draw[->] (outputF) -- ++(1, 0) node[above left]{$\bm{\tau}_m$}; + \draw[->] (outputX) -- ++(1, 0) node[above left]{$\bm{\mathcal{X}}$}; + \draw[->] (outputL) -- ++(1, 0) node[above left]{$d\bm{\mathcal{L}}$}; + \draw[->] ($(outputL) + (0.6, 0)$)node[branch]{} |- (Forkin.east); + \draw[->] (Forkin.west) -| (subr.south) node[below right]{$\bm{\mathcal{X}_n}$}; + + \draw[->] (subr.east) -- (K.west) node[above left]{$\bm{\epsilon}_{\mathcal{X}_n}$}; + \draw[->] (K.east) -- (J.west) node[above left]{$\bm{\mathcal{F}}$}; + \draw[->] (J.east) -- (inputF.west) node[above left]{$\bm{\tau}$}; + \draw[<-] (subr.west)node[above left]{$\bm{r}_{\mathcal{X}_n}$} -- ++(-1, 0); + \end{tikzpicture} +#+end_src + +#+name: fig:control_architecture_cartesian_frame +#+caption: Control in the cartesian Frame (rotating frame attached to the nano-hexapod's base) +#+RESULTS: +[[file:figs/control_architecture_cartesian_frame.png]] + +* Active Damping Architecture - Collocated Control +<> +** Introduction :ignore: +From cite:preumont18_vibrat_contr_activ_struc_fourt_edition: +#+begin_quote +Active damping is very effective in reducing the settling time of transient disturbances and the effect of steady state disturbances near the resonance frequencies of the system; however, away from the resonances, the active damping is completely ineffective and leaves the closed-loop response essentially unchanged. +Such low-gain controllers are often called Low Authority Controllers (LAC), because they modify the poles of the system only slightly. +#+end_quote + +Two very well known active damping techniques are *Integral Force Feedback* and *Direct Velocity Feedback*. + +These two active damping techniques are collocated control techniques. + +** Integral Force Feedback +<> + +In this active damping technique, the force sensors in each leg is used. + +The controller $\bm{K}_\text{IFF}$ is a diagonal matrix, each of its diagonal element consists of: +- an pure integrator +- a gain $g$ that can be tuned to achieve a maximum damping + +\begin{equation} + \bm{K}_\text{IFF}(s) = \frac{g}{s} \bm{I}_{6} +\end{equation} + +A lead-lag can also be used instead of a pure integrator. + +#+begin_src latex :file control_architecture_iff.pdf + \begin{tikzpicture} + % Blocs + \node[block={3.0cm}{3.0cm}] (P) {Plant}; + \coordinate[] (inputF) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$); + \coordinate[] (outputX) at ($(P.south east)!0.5!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.2!(P.north east)$); + + \node[block, above=0.4 of P] (Kiff) {$\bm{K}_\text{IFF}$}; + \node[addb={+}{}{-}{}{}, left= of inputF] (addF) {}; + + % Connections and labels + \draw[->] (outputF) -- ++(1, 0) node[below left]{$\bm{\tau}_m$}; + \draw[->] (outputL) -- ++(1, 0) node[above left]{$d\bm{\mathcal{L}}$}; + \draw[->] (outputX) -- ++(1, 0) node[above left]{$\bm{\mathcal{X}}$}; + + \draw[->] ($(outputF) + (0.6, 0)$)node[branch]{} |- (Kiff.east); + \draw[->] (Kiff.west) -| (addF.north); + \draw[->] (addF.east) -- (inputF) node[above left]{$\bm{\tau}$}; + \draw[<-] (addF.west) -- ++(-1, 0) node[above right]{$\bm{\tau}^\prime$}; + \end{tikzpicture} +#+end_src + +#+name: fig:control_architecture_iff +#+caption: Integral Force Feedback +#+RESULTS: +[[file:figs/control_architecture_iff.png]] + +** Direct Relative Velocity Feedback +<> + +The controller $\bm{K}_\text{DVF}$ is a diagonal matrix. +Each diagonal element consists of: +- a derivative action up to some frequency $\omega_0$ +- a gain $g$ that can be tuned to achieve a maximum damping + +\begin{equation} + \bm{K}_\text{DVF}(s) = \frac{g s}{\omega_0 + s} \bm{I}_{6} +\end{equation} + +#+begin_src latex :file control_architecture_dvf.pdf + \begin{tikzpicture} + % Blocs + \node[block={3.0cm}{3.0cm}] (P) {Plant}; + \coordinate[] (inputF) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$); + \coordinate[] (outputX) at ($(P.south east)!0.5!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.2!(P.north east)$); + + \node[block, below=0.4 of P] (Kdvf) {$\bm{K}_\text{DVF}$}; + \node[addb={+}{}{}{}{-}, left= of inputF] (addF) {}; + + % Connections and labels + \draw[->] (outputF) -- ++(1, 0) node[above left]{$\bm{\tau}_m$}; + \draw[->] (outputL) -- ++(1, 0) node[above left]{$d\bm{\mathcal{L}}$}; + \draw[->] (outputX) -- ++(1, 0) node[above left]{$\bm{\mathcal{X}}$}; + + \draw[->] ($(outputL) + (0.6, 0)$)node[branch]{} |- (Kdvf.east); + \draw[->] (Kdvf.west) -| (addF.south); + \draw[->] (addF.east) -- (inputF) node[above left]{$\bm{\tau}$}; + \draw[<-] (addF.west) -- ++(-1, 0) node[above right]{$\bm{\tau}^\prime$}; + \end{tikzpicture} +#+end_src + +#+name: fig:control_architecture_dvf +#+caption: Direct Velocity Feedback +#+RESULTS: +[[file:figs/control_architecture_dvf.png]] + +* HAC-LAC Architectures +<> +** Introduction :ignore: +Here we can combine Active Damping Techniques (Low authority control) with a tracking controller (high authority control). +Usually, the low authority controller is designed first, and the high authority controller is designed based on the damped plant. + +From cite:preumont18_vibrat_contr_activ_struc_fourt_edition: +#+begin_quote +The HAC/LAC approach consist of combining the two approached in a dual-loop control as shown in Figure [[fig:control_architecture_hac_lac]]. +The inner loop uses a set of collocated actuator/sensor pairs for decentralized active damping with guaranteed stability ; the outer loop consists of a non-collocated HAC based on a model of the actively damped structure. +This approach has the following advantages: +- The active damping extends outside the bandwidth of the HAC and reduces the settling time of the modes which are outsite the bandwidth +- The active damping makes it easier to gain-stabilize the modes outside the bandwidth of the output loop (improved gain margin) +- The larger damping of the modes within the controller bandwidth makes them more robust to the parmetric uncertainty (improved phase margin) +#+end_quote + +#+begin_src latex :file control_architecture_hac_lac.pdf + \begin{tikzpicture} + % Blocs + \node[block={3.0cm}{3.0cm}] (P) {Plant}; + \coordinate[] (inputH) at ($(P.south west)!0.3!(P.north west)$); + \coordinate[] (inputL) at ($(P.south west)!0.7!(P.north west)$); + \coordinate[] (outputH) at ($(P.south east)!0.3!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.7!(P.north east)$); + + \node[block, above=0.6 of P] (Klac) {$\bm{K}_\text{LAC}$}; + \node[block, left= of inputH] (Khac) {$\bm{K}_\text{HAC}$}; + \node[addb={+}{}{}{}{-}, left= of Khac] (subr) {}; + + % Connections and labels + \draw[->] (outputL) -- ++(1, 0); + \draw[->] ($(outputL) + (0.6, 0)$)node[branch]{} node[below]{$x^\prime$} |- (Klac.east); + \draw[->] (Klac.west) -| ($(inputL) + (-0.6, 0)$) -- (inputL) node[above left]{$u^\prime$}; + + \draw[<-] (subr.west)node[above left]{$r$} -- ++(-1, 0); + \draw[->] (outputH) -- ++(1, 0); + \draw[->] ($(outputH) + (0.6, 0)$)node[branch]{} node[above]{$x$} -- ++(0, -1.5) -| (subr.south); + \draw[->] (subr.east) -- (Khac.west) node[above left]{$\epsilon$}; + \draw[->] (Khac.east) -- (inputH) node[above left]{$u$}; + \end{tikzpicture} +#+end_src + +#+name: fig:control_architecture_hac_lac +#+caption: HAC-LAC Control Architecture +#+RESULTS: +[[file:figs/control_architecture_hac_lac.png]] + +If there is only one input to the system, the HAC-LAC topology can be represented as depicted in Figure [[fig:control_architecture_hac_lac_one_input]]. +Usually, the Low Authority Controller is first design, and then the High Authority Controller is designed based on the damped plant. + +#+begin_src latex :file control_architecture_hac_lac_one_input.pdf + \begin{tikzpicture} + % Blocs + \node[block={3.0cm}{3.0cm}] (P) {Plant}; + \coordinate[] (input) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputH) at ($(P.south east)!0.2!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.8!(P.north east)$); + + \node[block, above=0.6 of P] (Klac) {$\bm{K}_\text{LAC}$}; + \node[addb, left= of input] (addF) {}; + \node[block, left= of addF] (Khac) {$\bm{K}_\text{HAC}$}; + \node[addb={+}{}{}{}{-}, left= of Khac] (subr) {}; + + % Connections and labels + \draw[->] (outputL) -- ++(0.6, 0) coordinate(eastlac) |- (Klac.east); + \node[above right] at (outputL){$x^\prime$}; + \draw[->] (Klac.west) -| (addF.north); + \draw[->] (addF.east) -- (input) node[above left]{$u^\prime$}; + + \draw[<-] (subr.west)node[above left]{$r$} -- ++(-1, 0); + \draw[->] (outputH) -- ++(1.8, 0); + \draw[->] ($(outputH) + (1.2, 0)$)node[branch]{} node[above]{$x$} -- ++(0, -1.5) -| (subr.south); + \draw[->] (subr.east) -- (Khac.west) node[above left]{$\epsilon$}; + \draw[->] (Khac.east) -- (addF.west) node[above left=0 and 0.2]{$u$}; + + \begin{scope}[on background layer] + \node[fit={(Klac.north-|eastlac) (addF.west|-P.south)}, fill=black!20!white, draw, dashed, inner sep=8pt] (Pi) {}; + \node[anchor={north west}] at (Pi.north west){$\text{Damped Plant}$}; + \end{scope} + \end{tikzpicture} +#+end_src + +#+name: fig:control_architecture_hac_lac_one_input +#+caption: HAC-LAC Architecture with a system having only one input +#+RESULTS: +[[file:figs/control_architecture_hac_lac_one_input.png]] + +** HAC-LAC using IFF and Tracking control in the frame of the Legs +#+begin_src latex :file control_architecture_hac_iff_L.pdf + \begin{tikzpicture} + % Blocs + \node[block={3.0cm}{3.0cm}] (P) {Plant}; + \coordinate[] (inputF) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$); + \coordinate[] (outputX) at ($(P.south east)!0.5!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.2!(P.north east)$); + + \node[block, above=0.4 of P] (Kiff) {$\bm{K}_\text{IFF}$}; + \node[addb={+}{}{-}{}{}, left= of inputF] (addF) {}; + \node[block, left= of addF] (K) {$\bm{K}_\mathcal{L}$}; + \node[addb={+}{}{}{}{-}, left= of K] (subr) {}; + \node[block, align=center, left= of subr] (J) {Inverse\\Kinematics}; + + % Connections and labels + \draw[->] (outputF) -- ++(1, 0) node[below left]{$\bm{\tau}_m$}; + \draw[->] ($(outputF) + (0.6, 0)$)node[branch]{} |- (Kiff.east); + \draw[->] (Kiff.west) -| (addF.north); + \draw[->] (addF.east) -- (inputF) node[above left]{$\bm{\tau}$}; + + \draw[->] (outputL) -- ++(1, 0) node[above left]{$d\bm{\mathcal{L}}$}; + \draw[->] ($(outputL) + (0.6, 0)$)node[branch]{} -- ++(0, -1) -| (subr.south); + \draw[->] (subr.east) -- (K.west) node[above left]{$\bm{\epsilon}_{d\mathcal{L}}$}; + \draw[->] (K.east) -- (addF.west) node[above left]{$\bm{\tau}^\prime$}; + + \draw[->] (outputX) -- ++(1, 0) node[above left]{$\bm{\mathcal{X}}$}; + + \draw[->] (J.east) -- (subr.west) node[above left]{$\bm{r}_{d\mathcal{L}}$}; + \draw[<-] (J.west)node[above left]{$\bm{r}_{\mathcal{X}_n}$} -- ++(-1, 0); + \end{tikzpicture} +#+end_src + +#+name: fig:control_architecture_hac_iff_L +#+caption: IFF + Control in the frame of the legs +#+RESULTS: +[[file:figs/control_architecture_hac_iff_L.png]] + +** HAC-LAC using IFF and Tracking control in the Cartesian frame +#+begin_src latex :file control_architecture_hac_iff_X.pdf + \begin{tikzpicture} + % Blocs + \node[block={3.0cm}{3.0cm}] (P) {Plant}; + \coordinate[] (inputF) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$); + \coordinate[] (outputX) at ($(P.south east)!0.5!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.2!(P.north east)$); + + \node[block, above=0.4 of P] (Kiff) {$\bm{K}_\text{IFF}$}; + \node[addb={+}{}{-}{}{}, left= of inputF] (addF) {}; + \node[block, left= of addF] (J) {$\bm{J}^{-T}$}; + \node[block, left= of J] (K) {$\bm{K}_\mathcal{X}$}; + \node[addb={+}{}{}{}{-}, left= of K] (subr) {}; + + \node[block, align=center, below=0.4 of P] (Forkin) {Forward\\Kinematics}; + + % Connections and labels + \draw[->] (outputF) -- ++(1, 0) node[below left]{$\bm{\tau}_m$}; + \draw[->] ($(outputF) + (0.6, 0)$)node[branch]{} |- (Kiff.east); + \draw[->] (Kiff.west) -| (addF.north); + \draw[->] (addF.east) -- (inputF) node[above left]{$\bm{\tau}$}; + + \draw[->] (outputL) -- ++(1, 0) node[above left]{$d\bm{\mathcal{L}}$}; + \draw[->] ($(outputL) + (0.6, 0)$)node[branch]{} |- (Forkin.east); + \draw[->] (Forkin.west) -| (subr.south) node[below right]{$\bm{\mathcal{X}_n}$}; + + \draw[->] (outputX) -- ++(1, 0) node[above left]{$\bm{\mathcal{X}}$}; + + \draw[<-] (subr.west)node[above left]{$\bm{r}_{\mathcal{X}_n}$} -- ++(-1, 0); + \draw[->] (subr.east) -- (K.west) node[above left]{$\bm{\epsilon}_{\mathcal{X}_n}$}; + \draw[->] (K.east) -- (J.west) node[above left]{$\bm{\mathcal{F}}$}; + \draw[->] (J.east) -- (addF.west) node[above left]{$\bm{\tau}^\prime$}; + \end{tikzpicture} +#+end_src + +#+name: fig:control_architecture_hac_iff_X +#+caption: IFF + Control in the cartesian frame +#+RESULTS: +[[file:figs/control_architecture_hac_iff_X.png]] + +* Cascade Architectures +<> +** Introduction :ignore: +The principle of Cascade control is shown in Figure [[fig:control_architecture_cascade_control]] and explained as follow: +#+begin_quote +To follow *two objectives* with different properties in one control system, usually a *hierarchy* of two feedback loops is used in practice. +This kind of control topology is called *cascade control*, which is used when there are *several measurements and one prime control variable*. +Cascade control is implemented by *nesting* the control loops, as shown in Figure [[fig:control_architecture_cascade_control]]. +The output control loop is called the *primary loop*, while the inner loop is called the secondary loop and is used to fulfill a secondary objective in the closed-loop system. -- cite:taghirad13_paral +#+end_quote + +#+begin_src latex :file control_architecture_cascade_control.pdf + \begin{tikzpicture} + % Blocs + \node[block={3.0cm}{3.0cm}] (P) {Plant}; + \coordinate[] (input) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputi) at ($(P.south east)!0.3!(P.north east)$); + \coordinate[] (outputo) at ($(P.south east)!0.7!(P.north east)$); + + \node[block, left= of input] (Ki) {$K_s$}; + \node[addb={+}{}{}{}{-}, left= of Ki] (subi) {}; + \node[block, left= of subi] (Ko) {$K_p$}; + \node[addb={+}{}{}{}{-}, left= of Ko] (subo) {}; + + \node[above=0 of Ko, align=center] {Primary\\Controller}; + \node[above=0 of Ki, align=center] {Secondary\\Controller}; + + % Connections and labels + \draw[->] (outputi) -- ++(1.0, 0); + \draw[->] ($(outputi) + (0.6, 0)$)node[branch](easti){} node[above]{$y_s$} -- ++(0, -1.3)coordinate(southi) -| (subi.south); + + \draw[->] (outputo) -- ++(1.8, 0); + \draw[->] ($(outputo) + (1.4, 0)$)node[branch](easto){} node[above]{$y_p$} -- ++(0, -3.1)coordinate(southo) -| (subo.south); + + \draw[<-] (subo.west) node[above left=0 and 0.2]{$r_p$} -- ++(-1, 0); + \draw[->] (subo.east) -- (Ko.west) node[above left]{$\epsilon_p$}; + \draw[->] (Ko.east) -- (subi.west) node[above left=0 and 0.2]{$r_s$}; + \draw[->] (subi.east) -- (Ki.west) node[above left]{$\epsilon_s$}; + \draw[->] (Ki.east) -- (input) node[above left]{$u$}; + + \begin{scope}[on background layer] + \node[fit={(P.north-|easti) (subi.west|-southi)}, inner sep=8pt, opacity=0] (Plin) {}; + \node[fit={(Plin.north-|easto) (subo.west|-southo)}, fill=black!20!white, draw, dashed, inner sep=8pt] (Po) {}; + \node[fit={(P.north-|easti) (subi.west|-southi)}, fill=black!40!white, draw, dashed, inner sep=8pt] (Pi) {}; + \node[anchor={north west}] at (Po.north west){$\text{Outer Loop}$}; + \node[anchor={north west}] at (Pi.north west){$\text{Inner Loop}$}; + \end{scope} + \end{tikzpicture} +#+end_src + +#+name: fig:control_architecture_cascade_control +#+caption: Cascade Control Architecture +#+RESULTS: +[[file:figs/control_architecture_cascade_control.png]] + +This control topology seems adapted for the NASS, as indeed we have more inputs than outputs + +In the NASS's case: +- The primary objective is to position the sample with respect to the granite, thus the outer loop (and primary controller) should corresponds to a motion control loop + +The inner loop can be composed of the system controlled with the HAC-LAC topology. + +** Cascade Control with HAC-LAC Inner Loop and Primary Controller in the task space +#+begin_src latex :file control_architecture_cascade_L.pdf + \begin{tikzpicture} + % Blocs + \node[block={3.0cm}{3.0cm}] (P) {Plant}; + \coordinate[] (inputF) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$); + \coordinate[] (outputX) at ($(P.south east)!0.5!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.2!(P.north east)$); + + \node[block, above=0.4 of P] (Kiff) {$\bm{K}_\text{IFF}$}; + \node[addb={+}{}{-}{}{}, left= of inputF] (addF) {}; + \node[block, left= of addF] (K) {$\bm{K}_{\mathcal{L}}$}; + \node[addb={+}{}{}{}{-}, left= of K] (subr) {}; + \node[block, align=center, left= of subr] (J) {Inverse\\Kinematics}; + \node[block, left= of J] (Kx) {$\bm{K}_\mathcal{X}$}; + + \node[block, align=center, left= of Kx] (Ex) {Compute\\Pos. Error}; + + % Connections and labels + \draw[->] (outputF) -- ++(1.0, 0); + \draw[->] ($(outputF) + (0.6, 0)$)node[branch](taum){} node[below]{$\bm{\tau}_m$} |- (Kiff.east); + \draw[->] (Kiff.west) -| (addF.north); + \draw[->] (addF.east) -- (inputF) node[above left]{$\bm{\tau}$}; + + \draw[->] (outputL) -- ++(1.8, 0); + \draw[->] ($(outputL) + (1.4, 0)$)node[branch]{} node[above]{$d\bm{\mathcal{L}}$} -- ++(0, -1.2) node(Plinse){} -| (subr.south); + \draw[->] (subr.east) -- (K.west) node[above left]{$\bm{\epsilon}_{d\mathcal{L}}$}; + \draw[->] (K.east) -- (addF.west) node[above left=0 and 8pt]{$\bm{\tau}^\prime$}; + + \draw[->] (outputX) -- ++(2.6, 0); + \draw[->] ($(outputX) + (2.2, 0)$)node[branch]{} node[above]{$\bm{\mathcal{X}}$} -- ++(0, -3.0) -| (Ex.south); + + \draw[<-] (Ex.west)node[above left]{$\bm{r}_{\mathcal{X}}$} -- ++(-1, 0); + \draw[->] (Ex.east) -- (Kx.west) node[above left]{$\bm{r}_{\mathcal{X}}$}; + \draw[->] (Kx.east) -- (J.west) node[above left=0 and 6pt]{$\bm{r}_{\mathcal{X}_n}$}; + \draw[->] (J.east) -- (subr.west) node[above left]{$\bm{r}_{d\mathcal{L}}$}; + + \begin{scope}[on background layer] + \node[fit={(P.south-|addF.west) (taum.east|-Kiff.north)}, opacity=0, inner sep=10pt] (Pdamped) {}; + + \node[fit={(Pdamped.north-|J.west) (Plinse)}, fill=black!20!white, draw, dashed, inner sep=8pt] (Plin) {}; + \node[anchor={north west}] at (Plin.north west){$P_\text{lin}$}; + + \node[fit={(P.south-|addF.west) (taum.east|-Kiff.north)}, fill=black!40!white, draw, dashed, inner sep=10pt] (Pdamped) {}; + \node[anchor={north west}] at (Pdamped.north west){$P_\text{damped}$}; + \end{scope} + + \end{tikzpicture} +#+end_src + +#+name: fig:control_architecture_cascade_L +#+caption: Cascaded Control consisting of (from inner to outer loop): IFF, Linearization Loop, Tracking Control in the frame of the Legs +#+RESULTS: +[[file:figs/control_architecture_cascade_L.png]] + +** Cascade Control with HAC-LAC Inner Loop and Primary Controller in the joint space +#+begin_src latex :file control_architecture_cascade_X.pdf + \begin{tikzpicture} + % Blocs + \node[block={3.0cm}{3.0cm}] (P) {Plant}; + \coordinate[] (inputF) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$); + \coordinate[] (outputX) at ($(P.south east)!0.5!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.2!(P.north east)$); + + \node[block, above=0.4 of P] (Kiff) {$\bm{K}_\text{IFF}$}; + \node[addb={+}{}{-}{}{}, left= of inputF] (addF) {}; + \node[block, left= of addF] (K) {$\bm{K}_{\mathcal{L}}$}; + \node[addb={+}{}{}{}{-}, left= of K] (subr) {}; + \node[block, left= of subr] (Kl) {$\bm{K}_\mathcal{L}$}; + \node[block, align=center, left= of Kl] (J) {Inverse\\Kinematics}; + + \node[block, align=center, left= of J] (Ex) {Compute\\Pos. Error}; + + % Connections and labels + \draw[->] (outputF) -- ++(1.0, 0); + \draw[->] ($(outputF) + (0.6, 0)$)node[branch](taum){} node[below]{$\bm{\tau}_m$} |- (Kiff.east); + \draw[->] (Kiff.west) -| (addF.north); + \draw[->] (addF.east) -- (inputF) node[above left]{$\bm{\tau}$}; + + \draw[->] (outputL) -- ++(1.8, 0); + \draw[->] ($(outputL) + (1.4, 0)$)node[branch]{} node[above]{$d\bm{\mathcal{L}}$} -- ++(0, -1.2) node(Plinse){} -| (subr.south); + \draw[->] (subr.east) -- (K.west) node[above left]{$\bm{\epsilon}_{d\mathcal{L}}$}; + \draw[->] (K.east) -- (addF.west) node[above left=0 and 8pt]{$\bm{\tau}^\prime$}; + + \draw[->] (outputX) -- ++(2.6, 0); + \draw[->] ($(outputX) + (2.2, 0)$)node[branch]{} node[above]{$\bm{\mathcal{X}}$} -- ++(0, -3.0) -| (Ex.south); + + \draw[<-] (Ex.west)node[above left]{$\bm{r}_{\mathcal{X}}$} -- ++(-1, 0); + \draw[->] (Ex.east) -- (J.west) node[above left]{$\bm{r}_{\mathcal{X}}$}; + \draw[->] (J.east) -- (Kl.west) node[above left]{$\bm{r}_{\mathcal{L}}$}; + \draw[->] (Kl.east) -- (subr.west) node[above left=0 and 6pt]{$\bm{r}_{d\mathcal{L}}$}; + + \begin{scope}[on background layer] + \node[fit={(P.south-|addF.west) (taum.east|-Kiff.north)}, opacity=0, inner sep=10pt] (Pdamped) {}; + + \node[fit={(Pdamped.north-|subr.west) (Plinse)}, fill=black!20!white, draw, dashed, inner sep=8pt] (Plin) {}; + \node[anchor={north west}] at (Plin.north west){$P_\text{lin}$}; + + \node[fit={(P.south-|addF.west) (taum.east|-Kiff.north)}, fill=black!40!white, draw, dashed, inner sep=10pt] (Pdamped) {}; + \node[anchor={north west}] at (Pdamped.north west){$P_\text{damped}$}; + \end{scope} + + \end{tikzpicture} +#+end_src + +#+name: fig:control_architecture_cascade_X +#+caption: Cascaded Control consisting of (from inner to outer loop): IFF, Linearization Loop, Tracking Control in the Cartesian Frame +#+RESULTS: +[[file:figs/control_architecture_cascade_X.png]] + +* Sensor Fusion Architectures +<> + +* $\mathcal{H}_\infty$ Architectures +<> + +* Force Control +Signals: +- $\bm{r}_\mathcal{F}$ is the wanted total force/torque to be applied to the payload +- $\bm{\epsilon}_\mathcal{F}$ is the force/torque errors that should be applied to the payload +- $\bm{\tau}$ is the force applied in each actuator + +#+begin_src latex :file control_architecture_force.pdf + \begin{tikzpicture} + % Blocs + \node[block={3.0cm}{3.0cm}] (P) {Plant}; + \coordinate[] (inputF) at ($(P.south west)!0.5!(P.north west)$); + \coordinate[] (outputF) at ($(P.south east)!0.8!(P.north east)$); + \coordinate[] (outputX) at ($(P.south east)!0.5!(P.north east)$); + \coordinate[] (outputL) at ($(P.south east)!0.2!(P.north east)$); + + \node[block, left= of inputF] (Jt) {$\bm{J}^{-T}$}; + \node[block, left= of Jt] (K) {$\bm{K}_\mathcal{F}$}; + \node[addb={+}{}{}{}{-}, left= of K] (subF) {}; + + \node[block, below=0.4 of P] (J) {$\bm{J}^{T}$}; + + % Connections and labels + \draw[->] (outputL) -- ++(1, 0) node[above left]{$d\bm{\mathcal{L}}$}; + \draw[->] (outputX) -- ++(1, 0) node[above left]{$\bm{\mathcal{X}}$}; + + \draw[->] (outputF) -- ++(1.8, 0); + \draw[->] ($(outputF) + (1.4, 0)$)node[branch]{} node[above]{$\bm{\tau}_m$} |- (J.east); + \draw[->] (J.west) -| (subF.south)node[below right]{$\bm{\mathcal{F}}_m$}; + \draw[->] (subF.east) -- (K.west) node[above left]{$\bm{\epsilon}_{\mathcal{F}}$}; + \draw[->] (K.east) -- (Jt.west) node[above left]{$\bm{\mathcal{F}}$}; + \draw[->] (Jt.east) -- (inputF) node[above left]{$\bm{\tau}$}; + \draw[<-] (subF.west) -- ++(-1, 0) node[above right]{$\bm{r}_{\mathcal{F}}$}; + \end{tikzpicture} +#+end_src + +#+RESULTS: +[[file:figs/control_architecture_force.png]] +* Bibliography :ignore: +bibliographystyle:unsrt +bibliography:ref.bib