<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="kr"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://its-sun.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://its-sun.github.io/" rel="alternate" type="text/html" hreflang="kr" /><updated>2025-12-18T04:32:44+00:00</updated><id>https://its-sun.github.io/feed.xml</id><title type="html">its-seon</title><subtitle>Robotics Engineer building robots to move, see, and think.</subtitle><author><name>its-seon</name></author><entry><title type="html">EOF란?</title><link href="https://its-sun.github.io/2024/06/29/EOF.html" rel="alternate" type="text/html" title="EOF란?" /><published>2024-06-29T00:00:00+00:00</published><updated>2024-06-29T00:00:00+00:00</updated><id>https://its-sun.github.io/2024/06/29/EOF</id><content type="html" xml:base="https://its-sun.github.io/2024/06/29/EOF.html"><![CDATA[<h1>EOF(End of File)란 무엇인가?</h1>

<p>오늘은 EOF에 대해서 알아볼 예정입니다.</p>

<p>EOF는 End of File의 약자로 파일의 끝 또는 종료를 나타냅니다.</p>

<p>프로그래밍에서 파일 입출력을 처리할 때, 파일의 끝에 도달했음을 알리는 신호로 사용됩니다. 즉, EOF는 파일 스트림에서 더 이상 읽을 데이터가 없음을 의미합니다.</p>

<p>c++에서는 다음과 같은 방법으로 EOF를 확인할 수 있습니다.</p>

<h3>1. std::ifstream::eof()</h3>

<p>‘std::ifstream’ 클래스의 eof() 멤버 함수를 사용하여 파일 끝에 도달했는지 확인할 수 있습니다.</p>

<p>fstream, 파일 스트림은 기본적인 istream이나 ostream 클래스보다 지원하는 기능이 더 많기 때문에 이를 상속 받아서 작성되었으며, 각각을 상속 받은 것이 ifstream과 ofstream입니다. 이들 클래스를 모두 포함하는 라이브러리로 fstream을 사용하면 됩니다.</p>

<p><b>‘std::ifstream.eof()’는 파일의 끝에 도달하면 ‘true’를 반환합니다.</b></p>

<h3>2. std::cin.eof()</h3>

<p>std::cin.eof()는 eofbit를 검사해서 마지막 입력값에 도달하는 경우 ‘true’를, 그렇지 않으면 ‘false’를 반환합니다.</p>

<h3>3. std::istream::operator bool 사용</h3>

<p>파일 스트림은 조건문에서 사용할 수 있도록 변환 연산자를 제공합니다.</p>

<p>이를 통해 파일 끝에 도달했는지 쉽게 확인할 수 있습니다.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;fstream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">ifstream</span> <span class="n">file</span><span class="p">(</span><span class="s">"example.txt"</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">file</span><span class="p">.</span><span class="n">is_open</span><span class="p">())</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"파일을 열 수 없습니다."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">line</span><span class="p">;</span>
    <span class="k">while</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">getline</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">line</span><span class="p">))</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">line</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">file</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// 파일 스트림의 상태를 확인</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">file</span><span class="p">.</span><span class="n">eof</span><span class="p">())</span> <span class="p">{</span>
            <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"파일 끝에 도달했습니다."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"파일을 읽는 중에 오류가 발생했습니다."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="n">file</span><span class="p">.</span><span class="n">close</span><span class="p">();</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>여기서 !file은 파일 스트림에 오류가 있는지 확인하기 위한 조건문입니다. 오류가 있으면 ‘true’가 됩니다.</p>

<p>이때 파일 끝에 도달한 경우(EOF인 경우)도 포함됩니다. 따라서 EOF인 경우에는 파일 끝에 도달했다는 결과를 출력합니다.</p>

<h3>Reference</h3>

<p><a href="https://heestory0324.tistory.com/10">https://heestory0324.tistory.com/10</a></p>

<p><a href="https://velog.io/@c-jeongyyun/CPP-EOF-%ED%8C%90%EB%8B%A8%ED%95%98%EA%B8%B0">https://velog.io/@c-jeongyyun/CPP-EOF-%ED%8C%90%EB%8B%A8%ED%95%98%EA%B8%B0</a></p>]]></content><author><name>its-seon</name></author><category term="프로그래밍 개념" /><summary type="html"><![CDATA[EOF(End of File)란 무엇인가?]]></summary></entry><entry><title type="html">Buffer란 뭘까?</title><link href="https://its-sun.github.io/2024/06/28/buffer.html" rel="alternate" type="text/html" title="Buffer란 뭘까?" /><published>2024-06-28T00:00:00+00:00</published><updated>2024-06-28T00:00:00+00:00</updated><id>https://its-sun.github.io/2024/06/28/buffer</id><content type="html" xml:base="https://its-sun.github.io/2024/06/28/buffer.html"><![CDATA[<h1>Buffer(버퍼)란 뭘까?</h1>

<p>버퍼란 데이터의 임시 저장 공간을 의미하는 용어입니다.</p>

<p>A와 B가 서로 입출력을 수행하는데 있어 속도 차이가 발생할 때 이를 극복하기 위해 사용하는 임시 저장 공간을 의미합니다.</p>

<h3>그러면 버퍼는 왜 사용할까?</h3>

<p>위에서 말했듯이 서로 다른 장치가 입출력을 수행하는데 있어 속도 차이가 발생할 때 이를 극복하기 위해 사용합니다.</p>

<p>예를 들어, HDD(하드디스크)와 CPU를 생각해보겠습니다. (CPU와 하드디스크가 바로 연결되어 있다고 가정합니다)</p>

<p>1초 동안 CPU는 하드디스크보다 엄청나게 많은 데이터를 처리할 수 있습니다. 즉, CPU는 1초에 100개의 데이터를 처리할 수 있지만 하드디스크는 1초에 3개의 데이터만 처리할 수 있다면 CPU 입장에서는 97개 만큼 효율성이 떨어진다는 의미입니다.</p>

<p>만약 CPU와 하드디스크 사이에 RAM이라는 버퍼가 있다고 가정해보겠습니다. RAM은 CPU보다는 느리지만 하드디스크보다 훨씬 빠른 주기를 갖고 있습니다.</p>

<p>하드디스크는 RAM(버퍼)에 데이터를 보냅니다. CPU는 다른 할 일을 처리하다가 버퍼에 데이터가 어느 정도 쌓이면 한꺼번에 가져와서 처리합니다.</p>

<p>결론적으로 CPU는 쉬는 순간이 없이 엄청난 효울로 연산을 할 수 있습니다.</p>

<p>이렇게 버퍼는 속도 차이가 큰 두 대상이 입출력을 수행할 때 효율성을 위해 사용하는 임시 저장 공간이라고 할 수 있습니다.</p>

<h3>c++ 버퍼와 스트림</h3>

<p>그러면 c++에서는 어떤 형식으로 버퍼에 대한 기능을 제공하는지 알아보겠습니다.</p>

<p>c++는 c언어와 마찬가지로 입출력에 관한 기능을 언어에서 기본적으로 제공하지 않습니다.</p>

<p>그 이유는 컴파일러를 만들 때 입출력 기능을 해당 하드웨어에 가장 적합한 형태로 만들 수 있도록 컴파일러 개발자에게 권한을 주기 위해서입니다.</p>

<p>하지만 대부분의 c++ 컴파일러는 iostream과 fstream 헤더 파일에 정의되어 있는 클래스 라이브러리를 제공합니다.</p>

<p>iostream과 fstream 클래스 라이브러리의 중요 개념 중 하나가 바로 스트림(stream)입니다.</p>

