<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>영칠이의 개발로그</title>
    <link>https://yeong77.tistory.com/</link>
    <description>yeong77 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Sun, 14 Jun 2026 20:50:52 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>yeong77</managingEditor>
    <image>
      <title>영칠이의 개발로그</title>
      <url>https://tistory1.daumcdn.net/tistory/8174464/attach/a90f9a7780ad4610b03e57d72e5e1286</url>
      <link>https://yeong77.tistory.com</link>
    </image>
    <item>
      <title>MQTT 통신</title>
      <link>https://yeong77.tistory.com/17</link>
      <description>&lt;h2&gt;1. MQTT란?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;MQTT는 가볍고 효율적인 Pub/Sub 메시징 프로토콜로, 저전력·저대역폭 환경에서 센서 데이터나 제어 명령을 주고받는 데 많이    쓰이며, 드론·IoT·모바일 기기 통신에 적합합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;구조:&lt;/p&gt;
&lt;p&gt;Broker: 메시지 중계 서버 (예: Mosquitto)&lt;/p&gt;
&lt;p&gt;Publisher: 메시지를 보내는 쪽&lt;/p&gt;
&lt;p&gt;Subscriber: 메시지를 받는 쪽&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. 로컬에서 MQTT Broker 설치&lt;/h2&gt;
&lt;p&gt;가장 많이 쓰이는 건 Eclipse Mosquitto입니다.&lt;/p&gt;
&lt;p&gt;Ubuntu / Debian 계열&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install mosquitto mosquitto-clients -y&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;3. Mosquitto 실행하기&lt;/h2&gt;
&lt;p&gt;Ubuntu에서 기본 실행&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable mosquitto  
sudo systemctl start mosquitto&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;4. 메시지 주고받기 (로컬 테스트)&lt;/h2&gt;
&lt;p&gt;구독하기 (Subscriber)&lt;/p&gt;
&lt;p&gt;터미널 1:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mosquitto_sub -h localhost -t &amp;quot;test/topic&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;-h localhost: 브로커 주소 (로컬이므로 localhost)&lt;/li&gt;
&lt;li&gt;-t &amp;quot;test/topic&amp;quot;: 구독할 토픽 이름&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;발행하기 (Publisher)&lt;/p&gt;
&lt;p&gt;터미널 2:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mosquitto_pub -h localhost -t &amp;quot;test/topic&amp;quot; -m &amp;quot;Hello MQTT!&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;  그럼 터미널 1에서 메시지가 출력됨:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Hello MQTT!&lt;/code&gt;&lt;/pre&gt;</description>
      <category>MQTT</category>
      <author>yeong77</author>
      <guid isPermaLink="true">https://yeong77.tistory.com/17</guid>
      <comments>https://yeong77.tistory.com/17#entry17comment</comments>
      <pubDate>Mon, 1 Sep 2025 18:14:16 +0900</pubDate>
    </item>
    <item>
      <title>LIO-SAM 코드 리뷰</title>
      <link>https://yeong77.tistory.com/15</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. LIO-SAM 핵심 개념&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;-Tightly-coupled fusion&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;rarr; LiDAR와 IMU 데이터를 하나의 최적화 문제로 강하게 결합&lt;br /&gt;&lt;b&gt;&amp;nbsp;- Factor-graph based estimation&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;rarr; 요인 그래프(Factor Graph)로 포즈와 상태를 동시에 추정&lt;br /&gt;&lt;b&gt;&amp;nbsp;- Old scan marginalization &amp;rarr; Pose optimization&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;rarr; 오래된 스캔은 제거(마진화)하고, 최신 스캔 중심으로 자세 최적화&lt;br /&gt;&lt;b&gt;&amp;nbsp;- Local scan matching for real-time&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;rarr; 국소적인 스캔 매칭만 수행하여 실시간 처리 가능&lt;br /&gt;&amp;nbsp;- &lt;b&gt;Sliding window&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;rarr; 일정 구간(윈도우) 안의 데이터만 유지하며 연속적으로 최적화&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. FLOW&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전체 메인 코드는 이렇게 이루어지고 그 중 두 프로세스(Feature Extraction, Image Projection)는 라이다 데이터를 전처리 하는데 사용됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/yeong77/post/22a09590-e79d-433d-a5f8-ab2284ed970f/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Main Code&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1 IMU Preintegration&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/yeong77/post/48a519ef-0b42-4d6e-81d1-cf71143b08a4/image.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://velog.velcdn.com/images/yeong77/post/1b57aab5-59fd-409d-9619-ff4a5ebf14c7/image.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://velog.velcdn.com/images/yeong77/post/8ae3f23c-70a5-421d-a139-6a839e92816d/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2 Image Projection / Feature Extraction&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이다는 한 프레임 안에서도 포인트마다 측정 시간이 달라 왜곡이 생기는데요.&amp;nbsp;&lt;br /&gt;이를 IMU 데이터를 활용한 &lt;b&gt;deskewing&lt;/b&gt;으로 보정해 모든 포인트를 같은 시간 기준으로 맞춥니다.&lt;br /&gt;그 후 &lt;b&gt;Feature Extraction&lt;/b&gt; 단계에서 코너(edge)와 평면(surface) 포인트를 뽑아내어 SLAM에 활용합니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/yeong77/post/6358bd2f-5910-44b3-a77b-cea98fae79b6/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3 Map Optimization&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) loop-closure factor&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/yeong77/post/ffed4fab-e3fb-43a3-80c0-44d7e382cabd/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/yeong77/post/b05d8fd9-2e08-4e8d-be38-85881603411e/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) odom factor&amp;nbsp; &amp;nbsp; &lt;img src=&quot;https://velog.velcdn.com/images/yeong77/post/159283b7-685a-4c5d-b0db-07b0209d2a79/image.png&quot; alt=&quot;&quot; /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;img src=&quot;https://velog.velcdn.com/images/yeong77/post/c281f096-535c-4438-8639-7d769d7fd097/image.png&quot; alt=&quot;&quot; /&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) gps factor&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/yeong77/post/720d9b67-3b3f-4610-ba2c-cccb5e73621c/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) 최적화&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/yeong77/post/76ea5c50-2b88-4077-a6c5-9f4939fc024b/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;</description>
      <category>논문</category>
      <category>LIO-SAM</category>
      <category>Slam</category>
      <author>yeong77</author>
      <guid isPermaLink="true">https://yeong77.tistory.com/15</guid>
      <comments>https://yeong77.tistory.com/15#entry15comment</comments>
      <pubDate>Fri, 29 Aug 2025 16:37:52 +0900</pubDate>
    </item>
    <item>
      <title>LIO-SAM 논문 리뷰</title>
      <link>https://yeong77.tistory.com/13</link>
      <description>&lt;p data-end=&quot;450&quot; data-start=&quot;181&quot; data-ke-size=&quot;size16&quot;&gt;LIO-SAM:&amp;nbsp;Factor&amp;nbsp;Graph&amp;nbsp;기반&amp;nbsp;LiDAR-IMU&amp;nbsp;융합&amp;nbsp;프레임워크&amp;nbsp;정리&lt;/p&gt;
