<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>yebeen.kim</title>
    <link>https://canyouseehuh.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 2 Jun 2026 16:40:31 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>yebeen.kim</managingEditor>
    <image>
      <title>yebeen.kim</title>
      <url>https://tistory1.daumcdn.net/tistory/6372174/attach/c60be67632e3446d9b49c43ef99ee24e</url>
      <link>https://canyouseehuh.tistory.com</link>
    </image>
    <item>
      <title>[Robotics] Jacobian Matrix</title>
      <link>https://canyouseehuh.tistory.com/17</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ChatGPT Image 2026년 5월 21일 오후 01_47_45.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cpx28/dJMcac4eRVm/GaUrzdtV2oSucrEWgBuSY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cpx28/dJMcac4eRVm/GaUrzdtV2oSucrEWgBuSY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cpx28/dJMcac4eRVm/GaUrzdtV2oSucrEWgBuSY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCpx28%2FdJMcac4eRVm%2FGaUrzdtV2oSucrEWgBuSY1%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;1536&quot; height=&quot;1024&quot; data-filename=&quot;ChatGPT Image 2026년 5월 21일 오후 01_47_45.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&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;&lt;b&gt;Jacobian Matrix(자코비안 행렬)&lt;/b&gt;은 &lt;u&gt;로봇의 &amp;ldquo;관절 움직임과 끝단 움직임의 관계&amp;rdquo;&lt;/u&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;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;ldquo;각 관절이 얼마나 움직이면 로봇 손끝이 얼마나 움직이는가?&amp;rdquo;&lt;/span&gt;&lt;/blockquote&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;로봇공학에서는 단순히 위치만 중요하지 않다.&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;어느 방향으로 움직이는지&lt;/li&gt;
&lt;li&gt;힘이 어떻게 전달되는지&lt;/li&gt;
&lt;li&gt;충돌 직전에 어떻게 반응하는지&lt;/li&gt;
&lt;/ul&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;Jacobian은 이런 &amp;ldquo;움직임의 변화량&amp;rdquo;을 계산할 때 사용된다.&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;IK(Inverse Kinematics)가 &quot;목표 위치로 가기 위한 관절 각도 계산&quot; 이라면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jacobian은 &quot;관절이 조금 움직였을 때 끝단이 어떻게 변하는지 계산&quot; 에 가깝다.&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;이때 로봇은:&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;얼마나&lt;/li&gt;
&lt;li&gt;어떤 속도로&lt;/li&gt;
&lt;/ul&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&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;Jacobian은 이 관계를 행렬 형태로 표현한다.&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;110&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sbjMB/dJMcai4pD3p/CbSsKALbmFK2T9zrwaqUwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sbjMB/dJMcai4pD3p/CbSsKALbmFK2T9zrwaqUwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sbjMB/dJMcai4pD3p/CbSsKALbmFK2T9zrwaqUwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsbjMB%2FdJMcai4pD3p%2FCbSsKALbmFK2T9zrwaqUwk%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;110&quot; height=&quot;47&quot; data-origin-width=&quot;110&quot; data-origin-height=&quot;47&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;224&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFnSlm/dJMcadIL6eE/Kl8tiNfio0VJBXjWDKTel0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFnSlm/dJMcadIL6eE/Kl8tiNfio0VJBXjWDKTel0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFnSlm/dJMcadIL6eE/Kl8tiNfio0VJBXjWDKTel0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFnSlm%2FdJMcadIL6eE%2FKl8tiNfio0VJBXjWDKTel0%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;224&quot; height=&quot;84&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;84&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 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;즉:&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;관절 속도 &amp;rarr; 끝단 속도
&lt;/code&gt;&lt;/pre&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;비유하면 자동차의 &amp;ldquo;핸들 조향 시스템&amp;rdquo;과 비슷하다.&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;차량이 어느 방향으로 움직이는지&lt;/li&gt;
&lt;/ul&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;Jacobian도:&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;끝단 움직임&lt;/li&gt;
&lt;/ul&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;로봇공학에서 Jacobian은 굉장히 중요하다. 왜냐하면 실제 로봇은 단순 위치 제어만 하지 않기 때문이다.&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;힘 제어&lt;/li&gt;
&lt;li&gt;순응 제어(Compliance)&lt;/li&gt;
&lt;li&gt;충돌 회피&lt;/li&gt;
&lt;li&gt;경로 추종&lt;/li&gt;
&lt;li&gt;임피던스 제어&lt;/li&gt;
&lt;/ul&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;이런 제어 대부분이 Jacobian 기반으로 동작한다.&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;pre class=&quot;&quot;&gt;&lt;code&gt;끝단에 가해진 힘
&amp;rarr; 각 관절 토크로 변환
&lt;/code&gt;&lt;/pre&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;이때 Jacobian의 Transpose가 사용된다.&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;즉 Jacobian은 단순 수학 행렬이 아니라:&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;관절 공간(Joint Space)&quot;
&amp;harr;
&quot;작업 공간(Task Space)&quot;
&lt;/code&gt;&lt;/pre&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;특히 로보틱스에서 Jacobian을 반드시 알아야 하는 이유는 &lt;b&gt;&amp;ldquo;속도 제어&amp;rdquo;&lt;/b&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;IK는 보통 목표 위치만 계산한다.&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;얼마나 부드럽게 움직일지&lt;/li&gt;
&lt;li&gt;실시간으로 어떻게 수정할지&lt;/li&gt;
&lt;/ul&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;이 과정에서 Jacobian이 사용된다.&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;로봇도 마찬가지다.&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;현재 Jacobian 계산&lt;/li&gt;
&lt;li&gt;관절 속도 수정&lt;/li&gt;
&lt;li&gt;끝단 방향 변경&lt;/li&gt;
&lt;/ul&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;특히 Jacobian에서 가장 중요한 개념 중 하나가 Singulariy(특이점)이다.&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;pre class=&quot;&quot;&gt;&lt;code&gt;로봇이 특정 방향으로 움직이기 어려워지는 상태
&lt;/code&gt;&lt;/pre&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;쉽게 말하면 &amp;ldquo;관절 구조가 일직선처럼 펴져서 자유도가 사라지는 상태&amp;rdquo; 라고 볼 수 있다.&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;이 상태에서는:&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;움직임 제어가 부자연스럽다.&lt;/li&gt;
&lt;/ul&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;대표적인 예시는 산업용 로봇 팔이 완전히 펴진 상태다.&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;수학적으로는 Jacobian의 determinant가 0에 가까워지는 상태를 의미한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;133&quot; data-origin-height=&quot;49&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SGA44/dJMb997xcxc/wC6dlb9cLBtt12nzEnZvsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SGA44/dJMb997xcxc/wC6dlb9cLBtt12nzEnZvsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SGA44/dJMb997xcxc/wC6dlb9cLBtt12nzEnZvsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSGA44%2FdJMb997xcxc%2FwC6dlb9cLBtt12nzEnZvsk%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;133&quot; height=&quot;49&quot; data-origin-width=&quot;133&quot; data-origin-height=&quot;49&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;제어 불안정&lt;/li&gt;
&lt;li&gt;진동 발생&lt;/li&gt;
&lt;li&gt;경로 추종 실패&lt;/li&gt;
&lt;li&gt;충돌 위험 증가&lt;/li&gt;
&lt;/ul&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;실제 로봇 제어기에서는 Singulariy를 매우 중요하게 다룬다.&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;경로 자동 수정&lt;/li&gt;
&lt;li&gt;Jacobian damping 적용&lt;/li&gt;
&lt;li&gt;Motion Planning 우회&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 로봇 시스템에서는 Jacobian이 단독으로 사용되기보다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IK Solver&lt;/li&gt;
&lt;li&gt;Motion Planning&lt;/li&gt;
&lt;li&gt;Force Control&lt;/li&gt;
&lt;li&gt;MPC(Model Predictive Control)&lt;/li&gt;
&lt;li&gt;Reinforcement Learning&lt;/li&gt;
&lt;/ul&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;결국 Jacobian Matrix는 단순한 수학 행렬이 아니라,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;로봇의 움직임과 힘을 실시간으로 연결해주는 핵심 제어 구조&amp;rdquo;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;라고 볼 수 있다.&lt;/p&gt;</description>
      <category>2026/뉴로메카 인턴</category>
      <category>robotics</category>
      <category>로보틱스</category>
      <category>로봇공학</category>
      <author>yebeen.kim</author>
      <guid isPermaLink="true">https://canyouseehuh.tistory.com/17</guid>
      <comments>https://canyouseehuh.tistory.com/17#entry17comment</comments>
      <pubDate>Thu, 21 May 2026 13:48:35 +0900</pubDate>
    </item>
    <item>
      <title>[Robotics] Inverse Kinematics 역기구학이란?</title>
      <link>https://canyouseehuh.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;IK(Inverse Kinematics, 역기구학)은 로봇이 &amp;ldquo;목표 위치에 도달하기 위해 각 관절을 얼마나 움직여야 하는지 계산하는 기술&amp;rdquo;이다.&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;ldquo;로봇 손끝을 원하는 위치로 보내기 위해 관절 각도를 계산하는 과정&amp;rdquo; 이라고 볼 수 있다.&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;예를 들어 사람 팔을 생각해보자.&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;팔꿈치를 몇 도 굽히고&lt;/li&gt;