<p><b>스트림(stream)이란?</b></p>

<p>c++ 프로그램은 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림(stream)이라는 흐름을 통해 다룹니다.</p>

<p>스트림이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다.</p>

<p>즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 합니다.</p>

<p><img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/87a6ff92-02eb-4f4f-baf2-3a5c6dcedc76" alt="image" /></p>

<p><b>버퍼(buffer)</b></p>

<p>스트림은 내부에 위에서 말한 버퍼(Buffer)라는 임시 메모리 공간을 가지고 있습니다.</p>

<p>이러한 버퍼를 이용하면 입력과 출력을 좀 더 효율적으로 처리할 수 있습니다.</p>

<p><img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/fff94774-d506-4b11-b53a-251559be978e" alt="image-1" /></p>

<p>버퍼를 사용하면 문자를 하나씩 전달하는 것이 아닌 묶어서 한 번에 전달하므로, 전송 시간이 적게 걸려 성능이 향상되고, 사용자가 문자를 잘못 입력했을 경우 수정을 할 수 있습니다.</p>

<p>하지만 입력 작업에 버퍼를 사용하는 것이 반드시 좋은 것만은 아닙니다.</p>

<p>빠른 반응이 요구되는 게임과 같은 프로그램에서는 키를 누르는 즉시 바로 전달되어야만 합니다.</p>

<p>이렇게 버퍼를 사용하는 입력과 버퍼를 사용하지 않는 입력은 서로 다른 용도로 사용됩니다.</p>

<p>따라서 자신의 목적에 맞게 버퍼의 사용 여부를 판단해야 합니다.</p>

<p>대부분의 c++ 프로그램은 입력 시에는 사용자가 Enter 키를 누르면 입력 버퍼를 비우고, 출력 시에는 개행 문자를 전달받으면 출력 버퍼를 비우게 됩니다.</p>

<h3>Reference</h3>

<p><a href="https://dololak.tistory.com/84">https://dololak.tistory.com/84</a></p>

<p><a href="https://www.tcpschool.com/cpp/cpp_io_streamBuffer">https://www.tcpschool.com/cpp/cpp_io_streamBuffer</a></p>]]></content><author><name>its-seon</name></author><category term="프로그래밍 개념" /><summary type="html"><![CDATA[Buffer(버퍼)란 뭘까?]]></summary></entry><entry><title type="html">c++ ‘std::endl’ vs ‘\n’</title><link href="https://its-sun.github.io/2024/06/28/endl.html" rel="alternate" type="text/html" title="c++ ‘std::endl’ vs ‘\n’" /><published>2024-06-28T00:00:00+00:00</published><updated>2024-06-28T00:00:00+00:00</updated><id>https://its-sun.github.io/2024/06/28/endl</id><content type="html" xml:base="https://its-sun.github.io/2024/06/28/endl.html"><![CDATA[<h1>c++에서 'std::endl'과 '\n'의 차이점은 무엇인가?</h1>

<p>c++에서 ‘std::endl’과 ‘\n’은 모두 새로운 줄을 표시하는데 사용되지만, 중요한 차이점이 있습니다.</p>

<p>해당 포스트는 이전 포스트인 Buffer와 관련된 내용입니다.</p>

<p>이전 포스트 해당 링크 참고 - <a href="https://its-seon.github.io/2024/06/28/buffer.html">https://its-seon.github.io/2024/06/28/buffer.html</a></p>

<h3>1. 'std::endl'</h3>

<p>‘std::endl’은 새로운 줄 문자를 출력하고 스트림을 강제로 플러시(flush)합니다.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Hello"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"World"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>해당 코드에서 ‘std::endl’은 단순히 새로운 줄을 추가하는 것 외에도 출력 버퍼를 강제로 비웁니다. 이로 인해 출력이 즉시 콘솔에 나타나게 됩니다.</p>

<h3>2. '\n'</h3>

<p>‘\n’은 새로운 줄 문자를 출력하지만 스트림을 플러시하지는 않습니다.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Hello</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"World</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>해당 코드에서는 ‘\n’은 단순히 새로운 줄 문자를 추가합니다. 출력 버퍼는 자동으로 가득 차거나 프로세스가 종료될 때 비워집니다.</p>

<h3>'std::endl'과 '\n'의 차이점 요약</h3>

<ul>
  <li>
    <p>플러시(flush) 동작: ‘std::endl’은 새로운 줄 문자를 출력하고 스트림을 플러시합니다. 반면, ‘\n’은 새로운 줄 문자만 출력하고 플러시하지 않습니다.</p>
  </li>
  <li>
    <p>성능: ‘std::endl’은 매번 플러시를 수행하므로, 많은 경우 ‘\n’을 사용하는 것이 더 성능에 유리합니다. 특히 많은 양의 출력을 하는 경우에 ‘\n’을 사용하는 것이 효율적입니다.</p>
  </li>
  <li>
    <p>사용 용도: ‘std::endl’은 주로 출력이 즉시 필요할 때 사용하고, ‘\n’은 단순히 줄 바꿈이 필요할 때 사용합니다.</p>
  </li>
</ul>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;chrono&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;fstream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
  <span class="c1">//  '/dev/null'은 리눅스나 유닉스 시스템에서 모든 입력을 버리는 특수 파일</span>
  <span class="n">std</span><span class="o">::</span><span class="n">ofstream</span> <span class="n">nullstream</span><span class="p">(</span><span class="s">"/dev/null"</span><span class="p">);</span>

  <span class="c1">// std::endl 사용</span>
  <span class="k">auto</span> <span class="n">start</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">high_resolution_clock</span><span class="o">::</span><span class="n">now</span><span class="p">();</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">10000</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">nullstream</span> <span class="o">&lt;&lt;</span> <span class="s">"Line "</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="k">auto</span> <span class="n">end</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">high_resolution_clock</span><span class="o">::</span><span class="n">now</span><span class="p">();</span>
  <span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">duration</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span> <span class="n">duration</span> <span class="o">=</span> <span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">;</span>
  <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"std::endl time: "</span> <span class="o">&lt;&lt;</span> <span class="n">duration</span><span class="p">.</span><span class="n">count</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">" seconds"</span>
            <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

  <span class="c1">// \n 사용</span>
  <span class="n">start</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">high_resolution_clock</span><span class="o">::</span><span class="n">now</span><span class="p">();</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">10000</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">nullstream</span> <span class="o">&lt;&lt;</span> <span class="s">"Line "</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="n">end</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">high_resolution_clock</span><span class="o">::</span><span class="n">now</span><span class="p">();</span>
  <span class="n">duration</span> <span class="o">=</span> <span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">;</span>
  <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\\</span><span class="s">n time: "</span> <span class="o">&lt;&lt;</span> <span class="n">duration</span><span class="p">.</span><span class="n">count</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">" seconds"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/3cc41454-889b-4829-986c-1952e03c71e7" alt="image-2" /></p>

<p>실제로 위 코드로 실행시간을 비교해봤을 때 ‘\n’을 사용하는 것이 훨씬 빠른것을 확인할 수 있습니다.</p>]]></content><author><name>its-seon</name></author><category term="c++" /><summary type="html"><![CDATA[c++에서 'std::endl'과 '\n'의 차이점은 무엇인가?]]></summary></entry><entry><title type="html">PX4 gazebo simulation world 변경</title><link href="https://its-sun.github.io/2024/05/17/px4-world.html" rel="alternate" type="text/html" title="PX4 gazebo simulation world 변경" /><published>2024-05-17T00:00:00+00:00</published><updated>2024-05-17T00:00:00+00:00</updated><id>https://its-sun.github.io/2024/05/17/px4-world</id><content type="html" xml:base="https://its-sun.github.io/2024/05/17/px4-world.html"><![CDATA[<h1>PX4 gazebo simulation world 변경</h1>

