<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>fbc0314 님의 블로그</title>
    <link>https://fbc0314.tistory.com/</link>
    <description>fbc0314 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Sun, 14 Jun 2026 17:30:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>fbc0314</managingEditor>
    <item>
      <title>3. Simulink</title>
      <link>https://fbc0314.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DC 모터의 모델에서 input은 전압(V)이고 output은 각속도이다. 모델을 viscous frcition 모델로 가정해서 friction torque는 r각속도에 비례한다. 이를 미분방적식으로 나타내면 아래와 같다.&lt;/p&gt;
&lt;div id=&quot;code_1739157389470&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$J\ddot{\theta }=Ki-b\dot{\theta }$$
$$L\frac{di}{dt}+Ri=V-K\dot{\theta }$$&quot;&gt;$$J\ddot{\theta }=Ki-b\dot{\theta }$$ $$L\frac{di}{dt}+Ri=V-K\dot{\theta }$$&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;J, moment of inertia of the rotor : 0.01 kg.m^2&lt;/li&gt;
&lt;li&gt;b, motor viscous friction constant : 0.1 N.m.s&lt;/li&gt;
&lt;li&gt;Ke, electromotive force constant : 0.01 V/rad/sed&lt;/li&gt;
&lt;li&gt;Kt, motor torque constant : 0.01 N.m/Amp&lt;/li&gt;
&lt;li&gt;R, electric resistance : 10 hm&lt;/li&gt;
&lt;li&gt;L, electric inductance : 0.5H&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. simulink&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;simulink에서 아래처럼 위의 시스템을 나타낼 수 있다. 각 계수는 모델작업공간에 저장한다. ctrl+a로 모두 선택후에 우클릭 후에 선택항목을 서브시스템으로 만들기를 선택해(또는 ctrl+g) 하나의 블록으로 표현되는 서브시스템으로 만들 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bURjUP/btsMcdl4fBT/9KXSYxGUaitr4alvDtU93K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bURjUP/btsMcdl4fBT/9KXSYxGUaitr4alvDtU93K/img.png&quot; data-alt=&quot;DC motor with simulink&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bURjUP/btsMcdl4fBT/9KXSYxGUaitr4alvDtU93K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbURjUP%2FbtsMcdl4fBT%2F9KXSYxGUaitr4alvDtU93K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;477&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DC motor with simulink&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 linmod()함수를 사용해서 simulink의 모델을 매트랩으로 가져올 수 있다. 이때 파일명에서 확장자는 사용하면 안된다.&lt;/p&gt;
&lt;pre id=&quot;code_1739237477394&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[A,B,C,D]=linmod(&quot;DCmotor&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 simulink내에서 모델을 추출할 수 있는데 아래의 방법을 사용한다. 먼저 시스템의 input와 output을 정의해주어야 하는데 voltage signal 우클릭 후에 Linear Analysis Points &amp;gt; Open-loop Input을 선택하고 speed signal 우클릭 후에 Linear Analysis Points &amp;gt; Open-loop Output을 선택한다. 시스템의 input 신호와 output 신호는 아래와 같이 지정되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UUZrh/btsMeu0WSYz/53bYnkVhHZ1KZj00MamIV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UUZrh/btsMeu0WSYz/53bYnkVhHZ1KZj00MamIV1/img.png&quot; data-alt=&quot;input과 output 신호 지정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UUZrh/btsMeu0WSYz/53bYnkVhHZ1KZj00MamIV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUUZrh%2FbtsMeu0WSYz%2F53bYnkVhHZ1KZj00MamIV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;711&quot; height=&quot;306&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;input과 output 신호 지정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;simulink 창 위쪽에 앱 탭에서 Model Linearizer를 선택하면 아래와 같은 창이 나온다. 여기서 LINEARIZE &amp;gt; Step을 선택하면 전달함수의 모델이 좌측 Linear Analysis Worksapce에 만들어지고 이를 그래그 해서 위쪽 MATLAB Workspace에 이동시키면 matlab에서도 만들어진 모델을 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6ZGBA/btsMc00ZtSS/4FO8bi1ccgql0R4SUddBo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6ZGBA/btsMc00ZtSS/4FO8bi1ccgql0R4SUddBo1/img.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;885&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6ZGBA/btsMc00ZtSS/4FO8bi1ccgql0R4SUddBo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6ZGBA%2FbtsMc00ZtSS%2F4FO8bi1ccgql0R4SUddBo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1386&quot; height=&quot;885&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGj2VS/btsMcRXmFaQ/0nK9YPK3Ik9rFVoAtkHXTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGj2VS/btsMcRXmFaQ/0nK9YPK3Ik9rFVoAtkHXTk/img.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;885&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGj2VS/btsMcRXmFaQ/0nK9YPK3Ik9rFVoAtkHXTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGj2VS%2FbtsMcRXmFaQ%2F0nK9YPK3Ik9rFVoAtkHXTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1386&quot; height=&quot;885&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Model Linearizer 창을 열고 모델을 만든 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;simulink로 추출할 모델이 우리가 의도한 것과 동일한지 확인해보자. zpk()함수를 사용하면 pole/zero를 확인할 수 있는 형태로 결과가 출력된다. 아래 사진을 확인해보면 결과는 같음을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;757&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAuIx2/btsMeSNXAxW/PaKeLVmJBPPPUBC3kFMsXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAuIx2/btsMeSNXAxW/PaKeLVmJBPPPUBC3kFMsXK/img.png&quot; data-alt=&quot;simulink에서 추출한 모델과 기존 모델 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAuIx2/btsMeSNXAxW/PaKeLVmJBPPPUBC3kFMsXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAuIx2%2FbtsMeSNXAxW%2FPaKeLVmJBPPPUBC3kFMsXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;663&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;757&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;simulink에서 추출한 모델과 기존 모델 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1)open-loop response&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래처럼 step과 scope블록을 추가하고 input signal의 크기는 1, 시뮬레이션 시간은 3초로 한다. open-loop response결과는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccHe9N/btsMd8462Hq/Muvb3T5jepAhqh9Wg45YG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccHe9N/btsMd8462Hq/Muvb3T5jepAhqh9Wg45YG0/img.png&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;351&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.7496%; margin-right: 10px;&quot; data-widthpercent=&quot;54.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccHe9N/btsMd8462Hq/Muvb3T5jepAhqh9Wg45YG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccHe9N%2FbtsMd8462Hq%2FMuvb3T5jepAhqh9Wg45YG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;469&quot; height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHOIDU/btsMdmXeRII/04Mf4ZIXs89zpI2EKWYCz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHOIDU/btsMdmXeRII/04Mf4ZIXs89zpI2EKWYCz0/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.0876%;&quot; data-widthpercent=&quot;45.62&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHOIDU/btsMdmXeRII/04Mf4ZIXs89zpI2EKWYCz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHOIDU%2FbtsMdmXeRII%2F04Mf4ZIXs89zpI2EKWYCz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;simulink에 블록을 추가한 결과와 open-loop response&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2)closed-loop response with lag compensator&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;code_1739245012612&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$C(s)= 44 \frac{(s+0.1)}{(s+0.01)}$$&quot;&gt;$$C(s)= 44 \frac{(s+0.1)}{(s+0.01)}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 이러한 controller를 추가해야 하는지는 이전 글에 정리해두었다. simulink에 아래와 같이 블록을 추가하고 결과를 확인해보자!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRJdHA/btsMdMgYIWy/3lLBLTZUCLCQ1kSwuksxH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRJdHA/btsMdMgYIWy/3lLBLTZUCLCQ1kSwuksxH1/img.png&quot; data-alt=&quot;블록을 추가해서 만든 closed-loop&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRJdHA/btsMdMgYIWy/3lLBLTZUCLCQ1kSwuksxH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRJdHA%2FbtsMdMgYIWy%2F3lLBLTZUCLCQ1kSwuksxH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;268&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;블록을 추가해서 만든 closed-loop&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mTtLl/btsMesIZhD7/pQVSAyBD5kPNizGf1h7311/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mTtLl/btsMesIZhD7/pQVSAyBD5kPNizGf1h7311/img.png&quot; data-alt=&quot;closed-loop response&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mTtLl/btsMesIZhD7/pQVSAyBD5kPNizGf1h7311/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmTtLl%2FbtsMesIZhD7%2FpQVSAyBD5kPNizGf1h7311%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;521&quot; height=&quot;465&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;closed-loop response&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. simscape&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;simscape를 이용해서 표현하면 관련된 블록을 이용해서 아래와 같이 표현이 가능하다. 각부분에서 J는 intertia, K는 rotational electromechanical converter, L은 inductor, R은 resistor, b는 rotational damper에 값으로 설정해준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKAHtr/btsMebNPOSZ/idCnmf3FIkNeTNxKPKvf71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKAHtr/btsMebNPOSZ/idCnmf3FIkNeTNxKPKvf71/img.png&quot; data-alt=&quot;DC motor with simscape&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKAHtr/btsMebNPOSZ/idCnmf3FIkNeTNxKPKvf71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKAHtr%2FbtsMebNPOSZ%2FidCnmf3FIkNeTNxKPKvf71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;436&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DC motor with simscape&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 블록에서 R은 rotor(회전자)로 샤프트 등의 회전하는 부분을 의미한다. C는 cas(고정 케이스)로 센서의 기준점을 의미하고 프레임 또는 고정된 기준점(ground)에 연결되는데 ground에 연결되면 R에서는 절대적인 회전운동을 측정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 사용한 Rotational Damper 블록은 friction을 선형으로 가정하고 간단하게 만든 블록이다. 현실에서 friction은 이보다 더 복잡한데 더 복잡한 모델을 사용하고 싶으면 Rotational Friction 블록을 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 시스템의 응답을 시뮬레이션 하기 위헤서는 센서와 전원의 블록을 추가해야 한다. 또한 simscape 블록의 신호는 단위가 포함된 물리적 양이지만 simulink 블록의 신호는 무차원 숫자이므로 두 경우의 인터페이스를 위한 변환 블록 또한 필요한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/scip6/btsMcb3aE1u/8fRCAZc9NTTvneoqlyhSx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/scip6/btsMcb3aE1u/8fRCAZc9NTTvneoqlyhSx1/img.png&quot; data-alt=&quot;필요한 센서와 전원 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/scip6/btsMcb3aE1u/8fRCAZc9NTTvneoqlyhSx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fscip6%2FbtsMcb3aE1u%2F8fRCAZc9NTTvneoqlyhSx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;517&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;517&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;필요한 센서와 전원 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Rotational Motion Sensor : 각도(angular position)와 각속도(angular velocity)를 측정할 수 있다. ground에 연결되어 있으므로 절대적인 각도와 각속도를 측정한다. 초기각도(initial angle)설정가능&lt;/li&gt;
&lt;li&gt;Current Sensor : 모터가 소비하는 전류를 측정한다.&lt;/li&gt;
&lt;li&gt;Controlled Voltage Source : 모터를 위한 전원 역할을 하고 input블록을 통해서 원하는 전압을 정할 수 있다.&lt;/li&gt;
&lt;li&gt;PS-Simulink / Simulink-PS : simulink 신호(단위X)와 physical 신호(단위O)를 서로 변환해준다.&lt;/li&gt;
&lt;li&gt;Solver Configuration : 시뮬레이션에 적용되는 numerical solver를 설정해준다. 여기서는 초기세팅 그대로 사용한다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>control tutorials/motor speed</category>
      <author>fbc0314</author>
      <guid isPermaLink="true">https://fbc0314.tistory.com/18</guid>
      <comments>https://fbc0314.tistory.com/18#entry18comment</comments>
      <pubDate>Mon, 10 Feb 2025 12:56:51 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 simulink 연결방법</title>
      <link>https://fbc0314.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아두이노와 simulink를 연결해서 input signal와 output signal을 simulink 내에서 확인해보자!!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.아두이노와 matlab&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 아두이노와 matlab을 연결하기 위한 에드온을 설치한다. (simulink를 사용하기 위해서 필수인지는 모르겠다)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1924&quot; data-origin-height=&quot;1048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSZE1Y/btsL7DyhwPd/paklQNmSLvQOZkr6exns20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSZE1Y/btsL7DyhwPd/paklQNmSLvQOZkr6exns20/img.png&quot; data-alt=&quot;matlab과 아두이노 연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSZE1Y/btsL7DyhwPd/paklQNmSLvQOZkr6exns20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSZE1Y%2FbtsL7DyhwPd%2FpaklQNmSLvQOZkr6exns20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;357&quot; data-origin-width=&quot;1924&quot; data-origin-height=&quot;1048&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;matlab과 아두이노 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후에는 아두이노와 연결을 설정해야 한다. 설치 직후에&amp;nbsp; usb 드라이버를 설정할것인지를 묻는 메세지가 나오는데 여기서 설정할 수 있고 설치 후에 위의 화면에서 관리 버튼 -&amp;gt; 톱니바퀴 아이콘을 통해서 설정할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/noItJ/btsL8UsfKTX/VZHcqwpTk8DCu5nKG3b6w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/noItJ/btsL8UsfKTX/VZHcqwpTk8DCu5nKG3b6w1/img.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;766&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/noItJ/btsL8UsfKTX/VZHcqwpTk8DCu5nKG3b6w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnoItJ%2FbtsL8UsfKTX%2FVZHcqwpTk8DCu5nKG3b6w1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/otDes/btsL8OeIVIO/wfRFZjmOTVoKYzY66CYKd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/otDes/btsL8OeIVIO/wfRFZjmOTVoKYzY66CYKd0/img.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;766&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/otDes/btsL8OeIVIO/wfRFZjmOTVoKYzY66CYKd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FotDes%2FbtsL8OeIVIO%2FwfRFZjmOTVoKYzY66CYKd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oCQvL/btsL8Yg5aUR/MEUoHOTtpd73IWbnr74Aek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oCQvL/btsL8Yg5aUR/MEUoHOTtpd73IWbnr74Aek/img.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;766&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oCQvL/btsL8Yg5aUR/MEUoHOTtpd73IWbnr74Aek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoCQvL%2FbtsL8Yg5aUR%2FMEUoHOTtpd73IWbnr74Aek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kKaVS/btsL8K4s0a6/O6N0TQM0efbmEG9xbomza0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kKaVS/btsL8K4s0a6/O6N0TQM0efbmEG9xbomza0/img.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;766&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kKaVS/btsL8K4s0a6/O6N0TQM0efbmEG9xbomza0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkKaVS%2FbtsL8K4s0a6%2FO6N0TQM0efbmEG9xbomza0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;세번째 사진에서 아두이노 우노에서는 Motor carrier, Serial 라이브러리 설치는 안된다고 한다(일단 다 설치했다...), 포트는 사용자마다 다르다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjKnvD/btsL8mv0JH9/jXe2kUXsTRORCylYWctWi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjKnvD/btsL8mv0JH9/jXe2kUXsTRORCylYWctWi0/img.png&quot; data-alt=&quot;위의 명령어를 입력하면 아마 다시 설정할 수 있나보다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjKnvD/btsL8mv0JH9/jXe2kUXsTRORCylYWctWi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjKnvD%2FbtsL8mv0JH9%2FjXe2kUXsTRORCylYWctWi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;440&quot; height=&quot;329&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위의 명령어를 입력하면 아마 다시 설정할 수 있나보다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변화를 확인해보자!! 명령창에 a=arduino('COM4','Uno')를 입력하면 아래과 같이 matlab에서 아두이노 보드를 확인할 수 있다. 위와 같은 연결설정을 연결할때마다 해주어야 한다!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRXB74/btsL8XJgUWA/ubjl6zxXJxmJ7ShcWPoXVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRXB74/btsL8XJgUWA/ubjl6zxXJxmJ7ShcWPoXVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRXB74/btsL8XJgUWA/ubjl6zxXJxmJ7ShcWPoXVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRXB74%2FbtsL8XJgUWA%2Fubjl6zxXJxmJ7ShcWPoXVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1336&quot; height=&quot;628&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8번핀에 저항을 이용해서 led의 양극(긴쪽)과 연결했다. 아래 명령으를 이용하면 연결된 led의 on/off가 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1738804752759&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;writeDigitalPin(a, 'D8', 1); //8번핀을 on
