|
3 | 3 | <html lang="en"> |
4 | 4 | <head><meta charset="utf-8"/> |
5 | 5 | <meta content="width=device-width, initial-scale=1.0" name="viewport"/> |
6 | | -<title>SysReg_crashcourse_TimeDomain_BlockA_03_ControlSynthesis</title><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script> |
| 6 | +<title>BlockA_03_ControlSynthesis</title><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script> |
7 | 7 | <style type="text/css"> |
8 | 8 | pre { line-height: 125%; } |
9 | 9 | td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } |
@@ -7624,9 +7624,9 @@ <h2 id="Textbook-input-signals">Textbook input signals<a class="anchor-link" hre |
7624 | 7624 | <div class="jp-OutputArea jp-Cell-outputArea"> |
7625 | 7625 | <div class="jp-OutputArea-child"> |
7626 | 7626 | <div class="jp-OutputPrompt jp-OutputArea-prompt"></div> |
7627 | | -<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="c24b355d-f88c-4371-bfee-4fc105d943cc" tabindex="0"> |
| 7627 | +<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="96930ddd-e888-4c5d-a19f-c749c5fe385e" tabindex="0"> |
7628 | 7628 | <script type="text/javascript"> |
7629 | | -var element = document.getElementById('c24b355d-f88c-4371-bfee-4fc105d943cc'); |
| 7629 | +var element = document.getElementById('96930ddd-e888-4c5d-a19f-c749c5fe385e'); |
7630 | 7630 | /* Put everything inside the global mpl namespace */ |
7631 | 7631 | /* global mpl */ |
7632 | 7632 | window.mpl = {}; |
@@ -8669,7 +8669,7 @@ <h2 id="Textbook-input-signals">Textbook input signals<a class="anchor-link" hre |
8669 | 8669 | <div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> |
8670 | 8670 | </div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> |
8671 | 8671 | <h2 id="Feedback-control">Feedback control<a class="anchor-link" href="#Feedback-control">¶</a></h2><p>WOW ARE WE GOING TO DO CONTROL NOW??? <em>FINALLY</em>???? Yes! No... There's one more difference we need to explain. There are two types of feedback control, output and state feedback. The difference is in the name and here you also see the difference in a block diagram for a plant/process/system, $P$, and a controller, $C$.</p> |
8672 | | -<p><img alt="output vs state feedback" src="figures/xyFB.svg"/></p> |
| 8672 | +<p><img alt="output vs state feedback" src="../figures/xyFB.svg"/></p> |
8673 | 8673 | <p>Output feedback is stuff like PID, or in other terms: disgusting. We'll look at state feedback now! <em>The real stuff.</em></p> |
8674 | 8674 | </div> |
8675 | 8675 | </div> |
@@ -8709,9 +8709,9 @@ <h2 id="Feedback-control">Feedback control<a class="anchor-link" href="#Feedback |
8709 | 8709 | <div class="jp-OutputArea jp-Cell-outputArea"> |
8710 | 8710 | <div class="jp-OutputArea-child"> |
8711 | 8711 | <div class="jp-OutputPrompt jp-OutputArea-prompt"></div> |
8712 | | -<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="df07e481-f774-43b8-8f91-35f3292a5fec" tabindex="0"> |
| 8712 | +<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="4791b7b7-6a48-4687-84d5-eb710075917d" tabindex="0"> |
8713 | 8713 | <script type="text/javascript"> |
8714 | | -var element = document.getElementById('df07e481-f774-43b8-8f91-35f3292a5fec'); |
| 8714 | +var element = document.getElementById('4791b7b7-6a48-4687-84d5-eb710075917d'); |
8715 | 8715 | /* Put everything inside the global mpl namespace */ |
8716 | 8716 | /* global mpl */ |
8717 | 8717 | window.mpl = {}; |
@@ -9773,9 +9773,9 @@ <h2 id="Feedback-control">Feedback control<a class="anchor-link" href="#Feedback |
9773 | 9773 | <div class="jp-OutputArea jp-Cell-outputArea"> |
9774 | 9774 | <div class="jp-OutputArea-child"> |
9775 | 9775 | <div class="jp-OutputPrompt jp-OutputArea-prompt"></div> |
9776 | | -<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="4ab3cca1-0c4e-49ef-94bf-196ba0af8abe" tabindex="0"> |
| 9776 | +<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="89941ad4-6c5e-4dc8-a528-774053b3f377" tabindex="0"> |
9777 | 9777 | <script type="text/javascript"> |
9778 | | -var element = document.getElementById('4ab3cca1-0c4e-49ef-94bf-196ba0af8abe'); |
| 9778 | +var element = document.getElementById('89941ad4-6c5e-4dc8-a528-774053b3f377'); |
9779 | 9779 | /* Put everything inside the global mpl namespace */ |
9780 | 9780 | /* global mpl */ |
9781 | 9781 | window.mpl = {}; |
@@ -10788,7 +10788,7 @@ <h2 id="Feedback-control">Feedback control<a class="anchor-link" href="#Feedback |
10788 | 10788 | <div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> |
10789 | 10789 | </div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> |
10790 | 10790 | <p>However, regulating to zero is boring, I want to be able to tell my system to do a backflip! We need to add a reference, and I'll spoil that we also need a reference gain $k_f$:</p> |
10791 | | -<p><img alt="Reference tracking" src="figures/refTrackCL.svg"/></p> |
| 10791 | +<p><img alt="Reference tracking" src="../figures/refTrackCL.svg"/></p> |
10792 | 10792 | <p>So how does this work then... Same substitution as before!</p> |
10793 | 10793 | <p>$$ \dot x = Ax + Bu = Ax + B(k_f r - Kx) = (A-BK) x + Bk_f r.$$</p> |
10794 | 10794 | <p>Now to determine $k_f$, we want to prevent steady state errors, so $\bar y = r$. Steady state also means</p> |
@@ -10839,9 +10839,9 @@ <h2 id="Feedback-control">Feedback control<a class="anchor-link" href="#Feedback |
10839 | 10839 | <div class="jp-OutputArea jp-Cell-outputArea"> |
10840 | 10840 | <div class="jp-OutputArea-child"> |
10841 | 10841 | <div class="jp-OutputPrompt jp-OutputArea-prompt"></div> |
10842 | | -<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="ca16e983-7d21-4cb5-b863-317f94d3dc48" tabindex="0"> |
| 10842 | +<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="81d6f9bc-235f-45dd-a389-203453453d71" tabindex="0"> |
10843 | 10843 | <script type="text/javascript"> |
10844 | | -var element = document.getElementById('ca16e983-7d21-4cb5-b863-317f94d3dc48'); |
| 10844 | +var element = document.getElementById('81d6f9bc-235f-45dd-a389-203453453d71'); |
10845 | 10845 | /* Put everything inside the global mpl namespace */ |
10846 | 10846 | /* global mpl */ |
10847 | 10847 | window.mpl = {}; |
@@ -11856,7 +11856,7 @@ <h2 id="Feedback-control">Feedback control<a class="anchor-link" href="#Feedback |
11856 | 11856 | <h2 id="Integral-action">Integral action<a class="anchor-link" href="#Integral-action">¶</a></h2><p> <em>The theory of everything is not found yet, so our model is <strong>always</strong> terrible</em></p> |
11857 | 11857 | <p>Most likely the model we have is not a perfect representation of the real world. "Neglect air friction, neglect static/dynamic friction and hysteresis, assume rigid bodies, assume perfect efficiency, ..." All lies we tell ourselves to make our lives easier and to blind ourselves to the harsh reality.</p> |
11858 | 11858 | <p>So if out model is incorrect, what does that mean for our controller? Simply said, it's not exactly what we want, but <em>it's close</em>. To get it perfect however, we need to add an output feedback part to our state feedback controller. An integrator of the reference-output-error to be precise. This integrator wil drive the integral of the error, $z$, to zero, meaning that the error will be zero. I'll stop talking now and show the block diagram so you actually understand.</p> |
11859 | | -<p><img alt="Integral action" src="figures/IntActCL.svg"/></p> |
| 11859 | +<p><img alt="Integral action" src="../figures/IntActCL.svg"/></p> |
11860 | 11860 | <p>Sooooo maths time. Substitute everything into everything, yada yada, this is largely what control engineers do. Also assume D=0. Lets start with plant equations and work our way backwards through the block diagram.</p> |
11861 | 11861 | <p>$$\left\{\begin{aligned}\dot x &= Ax + Bu = Ax + B(k_fr-Kx-k_iz) = (A-BK)x + Bk_fr-Bk_iz \\ y &= Cx\end{aligned}\right.$$</p> |
11862 | 11862 | <p>and</p> |
@@ -11910,9 +11910,9 @@ <h2 id="Integral-action">Integral action<a class="anchor-link" href="#Integral-a |
11910 | 11910 | <div class="jp-OutputArea jp-Cell-outputArea"> |
11911 | 11911 | <div class="jp-OutputArea-child"> |
11912 | 11912 | <div class="jp-OutputPrompt jp-OutputArea-prompt"></div> |
11913 | | -<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="2fd4dd8e-de68-47c0-b975-fb319a5b1bee" tabindex="0"> |
| 11913 | +<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="d49ca2d7-d446-42ff-a3ce-2b0efcd5f45a" tabindex="0"> |
11914 | 11914 | <script type="text/javascript"> |
11915 | | -var element = document.getElementById('2fd4dd8e-de68-47c0-b975-fb319a5b1bee'); |
| 11915 | +var element = document.getElementById('d49ca2d7-d446-42ff-a3ce-2b0efcd5f45a'); |
11916 | 11916 | /* Put everything inside the global mpl namespace */ |
11917 | 11917 | /* global mpl */ |
11918 | 11918 | window.mpl = {}; |
@@ -12964,9 +12964,9 @@ <h2 id="Integral-action">Integral action<a class="anchor-link" href="#Integral-a |
12964 | 12964 | <div class="jp-OutputArea jp-Cell-outputArea"> |
12965 | 12965 | <div class="jp-OutputArea-child"> |
12966 | 12966 | <div class="jp-OutputPrompt jp-OutputArea-prompt"></div> |
12967 | | -<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="066a9012-0002-433d-b347-4213dfab9a55" tabindex="0"> |
| 12967 | +<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="49268479-8bf6-449b-9d7d-8c7641f77d0e" tabindex="0"> |
12968 | 12968 | <script type="text/javascript"> |
12969 | | -var element = document.getElementById('066a9012-0002-433d-b347-4213dfab9a55'); |
| 12969 | +var element = document.getElementById('49268479-8bf6-449b-9d7d-8c7641f77d0e'); |
12970 | 12970 | /* Put everything inside the global mpl namespace */ |
12971 | 12971 | /* global mpl */ |
12972 | 12972 | window.mpl = {}; |
@@ -14020,9 +14020,9 @@ <h2 id="Integral-action">Integral action<a class="anchor-link" href="#Integral-a |
14020 | 14020 | <div class="jp-OutputArea jp-Cell-outputArea"> |
14021 | 14021 | <div class="jp-OutputArea-child"> |
14022 | 14022 | <div class="jp-OutputPrompt jp-OutputArea-prompt"></div> |
14023 | | -<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="35d08400-a0f1-45ae-9c81-20b20dfd1d07" tabindex="0"> |
| 14023 | +<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="eecffb7b-e5bb-42e7-bc3c-f2d8cf645375" tabindex="0"> |
14024 | 14024 | <script type="text/javascript"> |
14025 | | -var element = document.getElementById('35d08400-a0f1-45ae-9c81-20b20dfd1d07'); |
| 14025 | +var element = document.getElementById('eecffb7b-e5bb-42e7-bc3c-f2d8cf645375'); |
14026 | 14026 | /* Put everything inside the global mpl namespace */ |
14027 | 14027 | /* global mpl */ |
14028 | 14028 | window.mpl = {}; |
@@ -15132,9 +15132,9 @@ <h2 id="I-don't-understand-art-and-it-should-be-optimised">I don't understand ar |
15132 | 15132 | <div class="jp-OutputArea jp-Cell-outputArea"> |
15133 | 15133 | <div class="jp-OutputArea-child"> |
15134 | 15134 | <div class="jp-OutputPrompt jp-OutputArea-prompt"></div> |
15135 | | -<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="3352e92a-70db-47c6-bdd5-f72605d50d28" tabindex="0"> |
| 15135 | +<div class="jp-RenderedJavaScript jp-OutputArea-output" data-mime-type="application/javascript" id="38e8cbc4-d383-4758-ad29-2f36c80e1e92" tabindex="0"> |
15136 | 15136 | <script type="text/javascript"> |
15137 | | -var element = document.getElementById('3352e92a-70db-47c6-bdd5-f72605d50d28'); |
| 15137 | +var element = document.getElementById('38e8cbc4-d383-4758-ad29-2f36c80e1e92'); |
15138 | 15138 | /* Put everything inside the global mpl namespace */ |
15139 | 15139 | /* global mpl */ |
15140 | 15140 | window.mpl = {}; |
|
0 commit comments