<p>오늘은 저번시간에 세팅한 PX4 gazebo simulation에서 world를 변경해보고자 한다. (일종의 map이라고 생각하면 될 것 같다)</p>

<p>PX4 공식홈페이지의 Guide를 보고 따라할 예정이며, 기존에 세팅했을 때 같이 다운로드 된 world 파일을 이용할 예정이다.</p>

<p>먼저 Gazebo world 파일들은 다운받은 PX4-Autopilot 디렉토리 안에 Tools/simulation/gz/worlds에 .sdf 파일들로 존재한다. (Gazebo ignition을 사용한다고 했을때. 만약 다른 simulation을 사용하면 gz 디렉토리가 아닌 자신에게 맞는 디렉토리로 들어가면 된다.)</p>

<p>우리가 사용해볼 world 파일은 baylands.sdf이다.</p>

<h3>Gazebo 실행 방법</h3>

<p>가제보를 실행하는 방법에는 2가지 방법이 있다.</p>

<p>첫번째는 make 명령어를 이용하는 것이고, 두번째는 Python script를 사용해서 실행하는 것이다.</p>

<p>오늘은 두번째 방법을 이용해 실행할 예정이다.</p>

<p>Python script는 위에서 이동한 gz 디렉토리에 존재한다. 해당 디렉토리로 이동하여 Python script를 실행한다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd </span>path/to/PX4-autopilot/Tools/simulation/gz
python3 simulation-gazebo
</code></pre></div></div>

<p>해당 코드를 실행시키면 기본적인 gazebo simulation이 실행될 것이다.</p>

<p>이제 파라미터를 이용해 baylands.sdf를 불러와보자.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 simulation-gazebo <span class="nt">--world</span> baylands
</code></pre></div></div>

<p>그러면 아래와 같은 world가 설정된 시뮬레이션이 실행될 것이다.</p>

<p><img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/9a563922-625c-4f4a-bc4d-2efe9a4824c8" alt="Screenshot from 2024-05-17 22-18-33" /></p>

<p>이제 드론 모델을 불러와보자. 사용할 모델은 depth 카메라가 달려있는 드론이다.</p>

<p>Python script를 실행시킨 터미널을 종료하지 않은 상태로 새로운 터미널을 열고 다운받은 PX4-Autopilot 디렉토리로 이동 후 아래와 같은 명령어를 입력한다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd </span>path/to/PX4-Autopilot
<span class="nv">PX4_GZ_STANDALONE</span><span class="o">=</span>1 <span class="nv">PX4_SYS_AUTOSTART</span><span class="o">=</span>4002 <span class="nv">PX4_SIM_MODEL</span><span class="o">=</span>x500_depth <span class="nv">PX4_GZ_WORLD</span><span class="o">=</span>baylands ./build/px4_sitl_default/bin/px4
</code></pre></div></div>

<p>아래 이미지처럼 드론이 불러와진 것을 볼 수 있다.</p>

<p><img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/df09d9b4-0e74-4b2b-a18d-db97564e6d66" alt="Screenshot from 2024-05-17 22-22-53" /></p>

<h3>takeoff</h3>

<p>이제 저번시간에 사용했던 offboard_control을 이용해 드론을 takeoff 해보자.</p>

<p><img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/ba9a7451-58ba-400d-8b2c-ccd8e9594279" alt="Screenshot from 2024-05-17 22-28-12" /></p>

<p><b>다른 world에서 드론 띄우기 성공!<b></b></b></p>

<h3>Referece</h3>

<p><a href="https://docs.px4.io/main/en/sim_gazebo_gz/gazebo_models.html">https://docs.px4.io/main/en/sim_gazebo_gz/gazebo_models.html</a></p>]]></content><author><name>its-seon</name></author><category term="PX4-Autopilot" /><category term="drone-simulation" /><summary type="html"><![CDATA[PX4 gazebo simulation world 변경]]></summary></entry><entry><title type="html">readme 파일에 이미지 올리기</title><link href="https://its-sun.github.io/2024/05/10/readme-image-upload.html" rel="alternate" type="text/html" title="readme 파일에 이미지 올리기" /><published>2024-05-10T00:00:00+00:00</published><updated>2024-05-10T00:00:00+00:00</updated><id>https://its-sun.github.io/2024/05/10/readme-image-upload</id><content type="html" xml:base="https://its-sun.github.io/2024/05/10/readme-image-upload.html"><![CDATA[<h1>readme 파일에 이미지 올리기</h1>

<p>해당 포스트에서는 readme 파일에 이미지를 올리기 위해 어떻게 해야되는지 알아보려고 한다.</p>

<p>github를 사용하다보면 readme 파일에 이미지를 올릴 상황이 많이 발생하는데 github issue를 사용하면 간단하게 업로드가 가능하다!</p>

<h3>1. 먼저 github에 접속 후 아무 repository에 접속하고 Issues 창에 들어가 New issue 버튼을 클릭한다.</h3>

<p><img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/92a5e67e-3b55-4efe-a595-6e03fdc2b496" alt="슬라이드1 PNG" /></p>

<h3>2. Add a description에 자신이 사용하고 싶은 이미지를 업로드 한다.</h3>

<p><img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/e3de93f3-03cc-477d-8a91-878fabe810e8" alt="슬라이드2 PNG" /></p>

<h3>3. 2초정도 기다리면 아래와 같은 링크가 나오는데 해당 링크를 복사해서 사용하면 된다.</h3>

<p><img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/4f85d851-2013-4f9f-9871-fdaed7a6645f" alt="슬라이드3 PNG" /></p>

<h3>끝!</h3>]]></content><author><name>its-seon</name></author><category term="기타" /><summary type="html"><![CDATA[readme 파일에 이미지 올리기]]></summary></entry><entry><title type="html">PX4 &amp;amp; ROS2 User Guide</title><link href="https://its-sun.github.io/2024/05/07/px4-ros2-basic.html" rel="alternate" type="text/html" title="PX4 &amp;amp; ROS2 User Guide" /><published>2024-05-07T00:00:00+00:00</published><updated>2024-05-07T00:00:00+00:00</updated><id>https://its-sun.github.io/2024/05/07/px4-ros2-basic</id><content type="html" xml:base="https://its-sun.github.io/2024/05/07/px4-ros2-basic.html"><![CDATA[<h1>PX4 &amp; ROS2 User Guide</h1>

<p>오늘은 저번시간에 PX4와 ROS2를 사용하기 위해 셋팅했던 px4-ros2에 대해 간단하게 정리한 내용이다. (까먹지 않을 정도만)</p>

<h3>PX4-ROS2 아키텍처</h3>

<p><img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/b483781b-86cf-41b8-9a1f-b34612dd8600" alt="architecture_xrce-dds_ros2 DXSOuyOh" /></p>

<ul>
  <li>
    <p>ROS2 publisher와 subscriber가 PX4 uORB topic들과 다이렉트로 소통 가능</p>
  </li>
  <li>
    <p>uXRCE-DDS communication middleware 사용</p>
  </li>
  <li>
    <p>PX4: uXRCE-DDS client (펌웨어에 default로 세팅되어 있음, 시뮬레이션에서는 자동적으로 켜지지만 직접적인 하드웨어 FC의 경우 다른 작업이 필요)</p>
  </li>
  <li>
    <p>ROS2: uXRCE-DDS agnet (Companion computer에서 세팅이 필요)</p>
  </li>
  <li>
    <p>FC와 Companion computer는 UART/UDP/TCP/Serial 등으로 연결</p>
  </li>
  <li>
    <p>ROS2 workspace에는 사용되는 PX4_msgs를 포함시켜야 함</p>
  </li>
  <li>
    <p>ROS2를 사용할 때 client와 agent 둘 다 실행되어야 함</p>
  </li>