writeDigitalPin(a, 'D8', 0); //8번핀을 off&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 아두이노와 simulink&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 아두이노와 simulink를 연결하기 위한 에드온을 설치한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1924&quot; data-origin-height=&quot;1048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brItBI/btsL8Gnshzy/aE1Ny2yghCZlO1yhYneSMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brItBI/btsL8Gnshzy/aE1Ny2yghCZlO1yhYneSMk/img.png&quot; data-alt=&quot;simulink와 아두이노 연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brItBI/btsL8Gnshzy/aE1Ny2yghCZlO1yhYneSMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrItBI%2FbtsL8Gnshzy%2FaE1Ny2yghCZlO1yhYneSMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;355&quot; data-origin-width=&quot;1924&quot; data-origin-height=&quot;1048&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;simulink와 아두이노 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에도 비슷하게 하드웨서 설정을 해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uu9Yn/btsL9clUox5/DJ9beF2wOHWiLuwbFP3W2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uu9Yn/btsL9clUox5/DJ9beF2wOHWiLuwbFP3W2k/img.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;766&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uu9Yn/btsL9clUox5/DJ9beF2wOHWiLuwbFP3W2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuu9Yn%2FbtsL9clUox5%2FDJ9beF2wOHWiLuwbFP3W2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV8DCd/btsL7jNvRcn/aFhQigq81sZgSb0BcILljk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV8DCd/btsL7jNvRcn/aFhQigq81sZgSb0BcILljk/img.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;766&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV8DCd/btsL7jNvRcn/aFhQigq81sZgSb0BcILljk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV8DCd%2FbtsL7jNvRcn%2FaFhQigq81sZgSb0BcILljk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clMrzH/btsL7y4Oy6d/BxXL6SKSFnCzZBWoof4zQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clMrzH/btsL7y4Oy6d/BxXL6SKSFnCzZBWoof4zQ1/img.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;766&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clMrzH/btsL7y4Oy6d/BxXL6SKSFnCzZBWoof4zQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclMrzH%2FbtsL7y4Oy6d%2FBxXL6SKSFnCzZBWoof4zQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfqy7N/btsL8cAeGjN/NQO14FVp9LUXB3y6qEoGTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfqy7N/btsL8cAeGjN/NQO14FVp9LUXB3y6qEoGTK/img.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;766&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfqy7N/btsL8cAeGjN/NQO14FVp9LUXB3y6qEoGTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfqy7N%2FbtsL8cAeGjN%2FNQO14FVp9LUXB3y6qEoGTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;중간에 문제가 생기면 usb를 뽑았다가 다시 시도한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doTams/btsL7pf0q4k/0qCFJnJ0AZyGzV5cNkjgD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doTams/btsL7pf0q4k/0qCFJnJ0AZyGzV5cNkjgD1/img.png&quot; data-alt=&quot;끝까지 설치 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doTams/btsL7pf0q4k/0qCFJnJ0AZyGzV5cNkjgD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoTams%2FbtsL7pf0q4k%2F0qCFJnJ0AZyGzV5cNkjgD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;538&quot; height=&quot;402&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;끝까지 설치 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;simulink를 열고 빈모델을 열어서 라이브러리 브라우저를 확인해보면 아래와 같이 아두이노 관련 블록이 존재한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;906&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k7oxJ/btsL81eVEbs/ZT2kG3iWohtJr7buQxWsK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k7oxJ/btsL81eVEbs/ZT2kG3iWohtJr7buQxWsK0/img.png&quot; data-alt=&quot;아두이노와 연결할 수 있는 블록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k7oxJ/btsL81eVEbs/ZT2kG3iWohtJr7buQxWsK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk7oxJ%2FbtsL81eVEbs%2FZT2kG3iWohtJr7buQxWsK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1464&quot; height=&quot;906&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;906&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아두이노와 연결할 수 있는 블록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;simulink 빈 모델을 하나 열고 아래와 같이 블록을 가져와서 연결한다. pulse 신호를 output으로 9번핀에 주고 A4의 신호를 input으로 읽어서 scope으로 확인하려고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;1113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nLUzy/btsMaN65LE3/MGZLUelkPj7LfrkKdOkRq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nLUzy/btsMaN65LE3/MGZLUelkPj7LfrkKdOkRq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nLUzy/btsMaN65LE3/MGZLUelkPj7LfrkKdOkRq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnLUzy%2FbtsMaN65LE3%2FMGZLUelkPj7LfrkKdOkRq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;778&quot; height=&quot;596&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;1113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 아두이노 보드에 8번핀과 A0에 연결했으므로 아래와 같이 더블클릭 후에 변경해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nVsKv/btsMayvzhQJ/Xir5x9bZXVv7UTqRRL9hMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nVsKv/btsMayvzhQJ/Xir5x9bZXVv7UTqRRL9hMK/img.png&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;328&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;62.34&quot; width=&quot;481&quot; height=&quot;201&quot; style=&quot;width: 61.6103%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nVsKv/btsMayvzhQJ/Xir5x9bZXVv7UTqRRL9hMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnVsKv%2FbtsMayvzhQJ%2FXir5x9bZXVv7UTqRRL9hMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;784&quot; height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/53ESc/btsL9bawjw6/Oylk0mU9NAskhcgMr4dHnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/53ESc/btsL9bawjw6/Oylk0mU9NAskhcgMr4dHnk/img.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;601&quot; data-is-animation=&quot;false&quot; style=&quot;width: 37.2269%;&quot; data-widthpercent=&quot;37.66&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/53ESc/btsL9bawjw6/Oylk0mU9NAskhcgMr4dHnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F53ESc%2FbtsL9bawjw6%2FOylk0mU9NAskhcgMr4dHnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;868&quot; height=&quot;601&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;좌측 사진은 digital output, 우측사진은 analog input&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;1113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn6Jsy/btsL9MuzTcC/Xb5JzrAUXywpDWimslMH30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn6Jsy/btsL9MuzTcC/Xb5JzrAUXywpDWimslMH30/img.png&quot; data-alt=&quot;변경 후의 사진&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn6Jsy/btsL9MuzTcC/Xb5JzrAUXywpDWimslMH30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn6Jsy%2FbtsL9MuzTcC%2FXb5JzrAUXywpDWimslMH30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1452&quot; height=&quot;1113&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;1113&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;변경 후의 사진&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 하드웨어와 연결할 것인지 여기서는 어떤 아두이노 보드와 연결할 것인지를 선택한다.(port number는 자동으로 찾는거 같다)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PHfWI/btsMaghCEas/bH089UWSsYziSkoyww2dbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PHfWI/btsMaghCEas/bH089UWSsYziSkoyww2dbK/img.png&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;881&quot; data-is-animation=&quot;false&quot; style=&quot;width: 57.9651%; margin-right: 10px;&quot; data-widthpercent=&quot;58.65&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PHfWI/btsMaghCEas/bH089UWSsYziSkoyww2dbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPHfWI%2FbtsMaghCEas%2FbH089UWSsYziSkoyww2dbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1576&quot; height=&quot;881&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcG0kW/btsMaBMzk23/nQNZVK30SjDUARW8l4Xwk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcG0kW/btsMaBMzk23/nQNZVK30SjDUARW8l4Xwk1/img.png&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;1056&quot; data-is-animation=&quot;false&quot; style=&quot;width: 40.8721%;&quot; data-widthpercent=&quot;41.35&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcG0kW/btsMaBMzk23/nQNZVK30SjDUARW8l4Xwk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcG0kW%2FbtsMaBMzk23%2FnQNZVK30SjDUARW8l4Xwk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1332&quot; height=&quot;1056&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;모델 설정에 들어가서 하드웨어 구현을 Arduino Uno로 변경해준다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;1020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c57Lye/btsL9PLwEjO/bQSxzjawmWxrgAROWYxF5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c57Lye/btsL9PLwEjO/bQSxzjawmWxrgAROWYxF5k/img.png&quot; data-alt=&quot;설정후 보여지는 hardware 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c57Lye/btsL9PLwEjO/bQSxzjawmWxrgAROWYxF5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc57Lye%2FbtsL9PLwEjO%2FbQSxzjawmWxrgAROWYxF5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1888&quot; height=&quot;1020&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;1020&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설정후 보여지는 hardware 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 Run on board를 누르고 Stop Time을 설정하고(inf으로 하면 계속 실행) Monitor &amp;amp; Tune을 누르면 아두이노에서 실행되어 led가 작동하는 것을 확인할 수 있다. 마지막은 실행 후 scope으로 보여지는 결과이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckq7tx/btsL8KxG6FZ/7UQgG7NkT7FJck5HKmklK0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckq7tx/btsL8KxG6FZ/7UQgG7NkT7FJck5HKmklK0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckq7tx/btsL8KxG6FZ/7UQgG7NkT7FJck5HKmklK0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ckq7tx/btsL8KxG6FZ/7UQgG7NkT7FJck5HKmklK0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;716&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;#크기 400의 의미&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 크기가 400인 pulse를 확인할 수 있다. 여기서 400이라는 숫자가 의미하는 것이 무엇일까??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아두이노는 10bit를 이용해서 크기를 표현한다. 즉 아두이노 보드의 5V를&amp;nbsp; 0~1023까지의 수를 표현하는 것이다. 그렇다면 400이라는 숫자는 5*400/1024=1.95=&amp;gt;2V의 전압이라는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결시 주의할 점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매트랩 작업공간에 아두이노 변수가 정의되어 있으면 안된다.&lt;/li&gt;
&lt;li&gt;아두이노 코드와 비슷하게 하나의 핀은 input/output 중 하나만 가능하다 즉 서로 다른 블록에 같은 pin number가 존재하면 안된다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>project</category>
      <author>fbc0314</author>
      <guid isPermaLink="true">https://fbc0314.tistory.com/17</guid>
      <comments>https://fbc0314.tistory.com/17#entry17comment</comments>
      <pubDate>Thu, 6 Feb 2025 11:04:25 +0900</pubDate>
    </item>
    <item>
      <title>2. Control</title>
      <link>https://fbc0314.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DC 모터의 open-loop 전달함수는 다음과 같이 표현된다.&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;code_1738632602080&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$J\ddot{\theta }+b\dot{\theta }=Ki$$
$$L\frac{di}{dt}+Ri=V-K\dot{\theta }$$
$$T(s)= \frac{\dot{\theta}(s)}{V(s)} = \frac{K}{(Ls+R)(Js+b)+K^2}$$&quot;&gt;$$J\ddot{\theta }+b\dot{\theta }=Ki$$ $$L\frac{di}{dt}+Ri=V-K\dot{\theta }$$ $$T(s)= \frac{\dot{\theta}(s)}{V(s)} = \frac{K}{(Ls+R)(Js+b)+K^2}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모터의 시스템을 이용해서 feedback loop를 만들고 아래의 성능을 충족시켜보자!!&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;settling time &amp;lt; 2sec&lt;/li&gt;
&lt;li&gt;overshoot &amp;lt; 5%&lt;/li&gt;
&lt;li&gt;staedy-state error &amp;lt; 1% (목표값은 1rad/s)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. PID&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1)Propertional control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kp=100인 pid controller를 아래의 매트랩 코드를 이용해서 결과를 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1738633024470&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;J=0.01;
b=0.1;
K=0.01;
R=1;
L=0.5;

s=tf('s');
P_motor=K/((J*s+b)*(L*s+R)+K^2)

Kp=100;
C=pid(Kp);
sys_cl=feedback(C*P_motor,1);

t=0:0.01:5;
step(sys_cl,t);
grid;
title(&quot;Step Response with Proportional Control&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HBFfY/btsL4XKswwG/kGQGSTlfJkCgjjLOkjjmdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HBFfY/btsL4XKswwG/kGQGSTlfJkCgjjLOkjjmdK/img.png&quot; data-alt=&quot;Kp=100일때 step response&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HBFfY/btsL4XKswwG/kGQGSTlfJkCgjjLOkjjmdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHBFfY%2FbtsL4XKswwG%2FkGQGSTlfJkCgjjLOkjjmdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;505&quot; height=&quot;449&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Kp=100일때 step response&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kp를 증가시키면 시스템이 빨라지고 steady-state error를 줄일 수 있지만 error를 완전히 제거하지 못하고 너무 크면 overhoot이 커질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 확인하기 위해서는 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;controlSystemDesigner(P_motor);의 명령어를 추가해서 보상기(compensator)를 변경하면서 바로바로 확인할 수 있다. 제어 시스템 디자이너 앱에서는 controller의 gain, pole, zero를 추가할 수 있으며 밑의 글에서 찾을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://fbc0314.tistory.com/8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://fbc0314.tistory.com/8&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738634459169&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Simulink Control&quot; data-og-description=&quot;해당 카테고리의 첫 글에서 우리는 두개의 기차 시스템을 모델링했고 아래 사진처럼 완성했다. 우리가 모델링한 것은 feedback system의 plant 부분이고 controller부분을 설계해서 원하는대로 동작하도&quot; data-og-host=&quot;fbc0314.tistory.com&quot; data-og-source-url=&quot;https://fbc0314.tistory.com/8&quot; data-og-url=&quot;https://fbc0314.tistory.com/8&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbSaNG/hyYb8qW5rA/tfKLYhuMICZVRMH08qfo71/img.png?width=800&amp;amp;height=611&amp;amp;face=0_0_800_611,https://scrap.kakaocdn.net/dn/bf1rL6/hyYcdFMZfu/aCmuf7OfCGTaklCSAB2ww0/img.png?width=800&amp;amp;height=611&amp;amp;face=0_0_800_611,https://scrap.kakaocdn.net/dn/NlCOX/hyYb9DpksF/HEIxlPUAkrpr3VrHuzEVFk/img.png?width=1105&amp;amp;height=922&amp;amp;face=0_0_1105_922&quot;&gt;&lt;a href=&quot;https://fbc0314.tistory.com/8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://fbc0314.tistory.com/8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbSaNG/hyYb8qW5rA/tfKLYhuMICZVRMH08qfo71/img.png?width=800&amp;amp;height=611&amp;amp;face=0_0_800_611,https://scrap.kakaocdn.net/dn/bf1rL6/hyYcdFMZfu/aCmuf7OfCGTaklCSAB2ww0/img.png?width=800&amp;amp;height=611&amp;amp;face=0_0_800_611,https://scrap.kakaocdn.net/dn/NlCOX/hyYb9DpksF/HEIxlPUAkrpr3VrHuzEVFk/img.png?width=1105&amp;amp;height=922&amp;amp;face=0_0_1105_922');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Simulink Control&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;해당 카테고리의 첫 글에서 우리는 두개의 기차 시스템을 모델링했고 아래 사진처럼 완성했다. 우리가 모델링한 것은 feedback system의 plant 부분이고 controller부분을 설계해서 원하는대로 동작하도&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fbc0314.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2)PID control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순하게 비례제어만을 사용해서는 우리가 원하는 성능을 만족시킬 수 없다. 따라서 적분제어를 추가해서 steady-state error를 줄이고 미분제을 추가해서 overshoot을 줄인다. 아래의 경우를 이용해서 결과를 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceX8Eo/btsL5M9e8t4/dlMMpMiGqjlKwY99SM8HGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceX8Eo/btsL5M9e8t4/dlMMpMiGqjlKwY99SM8HGK/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot; data-is-animation=&quot;false&quot; width=&quot;398&quot; height=&quot;354&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceX8Eo/btsL5M9e8t4/dlMMpMiGqjlKwY99SM8HGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceX8Eo%2FbtsL5M9e8t4%2FdlMMpMiGqjlKwY99SM8HGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sBs0E/btsL5tPBdg8/gJuXXCN4CLKIyWjIY0Dk8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sBs0E/btsL5tPBdg8/gJuXXCN4CLKIyWjIY0Dk8k/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot; data-is-animation=&quot;false&quot; width=&quot;391&quot; height=&quot;348&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sBs0E/btsL5tPBdg8/gJuXXCN4CLKIyWjIY0Dk8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsBs0E%2FbtsL5tPBdg8%2FgJuXXCN4CLKIyWjIY0Dk8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;왼쪽 사진은 Kp=100, Ki=1, Kd=1이고 오른쪽 사진은 Kp=100, Ki=200, Kd=1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqzf5x/btsL6kkkRxX/x9XsfTIY81GpQyLQU4Qdw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqzf5x/btsL6kkkRxX/x9XsfTIY81GpQyLQU4Qdw0/img.png&quot; data-alt=&quot;Kp=100, Ki=200, Kd=10&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqzf5x/btsL6kkkRxX/x9XsfTIY81GpQyLQU4Qdw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqzf5x%2FbtsL6kkkRxX%2Fx9XsfTIY81GpQyLQU4Qdw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;440&quot; height=&quot;392&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Kp=100, Ki=200, Kd=10&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 첫번째 경우 시뮬레이션 시간을 200초로 길게 만들 때만 결과를 제대로 확인할 수 있다. steady-state error의 값은 0에 가까워지지만 너무 오래걸린다. Ki의 값이 너무 작아서 이러한 현상이 나타난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해서 Ki를 200으로 변경한 경우가 두번째이다. steady-state error가 빠르게 줄어들었지만 overshoot이 크게 발생하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 overshoot을 줄이기 위해서 Kd를 10으로 설정하였고 처음에 목표한 성능을 만족했음을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Root Locus&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근궤적은 open-loop pole/zero를 이용해서 gain k의 값에 따라 달라지는 closed-loop pole의 위치를 확인할 수 있는 그래프이다. 아래 코드를 통해서 DC 모터에서의 근궤적을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1738649450205&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;J=0.01;
b=0.1;
K=0.01;
R=1;
L=0.5;

s=tf('s');
P_motor=K/((J*s+b)*(L*s+R)+K^2)
controlSystemDesigner('rlocus',P_motor);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nMGEL/btsL6zPttEb/cG2u9T8uvhR8wlfZHKOdf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nMGEL/btsL6zPttEb/cG2u9T8uvhR8wlfZHKOdf0/img.png&quot; data-alt=&quot;코드 실행시 나오는 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nMGEL/btsL6zPttEb/cG2u9T8uvhR8wlfZHKOdf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnMGEL%2FbtsL6zPttEb%2FcG2u9T8uvhR8wlfZHKOdf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;423&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;코드 실행시 나오는 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 화면에 나오고 근궤적 화면을 우클릭 후에 grid를 누르며 위와 같이 점선이 생긴다. controller를 통해서 pole과 zero를 추가하고 우리가 원하는 closed-loop pole을 갖도록 근궤적을 만들어야 한다. 시스템의 closed-loop pole의 위치는 transient response를 결정한다.(steady-state response는 시스템의 type이 결정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1)transient response&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근궤적에서 overshoot는 5%이하, settling time은 2초 이하의 성능을 만족하는 영역을 확인하기 위해서 근궤적을 우클릭 후에 설계요구사항-&amp;gt;새로만들기를 클릭한다. 여기서 정착시간(settling time), 백분율 오버슈트(percent overshoot), 감쇠비(damping ratio), 고유주파수(natural frequency) 등의 범위를 설정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ylwxB/btsL6BT6bOT/xxF4l4k3vYQKl6QeZtW0k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ylwxB/btsL6BT6bOT/xxF4l4k3vYQKl6QeZtW0k1/img.png&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;925&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.1532%; margin-right: 10px;&quot; data-widthpercent=&quot;50.74&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ylwxB/btsL6BT6bOT/xxF4l4k3vYQKl6QeZtW0k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FylwxB%2FbtsL6BT6bOT%2FxxF4l4k3vYQKl6QeZtW0k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;655&quot; height=&quot;925&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc3OCv/btsL53cFGiI/uTlZFPyPymjAiuTo2y6lFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc3OCv/btsL53cFGiI/uTlZFPyPymjAiuTo2y6lFk/img.png&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;918&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.684%;&quot; data-widthpercent=&quot;49.26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc3OCv/btsL53cFGiI/uTlZFPyPymjAiuTo2y6lFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc3OCv%2FbtsL53cFGiI%2FuTlZFPyPymjAiuTo2y6lFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;918&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;오른쪽은 overshoot&amp;lt;5%의 조건, 왼쪽은 settling time&amp;lt;2초의 조건 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원점의 두개의 반직선이 허수축과 이루는 각도가 커질수록 damping ratio가 커지고 허용하는 overshoot은 감소한다.&lt;/li&gt;
&lt;li&gt;수직의 선이 원점에서 멀어질 수록 settling time은 감소한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 두 closed-loop pole(핑크색 상자)는 애매하지만 두 경우를 모두 만족시키는 위치에 존재한다. 따라서 해당 시스템의 transient response는 위의 조건을 만족하고 위쪽의 step response에서도 만족하는 것을 확인할 수 있다. 이때의 gain은 좌측 탭에서 Controllers and Fixed Blocks-&amp;gt;C를 클릭으로 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5MBav/btsL6sJPcdB/pkAPgyY5kmFxStDAi1JLz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5MBav/btsL6sJPcdB/pkAPgyY5kmFxStDAi1JLz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5MBav/btsL6sJPcdB/pkAPgyY5kmFxStDAi1JLz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5MBav%2FbtsL6sJPcdB%2FpkAPgyY5kmFxStDAi1JLz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;637&quot; height=&quot;426&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 핑크상자를 이동시켰다. gain은 9.1임을 확인할 수 있고 overshoot는 없고 settling time 또한 1초쯤 되는 것을 확인할 수 있다. 하지만 steady-state값이 0.47로 steady-state error가 크다. error를 줄이기 위해서 우리는 lag controller를 사용할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2)steady-state response&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lag compensator를 이용하면 steady-state error를 줄일 수 있지만 잘못 만들면 settling time이 너무 길어질 수 있다. 먼저 아래의 lag compensator를 이용해보자.&lt;/p&gt;
&lt;div id=&quot;code_1738654068725&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$C(s)=\frac{(s+1)}{(s+0.01)}$$&quot;&gt;$$C(s)=\frac{(s+1)}{(s+0.01)}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pole과 zero가 비슷한 위치에 있어 transientr response에는 영향을 주지 않지만 그 둘의 비만큼 error가 줄어들게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 lag compensator를 추가해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제어시스템-&amp;gt;기본설정에서 옵셥 보상기 형식을 영점/극점/이득으로 변경한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lWCUi/btsL5NVmtBE/oQVYw996KZbvYkEI1MUEOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lWCUi/btsL5NVmtBE/oQVYw996KZbvYkEI1MUEOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lWCUi/btsL5NVmtBE/oQVYw996KZbvYkEI1MUEOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlWCUi%2FbtsL5NVmtBE%2FoQVYw996KZbvYkEI1MUEOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;409&quot; height=&quot;350&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 근궤적 그래프에서 우클릭 후에 보상기 편집으로 가서 극점-영점 부분을 다시 우클릭해서 지상(lag compensator)를 선택해서 아래와 같이 추가한다. 영점은 -1, 극점은 -0.01으로 설&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNghvU/btsL7zaaM3o/Gj0ka1ys5G5iIGoa8BRCN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNghvU/btsL7zaaM3o/Gj0ka1ys5G5iIGoa8BRCN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNghvU/btsL7zaaM3o/Gj0ka1ys5G5iIGoa8BRCN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNghvU%2FbtsL7zaaM3o%2FGj0ka1ys5G5iIGoa8BRCN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;367&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 확인해보자!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPXpya/btsL6SnR2e6/COtF02d9sKtyk7LTMdsXAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPXpya/btsL6SnR2e6/COtF02d9sKtyk7LTMdsXAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPXpya/btsL6SnR2e6/COtF02d9sKtyk7LTMdsXAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPXpya%2FbtsL6SnR2e6%2FCOtF02d9sKtyk7LTMdsXAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;1192&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;overshoot는 거의 없고 steady-statet error로 보이지 않지만 settling timedl 3.18초로 너무 길다. 여기서 이상한 것이 있다. 위에서 핑크색 상자가 overshoot의 제한을 나타내는 선에 가까이 있지만 overshoot이 나타나지 않았다. 그 이유는 위의 기준은 2차 시스템에 맞춰서 있기 때문이다. 우리는 실수의 closed-loop pole이 하나더 존재한다. 이는 다른 pole보다 오래 살아남아 settling time을 길게 하고&amp;nbsp; overshoot이 없도록 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더이상 2차 시스템이 아니기 때문에 주어진 범위를 벗어나도 된다. 좀더 gain을 늘려서 시스템을 빠르게 만들어보자. 조금 찾아보면 아래와 같은 경우가 나온다. overshoot는 2.17%, settling time은 1.95초, steady-state error는 정확하지는 않지만 1%이내이다. 이처럼 제어기를 설계하기 위해서는 Trial and error의 과정이 필요하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xVBKd/btsL7hgxaFj/DLlAHeNGxIjweyW3fsVx8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xVBKd/btsL7hgxaFj/DLlAHeNGxIjweyW3fsVx8K/img.png&quot; data-alt=&quot;원하는 성능을 만족하는 제어기와 그 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xVBKd/btsL7hgxaFj/DLlAHeNGxIjweyW3fsVx8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxVBKd%2FbtsL7hgxaFj%2FDLlAHeNGxIjweyW3fsVx8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;1192&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원하는 성능을 만족하는 제어기와 그 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gain까지 추가한 controller의 전달함수는 아래처럼 정리된다.&lt;/p&gt;
&lt;div id=&quot;code_1739244872409&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$C(s)=\frac{44(s+1)}{(s+0.01)}$$&quot;&gt;$$C(s)=\frac{44(s+1)}{(s+0.01)}$$&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Frequency&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;frequency를 이용해서 디자인하기 위해서는 open-loop 전달함수의 bode plot이 핵심이다. 시스템에 controller를 추가하면 open-loop bode plot이 달라지고 결국 closed-loop response도 변하게 된다. 아래 코드를 통해서 DC motor의 open-loop 전달함수의 bode plot을 확인해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1738722133189&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;J=0.01;
b=0.1;
K=0.01;
R=1;
L=0.5;