&lt;li&gt;손목을 얼마나 꺾을지&lt;/li&gt;
&lt;/ul&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;그냥 &amp;ldquo;컵 위치&amp;rdquo;를 보고 자연스럽게 손을 움직인다.&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;하지만 로봇은 다르다. 로봇은 목표 위치만 알려준다고 움직일 수 없다.&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;pre class=&quot;ini&quot;&gt;&lt;code&gt;x = 0.5
y = 0.2
z = 0.3
&lt;/code&gt;&lt;/pre&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;로봇은:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1번 축 몇 도&lt;/li&gt;
&lt;li&gt;2번 축 몇 도&lt;/li&gt;
&lt;li&gt;3번 축 몇 도&lt;/li&gt;
&lt;/ul&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;이 계산 과정이 바로 IK다.&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;반대로 FK(Forward Kinematics, 순기구학)도 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FK는: &amp;ldquo;관절 각도를 알 때 로봇 끝단 위치를 계산하는 것&amp;rdquo; 이다.&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;FK = 각도 &amp;rarr; 위치 계산&lt;/li&gt;
&lt;li&gt;IK = 위치 &amp;rarr; 각도 계산&lt;/li&gt;
&lt;/ul&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;비유하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FK = &amp;ldquo;팔을 이렇게 움직이면 손이 어디로 가는가?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;IK = &amp;ldquo;손을 저 위치로 보내려면 팔을 어떻게 움직여야 하는가?&amp;rdquo;&lt;/li&gt;
&lt;/ul&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1402&quot; data-origin-height=&quot;1122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dP7S68/dJMcaarHTUe/4b2rMAjujWBKqhndvP6j30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dP7S68/dJMcaarHTUe/4b2rMAjujWBKqhndvP6j30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dP7S68/dJMcaarHTUe/4b2rMAjujWBKqhndvP6j30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdP7S68%2FdJMcaarHTUe%2F4b2rMAjujWBKqhndvP6j30%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;1402&quot; height=&quot;1122&quot; data-origin-width=&quot;1402&quot; data-origin-height=&quot;1122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로봇공학에서 IK는 굉장히 중요하다.&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;u&gt;&lt;b&gt;&amp;ldquo;로봇 끝단(End Effector)을 특정 위치로 이동시키는 것&amp;rdquo;&lt;/b&gt; &lt;/u&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;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;용접&lt;/li&gt;
&lt;li&gt;드릴 작업&lt;/li&gt;
&lt;li&gt;조립&lt;/li&gt;
&lt;li&gt;피킹(Picking)&lt;/li&gt;
&lt;li&gt;패킹(Packing)&lt;/li&gt;
&lt;li&gt;검사&lt;/li&gt;
&lt;li&gt;도색&lt;/li&gt;
&lt;/ul&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;즉 로봇은 항상:&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;이 위치로 가라&quot;
&lt;/code&gt;&lt;/pre&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;그리고 IK가:&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;그 위치로 가려면 관절을 이렇게 움직여라&quot;
&lt;/code&gt;&lt;/pre&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;특히 산업용 로봇에서는 IK가 핵심 기술 중 하나다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 6축 로봇을 생각해보자.&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;6축 로봇은 보통:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Base 회전&lt;/li&gt;
&lt;li&gt;Shoulder&lt;/li&gt;
&lt;li&gt;Elbow&lt;/li&gt;
&lt;li&gt;Wrist 1&lt;/li&gt;
&lt;li&gt;Wrist 2&lt;/li&gt;
&lt;li&gt;Wrist 3&lt;/li&gt;
&lt;/ul&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;로봇 끝단 위치 하나를 이동시키기 위해 여러 관절이 동시에 움직여야 한다.&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;즉 IK는 단순히 &amp;ldquo;하나의 각도 계산&amp;rdquo;이 아니라, &amp;ldquo;여러 관절이 협력해서 목표 자세를 만드는 계산&amp;rdquo; 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 IK 계산은 생각보다 복잡하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면 &lt;i&gt;&lt;u&gt;같은 위치라도 여러 자세가 가능&lt;/u&gt;&lt;/i&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;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;아래로 내려 잡을 수도 있다.&lt;/li&gt;
&lt;/ul&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;즉 하나의 목표 위치에 대해:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 해(solution)가 존재할 수 있고&lt;/li&gt;
&lt;li&gt;어떤 경우에는 도달 자체가 불가능할 수도 있다.&lt;/li&gt;
&lt;/ul&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;관절 제한 범위를 넘어가는 위치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등은 IK 해를 구할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IK 계산 방식은 크게 두 가지로 나뉜다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Analytical IK (해석적 IK)&lt;/li&gt;
&lt;/ol&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;예를 들어 2축 로봇이라면 삼각함수를 이용해 계산할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 2축 로봇 예시:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K6U24/dJMcadWdqg4/Q2VK4Kk6vmo4Fl6VSXfh60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K6U24/dJMcadWdqg4/Q2VK4Kk6vmo4Fl6VSXfh60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K6U24/dJMcadWdqg4/Q2VK4Kk6vmo4Fl6VSXfh60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK6U24%2FdJMcadWdqg4%2FQ2VK4Kk6vmo4Fl6VSXfh60%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;278&quot; height=&quot;87&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;87&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;이 식을 역으로 풀어 관절 각도를 계산한다.&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;정확하다&lt;/li&gt;
&lt;/ul&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Numerical IK (수치적 IK)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;대표적인 방법:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jacobian&lt;/li&gt;
&lt;li&gt;Gradient Descent&lt;/li&gt;
&lt;li&gt;CCD&lt;/li&gt;
&lt;li&gt;FABRIK&lt;/li&gt;
&lt;/ul&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;쉽게 말하면:&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;현재 자세 &amp;rarr; 오차 계산 &amp;rarr; 조금 수정 &amp;rarr; 다시 계산
&lt;/code&gt;&lt;/pre&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;예를 들어 NVIDIA의 Isaac Sim 이나 로봇 시뮬레이터에서도 IK는 핵심 기능이다.&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;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;로봇 손을 저 위치로 이동&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시키면 내부적으로 IK Solver가 관절 값을 계산한다.&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;특히 디지털 트윈 환경에서는 IK가 매우 중요하다.&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;예를 들어:&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;배터리 분해&lt;/li&gt;
&lt;li&gt;볼트 제거&lt;/li&gt;
&lt;li&gt;용접&lt;/li&gt;
&lt;li&gt;부품 조립&lt;/li&gt;
&lt;/ul&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;IK가 없다면 로봇은:&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;자세 유지&lt;/li&gt;
&lt;li&gt;충돌 회피&lt;/li&gt;
&lt;li&gt;자연스러운 관절 움직임&lt;/li&gt;
&lt;/ul&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;최근에는 단순 IK를 넘어서 Motion Planning과 함께 사용되는 경우가 많다.&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;IK &amp;rarr; 목표 자세 계산&lt;/li&gt;
&lt;li&gt;Motion Planning &amp;rarr; 충돌 없이 경로 생성&lt;/li&gt;
&lt;/ul&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;대표적으로:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MoveIt&lt;/li&gt;
&lt;li&gt;cuRobo&lt;/li&gt;
&lt;li&gt;OMPL&lt;/li&gt;
&lt;/ul&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;즉 현대 로봇 시스템에서 IK는 단순한 수학 계산이 아니라,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;ldquo;로봇이 원하는 위치로 자연스럽고 안전하게 움직이기 위한 핵심 기반 기술&amp;rdquo; 이라고 볼 수 있다.&lt;/p&gt;</description>
      <category>2026/뉴로메카 인턴</category>
      <category>Ik</category>
      <category>로보틱스</category>
      <category>역기구학</category>
      <author>yebeen.kim</author>
      <guid isPermaLink="true">https://canyouseehuh.tistory.com/16</guid>
      <comments>https://canyouseehuh.tistory.com/16#entry16comment</comments>
      <pubDate>Fri, 8 May 2026 18:03:51 +0900</pubDate>
    </item>
    <item>
      <title>[Digital Twin] 공정 시뮬레이션과 FSM 구조</title>
      <link>https://canyouseehuh.tistory.com/15</link>
      <description>&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;FSM(Finite State Machine)&lt;/b&gt;은 &amp;ldquo;상태 기반으로 시스템의 동작을 제어하는 방식&amp;rdquo;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면 &amp;ldquo;현재 어떤 상태(State)에 있는지에 따라 다음 행동이 결정되는 구조&amp;rdquo; 라고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 자동문을 생각해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;자동문은 아무 때나 움직이지 않는다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;닫힘 상태 &amp;rarr; 사람이 감지되면 열림 상태로 전환&lt;/li&gt;