</ul>

<h3>Controlling a vehicle</h3>

<ul>
  <li>
    <p>PX4로부터 publish되는 telemetry topic들은 ROS2 workspace에서 subscribe</p>
  </li>
  <li>
    <p>PX4가 action할 수 있도록 workspace에서 topic publish</p>
  </li>
  <li>
    <p>(예시) VehicleGlobalPosition과 VehicleCommand topic을 이용해서 움직일 수 있음</p>
  </li>
</ul>

<h3>Compatibility Issues</h3>

<ul>
  <li>
    <p>QoS 세팅: PX4와 ROS2의 초기 세팅이 다름</p>
  </li>
  <li>
    <p>ROS2, PX4 Frame Conventions -&gt; 서로 사용하는 좌표계가 다름</p>
  </li>
  <li>
    <p>PX4/px4-ros-com 패키지가 frame_transform을 쉽게 할 수 있도록 라이브러리 제공</p>
  </li>
</ul>

<h3>ROS, Gazebo, PX4 time synchronization</h3>

<ul>
  <li>
    <p>ROS2, PX4는 uXRCE-DDS middleware에 의해 자동적으로 관리됨</p>
  </li>
  <li>
    <p>(시뮬레이션에서는) OS clock과 Gazebo clock으로 세팅 가능</p>
  </li>
</ul>

<h3>기타</h3>

<ul>
  <li>uORB topic 커스텀 가능</li>
</ul>

<h3>Referece</h3>

<p><a href="https://docs.px4.io/main/en/ros/ros2_comm.html">https://docs.px4.io/main/en/ros/ros2_comm.html</a></p>]]></content><author><name>its-seon</name></author><category term="PX4-Autopilot" /><category term="ROS2" /><category term="drone-simulation" /><summary type="html"><![CDATA[PX4 &amp; ROS2 User Guide]]></summary></entry><entry><title type="html">PX4 &amp;amp; ROS2 Setup</title><link href="https://its-sun.github.io/2024/04/29/px4-ros2.html" rel="alternate" type="text/html" title="PX4 &amp;amp; ROS2 Setup" /><published>2024-04-29T00:00:00+00:00</published><updated>2024-04-29T00:00:00+00:00</updated><id>https://its-sun.github.io/2024/04/29/px4-ros2</id><content type="html" xml:base="https://its-sun.github.io/2024/04/29/px4-ros2.html"><![CDATA[<h1>PX4 &amp; ROS2 Setup</h1>

<p>오늘은 드론과 ROS2를 공부하기 위한 시뮬레이션 셋업을 하고자 한다. (오늘은 설치만 할 예정이다. 내용은 다음 포스트에 정리하고자 한다.)</p>

<p>데스크탑 환경은 Ubuntu 22.04를 사용한다.</p>

<p>순서는 다음과 같다.</p>
<ol>
  <li>PX4 설치</li>
  <li>ROS2 설치</li>
  <li>Micro XRCE-DDS Agent &amp; Client 셋업</li>
  <li>ROS2 Workspace 빌드 및 실행</li>
</ol>

<h3>PX4 설치</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd
</span>git clone https://github.com/PX4/PX4-Autopilot.git <span class="nt">--recursive</span>
bash ./PX4-Autopilot/Tools/setup/ubuntu.sh
<span class="nb">cd </span>PX4-Autopilot/
make px4_sitl
</code></pre></div></div>

<h3>ros2 humble 설치</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd
sudo </span>apt update <span class="o">&amp;&amp;</span> <span class="nb">sudo </span>apt <span class="nb">install </span>locales
<span class="nb">sudo </span>locale-gen en_US en_US.UTF-8
<span class="nb">sudo </span>update-locale <span class="nv">LC_ALL</span><span class="o">=</span>en_US.UTF-8 <span class="nv">LANG</span><span class="o">=</span>en_US.UTF-8
<span class="nb">export </span><span class="nv">LANG</span><span class="o">=</span>en_US.UTF-8
<span class="nb">sudo </span>apt <span class="nb">install </span>software-properties-common
<span class="nb">sudo </span>add-apt-repository universe
<span class="nb">sudo </span>apt update <span class="o">&amp;&amp;</span> <span class="nb">sudo </span>apt <span class="nb">install </span>curl <span class="nt">-y</span>
<span class="nb">sudo </span>curl <span class="nt">-sSL</span> https://raw.githubusercontent.com/ros/rosdistro/master/ros.key <span class="nt">-o</span> /usr/share/keyrings/ros-archive-keyring.gpg
<span class="nb">echo</span> <span class="s2">"deb [arch=</span><span class="si">$(</span>dpkg <span class="nt">--print-architecture</span><span class="si">)</span><span class="s2"> signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu </span><span class="si">$(</span><span class="nb">.</span> /etc/os-release <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="nv">$UBUNTU_CODENAME</span><span class="si">)</span><span class="s2"> main"</span> | <span class="nb">sudo tee</span> /etc/apt/sources.list.d/ros2.list <span class="o">&gt;</span> /dev/null
<span class="nb">sudo </span>apt update <span class="o">&amp;&amp;</span> <span class="nb">sudo </span>apt upgrade <span class="nt">-y</span>
<span class="nb">sudo </span>apt <span class="nb">install </span>ros-humble-desktop
<span class="nb">sudo </span>apt <span class="nb">install </span>ros-dev-tools
<span class="nb">source</span> /opt/ros/humble/setup.bash <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">"source /opt/ros/humble/setup.bash"</span> <span class="o">&gt;&gt;</span> .bashrc
</code></pre></div></div>
<ul>
  <li>python dependencies 설치</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install</span> <span class="nt">--user</span> <span class="nt">-U</span> <span class="nv">empy</span><span class="o">==</span>3.3.4 pyros-genmsg setuptools
</code></pre></div></div>

<h3>Micro XRCE-DDS Agent &amp; Client 설치</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd
</span>git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
<span class="nb">cd </span>Micro-XRCE-DDS-Agent
<span class="nb">mkdir </span>build
<span class="nb">cd </span>build
cmake ..
make
<span class="nb">sudo </span>make <span class="nb">install
sudo </span>ldconfig /usr/local/lib/
</code></pre></div></div>

<h3>ROS2 Workspace 설치 및 다운</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd
mkdir</span> <span class="nt">-p</span> ~/ws_sensor_combined/src/
<span class="nb">cd</span> ~/ws_sensor_combined/src/
git clone https://github.com/PX4/px4_msgs.git
git clone https://github.com/PX4/px4_ros_com.git
<span class="nb">cd</span> ..
<span class="nb">source</span> /opt/ros/humble/setup.bash
colcon build
</code></pre></div></div>

<h3>설치 테스트</h3>

<p>그러면 이제 잘 설치가 되었는지 확인해보자. 목표는 드론을 띄우는 것이다.</p>

<p>먼저 터미널은 4개를 준비한다.</p>