s=tf('s');
P_motor=K/((J*s+b)*(L*s+R)+K^2)
% controlSystemDesigner('rlocus',P_motor);

bode(P_motor);
grid;
title('Bode Plot of the Original Plant');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ew54z/btsL7yo8IES/RDUCiQ799nPCVB3jegUYfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ew54z/btsL7yo8IES/RDUCiQ799nPCVB3jegUYfk/img.png&quot; data-alt=&quot;bode plot&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ew54z/btsL7yo8IES/RDUCiQ799nPCVB3jegUYfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEw54z%2FbtsL7yo8IES%2FRDUCiQ799nPCVB3jegUYfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;443&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;bode plot&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그래프를 따르면 gain margin과 phase margin은 무한대이다. 주파수에 값에 관계없이 크기는 0dB이하이고 위상은 -180도 이상이라는 것을 의미한. 이렇게 크기가 모두 0dB이하이면 시스템은 reference signal을 따라갈 수 없다.(모든 주파수에서 신호를 작게한다.) 즉 시스템이 너무 안정적이여서 입력신호 존재해도 출력신호 생기지 않는다. 우리는 gain을 증가시켜서 시스템이 적절한 phase margin을 갖도록 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;phase margin은 60도인것이 적절하다. 위의 그래프에서 대략 10rad/s에서 크기가 0dB여야한다. 그러면 먼저 10rad/s에서 크기를 알아야 한다. 아래 명령어를 통해서 확인해보자!!&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f7; color: #000000; text-align: justify;&quot;&gt;&lt;code&gt;[mag,phase,w] = bode(P_motor,10)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크기는 0.0138이고 위상은 -123.6도이다. 20log(0.0138)=-37.2dB로 10rad/s에서 크기가 0이면 우리는 56.4도의 phase margin을 갖게 된다. gain을 추가해서 bode plotd의 크기가 위로 37.2dB올라가게 만들면 된다.&lt;/p&gt;
&lt;div id=&quot;code_1738723382638&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$20log(K)=37.2$$
$$k=10^(\frac{37.2}{20})=72.4$$
&quot;&gt;$$20log(K)=37.2$$ $$k=10^(\frac{37.2}{20})=72.4$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gain을 72로 해서 bode plot을 다시 확인해보자!!&lt;/p&gt;
&lt;pre id=&quot;code_1738723459190&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;J=0.01;
b=0.1;
K=0.01;
R=1;
L=0.5;

s=tf('s');
P_motor=K/((J*s+b)*(L*s+R)+K^2)
% controlSystemDesigner('rlocus',P_motor);

C=72;
margin(C*P_motor);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tk8F9/btsL6JLMTqe/hwji4I5l7GKxZ0EGnqcnq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tk8F9/btsL6JLMTqe/hwji4I5l7GKxZ0EGnqcnq0/img.png&quot; data-alt=&quot;gain이 72일때의 bode plot&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tk8F9/btsL6JLMTqe/hwji4I5l7GKxZ0EGnqcnq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftk8F9%2FbtsL6JLMTqe%2Fhwji4I5l7GKxZ0EGnqcnq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;473&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gain이 72일때의 bode plot&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리의 목표과 같이 phase margin이 56.4로 대략 60임을 확인할 수 있다.이때의 &amp;nbsp;closed loop response는 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRcWPo/btsL7fwLXzE/Weeo2FZ5STUNlw1Xte74Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRcWPo/btsL7fwLXzE/Weeo2FZ5STUNlw1Xte74Lk/img.png&quot; data-alt=&quot;gain이 72일때 closed-loop response 결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRcWPo/btsL7fwLXzE/Weeo2FZ5STUNlw1Xte74Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRcWPo%2FbtsL7fwLXzE%2FWeeo2FZ5STUNlw1Xte74Lk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;441&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gain이 72일때 closed-loop response 결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;settling time은 충분하지만 overshoot과 steady-state error가 너무 크다. overshoot은 gain을 줄여서 phase margin을 크게 함으로 줄어들게 만들 수 있지만 그러면 steady-state error는 더 커지게 된다. 이를 해결하기 위해 lag compensator를 이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lag compensator를 추가하면 gain을 줄이고 steady-state error도 작게 만들 수 있다. 아래의 compensator를 추가해보자&lt;/p&gt;
&lt;div id=&quot;code_1738732138358&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$C(s)=\frac{(s+1)}{(s+0.01)}$$&quot;&gt;$$C(s)=\frac{(s+1)}{(s+0.01)}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gain을 45로 하고 결과를 확인하면 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci4QWn/btsL6UNpqjA/GHLkZ0LZWpxvkdEE3tYkKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci4QWn/btsL6UNpqjA/GHLkZ0LZWpxvkdEE3tYkKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci4QWn/btsL6UNpqjA/GHLkZ0LZWpxvkdEE3tYkKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci4QWn%2FbtsL6UNpqjA%2FGHLkZ0LZWpxvkdEE3tYkKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;509&quot; height=&quot;453&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;settling time은 조금 길어졌지만 overshoot이 줄어들고 steady-state error 또한 줄어들었다. 위의 결과는 처음에 만족하고자 했던 모든 성능을 만족시킨다.&lt;/p&gt;</description>
      <category>control tutorials/motor speed</category>
      <author>fbc0314</author>
      <guid isPermaLink="true">https://fbc0314.tistory.com/16</guid>
      <comments>https://fbc0314.tistory.com/16#entry16comment</comments>
      <pubDate>Tue, 4 Feb 2025 11:18:10 +0900</pubDate>
    </item>
    <item>
      <title>1. System modeling</title>
      <link>https://fbc0314.tistory.com/15</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DC 모터에서 input을 전압(voltage), output을 회전속도(rotational speed)로 시스템을 만들어보자. 모터에 대한 이해가 필요한데 핵심적인 것은 아래와 같다(나중에 정리하는 것이 목표..)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모터에서 만들어지는 토크는 회전자에 흐르는 전류(&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;armature current) i에 비례한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;모터의 회전에 의해 공급전압과 반대방향의 유도전압이 만들어지는데 이를 역기전력(Back EMF)라고 하고 모터의 회전속도에 비례한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위를 식으로 나타내면 아래와 같다.&lt;/p&gt;
&lt;div id=&quot;code_1738563547884&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$T=K_{t}i$$
$$e=K_{e} \dot{\theta}$$&quot;&gt;$$T=K_{t}i$$ $$e=K_{e} \dot{\theta}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 kt=ke라고 한다. 따라서 우리는 둘다 k를 이용해서 표현할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 식을 이용해서 뉴텬의 제2법칙과 Kirchhoff's voltage law(폐회로에소 모든 전압변화의 합은 0)을 나타내면 아래처럼 표현된다.&lt;/p&gt;
&lt;div id=&quot;code_1738563852189&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$J\ddot{\theta }=Ki-b\dot{\theta }$$
$$L\frac{di}{dt}+Ri=V-K\dot{\theta }$$&quot;&gt;$$J\ddot{\theta }=Ki-b\dot{\theta }$$ $$L\frac{di}{dt}+Ri=V-K\dot{\theta }$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Transfer Function&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 위의 식에 라플라스 변환을 적용하고 전압이 input, 회전속도가 output인 전달함수를 구해보자!!&lt;/p&gt;
&lt;div id=&quot;code_1738566155868&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$(Js^{s}+bs)\theta (s)=KI(s) $$
$$(Ls+R)I(s)=V(s)-Ks \theta(s)$$
&quot;&gt;$$(Js^{s}+bs)\theta (s)=KI(s) $$ $$(Ls+R)I(s)=V(s)-Ks \theta(s)$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두개의 식에서 I(s)를 제거하고 전달함수를 구하면 아래과 같다.&lt;/p&gt;
&lt;div id=&quot;code_1738566568686&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$(Ls+R) \frac{Js^{2}+bs}{K}\theta (s)=V(s)-Ks\theta (s)$$
$$\frac{\theta (s)}{V(s)}=\frac{1}{(Ls+R) \frac{Js^{2}+bs}{K}+Ks}=\frac{K}{(Ls+R)(Js+b)s+K^2s}$$
$$T(s)= \frac{\dot{\theta}(s)}{V(s)} = \frac{s\theta(s)}{V(s)}=\frac{K}{(Ls+R)(Js+b)+K^2}$$

&quot;&gt;$$(Ls+R) \frac{Js^{2}+bs}{K}\theta (s)=V(s)-Ks\theta (s)$$ $$\frac{\theta (s)}{V(s)}=\frac{1}{(Ls+R) \frac{Js^{2}+bs}{K}+Ks}=\frac{K}{(Ls+R)(Js+b)s+K^2s}$$ $$T(s)= \frac{\dot{\theta}(s)}{V(s)} = \frac{s\theta(s)}{V(s)}=\frac{K}{(Ls+R)(Js+b)+K^2}$$&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;J : moment of inertia of the rotor&lt;/li&gt;
&lt;li&gt;b :&amp;nbsp; motor viscous friction constant&lt;/li&gt;
&lt;li&gt;K : electromotive force constant&amp;nbsp; and motor torque constant&lt;/li&gt;
&lt;li&gt;R : electric resistance&lt;/li&gt;
&lt;li&gt;L : electric induction&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매트랩에서는 아래의 코드를 이용해서 전달함수를 정의한다.&lt;/p&gt;
&lt;pre id=&quot;code_1738568670700&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;J=0.01;
b=0.1;
K=0.1;
R=1;
L=0.5;

s=tf('s');
P_motor=K/((J*s+b)*(L*s+R)+K^2)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2)State-Space&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회전속도와 전류를 state variables로 설정한다. 전달함수에서와 동일하게 input은 전압 V이고 output은 회전속도이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;state-space는 아래와 같이 표현된다.&lt;/p&gt;
&lt;div id=&quot;code_1738568393458&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$\frac{d}{dt}\begin{bmatrix}
\dot{\theta } \\ i
\end{bmatrix} = \begin{bmatrix}
-\frac{b}{j} &amp;amp; \frac{K}{J}  \\
-\frac{K}{L} &amp;amp; -\frac{R}{L}  \\
\end{bmatrix} \begin{bmatrix}
\dot{\theta } \\ i
\end{bmatrix}+\begin{bmatrix}
0 \\ \frac{1}{L}
\end{bmatrix}V$$
$$ y=[1\ 0]\begin{bmatrix}
\dot{\theta } \\ i
\end{bmatrix}$$&quot;&gt;$$\frac{d}{dt}\begin{bmatrix} \dot{\theta } \\ i \end{bmatrix} = \begin{bmatrix} -\frac{b}{j} &amp;amp; \frac{K}{J} \\ -\frac{K}{L} &amp;amp; -\frac{R}{L} \\ \end{bmatrix} \begin{bmatrix} \dot{\theta } \\ i \end{bmatrix}+\begin{bmatrix} 0 \\ \frac{1}{L} \end{bmatrix}V$$ $$ y=[1\ 0]\begin{bmatrix} \dot{\theta } \\ i \end{bmatrix}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매트랩에서는 아래의 코드를 이용해서 state-space를 정의한다.&lt;/p&gt;
&lt;pre id=&quot;code_1738568718514&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A = [-b/J   K/J
    -K/L   -R/L];
B = [0
    1/L];
C = [1   0];
D = 0;
motor_ss = ss(A,B,C,D)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 아래처럼 ss()함수를 이용해서 전달함수를 바로 state-space로 변경 가능하다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot; style=&quot;background-color: #f7f7f7; color: #000000; text-align: justify;&quot;&gt;&lt;code&gt;motor_ss = ss(P_motor);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리의 제어목표는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;settling time &amp;lt; 2 sec&lt;/li&gt;
&lt;li&gt;overshoot &amp;lt; 5%&lt;/li&gt;
&lt;li&gt;steady-state error &amp;lt; 1% (목표값은 1rad/s)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. system analysis&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 코드를 통해서 위의 시스템에 unit step input이 작용했을 때 결과를 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1738569662178&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;J=0.01;
b=0.1;
K=0.01;
R=1;
L=0.5;

s=tf('s');
P_motor=K/((J*s+b)*(L*s+R)+K^2)
linearSystemAnalyzer('step', P_motor, 0:0.1:5);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 아래 사진과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;769&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1fPtL/btsL5zBYhjT/PjViRMmFkKQkkVzrzIURT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1fPtL/btsL5zBYhjT/PjViRMmFkKQkkVzrzIURT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1fPtL/btsL5zBYhjT/PjViRMmFkKQkkVzrzIURT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1fPtL%2FbtsL5zBYhjT%2FPjViRMmFkKQkkVzrzIURT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;518&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;769&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;steady-state 값은 0.1, settling time은 2.07초로 우리가 목표로 하는 성능에 비해 부족하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막에 추가한 명령어는 Linear system analyzer를 호출하고 이는 매트랩 앱 탭에서도 확인 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 우클릭 후에 plot Type -&amp;gt; pole/zero를 선택해서 pole/zero의 위치를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;769&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pRTwY/btsL4QEjem5/5gnaeYpoozCd6m4umc63U1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pRTwY/btsL4QEjem5/5gnaeYpoozCd6m4umc63U1/img.png&quot; data-alt=&quot;pole의 위치를 보여준다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pRTwY/btsL4QEjem5/5gnaeYpoozCd6m4umc63U1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpRTwY%2FbtsL4QEjem5%2F5gnaeYpoozCd6m4umc63U1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;473&quot; height=&quot;431&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;769&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pole의 위치를 보여준다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pole은 -2와 -10에 위치한다. 둘다 복소수가 아닌 실수이기 때문에 step response에 oscilation이나 overshoot이 없다. 또한 하나의 pole(-10)이 다른 pole(-2)에 비해서 차이가 많이 나기 때문에 S=-2의 pole이 시스템의 특성을 결정하는 dominant pole이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-2만을 pole로 갖는 1차 시스템 또한 비슷한 결과는 갖는데 아래를 통해 확인 가능하다. 먼저 rP_motor=0.1/(0.5*s+1)을 통해서 1차 시스템을 추가한다. 선형시스템 분석기에서 파일-&amp;gt;가져오기를 통해서 rP_motor전달함수를 가져오고 범례또한 위쪽의 아이콘을 클릭해서 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eazUle/btsL6kK7XjM/o85BX3tR22mk04QhYNSDFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eazUle/btsL6kK7XjM/o85BX3tR22mk04QhYNSDFk/img.png&quot; data-alt=&quot;2차 시스템과 1차 시스템&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eazUle/btsL6kK7XjM/o85BX3tR22mk04QhYNSDFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeazUle%2FbtsL6kK7XjM%2Fo85BX3tR22mk04QhYNSDFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;446&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2차 시스템과 1차 시스템&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사진을 통해서 2차시스템과 1차시스템은 비슷하다는 것을 알 수 있다. 차이가 나는 곳은 T=0부분인데 2차시스템은 이때의 기울기가 0이고 1차시스템은 0이 아니다. 2차 시스템은 관성이 존재해서 즉각적으로 반응하지 않지만 1차시스템은 은 관성이 존재하지 않아 즉각적으로 반응하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>control tutorials/motor speed</category>
      <author>fbc0314</author>
      <guid isPermaLink="true">https://fbc0314.tistory.com/15</guid>
      <comments>https://fbc0314.tistory.com/15#entry15comment</comments>
      <pubDate>Mon, 3 Feb 2025 17:40:27 +0900</pubDate>
    </item>
    <item>
      <title>3. Simulink modeling</title>
      <link>https://fbc0314.tistory.com/14</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Modeling&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 cruise control system에서 회전 저항과 공기저항이 자동차의 속도에 비례한다고 가정하면 system은 아래와 같이 간단한 식으로 표현된다.(mass-damper system)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;code_1738108866433&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$m \dot{v}=u-bv$$