&lt;li&gt;열림 상태 &amp;rarr; 일정 시간이 지나면 닫힘 상태로 전환&lt;/li&gt;
&lt;li&gt;장애물 감지 상태 &amp;rarr; 다시 열림 상태 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 자동문은 &amp;ldquo;현재 상태&amp;rdquo;를 기준으로 동작한다.&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;이런 구조가 바로 FSM이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FSM는 크게 다음 요소들로 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&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 style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;State (상태)&lt;/b&gt; : 현재 시스템이 어떤 상태인지 의미한다.&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;Idle&lt;/li&gt;
&lt;li&gt;Moving&lt;/li&gt;
&lt;li&gt;Waiting&lt;/li&gt;
&lt;li&gt;Error&lt;/li&gt;
&lt;li&gt;Finished&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Transition (상태 전이)&lt;/b&gt; : 특정 조건이 만족되었을 때 다른 상태로 이동하는 것이다.&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;작업 완료&lt;/li&gt;
&lt;li&gt;타이머 종료&lt;/li&gt;
&lt;li&gt;충돌 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Event / Condition&lt;/b&gt; : 상태를 변경시키는 조건이다.&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;MQTT 메시지 수신&lt;/li&gt;
&lt;li&gt;센서 ON&lt;/li&gt;
&lt;li&gt;로봇 위치 도달&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Action&lt;/b&gt; : 상태가 변경될 때 수행하는 행동이다.&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;로봇 이동&lt;/li&gt;
&lt;li&gt;경고 알람 출력&lt;/li&gt;
&lt;li&gt;다음 공정 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&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;FSM를 비유하면 &amp;ldquo;게임 퀘스트 진행 시스템&amp;rdquo;과 비슷하다.&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;NPC 대화 중&lt;/li&gt;
&lt;li&gt;몬스터 처치 완료&lt;/li&gt;
&lt;li&gt;보상 수령 완료&lt;/li&gt;
&lt;/ul&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;그리고 특정 조건이 만족될 때 다음 단계로 넘어간다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 간단하게 pick and place 공정을 생각해보자.&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-filename=&quot;ChatGPT Image 2026년 5월 7일 오전 09_35_41.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XqcGq/dJMcabRC9OS/MxpvQUhFjz5vKFpDDZN9x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XqcGq/dJMcabRC9OS/MxpvQUhFjz5vKFpDDZN9x1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XqcGq/dJMcabRC9OS/MxpvQUhFjz5vKFpDDZN9x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXqcGq%2FdJMcabRC9OS%2FMxpvQUhFjz5vKFpDDZN9x1%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;1536&quot; height=&quot;1024&quot; data-filename=&quot;ChatGPT Image 2026년 5월 7일 오전 09_35_41.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&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;공정 상태 예시:&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Idle
&amp;rarr; Bolt Detected
&amp;rarr; Robot Pick
&amp;rarr; Bolt Place
&amp;rarr; Conveyor Move
&amp;rarr; Inspection
&amp;rarr; Finish&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, Robot Pick 상태에서는:&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;그리퍼 닫기&lt;/li&gt;
&lt;li&gt;배터리 집기&lt;/li&gt;
&lt;/ul&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;반면 Bolt Place 상태에서는:&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;볼트 위치 이동&lt;/li&gt;
&lt;li&gt;볼트 놓기&lt;/li&gt;
&lt;/ul&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;즉 FSM은 &amp;ldquo;현재 공정이 어디까지 진행되었는지&amp;rdquo;를 명확하게 관리해준다.&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;디지털 트윈 환경에서는 FSM이 특히 중요하다. 왜냐하면 현실 공정과 가상 공정의 흐름을 동일하게 맞춰야 하기 때문이다.&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;예를 들어 Isaac Sim 같은 시뮬레이터에서는:&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;컨베이어 상태&lt;/li&gt;
&lt;li&gt;센서 상태&lt;/li&gt;
&lt;li&gt;작업 완료 여부&lt;/li&gt;
&lt;/ul&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;이 상태들을 제대로 관리하지 않으면:&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;컨베이어가 움직이는 중인데 로봇 접근&lt;/li&gt;
&lt;li&gt;센서 감지 전에 작업 시작&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FSM은 이런 문제를 방지한다.&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;pre class=&quot;isbl&quot;&gt;&lt;code&gt;if current_state == &quot;RobotWorking&quot;:
    conveyor_stop()

if current_state == &quot;ConveyorMoving&quot;:
    robot_wait()
&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;u&gt;&lt;b&gt;상태 기반&lt;/b&gt;&lt;/u&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;실제 스마트팩토리에서는 FSM이 거의 기본 구조처럼 사용된다.&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;PLC 제어&lt;/li&gt;
&lt;li&gt;로봇 공정 제어&lt;/li&gt;
&lt;li&gt;AMR 이동 제어&lt;/li&gt;
&lt;li&gt;컨베이어 자동화&lt;/li&gt;
&lt;li&gt;공정 순서 관리&lt;/li&gt;
&lt;li&gt;설비 인터락(interlock)&lt;/li&gt;
&lt;li&gt;디지털 트윈 동기화&lt;/li&gt;
&lt;/ul&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;ldquo;순서&amp;rdquo;와 &amp;ldquo;상태&amp;rdquo;가 매우 중요하다.&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;센서 감지&lt;/li&gt;
&lt;li&gt;컨베이어 정지&lt;/li&gt;
&lt;li&gt;로봇 접근&lt;/li&gt;
&lt;li&gt;작업 수행&lt;/li&gt;
&lt;li&gt;작업 완료 확인&lt;/li&gt;
&lt;li&gt;다음 공정 전달&lt;/li&gt;
&lt;/ol&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;FSM은 이런 흐름을 명확하게 구조화한다. 또한 FSM은 디버깅이 쉽다는 장점도 있다.&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;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Current State = BoltRemove
&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 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;그래서 실제 산업 환경에서는 FSM을 단순한 이론이 아니라 &amp;ldquo;공정 제어의 핵심 구조&amp;rdquo;로 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;특히 디지털 트윈에서는 현실 공정의 상태 변화와 가상 공정의 상태 변화를 동일하게 유지해야 하기 때문에,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;FSM 기반 구조가 매우 중요해진다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;결국 FSM은 단순한 상태 관리 기법이 아니라,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;복잡한 공정 시스템을 안전하고 예측 가능하게 운영하기 위한 핵심 설계 방식이라고 볼 수 있다.&lt;/p&gt;</description>
      <category>2026/뉴로메카 인턴</category>
      <category>fsm</category>
      <category>디지털트윈</category>
      <category>스마트팩토리</category>
      <author>yebeen.kim</author>
      <guid isPermaLink="true">https://canyouseehuh.tistory.com/15</guid>
      <comments>https://canyouseehuh.tistory.com/15#entry15comment</comments>
      <pubDate>Thu, 7 May 2026 09:33:45 +0900</pubDate>
    </item>
    <item>
      <title>[MQTT] MQTT Broker 설치 및 테스트 방법</title>
      <link>https://canyouseehuh.tistory.com/14</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 실제로 MQTT를 사용하는 방법에 대해 알아보자.&lt;br /&gt;가장 많이 사용하는 MQTT Broker 중 하나인 Eclipse Mosquitto 를 기준으로 설명한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Mosquitto는 가볍고 설치가 쉬워서 MQTT를 처음 공부할 때 가장 많이 사용되는 브로커이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 MQTT에서 자주 등장하는 핵심 용어부터 이해해야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Broker&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Broker는 MQTT 통신의 &amp;ldquo;중앙 우체국&amp;rdquo; 역할을 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;모든 장치는 Broker에게 메시지를 보내고,&lt;br /&gt;Broker는 해당 메시지를 필요한 장치들에게 전달한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;MQTT 통신의 중심&lt;/li&gt;