<ol>
  <li>Micro XRCE 실행
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> ~/Micro-XRCE-DDS-Agent
MicroXRCEAgent udp4 <span class="nt">-p</span> 8888
</code></pre></div>    </div>
  </li>
  <li>gazebo simulation 실행
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> ~/PX4-Autopilot
make px4_sitl gz_x500
</code></pre></div>    </div>
  </li>
  <li>예제코드 돌려보기1: sensor_combined_listener
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> ~/ws_sensor_combined
<span class="nb">source</span> /opt/ros/humble/setup.bash
<span class="nb">source install</span>/setup.bash
ros2 launch px4_ros_com sensor_combined_listener.launch.py
</code></pre></div>    </div>

    <p>터미널에 아래와 같은 결과가 보이면 된다.</p>

    <p><img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/d0adb540-f228-4937-ac78-36b8e464b6ee" alt="Screenshot from 2024-04-29 18-44-39" /></p>
  </li>
  <li>예제코드 돌려보기2: offboard_control
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> ~/ws_sensor_combined
<span class="nb">source</span> /opt/ros/humble/setup.bash
<span class="nb">source install</span>/setup.bash
ros2 run px4_ros_com offboard_control
</code></pre></div>    </div>
  </li>
</ol>

<h3>성공!</h3>

<p><img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/c5bd9c0e-e409-4739-9b28-72b0f3210861" alt="Screenshot from 2024-04-29 18-38-56" /></p>

<h3>Referece</h3>

<p><a href="https://docs.px4.io/main/en/ros/ros2_comm.html">https://docs.px4.io/main/en/ros/ros2_comm.html</a></p>]]></content><author><name>its-seon</name></author><category term="PX4-Autopilot" /><category term="ROS2" /><category term="drone-simulation" /><summary type="html"><![CDATA[PX4 &amp; ROS2 Setup]]></summary></entry><entry><title type="html">rrt algorithm (c++)</title><link href="https://its-sun.github.io/2024/04/27/rrt-algorithm.html" rel="alternate" type="text/html" title="rrt algorithm (c++)" /><published>2024-04-27T00:00:00+00:00</published><updated>2024-04-27T00:00:00+00:00</updated><id>https://its-sun.github.io/2024/04/27/rrt-algorithm</id><content type="html" xml:base="https://its-sun.github.io/2024/04/27/rrt-algorithm.html"><![CDATA[<h1>RRT Algorithm</h1>

<p>RRT(Rapidly-exploring Random Tree) 알고리즘은 수많은 경로계획(Path Planning) 알고리즘 중 하나로 샘플링 기반의 경로계획 알고리즘이다.</p>

<p>RRT는 풀네임에서 알 수 있듯이 Tree 자료구조를 사용하며 시작지점을 root로 하는 Tree라고 생각하면 된다.</p>

<p>Random Point를 생성하여 시작지점(Start Point)에서 목표지점(Destination Point)까지 Tree를 확장하여 도달하는 알고리즘이라고 할 수 있다.</p>

<p>아래는 RRT 알고리즘의 단계를 쉽게 이해되도록 설명한 것이다. (쉽게 설명하고자 노력하였음…)</p>

<ol>
  <li>새로운 Random Point를 생성한다.</li>
  <li>생성된 Random Point는 Tree에서 가장 가까운 노드를 찾고, jump 길이만큼 New Point를 생성한다. (jump는 사람이 정하는 parameter, jump가 길수록 목적지에 빠르게 도착할 수 있음)</li>
  <li>New Point는 2번 과정에서 찾은 Tree에서 가장 가까운 노드를 부모노드(Parent Node)로 갖고, 기존의 Tree로 편입된다.</li>
  <li>New Point가 장애물 안에 위치한다면 경로로 인정될 수 없으니 New Point를 Tree에서 제거한다.</li>
  <li>New Point와 부모노드를 이은 경로(Branch)가 장애물과 겹친다면 경로로 인정될 수 없으니 New Point를 Tree에서 제거한다.</li>
  <li>1~5번 과정을 도착지점에 도달할 때까지 반복한다.</li>
</ol>

<hr />
<p>조금 더 쉽게 이해할 수 있도록 그림으로 보자.</p>

<p>먼저 이렇게 생긴 맵이 있다고 가정하자. 빨간색은 시작지점, 파란색은 도착지점, 보라색은 장애물이다. 오른쪽은 트리구조를 나타낸 것이다.
<img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/4a1e8271-e089-452a-a9dd-cb8db1bf6ddd" alt="rrt1" /></p>

<p>Random Point를 생성한다.
<img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/940a14aa-0151-4516-af86-398754145ca3" alt="rrt2" /></p>

<p>1번과 가장 가까운 노드를 찾고 jump 길이만큼 떨어진 곳에 1번 New Point를 생성한다. 1번은 start와 가장 가깝기 때문에 start를 부모노드로 갖는다.
<img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/31e5e218-f378-4701-adb7-236535abaad4" alt="rrt3" /></p>

<p>1번 New Point는 장애물과 겹치지 않기 때문에 트리에 편입시킨다.
<img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/d2398edf-373f-46e3-a4eb-ab057d4e9fa4" alt="rrt4" /></p>

<p>(이제부터는 jump길이만큼 Random Point가 생성된다고 가정한다. 즉 Random Point를 New Point라고 생각하자.)</p>

<p>마찬가지로 2번 New Point를 생성하고 2번과 가장 가까운 노드인 1번노드를 부모노드로 갖도록 트리에 편입시킨다.
<img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/91c5924c-89c3-4c05-a42c-4c0c4d83706e" alt="rrt5" /></p>

<p>그러나 2번 New Point는 장애물과 겹쳐 경로가 될 수 없기 때문에 트리에서 제거한다.
<img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/9eceeac4-064a-4f34-a8c2-f2a1450e7a86" alt="rrt6" /></p>

<p>3번 New Point를 생성한다. 3번 New Point와 가장 가까운 노드를 트리에서 찾으면 start가 가장 가깝기 때문에 start를 부모노드로 갖도록 편입시킨다. (장애물과 겹치지 않음)
<img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/f0980efc-94ab-456a-8dcf-206bcc1b94eb" alt="rrt7" /></p>

<p>4번 New Point를 생성한다. 4번과 가장 가까운 노드를 트리에서 찾을 때 3번이 가장 가깝기 때문에 3번을 부모노드로 갖도록 편입시킨다. (장애물과 겹치지 않음)
<img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/63c6c506-36b1-472b-8d7d-a9562b24142e" alt="rrt8" /></p>

<p>이런식으로 반복하다보면 장애물과 겹치는 Point들은 트리에 추가될 수 없으며 언젠가는 목적지에 도달하는 경로가 생성될 수 있다.
<img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/40f2a400-3e0e-4aed-9718-f35183da6225" alt="rrt9" /></p>

<hr />
<h3>단점</h3>

<p>RRT 알고리즘은 아주 유명한 경로계획법이지만, 여러가지 단점도 존재한다.</p>
<ul>
<li>샘플링 개수가 충분하지 않다면 경로를 찾지 못할 수 있다. (모든 샘플링 기반 경로계획법의 단점)</li>
<li>경로를 찾더라도 최적(optimal) 경로가 아니다.</li>
<li>도착점까지 수렴하는데 많은 시간이 소요되며, 예측이 불가능하다.</li>
<li>산출된 경로가 랜덤 샘플링의 성격상 완만하지 않아 실제 로봇이 그대로 주행하기는 어려울 수 있다. (갑자기 90도로 꺽는 곳에서는 자동차는 주행할 수 없음)</li>
</ul>

<hr />
<h3>요약</h3>

<p>RRT 알고리즘은 유명한 랜덤 샘플링 경로계획법으로 실제 로봇 소프트웨어에서 많이 사용되는 알고리즘이다. 기존의 RRT 알고리즘의 단점을 보완하기 위해 RRT*와 같은 알고리즘도 나왔으며 계속적으로 연구가 되는 것을 알 수 있다.</p>