$$m=1000kg$$
$$b=50Nsec/m$$
$$u=500N$$&quot;&gt;$$m \dot{v}=u-bv$$ $$m=1000kg$$ $$b=50Nsec/m$$ $$u=500N$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 식을 simulink로 표현하면 아래처럼 그리면 된다. m, b, u(step input의 값)은 위의 식의 갑과 동일하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1473&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LASNF/btsL4H0AERY/Pa5fxfJIcsDkOjx2Q1vKE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LASNF/btsL4H0AERY/Pa5fxfJIcsDkOjx2Q1vKE0/img.png&quot; data-alt=&quot;simulink에서의 cruise control&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LASNF/btsL4H0AERY/Pa5fxfJIcsDkOjx2Q1vKE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLASNF%2FbtsL4H0AERY%2FPa5fxfJIcsDkOjx2Q1vKE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1473&quot; height=&quot;609&quot; data-origin-width=&quot;1473&quot; data-origin-height=&quot;609&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;simulink에서의 cruise control&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시뮬레이션 시간을 120초로 하고 실행하면 아래와 같은 결과를 확인할 수 있다. 시뮬레이션 시간은 시뮬레이션 탭에서 중지시간 또는 모델설정 앱에서 변경할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OJzZN/btsL2QYIK0j/QHOIkKZrHAs0g42Sc2hxc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OJzZN/btsL2QYIK0j/QHOIkKZrHAs0g42Sc2hxc0/img.png&quot; data-alt=&quot;시뮬레이션 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OJzZN/btsL2QYIK0j/QHOIkKZrHAs0g42Sc2hxc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOJzZN%2FbtsL2QYIK0j%2FQHOIkKZrHAs0g42Sc2hxc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;546&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시뮬레이션 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;120초 후에는 10m/s를 유지한다. 최종적으로&amp;nbsp; 10m/s 되는 것을 여러 방법을 통해 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1)미분방정식 풀기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간이 걸리지만 가장 간단한 방법이다. 위의 미방을 풀어보자. 초기값인 v(0)=0이고 라플라스 변환을 이용해서 해결해보자.&lt;/p&gt;
&lt;div id=&quot;code_1738315245057&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$u-bv=m \dot{v}$$
$$500-50v=1000 \dot{v}$$
$$1000 \dot{v}+50v=500$$
$$Laplace\ Transform$$
$$1000(sV(s)-v(0))+50V(s)= \frac{500}{s}$$
$$(20s+1)V(s)=\frac{10}{s}$$
$$V(s)= \frac{10}{s*(20s+1)}= \frac{10}{s} - \frac{200}{20s+1}$$
$$Inverse\ Laplace\ Transform$$
$$v(t)=10-10e^{- \frac{1}{20} t}$$&quot;&gt;$$u-bv=m \dot{v}$$ $$500-50v=1000 \dot{v}$$ $$1000 \dot{v}+50v=500$$ $$Laplace\ Transform$$ $$1000(sV(s)-v(0))+50V(s)= \frac{500}{s}$$ $$(20s+1)V(s)=\frac{10}{s}$$ $$V(s)= \frac{10}{s*(20s+1)}= \frac{10}{s} - \frac{200}{20s+1}$$ $$Inverse\ Laplace\ Transform$$ $$v(t)=10-10e^{- \frac{1}{20} t}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간이 흐르면 10에 수렴함을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2)DC gain 이용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DC gain은 step input이 작용할 때 steady-state 값과 step input의 비를 나타내고 아래의 식처럼 전달함수에 s=0을 대입해서 얻을 수 있다.&lt;/p&gt;
&lt;div id=&quot;code_1738316133335&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$DC\ Gain\ = \displaystyle \lim_{s \to 0}G(s)$$&quot;&gt;$$DC\ Gain\ = \displaystyle \lim_{s \to 0}G(s)$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cruise system의 전달함수를 구하고 DC gain을 구해보자!!&lt;/p&gt;
&lt;div id=&quot;code_1738316344516&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$u-bv=m \dot{v}$$
$$U(s)-bV(s)=m(sV(s)-v(0))$$
$$U(s)=(ms+b)V(s)$$
$$\frac{V(s)}{U(s)}= \frac{1}{ms+b}= \frac{1}{1000s+50}$$
$$ \displaystyle \lim_{s \to 0}G(s)= \displaystyle \lim_{s \to 0} \frac{V(s)}{U(s)}= \displaystyle \lim_{s \to 0} \frac{1}{1000s+50}= \frac{1}{50}$$
&quot;&gt;$$u-bv=m \dot{v}$$ $$U(s)-bV(s)=m(sV(s)-v(0))$$ $$U(s)=(ms+b)V(s)$$ $$\frac{V(s)}{U(s)}= \frac{1}{ms+b}= \frac{1}{1000s+50}$$ $$ \displaystyle \lim_{s \to 0}G(s)= \displaystyle \lim_{s \to 0} \frac{V(s)}{U(s)}= \displaystyle \lim_{s \to 0} \frac{1}{1000s+50}= \frac{1}{50}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DC gain은 1/50이다. 따라서 500N의 input이 주어지면 500*(1/50)=10이 되어서 최종값을 10m/s가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3)최종값 정리(Final value theorem)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 DC gain과 비슷하다. 식으로 나타내면 아래와 같다.&lt;/p&gt;
&lt;div id=&quot;code_1738316591342&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$y(\infty )=\displaystyle \lim_{t \to \infty }y(t)=\displaystyle \lim_{s \to 0}sY(s)$$&quot;&gt;$$y(\infty )=\displaystyle \lim_{t \to \infty }y(t)=\displaystyle \lim_{s \to 0}sY(s)$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 DC gain과 헷갈리는 부분은 DC gain에서 G(s)는 시스템의 전달함수이고 최종값 정리에서 Y(s)는 미분방정식에 라플라스 변환을 하고 식을 정리한 것이다. 즉 G(s)*(1/s)는 unit step input이 적용된 것이고 Y(s)는 원래 시스템의 step input이 그대로 적용된 것으로 DC gain은 비율이 되고&amp;nbsp; 최종값 정리는 steady-state 값이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cruise system에 적용해보자!!&lt;/p&gt;
&lt;div id=&quot;code_1738316990701&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$V(s)= \frac{10}{s(20s+1)}$$
$$\displaystyle \lim_{s \to 0}s \frac{10}{s(20s+1)}=10$$&quot;&gt;$$V(s)= \frac{10}{s(20s+1)}$$ $$\displaystyle \lim_{s \to 0}s \frac{10}{s(20s+1)}=10$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종값 정리를 이용해도 결과적으로 steady-state 값은 10m/s가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#참고&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로 헷갈렸던 부분이다. 위의 결과를 open-loop response라고 하는데 block diagram은 feedback loop처럼 보인다. 처음에는 오류인가 생각했지만 이유는 단순하다. 위의 시스템은 open-loop가 맞다. 원하는 값과 센서로 측정한 값을 비교하여 제어에 목적이 있는 것이 아닌 그냥 힘이 작용하고 수식을 표현하기 위한 것이다. 따라서 open-loop system으로 그냥 힘이 system에 작용하고 그 결과 속도가 output으로 나오게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Control&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 만든 open-loop의 cruise control system을 이용해서 feedback controller를 simulink에서 만들어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 만들었던 모델에서 scope을 Out1으로 step을 In1의 블록으로 교체한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1209&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LLoDc/btsL3ouo1F7/6x3T6N1HtPk6bQuwOcOfh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LLoDc/btsL3ouo1F7/6x3T6N1HtPk6bQuwOcOfh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LLoDc/btsL3ouo1F7/6x3T6N1HtPk6bQuwOcOfh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLLoDc%2FbtsL3ouo1F7%2F6x3T6N1HtPk6bQuwOcOfh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;710&quot; height=&quot;293&quot; data-origin-width=&quot;1209&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 파일을 cruise.slx로 저장하고 아래 명령어를 명령창에 실행하면 위의 linaer model을 matlab으로 가져올 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;linmod()함수는 simulink 모델의 선형화를 수행하여 상태공간(state-space)의 선형 시스템 모델을 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1738451455853&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m = 1000;
b = 50;
u = 500;
[A,B,C,D] = linmod('cruise')
cruise_ss = ss(A,B,C,D);
step(u*cruise_ss);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 실행하면 500N의 힘이 가해졌을 때 자동차의 속도가 그래프로 표현되는데 이전에 확인한 것처럼 10m/s로 속도가 수렴하는 것을 확인할 수 있다. 즉 simulink의 모델을 matlab으로 그대로 가져온 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1)PI control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 모델과 PI controller를 이용해서 제어기를 디자인 해보자. 제일 먼저 subsystem의 블록에 cruise system을 넣어서 간단하게 표현해야 한다. 이는 아래의 두가지 방법으로 만들어질 수 있고 순서의 차이만 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템을 모두 선택해서(Ctrl+a) 선택항목을 서브시스템으로 만들수 있다.(Ctrl+g)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;새로운 모델 파일을 열고 서브시스템 블록을 가져온 후 해당 블록을 더블클랙해서 들어가고 이전에 만들었던 모델을 복사붙여넣기 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crRKaW/btsL4PRV6KO/guCpaALxFhpVB8GhZcQgC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crRKaW/btsL4PRV6KO/guCpaALxFhpVB8GhZcQgC1/img.png&quot; data-alt=&quot;만들어진 subsystem&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crRKaW/btsL4PRV6KO/guCpaALxFhpVB8GhZcQgC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrRKaW%2FbtsL4PRV6KO%2FguCpaALxFhpVB8GhZcQgC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1474&quot; height=&quot;334&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;만들어진 subsystem&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 PI control 블록을 추가하고 feedback제어 시스템을 만들어보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1345&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cz6acX/btsL25aZV9G/5aZemGL6ZiAAUimI2L3Sv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cz6acX/btsL25aZV9G/5aZemGL6ZiAAUimI2L3Sv1/img.png&quot; data-alt=&quot;pid 블록없이 표현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cz6acX/btsL25aZV9G/5aZemGL6ZiAAUimI2L3Sv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcz6acX%2FbtsL25aZV9G%2F5aZemGL6ZiAAUimI2L3Sv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1345&quot; height=&quot;450&quot; data-origin-width=&quot;1345&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pid 블록없이 표현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bquxTJ/btsL3YoF2mt/K3EstgAAUDd5zkxoT3dTW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bquxTJ/btsL3YoF2mt/K3EstgAAUDd5zkxoT3dTW0/img.png&quot; data-alt=&quot;pid 블록을 사용해서 표현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bquxTJ/btsL3YoF2mt/K3EstgAAUDd5zkxoT3dTW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbquxTJ%2FbtsL3YoF2mt%2FK3EstgAAUDd5zkxoT3dTW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1336&quot; height=&quot;364&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pid 블록을 사용해서 표현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Transfer Fcn 블록을 사용해서 Kp+Ki/s를 넣어주는 방법도 존재한다. 여러가지 방법을 사용해서 만들 수 있다. 차이는 없고 표현을 간단하게 만든것이다.&amp;nbsp; Kp값은 800, Ki값은 40, reference 값을 10으로 해서 결과를 확인해보자. 여기에서 step 블록은 우리가 목표로 하는 속도값인 reference value를 나타내며 이전에 open-loop에서 작용한 힘과는 의미하는 것이 다르다(처음에 이게 헷갈렸는데 나만 그럴지도...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시뮬레이션 시간을 10초로 두고 결과를 확인하면 아래처럼 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dd0M6i/btsL4Guac3B/toYYcmJWchkGwsEGNYtg2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dd0M6i/btsL4Guac3B/toYYcmJWchkGwsEGNYtg2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dd0M6i/btsL4Guac3B/toYYcmJWchkGwsEGNYtg2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdd0M6i%2FbtsL4Guac3B%2FtoYYcmJWchkGwsEGNYtg2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;525&quot; height=&quot;468&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kp값을 통해 시스템을 더 빠르게 만들 수 있고 Ki를 통해서 steady-state error를 줄였다. 우리가 원하는 성능과 물리적 한계를 고려해서 각 계수를 설정하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. simscape&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;simulink와 simscape 에드온이 설치되어 있어야 하는데 설치되지 않았다면 아래를 참고해서 미리 설치하고 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://fbc0314.tistory.com/9&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://fbc0314.tistory.com/9&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738462539767&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Simscape&quot; data-og-description=&quot;1. Simscape와 Simulink지금까지 우리는 simulink를 사용해서 시스템을 모델링하고 원하는 조건을 성립하도록 제어기를 설계하고 시뮬레이션 하는 방법을 해보았다. Simscape도 Simulink와 비슷한 목적을 가&quot; data-og-host=&quot;fbc0314.tistory.com&quot; data-og-source-url=&quot;https://fbc0314.tistory.com/9&quot; data-og-url=&quot;https://fbc0314.tistory.com/9&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHYpmh/hyYb7kYoT9/sSRSPbCKR2iDThoTUy6xQ0/img.png?width=800&amp;amp;height=518&amp;amp;face=0_0_800_518,https://scrap.kakaocdn.net/dn/v9tQ3/hyYb51Lj9U/dkV67z3c2cZBXsdCBXdaE0/img.png?width=800&amp;amp;height=518&amp;amp;face=0_0_800_518,https://scrap.kakaocdn.net/dn/csIKgL/hyYb6zBgrt/EK7gvJEvSqK8WvI4JulSSk/img.png?width=1158&amp;amp;height=564&amp;amp;face=0_0_1158_564&quot;&gt;&lt;a href=&quot;https://fbc0314.tistory.com/9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://fbc0314.tistory.com/9&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHYpmh/hyYb7kYoT9/sSRSPbCKR2iDThoTUy6xQ0/img.png?width=800&amp;amp;height=518&amp;amp;face=0_0_800_518,https://scrap.kakaocdn.net/dn/v9tQ3/hyYb51Lj9U/dkV67z3c2cZBXsdCBXdaE0/img.png?width=800&amp;amp;height=518&amp;amp;face=0_0_800_518,https://scrap.kakaocdn.net/dn/csIKgL/hyYb6zBgrt/EK7gvJEvSqK8WvI4JulSSk/img.png?width=1158&amp;amp;height=564&amp;amp;face=0_0_1158_564');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Simscape&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. Simscape와 Simulink지금까지 우리는 simulink를 사용해서 시스템을 모델링하고 원하는 조건을 성립하도록 제어기를 설계하고 시뮬레이션 하는 방법을 해보았다. Simscape도 Simulink와 비슷한 목적을 가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;fbc0314.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아래의 에드온을 추가로 설치한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1924&quot; data-origin-height=&quot;1246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kuutz/btsL37y11sR/KApzq3vb3zJVq5kkbeKgPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kuutz/btsL37y11sR/KApzq3vb3zJVq5kkbeKgPk/img.png&quot; data-alt=&quot;simscape multibody&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kuutz/btsL37y11sR/KApzq3vb3zJVq5kkbeKgPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKuutz%2FbtsL37y11sR%2FKApzq3vb3zJVq5kkbeKgPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;738&quot; height=&quot;478&quot; data-origin-width=&quot;1924&quot; data-origin-height=&quot;1246&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;simscape multibody&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;scc_new : &lt;b&gt;simscape 실행&lt;/b&gt;, 전기, 기계, 유압, 열 등 다양한 물리적 시스템을 블록 기반으로 모델링하는 툴박스&lt;/li&gt;
&lt;li&gt;smnew : &lt;b&gt;simscape multibody 실행&lt;/b&gt;, 3D 다물체(강체) 시스템을 모델링하고 동역학 해석을 수행하는 툴박스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;simscape multibody는 simscape와 비슷하지만 로봇, 자동차 서스펜션 등의 다물체 시스템에 적합하다고 이해하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;smnew 명령어를 명령창에 실행하면 아래와 같은 화면이 나온다. simscape와는 조금 다른 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1506&quot; data-origin-height=&quot;1105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhqy5b/btsL4FovIiU/dcv60TLvumwRW4eyogukp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhqy5b/btsL4FovIiU/dcv60TLvumwRW4eyogukp1/img.png&quot; data-alt=&quot;simscape 처음화면(각각의 이름 보이게)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhqy5b/btsL4FovIiU/dcv60TLvumwRW4eyogukp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhqy5b%2FbtsL4FovIiU%2Fdcv60TLvumwRW4eyogukp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1506&quot; height=&quot;1105&quot; data-origin-width=&quot;1506&quot; data-origin-height=&quot;1105&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;simscape 처음화면(각각의 이름 보이게)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PS-Simulink와 Simulink-PS는 각각 simulink와 simscape의 경계를 의미한다.&lt;/li&gt;
&lt;li&gt;Mechanism Configuratioin은 중력의 크기과 방향을 설정할 수 있고 [0 0 -9.81]은 -z축 방향으로 중력이 작용함을 의미한다.&lt;/li&gt;
&lt;li&gt;Solver Configuration의 Use local solver를 끄면 전체 솔버와 일관성을 유지하면서 시뮬레이션 가능(??)&lt;/li&gt;
&lt;li&gt;ctrl+e를 통해서 구성파라미터 화면을 열 수 있고 시뮬레이션 시간, 솔버 유형 등을 선택할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;1)Prismatic Joint&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한방향으로만 직선운동(translation motion)을 허용하는 조인트로 슬라이더나 피스톤 같은 기계요소를 모델링할때 사용한다. 기본적으로는 z축을 따라 운동하도록 설정되어 있고 축을 변경하거나 이동범위를 설정할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;B 포트 : &lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: start;&quot;&gt;Base frame of the joint block&lt;/span&gt; , 기준이 되는 프레임&lt;/li&gt;
&lt;li&gt;F 포트 : &lt;span style=&quot;background-color: #ffffff; color: #212121; text-align: start;&quot;&gt;Follower frame of the joint block, &lt;/span&gt;&amp;nbsp;조인트를 따라 이동하는 물체&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prismatic joint 블록을 두번 클릭하고 아래처럼 설정한다. Internal Mechanics -&amp;gt; damping coefficient는 50, Actuation-&amp;gt;Force는 provided by input, Sensing에서 Position, velocity 체크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;891&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ua8oe/btsL37FWoXr/sbmLbfopgBoJiBgva2wibK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ua8oe/btsL37FWoXr/sbmLbfopgBoJiBgva2wibK/img.png&quot; data-alt=&quot;cruise control를 구현하기 위한 prismatic joint의 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ua8oe/btsL37FWoXr/sbmLbfopgBoJiBgva2wibK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUa8oe%2FbtsL37FWoXr%2FsbmLbfopgBoJiBgva2wibK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;497&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;891&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cruise control를 구현하기 위한 prismatic joint의 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4kJnE/btsL4Xo1PuH/9XwsMWE3NFiLRsN5WKYksk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4kJnE/btsL4Xo1PuH/9XwsMWE3NFiLRsN5WKYksk/img.png&quot; data-origin-width=&quot;187&quot; data-origin-height=&quot;141&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.7814%; margin-right: 10px;&quot; data-widthpercent=&quot;46.32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4kJnE/btsL4Xo1PuH/9XwsMWE3NFiLRsN5WKYksk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4kJnE%2FbtsL4Xo1PuH%2F9XwsMWE3NFiLRsN5WKYksk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;187&quot; height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lnmim/btsL37FWrYC/J9foGWP6HPk5x0bGgvqkyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lnmim/btsL37FWrYC/J9foGWP6HPk5x0bGgvqkyK/img.png&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;568&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.0558%;&quot; data-widthpercent=&quot;53.68&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lnmim/btsL37FWrYC/J9foGWP6HPk5x0bGgvqkyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLnmim%2FbtsL37FWrYC%2FJ9foGWP6HPk5x0bGgvqkyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;873&quot; height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;왼쪽 사진은 설정 후의 prismatic joint 블록, 오른쪽 사진을 각각을 연결한 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B포트와 F포트는 이전에 설명한 가장 기본적은 포트이고 Force를 provided by input으로 해서 f가 seinsing에서 position과 velocity를 체크해서 p와 v 포트가 생겼다. 즉 f는 z축 방향으로 작용하는 힘을 연결하고 p는 위치를 나타내고 v는 속도를 나타낸다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나하나 연결하면서 필요한 설정을 추가해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2)Rigid Transform&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두개의 좌표축 사이의 공간적인 관계를 rotation과 translation으로 나타내준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;primatic joint는 z축 방향으로 운동하기 때문에 우리는 world 좌표계를 y축 기준 90도 회전시켜 결과적으로 물체의 좌표계의 z축이 world 좌표계의 x축이 되어서 물체가 x축의 방향으로 이동하도록 만든다. rigid transform 블록을 더블클릭 후에 아래와 같이 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3QYO8/btsL3QYO9YS/Xbpn1cNUQUp0LS1CLkB1SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3QYO8/btsL3QYO9YS/Xbpn1cNUQUp0LS1CLkB1SK/img.png&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;591&quot; data-is-animation=&quot;false&quot; width=&quot;606&quot; height=&quot;360&quot; style=&quot;width: 50.9463%; margin-right: 10px;&quot; data-widthpercent=&quot;51.55&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3QYO8/btsL3QYO9YS/Xbpn1cNUQUp0LS1CLkB1SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3QYO8%2FbtsL3QYO9YS%2FXbpn1cNUQUp0LS1CLkB1SK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;994&quot; height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE4Ow4/btsL3pmWizy/zZazZUkkX1QJKxHYF4aUbK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE4Ow4/btsL3pmWizy/zZazZUkkX1QJKxHYF4aUbK/img.gif&quot; data-is-animation=&quot;true&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;506&quot; data-filename=&quot;ezgif.com-video-to-gif-converter (5).gif&quot; style=&quot;width: 47.8909%;&quot; data-widthpercent=&quot;48.45&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE4Ow4/btsL3pmWizy/zZazZUkkX1QJKxHYF4aUbK/img.gif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE4Ow4%2FbtsL3pmWizy%2FzZazZUkkX1QJKxHYF4aUbK%2Fimg.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Rigid Transform 설정와 y축 기준으로 회전한 좌표계 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;rigid transform블록의 F포트를 primatic joint의 B포트에 연결하고 &amp;nbsp;rigid transform블록의 B포트 world frame의 w포트에 연결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3)Brick Solid&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Brick Solid 블록은 기하학적 중심(geometry center)이 기준 좌표계의 원점과 일치하는 프리즘 형태의 형상이며, 각 평면(면)은 기준 좌표계의 X, Y, Z축에 수직이라고 한다. 쉽게 말해서 자동차라는 물체를 표현하기 위해 직육면체를 가져온 것이다. 아래와 같이 크기와 질량을 설정할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HNfPP/btsL3RDzaWA/rWuhPHoEEEkKHKqo2oHSO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HNfPP/btsL3RDzaWA/rWuhPHoEEEkKHKqo2oHSO0/img.png&quot; data-alt=&quot;brick solid 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HNfPP/btsL3RDzaWA/rWuhPHoEEEkKHKqo2oHSO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHNfPP%2FbtsL3RDzaWA%2FrWuhPHoEEEkKHKqo2oHSO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;447&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;brick solid 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만든 brick solid는 prismatic joint의 F포트에 연결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4)step, scope&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작용하는 힘을 표현하기 위해 step 블록과 위치와 속도를 확인하기 위해 scope 블록을 이용한다. 해당 블록은 simulink의 블록이기 때문에 변환해주는 과정이 필요하다. step 블록에는 simulink-ps converter(input signal unit은 N으로 설정)을 연결하고 이를 primatic joint의 f포트에 연결한다. scope은 ps-simulink convertor(output signal unit은 m와 m/s로 설정)에 연결하고 이를 primatic joint의 p와 v에 연결한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step 블록에서 스텝시간은 0, 최종값을 500으로 설정하고 scope의 결과를 확인하면 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnD99s/btsL5ZNfItB/xc60aO6WSRKQAT307DSTa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnD99s/btsL5ZNfItB/xc60aO6WSRKQAT307DSTa1/img.png&quot; data-alt=&quot;위치와 속도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnD99s/btsL5ZNfItB/xc60aO6WSRKQAT307DSTa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnD99s%2FbtsL5ZNfItB%2Fxc60aO6WSRKQAT307DSTa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;496&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위치와 속도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRIh3y/btsL30tynCM/ENKXpALhnphDfG1kSl18O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRIh3y/btsL30tynCM/ENKXpALhnphDfG1kSl18O0/img.png&quot; data-alt=&quot;최종적인 simscape multibody&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRIh3y/btsL30tynCM/ENKXpALhnphDfG1kSl18O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRIh3y%2FbtsL30tynCM%2FENKXpALhnphDfG1kSl18O0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;873&quot; height=&quot;568&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최종적인 simscape multibody&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 위에서 만든 자동차를 subsystem으로 간단하게 만들고 controller를 디자인 해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brXVnd/btsL3APlAkb/uGLqnpIWUYrFVVOEKaPz20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brXVnd/btsL3APlAkb/uGLqnpIWUYrFVVOEKaPz20/img.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;598&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.1785%; margin-right: 10px;&quot; data-widthpercent=&quot;49.76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brXVnd/btsL3APlAkb/uGLqnpIWUYrFVVOEKaPz20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrXVnd%2FbtsL3APlAkb%2FuGLqnpIWUYrFVVOEKaPz20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1018&quot; height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qJ3k6/btsL4bVTV1K/Oejkv18cPWZobSY315Dy31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qJ3k6/btsL4bVTV1K/Oejkv18cPWZobSY315Dy31/img.png&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;580&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.6587%;&quot; data-widthpercent=&quot;50.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qJ3k6/btsL4bVTV1K/Oejkv18cPWZobSY315Dy31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqJ3k6%2FbtsL4bVTV1K%2FOejkv18cPWZobSY315Dy31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;997&quot; height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;step과 scope 블록을 제외한 블록 선택후 ctrl+g한 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 step, subtract, pid controller, manual switch 블록을 추가해서 아래와 같은 pid 제어기가 추가된 feedback loop를 만들어준다. manual switch를 바꾸면 open-loop response를 확인할 수 있다. kp의 값은 800, ki의 값은 40으로 설정한다. reference input인 step은 10으로 설정해 목표값을 10m/s로 만든다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2l96y/btsL5Djnlo0/GiBNalCmMtpKkggga8axn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2l96y/btsL5Djnlo0/GiBNalCmMtpKkggga8axn1/img.png&quot; data-alt=&quot;feedback loop control&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2l96y/btsL5Djnlo0/GiBNalCmMtpKkggga8axn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2l96y%2FbtsL5Djnlo0%2FGiBNalCmMtpKkggga8axn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1108&quot; height=&quot;352&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;feedback loop control&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;속도의 결과는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PKGB4/btsL5uthP6q/1QiewA8UqESsBoCdG22zg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PKGB4/btsL5uthP6q/1QiewA8UqESsBoCdG22zg1/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PKGB4/btsL5uthP6q/1QiewA8UqESsBoCdG22zg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPKGB4%2FbtsL5uthP6q%2F1QiewA8UqESsBoCdG22zg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p3MOo/btsL4G81xJq/T48VeiX1SH9mPkGPEa9lSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p3MOo/btsL4G81xJq/T48VeiX1SH9mPkGPEa9lSK/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p3MOo/btsL4G81xJq/T48VeiX1SH9mPkGPEa9lSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp3MOo%2FbtsL4G81xJq%2FT48VeiX1SH9mPkGPEa9lSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;왼쪽은 control system(feedback) response, 오른쪽은 open-loop response&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>control tutorials/cruise control</category>
      <author>fbc0314</author>
      <guid isPermaLink="true">https://fbc0314.tistory.com/14</guid>
      <comments>https://fbc0314.tistory.com/14#entry14comment</comments>
      <pubDate>Wed, 29 Jan 2025 09:03:22 +0900</pubDate>
    </item>
    <item>
      <title>2. Control</title>
      <link>https://fbc0314.tistory.com/13</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. system model과 원하는 조건&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cruise control 문제의 전달함수는 아래와 같다.&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;code_1737524681691&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$T(s)=\frac{V(s)}{U(s)}=\frac{1}{ms+b}$$