&lt;p data-end=&quot;450&quot; data-start=&quot;181&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;450&quot; data-start=&quot;181&quot; data-ke-size=&quot;size16&quot;&gt;최근 로봇의 자율주행 및 정밀한 위치 추정을 위해 &lt;b&gt;다중 센서 융합&lt;/b&gt;이 활발히 연구되고 있습니다. 그중에서도 &lt;b&gt;LiDAR-IMU 융합&lt;/b&gt;은 조명 변화나 시각적 특성에 크게 의존하지 않고, 안정적인 3D 환경 이해와 궤적 추정을 가능하게 해 주어 많은 주목을 받고 있습니다. 이번 글에서는 대표적인 LiDAR-IMU 융합 프레임워크인 &lt;b&gt;LIO-SAM (LiDAR-Inertial Odometry via Smoothing and Mapping)&lt;/b&gt; 논문을 정리해 보았습니다.&lt;/p&gt;
&lt;hr data-end=&quot;455&quot; data-start=&quot;452&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;468&quot; data-start=&quot;457&quot; data-ke-size=&quot;size26&quot;&gt;1. 연구 배경&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;855&quot; data-start=&quot;470&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;524&quot; data-start=&quot;470&quot;&gt;&lt;b&gt;비전 기반 방법&lt;/b&gt;: 장소 인식에는 강점이 있지만 조명 변화와 관측 거리 변화에 취약.&lt;/li&gt;
&lt;li data-end=&quot;571&quot; data-start=&quot;525&quot;&gt;&lt;b&gt;LiDAR 기반 방법&lt;/b&gt;: 환경의 기하학적 구조를 안정적으로 반영 가능.&lt;/li&gt;
&lt;li data-end=&quot;855&quot; data-start=&quot;572&quot;&gt;&lt;b&gt;기존 연구의 한계&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;855&quot; data-start=&quot;590&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;729&quot; data-start=&quot;590&quot;&gt;&lt;b&gt;LOAM&lt;/b&gt;: 낮은 드리프트와 루프 클로저 탐지가 가능하지만,
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;729&quot; data-start=&quot;635&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;676&quot; data-start=&quot;635&quot;&gt;전역 맵 기반이라 루프 클로저 발생 시 이전 위치를 수정하기 어려움&lt;/li&gt;
&lt;li data-end=&quot;696&quot; data-start=&quot;681&quot;&gt;GPS 통합에도 제약&lt;/li&gt;
&lt;li data-end=&quot;729&quot; data-start=&quot;701&quot;&gt;매번 스캔 매칭 수행 &amp;rarr; 누적 드리프트 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;788&quot; data-start=&quot;732&quot;&gt;&lt;b&gt;LeGO-LOAM&lt;/b&gt;: UGV 환경에 맞게 단순화, 하지만 IMU 최적화를 고려하지 않음.&lt;/li&gt;
&lt;li data-end=&quot;855&quot; data-start=&quot;791&quot;&gt;&lt;b&gt;LIOM&lt;/b&gt;: tightly-coupled 구조지만 모든 센서 데이터를 처리해야 해서 실시간성이 떨어짐.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;860&quot; data-start=&quot;857&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;884&quot; data-start=&quot;862&quot; data-ke-size=&quot;size26&quot;&gt;2. LIO-SAM의 핵심 아이디어&lt;/h2&gt;
&lt;p data-end=&quot;955&quot; data-start=&quot;886&quot; data-ke-size=&quot;size16&quot;&gt;LIO-SAM은 &lt;b&gt;tightly-coupled 방식&lt;/b&gt;으로 LiDAR와 IMU를 팩터 그래프 내에서 공동 최적화합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1241&quot; data-start=&quot;956&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1038&quot; data-start=&quot;956&quot;&gt;&lt;b&gt;IMU Pre-integration&lt;/b&gt;: LiDAR 스캔 중 발생하는 움직임을 추정하여 포인트 클라우드 왜곡 제거 및 초기 추정값 제공.&lt;/li&gt;
&lt;li data-end=&quot;1082&quot; data-start=&quot;1039&quot;&gt;&lt;b&gt;LiDAR Odometry 결과&lt;/b&gt;: IMU 바이어스 추정에 활용.&lt;/li&gt;
&lt;li data-end=&quot;1144&quot; data-start=&quot;1083&quot;&gt;&lt;b&gt;Factor Graph 최적화&lt;/b&gt;: IMU, LiDAR, GPS, 루프 클로저 팩터를 동시에 고려.&lt;/li&gt;
&lt;li data-end=&quot;1241&quot; data-start=&quot;1145&quot;&gt;&lt;b&gt;실시간성 확보&lt;/b&gt;: 오래된 스캔은 마진화(marginalization)하고, &lt;b&gt;선택적 keyframe + sliding window 방식&lt;/b&gt;으로 계산량을 제어.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1246&quot; data-start=&quot;1243&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1260&quot; data-start=&quot;1248&quot; data-ke-size=&quot;size26&quot;&gt;3. 시스템 개요&lt;/h2&gt;
&lt;p data-end=&quot;1279&quot; data-start=&quot;1262&quot; data-ke-size=&quot;size16&quot;&gt;LIO-SAM의 상태 벡터는&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;233&quot; data-origin-height=&quot;36&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvW31C/btsP8uCWDgQ/D3wBVA6ArL4mkGWRBkhcVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvW31C/btsP8uCWDgQ/D3wBVA6ArL4mkGWRBkhcVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvW31C/btsP8uCWDgQ/D3wBVA6ArL4mkGWRBkhcVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvW31C%2FbtsP8uCWDgQ%2FD3wBVA6ArL4mkGWRBkhcVk%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;233&quot; height=&quot;36&quot; data-origin-width=&quot;233&quot; data-origin-height=&quot;36&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1365&quot; data-start=&quot;1315&quot; data-ke-size=&quot;size16&quot;&gt;으로, **자세(R), 위치(p), 속도(v), IMU 바이어스(b)**를 포함합니다.&lt;/p&gt;
&lt;p data-end=&quot;1456&quot; data-start=&quot;1367&quot; data-ke-size=&quot;size16&quot;&gt;최적화는 &lt;b&gt;MAP(Maximum a Posteriori) 추정&lt;/b&gt;으로 정식화되며, 노이즈를 가우시안으로 가정하여 &lt;b&gt;비선형 최소제곱 문제&lt;/b&gt;로 변환됩니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1474&quot; data-start=&quot;1458&quot; data-ke-size=&quot;size23&quot;&gt;팩터 그래프 구성 요소&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1542&quot; data-start=&quot;1475&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1492&quot; data-start=&quot;1475&quot;&gt;&lt;b&gt;IMU 사전적분 팩터&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1513&quot; data-start=&quot;1493&quot;&gt;&lt;b&gt;LiDAR 오도메트리 팩터&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1526&quot; data-start=&quot;1514&quot;&gt;&lt;b&gt;GPS 팩터&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1542&quot; data-start=&quot;1527&quot;&gt;&lt;b&gt;루프 클로저 팩터&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1589&quot; data-start=&quot;1544&quot; data-ke-size=&quot;size16&quot;&gt;최적화는 &lt;b&gt;iSAM2&lt;/b&gt; 기반 점진적 스무딩으로 실시간에 가깝게 수행됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;1594&quot; data-start=&quot;1591&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1610&quot; data-start=&quot;1596&quot; data-ke-size=&quot;size26&quot;&gt;4. 주요 구성 요소&lt;/h2&gt;
&lt;h3 data-end=&quot;1652&quot; data-start=&quot;1612&quot; data-ke-size=&quot;size23&quot;&gt;A. IMU 사전적분 (Pre-integration Factor)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1766&quot; data-start=&quot;1653&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1689&quot; data-start=&quot;1653&quot;&gt;가속도&amp;middot;각속도 데이터를 적분해 상대적인 바디 움직임 추정.&lt;/li&gt;
&lt;li data-end=&quot;1722&quot; data-start=&quot;1690&quot;&gt;사전적분 방식을 사용하여 &lt;b&gt;계산 효율성&lt;/b&gt; 확보.&lt;/li&gt;
&lt;li data-end=&quot;1766&quot; data-start=&quot;1723&quot;&gt;LiDAR Odometry 팩터와 함께 IMU 바이어스를 공동 최적화.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1771&quot; data-start=&quot;1768&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1801&quot; data-start=&quot;1773&quot; data-ke-size=&quot;size23&quot;&gt;B. LiDAR Odometry Factor&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2147&quot; data-start=&quot;1802&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1889&quot; data-start=&quot;1802&quot;&gt;&lt;b&gt;특징 추출&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1889&quot; data-start=&quot;1821&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1852&quot; data-start=&quot;1821&quot;&gt;roughness 큰 점 &amp;rarr; &lt;b&gt;edge 특징&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1889&quot; data-start=&quot;1856&quot;&gt;roughness 작은 점 &amp;rarr; &lt;b&gt;plane 특징&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1998&quot; data-start=&quot;1890&quot;&gt;&lt;b&gt;Keyframe 선택&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1998&quot; data-start=&quot;1915&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1953&quot; data-start=&quot;1915&quot;&gt;위치 변화 1m 이상 or 회전 변화 10&amp;deg; 이상일 때 등록.&lt;/li&gt;
&lt;li data-end=&quot;1998&quot; data-start=&quot;1957&quot;&gt;최근 n개의 keyframe만 유지 (sliding window).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2147&quot; data-start=&quot;1999&quot;&gt;&lt;b&gt;Scan Matching&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2147&quot; data-start=&quot;2026&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2061&quot; data-start=&quot;2026&quot;&gt;새 프레임을 기존 sub-keyframe map에 정합.&lt;/li&gt;
&lt;li data-end=&quot;2087&quot; data-start=&quot;2065&quot;&gt;초기 추정은 IMU 예측값 사용.&lt;/li&gt;
&lt;li data-end=&quot;2147&quot; data-start=&quot;2091&quot;&gt;최적화로 두 포즈 간 상대 변환 &amp;Delta;T 추정 &amp;rarr; LiDAR odometry factor로 연결.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2152&quot; data-start=&quot;2149&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2171&quot; data-start=&quot;2154&quot; data-ke-size=&quot;size23&quot;&gt;C. GPS Factor&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2295&quot; data-start=&quot;2172&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2213&quot; data-start=&quot;2172&quot;&gt;장시간 내비게이션에서 드리프트를 줄이기 위해 절대 위치 센서 사용.&lt;/li&gt;
&lt;li data-end=&quot;2257&quot; data-start=&quot;2214&quot;&gt;GPS 데이터를 로컬 좌표계로 변환하여 factor graph에 추가.&lt;/li&gt;
&lt;li data-end=&quot;2295&quot; data-start=&quot;2258&quot;&gt;공분산 비교를 통해 신뢰성 있는 경우에만 GPS 팩터 반영.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2300&quot; data-start=&quot;2297&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2328&quot; data-start=&quot;2302&quot; data-ke-size=&quot;size23&quot;&gt;D. Loop Closure Factor&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2475&quot; data-start=&quot;2329&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2384&quot; data-start=&quot;2329&quot;&gt;새 keyframe이 추가될 때 과거 keyframe과의 유클리드 거리 기반으로 후보 탐색.&lt;/li&gt;
&lt;li data-end=&quot;2436&quot; data-start=&quot;2385&quot;&gt;Scan matching 후 상대 변환을 loop closure factor로 추가.&lt;/li&gt;
&lt;li data-end=&quot;2475&quot; data-start=&quot;2437&quot;&gt;시간적으로 멀리 떨어져 있지만 공간적으로 가까운 경우 효과적.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2480&quot; data-start=&quot;2477&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2504&quot; data-start=&quot;2482&quot; data-ke-size=&quot;size26&quot;&gt;5. LIO-SAM의 특징 및 기여&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2727&quot; data-start=&quot;2506&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2571&quot; data-start=&quot;2506&quot;&gt;&lt;b&gt;Tightly-coupled LIDAR-IMU fusion&lt;/b&gt;: IMU 바이어스까지 고려한 정밀한 최적화.&lt;/li&gt;
&lt;li data-end=&quot;2634&quot; data-start=&quot;2572&quot;&gt;&lt;b&gt;Factor Graph 기반 전역 최적화&lt;/b&gt;: LiDAR, IMU, GPS, 루프 클로저 동시 고려.&lt;/li&gt;
&lt;li data-end=&quot;2682&quot; data-start=&quot;2635&quot;&gt;&lt;b&gt;Sliding Window&lt;/b&gt;: 실시간성을 보장하며 오래된 스캔은 마진화.&lt;/li&gt;
&lt;li data-end=&quot;2727&quot; data-start=&quot;2683&quot;&gt;&lt;b&gt;다양한 환경에서 검증&lt;/b&gt;: 실내/실외, 대규모 공간에서 모두 효과적.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>논문</category>
      <category>LIO-SAM</category>
      <category>Slam</category>
      <author>yeong77</author>
      <guid isPermaLink="true">https://yeong77.tistory.com/13</guid>
      <comments>https://yeong77.tistory.com/13#entry13comment</comments>
      <pubDate>Tue, 26 Aug 2025 18:00:38 +0900</pubDate>
    </item>
    <item>
      <title>JT16 LiDAR 사용법</title>
      <link>https://yeong77.tistory.com/12</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JT라이다 16채널 사용법을 포스팅 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JT라이다는 아래의 ROS 패키지와 SDK를 이용하였습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/HesaiTechnology/HesaiLidar_ROS_2.0/tree/master&quot;&gt;JT 라이다 ROS 패키지&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/HesaiTechnology/HesaiLidar_SDK_2.0&quot;&gt;JT 라이다 SDK&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;-jt-lidar-사용법&quot; data-ke-size=&quot;size23&quot;&gt;  JT LiDAR 사용법&lt;/h3&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;/ol&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;git clone https://github.com/HesaiTechnology/HesaiLidar_ROS_2.0.git&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;cd HesaiLidar_ROS_2.0/src/driver