<hr />
<h3>Reference</h3>

<p><a href="https://pasus.tistory.com/74">https://pasus.tistory.com/74</a></p>

<hr />
<h3>c++ 구현</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;random&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;cmath&gt;</span><span class="cp">
#include</span> <span class="cpf">"opencv2/opencv.hpp"</span><span class="cp">
</span>
<span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">struct</span> <span class="nc">Point</span> <span class="p">{</span>
    <span class="kt">double</span> <span class="n">x</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">y</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">parentIndex</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
    <span class="n">Point</span><span class="p">(</span><span class="kt">double</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="kt">double</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span> <span class="o">:</span> <span class="n">x</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="p">{}</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="nc">Obstacle</span> <span class="p">{</span>
    <span class="n">Point</span> <span class="n">leftTop</span><span class="p">;</span>
    <span class="n">Point</span> <span class="n">rightBottom</span><span class="p">;</span>
    <span class="n">Obstacle</span><span class="p">(</span><span class="k">const</span> <span class="n">Point</span><span class="o">&amp;</span> <span class="n">lt</span><span class="p">,</span> <span class="k">const</span> <span class="n">Point</span><span class="o">&amp;</span> <span class="n">rb</span><span class="p">)</span> <span class="o">:</span> <span class="n">leftTop</span><span class="p">(</span><span class="n">lt</span><span class="p">),</span> <span class="n">rightBottom</span><span class="p">(</span><span class="n">rb</span><span class="p">)</span> <span class="p">{}</span>
<span class="p">};</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">width</span> <span class="o">=</span> <span class="mi">800</span><span class="p">;</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">height</span> <span class="o">=</span> <span class="mi">800</span><span class="p">;</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">jump</span> <span class="o">=</span> <span class="mi">30</span><span class="p">;</span>

<span class="n">vector</span><span class="o">&lt;</span><span class="n">Point</span><span class="o">&gt;</span> <span class="n">path</span><span class="p">;</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="n">Obstacle</span><span class="o">&gt;</span> <span class="n">obstacles</span><span class="p">;</span>

<span class="n">Point</span> <span class="n">newPoint</span><span class="p">;</span>

<span class="cm">/* start and destionation setup */</span>
<span class="n">Point</span> <span class="n">start</span><span class="p">;</span>
<span class="n">Point</span> <span class="n">destination</span><span class="p">;</span>

<span class="kt">void</span> <span class="n">initRRT</span><span class="p">(</span><span class="kt">int</span> <span class="n">startX</span><span class="p">,</span> <span class="kt">int</span> <span class="n">startY</span><span class="p">,</span> <span class="kt">int</span> <span class="n">endX</span><span class="p">,</span> <span class="kt">int</span> <span class="n">endY</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">start</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="n">startX</span><span class="p">,</span> <span class="n">startY</span><span class="p">);</span>
    <span class="n">destination</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="n">endX</span><span class="p">,</span> <span class="n">endY</span><span class="p">);</span>

    <span class="n">path</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
    <span class="n">path</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">start</span><span class="p">);</span>
<span class="p">}</span>

<span class="cm">/* create obstacles */</span>
<span class="kt">void</span> <span class="n">initObstacles</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">obstacles</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
    <span class="n">obstacles</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">Obstacle</span><span class="p">({</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">},</span> <span class="p">{</span><span class="mi">200</span><span class="p">,</span> <span class="mi">200</span><span class="p">}));</span>
    <span class="n">obstacles</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">Obstacle</span><span class="p">({</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">},</span> <span class="p">{</span><span class="mi">400</span><span class="p">,</span> <span class="mi">400</span><span class="p">}));</span>
    <span class="n">obstacles</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">Obstacle</span><span class="p">({</span><span class="mi">100</span><span class="p">,</span> <span class="mi">300</span><span class="p">},</span> <span class="p">{</span><span class="mi">200</span><span class="p">,</span> <span class="mi">400</span><span class="p">}));</span>
<span class="p">}</span>

<span class="cm">/* generate random point */</span>
<span class="n">random_device</span> <span class="n">rd</span><span class="p">;</span>
<span class="n">mt19937</span> <span class="n">gen</span><span class="p">(</span><span class="n">rd</span><span class="p">());</span>
<span class="n">uniform_int_distribution</span><span class="o">&lt;&gt;</span> <span class="n">dis_x</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">width</span><span class="p">);</span>
<span class="n">uniform_int_distribution</span><span class="o">&lt;&gt;</span> <span class="n">dis_y</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">height</span><span class="p">);</span>

<span class="n">Point</span> <span class="n">generateRandomPoint</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="n">dis_x</span><span class="p">(</span><span class="n">gen</span><span class="p">),</span> <span class="n">dis_y</span><span class="p">(</span><span class="n">gen</span><span class="p">));</span>
<span class="p">}</span>