$$vehicle\ mass(m)\ :\ 1000kg$$
$$damping\ coefficient\ :\ 50Ns/m$$
$$reference\ speed\ :\ 10m/s$$&quot;&gt;$$T(s)=\frac{V(s)}{U(s)}=\frac{1}{ms+b}$$ $$vehicle\ mass(m)\ :\ 1000kg$$ $$damping\ coefficient\ :\ 50Ns/m$$ $$reference\ speed\ :\ 10m/s$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 자동차가 10m/s을 유지하도록 제어기를 설계해야 한다. 또한 rise time &amp;lt; 5s, Overshoot&amp;lt;10%, Steady-state error&amp;lt;2%의 조건도 만족시켜야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;open-loop system에서 500N의 힘을 가하면 10m/s의 steady-state 값을 갖는다. open-loop에서는 시스템에 그대로 적용되기 때문에 input이 힘이지만 closed-loop system에서는 제어기를 한번 거치고&amp;nbsp; feed back도 존재하는 시스템에 적용되기 때문에 input은 목표속도이다.&amp;nbsp;정리하면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;open-loop 시스템 : 입력은 힘, 출력은 속도이고 시스템에 직접적인 힘을 가해서 속도를 생성한다.&lt;/li&gt;
&lt;li&gt;closed-loop 시스템 : 입력은 목표 속도, 출력은 실제 속도이고 제어기는 목표속도와 실제속도의 차이를 기반으로 힘을 생성하여 시스템에 입력한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.PID 제어기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pid제어기의 전달함수는 이전과 같이 tf()함수를 사용하거나 pid(Kp, Ki, Kd)의 함수를 사용하면 된다. pid제어기를 사용한 feedback 시스템을 매트랩으로 만들고 P제어기와 PI제어기의 영향을 확인해보자!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1)Proportioinal Control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비례제어만을 사용한다면 pid제어기의 전달함수는 C=Kp이다. 이를 적용해서 closed-loop system의 전달함수를 구하면 아래와 같다.&lt;/p&gt;
&lt;div id=&quot;code_1737525165394&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$T(s)=\frac{Y(s)}{R(s)}=\frac{G(s)C(s)}{1+G(s)C(s)}=\frac{Kp}{ms+b+Kp}$$&quot;&gt;$$T(s)=\frac{Y(s)}{R(s)}=\frac{G(s)C(s)}{1+G(s)C(s)}=\frac{Kp}{ms+b+Kp}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비례제어는 steady-state error를 줄여주고 시스템을 빠르게 만들지만 steady-state error를 완전히 없애지는 못한다. 매트랩 코드를 통해서 결과를 확인해보자. tf_cruise는 시스템의 전달함수, C는 pid제어기의 전달함수, T는 전체 feedback system의 전달함수이고 step(r*T)는 T의 시스템에 크기가 r(10)인 step input이 작용할 때 결과를 보여준다.&lt;/p&gt;
&lt;pre id=&quot;code_1737526733034&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b]);

Kp=100;
C=pid(Kp);

T=feedback(C*tf_cruise,1);

step(r*T);
axis([0 50 0 10]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceY46p/btsLVxLCKvD/8vlgAis0kaNgxedEpjQ22K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceY46p/btsLVxLCKvD/8vlgAis0kaNgxedEpjQ22K/img.png&quot; data-alt=&quot;Kp=100인 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceY46p/btsLVxLCKvD/8vlgAis0kaNgxedEpjQ22K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceY46p%2FbtsLVxLCKvD%2F8vlgAis0kaNgxedEpjQ22K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;442&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Kp=100인 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;steady-state error와 rise time을 줄여야 한다. Kp의 값을 5000으로 늘리고 그 결과를 확인해 보자!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nnbVA/btsLV8YN9V0/zwvK8UItEk30MbZTAEkjV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nnbVA/btsLV8YN9V0/zwvK8UItEk30MbZTAEkjV1/img.png&quot; data-alt=&quot;Kp=5000의 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nnbVA/btsLV8YN9V0/zwvK8UItEk30MbZTAEkjV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnnbVA%2FbtsLV8YN9V0%2FzwvK8UItEk30MbZTAEkjV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;478&quot; height=&quot;425&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Kp=5000의 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;steady-state error는 거의 없어지고 rise time은 0.5로 매우 짧다. 하지만 자동차의 속도를 0에서 10m/s까지 0.5초 이내에 줄이는 것은 물리적 한계로 불가능하다. 이를 Actuator limitation이라고 하고 제어공학에서 자주 나타나는 문제이다. 따라서 제어기를 설계할 때는 이러한 부분 또한 고려해야 한다. 위 문제를 해결하기 위해서는 적당한 proportional gain Kp를 설정하고 integral controler를 추가해서 steady-state error를 제거해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2)Proportional-Integral Control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비례제어와 적분제어를 사용하면 pid 제어기의 전달함수는 C=Kp+Ki/s이다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이를 적용해서 closed-loop system의 전달함수를 구하면 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;code_1737529546101&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$T(s)=\frac{Y(s)}{R(s)}=\frac{G(s)C(s)}{1+G(s)C(s)}=\frac{KpS+Ki}{ms^{2}+(b+Kp)s+Ki}$$&quot;&gt;$$T(s)=\frac{Y(s)}{R(s)}=\frac{G(s)C(s)}{1+G(s)C(s)}=\frac{KpS+Ki}{ms^{2}+(b+Kp)s+Ki}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적분제어를 추가하면 steady-state error를 줄일 수 있다. Kp는 600, Ki는 1로 설정하고 아래의 코드를 통해서 결과를 확인하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737531332410&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b]);

Kp=600;
Ki=1;
C=pid(Kp);

T=feedback(C*tf_cruise,1);

step(r*T);
axis([0 50 0 12]);​&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cijBoa/btsLVjmHEv6/HHLB7DT9CzUkIXBIyBUfvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cijBoa/btsLVjmHEv6/HHLB7DT9CzUkIXBIyBUfvk/img.png&quot; data-alt=&quot;Kp=600, Ki=1의 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cijBoa/btsLVjmHEv6/HHLB7DT9CzUkIXBIyBUfvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcijBoa%2FbtsLVjmHEv6%2FHHLB7DT9CzUkIXBIyBUfvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;511&quot; height=&quot;455&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Kp=600, Ki=1의 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;integral gain의 경우 너무 크면 unstable한 결과가 나올 수 있으므로 작은값부터 천천히 늘리는 것이 좋다. 아래는 Kp는 800, Ki는 40의 결과이다. steady-state error는 없어졌고 rise time도 5초 이내이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgn9NX/btsLVNHxyUq/JVPvJu1fX5gCbXQo6cai0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgn9NX/btsLVNHxyUq/JVPvJu1fX5gCbXQo6cai0k/img.png&quot; data-alt=&quot;Kp=800, Ki=40의 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgn9NX/btsLVNHxyUq/JVPvJu1fX5gCbXQo6cai0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgn9NX%2FbtsLVNHxyUq%2FJVPvJu1fX5gCbXQo6cai0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;458&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Kp=800, Ki=40의 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Root Locus&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root locus는 gain이 0부터 무한대로 변화할 때 가능한 closed-loop pole의 위치를 나타낸 그래프이다. open-loop pole을 이용하는데 gain이 0일 때 closed-loop pole은 open-loop pole의 pole이고 gain이 무한대일 때 closed-loop pole은 open-loop의 zero이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pid에서 Kp만 고려한다고 생각해도 된다. closed-loop 전달함수는 아래와 같이 표현된다.&lt;/p&gt;
&lt;div id=&quot;code_1737601770894&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$\frac{Y(s)}{R(s)}=\frac{K_{p}}{ms+(b+K_{p})}$$&quot;&gt;$$\frac{Y(s)}{R(s)}=\frac{K_{p}}{ms+(b+K_{p})}$$&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1)transient response&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 성능 목표는 Rise time &amp;lt; 5s, Overshoot &amp;lt; 10%, Steady-state error &amp;lt; 2%이다. 이를 통해서 고유진동수와 dampin ratio의 범위를 구할 수 있다.&lt;/p&gt;
&lt;div id=&quot;code_1737602519887&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$Rise\ time\ :\ T_{r}=\frac{1.8}{w_{n}}$$
$$w_{n} \geq \frac{1.8}{T_{r}}$$
$$w_{n} \geq \frac{1.8}{5}=0.36$$ 
$$OverShoot\ :\ e^{-\zeta \frac{\pi}{\sqrt{1-\zeta ^{2}}}} *100$$
$$\zeta \geq \sqrt{ \frac{ln^{2}(M_{p})}{\pi^2+ln^2(M_p)}}$$
$$\zeta \geq \sqrt{ \frac{ln^{2}(0.1)}{\pi^2+ln^2(0.1)}}=0.59$$&quot;&gt;$$Rise\ time\ :\ T_{r}=\frac{1.8}{w_{n}}$$ $$w_{n} \geq \frac{1.8}{T_{r}}$$ $$w_{n} \geq \frac{1.8}{5}=0.36$$ $$OverShoot\ :\ e^{-\zeta \frac{\pi}{\sqrt{1-\zeta ^{2}}}} *100$$ $$\zeta \geq \sqrt{ \frac{ln^{2}(M_{p})}{\pi^2+ln^2(M_p)}}$$ $$\zeta \geq \sqrt{ \frac{ln^{2}(0.1)}{\pi^2+ln^2(0.1)}}=0.59$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능을 만족하기 위해서는 고유진동수는 0.36이상, damping ration는 0.6이상이여야 한다. 매트랩의 sgrid()함수를 사용해서 만족하는 범위의 근궤적을 나타낼 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1737616097641&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b]);

rlocus(tf_cruise);
axis([-0.6 0 -0.6 0.6]);
sgrid(0.6,0.36);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOaUPI/btsLYb2jbl2/mY2RsmlbWM05QUoNVN3L20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOaUPI/btsLYb2jbl2/mY2RsmlbWM05QUoNVN3L20/img.png&quot; data-alt=&quot;근궤적과 만족하는 경계 표현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOaUPI/btsLYb2jbl2/mY2RsmlbWM05QUoNVN3L20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOaUPI%2FbtsLYb2jbl2%2FmY2RsmlbWM05QUoNVN3L20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;489&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;근궤적과 만족하는 경계 표현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고유진동수가 0.36이상이라는 것은 0.36이 표시된 호의 바깥쪽에 pole이 있어야 함을 의미하고 damping ratio가 0.6이상이라는 것은 0.6으로 표시된 두 직선 사이에 pole이 있어야 한다는 것을 의미한다. rlocfind()함수를 추가하면 원하는 위치를 클릭해서 해당 위치에서 가장 가까운 근궤적 위의 pole을 선택하고 이를 통해서 gain값과 pole의 값을 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;[Kp,poles]=rlocfind(tf_cruise)을 마지막에 추가한다 )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나온 값인 Kp=350으로 feedback system의 step response를 확인해보면 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1737618130623&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b]);

Kp=350;
tf=feedback(Kp*tf_cruise,1)
step(r*tf);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dE0hyK/btsLZnglsn6/x7KYg16yFtB3Ldqg5OZIGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dE0hyK/btsLZnglsn6/x7KYg16yFtB3Ldqg5OZIGK/img.png&quot; data-alt=&quot;Kp=350일 때 step response&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dE0hyK/btsLZnglsn6/x7KYg16yFtB3Ldqg5OZIGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdE0hyK%2FbtsLZnglsn6%2Fx7KYg16yFtB3Ldqg5OZIGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;490&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Kp=350일 때 step response&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rise time은 대략 5초이고 overshoot은 거의 없는 것으로 보인다. transient response의 조건은 만족하지만 steady-state error는 좀더 줄여야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2)steady-state response&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;transient resonse의 조건을 만족시켰으니 steady-state error를 줄여서 steady-state response의 조건을 만족시켜보자. 여기서는 Lag controller를 사용한다. Lag controller는 원점 근처에 pole과 zero를 추가해서 근궤적에 변화를 주지는 않지만 그 두 값의 비율만큼 steady-state error가 줄어들도록 하는 역할을 한다. 원점 근처에 존재하면 pole과 zero의 위치는 가깝지만 그 둘의 비율을 크게 만들어서 steady-state error를 줄일 수 있다. 아래는 lag controller의 전달함수이다.&lt;/p&gt;
&lt;div id=&quot;code_1737620534899&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$C(s)=\frac{s+z_0}{s+p_0}$$&quot;&gt;$$C(s)=\frac{s+z_0}{s+p_0}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kp와 lag controller를 포함해서 closed-loop 전달함수를 구하면 아래와 같다.&lt;/p&gt;
&lt;div id=&quot;code_1737620922468&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$T(s)=\frac{Y(s)}{U(s)}=\frac{K_pC(s)G(s)}{1+K_pC(s)G(s)}=\frac{K_p \frac{s+z_0}{s+p_0} \frac{1}{ms+b}}{1+K_p \frac{s+z_0}{s+p_0} \frac{1}{ms+b}}$$
$$T(s)=\frac{K_p s+K_p z_0}{m s^2+(b+m p_0 +K_p)s+(bp_0+K_p z_0)}$$
&quot;&gt;$$T(s)=\frac{Y(s)}{U(s)}=\frac{K_pC(s)G(s)}{1+K_pC(s)G(s)}=\frac{K_p \frac{s+z_0}{s+p_0} \frac{1}{ms+b}}{1+K_p \frac{s+z_0}{s+p_0} \frac{1}{ms+b}}$$ $$T(s)=\frac{K_p s+K_p z_0}{m s^2+(b+m p_0 +K_p)s+(bp_0+K_p z_0)}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;z0은 0.3, p0은 0.03으로 하면 둘은 가까이 있으므로 근궤적은 변화가 없고&amp;nbsp; z0/p0은 1/10이므로 steady-state error는 1/10으로 줄어든다. 다음을 실행시켜서 적절한 Kp의 값을 구한다.&lt;/p&gt;
&lt;pre id=&quot;code_1737625270136&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b])

z0=0.3;
p0=0.03;
C_lag=tf([1,z0],[1,p0]);

rlocus(C_lag*tf_cruise);
axis([-0.6 0 -0.6 0.6]);
sgrid(0.6,0.36);
[Kp,poles]=rlocfind(C_lag*tf_cruise)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kp를 1286.2라고 하고 step response를 구해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1737625421103&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b])

z0=0.3;
p0=0.03;
C_lag=tf([1,z0],[1,p0]);

kp=1286.2;
tf=feedback(kp*C_lag*tf_cruise,1);
step(r*tf);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bumige/btsLYEpKUnA/QNiiR0RC5utV6HzMaYCcM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bumige/btsLYEpKUnA/QNiiR0RC5utV6HzMaYCcM1/img.png&quot; data-alt=&quot;lag compensator를 추가하고 Kp=1286.2일 때의 step response&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bumige/btsLYEpKUnA/QNiiR0RC5utV6HzMaYCcM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbumige%2FbtsLYEpKUnA%2FQNiiR0RC5utV6HzMaYCcM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;503&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;lag compensator를 추가하고 Kp=1286.2일 때의 step response&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 보면 steady-state error는 거의 0으로 줄어들었다. zero가 추가되면서 overshoot이 생겼지만 transient response에서 요구하는 rise time&amp;lt;5s와 overshoot&amp;lt;10%는 그대로 만족한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Frequency&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;frequency response의 크기와 위상차를 각각 나타낸 것이 bode plot이다. 이러한 bode plot은 open-loop system이 stable한 경우 사용할 수 있다. 위의 시스템의 경우 open-loop pole이 모두 LHP에 있으므로 stable하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 코드를 이용해서 bode diagram을 그리면 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1737626935860&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m=1000;
b=50;
r=10;

tf_cruise=tf([1],[m,b]);
bode(tf_cruise);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8FQDT/btsLXPFnHSV/8Dk5ECkPYyE8f8DLyjRNJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8FQDT/btsLXPFnHSV/8Dk5ECkPYyE8f8DLyjRNJk/img.png&quot; data-alt=&quot;bode diagram&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8FQDT/btsLXPFnHSV/8Dk5ECkPYyE8f8DLyjRNJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8FQDT%2FbtsLXPFnHSV%2F8Dk5ECkPYyE8f8DLyjRNJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;505&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;bode diagram&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1)Gain k&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 시스템은 type0이고 steady-state error는 아래처럼 표현된다.&lt;/p&gt;
&lt;div id=&quot;code_1737627625645&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$e_{step}(\infty ) = \frac{1}{1+\displaystyle \lim_{s \to 0}GH}=\frac{1}{1+K_p}$$&quot;&gt;$$e_{step}(\infty ) = \frac{1}{1+\displaystyle \lim_{s \to 0}GH}=\frac{1}{1+K_p}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Kp의 값은 bode diagram에서 주파수가 0일때의 크기와 같다. 위의 그래프에서 Kp의 값은 대략 -34dB=10^(-34/20)=0.02가 되고 steady-state error는 1/(1+0.02)*100=98%가 된다. step response를 확인해보면 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1737627877818&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m=1000;
b=50;
r=10;

