Update content - 2026-10-08
Deploy / deploy (push) Successful in 6s

This commit is contained in:
tdehaeze committed 2026-10-08 09:13:42 +02:00
1 parent 03b428836b
commit 5e566f95c1
25 files changed
+386 -23

No files matched your search

@@ -30,7 +30,7 @@ Because their are strong non-intuitive aspect of MIMO loop-shaping, the followin
- **[Interaction Analysis]({{< relref "interaction_analysis.md" >}})**.
The goal is to identify two sided interactions in the plant dynamics.
If there is no two sided interaction, then feedback design becomes a standard multi-loop SISO design problem.
Two measured of the plant interaction are [Relative Gain Array]({{< relref "relative_gain_array.md" >}}) and [Structured Singular Value]({{< relref "structured_singular_value.md" >}}).
Two measured of the plant interaction are Relative Gain Array and Structured Singular Value.
- **Decoupling transformations**.
To reduce interaction, one may redefine the input and output of the plant using a decoupling transformation.
For motion systems, most transformations are found on the basis of **kinematic model**.
@@ -48,7 +48,7 @@ The multi-loop control may not work in strongly coupled systems.
Therefore, a methodology the access the degree of interaction between the loops is needed.
### [Relative Gain Array]({{< relref "relative_gain_array.md" >}}) {#relative-gain-array--relative-gain-array-dot-md}
### Relative Gain Array {#relative-gain-array}
The Relative Gain Array (RGA) \\(\Lambda(s)\\) is defined as:
@@ -6,10 +6,244 @@ category = "Signals and Systems"
+++
Tags
:
: [Discrete Transfer Functions]({{< relref "discrete_transfer_functions.md" >}})
Classical transfer functions in the Laplace domain, with the meaning of their parameters.
In all the examples, the frequency of interest is \\(\omega\_0 = 2\pi\\) rad/s (1 Hz) and is shown with a dashed line.
To obtain the equivalent digital filter, see [Discrete Transfer Functions]({{< relref "discrete_transfer_functions.md" >}}).
## Typical Transfer Functions {#typical-transfer-functions}
## First Order Low Pass Filter {#first-order-low-pass-filter}
\begin{equation}
H(s) = \frac{1}{1 + s/\omega\_0}
\end{equation}
Parameters:
- \\(\omega\_0\\): cut-off frequency in [rad/s]
Characteristics:
- Low frequency gain of \\(1\\)
- At \\(\omega\_0\\): gain of \\(1/\sqrt{2}\\) (-3 dB) and phase of -45 deg
- High frequency roll-off of -20 dB/dec, phase tends to -90 deg
<!--listend-->
```matlab
w0 = 2*pi; % Cut-off frequency [rad/s]
H = 1/(1 + s/w0);
```
<a id="figure--fig:filter-low-pass-first-order"></a>
{{< figure src="/ox-hugo/filter_low_pass_first_order.png" caption="<span class='figure-number'>Figure 1: </span>First order low pass filter, effect of \\(\omega\_0\\) (dashed: \\(\omega\_0 = 2\pi\\) rad/s)" >}}
## First Order High Pass Filter {#first-order-high-pass-filter}
\begin{equation}
H(s) = \frac{s/\omega\_0}{1 + s/\omega\_0}
\end{equation}
Parameters:
- \\(\omega\_0\\): cut-off frequency in [rad/s]
Characteristics:
- High frequency gain of \\(1\\)
- At \\(\omega\_0\\): gain of \\(1/\sqrt{2}\\) (-3 dB) and phase of +45 deg
- Low frequency slope of +20 dB/dec, phase tends to +90 deg
<!--listend-->
```matlab
w0 = 2*pi; % Cut-off frequency [rad/s]
H = (s/w0)/(1 + s/w0);
```
<a id="figure--fig:filter-high-pass-first-order"></a>
{{< figure src="/ox-hugo/filter_high_pass_first_order.png" caption="<span class='figure-number'>Figure 2: </span>First order high pass filter, effect of \\(\omega\_0\\) (dashed: \\(\omega\_0 = 2\pi\\) rad/s)" >}}
## Second Order Low Pass Filter {#second-order-low-pass-filter}
\begin{equation}
H(s) = \frac{1}{1 + \frac{2 \zeta}{\omega\_0} s + \frac{s^2}{\omega\_0^2}}
\end{equation}
Parameters:
- \\(\omega\_0\\): natural frequency in [rad/s]
- \\(\zeta\\): damping ratio
Characteristics:
- Low frequency gain of \\(1\\)
- High frequency roll-off of -40 dB/dec, phase tends to -180 deg
- Phase of -90 deg at \\(\omega\_0\\), whatever the damping
- Gain at \\(\omega\_0\\) equal to \\(1/(2\zeta)\\)
- For \\(\zeta < 1/\sqrt{2}\\) there is a resonance peak, for \\(\zeta \geq 1/\sqrt{2}\\) the magnitude is monotonically decreasing
- Smaller \\(\zeta\\) gives a sharper phase transition around \\(\omega\_0\\)
<!--listend-->
```matlab
w0 = 2*pi; % Natural frequency [rad/s]
zeta = 0.1; % Damping ratio
H = 1/(1 + 2*zeta/w0*s + s^2/w0^2);
```
<a id="figure--fig:filter-low-pass-second-order"></a>
{{< figure src="/ox-hugo/filter_low_pass_second_order.png" caption="<span class='figure-number'>Figure 3: </span>Second order low pass filter, effect of the damping ratio \\(\zeta\\)" >}}
## Second Order High Pass Filter {#second-order-high-pass-filter}
\begin{equation}
H(s) = \frac{s^2/\omega\_0^2}{1 + \frac{2 \zeta}{\omega\_0} s + \frac{s^2}{\omega\_0^2}}
\end{equation}
Parameters:
- \\(\omega\_0\\): natural frequency in [rad/s]
- \\(\zeta\\): damping ratio
Characteristics:
- High frequency gain of \\(1\\)
- Low frequency slope of +40 dB/dec, phase tends to +180 deg
- Phase of +90 deg at \\(\omega\_0\\), whatever the damping
- Gain at \\(\omega\_0\\) equal to \\(1/(2\zeta)\\), resonance peak for \\(\zeta < 1/\sqrt{2}\\)
<!--listend-->
```matlab
w0 = 2*pi; % Natural frequency [rad/s]
zeta = 0.1; % Damping ratio
H = (s^2/w0^2)/(1 + 2*zeta/w0*s + s^2/w0^2);
```
<a id="figure--fig:filter-high-pass-second-order"></a>
{{< figure src="/ox-hugo/filter_high_pass_second_order.png" caption="<span class='figure-number'>Figure 4: </span>Second order high pass filter, effect of the damping ratio \\(\zeta\\)" >}}
## Notch Filter {#notch-filter}
\begin{equation}
H(s) = \frac{s^2 + 2 g\_c \zeta \omega\_n s + \omega\_n^2}{s^2 + 2 \zeta \omega\_n s + \omega\_n^2}
\end{equation}
Parameters:
- \\(\omega\_n\\): frequency of the notch in [rad/s]
- \\(g\_c\\): gain at the notch frequency (\\(g\_c < 1\\) gives a notch, \\(g\_c > 1\\) gives a peak)
- \\(\zeta\\): damping ratio, sets the width of the notch
Characteristics:
- Unity gain at low and high frequency
- Gain of exactly \\(g\_c\\) at \\(\omega\_n\\), with a phase of 0 deg
- For \\(g\_c < 1\\): phase is negative below \\(\omega\_n\\) and positive above
- Larger \\(\zeta\\) gives a wider notch, and more phase lag/lead around it
<!--listend-->
```matlab
wn = 2*pi; % Notch frequency [rad/s]
gc = 0.02; % Gain at the notch frequency
zeta = 0.2; % Damping ratio (notch width)
H = (s^2 + 2*gc*zeta*wn*s + wn^2)/(s^2 + 2*zeta*wn*s + wn^2);
```
<a id="figure--fig:filter-notch-gc"></a>
{{< figure src="/ox-hugo/filter_notch_gc.png" caption="<span class='figure-number'>Figure 5: </span>Notch filter, effect of the gain at the notch frequency \\(g\_c\\)" >}}
<a id="figure--fig:filter-notch-zeta"></a>
{{< figure src="/ox-hugo/filter_notch_zeta.png" caption="<span class='figure-number'>Figure 6: </span>Notch filter, effect of the damping ratio \\(\zeta\\) (notch width)" >}}
## Lead Filter {#lead-filter}
A lead filter is usually used to add some phase lead at a particular frequency, at the expense of a reduction of the gain at low frequency and increase of the gain at high frequency.
\begin{equation}
H(s) = \frac{1}{\sqrt{a}} \frac{1 + \frac{s}{\omega\_c/\sqrt{a}}}{1 + \frac{s}{\omega\_c \sqrt{a}}}, \quad a > 1
\end{equation}
Parameters:
- \\(\omega\_c\\): frequency at which the phase lead is maximum, in [rad/s]
- \\(a\\): sets the amount of phase lead, and the gain increase between low and high frequency
Characteristics:
- Zero at \\(\omega\_c/\sqrt{a}\\) and pole at \\(\omega\_c \sqrt{a}\\), geometrically centered on \\(\omega\_c\\)
- Unity gain at \\(\omega\_c\\), low frequency gain of \\(1/\sqrt{a}\\), high frequency gain of \\(\sqrt{a}\\)
- Maximum phase lead, obtained at \\(\omega\_c\\), equal to (Figure [Figure 8](#figure--fig:filter-lead-effect-a-phase)):
\\[ \angle H(j\omega\_c) = \tan^{-1}(\sqrt{a}) - \tan^{-1}(1/\sqrt{a}) \\]
<!--listend-->
```matlab
a = 3; % Amount of phase lead
wc = 2*pi; % Frequency of maximum phase lead [rad/s]
H = 1/sqrt(a)*(1 + s/(wc/sqrt(a)))/(1 + s/(wc*sqrt(a)));
```
<a id="figure--fig:filter-lead"></a>
{{< figure src="/ox-hugo/filter_lead.png" caption="<span class='figure-number'>Figure 7: </span>Lead filter, effect of the parameter \\(a\\)" >}}
<a id="figure--fig:filter-lead-effect-a-phase"></a>
{{< figure src="/ox-hugo/filter_lead_effect_a_phase.png" caption="<span class='figure-number'>Figure 8: </span>Maximum phase lead as a function of \\(a\\)" >}}
## Lag Filter {#lag-filter}
A lag filter is usually used to add low frequency gain, at the expense of some phase lag.
\begin{equation}
H(s) = a \cdot \frac{1 + \frac{s}{\omega\_c \sqrt{a}}}{1 + \frac{s}{\omega\_c/\sqrt{a}}}, \quad a > 1
\end{equation}
Parameters:
- \\(\omega\_c\\): frequency at which the phase lag is maximum, in [rad/s]
- \\(a\\): sets the amount of phase lag, and the gain increase at low frequency (the low frequency gain is \\(a\\))
Characteristics:
- Zero at \\(\omega\_c \sqrt{a}\\) and pole at \\(\omega\_c/\sqrt{a}\\)
- Low frequency gain of \\(a\\), high frequency gain of \\(1\\) (unchanged), gain of \\(\sqrt{a}\\) at \\(\omega\_c\\)
- It is used to increase the low frequency gain (e.g. instead of a pure integrator), \\(\omega\_c\\) should be kept well below the crossover frequency to limit the phase lag there
<!--listend-->
```matlab
a = 3; % Amount of phase lag
wc = 2*pi; % Frequency of maximum phase lag [rad/s]
H = a*(1 + s/(wc*sqrt(a)))/(1 + s/(wc/sqrt(a)));
```
<a id="figure--fig:filter-lag"></a>
{{< figure src="/ox-hugo/filter_lag.png" caption="<span class='figure-number'>Figure 9: </span>Lag filter, effect of the parameter \\(a\\)" >}}
## Bibliography {#bibliography}
+82
View File
@@ -10,6 +10,88 @@ Tags
: [Multivariable Control]({{< relref "multivariable_control.md" >}})
## Decoupling Control of Parallel Kinematics Robots {#decoupling-control-of-parallel-kinematics-robots}
Consider a rigid body (mass matrix \\(\bm{M}\\), stiffness matrix \\(\bm{K}\\)) suspended by actuators, with their forces \\(\bm{\tau}\\) and the change of length of the struts \\(\bm{\mathcal{L}}\\).
The Jacobian matrix \\(\bm{J}\\) relates the pose \\(\bm{\mathcal{X}}\\) of the body to the strut lengths, \\(\bm{\mathcal{L}} = \bm{J} \bm{\mathcal{X}}\\), and the actuator forces to the wrench \\(\bm{\mathcal{F}}\\) applied on the body, \\(\bm{\mathcal{F}} = \bm{J}^{\intercal} \bm{\tau}\\).
The transfer function in the actuator frame is:
\begin{equation}
\bm{G}\_{\\{\mathcal{L}\\}}(s) = \frac{\bm{\mathcal{L}}}{\bm{\tau}} = \bm{J} \left( \bm{M} s^2 + \bm{C} s + \bm{K} \right)^{-1} \bm{J}^{\intercal}
\end{equation}
Depending on the frequency range, the dynamics is dominated by the stiffness (low frequency) or the inertia (high frequency).
The best frame to decouple the system is not the same in the two cases.
### Control at the Center Of Mass {#control-at-the-center-of-mass}
For soft systems (for instance voice coil based), it makes sense to work at the Center of Mass (CoM).
Above the "suspension modes", the dynamics is dominated by inertia.
Therefore, the transfer function from forces and torques applied at the CoM to the translation and rotation of the suspended mass evaluated at the CoM is decoupled.
It is equal to the inverse of the mass matrix (diagonal when evaluated at the CoM) times \\(1/s^2\\):
\begin{equation}
\bm{G}\_{\\{CoM\\}}(s) = \frac{\bm{\mathcal{X}}\_{\\{CoM\\}}}{\bm{\mathcal{F}}\_{\\{CoM\\}}} \approx \frac{1}{s^2} \bm{M}^{-1}
\end{equation}
To work at the CoM, the plant is pre- and post-multiplied by the Jacobian matrices as shown in Figure [Figure 1](#figure--fig:detail-control-decoupling-control-jacobian):
\begin{equation}
\bm{G}\_{\\{CoM\\}}(s) = \bm{J}\_{\\{CoM\\}}^{-1} \\, \bm{G}\_{\\{\mathcal{L}\\}}(s) \\, \bm{J}\_{\\{CoM\\}}^{-\intercal}
\end{equation}
<a id="figure--fig:detail-control-decoupling-control-jacobian"></a>
{{< figure src="/ox-hugo/detail_control_decoupling_control_jacobian.png" caption="<span class='figure-number'>Figure 1: </span>Plant with inputs \\(\bm{\tau}\\) and outputs \\(\bm{\mathcal{L}}\\), and the Jacobian matrices used to work with forces and displacements at the CoM" >}}
The animations below show a 3DoF suspended body above its suspension modes (1 Hz), when a force or a torque is applied at the CoM.
The three actuator forces are computed with \\(\bm{\tau} = \bm{J}\_{\\{CoM\\}}^{-\intercal} \bm{\mathcal{F}}\_{\\{CoM\\}}\\) (the darker the actuator, the larger its force).
**Force along \\(x\\) applied at the CoM**: the body only translates along \\(x\\).
<a id="figure--fig:decoupled-control-com-Fx"></a>
{{< figure src="/ox-hugo/decoupled_control_com_Fx.gif" caption="<span class='figure-number'>Figure 2: </span>Force along \\(x\\) applied at the CoM (1 Hz): pure translation" >}}
**Torque about \\(z\\) applied at the CoM**: the body only rotates around its CoM.
<a id="figure--fig:decoupled-control-com-Mz"></a>
{{< figure src="/ox-hugo/decoupled_control_com_Mz.gif" caption="<span class='figure-number'>Figure 3: </span>Torque about \\(z\\) applied at the CoM (1 Hz): pure rotation" >}}
### Control in the Actuator Frame {#control-in-the-actuator-frame}
For stiff parallel systems, the dynamics from \\(\bm{\tau}\\) to \\(\bm{\mathcal{L}}\\) is well decoupled at low frequency (well below the first resonance frequency).
At low frequency, the dynamics is dominated by the stiffness: with \\(\bm{K} = \bm{J}^{\intercal} \mathcal{K} \bm{J}\\), \\(\mathcal{k}\\) being the diagonal matrix of the actuator stiffnesses, the transfer function from \\(\bm{\tau}\\) to \\(\bm{\mathcal{L}}\\) is diagonal:
\begin{equation}
\bm{G}\_{\\{\mathcal{L}\\}}(0) = \bm{J} \bm{K}^{-1} \bm{J}^{\intercal} = \mathcal{K}^{-1}
\end{equation}
Each actuator then only changes the length of its own strut.
The control can be designed independently for each actuator, using the length of the strut as the sensor.
Below the suspension modes, actuating one actuator moves the body, but the lengths of the two other struts do not change.
Therefore, the plant in the frame of the actuators is decoupled.
<a id="figure--fig:decoupled-control-low-freq-act-1"></a>
{{< figure src="/ox-hugo/decoupled_control_low_freq_act_1.gif" caption="<span class='figure-number'>Figure 4: </span>Left actuator at 0.1 Hz (below the suspension modes): only the strut of the actuated direction changes length" >}}
<a id="figure--fig:decoupled-control-low-freq-act-2"></a>
{{< figure src="/ox-hugo/decoupled_control_low_freq_act_2.gif" caption="<span class='figure-number'>Figure 5: </span>Bottom left actuator at 0.1 Hz (below the suspension modes): only the strut of the actuated direction changes length" >}}
At higher frequency, the inertia becomes important and the system is coupled: using only the first actuator also excites the other directions and the other struts change length.
<a id="figure--fig:decoupled-control-high-freq-act-1"></a>
{{< figure src="/ox-hugo/decoupled_control_high_freq_act_1.gif" caption="<span class='figure-number'>Figure 6: </span>Left actuator at 1 Hz (above the suspension modes): the system is coupled, the body translates and rotates" >}}
## Bibliography {#bibliography}
<style>.csl-entry{text-indent: -1.5em; margin-left: 1.5em;}</style><div class="csl-bib-body">
+53 -2
View File
@@ -11,8 +11,59 @@ Tags
Two main ways to evaluate the interaction:
- [Relative Gain Array]({{< relref "relative_gain_array.md" >}})
- [Structured Singular Value]({{< relref "structured_singular_value.md" >}})
- Relative Gain Array
- Structured Singular Value
## Relative Gain Array {#relative-gain-array}
Imagine a 2x2 plant:
\\[ G(s) = \begin{bmatrix} g\_{11}(s) & g\_{12}(s)\\\ g\_{21}(s) & g\_{22}(s) \end{bmatrix} \\]
Now suppose a controller \\(k\_{1}(s)\\) is closed on the first loop.
The new transfer function from \\(u\_2\\) to \\(y\_2\\) (while the first loop is closed) is :
\begin{equation}
y\_2 = g\_{22} \left[ 1 - \underbrace{\frac{g\_{21}g\_{12}}{g\_{11}g\_{22}}}\_{\phi} \underbrace{\frac{g\_{11} k\_{11}}{1 + g\_{11}k\_{11}}}\_{T\_{11}} \right]
\end{equation}
\\(\phi\\) is called the **interaction index**.
\\(T\_{11}\\) is the complementary sensitivity of the first loop (equal to 1 in the bandwidth of the first controller).
Therefore, we want \\(\phi \approx 0\\) to have no interaction.
Similarly, the **relative gain** is defined as:
\\[ \Lambda = \frac{1}{1 - \phi} \\]
And we want \\(\Lambda \approx 1\\) to have no interaction.
Note that the scaling of inputs or outputs of the MIMO plant has no effect on \\(\phi\\) or \\(\Lambda\\).
The **relative gain array** is defined as:
\\[ \Lambda(G) = G \star (G^{-1})^{T} \\]
where \\(\star\\) means element wise multiplication.
```matlab
RGA = G.*pinv(G.')
```
## RGA-number {#rga-number}
The RGA-number is a scalar measure of how far the RGA is from the identity matrix (i.e. from a plant without interaction):
\begin{equation}
\text{RGA-number} = \\| \Lambda(G) - I \\|\_{\text{sum}} = \sum\_{i,j} \left| \Lambda\_{ij} - \delta\_{ij} \right|
\end{equation}
with \\(\delta\_{ij}\\) the Kronecker delta, and \\(\\|\cdot\\|\_{\text{sum}}\\) the sum of the absolute values of all the elements.
The RGA-number should be small around the crossover frequency of the decentralized controller, as this is where the interaction matters most.
```matlab
RGA = G.*pinv(G.');
RGA_number = sum(sum(abs(RGA - eye(size(RGA)))));
```
For a plant evaluated over frequency, this is computed at each frequency point of the frequency response.
## Bibliography {#bibliography}
@@ -1,16 +0,0 @@
+++
title = "Model Predictive Control"
author = ["Dehaeze Thomas"]
draft = false
category = "Control Theory"
subcategory = "Advanced Control"
+++
Tags
:
## Bibliography {#bibliography}
<style>.csl-entry{text-indent: -1.5em; margin-left: 1.5em;}</style><div class="csl-bib-body">
</div>
+13 -1
View File
@@ -465,7 +465,7 @@ Numbering can be continued by using `+n` option as shown below.
```
<div class="src-block-caption">
<span class="src-block-number"><a href="#code-snippet--lst:tikz-test-general-control-names">Code Snippet 4</a>:</span>
Tikz code that is used to generate <a href="#org4a89346">5</a>
Tikz code that is used to generate <a href="#org587cbdd">5</a>
</div>
<a id="figure--fig:test-general-control-names"></a>
@@ -632,9 +632,21 @@ It is approximately **12,742 km**
## Videos {#videos}
### Youtube link {#youtube-link}
{{< youtube SzA2YODtgK4 >}}
### GIF generated from Python {#gif-generated-from-python}
Animation of a 3DoF rigid body excited by the left actuator at 1 Hz, generated by the Python block below.
<a id="figure--fig:coupling-high-freq-1Hz"></a>
{{< figure src="/ox-hugo/coupling_high_freq_1Hz.gif" caption="<span class='figure-number'>Figure 7: </span>GIF generated from Python" >}}
## Bibliography {#bibliography}
<style>.csl-entry{text-indent: -1.5em; margin-left: 1.5em;}</style><div class="csl-bib-body">