git clone https://github.com/HesaiTechnology/HesaiLidar_SDK_2.0.git&lt;/code&gt;&lt;/pre&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;/ol&gt;
&lt;pre class=&quot;q&quot;&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install -y libpcl-dev libpcap-dev libyaml-cpp-dev openssl&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;SDK 빌드&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;cd HesaiLidar_SDK_2.0
mkdir -p build &amp;amp;&amp;amp; cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j$(nproc)&lt;/code&gt;&lt;/pre&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;/ol&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;colcon build&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 빌드를 다하면 이제 라이다에 있는 rs485 케이블과 rs232 케이블 각각을 pc에 연결 후 포트이름을 체크하고 권한을 줍니다!&lt;br /&gt;둘 다 ttyUSB&lt;b&gt;*&lt;/b&gt;일수도 있고 ttyACM*일수도 있어서 체크해 봐야 합니다.&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;/ol&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;ls -l /dev/ttyUSB*
sudo chmod 666 /dev/ttyUSB*&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트 번호를 확인 후 아래와 같이 config.yaml 파일에서 serial로 연결할 경우 source_type을 4로 하고, 포트 번호를 저장해줍니다.&lt;br /&gt;그리고 라이다 센서의 보정 데이터가 있는 csv파일의 경로도 넣어줍니다.&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;/ol&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;source_type : 4 
serial_type:
	rs485_com: &quot;/dev/ttyUSB0&quot;
	RS232_COM: &quot;/dev/ttyACM0&quot;
	point_cloud_baudrate: 3125000
	correction_save_path:
	correction_file_path: &quot;/home/yy/ros2_ws/src/HesaiLidar_ROS_2.0/Correction file/JT16-JT35CA5D9235C956-Angle-Fix.csv&quot;&lt;/code&gt;&lt;/pre&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;/ol&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;ros2 launch hesai_ros_driver start.py&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;-결과사진&quot; data-ke-size=&quot;size23&quot;&gt;  결과사진&lt;/h3&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VpafO/btsPDb6azlB/lHck6dfAytshOgyfDKurT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VpafO/btsPDb6azlB/lHck6dfAytshOgyfDKurT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VpafO/btsPDb6azlB/lHck6dfAytshOgyfDKurT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVpafO%2FbtsPDb6azlB%2FlHck6dfAytshOgyfDKurT0%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;1033&quot; height=&quot;730&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Sensor</category>
      <category>lidar</category>
      <author>yeong77</author>
      <guid isPermaLink="true">https://yeong77.tistory.com/12</guid>
      <comments>https://yeong77.tistory.com/12#entry12comment</comments>
      <pubDate>Fri, 8 Aug 2025 11:24:43 +0900</pubDate>
    </item>
    <item>
      <title>Docker GPU 연결</title>
      <link>https://yeong77.tistory.com/11</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 docker에서 gpu 사용가능하게 하는 방법을 포스팅하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저의 경우에는 GPU가 오픈 소스 커널 모듈(nvidia-open)만 지원이 가능해서 거기에 맞게 설치하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ 기존 NVIDIA 드라이버 완전 제거&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;sudo apt purge '^nvidia'