kp=1;
tf_cruise=tf([kp],[m,b]);
tf=feedback(tf_cruise,1);
step(r*tf);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/myG2y/btsLYed1iin/JNlK5m2D3vmZclUyjm5kTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/myG2y/btsLYed1iin/JNlK5m2D3vmZclUyjm5kTK/img.png&quot; data-alt=&quot;step response 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/myG2y/btsLYed1iin/JNlK5m2D3vmZclUyjm5kTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmyG2y%2FbtsLYed1iin%2FJNlK5m2D3vmZclUyjm5kTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;459&quot; height=&quot;408&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;step response 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과에서 steady-state error를 확인해보면 (10-0.2)/10*100=98%로 동일하게 나온다. 정리하면 steady state error를 줄이기 위해서는 주파수가 0일때의 bode diagram의 크기를 변경해야 하는데 이는 gain인 Kp의 값을 조절하면 된다. gain의 값이 변하면 bode diagram은 위아래로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 주파수가 0일 때의 bode diagram의 크기는 어떤 값이 되어야 하는가??&lt;/p&gt;
&lt;div id=&quot;code_1737628297305&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$steady-state\ error\ &amp;lt;\ 2%$$
$$\frac{1}{1+k_p}&amp;lt;0.02$$
$$k_p&amp;gt;49=33.8dB$$
&quot;&gt;$$steady-state\ error\ &amp;lt;\ 2%$$ $$\frac{1}{1+k_p}&amp;lt;0.02$$ $$k_p&amp;gt;49=33.8dB$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;33.8dB가 되어야 한다. 현재 주파수가 0일 때 크기는 -34dB이므로 Kp&amp;gt;(34dB+33.8dB)=67.8dB=2455여야 한다. Kp의 값을 2455로 해서 bode diagram과 step response를 확인하면 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y1nA9/btsLW44ickz/V1gL8g9Rj8gqAiK0bMvDf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y1nA9/btsLW44ickz/V1gL8g9Rj8gqAiK0bMvDf1/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y1nA9/btsLW44ickz/V1gL8g9Rj8gqAiK0bMvDf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy1nA9%2FbtsLW44ickz%2FV1gL8g9Rj8gqAiK0bMvDf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg23kO/btsLYu14aT2/QHQkwD7GJdlCM26raYeD91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg23kO/btsLYu14aT2/QHQkwD7GJdlCM26raYeD91/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg23kO/btsLYu14aT2/QHQkwD7GJdlCM26raYeD91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg23kO%2FbtsLYu14aT2%2FQHQkwD7GJdlCM26raYeD91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;왼쪽은 bode diagram, 오른쪽은 step response&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;steady-state error는 0이 되었지만 2초만에 자동차가 10m/s의 속도에 도달했다. 이는 Actuator limitation으로 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2)steady-state response(lag compensator)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 설명했던 것처럼 lag compensator를 이용해서 원점 근처에 pole과 zero를 추가하면 근궤적에는 영향을 주지 않으면서 steady-state error는 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-0.02에 pole, 0.1에 zero을 추가하고 gain kp는 1000으로 했을 때의 bode diagram과 step response를 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IPWY6/btsLZFBp5Ca/zkaZWLe2i3A4E1QgSbFvn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IPWY6/btsLZFBp5Ca/zkaZWLe2i3A4E1QgSbFvn0/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IPWY6/btsLZFBp5Ca/zkaZWLe2i3A4E1QgSbFvn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIPWY6%2FbtsLZFBp5Ca%2FzkaZWLe2i3A4E1QgSbFvn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbjGss/btsLYF3cdH8/ENljUvzstMqm27EZwGiog0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbjGss/btsLYF3cdH8/ENljUvzstMqm27EZwGiog0/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbjGss/btsLYF3cdH8/ENljUvzstMqm27EZwGiog0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbjGss%2FbtsLYF3cdH8%2FENljUvzstMqm27EZwGiog0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;왼쪽은 bode diagram, 오른쪽은 step response&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 작은 overshoot이 있지만 steady-state error는 0에 가깝고 rise time은 5이하이므로 조건을 만족한다.&lt;/p&gt;</description>
      <category>control tutorials/cruise control</category>
      <author>fbc0314</author>
      <guid isPermaLink="true">https://fbc0314.tistory.com/13</guid>
      <comments>https://fbc0314.tistory.com/13#entry13comment</comments>
      <pubDate>Wed, 22 Jan 2025 17:21:36 +0900</pubDate>
    </item>
    <item>
      <title>1. System Modeling</title>
      <link>https://fbc0314.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ctms.engin.umich.edu/CTMS/index.php?example=CruiseControl&amp;amp;section=SystemModeling&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ctms.engin.umich.edu/CTMS/index.php?example=CruiseControl&amp;amp;section=SystemModeling&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737453957344&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Control Tutorials for MATLAB and Simulink - Cruise Control: System Modeling&quot; data-og-description=&quot;Cruise Control: System Modeling Key MATLAB commands used in this tutorial are: ss , tf Contents Physical setup Automatic cruise control is an excellent example of a feedback control system found in many modern vehicles. The purpose of the cruise control sy&quot; data-og-host=&quot;ctms.engin.umich.edu&quot; data-og-source-url=&quot;https://ctms.engin.umich.edu/CTMS/index.php?example=CruiseControl&amp;amp;section=SystemModeling&quot; data-og-url=&quot;https://ctms.engin.umich.edu/CTMS/index.php?example=CruiseControl&amp;amp;section=SystemModeling&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ctms.engin.umich.edu/CTMS/index.php?example=CruiseControl&amp;amp;section=SystemModeling&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ctms.engin.umich.edu/CTMS/index.php?example=CruiseControl&amp;amp;section=SystemModeling&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Control Tutorials for MATLAB and Simulink - Cruise Control: System Modeling&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Cruise Control: System Modeling Key MATLAB commands used in this tutorial are: ss , tf Contents Physical setup Automatic cruise control is an excellent example of a feedback control system found in many modern vehicles. The purpose of the cruise control sy&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ctms.engin.umich.edu&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사이트를 참고해서 정리한 글입니다!!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Cruise Control&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cruise control을 feedback control의 대표적인 예시로 현대의 이동수단에 사용된다. 해당 시스템의 목적은 바람, 도록의 상태 등 외부의 disturbance에 관계없이 일정한 속도를 유지하는 것이다. 현재 속도를 측정하고 reference speed와 비교 후 제어 법칙에 따라 자동으로 스로틀을 조정하는 방식을 이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이동수단의 free-body diagram을 간단하게 생각해보자. 질량은 m이고 엔진, 바퀴에 의해 앞으로 작용하는 힘은 uf라고 하자. 도로와의 마찰과 공기저항에 의해서 저항력이 생기는데 이는 속도에 비례하고 반대방향으로 작용하므로 bv라고 하자.이를 식으로 나타내면 아래와 같다.&lt;/p&gt;
&lt;div id=&quot;code_1737454319066&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$u-bv=m\dot{v}$$
$$m\dot{v}+bv=u$$
$$vehicle\ mass(m)\ :\ 1000\ kg$$
$$damping\ coefficient(b)\ :\ 50\ Ns/m$$&quot;&gt;$$u-bv=m\dot{v}$$ $$m\dot{v}+bv=u$$ $$vehicle\ mass(m)\ :\ 1000\ kg$$ $$damping\ coefficient(b)\ :\ 50\ Ns/m$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 시스템은 first-order mass-damper system이다. 우리는 여기에서 속도에 관심이 있으므로 output equation은 아래와 같다.&lt;/p&gt;
&lt;div id=&quot;code_1737455349736&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$y=v$$&quot;&gt;$$y=v$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1)State-space model&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 시스템은 하나의 state variable만 필요하고 여기서는 속도이다. state-space는 아래와 같이 표현된다.&lt;/p&gt;
&lt;div id=&quot;code_1737455822070&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$\dot{x} = [\dot{v}]=[\frac{-b}{m}][v]+[\frac{1}{m}][u]$$
$$y=[1][v]$$&quot;&gt;$$\dot{x} = [\dot{v}]=[\frac{-b}{m}][v]+[\frac{1}{m}][u]$$ $$y=[1][v]$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매트랩으로는 ss()함수를 이용해서 아래코드를 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1737455870576&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m = 1000;
b = 50;

A = -b/m;
B = 1/m;
C = 1;
D = 0;

cruise_ss = ss(A,B,C,D);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2)Transfer function&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기조건을 0으로 가정하고 라플라스 변환을 적용하면 전달함수를 아래처럼 구할 수 있다.&lt;/p&gt;
&lt;div id=&quot;code_1737456266248&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$m\dot{v}+bv=u$$
$$m[sV(s)-v(0)]+bV(s)=U(s)$$
$$initial\ condition\ :\ v(0)=0$$
$$(ms+b)V(s)=U(s)$$
$$\frac{V(s)}{U(s)}=\frac{1}{ms+b}$$&quot;&gt;$$m\dot{v}+bv=u$$ $$m[sV(s)-v(0)]+bV(s)=U(s)$$ $$initial\ condition\ :\ v(0)=0$$ $$(ms+b)V(s)=U(s)$$ $$\frac{V(s)}{U(s)}=\frac{1}{ms+b}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매트랩을 이용하면 아래 코드를 이용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1737456334778&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m=1000;
b=50;

cruise_tf=tf([1],[m,b]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. System Analysis&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1)Open-loop step response&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 시스템에 500N의 힘을 가했을 때 결과를 확인해보자!! 아래의 매트랩 코드를 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1737515258721&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m=1000;
b=50;
u=500;

tf_cruise=tf([1],[m,b]);
step(u*tf_cruise);
axis([0 200 0 12]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVYdeu/btsLUXDuu9W/jgdz8KLzCrnzg7A5KV5SS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVYdeu/btsLUXDuu9W/jgdz8KLzCrnzg7A5KV5SS1/img.png&quot; data-alt=&quot;cruise 시스템의 step response(F=500N)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVYdeu/btsLUXDuu9W/jgdz8KLzCrnzg7A5KV5SS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVYdeu%2FbtsLUXDuu9W%2Fjgdz8KLzCrnzg7A5KV5SS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;494&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cruise 시스템의 step response(F=500N)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 시스템은 open-loop system이다. 힘 500N을 가했을 때 그 feedback없이 결과를 그대로 나타낸 것이다. 1000kg의 자동차에 500N의 힘을 가하면(damping coefficient=50Ns/m) 최종적으로 10m/s의 속도를 가지게 된다. 해당 시스템은 overshoot없이 목표한 값에 도달하지만 rise time이 60초로 너무 길다. 우리는 다른 부분에 영향을 주지 않으면서 시스템을 빠르게 하는 feed back controller를 만드는 것이 목표이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2)open-loop poles/zeros&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 cruise systemd는 s=-b/m에서 하나의 pole을 가지고 이는 아래의 매트랩 코드로 확인 가능한다.&lt;/p&gt;
&lt;pre id=&quot;code_1737516516456&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m=1000;
b=50;
u=500;

tf_cruise=tf([1],[m,b]);
pzmap(tf_cruise);
axis([-1 1 -1 1]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgIatb/btsLUWYPybY/0qF9H5RVtwGX4eeyCkhQkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgIatb/btsLUWYPybY/0qF9H5RVtwGX4eeyCkhQkK/img.png&quot; data-alt=&quot;pzmap() 결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgIatb/btsLUWYPybY/0qF9H5RVtwGX4eeyCkhQkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgIatb%2FbtsLUWYPybY%2F0qF9H5RVtwGX4eeyCkhQkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;440&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pzmap() 결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 간단하게 -50/1000=-0.05에 pole이 하나 있는 것으로 나타났다. 여기서 우리가 알 수 있는 것은 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pole이 음의 실수이므로 open-loop system은 stable하고 oscillate하지 않는다.&lt;/li&gt;
&lt;li&gt;시스템의 반응은 pole의 크기에 따라서 결정된다. pole이 원점에서 멀어지면 시스템은 steady-state값에 더 빨리 도달한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 시스템의 parameter를 변경할 수 없으므로 controller를 디자인해서 closed-loop system의 pole/zero의 위치를 바꾸고 원하는 성능을 만족하도록 해야한다. 여기서 성능의 목표는 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Rise time &amp;lt; 5s&lt;/li&gt;
&lt;li&gt;Overshoot &amp;lt; 10%&lt;/li&gt;
&lt;li&gt;Steady-state error &amp;lt; 2%&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 상태에서는 rise time만 감소 시켜서 시스템이 빠르게 반응하도록 만들면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3)Open-loop Bode plot&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;frequency response의 크기와 주파수를 각각 두개의 그래프에 나타낸 것이 bode plot이다. 아래 매트랩 함수를 통해서 그 결과를 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1737517569148&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;m=1000;
b=50;
u=500;

tf_cruise=tf([1],[m,b]);
bode(tf_cruise);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dr67tQ/btsLUXwIq6A/cOUKKidTSotGhRA8FXB58k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dr67tQ/btsLUXwIq6A/cOUKKidTSotGhRA8FXB58k/img.png&quot; data-alt=&quot;bode diagram&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dr67tQ/btsLUXwIq6A/cOUKKidTSotGhRA8FXB58k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdr67tQ%2FbtsLUXwIq6A%2FcOUKKidTSotGhRA8FXB58k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;442&quot; height=&quot;393&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;bode diagram&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전형적인 first-order system의 bode diagram이다. bode를 그리기 위한 식을 정리하면 아래처럼 정리된다.&lt;/p&gt;
&lt;div id=&quot;code_1737517823464&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$\frac{V(s)}{U(s)}=\frac{1}{ms+b}=\frac{\frac{1}{b}}{\frac{m}{b}s+1}$$&quot;&gt;$$\frac{V(s)}{U(s)}=\frac{1}{ms+b}=\frac{\frac{1}{b}}{\frac{m}{b}s+1}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 gain 1/b와 분모에 first-order system으로 나누어서 생각해보자. gain은 bode-plot에서 크기를 y축 방향으로 20log(K)만큼 이동시킨다. 위의 예제에서는 20log(1/b)=20log(1/50)=-33.97로 그려지는 그래프를 y축 방향으로 -34만큼 이동시킨다. 분모의 first-order system은 break frequency인(b/m=50/1000=0.05)에서 크기는 20dB/dec의 기울기를 각도는 0도에서 90도로 변하게 한다. 여기서는 분모에 존재하므로(지수가 -1) 크기의 기울기는 -20dB/dec, 각도는 0~-90도로 변화한다. 이러한 예측을 종합해서 부드럽게 연결하면 위와 같은 bode diagram이 나타난다.&lt;/p&gt;</description>
      <category>control tutorials/cruise control</category>
      <author>fbc0314</author>
      <guid isPermaLink="true">https://fbc0314.tistory.com/12</guid>
      <comments>https://fbc0314.tistory.com/12#entry12comment</comments>
      <pubDate>Tue, 21 Jan 2025 19:45:42 +0900</pubDate>
    </item>
    <item>
      <title>추가적으로 정리한 것</title>
      <link>https://fbc0314.tistory.com/10</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 손으로 전달함수 구하고 매트랩과 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://fbc0314.tistory.com/1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://fbc0314.tistory.com/1&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 수학적으로 모델링해서 구한 전달함수와 매트랩을 통해서 구한 전달함수를 비교해보자!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1)수학적으로 계산&lt;/h3&gt;
&lt;div id=&quot;code_1737342571989&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$\sum F_{1}=F-k(x_{1}-x_{2})-\mu M_{1}g\dot{x_{1}}=M_{1}\ddot{X_{1}}$$
$$\sum F_{2}=k(x_{1}-x_{2})-\mu M_{2}g\dot{x_{2}}=M_{2}\ddot{X_{2}}$$&quot;&gt;$$\sum F_{1}=F-k(x_{1}-x_{2})-\mu M_{1}g\dot{x_{1}}=M_{1}\ddot{X_{1}}$$ $$\sum F_{2}=k(x_{1}-x_{2})-\mu M_{2}g\dot{x_{2}}=M_{2}\ddot{X_{2}}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 수식으로 모델링 할 수 있다.k= 1N/s, M1=1kg, M2=0.5kg, mu=0.02s/m, g=9.8m/s^2이다. 여기에 라플라스 변환을 적용하고 속도/힘의 전달함수를 구해보자. 라플라스 변환 적용결과 아래와 같다.&lt;/p&gt;
&lt;div id=&quot;code_1737342974566&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$ F(s)-k(X_{1}(s)-X_{2}(s))-\mu M_{1}gsX_{1}(s) = M_{1}s^{2}X_{1}(s)$$
$$ k(X_{1}(s)-X_{2}(s))-\mu M_{2}gsX_{2}(s) = M_{2}s^{2}X_{2}(s)$$&quot;&gt;$$ F(s)-k(X_{1}(s)-X_{2}(s))-\mu M_{1}gsX_{1}(s) = M_{1}s^{2}X_{1}(s)$$ $$ k(X_{1}(s)-X_{2}(s))-\mu M_{2}gsX_{2}(s) = M_{2}s^{2}X_{2}(s)$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식을 아래처럼 정리해서 F(s)와 X1(s)만 남긴다.&lt;/p&gt;
&lt;div id=&quot;code_1737343289629&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$F(s) = (M_{1}s^{2}+\mu M_{1}gs+k)X_{1}(s)-kX_{2}(s)$$
$$kX_{1}(s)=(M_{2}s^{2}+\mu M_{2}gs+k)X_{2}(s)$$

$$F(s) = [M_{1}s^{2}+\mu M_{1}gs+k-\frac{k^{2}}{M_{2}s^{2}+\mu M_{2}gs+k}]X_{1}(s)$$
$$\frac{X(s)}{F(s)}=\frac{\frac{1}{s} \dot{x_{1}}(s)}{F(s)} = \frac{1}{M_{1}s^{2}+\mu M_{1}gs+k-\frac{k^{2}}{M_{2}s^{2}+\mu M_{2}gs+k}}$$
$$\frac{\dot{x_{1}}(s)}{F(s)} = \frac{s}{M_{1}s^{2}+\mu M_{1}gs+k-\frac{k^{2}}{M_{2}s^{2}+\mu M_{2}gs+k}}$$
$$\frac{\dot{x_{1}}(s)}{F(s)} = \frac{s}{s^{2}+0.196s+1-\frac{1}{0.5s^{2}+0.098s+1}}$$
$$\frac{\dot{x_{1}}(s)}{F(s)} = \frac{s^{3}+0.196s^{2}+2s}{s^{4}+0.392s^{3}+3.038s^{2}+0.588s}$$
$$\frac{\dot{x_{1}}(s)}{F(s)} = \frac{s^{2}+0.196s+2}{s^{3}+0.392s^{2}+3.038s+0.588}$$