&lt;li&gt;Publisher와 Subscriber를 연결하는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;을 담당한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;센서가 &amp;ldquo;온도 80도&amp;rdquo; 메시지를 보냄&lt;/li&gt;
&lt;li&gt;Broker가 해당 메시지를 전달&lt;/li&gt;
&lt;li&gt;모니터링 프로그램이 메시지를 수신&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;하는 구조다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Publish&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Publish는 메시지를 보내는 행위를 의미한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;로봇이 작업 완료 상태를 보냄&lt;/li&gt;
&lt;li&gt;컨베이어가 정지 상태를 보냄&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이런 행동이 모두 Publish다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;MQTT에서는 특정 &amp;ldquo;Topic&amp;rdquo;에 메시지를 발행한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre class=&quot;pf&quot;&gt;&lt;code&gt;factory/temperature
robot/status
conveyor/state
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Subscribe&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Subscribe는 특정 Topic의 메시지를 구독하는 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 모니터링 프로그램이:&lt;/p&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;factory/temperature
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;를 구독하고 있다면, 해당 Topic으로 Publish되는 메시지를 실시간으로 받게 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Topic&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Topic은 메시지가 지나가는 &amp;ldquo;채널 이름&amp;rdquo;이라고 생각하면 쉽다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;카카오톡 오픈채팅방&lt;/li&gt;
&lt;li&gt;방송 주제&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;같은 개념이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;robot/1/status
robot/2/status
factory/alarm
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;처럼 계층 구조로 관리할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 실제로 MQTT를 사용해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Windows 기준으로 Eclipse Mosquitto 설치 방법부터 진행한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Mosquitto 다운로드&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;공식 사이트( &lt;a href=&quot;https://mosquitto.org/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://mosquitto.org/download/&lt;/a&gt; )에서 설치 파일을 다운로드한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mosquitto installer 다운로드&lt;/li&gt;
&lt;li&gt;Windows x64 installer 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(&lt;a href=&quot;https://velog.io/@bi-sz/MQTT-Mosquitto-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@bi-sz/MQTT-Mosquitto-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1778055102510&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;[MQTT] Mosquitto 설치 및 테스트&quot; data-og-description=&quot;[MQTT] Mosquitto 설치 및 테스트&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@bi-sz/MQTT-Mosquitto-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8&quot; data-og-url=&quot;https://velog.io/@bi-sz/MQTT-Mosquitto-설치-및-테스트&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ZdnvN/dJMb9kT6UTP/kWvptqb1jd1LHnhLQ0Fke1/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bY9Zrm/dJMb9jOqR96/PUk1omc9GLwedgIfi1p4pk/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bNNmsw/dJMb9dHr7Jw/vgZUdKCDKgcF2mT6REmSwk/img.png?width=1755&amp;amp;height=847&amp;amp;face=0_0_1755_847&quot;&gt;&lt;a href=&quot;https://velog.io/@bi-sz/MQTT-Mosquitto-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@bi-sz/MQTT-Mosquitto-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ZdnvN/dJMb9kT6UTP/kWvptqb1jd1LHnhLQ0Fke1/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bY9Zrm/dJMb9jOqR96/PUk1omc9GLwedgIfi1p4pk/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bNNmsw/dJMb9dHr7Jw/vgZUdKCDKgcF2mT6REmSwk/img.png?width=1755&amp;amp;height=847&amp;amp;face=0_0_1755_847');&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;[MQTT] Mosquitto 설치 및 테스트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[MQTT] Mosquitto 설치 및 테스트&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;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 style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;설치 후 기본 경로는 보통 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;C:\Program Files\mosquitto
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;설치가 끝났다면 터미널에서 Mosquitto Broker를 실행해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;PowerShell 또는 CMD 실행:&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;cd &quot;C:\Program Files\mosquitto&quot;

mosquitto -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;여기서:&lt;/p&gt;
&lt;pre class=&quot;diff&quot;&gt;&lt;code&gt;-v
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;는 verbose 옵션으로, 브로커 로그를 자세하게 출력한다. 정상적으로 실행되면 다음과 비슷한 로그가 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIl8iT/dJMcaaFdShh/NJkx29kgw3jLqeV8yy8GO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIl8iT/dJMcaaFdShh/NJkx29kgw3jLqeV8yy8GO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIl8iT/dJMcaaFdShh/NJkx29kgw3jLqeV8yy8GO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIl8iT%2FdJMcaaFdShh%2FNJkx29kgw3jLqeV8yy8GO0%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;1030&quot; height=&quot;286&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;1883 포트에서 MQTT Broker 실행 중...
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 1883은 MQTT 기본 포트다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 Subscriber를 실행해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;새 터미널을 하나 더 열고:&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;mosquitto_sub -h localhost -t test/topic
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;를 입력한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;mosquitto_sub &amp;rarr; Subscriber 실행&lt;/li&gt;
&lt;li&gt;-h localhost &amp;rarr; 현재 PC의 Broker 사용&lt;/li&gt;
&lt;li&gt;-t test/topic &amp;rarr; 해당 Topic 구독&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉, &amp;ldquo;test/topic 채널의 메시지를 계속 듣고 있어라&amp;rdquo; 라는 의미다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 Publisher를 실행해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;또 다른 터미널에서:&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;mosquitto_pub -h localhost -t test/topic -m &quot;Hello World!&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; 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;779&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mWRuY/dJMcafGv25S/mPK4pwjtK2gp0CBgkCSwoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mWRuY/dJMcafGv25S/mPK4pwjtK2gp0CBgkCSwoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mWRuY/dJMcafGv25S/mPK4pwjtK2gp0CBgkCSwoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmWRuY%2FdJMcafGv25S%2FmPK4pwjtK2gp0CBgkCSwoK%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;779&quot; height=&quot;117&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;mosquitto_pub &amp;rarr; Publisher 실행&lt;/li&gt;
&lt;li&gt;-h localhost &amp;rarr; 현재 PC Broker 사용&lt;/li&gt;
&lt;li&gt;-t test/topic &amp;rarr; 메시지를 보낼 Topic&lt;/li&gt;
&lt;li&gt;-m &amp;rarr; 실제 메시지 내용&lt;/li&gt;
&lt;/ul&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 style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 Subscriber 터미널에서:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lgFXZ/dJMcai4etzp/1LMAqUAx2pWHTH7O3LRk40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lgFXZ/dJMcai4etzp/1LMAqUAx2pWHTH7O3LRk40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lgFXZ/dJMcai4etzp/1LMAqUAx2pWHTH7O3LRk40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlgFXZ%2FdJMcai4etzp%2F1LMAqUAx2pWHTH7O3LRk40%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;626&quot; height=&quot;119&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;Hello MQTT
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;가 출력된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉 현재 구조는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Publisher
    &amp;darr;
MQTT Broker
    &amp;darr;
Subscriber
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 통해 MQTT의 핵심 구조를 직접 확인할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;특히 중요한 점은 Publisher와 Subscriber가 서로 직접 연결되지 않는다는 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;둘은 Broker만 알고 있고, Broker가 중간에서 메시지를 전달해준다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 시스템 확장이 매우 쉬워진다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;센서&lt;/li&gt;
&lt;li&gt;웹 UI&lt;/li&gt;
&lt;li&gt;데이터베이스&lt;/li&gt;
&lt;li&gt;디지털 트윈 시뮬레이터&lt;/li&gt;
&lt;li&gt;모바일 앱&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;등이 모두 같은 MQTT Broker를 통해 연결될 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;실시간 모니터링&lt;/li&gt;
&lt;li&gt;로봇 제어&lt;/li&gt;
&lt;li&gt;경고 알람&lt;/li&gt;
&lt;li&gt;센서 데이터 수집&lt;/li&gt;
&lt;li&gt;디지털 트윈 연동&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;등을 구현한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MQTT는 단순한 테스트에서는 매우 간단해 보이지만,&lt;br /&gt;실제로는 대규모 IoT와 산업 자동화 시스템의 핵심 통신 기술 중 하나로 사용되고 있다.&lt;/p&gt;</description>
      <category>2026/뉴로메카 인턴</category>
      <category>IoT</category>
      <category>mqtt</category>
      <category>디지털트윈</category>
      <category>모니터링시스템</category>
      <category>산업자동화</category>
      <author>yebeen.kim</author>
      <guid isPermaLink="true">https://canyouseehuh.tistory.com/14</guid>
      <comments>https://canyouseehuh.tistory.com/14#entry14comment</comments>
      <pubDate>Wed, 6 May 2026 17:19:15 +0900</pubDate>
    </item>
    <item>
      <title>[MQTT] MQTT란 무엇인가?</title>
      <link>https://canyouseehuh.tistory.com/13</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MQTT는 &lt;b&gt;&amp;ldquo;가볍고 빠르게 메시지를 주고받기 위한 통신 프로토콜&amp;rdquo;&lt;/b&gt;이다.&lt;br /&gt;특히 IoT(사물인터넷), 스마트 공장, 로봇, 센서 시스템처럼 작은 장치들이 서로 데이터를 계속 주고받아야 하는 환경에서 많이 사용된다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;쉽게 말하면 MQTT는 &amp;ldquo;장치들끼리 서로 대화할 수 있게 해주는 우체국 시스템&amp;rdquo;에 가깝다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;로봇팔&lt;/li&gt;
&lt;li&gt;컨베이어 벨트&lt;/li&gt;
&lt;li&gt;모니터링 PC&lt;/li&gt;
&lt;li&gt;디지털 트윈 시뮬레이터(예: Isaac Sim)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ChatGPT Image 2026년 5월 6일 오후 05_00_56.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqTPc7/dJMcadaMvPC/vd361bUAaGPfJi7zWLVHyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqTPc7/dJMcadaMvPC/vd361bUAaGPfJi7zWLVHyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqTPc7/dJMcadaMvPC/vd361bUAaGPfJi7zWLVHyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqTPc7%2FdJMcadaMvPC%2Fvd361bUAaGPfJi7zWLVHyk%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;1536&quot; height=&quot;1024&quot; data-filename=&quot;ChatGPT Image 2026년 5월 6일 오후 05_00_56.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 장비들이 서로 직접 연결되어 각각 통신하려면 구조가 굉장히 복잡해진다.&lt;br /&gt;센서가 로봇에게 직접 말하고, 로봇이 또 서버와 직접 연결되고, 서버가 다시 모니터와 연결되는 식이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MQTT는 이런 구조를 단순하게 만든다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;모든 장비는 중앙의 &amp;ldquo;&lt;b&gt;Broker(브로커)&lt;/b&gt;&amp;rdquo;라는 서버에게만 메시지를 전달한다.&lt;br /&gt;그리고 필요한 메시지를 &lt;b&gt;구독(Subscribe)&lt;/b&gt;해서 받아간다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;보내는 쪽 &amp;rarr; &amp;ldquo;이 메시지 올려둘게&amp;rdquo;&lt;/li&gt;
&lt;li&gt;브로커 &amp;rarr; &amp;ldquo;필요한 사람들에게 전달할게&amp;rdquo;&lt;/li&gt;
&lt;li&gt;받는 쪽 &amp;rarr; &amp;ldquo;나는 이 종류의 메시지만 받을게&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런 구조다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;센서 &amp;rarr; &amp;ldquo;온도 80도&amp;rdquo;&lt;/li&gt;
&lt;li&gt;로봇 &amp;rarr; 해당 메시지를 받아 작업 중단&lt;/li&gt;
&lt;li&gt;모니터링 프로그램 &amp;rarr; 경고 화면 표시&lt;/li&gt;
&lt;li&gt;시뮬레이터 &amp;rarr; 가상 환경에도 동일 상황 반영&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이처럼 하나의 메시지를 여러 시스템이 동시에 사용할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MQTT의 가장 큰 특징은 &amp;ldquo;가볍다&amp;rdquo;는 점이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 웹 통신(HTTP)은 요청과 응답 과정이 상대적으로 무겁다.&lt;br /&gt;반면 MQTT는 최소한의 데이터만 주고받도록 설계되어 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;HTTP = 택배 배송&lt;/li&gt;
&lt;li&gt;MQTT = 무전기 통신&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;에 가깝다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;HTTP는 한 번 요청할 때마다 연결하고, 응답받고, 다시 끊는 과정이 크다.&lt;br /&gt;반면 MQTT는 연결을 계속 유지하면서 필요한 메시지만 빠르게 전달한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;공장 자동화&lt;/li&gt;
&lt;li&gt;로봇 제어&lt;/li&gt;
&lt;li&gt;스마트홈&lt;/li&gt;
&lt;li&gt;차량 통신&lt;/li&gt;
&lt;li&gt;IoT 디바이스&lt;/li&gt;
&lt;li&gt;디지털 트윈 시스템&lt;/li&gt;
&lt;li&gt;원격 모니터링&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;특히 로봇이나 공장 시스템에서는 &amp;ldquo;상태 변화&amp;rdquo;가 매우 중요하다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;작업 완료&lt;/li&gt;
&lt;li&gt;에러 발생&lt;/li&gt;
&lt;li&gt;컨베이어 정지&lt;/li&gt;
&lt;li&gt;배터리 부족&lt;/li&gt;
&lt;li&gt;센서 감지&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런 이벤트들을 실시간으로 여러 장비에 알려야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MQTT는 이런 이벤트 기반 구조에 굉장히 잘 맞는다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;또한 네트워크 환경이 좋지 않은 곳에서도 안정적으로 동작한다는 장점이 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;와이파이가 불안정한 IoT 기기&lt;/li&gt;
&lt;li&gt;저사양 임베디드 장치&lt;/li&gt;
&lt;li&gt;이동 중인 장비&lt;/li&gt;
&lt;li&gt;공장 내부 무선 환경&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;같은 곳에서도 비교적 안정적으로 메시지를 전달할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MQTT의 핵심 장점을 정리하면 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;가볍고 빠르다&lt;br /&gt;작은 데이터만 주고받기 때문에 속도가 빠르고 네트워크 부담이 적다.&lt;/li&gt;
&lt;li&gt;실시간 통신에 적합하다&lt;br /&gt;연결을 계속 유지하므로 상태 변화 전달이 빠르다.&lt;/li&gt;
&lt;li&gt;구조가 단순하다&lt;br /&gt;브로커 중심 구조라 시스템 확장이 쉽다.&lt;/li&gt;
&lt;li&gt;여러 시스템이 동시에 데이터 활용 가능&lt;br /&gt;하나의 메시지를 로봇, 서버, UI, 시뮬레이터가 동시에 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;IoT와 공장 자동화에 매우 적합하다&lt;br /&gt;저사양 장치에서도 안정적으로 동작한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;현재 MQTT는 단순한 IoT를 넘어서 스마트 팩토리, 로봇 제어, 디지털 트윈, 자율주행 시스템 등&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다양한 산업 분야에서 핵심 통신 방식 중 하나로 사용되고 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 글에는 로컬에서 어떻게 MQTT를 사용해볼 수 있는지 설치 및 사용방법에 대해 작성하고자 한다.&lt;/p&gt;</description>
      <category>2026/뉴로메카 인턴</category>
      <category>IoT</category>
      <category>mqtt</category>
      <category>디지털트윈</category>
      <category>스마트팩토리</category>
      <author>yebeen.kim</author>
      <guid isPermaLink="true">https://canyouseehuh.tistory.com/13</guid>
      <comments>https://canyouseehuh.tistory.com/13#entry13comment</comments>
      <pubDate>Wed, 6 May 2026 17:04:36 +0900</pubDate>
    </item>
    <item>
      <title>3_1 Histogram equalization</title>
      <link>https://canyouseehuh.tistory.com/12</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;히스토그램(Histogram) 이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지의 픽셀 값(강도, intensity 수준)에 따른 분포를 나타내는 그래프&lt;/li&gt;
&lt;li&gt;각 강도 수준에 해당하는 픽셀 수를 세어 표현하며, 일반적으로 이미지의 밝기나 색상에 따른 변화를 시각적으로 확인할 수 있다.&lt;/li&gt;
&lt;li&gt;히스토그램의 빈(bin) 수는 이미지에서 표현 가능한 강도 값의 범위인 L에 해당한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강도 수준 범위 : [0, L - 1]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjZrbR/btsJuW8GA8F/GuTPXBHMzx3yLjdMSRjuXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjZrbR/btsJuW8GA8F/GuTPXBHMzx3yLjdMSRjuXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjZrbR/btsJuW8GA8F/GuTPXBHMzx3yLjdMSRjuXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjZrbR%2FbtsJuW8GA8F%2FGuTPXBHMzx3yLjdMSRjuXk%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;500&quot; height=&quot;121&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;238&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;히스토그램 정규화 (Histogram normalization)&lt;/h4&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;이를 통해 히스토그램을 확률 분포 함수(probability function)로 해석할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;즉, 각 강도 수준에 대한 픽셀 비율을 계산하여 &lt;b&gt;이미지의 전체적인 밝기 분포&lt;/b&gt;를 파악할 수 있게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;히스토그램 계산하는 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 41.0465%; height: 102px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;width: 20%; text-align: left; height: 17px;&quot;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;Intensity level is 16 [0, 15]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설명&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;6 x 5 배열로, 30개의 픽셀로 이루어져있다.&lt;/li&gt;
&lt;li&gt;강도 수준은 [0, 15] 까지 존재하며, 주어진 빈(bin)의 개수는 4개이다.&lt;/li&gt;
&lt;li&gt;주어진 배열에서 각 강도 수준의 픽셀 수를 세고, 이를 각 빈에 맞춰 정리한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번째 빈 : [0 ~ 3]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강도 0, 1, 2, 3 에 해당하는 픽셀을 센다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0 (7개) + 1 (5개) + 2 (5개) + 3 (11개) = 28개 / 30개&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번째 빈 : [4 ~ 7]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강도 4, 5, 6, 7 에 해당하는 픽셀을 센다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7 (1개) = 1개 / 30개&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;3번째 빈 : [8 ~ 11]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강도 8, 9, 10, 11 에 해당하는 픽셀을 센다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10 (1개) = 1개 / 30개&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;4번째 빈 : [12 ~ 15]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강도 12, 13, 14, 15 에 해당하는 픽셀을 센다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0개 / 30개&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Number of bins : 4
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1st bin [0-3] : 28/30&lt;/li&gt;
&lt;li&gt;2nd bin [4-7] : 1/30&lt;/li&gt;
&lt;li&gt;3rd bin [8-11] : 1/30&lt;/li&gt;
&lt;li&gt;4th bin [12-15] : 0/30&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;히스토그램 평활화 (Histogram Equalization)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;히스토그램 평활화는 이미지의 &lt;b&gt;대비(Contrast)&lt;/b&gt;를 개선하는 방법입니다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이미지를 보다 선명하게 만들어 객체를 쉽게 구분할 수 있도록 돕습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이 작업은 이미지의 픽셀 값이 특정 범위에 집중되어 있을 때, &lt;u&gt;강도 값을 재분배하여 균일한 밝기 분포를 만드는 과정&lt;/u&gt;을 포함한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대비(Contrast)&lt;/b&gt;: 밝기 또는 색상의 차이로 인해 객체가 더욱 두드러져 보이는 정도
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;대비는 이미지의 강도 값 분포에 따라 결정된다, 강도 값의 차이가 클수록 대비가 높아진다&lt;/li&gt;
&lt;/ul&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;2068&quot; data-origin-height=&quot;940&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CI4PU/btsJvtLx2yl/XK4mqE3lvTxlnix1fpe070/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CI4PU/btsJvtLx2yl/XK4mqE3lvTxlnix1fpe070/img.png&quot; data-alt=&quot;intensity 값이 고르게 분배되어있을때 높은 대비값을 가지고 있다고 볼 수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CI4PU/btsJvtLx2yl/XK4mqE3lvTxlnix1fpe070/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCI4PU%2FbtsJvtLx2yl%2FXK4mqE3lvTxlnix1fpe070%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;700&quot; height=&quot;318&quot; data-origin-width=&quot;2068&quot; data-origin-height=&quot;940&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;intensity 값이 고르게 분배되어있을때 높은 대비값을 가지고 있다고 볼 수 있다.&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;b&gt;1. 히스토그램 계산 (Histogram computation)&lt;/b&gt;&lt;b&gt;&lt;/b&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 픽셀 값을 균일하게 분포시키는 매핑 함수 찾기 (Find mapping function which distributes pixel values uniformly)&lt;/b&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;이 함수는 히스토그램의 누적 분포 함수(CDF)를 사용하여 생성된다.&lt;/li&gt;
&lt;li&gt;이를 통해 기존 픽셀 값이 새로운 픽셀 값으로 변환되며, 이미지의 대비를 조정할 수 있게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 입력 이미지에 매핑 함수 적용 (Apply the mapping function to an input image)&lt;/b&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;각 픽셀의 강도 값은 매핑 함수를 통해 새롭게 변환되며, 이를 통해 히스토그램이 균일하게 조정된 이미지를 생성하게 된다.&lt;/li&gt;
&lt;li&gt;예시 코드 )&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1725871528701&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main() {
    Mat image;
    Mat hist_equalized_image;
    image = imread(&quot;lena.png&quot;, 0);  // 그레이스케일 이미지 로드
    if (!image.data) exit(1);  // 이미지 로드 실패 시 종료
    equalizeHist(image, hist_equalized_image);  // 히스토그램 평활화 적용
    imshow(&quot;Input Image&quot;, image);  // 원본 이미지 출력
    imshow(&quot;Hist Equalized Image&quot;, hist_equalized_image);  // 평활화된 이미지 출력
    waitKey(0);  // 키 입력 대기 후 종료
    return 0;
}&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;&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;히스토그램 평활화가 항상 이미지를 향상시키는 것은 아니다.&lt;/li&gt;
&lt;li&gt;특히, 특정 강도 범위의 픽셀 값이 우세한 이미지에서는 오히려 이미지의 디테일이 손상되거나, 과도하게 대비가 증가하여 불필요한 노이즈가 발생할 수 있다.&lt;/li&gt;
&lt;li&gt;따라서 이미지에 따라 히스토그램 평활화의 효과는 달라질 수 있다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>24학년도 2학기/컴퓨터 비전</category>
      <category>Histogram</category>
      <category>intensity</category>
      <category>컴퓨터비전</category>
      <author>yebeen.kim</author>
      <guid isPermaLink="true">https://canyouseehuh.tistory.com/12</guid>
      <comments>https://canyouseehuh.tistory.com/12#entry12comment</comments>
      <pubDate>Mon, 9 Sep 2024 17:47:13 +0900</pubDate>
    </item>
    <item>
      <title>matplotlib.pyplot importError</title>
      <link>https://canyouseehuh.tistory.com/11</link>
      <description>&lt;pre id=&quot;code_1714354719045&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cannot import name 'cbook' from partially initialized module 'matplotlib'
(most likely due to a circular import) 
(C:\Users\j2xb1\anaconda3\lib\site-packages\matplotlib\__init__.py)&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;module&amp;nbsp;'matplotlib._api'&amp;nbsp;has&amp;nbsp;no&amp;nbsp;attribute&amp;nbsp;'define_aliases'&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;문제점&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이전까지 잘 import되던 matplotlib이 갑자기 에러가 났다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해결방안&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;anaconda prompt를 사용하여 matplotlib 재설치한다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1714354915829&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip uninstall matplotlib

pip install matplotlib&lt;/code&gt;&lt;/pre&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;color: #f3c000; background-color: #000000;&quot;&gt;WARNING&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 메세지를 발견&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;warning: ignoring invalid distribution -atplotlib&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;C:\Users\폴더명\Anaconda3\Lib\site-packages로 가서 '~'로 시작하는 폴더를 지운다&lt;/li&gt;
&lt;li&gt;~atplotlib dist-info 폴더를 지우면&lt;span style=&quot;color: #212529; letter-spacing: 0px;&quot;&gt; waring 오류는 해결된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 최종적으로 matplotlib import에러도 해결된다.&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;&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;&lt;a href=&quot;https://velog.io/@future0716/python-warning-ignoring-invalid-distribution-umpy-OSError-No-such-file-or-directory-pip-install-selenium-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@future0716/python-warning-ignoring-invalid-distribution-umpy-OSError-No-such-file-or-directory-pip-install-selenium-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714355180439&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;[Python] warning: ignoring invalid distribution -umpy / OSError / No such file or directory / selenium 설치 오류&quot; data-og-description=&quot;첫 번째 오류 &amp;gt; warning: ignoring invalid distribution -umpy 두 번째 오류 &amp;gt; ERROR: Could not install packages due to an OSError: [Errno 2] No such file or direc&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@future0716/python-warning-ignoring-invalid-distribution-umpy-OSError-No-such-file-or-directory-pip-install-selenium-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98&quot; data-og-url=&quot;https://velog.io/@future0716/python-warning-ignoring-invalid-distribution-umpy-OSError-No-such-file-or-directory-pip-install-selenium-설치-오류&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ciBgpR/hyVVDVv0S9/5Em5OEJ9GGOk0xjApG5uD1/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500&quot;&gt;&lt;a href=&quot;https://velog.io/@future0716/python-warning-ignoring-invalid-distribution-umpy-OSError-No-such-file-or-directory-pip-install-selenium-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@future0716/python-warning-ignoring-invalid-distribution-umpy-OSError-No-such-file-or-directory-pip-install-selenium-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ciBgpR/hyVVDVv0S9/5Em5OEJ9GGOk0xjApG5uD1/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500');&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;[Python] warning: ignoring invalid distribution -umpy / OSError / No such file or directory / selenium 설치 오류&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 오류 &amp;gt; warning: ignoring invalid distribution -umpy 두 번째 오류 &amp;gt; ERROR: Could not install packages due to an OSError: [Errno 2] No such file or direc&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;</description>
      <category>24학년도 1학기/python 에러</category>
      <author>yebeen.kim</author>
      <guid isPermaLink="true">https://canyouseehuh.tistory.com/11</guid>
      <comments>https://canyouseehuh.tistory.com/11#entry11comment</comments>
      <pubDate>Mon, 29 Apr 2024 10:46:30 +0900</pubDate>
    </item>
    <item>
      <title>AgglomerativeClustering TypeError</title>
      <link>https://canyouseehuh.tistory.com/10</link>
      <description>&lt;pre id=&quot;code_1714354377337&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import pairwise_distances
from scipy.cluster.hierarchy import dendrogram
import matplotlib.pyplot as plt

li = 'average'
n_c = 10
hier = AgglomerativeClustering(n_clusters = n_c, metrix = 'euclidean', linkage=li)
pred_y = hier.fit_predict(sub_PCA_train_x)&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; letter-spacing: 0px;&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;TypeError&lt;/span&gt;&lt;/u&gt;: __init__() got an unexpected keyword argument 'metric' 발생&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;문제점&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;AgglomerativeClustering&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt; 클래스에서 &lt;/span&gt;metric&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt; 매개변수는 사용되지 않는다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;대신 &lt;/span&gt;affinity&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt; 매개변수를 사용하여 거리나 유사도 측정 방법을 지정할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;pre id=&quot;code_1714354511752&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;hier = AgglomerativeClustering(n_clusters=n_c, affinity='euclidean', linkage=li)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;metrix 매개변수 부분을 affinity 로 바꿔준&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>24학년도 1학기/python 에러</category>
      <author>yebeen.kim</author>
      <guid isPermaLink="true">https://canyouseehuh.tistory.com/10</guid>
      <comments>https://canyouseehuh.tistory.com/10#entry10comment</comments>
      <pubDate>Mon, 29 Apr 2024 10:36:48 +0900</pubDate>
    </item>
    <item>
      <title>Ch1 Introduction</title>
      <link>https://canyouseehuh.tistory.com/9</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;What OS Do&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 컴퓨터 시스템의 구성요소들을 알아야한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 hardware, OS, application programs, user 로 나뉘어진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CBQeT/btsGVKAONn7/EiuzElkQC0biPDcBGk78aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CBQeT/btsGVKAONn7/EiuzElkQC0biPDcBGk78aK/img.png&quot; data-alt=&quot;출처 : Operating System Concepts 10th (2018)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CBQeT/btsGVKAONn7/EiuzElkQC0biPDcBGk78aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCBQeT%2FbtsGVKAONn7%2FEiuzElkQC0biPDcBGk78aK%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;361&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : Operating System Concepts 10th (2018)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS를 완전히 설명할 수 있는 정의는 없다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;대략 OS는 사용자와 하드웨어 사이의 중간매개체 역할을 한다.&lt;/li&gt;
&lt;li&gt;Kernel과 추가적인 프로그램들로 이루어져있다. (Kernel은 OS의 core로 항상 실행되고있다)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS의 목표&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;사용자의 프로그램들을 실행시키고 컴퓨터의 하드웨어를 더 효율적인 방식으로 사용할 수 있게 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 OS가 무엇을 하는가하면 크게 두가지로 볼 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;OS는 환경(environment)를 제공한다.&lt;/li&gt;
&lt;li&gt;OS는 시스템 자원들(system resources)을 관리한다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 여러 앱들을 쓸 텐데 그 앱들은 컴퓨터의 메모리를 다 사용한다.&lt;/li&gt;
&lt;li&gt;하지만 그 메모리의 크기는 한정되어있다. 따라서 OS가 프로그램에 리소스들을 잘 분배하는 역할을 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Computer System Organization (컴퓨터 구조)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfTSKQ/btsGUOYdBUy/UsNTTKyK9LRJe8wUPtv3fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfTSKQ/btsGUOYdBUy/UsNTTKyK9LRJe8wUPtv3fK/img.png&quot; data-alt=&quot;출처 : Operating System Concepts 10th (2018)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfTSKQ/btsGUOYdBUy/UsNTTKyK9LRJe8wUPtv3fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfTSKQ%2FbtsGUOYdBUy%2FUsNTTKyK9LRJe8wUPtv3fK%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;626&quot; height=&quot;310&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : Operating System Concepts 10th (2018)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;CPU와 device controller들은 bus를 통해 다 연결되어있다.&lt;/li&gt;
&lt;li&gt;각각의 device controller들은 local buffer를 가지고 있다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;local buffer란? device와 device contoller간의 오가는 데이터들을 임시로 저장하기 위해 있는 메모리&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPU ) main memory&amp;nbsp;&amp;harr; local buffers&lt;/li&gt;
&lt;li&gt;Input Ouput ) device &amp;rarr; local buffers&lt;/li&gt;
&lt;li&gt;Device controller는 CPU에게 활동이 끝났다는 것을 &lt;u&gt;&lt;b&gt;interrupt&lt;/b&gt;&lt;/u&gt;를 통해 알린다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;How the Program Runs on the Computer&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Interrupt&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interrupt : 하드웨어나 소프트웨어로부터 관심이 필요하다는 것을 가리키기 위해 비동시적인 신호&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;interrupt의 유형은 IRQ number와 관련이 있다.&lt;/li&gt;
&lt;li&gt;Interrupt Handler에 의해 관리된다.&lt;/li&gt;
&lt;li&gt;(개발자의) 코드의 개별적인 부분들은 interrupt의 각 유형에 따라 어떤 행동을 취해야할지 결정한다
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;interrupt handler의 표 : interrupt vector&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HardWare interrupt : CPU로 신호를 보낸다&lt;/li&gt;
&lt;li&gt;SoftWare interrupt : System call (I/O access, memory allocation ...) , Exception (흔히 코드에서 발생하는 에러들)&lt;/li&gt;
&lt;li&gt;OS 는 interrupt를 처리하는 프로그램이라고 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Interrupt Handling&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;OS는 registers와 PC(Program Counter)를 저장함으로써 현재 CPU의 상태를 저장한다.&lt;/li&gt;
&lt;li&gt;그리고 interrupt handler로 전달한다.&lt;/li&gt;
&lt;li&gt;Interrupt는 자신의 유형에 해당하는 Interrupt Handler에 의해 처리된다.&lt;/li&gt;
&lt;li&gt;저장해두었던 CPU의 상태를 복구한 후, interrupted program으로 돌아간다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Interrupt Driven I/O&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;CPU는 request를 보내고 현재 process를 계속 진행하거나 다른 job을 한다.&lt;/li&gt;
&lt;li&gt;I/O data 전송이 끝나면 I/O 장치는 interrupt한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c62HLj/btsGSMHm6mU/ie9NW0TdCFlvzIMEt1g4pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c62HLj/btsGSMHm6mU/ie9NW0TdCFlvzIMEt1g4pK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c62HLj/btsGSMHm6mU/ie9NW0TdCFlvzIMEt1g4pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc62HLj%2FbtsGSMHm6mU%2Fie9NW0TdCFlvzIMEt1g4pK%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;369&quot; height=&quot;474&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;장점 : User program 과정은 전송중일때만 멈춘다&lt;/li&gt;
&lt;li&gt;단점 : 특별한 하드웨어를 필요로한다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;interrupt를 발생시킬, 찾아낼, cpu 상태를 저장해놓을 하드웨어&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DMA (Direct Memory Access) 가 바로 이 특별한 하드웨어이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DMA (Direct Memory Access)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DMA는 입출력 장치와 메모리 간의 데이터 전송에 사용된다.&lt;/li&gt;
&lt;li&gt;device controller는 직접적으로 거대한 양의 데이터를 main memory로 전송한다.&lt;/li&gt;
&lt;li&gt;CPU가 직접 메모리에 접근해서 데이터를 읽거나 쓸 필요가 없다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU의 과부하를 줄일 수 있다.&lt;/li&gt;
&lt;/ul&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;1280&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TIj95/btsGT05Liw5/bO8KlFTKgC4F9Ussf0hU00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TIj95/btsGT05Liw5/bO8KlFTKgC4F9Ussf0hU00/img.png&quot; data-alt=&quot;출처 : techterms.com&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TIj95/btsGT05Liw5/bO8KlFTKgC4F9Ussf0hU00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTIj95%2FbtsGT05Liw5%2FbO8KlFTKgC4F9Ussf0hU00%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;529&quot; height=&quot;205&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : techterms.com&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Computer - System Architecture&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Multiprocessor Systems&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현대 컴퓨터들은 대부분 multiprocessor(processor가 여러개인 것을 말함) 구조를 사용하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Multi-processor system은 두가지 이점을 가지고 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;처리량이 증가한다. (이상적으로, N개의 프로세서가 있으면 속도가 N배 증가한다)&lt;/li&gt;
&lt;li&gt;경제적인 측면에서 이점이다. (clustered systems와 비교했을때 이득이다, 메모리나 주변기기를 공유하기때문)&lt;/li&gt;
&lt;/ol&gt;
&lt;table style=&quot;border-collapse: collapse; width: 99.3023%; height: 320px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 64px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 64px;&quot;&gt;Symmetric multiprocessing&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 64px;&quot;&gt;Multicore system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;각기 다른 processor 안에 CPU가 있다.&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;하나의 processor 안에 두개이상의 CPU가 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 64px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 64px;&quot;&gt;동시에 많은 프로세스들을 실행시킬 수 있다.&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 64px;&quot;&gt;Chip 안에서의 소통이 빠르다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 64px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 64px;&quot;&gt;Load balancing이 중요하다.&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 64px;&quot;&gt;상당히 적은 전력을 사용한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;Non - uniform memory access : 작고 빠른 local bus를 통해 접근할 수 있는자체 local memory를 가지고 있는 CPU 집단&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;Clustered Systems&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;multiprocessor systems 처럼, 많은 system들이 함께 일한다.&lt;/li&gt;
&lt;li&gt;보통 SAN(storage area network)로 연결된 sharing storage가 있다.&lt;/li&gt;
&lt;li&gt;실패들에도 살아남는 high - availability 를 제공한다&lt;/li&gt;
&lt;li&gt;몇몇 cluster들은 HPC(high performance computing)을 위해서 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Operating - System Operations&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Bootstrap program은 시스템을 시작하고 kernel을 load하는 간단한 코드이다.&lt;/li&gt;
&lt;li&gt;Kernel이 load된다&lt;/li&gt;
&lt;li&gt;System daemons를 시작한다 (kernel의 바깥에서 제공하는 서비스들)&lt;/li&gt;
&lt;li&gt;Kernel은 하드웨어와 소프트웨어의 interrupt를 구동한다&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Multiprogramming&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;한명의 사용자는 CPU와 I/O 기기를 항상 바쁘게 유지할 수 없다&lt;/li&gt;
&lt;li&gt;multiprogramming은 CPU를 항상 무언가를 실행시키도록 job들을 만들어낸다&lt;/li&gt;
&lt;li&gt;전체 job들의 부분집합은 메모리에 유지된다&lt;/li&gt;
&lt;li&gt;그것이 기다려야할때 OS는 다른 job으로 바꾼다&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Multitasking&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;multiprogramming의 논리적 확장이라 할 수 있다.&lt;/li&gt;
&lt;li&gt;사용자가 job을 사용하는 동안, job과 상호작용할 수 있게 CPU가 꽤 자주 job들을 바꾼다&lt;/li&gt;
&lt;li&gt;각 사용자는 적어도 메모리에 실행하고 있는 하나의 프로그램은 가지고 있다.&lt;/li&gt;
&lt;li&gt;CPU는 실행할 준비가 되어있는 job을 선택한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Dual - Mode Operation&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;하드웨어와 소프트웨어의 리소스들은 공유된다&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스에서 발생한 에러로 인해 전체 시스템이 오염될 수 있다.&lt;/li&gt;
&lt;li&gt;위험한 명령어 &amp;rarr; &lt;b&gt;Dual mode operation&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;사용자 프로세스의 실행시간이 길어지는 것을 방지하기 위해 &amp;rarr; &lt;b&gt;Timer&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;User mode
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;I/O instruction, timer instruction ...&lt;/li&gt;
&lt;li&gt;Privileged instruction 은 오로지 OS system call 을 통해 호출된다&lt;/li&gt;
&lt;li&gt;다른 시스템을 해칠 수 있는 Privileged instructions는 금지된다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kernel mode
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OS code&lt;/li&gt;
&lt;li&gt;Privileged instructions 허용된다&lt;/li&gt;
&lt;/ul&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;1197&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0pMje/btsGSP5eT2c/i65Uyvt5eUeA4Ee6vre9uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0pMje/btsGSP5eT2c/i65Uyvt5eUeA4Ee6vre9uK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0pMje/btsGSP5eT2c/i65Uyvt5eUeA4Ee6vre9uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0pMje%2FbtsGSP5eT2c%2Fi65Uyvt5eUeA4Ee6vre9uK%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;687&quot; height=&quot;226&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;394&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Core components of OS&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Process Management&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Process&lt;/b&gt; : 실행 중인 프로그램&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Thread&lt;/b&gt; : 프로그램이 자신을 2개 이상의 동시에 실행되는 task로 나누는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Task&lt;/b&gt; : address space를 통한 실행 경로 (메모리에 로드되어있는 프로그램 명령어들의 집합)&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;프로세스 간의 동기화 및 통신을 관리한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Memory Management&lt;/h4&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;프로그램을 실행시키려면 모든 명령어가 메모리에 있어야하고, 프로그램이 필요로 하는 데이터 또한 메모리에 있어야한다.&lt;/li&gt;
&lt;li&gt;CPU의 활용도 및 사용자에 대한 컴퓨터 응답시간을 최적화하기 위해 메모리 관리가 수행된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;File - System Management&lt;/h4&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;각 저장 매체를 디바이스로 제어한다 (디스크 드라이브, USB 디스크 ... )&lt;/li&gt;
&lt;li&gt;파일을 디렉토리로 구성하고 대부분의 시스템에서 엑세스 제어를 통해 누가 무엇을 액세스할 수 있는지 결정한다&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Mass - Storage Management&lt;/h4&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;따라서 대용량 저장 장치의 관리가 중요하다&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Cache Management&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용 중인 정보는 느린 저장소에서 빠른 저장소로 일시적으로 복사된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;빠른 저장소 (cache)에 정보가 남아있는지 확인한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;I/O System Management&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제가 하드웨어 장치의 특이성을 사용자로부터 숨기기 위해 I/O 시스템 관리가 필요하다&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Protection and Security&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보호는 운영체제가 프로세스 또는 OS에서 정의된 리소스에 대한 액세스를 제어하는 메커니즘을 의미한다.&lt;/li&gt;
&lt;li&gt;보안은 사용자 인증을 불법적으로 획득하여 외부와 내부 공격으로부터 방어하는 것을 의미한다.&lt;/li&gt;
&lt;/ul&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;&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;a style=&quot;color: #666666;&quot; href=&quot;https://techterms.com/definition/dma&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;출처 : https://techterms.com/definition/dma&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>24학년도 1학기/Operating System(운영체제)</category>
      <author>yebeen.kim</author>
      <guid isPermaLink="true">https://canyouseehuh.tistory.com/9</guid>
      <comments>https://canyouseehuh.tistory.com/9#entry9comment</comments>
      <pubDate>Wed, 24 Apr 2024 20:12:01 +0900</pubDate>
    </item>
    <item>
      <title>[ git ]  깃, 깃허브 초기 설정</title>
      <link>https://canyouseehuh.tistory.com/8</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;깃허브.png&quot; data-origin-width=&quot;2528&quot; data-origin-height=&quot;1264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nh7lF/btsF557Mi4T/tUnGkYVHr5NsHVHL07l4cK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nh7lF/btsF557Mi4T/tUnGkYVHr5NsHVHL07l4cK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nh7lF/btsF557Mi4T/tUnGkYVHr5NsHVHL07l4cK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNh7lF%2FbtsF557Mi4T%2FtUnGkYVHr5NsHVHL07l4cK%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;400&quot; height=&quot;200&quot; data-filename=&quot;깃허브.png&quot; data-origin-width=&quot;2528&quot; data-origin-height=&quot;1264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Git 설치하기 (for Mac)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Terminal에 'git'을 실행하는 것만으로도 설치가 시작된다&lt;/li&gt;