<span class="cm">/* find the nearest point */</span>
<span class="n">Point</span><span class="o">&amp;</span> <span class="n">nearestPoint</span><span class="p">(</span><span class="k">const</span> <span class="n">Point</span><span class="o">&amp;</span> <span class="n">randomPoint</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">double</span> <span class="n">minDistance</span> <span class="o">=</span> <span class="n">numeric_limits</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;::</span><span class="n">max</span><span class="p">();</span>
    <span class="kt">int</span> <span class="n">nearestIndex</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">path</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">double</span> <span class="n">distance</span> <span class="o">=</span> <span class="n">sqrt</span><span class="p">(</span><span class="n">pow</span><span class="p">(</span><span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">x</span> <span class="o">-</span> <span class="n">randomPoint</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">pow</span><span class="p">(</span><span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">y</span> <span class="o">-</span> <span class="n">randomPoint</span><span class="p">.</span><span class="n">y</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">distance</span> <span class="o">&lt;</span> <span class="n">minDistance</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">minDistance</span> <span class="o">=</span> <span class="n">distance</span><span class="p">;</span>
            <span class="n">nearestIndex</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">path</span><span class="p">[</span><span class="n">nearestIndex</span><span class="p">];</span>
<span class="p">}</span>

<span class="cm">/* check if the random point is within the obstacles */</span>
<span class="kt">bool</span> <span class="n">isInObstacle</span><span class="p">(</span><span class="k">const</span> <span class="n">Point</span><span class="o">&amp;</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="k">auto</span><span class="o">&amp;</span> <span class="n">obs</span> <span class="o">:</span> <span class="n">obstacles</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="n">x</span> <span class="o">&gt;</span> <span class="n">obs</span><span class="p">.</span><span class="n">leftTop</span><span class="p">.</span><span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">p</span><span class="p">.</span><span class="n">x</span> <span class="o">&lt;</span> <span class="n">obs</span><span class="p">.</span><span class="n">rightBottom</span><span class="p">.</span><span class="n">x</span> <span class="o">&amp;&amp;</span>
            <span class="n">p</span><span class="p">.</span><span class="n">y</span> <span class="o">&gt;</span> <span class="n">obs</span><span class="p">.</span><span class="n">leftTop</span><span class="p">.</span><span class="n">y</span> <span class="o">&amp;&amp;</span> <span class="n">p</span><span class="p">.</span><span class="n">y</span> <span class="o">&lt;</span> <span class="n">obs</span><span class="p">.</span><span class="n">rightBottom</span><span class="p">.</span><span class="n">y</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">}</span>

<span class="cm">/* check if the path intersects with the obstacles */</span>
<span class="kt">bool</span> <span class="n">checkPathIntersectionWithObstacles</span><span class="p">(</span><span class="n">Point</span><span class="o">&amp;</span> <span class="n">nearest</span><span class="p">,</span> <span class="n">Point</span><span class="o">&amp;</span> <span class="n">newPoint</span><span class="p">){</span>
    <span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="k">auto</span><span class="o">&amp;</span> <span class="n">obs</span> <span class="o">:</span> <span class="n">obstacles</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">Point</span> <span class="n">topRight</span> <span class="o">=</span> <span class="p">{</span><span class="n">obs</span><span class="p">.</span><span class="n">rightBottom</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">obs</span><span class="p">.</span><span class="n">leftTop</span><span class="p">.</span><span class="n">y</span><span class="p">};</span>
        <span class="n">Point</span> <span class="n">bottomLeft</span> <span class="o">=</span> <span class="p">{</span><span class="n">obs</span><span class="p">.</span><span class="n">leftTop</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">obs</span><span class="p">.</span><span class="n">rightBottom</span><span class="p">.</span><span class="n">y</span><span class="p">};</span>

        <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o">&lt;</span><span class="n">Point</span><span class="p">,</span> <span class="n">Point</span><span class="o">&gt;&gt;</span> <span class="n">edges</span> <span class="o">=</span> <span class="p">{</span>
            <span class="p">{</span><span class="n">obs</span><span class="p">.</span><span class="n">leftTop</span><span class="p">,</span> <span class="n">topRight</span><span class="p">},</span>
            <span class="p">{</span><span class="n">topRight</span><span class="p">,</span> <span class="n">obs</span><span class="p">.</span><span class="n">rightBottom</span><span class="p">},</span>
            <span class="p">{</span><span class="n">obs</span><span class="p">.</span><span class="n">rightBottom</span><span class="p">,</span> <span class="n">bottomLeft</span><span class="p">},</span>
            <span class="p">{</span><span class="n">bottomLeft</span><span class="p">,</span> <span class="n">obs</span><span class="p">.</span><span class="n">leftTop</span><span class="p">}</span>
        <span class="p">};</span>

        <span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="k">auto</span><span class="o">&amp;</span> <span class="n">edge</span> <span class="o">:</span> <span class="n">edges</span><span class="p">)</span> <span class="p">{</span>
            <span class="kt">double</span> <span class="n">o1</span> <span class="o">=</span> <span class="p">(</span><span class="n">newPoint</span><span class="p">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">nearest</span><span class="p">.</span><span class="n">y</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">edge</span><span class="p">.</span><span class="n">first</span><span class="p">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">nearest</span><span class="p">.</span><span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="n">newPoint</span><span class="p">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">nearest</span><span class="p">.</span><span class="n">x</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">edge</span><span class="p">.</span><span class="n">first</span><span class="p">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">nearest</span><span class="p">.</span><span class="n">y</span><span class="p">);</span>
            <span class="kt">double</span> <span class="n">o2</span> <span class="o">=</span> <span class="p">(</span><span class="n">newPoint</span><span class="p">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">nearest</span><span class="p">.</span><span class="n">y</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">edge</span><span class="p">.</span><span class="n">second</span><span class="p">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">nearest</span><span class="p">.</span><span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="n">newPoint</span><span class="p">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">nearest</span><span class="p">.</span><span class="n">x</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">edge</span><span class="p">.</span><span class="n">second</span><span class="p">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">nearest</span><span class="p">.</span><span class="n">y</span><span class="p">);</span>
            <span class="kt">double</span> <span class="n">o3</span> <span class="o">=</span> <span class="p">(</span><span class="n">edge</span><span class="p">.</span><span class="n">second</span><span class="p">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">edge</span><span class="p">.</span><span class="n">first</span><span class="p">.</span><span class="n">y</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">nearest</span><span class="p">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">edge</span><span class="p">.</span><span class="n">first</span><span class="p">.</span><span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="n">edge</span><span class="p">.</span><span class="n">second</span><span class="p">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">edge</span><span class="p">.</span><span class="n">first</span><span class="p">.</span><span class="n">x</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">nearest</span><span class="p">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">edge</span><span class="p">.</span><span class="n">first</span><span class="p">.</span><span class="n">y</span><span class="p">);</span>
            <span class="kt">double</span> <span class="n">o4</span> <span class="o">=</span> <span class="p">(</span><span class="n">edge</span><span class="p">.</span><span class="n">second</span><span class="p">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">edge</span><span class="p">.</span><span class="n">first</span><span class="p">.</span><span class="n">y</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">newPoint</span><span class="p">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">edge</span><span class="p">.</span><span class="n">first</span><span class="p">.</span><span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="n">edge</span><span class="p">.</span><span class="n">second</span><span class="p">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">edge</span><span class="p">.</span><span class="n">first</span><span class="p">.</span><span class="n">x</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">newPoint</span><span class="p">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">edge</span><span class="p">.</span><span class="n">first</span><span class="p">.</span><span class="n">y</span><span class="p">);</span>

            <span class="k">if</span> <span class="p">((</span><span class="n">o1</span> <span class="o">*</span> <span class="n">o2</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">o3</span> <span class="o">*</span> <span class="n">o4</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">))</span> <span class="p">{</span>
                <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">}</span>

<span class="cm">/* generate path */</span>
<span class="kt">void</span> <span class="n">generatePath</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">Point</span> <span class="n">randomPoint</span> <span class="o">=</span> <span class="n">generateRandomPoint</span><span class="p">();</span>
    <span class="n">Point</span><span class="o">&amp;</span> <span class="n">nearest</span> <span class="o">=</span> <span class="n">nearestPoint</span><span class="p">(</span><span class="n">randomPoint</span><span class="p">);</span>

    <span class="kt">double</span> <span class="n">angle</span> <span class="o">=</span> <span class="n">atan2</span><span class="p">(</span><span class="n">randomPoint</span><span class="p">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">nearest</span><span class="p">.</span><span class="n">y</span><span class="p">,</span> <span class="n">randomPoint</span><span class="p">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">nearest</span><span class="p">.</span><span class="n">x</span><span class="p">);</span>
    <span class="n">newPoint</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="n">nearest</span><span class="p">.</span><span class="n">x</span> <span class="o">+</span> <span class="n">jump</span> <span class="o">*</span> <span class="n">cos</span><span class="p">(</span><span class="n">angle</span><span class="p">),</span> <span class="n">nearest</span><span class="p">.</span><span class="n">y</span> <span class="o">+</span> <span class="n">jump</span> <span class="o">*</span> <span class="n">sin</span><span class="p">(</span><span class="n">angle</span><span class="p">));</span>
    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"New point: ("</span> <span class="o">&lt;&lt;</span> <span class="n">newPoint</span><span class="p">.</span><span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="s">", "</span> <span class="o">&lt;&lt;</span> <span class="n">newPoint</span><span class="p">.</span><span class="n">y</span> <span class="o">&lt;&lt;</span> <span class="s">")"</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">isInObstacle</span><span class="p">(</span><span class="n">newPoint</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">checkPathIntersectionWithObstacles</span><span class="p">(</span><span class="n">nearest</span><span class="p">,</span> <span class="n">newPoint</span><span class="p">))</span> <span class="p">{</span>
        <span class="n">newPoint</span><span class="p">.</span><span class="n">parentIndex</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">nearest</span> <span class="o">-</span> <span class="o">&amp;</span><span class="n">path</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
        <span class="n">path</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">newPoint</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="n">pow</span><span class="p">(</span><span class="n">path</span><span class="p">.</span><span class="n">back</span><span class="p">().</span><span class="n">x</span> <span class="o">-</span> <span class="n">destination</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">pow</span><span class="p">(</span><span class="n">path</span><span class="p">.</span><span class="n">back</span><span class="p">().</span><span class="n">y</span> <span class="o">-</span> <span class="n">destination</span><span class="p">.</span><span class="n">y</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span> <span class="o">&lt;</span> <span class="n">jump</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">path</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">destination</span><span class="p">);</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Destination reached."</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="n">updateVisualization</span><span class="p">(</span><span class="n">cv</span><span class="o">::</span><span class="n">Mat</span><span class="o">&amp;</span> <span class="n">img</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">img</span><span class="p">.</span><span class="n">setTo</span><span class="p">(</span><span class="n">cv</span><span class="o">::</span><span class="n">Scalar</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">));</span>

    <span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="k">auto</span><span class="o">&amp;</span> <span class="n">obs</span> <span class="o">:</span> <span class="n">obstacles</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">cv</span><span class="o">::</span><span class="n">rectangle</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="n">cv</span><span class="o">::</span><span class="n">Point</span><span class="p">(</span><span class="n">obs</span><span class="p">.</span><span class="n">leftTop</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">obs</span><span class="p">.</span><span class="n">leftTop</span><span class="p">.</span><span class="n">y</span><span class="p">),</span> <span class="n">cv</span><span class="o">::</span><span class="n">Point</span><span class="p">(</span><span class="n">obs</span><span class="p">.</span><span class="n">rightBottom</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">obs</span><span class="p">.</span><span class="n">rightBottom</span><span class="p">.</span><span class="n">y</span><span class="p">),</span> <span class="n">cv</span><span class="o">::</span><span class="n">Scalar</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">),</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="c1">// Draw lines from each point to its parent</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">path</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">parentIndex</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">cv</span><span class="o">::</span><span class="n">line</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="n">cv</span><span class="o">::</span><span class="n">Point</span><span class="p">(</span><span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">,</span> <span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">),</span> <span class="n">cv</span><span class="o">::</span><span class="n">Point</span><span class="p">(</span><span class="n">path</span><span class="p">[</span><span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">parentIndex</span><span class="p">].</span><span class="n">x</span><span class="p">,</span> <span class="n">path</span><span class="p">[</span><span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">parentIndex</span><span class="p">].</span><span class="n">y</span><span class="p">),</span> <span class="n">cv</span><span class="o">::</span><span class="n">Scalar</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">),</span> <span class="mi">2</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="k">else</span><span class="p">{</span>
            <span class="n">cv</span><span class="o">::</span><span class="n">line</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="n">cv</span><span class="o">::</span><span class="n">Point</span><span class="p">(</span><span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">x</span><span class="p">,</span> <span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">y</span><span class="p">),</span> <span class="n">cv</span><span class="o">::</span><span class="n">Point</span><span class="p">(</span><span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">,</span> <span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">),</span> <span class="n">cv</span><span class="o">::</span><span class="n">Scalar</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">),</span> <span class="mi">2</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>


    <span class="n">cv</span><span class="o">::</span><span class="n">circle</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="n">cv</span><span class="o">::</span><span class="n">Point</span><span class="p">(</span><span class="n">start</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">start</span><span class="p">.</span><span class="n">y</span><span class="p">),</span> <span class="mi">5</span><span class="p">,</span> <span class="n">cv</span><span class="o">::</span><span class="n">Scalar</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">cv</span><span class="o">::</span><span class="n">FILLED</span><span class="p">);</span> <span class="c1">// Green for start</span>
    <span class="n">cv</span><span class="o">::</span><span class="n">circle</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="n">cv</span><span class="o">::</span><span class="n">Point</span><span class="p">(</span><span class="n">destination</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">destination</span><span class="p">.</span><span class="n">y</span><span class="p">),</span> <span class="mi">5</span><span class="p">,</span> <span class="n">cv</span><span class="o">::</span><span class="n">Scalar</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">cv</span><span class="o">::</span><span class="n">FILLED</span><span class="p">);</span> <span class="c1">// Blue for destination</span>
    <span class="n">cv</span><span class="o">::</span><span class="n">circle</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="n">cv</span><span class="o">::</span><span class="n">Point</span><span class="p">(</span><span class="n">newPoint</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">newPoint</span><span class="p">.</span><span class="n">y</span><span class="p">),</span> <span class="mi">5</span><span class="p">,</span> <span class="n">cv</span><span class="o">::</span><span class="n">Scalar</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">165</span><span class="p">,</span> <span class="mi">255</span><span class="p">),</span> <span class="n">cv</span><span class="o">::</span><span class="n">FILLED</span><span class="p">);</span>  <span class="c1">// Orange for newPoint</span>

    <span class="n">cv</span><span class="o">::</span><span class="n">imshow</span><span class="p">(</span><span class="s">"RRT Path Planning"</span><span class="p">,</span> <span class="n">img</span><span class="p">);</span>
    <span class="n">cv</span><span class="o">::</span><span class="n">waitKey</span><span class="p">(</span><span class="mi">20</span><span class="p">);</span> <span class="c1">// Short delay to update the display</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">initRRT</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">770</span><span class="p">,</span> <span class="mi">770</span><span class="p">);</span> <span class="c1">// startX, startY, endX, endY point</span>
    <span class="n">initObstacles</span><span class="p">();</span> <span class="c1">// Initialize obstacles</span>

    <span class="kt">int</span> <span class="n">iterations</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">const</span> <span class="kt">int</span> <span class="n">maxIterations</span> <span class="o">=</span> <span class="mi">50000</span><span class="p">;</span> <span class="c1">// Limit the number of iterations to avoid infinite loop</span>

    <span class="n">cv</span><span class="o">::</span><span class="n">Mat</span> <span class="n">img</span><span class="p">(</span><span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">,</span> <span class="n">CV_8UC3</span><span class="p">,</span> <span class="n">cv</span><span class="o">::</span><span class="n">Scalar</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">));</span>

    <span class="k">while</span> <span class="p">(</span><span class="nb">true</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">iterations</span><span class="o">++</span> <span class="o">&gt;</span> <span class="n">maxIterations</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Max iterations reached."</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="n">generatePath</span><span class="p">();</span>
        <span class="n">updateVisualization</span><span class="p">(</span><span class="n">img</span><span class="p">);</span>

        <span class="k">if</span> <span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="n">pow</span><span class="p">(</span><span class="n">path</span><span class="p">.</span><span class="n">back</span><span class="p">().</span><span class="n">x</span> <span class="o">-</span> <span class="n">destination</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">pow</span><span class="p">(</span><span class="n">path</span><span class="p">.</span><span class="n">back</span><span class="p">().</span><span class="n">y</span> <span class="o">-</span> <span class="n">destination</span><span class="p">.</span><span class="n">y</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span> <span class="o">&lt;</span> <span class="n">jump</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="n">cv</span><span class="o">::</span><span class="n">waitKey</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> <span class="c1">// Wait for a key press</span>
    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Path generated with "</span> <span class="o">&lt;&lt;</span> <span class="n">path</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">" points."</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />
<h3>실행결과</h3>

<p><img src="https://github.com/its-seon/its-seon.github.io/assets/145862553/1365e7d5-3f89-41d3-b43b-95c315af72c2" alt="Screenshot from 2024-04-27 22-50-31" /></p>]]></content><author><name>its-seon</name></author><category term="path_planning" /><summary type="html"><![CDATA[RRT Algorithm]]></summary></entry></feed>