&quot;&gt;$$F(s) = (M_{1}s^{2}+\mu M_{1}gs+k)X_{1}(s)-kX_{2}(s)$$ $$kX_{1}(s)=(M_{2}s^{2}+\mu M_{2}gs+k)X_{2}(s)$$ $$F(s) = [M_{1}s^{2}+\mu M_{1}gs+k-\frac{k^{2}}{M_{2}s^{2}+\mu M_{2}gs+k}]X_{1}(s)$$ $$\frac{X(s)}{F(s)}=\frac{\frac{1}{s} \dot{x_{1}}(s)}{F(s)} = \frac{1}{M_{1}s^{2}+\mu M_{1}gs+k-\frac{k^{2}}{M_{2}s^{2}+\mu M_{2}gs+k}}$$ $$\frac{\dot{x_{1}}(s)}{F(s)} = \frac{s}{M_{1}s^{2}+\mu M_{1}gs+k-\frac{k^{2}}{M_{2}s^{2}+\mu M_{2}gs+k}}$$ $$\frac{\dot{x_{1}}(s)}{F(s)} = \frac{s}{s^{2}+0.196s+1-\frac{1}{0.5s^{2}+0.098s+1}}$$ $$\frac{\dot{x_{1}}(s)}{F(s)} = \frac{s^{3}+0.196s^{2}+2s}{s^{4}+0.392s^{3}+3.038s^{2}+0.588s}$$ $$\frac{\dot{x_{1}}(s)}{F(s)} = \frac{s^{2}+0.196s+2}{s^{3}+0.392s^{2}+3.038s+0.588}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2)매트랩으로 구하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://fbc0314.tistory.com/8&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://fbc0314.tistory.com/8&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 방법을 통해서 simulink로 만든 모델을 matlab으로 가지고 와서 전달함수를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 사진은 그 과정이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdQqo4/btsLTSHI9IC/okHnHrv7WCCl0VIaxekAZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdQqo4/btsLTSHI9IC/okHnHrv7WCCl0VIaxekAZ0/img.png&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;1137&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.7064%; margin-right: 10px;&quot; data-widthpercent=&quot;50.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdQqo4/btsLTSHI9IC/okHnHrv7WCCl0VIaxekAZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdQqo4%2FbtsLTSHI9IC%2FokHnHrv7WCCl0VIaxekAZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1548&quot; height=&quot;1137&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GzKpR/btsLRQdyyLr/ShNDNCdJlHMyiZOG8ZOaJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GzKpR/btsLRQdyyLr/ShNDNCdJlHMyiZOG8ZOaJ1/img.png&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;700&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.1309%;&quot; data-widthpercent=&quot;49.71&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GzKpR/btsLRQdyyLr/ShNDNCdJlHMyiZOG8ZOaJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGzKpR%2FbtsLRQdyyLr%2FShNDNCdJlHMyiZOG8ZOaJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;simulink에서 모델의 input/output 설정 후 모델을 matlab으로 추출한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1XZ94/btsLS42X9jJ/f8QP2KDquGVKx3TlscJ5vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1XZ94/btsLS42X9jJ/f8QP2KDquGVKx3TlscJ5vK/img.png&quot; data-alt=&quot;추출한 시스템의 전달함수를 명령창에서 tf함수를 통해 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1XZ94/btsLS42X9jJ/f8QP2KDquGVKx3TlscJ5vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1XZ94%2FbtsLS42X9jJ%2Ff8QP2KDquGVKx3TlscJ5vK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1320&quot; height=&quot;514&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;추출한 시스템의 전달함수를 명령창에서 tf함수를 통해 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매트랩에서 얻은 전달함수는 아래와 같다.&lt;/p&gt;
&lt;div id=&quot;code_1737345295278&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$\frac{\dot{x_{1}}(s)}{F(s)} = \frac{s^{3}+0.196s^{2}+2s}{s^{4}+0.392s^{3}+3.038s^{2}+0.588s+1.2073e-17}$$&quot;&gt;$$\frac{\dot{x_{1}}(s)}{F(s)} = \frac{s^{3}+0.196s^{2}+2s}{s^{4}+0.392s^{3}+3.038s^{2}+0.588s+1.2073e-17}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분모의 상수항이 존재하지만 이는 컴퓨터를 통한 계산의 한계이다. 두가지 방법으로 구한 전달함수는 동일하다는 것이 확인 되었다. simulink로 모델을 추출하고 이를 matlab에서 자유롭게 사용가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. -0.15에 zero와 integrator 추가 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://fbc0314.tistory.com/8&quot;&gt;https://fbc0314.tistory.com/8&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 마지막 부분에서 제어기를 설계하기 위해서 적분기와 -0.15에 zero를 추가해서 pid제어기를 만들고 gain k의 값은 0.05로 설정했다. 그대로 따라갔더니 overshoot이 없는 매끄러운 곡선이 나오고 steady-state error또한 존재하지 않는다. 왜 이렇게 추가하면 이러한 결과가 나오는 걸까??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라한 예제는 아래 사이트에 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ctms.engin.umich.edu/CTMS/index.php?example=Introduction&amp;amp;section=SimulinkControl&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ctms.engin.umich.edu/CTMS/index.php?example=Introduction&amp;amp;section=SimulinkControl&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JGcKU/btsLRSo5E4o/keIm9Uwz0hFLhViI4GjF51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JGcKU/btsLRSo5E4o/keIm9Uwz0hFLhViI4GjF51/img.png&quot; data-alt=&quot;적분기와 zero추가 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JGcKU/btsLRSo5E4o/keIm9Uwz0hFLhViI4GjF51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJGcKU%2FbtsLRSo5E4o%2FkeIm9Uwz0hFLhViI4GjF51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1141&quot; height=&quot;502&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;적분기와 zero추가 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 train 시스템의 전달함수는 아래와 같다.&lt;/p&gt;
&lt;div id=&quot;code_1737348058374&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$\frac{\dot{x_{1}}(s)}{F(s)} = \frac{s^{2}+0.196s+2}{s^{3}+0.392s^{2}+3.038s+0.588}$$
$$system\ type : 0$$
$$step\ input\ error : \frac{1}{1+K_{p}}=\frac{1}{1+\frac{2}{0.588}}=0.227$$
$$K_{p}=\displaystyle \lim_{s \to 0}G(s)H(S)=\frac{2}{0.588}$$
&quot;&gt;$$\frac{\dot{x_{1}}(s)}{F(s)} = \frac{s^{2}+0.196s+2}{s^{3}+0.392s^{2}+3.038s+0.588}$$ $$system\ type : 0$$ $$step\ input\ error : \frac{1}{1+K_{p}}=\frac{1}{1+\frac{2}{0.588}}=0.227$$ $$K_{p}=\displaystyle \lim_{s \to 0}G(s)H(S)=\frac{2}{0.588}$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러는 0.227로 그림에서 0.77정도 steady-state값을 갖는거 같으므로 맞는것으로 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step input에서 steady-state error를 줄이기 위해서는 system type을 증가시켜야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원점에 pole을 하나 추가해서 system의 type을 증가시키고 원점 근처에 zero를 추가해서 근궤적에는 영향을 주지 않는다. 이렇게 적분기(integrator)와 zero를 추가해서 PI controller를 설계한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제에서는 비슷하게 0에 pole 추가(적분기), -0.15에 zero를 추가했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K6ODj/btsLRHakXMz/rxaMj5MiljSHrTeecKKp70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K6ODj/btsLRHakXMz/rxaMj5MiljSHrTeecKKp70/img.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;600&quot; data-is-animation=&quot;false&quot; width=&quot;581&quot; height=&quot;366&quot; data-widthpercent=&quot;49.28&quot; style=&quot;width: 48.7084%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K6ODj/btsLRHakXMz/rxaMj5MiljSHrTeecKKp70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK6ODj%2FbtsLRHakXMz%2FrxaMj5MiljSHrTeecKKp70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/davnJe/btsLSPZIsiE/JaGmPi75XLHzAgW7FvpZUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/davnJe/btsLSPZIsiE/JaGmPi75XLHzAgW7FvpZUk/img.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;583&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.1288%;&quot; data-widthpercent=&quot;50.72&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/davnJe/btsLSPZIsiE/JaGmPi75XLHzAgW7FvpZUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdavnJe%2FbtsLSPZIsiE%2FJaGmPi75XLHzAgW7FvpZUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;적분기와 zero 추가 후 pid의 계수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gain은 0.05로 했다. 사진의 위쪽의 식을 정리하면 아래와 같다. pid의 각 계수가 이렇게 구해진다.&lt;/p&gt;
&lt;div id=&quot;code_1737349159085&quot; data-ke-type=&quot;html&quot; data-source=&quot;$$0.05*\frac{1+6.7s}{s}=\frac{0.05+0.33s}{s}$$
$$P\ :\ 0.33,\ \ I\ :\ 0.05$$&quot;&gt;$$0.05*\frac{1+6.7s}{s}=\frac{0.05+0.33s}{s}$$ $$P\ :\ 0.33,\ \ I\ :\ 0.05$$&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 gain은 0.05일까?? 이건 확신이 없다. 적절한 transient response를 위한 것은 분명하다. 하지만 어떤 조건을 맞추기 위할걸까??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pid를 조정한 결과를 보면 과도응답(overdamped)처럼 보인다. damping ratio가 1보다 크고 근궤적에서는 dominant pole이 실수축이 있는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0sHd4/btsLToU2V93/Za3BtgWCJigFQhIsik3mC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0sHd4/btsLToU2V93/Za3BtgWCJigFQhIsik3mC0/img.png&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;1528&quot; data-is-animation=&quot;false&quot; style=&quot;width: 42.2551%; margin-right: 10px;&quot; data-widthpercent=&quot;42.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0sHd4/btsLToU2V93/Za3BtgWCJigFQhIsik3mC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0sHd4%2FbtsLToU2V93%2FZa3BtgWCJigFQhIsik3mC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5uPn5/btsLTrqFftv/WjraNKrWASXsB9BK7ZXgo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5uPn5/btsLTrqFftv/WjraNKrWASXsB9BK7ZXgo0/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.5821%;&quot; data-widthpercent=&quot;57.25&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5uPn5/btsLTrqFftv/WjraNKrWASXsB9BK7ZXgo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5uPn5%2FbtsLTrqFftv%2FWjraNKrWASXsB9BK7ZXgo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;gain이 0.05일때 근궤적과 그 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 경우 dominant pole은 실수축의 pole이고 값이 -0.107이다.(복소수 pole은 -0.153+1.723i)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 gain을 더 증가시키면 dominant pole이 모호해지면서 overshoot이 존재하는 underdamped response가 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YqSAK/btsLSlE03ee/ZDKxa7mMwctLTKN4eLnTOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YqSAK/btsLSlE03ee/ZDKxa7mMwctLTKN4eLnTOk/img.png&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;1528&quot; data-is-animation=&quot;false&quot; style=&quot;width: 42.2551%; margin-right: 10px;&quot; data-widthpercent=&quot;42.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YqSAK/btsLSlE03ee/ZDKxa7mMwctLTKN4eLnTOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYqSAK%2FbtsLSlE03ee%2FZDKxa7mMwctLTKN4eLnTOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsaMpv/btsLSzQyRjB/jDmg7CmO4vabnggJWD6nYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsaMpv/btsLSzQyRjB/jDmg7CmO4vabnggJWD6nYK/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.5821%;&quot; data-widthpercent=&quot;57.25&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsaMpv/btsLSzQyRjB/jDmg7CmO4vabnggJWD6nYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsaMpv%2FbtsLSzQyRjB%2FjDmg7CmO4vabnggJWD6nYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;gain이 0.26일때 근궤적과 그 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 경우 dominant pole은 실수축의 pole이고 값이 -0.143이다.(복소수 pole은 -0.282+1.568i)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 실수축의 pole이 더 우세해보이지만 그 경계가 모호해지는거 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 gain을 더 감소시킨 결과를 확인해 보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckZphj/btsLS2qU6sx/MgZ8nmIBXPcgMeyq4jVVd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckZphj/btsLS2qU6sx/MgZ8nmIBXPcgMeyq4jVVd0/img.png&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;1528&quot; data-is-animation=&quot;false&quot; style=&quot;width: 42.2551%; margin-right: 10px;&quot; data-widthpercent=&quot;42.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckZphj/btsLS2qU6sx/MgZ8nmIBXPcgMeyq4jVVd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckZphj%2FbtsLS2qU6sx%2FMgZ8nmIBXPcgMeyq4jVVd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b650Xs/btsLUma8NP6/GXKnQdfsQdawvMVYIlp7O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b650Xs/btsLUma8NP6/GXKnQdfsQdawvMVYIlp7O1/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;57.25&quot; style=&quot;width: 56.5821%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b650Xs/btsLUma8NP6/GXKnQdfsQdawvMVYIlp7O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb650Xs%2FbtsLUma8NP6%2FGXKnQdfsQdawvMVYIlp7O1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;gain이 0.01일때 근궤적과 그 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀더 settling time이 긴 결과가 나타났다. 적절한 gain의 값을 구하는 것은 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dominant pole 또한 값이 크게 차이가 나지 않는 경우 확실하게 정해지지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#잘못된 내용은 수정/지적 해주시면 감사합니다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정리)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;system type을 증가시켜서 step input의 steady-state error를 없애기 위해 integrator추가&lt;/li&gt;
&lt;li&gt;추가한 integrator로 인해서 근궤적이 변하는 것을 막기 위해서 원점 근처(-0.15)에 zero추가&lt;/li&gt;
&lt;li&gt;적절한 transient response를 가지기 위해서 gain k값 조절(dominant pole이 어떤것이 되는지)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>control tutorials/introduction</category>
      <author>fbc0314</author>
      <guid isPermaLink="true">https://fbc0314.tistory.com/10</guid>
      <comments>https://fbc0314.tistory.com/10#entry10comment</comments>
      <pubDate>Mon, 20 Jan 2025 12:31:28 +0900</pubDate>
    </item>
    <item>
      <title>Simscape</title>
      <link>https://fbc0314.tistory.com/9</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Simscape와 Simulink&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 우리는 simulink를 사용해서 시스템을 모델링하고 원하는 조건을 성립하도록 제어기를 설계하고 시뮬레이션 하는 방법을 해보았다. Simscape도 Simulink와 비슷한 목적을 가지고 있다. 하지만 simulink는 수학적 모델링으로 연결되어 신호가 전달된다면 &lt;b&gt;물리적 시스템을 구성 요소 기반으로 모델링&lt;/b&gt;하고&amp;nbsp; 실제 물리적 상호작용(전압, 유량, 힘 등)을 직관적으로 표현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 Simscape를 처음 사용한다면 에드온으로 추가적인 설치가 필요한다. 에드온에서 아래 사진처럼 Simscape를 찾아서 설치해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1924&quot; data-origin-height=&quot;1246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4RK9V/btsLSgpkV4j/M05OQZNPjaBVGVzhVVKQZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4RK9V/btsLSgpkV4j/M05OQZNPjaBVGVzhVVKQZ0/img.png&quot; data-alt=&quot;simscape 설치 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4RK9V/btsLSgpkV4j/M05OQZNPjaBVGVzhVVKQZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4RK9V%2FbtsLSgpkV4j%2FM05OQZNPjaBVGVzhVVKQZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;686&quot; height=&quot;444&quot; data-origin-width=&quot;1924&quot; data-origin-height=&quot;1246&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;simscape 설치 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 기차 시스템 모델링&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ctms.engin.umich.edu/CTMS/index.php?example=Introduction&amp;amp;section=SimulinkSimscape&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ctms.engin.umich.edu/CTMS/index.php?example=Introduction&amp;amp;section=SimulinkSimscape&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사이트를 참고해서 따라해보자!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;matlab 명령창에 ssc_new 를 입력하면 아래와 같은 화면이 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;1108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUijp5/btsLSPx5ENP/jWgRF0sLtSJqJKaH9yBZfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUijp5/btsLSPx5ENP/jWgRF0sLtSJqJKaH9yBZfK/img.png&quot; data-alt=&quot;simscape 첫 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUijp5/btsLSPx5ENP/jWgRF0sLtSJqJKaH9yBZfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUijp5%2FbtsLSPx5ENP%2FjWgRF0sLtSJqJKaH9yBZfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;614&quot; height=&quot;448&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;1108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;simscape 첫 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델의 요소는 세가지가 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;solver configuration block : 물리 네트워크에서 시뮬레이션을 실행하기 위한 solver 설정 제공&lt;/li&gt;