&lt;li&gt;'git'이 설치되어있지 않으면 설치하라고 안내해준다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1711435675585&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$git --version&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mac 에 있는 Terminal에서 위 명령어를 입력하면 자신의 컴퓨터에 설치된 git의 버전을 알 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Local PC 버전관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;윈도우 : git bash 프로그램으로 설정(따로 설치해야함) / mac : terminal 사용하여 설정&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/GEJ0d/btsF3EpOvON/MHwGMIfwDckWmwpZFK17v0/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GEJ0d/btsF3EpOvON/MHwGMIfwDckWmwpZFK17v0/tfile.svg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2500&quot; data-origin-height=&quot;2419&quot; data-filename=&quot;git-bash.svg&quot; width=&quot;400&quot; height=&quot;387&quot; style=&quot;width: 41.7694%; margin-right: 10px;&quot; data-widthpercent=&quot;42.26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GEJ0d/btsF3EpOvON/MHwGMIfwDckWmwpZFK17v0/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGEJ0d%2FbtsF3EpOvON%2FMHwGMIfwDckWmwpZFK17v0%2Ftfile.svg&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;2500&quot; height=&quot;2419&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QoiWv/btsF58DtAML/qYqexFfjQwElDltUZ5PQ4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QoiWv/btsF58DtAML/qYqexFfjQwElDltUZ5PQ4k/img.png&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;966&quot; data-is-animation=&quot;false&quot; width=&quot;400&quot; height=&quot;283&quot; data-widthpercent=&quot;57.74&quot; style=&quot;width: 57.0678%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QoiWv/btsF58DtAML/qYqexFfjQwElDltUZ5PQ4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQoiWv%2FbtsF58DtAML%2FqYqexFfjQwElDltUZ5PQ4k%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;1364&quot; height=&quot;966&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;오 ) git bash / 왼 ) terminal&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Git / Github 의 커밋 사용자 이름과 이메일 설정&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git을 설치하고 나서 가장 먼저 해야하는 것은 사용자이름과 이메일 주소를 설정하는 것이다&lt;/li&gt;
&lt;li&gt;--global 옵션으로 설정하는 것은 딱 한번만 하면 된다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1711435263323&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git config --global user.name &quot;user1&quot;
git config --global user.email &quot;user1@gmail.com&quot;
git config --global color.ui = auto&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;*자세한 내용은 git 공식 홈페이지에서 더 알아볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%EB%9E%80%3F#ch01-getting-started&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%EB%9E%80%3F#ch01-getting-started&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711435334605&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;Git - 버전 관리란?&quot; data-og-description=&quot;1.1 시작하기 - 버전 관리란? 이 장에서 설명하는 것은 Git을 처음 접하는 사람에게 필요한 내용이다. 먼저 버전 관리 도구에 대한 이해와 Git을 설치하는 방법을 설명하고 마지막으로 Git 서버를 설&quot; data-og-host=&quot;git-scm.com&quot; data-og-source-url=&quot;https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%EB%9E%80%3F#ch01-getting-started&quot; data-og-url=&quot;https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%EB%9E%80%3F#ch01-getting-started&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nSkCk/hyVGOn6cF6/nXDalufrqmb7HKitewSS40/img.png?width=800&amp;amp;height=683&amp;amp;face=0_0_800_683,https://scrap.kakaocdn.net/dn/TPm7S/hyVDwij6yi/cK5Z0I9HcfP6FwbUPTqYU0/img.png?width=668&amp;amp;height=800&amp;amp;face=0_0_668_800,https://scrap.kakaocdn.net/dn/n8SfM/hyVGP1CNZ7/6NCKKwI9F7irVaan1rQoDk/img.png?width=800&amp;amp;height=556&amp;amp;face=0_0_800_556&quot;&gt;&lt;a href=&quot;https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%EB%9E%80%3F#ch01-getting-started&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%EB%9E%80%3F#ch01-getting-started&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nSkCk/hyVGOn6cF6/nXDalufrqmb7HKitewSS40/img.png?width=800&amp;amp;height=683&amp;amp;face=0_0_800_683,https://scrap.kakaocdn.net/dn/TPm7S/hyVDwij6yi/cK5Z0I9HcfP6FwbUPTqYU0/img.png?width=668&amp;amp;height=800&amp;amp;face=0_0_668_800,https://scrap.kakaocdn.net/dn/n8SfM/hyVGP1CNZ7/6NCKKwI9F7irVaan1rQoDk/img.png?width=800&amp;amp;height=556&amp;amp;face=0_0_800_556');&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;Git - 버전 관리란?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1.1 시작하기 - 버전 관리란? 이 장에서 설명하는 것은 Git을 처음 접하는 사람에게 필요한 내용이다. 먼저 버전 관리 도구에 대한 이해와 Git을 설치하는 방법을 설명하고 마지막으로 Git 서버를 설&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;git-scm.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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;github에서 새 저장소 생성하는 방법 (Remote Repo) - Mac&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 디렉토리를 Git 저장소로 만들기
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;버전관리를 안한 기존 프로젝트를 git으로 관리하고 싶은 경우 프로젝트의 디렉토리로 이동한다 (파일의 위치로 이동한다)&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1711437764706&quot; class=&quot;dockerfile&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /Users/user/my_project
$git init
git add 파일명
git commit -m 'initial project version'&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 저장소를 Clone 하기
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;git clone &amp;lt;url&amp;gt; 명령으로 저장소를 clone한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1711437831983&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git clone https://github.com/(자신의 깃허브에 있는 라이브러리 이름) 다른디렉토리이름&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;</description>
      <category>24학년도 1학기/git</category>
      <category>git</category>
      <category>github</category>
      <category>깃허브</category>
      <author>yebeen.kim</author>
      <guid isPermaLink="true">https://canyouseehuh.tistory.com/8</guid>
      <comments>https://canyouseehuh.tistory.com/8#entry8comment</comments>
      <pubDate>Tue, 26 Mar 2024 16:25:19 +0900</pubDate>
    </item>
  </channel>
</rss>