sudo apt autoremove --purge
sudo rm -rf /etc/X11/xorg.conf
sudo update-initramfs -u&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2️⃣ 최신 NVIDIA 드라이버 (Open 모드 포함) 재설치&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Ubudo ubuntu-drivers devices
sudo apt install nvidia-driver-550-open
sudo reboot
nvidia-smi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3️⃣ NVIDIA Container Toolkit 설치 여부 확인&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;dpkg -l | grep nvidia-container&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;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;distribution=$(. /etc/os-release;echo $ID$VERSION_ID) &amp;amp;&amp;amp; \
sudo mkdir -p /etc/systemd/system/docker.service.d &amp;amp;&amp;amp; \
curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo apt-key add - &amp;amp;&amp;amp; \
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-container.list&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install -y nvidia-docker2
sudo systemctl restart docke```&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Docker</category>
      <category>docker</category>
      <category>GPU</category>
      <author>yeong77</author>
      <guid isPermaLink="true">https://yeong77.tistory.com/11</guid>
      <comments>https://yeong77.tistory.com/11#entry11comment</comments>
      <pubDate>Thu, 7 Aug 2025 11:22:40 +0900</pubDate>
    </item>
    <item>
      <title>Gazebo Sensor Plugin</title>
      <link>https://yeong77.tistory.com/10</link>
      <description>&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8alQq/btsPCoR9vEu/TQT6FuLvDcDwbeMyq4smR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8alQq/btsPCoR9vEu/TQT6FuLvDcDwbeMyq4smR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8alQq/btsPCoR9vEu/TQT6FuLvDcDwbeMyq4smR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8alQq%2FbtsPCoR9vEu%2FTQT6FuLvDcDwbeMyq4smR1%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;1280&quot; height=&quot;515&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 저번에 이어서 가제보 환경에 라이다와 IMU 센서를 플러그인 해서 ROS 데이터를 받아오는 것을 포스팅하겠습니다 !&lt;/p&gt;
&lt;h3 id=&quot;1-lidar-plugin&quot; data-ke-size=&quot;size23&quot;&gt;1. LiDAR Plugin&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 여기서 사용한 라이다 모델은 Velodyne이고, Gazebo-classic 환경입니다.&lt;/p&gt;
&lt;h4 id=&quot;11-git-clone&quot; data-ke-size=&quot;size20&quot;&gt;1.1 git clone&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 velodyne 모델이 있는 git repository를 clone 한 후 아래의 경로에 붙여넣어 줍니다.&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;pre class=&quot;awk&quot;&gt;&lt;code&gt;PX4-Autopilot/Tools/simulation/gazebo-classic/models&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;git clone&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;git clone https://github.com/osrf/gazebo_models.git&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;12-model-joint-연결&quot; data-ke-size=&quot;size20&quot;&gt;1.2 model joint 연결&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 아래 경로의 model.sdf 에서 다음과 같이 라이다를 include 해주고 joint를 넣어줘서 기존의 드론 모델과 결합을 시켜줍니다.&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;pre class=&quot;awk&quot;&gt;&lt;code&gt;PX4-Autopilot/Tools/simulation/gazebo-classic/models/iris/model.sdf &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;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;include name=&quot;velodyne&quot;&amp;gt;
      &amp;lt;uri&amp;gt;model://velodyne_hdl32&amp;lt;/uri&amp;gt;
      &amp;lt;pose&amp;gt;0 0 -0.1 0 0 0&amp;lt;/pose&amp;gt; &amp;lt;!-- 드론 중심 기준 위치 --&amp;gt;
    &amp;lt;/include&amp;gt;

    &amp;lt;joint name=&quot;velodyne_joint&quot; type=&quot;fixed&quot;&amp;gt;
      &amp;lt;parent&amp;gt;base_link&amp;lt;/parent&amp;gt;  &amp;lt;!-- 드론의 메인 링크 --&amp;gt;
      &amp;lt;child&amp;gt;velodyne::base&amp;lt;/child&amp;gt; &amp;lt;!-- velodyne 모델의 링크 이름 --&amp;gt;
    &amp;lt;/joint&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;13-sensor-플러그인&quot; data-ke-size=&quot;size20&quot;&gt;1.3 sensor 플러그인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 센서를 사용하기 위해서는 일단 아래와 같은 패키지를 설치해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;sudo apt install ros-humble-gazebo-ros-pkgs ros-humble-gazebo-ros2-control
sudo apt install ros-humble-velodyne-description ros-humble-velodyne-gazebo-plugins ros-humble-velodyne-simulator&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 velodyne 모델 sdf 파일에서 센서 블록안에 다음과 같이 추가를 해줍니다. 아래를 추가해줘야 시뮬레이션을 실행했을 때 ROS 메시지가 나옵니다 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서의 토픽이름은 &quot;/velodyne_points&quot; 입니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;plugin name=&quot;gazebo_ros_laser_controller&quot; filename=&quot;libgazebo_ros_velodyne_laser.so&quot;&amp;gt;
          &amp;lt;ros&amp;gt;
            &amp;lt;namespace&amp;gt;/velodyne&amp;lt;/namespace&amp;gt;
            &amp;lt;remapping&amp;gt;~/out:=velodyne_points&amp;lt;/remapping&amp;gt;
          &amp;lt;/ros&amp;gt;
          &amp;lt;frame_name&amp;gt;top&amp;lt;/frame_name&amp;gt;
          &amp;lt;organize_cloud&amp;gt;false&amp;lt;/organize_cloud&amp;gt;
          &amp;lt;min_range&amp;gt;0.9&amp;lt;/min_range&amp;gt;
          &amp;lt;max_range&amp;gt;130.0&amp;lt;/max_range&amp;gt;
          &amp;lt;gaussian_noise&amp;gt;0.008&amp;lt;/gaussian_noise&amp;gt;
        &amp;lt;/plugin&amp;gt;
        &lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;14---라이다-스캔-조정&quot; data-ke-size=&quot;size20&quot;&gt;1.4 라이다 스캔 조정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.3 까지 하고 라이다를 스캔을 시각화했을 때 포인트 수가 적고 시야각이 좁아서 다음과 같이 샘플 수와 시야각을 늘려 주었습니다. 다음은 라이다의 모델 sdf 파일에서 ray 블록안에 추가해주면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;scan&amp;gt;
  &amp;lt;horizontal&amp;gt;
    &amp;lt;samples&amp;gt;1024&amp;lt;/samples&amp;gt;
    &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;
    &amp;lt;min_angle&amp;gt;-3.1415&amp;lt;/min_angle&amp;gt;
    &amp;lt;max_angle&amp;gt;3.1415&amp;lt;/max_angle&amp;gt;
  &amp;lt;/horizontal&amp;gt;
  &amp;lt;vertical&amp;gt;
    &amp;lt;samples&amp;gt;128&amp;lt;/samples&amp;gt;
    &amp;lt;resolution&amp;gt;1&amp;lt;/resolution&amp;gt;
    &amp;lt;min_angle&amp;gt;-3.1415&amp;lt;/min_angle&amp;gt;
    &amp;lt;max_angle&amp;gt;3.1415&amp;lt;/max_angle&amp;gt; 
  &amp;lt;/vertical&amp;gt;
&amp;lt;/scan&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-imu-plugin&quot; data-ke-size=&quot;size23&quot;&gt;2. IMU Plugin&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 IMU Plugin 입니다. 라이다에서는 include 했지만 imu는 바로 모델 sdf 파일에 센서 플러그인을 하였습니다. 크게 다음과 같이 추가했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mass&lt;/li&gt;
&lt;li&gt;pose&lt;/li&gt;
&lt;li&gt;plugin&lt;/li&gt;
&lt;li&gt;jointmass 같은 경우에는 추가하지 않으면 드론이 제대로 날지 않았어서 추가해줬습니다. 그리고 질량이 너무 크면 드론이 천천히 날고, waypoint를 주었을 때 급하강했다가 상승하는 현상이 보이기 때문에 적당한 값을 넣어줘야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;link name=&quot;imu_link&quot;&amp;gt;
      &amp;lt;pose&amp;gt;0.05 0 -0.1 0 0 0&amp;lt;/pose&amp;gt;

      &amp;lt;inertial&amp;gt;
        &amp;lt;mass&amp;gt;0.001&amp;lt;/mass&amp;gt;
        &amp;lt;inertia&amp;gt;
          &amp;lt;ixx&amp;gt;1e-6&amp;lt;/ixx&amp;gt;
          &amp;lt;iyy&amp;gt;1e-6&amp;lt;/iyy&amp;gt;
          &amp;lt;izz&amp;gt;1e-6&amp;lt;/izz&amp;gt;
          &amp;lt;ixy&amp;gt;0&amp;lt;/ixy&amp;gt;
          &amp;lt;ixz&amp;gt;0&amp;lt;/ixz&amp;gt;
          &amp;lt;iyz&amp;gt;0&amp;lt;/iyz&amp;gt;
        &amp;lt;/inertia&amp;gt;
      &amp;lt;/inertial&amp;gt;
      
      &amp;lt;sensor name=&quot;imu_sensor&quot; type=&quot;imu&quot;&amp;gt;
        &amp;lt;pose&amp;gt;0 0 0 0 0 0&amp;lt;/pose&amp;gt;  &amp;lt;!-- IMU 위치 설정 --&amp;gt;
        &amp;lt;always_on&amp;gt;true&amp;lt;/always_on&amp;gt;
        &amp;lt;update_rate&amp;gt;100.0&amp;lt;/update_rate&amp;gt;
        &amp;lt;visualize&amp;gt;true&amp;lt;/visualize&amp;gt;
        &amp;lt;plugin name=&quot;imu_plugin&quot; filename=&quot;libgazebo_ros_imu_sensor.so&quot;&amp;gt;
            &amp;lt;ros&amp;gt;
              &amp;lt;namespace&amp;gt;/imu&amp;lt;/namespace&amp;gt;
              &amp;lt;remapping&amp;gt;~/out:=data&amp;lt;/remapping&amp;gt;
            &amp;lt;/ros&amp;gt;
            &amp;lt;topicName&amp;gt;imu/data&amp;lt;/topicName&amp;gt;
            &amp;lt;frameName&amp;gt;imu_link&amp;lt;/frameName&amp;gt;
          &amp;lt;/plugin&amp;gt;
      &amp;lt;/sensor&amp;gt;
    &amp;lt;/link&amp;gt;

    &amp;lt;joint name=&quot;imu_joint&quot; type=&quot;fixed&quot;&amp;gt;
      &amp;lt;parent&amp;gt;base_link&amp;lt;/parent&amp;gt;
      &amp;lt;child&amp;gt;imu_link&amp;lt;/child&amp;gt;
    &amp;lt;/joint&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-결과&quot; data-ke-size=&quot;size23&quot;&gt;3. 결과&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;센서 실행은 저번에 포스팅한 드론 실행하는 command를 사용하면 센서가 활성화가 됩니다 !&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;topic list&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdIdo0/btsP4nkrdID/KGh1RtKtJ119g9sPk3iJT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdIdo0/btsP4nkrdID/KGh1RtKtJ119g9sPk3iJT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdIdo0/btsP4nkrdID/KGh1RtKtJ119g9sPk3iJT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdIdo0%2FbtsP4nkrdID%2FKGh1RtKtJ119g9sPk3iJT1%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;204&quot; height=&quot;107&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;/figure&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;라이다 topic echo&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuvkRj/btsP5tjQQYl/EjNBG0BQrfnVbylN7lYGG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuvkRj/btsP5tjQQYl/EjNBG0BQrfnVbylN7lYGG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuvkRj/btsP5tjQQYl/EjNBG0BQrfnVbylN7lYGG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuvkRj%2FbtsP5tjQQYl%2FEjNBG0BQrfnVbylN7lYGG1%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;308&quot; height=&quot;548&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&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;imu topic echo&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;297&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dc0cL6/btsP4lth9YU/ZKtHZ7uxYVJ6AQv9YuJIm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dc0cL6/btsP4lth9YU/ZKtHZ7uxYVJ6AQv9YuJIm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dc0cL6/btsP4lth9YU/ZKtHZ7uxYVJ6AQv9YuJIm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdc0cL6%2FbtsP4lth9YU%2FZKtHZ7uxYVJ6AQv9YuJIm1%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;297&quot; height=&quot;514&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;297&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&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;Scan 시각화&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1592&quot; data-origin-height=&quot;641&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q8609/btsP4mTgsDn/Lf3Dml76Ho0vPHxol92U41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q8609/btsP4mTgsDn/Lf3Dml76Ho0vPHxol92U41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q8609/btsP4mTgsDn/Lf3Dml76Ho0vPHxol92U41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq8609%2FbtsP4mTgsDn%2FLf3Dml76Ho0vPHxol92U41%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;1592&quot; height=&quot;641&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1592&quot; data-origin-height=&quot;641&quot;/&gt;&lt;/span&gt;&lt;/figure&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;감사합니다 .&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Gazebo</category>
      <author>yeong77</author>
      <guid isPermaLink="true">https://yeong77.tistory.com/10</guid>
      <comments>https://yeong77.tistory.com/10#entry10comment</comments>
      <pubDate>Wed, 6 Aug 2025 14:13:06 +0900</pubDate>
    </item>
    <item>
      <title>PX4 simulation</title>
      <link>https://yeong77.tistory.com/9</link>
      <description>&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wZdUO/btsPCKtSgL5/kOUycd0em3RAnQDTbeSWd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wZdUO/btsPCKtSgL5/kOUycd0em3RAnQDTbeSWd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wZdUO/btsPCKtSgL5/kOUycd0em3RAnQDTbeSWd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwZdUO%2FbtsPCKtSgL5%2FkOUycd0em3RAnQDTbeSWd1%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;1280&quot; height=&quot;729&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;729&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 px4 설치하고 가제보 환경에서 제어하는 것을 포스팅 하려고 합니다.&lt;br /&gt;이후에는 ROS를 사용해서 드론을 제어하고 라이다와 IMU를 플러그인해서 센서 데이터까지 받아오는 것을 포스트하겠습니다.&lt;/p&gt;
&lt;h3 id=&quot;px4-설치&quot; data-ke-size=&quot;size23&quot;&gt; px4 설치&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;git clone https://github.com/PX4/PX4-Autopilot.git --recursive
bash ./PX4-Autopilot/Tools/setup/ubuntu.sh
cd /ros2_ws/src/PX4-Autopilot&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;빌드-및-가제보-실행&quot; data-ke-size=&quot;size23&quot;&gt; 빌드 및 가제보 실행&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;cd /ros2_ws/src/PX4-Autopilot
make px4_sitl gazebo-classic
make px4_sitl gazebo-classic_iris__warehouse (가제보 환경 있는 버전)&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;다음과 같이 시뮬레이션 환경이 열리면 'Ready for takeoff'가 뜨는데, 이게 뜨면 pxh&amp;gt; 에다가 원하는 명령어를 입력하면 됩니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FoHpN/btsPClOD7Tl/w2WFFWQpaXVgKmeUkXjKck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FoHpN/btsPClOD7Tl/w2WFFWQpaXVgKmeUkXjKck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FoHpN/btsPClOD7Tl/w2WFFWQpaXVgKmeUkXjKck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFoHpN%2FbtsPClOD7Tl%2Fw2WFFWQpaXVgKmeUkXjKck%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;956&quot; height=&quot;318&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h3 id=&quot;제어&quot; data-ke-size=&quot;size23&quot;&gt; 제어&lt;/h3&gt;
&lt;pre class=&quot;sqf&quot;&gt;&lt;code&gt;commander takeoff
commander land&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;gcs-설치&quot; data-ke-size=&quot;size23&quot;&gt; GCS 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 GCS가 있어야 Takeoff가 가능했는데 지금은 없어도 가능하네요 ..? 아무튼 네&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 링크에서 다운 받으면 됩니당&lt;br /&gt;&lt;a href=&quot;https://docs.qgroundcontrol.com/master/en/qgc-user-guide/getting_started/download_and_install.html&quot;&gt;Qgroundcontrol&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커를 사용하는 경우에는 root에서 실행을 못하고, user에서 실행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 일반 사용자 권한 허용을 해준후 user모드로 들어가서 해야됩니다.&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;//권한 허용
usermod -a -G dialout $user

//user mode
su - $user&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;결과&quot; data-ke-size=&quot;size23&quot;&gt; 결과&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 사진과 같이 commander takeoff를 했을 때 드론이 이륙하는것을 볼 수 있습니다.&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;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs1Orv/btsPB1CTYe1/gOXj6lJYStw0Pbe2hU4az0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs1Orv/btsPB1CTYe1/gOXj6lJYStw0Pbe2hU4az0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs1Orv/btsPB1CTYe1/gOXj6lJYStw0Pbe2hU4az0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs1Orv%2FbtsPB1CTYe1%2FgOXj6lJYStw0Pbe2hU4az0%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;1280&quot; height=&quot;695&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;695&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XQBnQ/btsPDl1tERO/KYMSw7wrbhLVhRMHK7EK6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XQBnQ/btsPDl1tERO/KYMSw7wrbhLVhRMHK7EK6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XQBnQ/btsPDl1tERO/KYMSw7wrbhLVhRMHK7EK6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXQBnQ%2FbtsPDl1tERO%2FKYMSw7wrbhLVhRMHK7EK6K%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;1280&quot; height=&quot;729&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;729&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>drone</category>
      <category>px4</category>
      <author>yeong77</author>
      <guid isPermaLink="true">https://yeong77.tistory.com/9</guid>
      <comments>https://yeong77.tistory.com/9#entry9comment</comments>
      <pubDate>Tue, 5 Aug 2025 14:10:32 +0900</pubDate>
    </item>
    <item>
      <title>ROS bridge</title>
      <link>https://yeong77.tistory.com/8</link>
      <description>&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOw639/btsPCUQKJxs/9UyX3br5iziBZfFfliXuP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOw639/btsPCUQKJxs/9UyX3br5iziBZfFfliXuP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOw639/btsPCUQKJxs/9UyX3br5iziBZfFfliXuP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOw639%2FbtsPCUQKJxs%2F9UyX3br5iziBZfFfliXuP1%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;625&quot; height=&quot;401&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 ROS1과 ROS2 통신이 가능하도록 하는 ROS Bridge에 대해 다뤄보려고 합니다.&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ros2/ros1_bridge&quot;&gt;ros1_bridge&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 두 환경에서 통신이 되게 하려면 같은 우분투 환경에서 ROS1과 ROS2가 설치가 되어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 사용한 개발환경은 Ubuntu 20.04 이고, 같은 환경에 foxy와 noetic이 설치가 되어있습니다.&lt;/p&gt;
&lt;h2 id=&quot;1️⃣-설치-방법&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1️⃣ 설치 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 id=&quot;-1-ros1_bridge-패키지-설치-ros2-foxy-기준&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  1) ros1_bridge 패키지 설치 (ROS2 foxy 기준)&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install -y ros-foxy-ros1-bridge
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;-2-ros1과-ros2-환경-설정&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  2) ROS1과 ROS2 환경 설정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 터미널에서 해당하는 ROS 버전을 로드.&lt;/p&gt;
&lt;h3 id=&quot;️-ros1-예-noetic&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✔️ ROS1 (예: Noetic)&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;source /opt/ros/noetic/setup.bash
roscore&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;️-ros2-예-foxy&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✔️ ROS2 (예: Foxy)&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;source /opt/ros/foxy/setup.bash&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;-3-브리지-실행-옵션-추가하여-강제-브리지&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  3) 브리지 실행 (옵션 추가하여 강제 브리지)&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;ros2 run ros1_bridge dynamic_bridge --bridge-all-topics&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;이제 ROS1과 ROS2 간에 자동으로 브리지가 설정됨!&lt;/b&gt;&lt;/p&gt;
&lt;h3 id=&quot;--ros2에서-메시지-발행--ros1에서-수신&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  ) ROS2에서 메시지 발행 &amp;amp; ROS1에서 수신&lt;/b&gt;&lt;/h3&gt;
&lt;h3 id=&quot;️-ros2에서-메시지-발행&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✔️ ROS2에서 메시지 발행&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;source /opt/ros/foxy/setup.bash
ros2 topic pub /number std_msgs/msg/Int32 &quot;{data: 42}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;️-ros1에서-메시지-수신&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✔️ ROS1에서 메시지 수신&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;source /opt/ros/noetic/setup.bash
rostopic echo /number&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;ROS2에서 보낸 메시지가 ROS1에서 정상적으로 보이면 성공!&lt;/b&gt;  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  주의사항&lt;br /&gt;일단 저의 경우에는 원래 humble과 noetic에서 통신을 하려고 했는데, 같은 우분투 환경안에서 해야하다 보니 noetic은 20.04이고 humble은 22.04라서 불가능 했습니다. 그리고 같은 우분투 환경이기 때문에 도커 컨테이너에서도 되지 않았네요. humble 버전을 사용하고 싶은데 혹시 아시는 분 있으면 댓글 부탁드립니다  &lt;/p&gt;
&lt;h2 id=&quot;2️⃣-결과&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2️⃣ 결과 &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 오른쪽 foxy에서 메시지를 publish하면 왼쪽 noetic에서 subscribe하는 것을 볼 수 있습니다.&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;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCK93d/btsPEQznImJ/4YfNFOhPpFcL5MlarMg3g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCK93d/btsPEQznImJ/4YfNFOhPpFcL5MlarMg3g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCK93d/btsPEQznImJ/4YfNFOhPpFcL5MlarMg3g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCK93d%2FbtsPEQznImJ%2F4YfNFOhPpFcL5MlarMg3g0%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;1280&quot; height=&quot;336&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>ROS2</category>
      <author>yeong77</author>
      <guid isPermaLink="true">https://yeong77.tistory.com/8</guid>
      <comments>https://yeong77.tistory.com/8#entry8comment</comments>
      <pubDate>Mon, 4 Aug 2025 14:08:50 +0900</pubDate>
    </item>
    <item>
      <title>LiDAR와 IMU 센서 동기화</title>
      <link>https://yeong77.tistory.com/7</link>
      <description>&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xBVop/btsPE6IKN6e/CijhZDAAUWQ1gP9kZbtYBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xBVop/btsPE6IKN6e/CijhZDAAUWQ1gP9kZbtYBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xBVop/btsPE6IKN6e/CijhZDAAUWQ1gP9kZbtYBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxBVop%2FbtsPE6IKN6e%2FCijhZDAAUWQ1gP9kZbtYBk%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;1280&quot; height=&quot;602&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LIO-SAM은 두 센서의 데이터를 융합해 정밀한 위치 추정을 수행하므로, 시간적으로 일치된 데이터가 필수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LiDAR는 저주파, IMU는 고주파이기 때문에 IMU 데이터를 LiDAR 주기에 맞춰 동기화해야 합니다. 이를 위해 ROS의 메시지 필터를 사용했고, 약간의 시간 오차를 허용하는 ApproximateTime 정책을 적용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 ExactTime으로 시도했지만, 시간이 너무 정확히 일치해야 해서 동기화가 잘 되지 않더라구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;zwj;♂️&lt;/p&gt;
&lt;h2 id=&quot;️코드-작성sync_imucpp&quot; data-ke-size=&quot;size26&quot;&gt;☑️코드 작성(sync_imu.cpp)&lt;/h2&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;#include &amp;lt;rclcpp/rclcpp.hpp&amp;gt;
#include &amp;lt;sensor_msgs/msg/imu.hpp&amp;gt;
#include &amp;lt;sensor_msgs/msg/point_cloud2.hpp&amp;gt;
#include &amp;lt;message_filters/subscriber.h&amp;gt;
#include &amp;lt;message_filters/time_synchronizer.h&amp;gt;
#include &amp;lt;message_filters/sync_policies/approximate_time.h&amp;gt;
#include &amp;lt;rclcpp/qos.hpp&amp;gt;

using std::placeholders::_1;
using std::placeholders::_2;

class SyncLidarImuNode : public rclcpp::Node
{
public:
    SyncLidarImuNode() : Node(&quot;sync_lidar_imu&quot;)
    {
        RCLCPP_INFO(this-&amp;gt;get_logger(), &quot;IMU &amp;amp; LiDAR Synchronization Node Started.&quot;);

        // '/ouster/points'의 퍼블리셔가 'BEST_EFFORT'이므로, Subscriber도 'BEST_EFFORT'로 설정
        rclcpp::QoS qos_profile = rclcpp::QoS(rclcpp::KeepLast(10));
        qos_profile.reliability(RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT);
        qos_profile.durability(RMW_QOS_POLICY_DURABILITY_VOLATILE);

        rclcpp::QoS imu_qos_profile = rclcpp::QoS(rclcpp::KeepLast(10));
        imu_qos_profile.reliability(RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT);
        imu_qos_profile.durability(RMW_QOS_POLICY_DURABILITY_VOLATILE);

        // SubscriptionOptions 사용하여 QoS 강제적용
        rclcpp::SubscriptionOptions options;
        options.qos_overriding_options = rclcpp::QosOverridingOptions::with_default_policies();

        // message_filters::Subscriber에서도 `BEST_EFFORT` 적용
        imu_sub_.subscribe(this, &quot;/imu/data&quot;, rmw_qos_profile_sensor_data);
        lidar_sub_.subscribe(this, &quot;/ouster/points&quot;, rmw_qos_profile_sensor_data);

        // Approximate Time Synchronizer 동기화 정책 설정 
        sync_ = std::make_shared&amp;lt;message_filters::Synchronizer&amp;lt;SyncPolicy&amp;gt;&amp;gt;(SyncPolicy(20), imu_sub_, lidar_sub_);
        sync_-&amp;gt;setMaxIntervalDuration(rclcpp::Duration::from_seconds(0.017)); //best
        sync_-&amp;gt;registerCallback(std::bind(&amp;amp;SyncLidarImuNode::callback, this, _1, _2));

        // 동기화된 IMU 메시지 publish
        imu_pub_ = this-&amp;gt;create_publisher&amp;lt;sensor_msgs::msg::Imu&amp;gt;(&quot;/synced_imu&quot;, imu_qos_profile);
        lidar_pub_ = this-&amp;gt;create_publisher&amp;lt;sensor_msgs::msg::PointCloud2&amp;gt;(&quot;/synced_points&quot;, qos_profile);
    }

private:
    // 동기화된 IMU &amp;amp; LiDAR 메시지가 도착했을 때 호출되는 콜백함수 
    void callback(const sensor_msgs::msg::Imu::ConstSharedPtr imu_msg, 
                  const sensor_msgs::msg::PointCloud2::ConstSharedPtr lidar_msg)
    {
        RCLCPP_INFO(this-&amp;gt;get_logger(), &quot;Callback function triggered!&quot;);

        auto synced_imu = std::make_shared&amp;lt;sensor_msgs::msg::Imu&amp;gt;(*imu_msg);
        auto synced_points = std::make_shared&amp;lt;sensor_msgs::msg::PointCloud2&amp;gt;(*lidar_msg);

        lidar_pub_-&amp;gt;publish(*synced_points);
        imu_pub_-&amp;gt;publish(*synced_imu);
    }

    
	// 개별 LiDAR 데이터 수신 콜백
    using SyncPolicy = message_filters::sync_policies::ApproximateTime&amp;lt;sensor_msgs::msg::Imu, sensor_msgs::msg::PointCloud2&amp;gt;;
    std::shared_ptr&amp;lt;message_filters::Synchronizer&amp;lt;SyncPolicy&amp;gt;&amp;gt; sync_;

    message_filters::Subscriber&amp;lt;sensor_msgs::msg::Imu&amp;gt; imu_sub_;
    message_filters::Subscriber&amp;lt;sensor_msgs::msg::PointCloud2&amp;gt; lidar_sub_;

    rclcpp::Publisher&amp;lt;sensor_msgs::msg::Imu&amp;gt;::SharedPtr imu_pub_;
    rclcpp::Publisher&amp;lt;sensor_msgs::msg::PointCloud2&amp;gt;::SharedPtr lidar_pub_;

};

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared&amp;lt;SyncLidarImuNode&amp;gt;());
    rclcpp::shutdown();
    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;전체 코드는 위와 같고, 여기서 중요한 2가지가 있습니다.&lt;br /&gt;  각 프로그램 마다 적용되는 QoS 정책이 다를 수가 있으니 참고해주세요.&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. QoS 설정 방식&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SubscriptionOptions&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QoS 충돌 상황에서 강제로 QoS 적용가능. 특히 RELIABLE vs BEST_EFFORT 문제 해결 도움.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. message_filters::Subscriber의 QoS 처리&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;imusub.subscribe(this, &quot;/imu/data&quot;, rmw_qos_profile_sensor_data);&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rmw_qos_profile_sensor_data는 ROS2에서 BEST_EFFORT에 맞게 정의된 기본 QoS&lt;br /&gt;&amp;rarr; 퍼블리셔와 일치하도록 확실하게 맞춰줌.&lt;/p&gt;
&lt;h2 id=&quot;️실행&quot; data-ke-size=&quot;size26&quot;&gt;☑️실행&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발환경 : 우분투 22.04. ROS humble&lt;br /&gt;사용 장비 : OUSTER LIDAR 32채널, VECTORNAV imu VN-100&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. LiDAR launch &lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;ros2 launch ouster_ros sensor.launch.xml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. IMU 실행 &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;a href=&quot;https://github.com/KumarRobotics/imu_vn_100/tree/rolling&quot;&gt;imu_vn_100 &lt;/a&gt; (※ rolling 브랜치 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;ros2 launch imu_vn_100 imu_vn_100-launch.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 동기화 실행 &lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;ros2 run imu_vn_100 sync_imu&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;️결과-확인&quot; data-ke-size=&quot;size26&quot;&gt;☑️결과 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  ros2 bag을 이용한 동기화 확인 &lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;ros2 bag record /synced_points /synced_imu&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;ros2 bag info &amp;lt;bag_file_name&amp;gt;&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;br /&gt;/imu/data 메시지 수 : 561&lt;br /&gt;/ouster/points 메시지 수 : 56&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxraQH/btsPECnNdQ9/AXIOznHsck0DEzLInZJYP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxraQH/btsPECnNdQ9/AXIOznHsck0DEzLInZJYP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxraQH/btsPECnNdQ9/AXIOznHsck0DEzLInZJYP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxraQH%2FbtsPECnNdQ9%2FAXIOznHsck0DEzLInZJYP1%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;969&quot; height=&quot;186&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;s&gt;동기화 후 :&lt;/s&gt;&lt;br /&gt;&lt;s&gt;/synced_imu 메시지 수 : 43&lt;/s&gt;&lt;br /&gt;&lt;s&gt;/ouster/points 메시지 수 : 45&lt;/s&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vwk3l/btsPDEGtoSK/oHfiJxVj3S52zcUYMrySqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vwk3l/btsPDEGtoSK/oHfiJxVj3S52zcUYMrySqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vwk3l/btsPDEGtoSK/oHfiJxVj3S52zcUYMrySqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvwk3l%2FbtsPDEGtoSK%2FoHfiJxVj3S52zcUYMrySqK%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;960&quot; height=&quot;186&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;++수정&lt;br /&gt;제가 이전에는 /synced_imu와 /ouster/points와 비교를 했었는데 imu와 points 모두 동기화 이후의 토픽 메시지를 받아보면 메시지 수가 동일하게 나옵니다!&lt;/p&gt;</description>
      <category>Sensor</category>
      <category>IMU</category>
      <category>lidar</category>
      <category>syncronization</category>
      <author>yeong77</author>
      <guid isPermaLink="true">https://yeong77.tistory.com/7</guid>
      <comments>https://yeong77.tistory.com/7#entry7comment</comments>
      <pubDate>Sun, 3 Aug 2025 14:05:19 +0900</pubDate>
    </item>
    <item>
      <title>RTK-GPS 사용</title>
      <link>https://yeong77.tistory.com/6</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sparkfun사의 ZED-F9P RTK-GPS 사용법을 포스트하겠습니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2sCMJ/btsPDbq67Wi/BuRhJZ1nvmklpSgsOcXTZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2sCMJ/btsPDbq67Wi/BuRhJZ1nvmklpSgsOcXTZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2sCMJ/btsPDbq67Wi/BuRhJZ1nvmklpSgsOcXTZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2sCMJ%2FbtsPDbq67Wi%2FBuRhJZ1nvmklpSgsOcXTZK%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;407&quot; height=&quot;341&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;참고한 사이트는 아래와 같습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RTK F9P SOLUTION&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;updating-the-receiver-firmware&quot; data-ke-size=&quot;size26&quot;&gt; Updating the Receiver Firmware&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;로버 수신기 펌웨어 업데이트&lt;br /&gt;NMEA 축소 &amp;gt; UBX 확장 &amp;gt; MON 확장 &amp;gt; Version 확인&lt;br /&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dna/c58irj/btsPDnEWKQj/AAAAAAAAAAAAAAAAAAAAANbP9gFovM57fggnsd-BuXFiu6_EVgaoTmTl7-yWYaaN/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1753973999&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=py9%2FLkOKQ63V2YENs%2BU8e21fx4U%3D&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Tools &amp;gt; Firmware&lt;br /&gt;체크해제 'Enter safeboot before update'&lt;br /&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dna/bE8Aa8/btsPDtLWhYm/AAAAAAAAAAAAAAAAAAAAAAJmRTjRmxMhbRiNpIipQqr4Gmzu0KbXEVarhjMb5AOm/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1753973999&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=rRLsek%2FSVRZ2MJJ2nkywtGFlqOA%3D&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;setting-up-a-temporary-base&quot; data-ke-size=&quot;size26&quot;&gt; Setting Up a Temporary Base&lt;/h2&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;Telemetry radio kit 이용해 RTCM 보정 데이터를 rover에 전송.&lt;/li&gt;
&lt;li&gt;Telemetry radio가 base에서 rover로 RTCM 통신에 적합.&lt;/li&gt;
&lt;/ul&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;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;u-center 열고 보드 연결한 후에 windows가 생성한 해당 COM 포트에 연결.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S434E/btsPB4M2H3o/GGEhI9PrkjF8vzCxvLaUpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S434E/btsPB4M2H3o/GGEhI9PrkjF8vzCxvLaUpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S434E/btsPB4M2H3o/GGEhI9PrkjF8vzCxvLaUpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS434E%2FbtsPB4M2H3o%2FGGEhI9PrkjF8vzCxvLaUpk%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;312&quot; height=&quot;263&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;모듈 구성&lt;br /&gt;1) 라디오-ZED-F9P의 UART2 연결 가정&lt;br /&gt;2) u-center 메시지 창에서 아래의 메시지를 UART2와 USB 모두 활성화&lt;br /&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dna/bC37nn/btsPC4ZTGQY/AAAAAAAAAAAAAAAAAAAAACs6oPnIrMXu5FWFIFqx91Pged-bbYj25oLjMO99zawu/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1753973999&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=wPGwugdt45p0I%2FRJz5CSCH2bGH0%3D&quot; /&gt;3) 이후 'SEND' 버튼&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu7ayg/btsPEElzKyU/vTwLKYiOaWAKklSs7Sj7f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu7ayg/btsPEElzKyU/vTwLKYiOaWAKklSs7Sj7f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu7ayg/btsPEElzKyU/vTwLKYiOaWAKklSs7Sj7f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu7ayg%2FbtsPEElzKyU%2FvTwLKYiOaWAKklSs7Sj7f0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;459&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;RTCM 문장만 전송하도록 설정&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PRT &amp;gt; UART2로 설정 &amp;gt; 57600으로 설정 &amp;gt; SEND&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cndUEr/btsPD0blEPV/PwaAu81aDD4PsKGKizcrPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cndUEr/btsPD0blEPV/PwaAu81aDD4PsKGKizcrPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cndUEr/btsPD0blEPV/PwaAu81aDD4PsKGKizcrPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcndUEr%2FbtsPD0blEPV%2FPwaAu81aDD4PsKGKizcrPK%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;608&quot; height=&quot;350&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;UART2는 serial RTCM을 보내고 받는데 적합.&lt;/li&gt;
&lt;li&gt;USB는 RTCM 메시지가 출력되고 있는지 확인할 수 있도록 활성화됨.&lt;/li&gt;
&lt;/ul&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;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CFG &amp;gt; BBR : 배터리 백업 RAM &amp;gt; FLASH : 설정 플래시 메모리에 기록&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLYxRp/btsPCUQG3Lx/cXrjs98ZcrPRbi81j3L9eK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLYxRp/btsPCUQG3Lx/cXrjs98ZcrPRbi81j3L9eK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLYxRp/btsPCUQG3Lx/cXrjs98ZcrPRbi81j3L9eK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLYxRp%2FbtsPCUQG3Lx%2FcXrjs98ZcrPRbi81j3L9eK%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;660&quot; height=&quot;413&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Survey in 초기화&lt;br /&gt;1) CFG &amp;gt; TMODE3으로 이동&lt;br /&gt;2) 모드 변경&lt;br /&gt;3) 시간 변경 (관측 시간)&lt;br /&gt;4) 정확도 변경 (필요한 정확도)&lt;br /&gt;5) 'SEND'&lt;img src=&quot;https://blog.kakaocdn.net/dna/vX6oG/btsPCUQG3JY/AAAAAAAAAAAAAAAAAAAAADVmmYDKChaDGD0aFQnAwl4CTqnQvUMQ2wByl8hwZAe2/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1753973999&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=1y8sHeb4W1hma8vyTpVGj7r8GOw%3D&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Survey 상태 모니터링&lt;br /&gt;1) NAV로 이동&lt;br /&gt;2) SVIN 우클릭후, Enable message 선택&lt;br /&gt;⇾ 모듈이 이 레지스터 상태를 매초마다 보내도록 설정이 됨.&lt;br /&gt;⇾ 60초 동안 데이터 수집하고 표준편차는 5m 이하로 작아진다. (위의 그림으로 예를 들어)&lt;br /&gt;⇾ Survey, &amp;ldquo;complete&amp;rdquo; 라고 알림.&lt;br /&gt;⇾ 최종적으로 모듈이 고정됨(fixed).&lt;img src=&quot;https://blog.kakaocdn.net/dna/bnWwoL/btsPC6wEHFF/AAAAAAAAAAAAAAAAAAAAAFtkyqzBMEUCTYQOZR_lqdyanwKk05uz_aTsQwQZrUGk/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1753973999&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=OQL40r1x3NvrWzjktCqemIKXEl8%3D&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Base 고정 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NAV &amp;gt; PVT&lt;/li&gt;
&lt;li&gt;Fix Type이 'TIME'이면 Base를 성공적으로 설정한 것임.&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kx2CJ/btsPDPny9vJ/idLf5ydcxBMiHqCpCr39H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kx2CJ/btsPDPny9vJ/idLf5ydcxBMiHqCpCr39H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kx2CJ/btsPDPny9vJ/idLf5ydcxBMiHqCpCr39H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkx2CJ%2FbtsPDPny9vJ%2FidLf5ydcxBMiHqCpCr39H1%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;597&quot; height=&quot;287&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&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;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포켓 콘솔 창열면 RTCM 메시지 확인 가능.&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gh02i/btsPERydXpM/tCHpX04fP2qfkbIclQITX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gh02i/btsPERydXpM/tCHpX04fP2qfkbIclQITX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gh02i/btsPERydXpM/tCHpX04fP2qfkbIclQITX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGh02i%2FbtsPERydXpM%2FtCHpX04fP2qfkbIclQITX0%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;715&quot; height=&quot;271&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;저장 및 로드&lt;br /&gt;1) Tools &amp;gt; Receiver Configuration&lt;br /&gt;2) 현재 설정 파일로 저장(Survey-In-Config.txt.으로 저장)&lt;br /&gt;3) u-center 사용하여 로드&lt;br /&gt;4) 로드 후 BBR/Flash에 기록해야함.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;-rover-setup&quot; data-ke-size=&quot;size26&quot;&gt;  Rover Setup&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;U-blox에서 ZED-F9P를 로버모드로 설정&lt;/li&gt;
&lt;li&gt;로버는 RTCM 보정 데이터를 받으면, RTK-Float / RTK Fix로 진입&lt;/li&gt;
&lt;li&gt;u-center 열고 로버 모듈에 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[준비]&lt;br /&gt;1. UBX&amp;gt;CFG&amp;gt;PRT : 1. UART2로 구성 2. Baudrate 57600으로 설정 (베이스와 라디오 일치하게)&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qKqwq/btsPEScQvJ4/IXJnNKk5t48A10yaQn2511/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qKqwq/btsPEScQvJ4/IXJnNKk5t48A10yaQn2511/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qKqwq/btsPEScQvJ4/IXJnNKk5t48A10yaQn2511/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqKqwq%2FbtsPEScQvJ4%2FIXJnNKk5t48A10yaQn2511%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;610&quot; height=&quot;353&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;※ 모듈 설정에 문제 발생하면 &amp;lsquo;Revert to default configuration&amp;rsquo; 선택하고 전송&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MwaDs/btsPCKUVCKW/SinFtbkugHF7bIBzmssuKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MwaDs/btsPCKUVCKW/SinFtbkugHF7bIBzmssuKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MwaDs/btsPCKUVCKW/SinFtbkugHF7bIBzmssuKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMwaDs%2FbtsPCKUVCKW%2FSinFtbkugHF7bIBzmssuKK%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;661&quot; height=&quot;412&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;아래와 같이 납땜. (telemtry와 zed-f9p 모듈)&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mGpxM/btsPDKNqVk0/uzciRvOYa7y0olJgsvpbOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mGpxM/btsPDKNqVk0/uzciRvOYa7y0olJgsvpbOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mGpxM/btsPDKNqVk0/uzciRvOYa7y0olJgsvpbOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmGpxM%2FbtsPDKNqVk0%2FuzciRvOYa7y0olJgsvpbOk%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;596&quot; height=&quot;301&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wX3Om/btsPEw8YEBk/VZ4G4Nfw3ikppoehlZEkN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wX3Om/btsPEw8YEBk/VZ4G4Nfw3ikppoehlZEkN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wX3Om/btsPEw8YEBk/VZ4G4Nfw3ikppoehlZEkN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwX3Om%2FbtsPEw8YEBk%2FVZ4G4Nfw3ikppoehlZEkN1%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;206&quot; height=&quot;87&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[테스트]&lt;br /&gt;1. Rover와 Base를 전원에 연결 ⇾ Telemetry radio가 서로 인식하고 직렬 데이터 전달.&lt;br /&gt;2. Rover 상태 확인위해 u-center 준비.&lt;br /&gt;⇾ 위치 정확도 NAV &amp;gt; HPPOSECEF&lt;br /&gt;⇾ 수평 정확도 NAV &amp;gt; HPPOSLLH&lt;br /&gt;⇾ 3D에서 RTK Float, RTK Fixed로 진행될 때 고정유형 보여줌 (NAV &amp;gt; PVT)&lt;br /&gt;(Rover가 RTCM 수신하는 동안, 3D Fix &amp;gt; RTK Float &amp;gt; RTK Fix 빠르게 이동)&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPqE8y/btsPCoEu1zQ/5EeIKpySX6KQN7amLDVsw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPqE8y/btsPCoEu1zQ/5EeIKpySX6KQN7amLDVsw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPqE8y/btsPCoEu1zQ/5EeIKpySX6KQN7amLDVsw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPqE8y%2FbtsPCoEu1zQ%2F5EeIKpySX6KQN7amLDVsw1%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;609&quot; height=&quot;583&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ RTK LED ON = 일반 위성 모드, 비-RTK 모드&lt;br /&gt;✔️ RTK LED 깜박임 = RTK Float, ~&amp;lt;500mm 정확도&lt;br /&gt;✔️ RTK LED OFF = RTK Fix, 14mm acurracy&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;로버 RTK Fix 후 ZED-F9P는 UART1과 USB를 통해 고정밀 좌표를 출력.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;정리&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&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;Base가 Survey in 완료 후 무선 링크를 통해 RTCM 전송 시작&lt;/li&gt;
&lt;li&gt;몇초동안 RTCM 수신한 후, Rover의 수신기 RTK Float ⇾ RTK Fix로 진입 후 높 은 정확도의 데이터 출력&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 사진은 RTK가 고정되었을 때 화면이다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc5JBE/btsPEOuNBlM/lIHEo2DGZM9vcLRGqckatK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc5JBE/btsPEOuNBlM/lIHEo2DGZM9vcLRGqckatK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc5JBE/btsPEOuNBlM/lIHEo2DGZM9vcLRGqckatK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc5JBE%2FbtsPEOuNBlM%2FlIHEo2DGZM9vcLRGqckatK%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;824&quot; height=&quot;556&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Sensor</category>
      <category>GPS</category>
      <author>yeong77</author>
      <guid isPermaLink="true">https://yeong77.tistory.com/6</guid>
      <comments>https://yeong77.tistory.com/6#entry6comment</comments>
      <pubDate>Sat, 2 Aug 2025 12:11:38 +0900</pubDate>
    </item>
  </channel>
</rss>