&lt;li&gt;PS-Simulink and Simulink-PS blocks(위쪽에 좌우로 두개) : 물리적 신호와 simulink 신호를 서로 변경&lt;/li&gt;
&lt;li&gt;Scope connected to PS-Simulink block(위쪽에서 가장 오른쪽) : 물리적 신호를 simulink 신호로 변경후 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ps_simulink와 simulink-ps는 물리적 모델의 경계를 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 2개의 mass block, 1개의 translational spring block, 1개의 mechanical translational reference block(세상의 기준 역할을 한다), 2개의 translatioinal damper block이 추가된다. 아래 사진처럼 블록을 추가하고 Mass1은 1kg, Mass2는 0.5kg, 스프링 상수는 1, 마찰계수는 0.02로 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XDSVX/btsLSna2d7n/XJ7dDeJlw7bX3RQ5k8Sch0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XDSVX/btsLSna2d7n/XJ7dDeJlw7bX3RQ5k8Sch0/img.png&quot; data-alt=&quot;물리적 시스템을 나타내는 블록 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XDSVX/btsLSna2d7n/XJ7dDeJlw7bX3RQ5k8Sch0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXDSVX%2FbtsLSna2d7n%2FXJ7dDeJlw7bX3RQ5k8Sch0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1158&quot; height=&quot;564&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;물리적 시스템을 나타내는 블록 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 signal generator block, translational motion sensor block을 추가한다. 이때 simulink 신호가 물리적 신호로 잘 변경되어 연결되도록 한다. signal generator block에서 파형을 &quot;구형&quot;, 진폭을 -1, 주파수를 0.001Hz로 설정한다. CTRL+E를 눌러서 유형을 &quot;가변스텝&quot; 솔버를 &quot;자동&quot;으로 설정하고&amp;nbsp; 시뮬레이션 시간을 1000초로 설정한다. 결과는 아래 사진과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lpIOr/btsLSoVjxU9/43Uq6EK1EDVwDoTnoZOYK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lpIOr/btsLSoVjxU9/43Uq6EK1EDVwDoTnoZOYK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lpIOr/btsLSoVjxU9/43Uq6EK1EDVwDoTnoZOYK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlpIOr%2FbtsLSoVjxU9%2F43Uq6EK1EDVwDoTnoZOYK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1180&quot; height=&quot;546&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 시뮬레이션을 시작해보고(CTRL+T) scope를 통해서 결과를 확인해보자. 이전에 simulink를 사용했을 때와 비슷한 결과가 나오는 것을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZPYS4/btsLSSPbhfw/nlqeSYF4NKK2KvjvCxMm60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZPYS4/btsLSSPbhfw/nlqeSYF4NKK2KvjvCxMm60/img.png&quot; data-alt=&quot;실행결과 기차의 속도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZPYS4/btsLSSPbhfw/nlqeSYF4NKK2KvjvCxMm60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZPYS4%2FbtsLSSPbhfw%2FnlqeSYF4NKK2KvjvCxMm60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;539&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행결과 기차의 속도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;simscape는 simulink와 비슷하다. 수학적으로 나타냈는가, 물리적으로 나타냈는가의 차이가 존재한다. 필요할 때 적합한 도구를 사용하면 된다.&lt;/p&gt;</description>
      <category>control tutorials/introduction</category>
      <author>fbc0314</author>
      <guid isPermaLink="true">https://fbc0314.tistory.com/9</guid>
      <comments>https://fbc0314.tistory.com/9#entry9comment</comments>
      <pubDate>Sun, 19 Jan 2025 23:38:39 +0900</pubDate>
    </item>
    <item>
      <title>Simulink Control</title>
      <link>https://fbc0314.tistory.com/8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;해당 카테고리의 첫 글에서 우리는 두개의 기차 시스템을 모델링했고 아래 사진처럼 완성했다. 우리가 모델링한 것은 feedback system의 plant 부분이고 controller부분을 설계해서 원하는대로 동작하도록 만들어야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;1126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btnOTR/btsLNLjolQf/S7k1aDAIPhOsP2khn3K9w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btnOTR/btsLNLjolQf/S7k1aDAIPhOsP2khn3K9w1/img.png&quot; data-alt=&quot;2개의 기차 시스템&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btnOTR/btsLNLjolQf/S7k1aDAIPhOsP2khn3K9w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtnOTR%2FbtsLNLjolQf%2FS7k1aDAIPhOsP2khn3K9w1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;549&quot; height=&quot;419&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;1126&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2개의 기차 시스템&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 간단하게 보기 위해서 train model을 하나의 subsystem block으로 만들어야 한다. 이를 위해서 3개의 scope block을 sinks library의 out1으로 바꾸고 한개의 signal generator를 sources library의 in1으로 바꿔야 한다. 그러면 아래와 같은 화면이 만들어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;1126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7gogx/btsLPQCYCU6/lZUBad5rf83JTwm7kI0Di1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7gogx/btsLPQCYCU6/lZUBad5rf83JTwm7kI0Di1/img.png&quot; data-alt=&quot;subsystem으로 만들기 위해서 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7gogx/btsLPQCYCU6/lZUBad5rf83JTwm7kI0Di1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7gogx%2FbtsLPQCYCU6%2FlZUBad5rf83JTwm7kI0Di1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;380&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;1126&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;subsystem으로 만들기 위해서 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델을 모두 선택 후(Ctrl+A) 우클릭 후에 선택항목을 서브시스템으로 만들기 선택(Ctrl+G)를 통해서 하나의 subsystem block으로 만든다. 결과는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;949&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ef3LWg/btsLN9xh2dN/ykpfWUp2XpFST1NvNnqcYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ef3LWg/btsLN9xh2dN/ykpfWUp2XpFST1NvNnqcYK/img.png&quot; data-alt=&quot;하나의 subsystem block&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ef3LWg/btsLN9xh2dN/ykpfWUp2XpFST1NvNnqcYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fef3LWg%2FbtsLN9xh2dN%2FykpfWUp2XpFST1NvNnqcYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;435&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;949&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하나의 subsystem block&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 PID controller block을 추가하고 train system의 F에 연결한다. 쉽게 생각하가 위해서 엔진이 도크를 만들어서 바퀴에 전달하는 과정을 생략했다. PID의 각 계수를 설정하고 속도를 제어할 것이기 때문에 속도인 x1_dot을 feedback loop를 만들어서 연결한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;873&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blwade/btsLOu820Da/014QdjVDKv8ZkLJB2I5k1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blwade/btsLOu820Da/014QdjVDKv8ZkLJB2I5k1k/img.png&quot; data-alt=&quot;속도를 제어하는 feedback loop&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blwade/btsLOu820Da/014QdjVDKv8ZkLJB2I5k1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblwade%2FbtsLOu820Da%2F014QdjVDKv8ZkLJB2I5k1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;351&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;873&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;속도를 제어하는 feedback loop&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;r그리고 source library에 signal builder를 추가해서 원하는 신호를 가도록 만든다. 우리는 300초동안 처음 10초부터 150초까지는 1의 속도를 갖고 150초부터 300초까지는 0의 신호를 갖도록 만들고 싶다. 블록을 더블클릭 후 위쪽 탭에서 축 메뉴에서 시간의 범위를 설정하고 마우스로 신호에서 각 축의 위치를 변경할 수 있다. 그리고 x1의 속도를 확인할 수 있도록 scope를 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8Ya0D/btsLPaaWGSp/ZNjIi0OGdDbOdwl60HvNYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8Ya0D/btsLPaaWGSp/ZNjIi0OGdDbOdwl60HvNYK/img.png&quot; data-origin-width=&quot;1105&quot; data-origin-height=&quot;922&quot; data-is-animation=&quot;false&quot; width=&quot;528&quot; height=&quot;441&quot; style=&quot;width: 46.0776%; margin-right: 10px;&quot; data-widthpercent=&quot;46.62&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8Ya0D/btsLPaaWGSp/ZNjIi0OGdDbOdwl60HvNYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8Ya0D%2FbtsLPaaWGSp%2FZNjIi0OGdDbOdwl60HvNYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1105&quot; height=&quot;922&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciINxM/btsLN4W7cLM/NgwRwkWu56BkmdoRCvzkDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciINxM/btsLN4W7cLM/NgwRwkWu56BkmdoRCvzkDk/img.png&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;873&quot; data-is-animation=&quot;false&quot; style=&quot;width: 52.7596%;&quot; data-widthpercent=&quot;53.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciINxM/btsLN4W7cLM/NgwRwkWu56BkmdoRCvzkDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciINxM%2FbtsLN4W7cLM%2FNgwRwkWu56BkmdoRCvzkDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1198&quot; height=&quot;873&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;우리가 원하는 속도와 signal generator를 추가한 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시뮬레이션의 실행시간을 300초로 설정하고 실행 후 x1_dot의 scope을 보면 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJitWV/btsLO76oMmG/9eomd40dz7r97MDU9uMI2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJitWV/btsLO76oMmG/9eomd40dz7r97MDU9uMI2k/img.png&quot; data-alt=&quot;x1_dot의 scope&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJitWV/btsLO76oMmG/9eomd40dz7r97MDU9uMI2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJitWV%2FbtsLO76oMmG%2F9eomd40dz7r97MDU9uMI2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;634&quot; height=&quot;566&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;x1_dot의 scope&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 원하는 결과가 나오지 않았다. 속도가 1에 도달하지 못하는 steady-state error가 나타난것이 확인된다. 이는 pid 제어기의 계수들을 적절하게 조절하면 해결 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;#linear Analysis Points 관련&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ctms.engin.umich.edu/CTMS/index.php?example=Introduction&amp;amp;section=SimulinkControl&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ctms.engin.umich.edu/CTMS/index.php?example=Introduction&amp;amp;section=SimulinkControl&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사이트에서 extracting a model into MATLAB부분을 따라가고 있던중에 linear analysis points부분이 계속 따라해봐도 보이지 않았다... 여기서 세시간 정도 멈쳤던거 같다ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론은 추가로 toolbox를 설치해줘야 한다. simullink 위의 메뉴에서 앱 선택후 애드온 받기를 클릭 후 아래 사진의 simulink control design을 설치한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;979&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PbR8G/btsLOOl2dch/MdRiRMaQv6tztTTTOsuoVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PbR8G/btsLOOl2dch/MdRiRMaQv6tztTTTOsuoVk/img.png&quot; data-alt=&quot;추가로 설치해야 하는 toolbox&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PbR8G/btsLOOl2dch/MdRiRMaQv6tztTTTOsuoVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPbR8G%2FbtsLOOl2dch%2FMdRiRMaQv6tztTTTOsuoVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;674&quot; height=&quot;413&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;979&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;추가로 설치해야 하는 toolbox&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;1084&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M5LyS/btsLP3bdtX3/z3vo4ZJQQv2wk4r8tkW5V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M5LyS/btsLP3bdtX3/z3vo4ZJQQv2wk4r8tkW5V0/img.png&quot; data-alt=&quot;설치 완료 후 보이지 않았던 Linear Analysis Points가 보인다...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M5LyS/btsLP3bdtX3/z3vo4ZJQQv2wk4r8tkW5V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM5LyS%2FbtsLP3bdtX3%2Fz3vo4ZJQQv2wk4r8tkW5V0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;609&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;1084&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설치 완료 후 보이지 않았던 Linear Analysis Points가 보인다...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;signal을 우클릭 후에 train system으로 들어가는 신호를 open-loop input으로 설정하고 나가는 신호를 open-loop output으로 설정한다. 우리는 control이 없는 train 모델 그 자체를 원하기 때문에 feedback signal을 삭제해야 한다. 그 결과 아래와 같은 화면을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1507&quot; data-origin-height=&quot;1197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LQnpQ/btsLOKqnnka/jEnVitrWABbJJDL8V66x1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LQnpQ/btsLOKqnnka/jEnVitrWABbJJDL8V66x1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LQnpQ/btsLOKqnnka/jEnVitrWABbJJDL8V66x1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLQnpQ%2FbtsLOKqnnka%2FjEnVitrWABbJJDL8V66x1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;589&quot; height=&quot;468&quot; data-origin-width=&quot;1507&quot; data-origin-height=&quot;1197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㄴsimulink화면 위쪽의 앱 메뉴를 클릭하면 제어시스템- Model Linearizer을 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이것도 원래없었는데 추가로 설치하면서 생겼다ㅠㅠ)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d자 이제 여기에서 train 모델을 matlab으로 가져올 수 있다. 처음 실행하면 아래 왼쪽 사진과 같은 화면이 나온다. 여기서 위의 step 버튼을 누르면 linearized model이 만들어진다. 우리가 만든 기차 모델은 이미 linear이기 때문에 큰 변화가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면 내에서 linear analysis workspace에서 linsys1을 위쪽의 MATLAB Workspace로 그래그 하면 기존 매트랩에서도 해당 시스템은 전달함수로 변수명을 linsys1으로 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvip3M/btsLP5NDDKS/QQKdb0F6oHgqTMeG42CDxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvip3M/btsLP5NDDKS/QQKdb0F6oHgqTMeG42CDxK/img.png&quot; data-origin-width=&quot;1399&quot; data-origin-height=&quot;1029&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvip3M/btsLP5NDDKS/QQKdb0F6oHgqTMeG42CDxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcvip3M%2FbtsLP5NDDKS%2FQQKdb0F6oHgqTMeG42CDxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1399&quot; height=&quot;1029&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M04RU/btsLOMaGexk/hMf9Zt0ckxycSD1KQ2IYAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M04RU/btsLOMaGexk/hMf9Zt0ckxycSD1KQ2IYAK/img.png&quot; data-origin-width=&quot;1399&quot; data-origin-height=&quot;1029&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M04RU/btsLOMaGexk/hMf9Zt0ckxycSD1KQ2IYAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM04RU%2FbtsLOMaGexk%2FhMf9Zt0ckxycSD1KQ2IYAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1399&quot; height=&quot;1029&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;왼쪽이 첫 화면이고 오른쪽이 step 클릭후 드래그해서 모델 이동 완료한 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6CA8G/btsLP5z6Kzs/2TRe05lYiKfpEMBnigOvOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6CA8G/btsLP5z6Kzs/2TRe05lYiKfpEMBnigOvOK/img.png&quot; data-alt=&quot;기존 매트랩 작업공간에 시스템을 의미하는 변수가 생성되었고 그대로 사용 가능하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6CA8G/btsLP5z6Kzs/2TRe05lYiKfpEMBnigOvOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6CA8G%2FbtsLP5z6Kzs%2F2TRe05lYiKfpEMBnigOvOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1349&quot; height=&quot;1262&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기존 매트랩 작업공간에 시스템을 의미하는 변수가 생성되었고 그대로 사용 가능하다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;simulink를 이용한 Controller design&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;simulink에서 pid controller를 설계하는 방법은 두가지 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 방법은 pid block을 더블클릭하면 나오는 화면에서 조정버튼을 누른다. 그러면 아래와 같은 화면이 나오고 여기서 각 계수의 값을 찾을 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xFG7b/btsLPRi5dNX/laksF8qNP9r2kEEQ00Ffok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xFG7b/btsLPRi5dNX/laksF8qNP9r2kEEQ00Ffok/img.png&quot; data-alt=&quot;pid 블럭을 통해 들어간 pid조정기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xFG7b/btsLPRi5dNX/laksF8qNP9r2kEEQ00Ffok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxFG7b%2FbtsLPRi5dNX%2FlaksF8qNP9r2kEEQ00Ffok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1528&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pid 블럭을 통해 들어간 pid조정기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 방법은 앱에서 제어시스템을 누르면 아래와 같은 화면이 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOahpp/btsLRoNfXk9/mDm6PCzUrKh0MZFfx7qIz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOahpp/btsLRoNfXk9/mDm6PCzUrKh0MZFfx7qIz1/img.png&quot; data-alt=&quot;제어시스템을 눌렀을 때 첫화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOahpp/btsLRoNfXk9/mDm6PCzUrKh0MZFfx7qIz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOahpp%2FbtsLRoNfXk9%2FmDm6PCzUrKh0MZFfx7qIz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;1192&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제어시스템을 눌렀을 때 첫화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bipVu4/btsLQNGP4gO/BrFgFZOHMqvJKAHEZEEt10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bipVu4/btsLQNGP4gO/BrFgFZOHMqvJKAHEZEEt10/img.png&quot; data-alt=&quot;블록을 추가한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bipVu4/btsLQNGP4gO/BrFgFZOHMqvJKAHEZEEt10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbipVu4%2FbtsLQNGP4gO%2FBrFgFZOHMqvJKAHEZEEt10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;461&quot; height=&quot;366&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;블록을 추가한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설계하려는 블록을 추가하고 ok버튼을 누르고 확인을 누른다. 이전에 시스템을 추출했을 때처럼 시스템의 input과 output을 설정한다. signal builder block의 output인 velocity command signal을 우클릭 후에 Linear Analysis Point -&amp;gt; Input Perturbation으로 closed-loop system의 input으로 설정한다. 그리고 train system의 output중에 속도인 train engine velocity signal을 우클릭 후에 Linear Analysis Points -&amp;gt; Output Measurement로 closed loop system의 output으로 설정한다. 그러면 아래와 같이 signal에 표시가 생긴다. 그러면 어떤 신호를 input 또는 output으로 하는지 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;994&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFPNvs/btsLQAucTDo/0xHo9kioJtagjr6jIagjDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFPNvs/btsLQAucTDo/0xHo9kioJtagjr6jIagjDK/img.png&quot; data-alt=&quot;input, output 설정완료 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFPNvs/btsLQAucTDo/0xHo9kioJtagjr6jIagjDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFPNvs%2FbtsLQAucTDo%2F0xHo9kioJtagjr6jIagjDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;368&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;994&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;input, output 설정완료 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 이전에 앱에서 시작한 제어 시스템 디자이너에서 조정방법 -&amp;gt; 근궤적 편집기를 선택한다. 아래의 왼쪽 사진처럼 찾으면 된다. 그다음 나오는 화면에서 Plot(플롯)을 선택하면 오른쪽 사진처럼 근궤적이 화면에 보여진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GZ95n/btsLRFQHvAH/aTJ6oOmbod9pQvR9eUxwXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GZ95n/btsLRFQHvAH/aTJ6oOmbod9pQvR9eUxwXk/img.png&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot; data-is-animation=&quot;false&quot; width=&quot;603&quot; height=&quot;403&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GZ95n/btsLRFQHvAH/aTJ6oOmbod9pQvR9eUxwXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGZ95n%2FbtsLRFQHvAH%2FaTJ6oOmbod9pQvR9eUxwXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kpb8d/btsLRmcPijI/DQVQsntdupZZXVyDJpMrE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kpb8d/btsLRmcPijI/DQVQsntdupZZXVyDJpMrE1/img.png&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot; data-is-animation=&quot;false&quot; width=&quot;615&quot; height=&quot;411&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kpb8d/btsLRmcPijI/DQVQsntdupZZXVyDJpMrE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKpb8d%2FbtsLRmcPijI%2FDQVQsntdupZZXVyDJpMrE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;근궤적 편집기 선택과 근궤적&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 여기서 gain k의 값을 변경하고 싶으면 근궤적에서 핑크색 상자를 드래그하면 된다. 이제 step response를 확인해 보자. 아래의 왼쪽 사진처럼 새 플롯 -&amp;gt; 새 계단을 선택한다. 그리고 새 입력-출력 전달 응답을 선택해서 입력신호는 Signal Builder에서 나오는 신호를 출력신호는 Subsystem에서 나오는 기차의 속도를 선택한다. 마지막으로 플롯을 누르면 가장 아래의 오른쪽과 같은 step input 신호에 대한 response가 시간에 따라서 그려진다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c966eA/btsLSPSos5j/hZ8leeAXBaH39TKu2JmCek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c966eA/btsLSPSos5j/hZ8leeAXBaH39TKu2JmCek/img.png&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot; data-is-animation=&quot;false&quot; style=&quot;width: 55.5034%; margin-right: 10px;&quot; data-widthpercent=&quot;56.16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c966eA/btsLSPSos5j/hZ8leeAXBaH39TKu2JmCek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc966eA%2FbtsLSPSos5j%2FhZ8leeAXBaH39TKu2JmCek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TVTdS/btsLT4HQV0L/5OdQ8311cQwnGm5XkaZX71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TVTdS/btsLT4HQV0L/5OdQ8311cQwnGm5XkaZX71/img.png&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;646&quot; data-is-animation=&quot;false&quot; style=&quot;width: 43.3338%;&quot; data-widthpercent=&quot;43.84&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TVTdS/btsLT4HQV0L/5OdQ8311cQwnGm5XkaZX71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTVTdS%2FbtsLT4HQV0L%2F5OdQ8311cQwnGm5XkaZX71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;754&quot; height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAemth/btsLSzPQcTl/YOEGUQrvSyClh8UVQmlh1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAemth/btsLSzPQcTl/YOEGUQrvSyClh8UVQmlh1K/img.png&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;646&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;43.84&quot; style=&quot;width: 43.3338%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAemth/btsLSzPQcTl/YOEGUQrvSyClh8UVQmlh1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAemth%2FbtsLSzPQcTl%2FYOEGUQrvSyClh8UVQmlh1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;754&quot; height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbaOcK/btsLSmb5cDA/ST73SKLP6NQrXnoUVB4090/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbaOcK/btsLSmb5cDA/ST73SKLP6NQrXnoUVB4090/img.png&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot; data-is-animation=&quot;false&quot; style=&quot;width: 55.5034%;&quot; data-widthpercent=&quot;56.16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbaOcK/btsLSmb5cDA/ST73SKLP6NQrXnoUVB4090/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbaOcK%2FbtsLSmb5cDA%2FST73SKLP6NQrXnoUVB4090%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step response의 x축과 y축의 범위를 그래프 화면 우클릭 후에 제한의 각 값을 변경하면 아래 사진처럼 나타난다. 우리는 여기서 overshoot을 줄이고 steady-state error를 줄일 수 있도록 제어기를 설계해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/shXIC/btsLRldTeue/KxJ5fiZT4JAQpq4IAKEaok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/shXIC/btsLRldTeue/KxJ5fiZT4JAQpq4IAKEaok/img.png&quot; data-alt=&quot;근궤적과 step response&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/shXIC/btsLRldTeue/KxJ5fiZT4JAQpq4IAKEaok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FshXIC%2FbtsLRldTeue%2FKxJ5fiZT4JAQpq4IAKEaok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;1192&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;근궤적과 step response&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 사진처럼 근궤적 그래프 화면을 우클릭 후에 보상기 편집을 선택한다. 오른쪽 사진과 같은 화면이 나오고 우클릭 후 극점 또는 영점 추가를 통해서 다음과 같이 설계할 수 있다. 여기서는 일단 loop gain은 0.05,&amp;nbsp; real zero를 -0.15에 추가하고 integrator를 추가하자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 integrator와 -0.15에 zero를 추가하는지는 좌측의 포스팅에 정리(&lt;a href=&quot;https://fbc0314.tistory.com/10&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://fbc0314.tistory.com/10&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFjck6/btsLRQj8BXa/Kh9BKR4kz7CrRcicATdOKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFjck6/btsLRQj8BXa/Kh9BKR4kz7CrRcicATdOKk/img.png&quot; style=&quot;width: 47.9481%; margin-right: 10px;&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;48.51&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFjck6/btsLRQj8BXa/Kh9BKR4kz7CrRcicATdOKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFjck6%2FbtsLRQj8BXa%2FKh9BKR4kz7CrRcicATdOKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ed4PFV/btsLSnoy2Ed/lPTDMfmo4XjDpFrkN6kJm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ed4PFV/btsLSnoy2Ed/lPTDMfmo4XjDpFrkN6kJm1/img.png&quot; style=&quot;width: 50.8892%;&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;600&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;51.49&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ed4PFV/btsLSnoy2Ed/lPTDMfmo4XjDpFrkN6kJm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fed4PFV%2FbtsLSnoy2Ed%2FlPTDMfmo4XjDpFrkN6kJm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eQ4Uuh/btsLTGArKDk/BPQ2J9UQUq1cLJNB32stNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eQ4Uuh/btsLTGArKDk/BPQ2J9UQUq1cLJNB32stNK/img.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;600&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eQ4Uuh/btsLTGArKDk/BPQ2J9UQUq1cLJNB32stNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeQ4Uuh%2FbtsLTGArKDk%2FBPQ2J9UQUq1cLJNB32stNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8maFM/btsLTqxQ47t/Zfj1pdgd9CbKX78yCf8eOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8maFM/btsLTqxQ47t/Zfj1pdgd9CbKX78yCf8eOK/img.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;600&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8maFM/btsLTqxQ47t/Zfj1pdgd9CbKX78yCf8eOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8maFM%2FbtsLTqxQ47t%2FZfj1pdgd9CbKX78yCf8eOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;추가한 compensator하고 그떄의 pid의 각 계수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nbowz/btsLSMacMSz/eKmFTQhRWTe8FonPNVLknK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nbowz/btsLSMacMSz/eKmFTQhRWTe8FonPNVLknK/img.png&quot; data-alt=&quot;compensator를 추가했을 때 step response의 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nbowz/btsLSMacMSz/eKmFTQhRWTe8FonPNVLknK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnbowz%2FbtsLSMacMSz%2FeKmFTQhRWTe8FonPNVLknK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;1192&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;compensator를 추가했을 때 step response의 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 위의 사진에서 블록 업데이트를 누르면 현재 pid의 계수값이 처음의 feedback system의 pid의 계수에 적용된다. pid의 계수를 조절하는 것은 compensator를 추가하고 그때의 정리된 계수가 각각의 pid값이 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 처음과 비교해보자. 왼쪽 사진은 pid의 각 값을 1,0,0으로 했을 때고 오른쪽 사진은 pid의 각 값을 0.33, 0.05,0으로 했을 때이다. steady-state error가 없어지고 overshoot이 존재하지 않으면서 목표한 값까지 부드럽게 도달해서 기차의 속도를 제어하는데 적합하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boatw5/btsLSB7VkB5/u7njgon9FzigM4lxJNPUdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boatw5/btsLSB7VkB5/u7njgon9FzigM4lxJNPUdk/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boatw5/btsLSB7VkB5/u7njgon9FzigM4lxJNPUdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fboatw5%2FbtsLSB7VkB5%2Fu7njgon9FzigM4lxJNPUdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4ADLo/btsLSjfgPJE/rVrI0Y2C32aKCqkoqN2D71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4ADLo/btsLSjfgPJE/rVrI0Y2C32aKCqkoqN2D71/img.png&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;753&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4ADLo/btsLSjfgPJE/rVrI0Y2C32aKCqkoqN2D71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4ADLo%2FbtsLSjfgPJE%2FrVrI0Y2C32aKCqkoqN2D71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;pid값 변경전과 변경후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 matlab의 simulink를 이용해서 pid에 적합한 값을 구하는 방법에 대해서 직접 따라해보면서 결과를 확인했다. 이를 잘 이용하면 compensator에 대한 결과를 쉽게 확인할 수 있을 것이다.&lt;/p&gt;</description>
      <category>control tutorials/introduction</category>
      <author>fbc0314</author>
      <guid isPermaLink="true">https://fbc0314.tistory.com/8</guid>
      <comments>https://fbc0314.tistory.com/8#entry8comment</comments>
      <pubDate>Wed, 15 Jan 2025 20:39:07 +0900</pubDate>
    </item>
  </channel>
</rss>