<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dbdb_Dev.log</title>
        <link>https://velog.io/</link>
        <description>Web-Front / SW-AI 개발자</description>
        <lastBuildDate>Sun, 08 Feb 2026 07:35:23 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dbdb_Dev.log</title>
            <url>https://velog.velcdn.com/images/dbdb_dev/profile/4d5fef9e-e1af-4130-a88e-c5f07a2ca9a0/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dbdb_Dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dbdb_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[3. 픽스호크-라즈베리파이 세팅]]></title>
            <link>https://velog.io/@dbdb_dev/3.-%ED%94%BD%EC%8A%A4%ED%98%B8%ED%81%AC-%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC%ED%8C%8C%EC%9D%B4-%EC%84%B8%ED%8C%85</link>
            <guid>https://velog.io/@dbdb_dev/3.-%ED%94%BD%EC%8A%A4%ED%98%B8%ED%81%AC-%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC%ED%8C%8C%EC%9D%B4-%EC%84%B8%ED%8C%85</guid>
            <pubDate>Sun, 08 Feb 2026 07:35:23 GMT</pubDate>
            <description><![CDATA[<h1 id="1-라즈베리파이-세팅">1. 라즈베리파이 세팅</h1>
<ol>
<li><p>Raspberry Pi OS 설치
Raspberry Pi Imager를 이용해 micro SD 카드에 OS를 설치</p>
<blockquote>
<p>사용 OS: Raspberry Pi OS (Bookworm)
사용 보드: Raspberry Pi 5B
 <img src="https://velog.velcdn.com/images/dbdb_dev/post/545d0abc-c79d-4f65-89aa-3c6e1c1cf250/image.png" alt="">
 <img src="https://velog.velcdn.com/images/dbdb_dev/post/69e6a6f1-044f-44bc-ba5d-003a3f73f2f0/image.png" alt="">
 <img src="https://velog.velcdn.com/images/dbdb_dev/post/43f597dc-9128-4e55-8e9a-d3a08abc37a4/image.png" alt="">
 <img src="https://velog.velcdn.com/images/dbdb_dev/post/b309e95d-664a-4905-ab3f-2ebe55996dd8/image.png" alt="">
 <img src="https://velog.velcdn.com/images/dbdb_dev/post/fe18f17d-fe25-43a2-b2da-7903c1cc8c0a/image.png" alt="">
 <img src="https://velog.velcdn.com/images/dbdb_dev/post/cebf1972-815c-458f-8021-f8d9ec0a0820/image.png" alt="">
 <img src="https://velog.velcdn.com/images/dbdb_dev/post/fa7c5ad7-d775-44ec-9427-a0743273e82b/image.png" alt="">
 <img src="https://velog.velcdn.com/images/dbdb_dev/post/c06dfdb9-5c90-4700-ad99-e96f721785a0/image.png" alt="">
 <img src="https://velog.velcdn.com/images/dbdb_dev/post/52976ef4-44d9-41de-9090-2c53796ae707/image.png" alt="">
 <img src="https://velog.velcdn.com/images/dbdb_dev/post/f7c9b96a-a76e-4d56-a7bd-075c296fe0c1/image.png" alt=""></p>
</blockquote>
</li>
<li><p>ssh 접속
라즈베리파이를 부팅한 후 SSH로 접속</p>
<blockquote>
<p>안드로이드 핸드폰 핫스팟을 사용하는 경우 → 핫스팟 설정 화면에서 연결된 기기의 IP 확인 가능
연결한 후, PC의 cmd 또는 PowerShell 등에서 라즈베리파이와 접속</p>
</blockquote>
<pre><code> ssh 유저이름@IP주소</code></pre></li>
</ol>
<h1 id="2-라즈베리파이-pixhawk-연동">2. 라즈베리파이-Pixhawk 연동</h1>
<p><em>해당 부분은 민규의_개발일지라는 분의 게시물을 많이 참고하였다.
(<a href="https://supersfel.tistory.com/entry/%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC%ED%8C%8C%EC%9D%B4%EC%99%80-%ED%94%BD%EC%8A%A4%ED%98%B8%ED%81%AC-%EC%97%B0%EB%8F%99-pixhawk-248">https://supersfel.tistory.com/entry/%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC%ED%8C%8C%EC%9D%B4%EC%99%80-%ED%94%BD%EC%8A%A4%ED%98%B8%ED%81%AC-%EC%97%B0%EB%8F%99-pixhawk-248</a>)</em></p>
<p>Raspberry Pi 5 (Bookworm) 기준으로 달라진 부분 위주로 정리</p>
<ol>
<li>가상환경 생성
Raspberry Pi 5 + Bookworm 환경에서는 sudo pip 사용 시 externally-managed-environment 오류가 발생한다. 따라서 반드시 가상환경에서 작업해야 한다</li>
</ol>
<pre><code>mkdir [프로젝트폴더]
cd [프로젝트 폴더]
python3 -m venv --system-site-packages [env이름]
source [env 이름]/bin/activate</code></pre><ol start="2">
<li>모듈 설치
Raspberry Pi 5는 Python3 기준으로 설치해야 한다
따라서 다음의 명령어들로 모듈을 설치하면 된다<pre><code>sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3-pip
sudo apt-get install python3-dev
pip install future
pip install pyserial
pip install dronekit
pip install MAVProxy
</code></pre></li>
</ol>
<p>sudo apt update
sudo apt install python3-wxgtk4.0
pip install lxml</p>
<pre><code>
# 3. UART(Serial) 포트 활성화
3-1. raspi-config 실행</code></pre><p>suro raspi-config</p>
<pre><code>Serial Interface 활성화

3-2. 포트 확인</code></pre><p>ls /dev/ttyAMA0</p>
<pre><code>출력이 나오면 성공

3-3. Bluetooth 비활성화 (UART 확보)
그 후 config 파일에서 블루투스 하드웨어를 비활성화하여 UART 시리얼 포트를 확보할 수 있도록 코드를 한 줄 추가해준다.
이는 기본적으로 블루투스가 사용하고 있던 고성능 하드웨어 UART를 사용자가 GPIO 14, 15 핀을 통해 시리얼 통신 등의 다른 용도로 사용할 수 있게 해준다.

다만, 라즈베리파이 5B의 os인 bookworm부터는 config 파일의 경로가 변경되었다.</code></pre><p>/boot/config.txt → /boot/firmware/config.txt</p>
<pre><code>![](https://velog.velcdn.com/images/dbdb_dev/post/a8f8e2a3-679c-428e-8797-9cf4cfef0346/image.png)

파일 수정:</code></pre><p>sudo nano /boot/firmware/config.txt</p>
<pre><code>맨 아래에 ```enable_uart=1```로 포트가 열려있는지 확인하고 그 밑에 코드를 한 줄 추가</code></pre><p>dtoverlay=disable-bt</p>
<pre><code>
![](https://velog.velcdn.com/images/dbdb_dev/post/68359302-e0cd-4da3-a1c2-f7c4dad6e7f9/image.png)

그 후 저장하여 파일을 닫고 재부팅 해준다.

# 4. Pixhawk 연결
![이미지 출처: https://supersfel.tistory.com/entry/%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC%ED%8C%8C%EC%9D%B4%EC%99%80-%ED%94%BD%EC%8A%A4%ED%98%B8%ED%81%AC-%EC%97%B0%EB%8F%99-pixhawk-248](https://velog.velcdn.com/images/dbdb_dev/post/77fa6310-6ead-4a58-aec0-4ba5d7711a51/image.png)

제품은 팰콘샵에서 라즈베리파이-픽스호크 연결 선을 구매하여 연결하였다.
(https://www.falconshop.co.kr/shop/goods/goods_view.php?goodsno=100086979)
전원 선을 꼭꼭꼭 잘 확인하여 상황에 맞게 사용하자.

5. MAVProxy 실행
내 라즈베리파이는 baudrate 57600에서 잘 작동하였다.
수행할 때 ```link 1 down```이라는 메세지와 함께 연결이 안된다면 일단 baudrate부터 조절해보고 그 후에 배선을 바꿔보면 될 것 같다.

실행 코드:
</code></pre><p>mavproxy.py --master=/dev/serial0 --baudrate 57600 --aircraft MyCopter</p>
<pre><code>
정상 연결 시:
- 현재 Flight Mode 확인 가능
- PreArm 오류 메시지 확인 가능
![](https://velog.velcdn.com/images/dbdb_dev/post/5e7893b4-ee56-4efa-a127-201261ab8fc9/image.png)

\* ModemManager 경고 해결
여기서 제일 상단에 발생하는 ```WARNING: You should uninstall ModemManager as it conflicts with APM and Pixhawk```을 확인해보자.

원인:
ModemManager는 LET 모뎀, 3G/4G USB 동글, GPS/통신 장치 등을 자동으로 감지해서 제어하는 서비스이다. 문제는 ModemManager가 /dev/tty*, /dev/serial* 같은 시리얼 장치에도 신호를 보내보는 것이다.
Pixhawk는 MAVLink 통신을 위해 해당 포트를 사용하므로 ModemManager가 간섭할 수 있다.

해결 방법:
나는 ModelManager를 서비스만 비활성화하는 방식으로 warning을 해결하고자 한다.
(해당 오류는 시스템 설치 여부로 인해 경고가 발생하는 거라 비활성화해도 오류가 발생하긴 한다. 다만 나중에 쓸 수도 있으니.....삭제까진 하지 않고 비활성화만 하려고 한다.)
</code></pre><p>sudo systemctl disable --now ModemManager
systemctl status ModemManager (-&gt; inactive (dead)이면 성공)
pgrep -a ModemManager (ModemManager 프로세스가 살아있는지 확인하는 명령어. 아무 출력 없으면 성공)</p>
<pre><code>
여기까지 성공했다면 라즈베리파이와 픽스호크의 연결이 잘 수행된 것이다. 끝!

---
# 5. 트러블슈팅
오류 1
#### REMOTE HOST IDENTIFICATION HAS CHANGED
중간에 os를 밀고 다시 깔았더니 REMOTE HOST IDENTIFICATION HAS CHANGED - RSA key 오류 발생
원인:
OS 재설치 후 IP는 동일하지만 RSA Key가 변경됨
쉽게 말하면, IP는 동일한데 목적지 서버 장비가 바뀌었을 경우 나오는 경고이다.0

해결 방법:</code></pre><p>ssh-keygen -R [서버 ip]</p>
<pre><code>
참고 https://kingsong.tistory.com/127#google_vignette

오류 2
#### E: Package &#39;python-pip&#39; has no installation candidate
![](https://velog.velcdn.com/images/dbdb_dev/post/a36e8458-35c7-4866-b442-88a56eab1d4b/image.png)
해결:
python3-pip으로 변경
python-dev 도 python3-dev으로 변경

오류 3
#### externally-managed-environment 오류
![](https://velog.velcdn.com/images/dbdb_dev/post/bb873b56-fc40-4555-a672-e3119fd2f1e7/image.png)
원인:
Bookworm부터 sudo pip 사용 불가

해결:
가상환경 내에서 pip 사용</code></pre><p>python3 -m venv [env이름]
source [env이름]/bin/activate</p>
<p>```</p>
<p>참고 <a href="https://mallard-oh-coding.tistory.com/20">https://mallard-oh-coding.tistory.com/20</a></p>
<hr>
<h1 id="최종-정리">최종 정리</h1>
<p>✅Raspberry Pi 5 + Bookworm 환경에서는 가상환경 필수
✅UART 사용을 위해 Bluetooth 비활성화 필요
✅MAVProxy 실행 시 Baudrate 확인</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[번외. T8FB 조종기 파헤치기]]></title>
            <link>https://velog.io/@dbdb_dev/F8-%EC%A1%B0%EC%A2%85%EA%B8%B0-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0</link>
            <guid>https://velog.io/@dbdb_dev/F8-%EC%A1%B0%EC%A2%85%EA%B8%B0-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0</guid>
            <pubDate>Sun, 18 Jan 2026 06:40:06 GMT</pubDate>
            <description><![CDATA[<p>드론을 처음 설정하다보니, Rudder, Elevator, Throttle, Aileron 같은 용어들을 구분하기 어려웠다.
이번 포스트에서는 드론 비행에 가장 기본이 되는 4가지 조종 축과 모드에 대해서 정리해본다.</p>
<p>사용 제품
<a href="https://www.falconshop.co.kr/shop/goods/goods_view.php?goodsno=100002102">https://www.falconshop.co.kr/shop/goods/goods_view.php?goodsno=100002102</a>
<img src="https://velog.velcdn.com/images/dbdb_dev/post/a0932df6-59dd-4868-91e2-0e45233dc020/image.png" alt=""></p>
<h1 id="1-rudder-yaw">1. Rudder (Yaw)</h1>
<ul>
<li>역할: 기체의 방향 회전</li>
<li>동작: 좌회전 / 우회전</li>
</ul>
<h1 id="2-elevator-pitch">2. Elevator (Pitch)</h1>
<ul>
<li>역할: 앞, 뒤 이동</li>
<li>동작: 전진 / 후진</li>
</ul>
<h1 id="3-throttle">3. Throttle</h1>
<ul>
<li>역할: 고도 조절</li>
<li>동작: 상승 / 하강</li>
</ul>
<h1 id="4-aileron-roll">4. Aileron (Roll)</h1>
<ul>
<li>역할: 좌, 우 이동</li>
<li>동작: 왼쪽 이동 / 오른쪽 이동</li>
</ul>
<table>
<thead>
<tr>
<th>조종 축</th>
<th>용어</th>
<th>움직임</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td>Rudder</td>
<td>Yaw</td>
<td>좌/우 회전</td>
<td>방향 전환</td>
</tr>
<tr>
<td>Elevator</td>
<td>Pitch</td>
<td>전/후 이동</td>
<td>앞뒤 이동</td>
</tr>
<tr>
<td>Throttle</td>
<td></td>
<td>상/하 이동</td>
<td>고도 조절</td>
</tr>
<tr>
<td>Aileron</td>
<td>Roll</td>
<td>좌/우 이동</td>
<td>측면 이동</td>
</tr>
</tbody></table>
<h3 id="드론-시동">드론 시동</h3>
<p>픽스호크는 조종기의 Pitch를 아래로 내린 후, rudder를 오른쪽으로 당겨 3초 정도 유지하면 시동이 걸린다.
반대로 pitch를 아래로 내린 후 rudder를 왼쪽으로 당겨 3초 정도 유지하면 시동이 꺼진다.</p>
<h1 id="픽스호크-비행-모드">픽스호크 비행 모드</h1>
<p>나는 3단계를 조절할 수 있는 SwB를 통해 비행 모드를 설정하였다.</p>
<table>
<thead>
<tr>
<th>비행 모드</th>
<th>GPS 필요</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>Stabilize</td>
<td>X</td>
<td>- 드론 4축 모두 사용자가 조작 <br>- 기체의 정밀도나 바람의 영향에 따라 <strong>기체는 흘러갈 수 있음</strong> <br>- 모든 자동 비행 모드가 실패할 경우를 대비해 반드시 세팅해 두어야 하는 모드</td>
</tr>
<tr>
<td>Alt Hold</td>
<td>X</td>
<td>- 현재의 고도를 유지하기 위해 <strong>스로틀을 자동으로 조절</strong> <br>- Pitch, Roll, Yaw는 사용자 마음대로 조절 가능</td>
</tr>
<tr>
<td>Loiter</td>
<td>O</td>
<td>- 드론 4축 모두 조절 가능 <br>- 스틱이 모두 중립으로 가면 그 자리에서 그대로 유지</td>
</tr>
</tbody></table>
<p>추가 예정 모드</p>
<table>
<thead>
<tr>
<th>비행 모드</th>
<th>GPS 필요</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>Auto</td>
<td>O</td>
<td>-미리 지정해둔 경로로 자동 비행 <br>- Alt Hold 모드의 고도 제어와 Loiter 모드의 위치제어 기능이 통합된 것</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[1. 미션플래너 설정]]></title>
            <link>https://velog.io/@dbdb_dev/1.-%EB%AF%B8%EC%85%98%ED%94%8C%EB%9E%98%EB%84%88-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@dbdb_dev/1.-%EB%AF%B8%EC%85%98%ED%94%8C%EB%9E%98%EB%84%88-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Sun, 18 Jan 2026 05:54:17 GMT</pubDate>
            <description><![CDATA[<p>이번엔 드론 프레임과 조종기 간 연결, 초기 세팅에 대해 다루어보고자 한다.
생각하지도 못하게 많은 역경들이 있었다...</p>
<hr>
<p>사용하는 드론 컨트롤러는 픽스호크이며, 픽스호크를 제어하기 위해서는 미션플래너라는 툴이 필요하다.
픽스호크 연결과 세팅 또한 팰콘샵 유튜브에서 잘 다루고 있어 참고하면서 진행했다.</p>
<p>참고 영상
<a href="https://www.youtube.com/watch?v=2z6hNdNp8i0">https://www.youtube.com/watch?v=2z6hNdNp8i0</a></p>
<p>해당 영상에서 사용한 미션플래너 버전은 1.3.80이고 내가 사용한 미션플래너의 버전은 1.3.83이다. 웬만한 옵션은 동일하여 그대로 따라갈 수 있었다.
아래는 버전 차이로 인해 찾기 힘들었던 옵션이나 발생 오류들에 대해서 다루어보고자 한다.</p>
<h1 id="1-표준-매개변수-위치">1. 표준 매개변수 위치</h1>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/271788d3-e35c-4784-8b4a-98bccf805b22/image.png" alt="">
팰콘샵 영상에서는 &quot;표준 매개변수&quot; 위치가 상단바 &quot;구성&quot; 탭에 바로 있다. 하지만, 내 미션플래너에는 &quot;구성&quot; 탭에 표준 매개변수가 바로 있지 않고, &quot;전체 매개변수 목록&quot;에서 검색창에 원하는 파라미터들을 검색하여 사용할 수 있었다.
&lt;사진&gt;</p>
<h1 id="2-미션-플래너-픽스호크-조종기-연결">2. 미션 플래너-픽스호크-조종기 연결</h1>
<p>픽스호크에서의 상태 값을 확인하기 위해서는 컴퓨터(미션플래너)와 픽스호크를 USB로 연결해야했다. 게다가 조종기와의 통신이 원활한 지 확인하기 위해서는 픽스호크와 조종기간의 연결도 필요하다.
하지만, 픽스호크와 조종기를 먼저 연결하게되면 이미 픽스호크 부팅이 완료되어 추가 USB 연결 (미션플래너 연결)을 정상적으로 인식할 수 없다.
따라서, 픽스호크와 미션플래너 연결을 먼저 한 후, 조종기를 켜 연결해주면 모든 값을 미션플래너에서 확인할 수 있다.</p>
<blockquote>
<p>연결 순서</p>
</blockquote>
<ol>
<li>픽스호크-미션플래너 연결 (USB)</li>
<li>픽스호크-조종기 연결 (RF)</li>
</ol>
<ul>
<li>픽스호크에는 USB를 통한 전원만 넣어주고 배터리 전원은 프로펠러에만 가게끔 연결해주면 된다.
(그냥 다 연결해도 픽스호크 내 전원 OR-ing 구조로 인해 고장은 안 난다)</li>
</ul>
<h1 id="3-발생-오류">3. 발생 오류</h1>
<p>다음은 드론 시동 전 발생한 오류들이다.
    <img src="https://velog.velcdn.com/images/dbdb_dev/post/452d396b-cc02-427b-ac47-bb2bd581cc3d/image.png" alt="">
    <img src="https://velog.velcdn.com/images/dbdb_dev/post/d96cb9f1-681f-4711-9aa6-6ffad9d032cf/image.png" alt=""></p>
<ol>
<li>battery failsafe
해당 오류는 잔여 배터리량때문에 발생하는 오류이다.
사용하는 배터리 종류를 찾아 파라미터를 수정해주면 된다.
내가 사용하는 배터리는 아래와 같은데, 이에 상응하는 옵션 값은 GPT의 도움을 받아 설정했다.
리튬 배터리기 때문에 문제가 되지 않을 정도의 값들로 설정해주면 된다.
 <img src="https://velog.velcdn.com/images/dbdb_dev/post/dc803d3f-7061-4049-8e85-9f4027c8414f/image.png" alt="">
<img src="https://velog.velcdn.com/images/dbdb_dev/post/dc10b363-1f75-40fe-86f5-9e1918b18b6b/image.png" alt="">
<img src="https://velog.velcdn.com/images/dbdb_dev/post/e0cbaa19-cd1c-4def-a355-5066923b0434/image.png" alt=""></li>
</ol>
<ol start="2">
<li>Compass not calibrated
해당 오류는 불필요한 컴퍼스가 켜져 있기 때문이라고 한다.
팰콘샵 유튜브에서는 컴퍼스를 하나만 사용하는데, 내 픽스호크에는 3개가 켜져있었다.
다음 사진처럼 컴퍼스를 2개만 사용하도록 설정했더니 오류가 없어졌다.
&lt;파라미터 설정 사진&gt;
<img src="https://velog.velcdn.com/images/dbdb_dev/post/9b64215b-b32d-4978-a635-c058309ec82d/image.png" alt=""></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[0. 드론 프레임 만들기]]></title>
            <link>https://velog.io/@dbdb_dev/0.-%EB%93%9C%EB%A1%A0-%ED%94%84%EB%A0%88%EC%9E%84-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@dbdb_dev/0.-%EB%93%9C%EB%A1%A0-%ED%94%84%EB%A0%88%EC%9E%84-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Sun, 18 Jan 2026 04:54:57 GMT</pubDate>
            <description><![CDATA[<p>오랜만에 돌아온 velog.. 
오늘부터는 드론 연구 진행 상황을 기록해보고자 한다.
이번 프로젝트의 목표는 <strong>드론 5대의 군집 주행과 군집 주행 중의 통신 상태 수집</strong>이다.</p>
<h1 id="1-사용-모델">1. 사용 모델</h1>
<p>드론 모델은 팰콘샵의 F450 모델을 사용했다.
필요한 기본 제품들을 한 번에 팔고있고, 조립 영상이 자세하게 제공되어 있어서 편리했다.
<img src="https://velog.velcdn.com/images/dbdb_dev/post/6122e10c-05c6-47bd-8bfb-93e09d289640/image.png" alt="">
추후 드론 프레임에 라즈베리파이를 얹고 프로그래밍할 예정이라 다음 부품들도 함께 구매했다.</p>
<table>
<thead>
<tr>
<th>종류</th>
<th>제원</th>
<th>가격</th>
<th>구매 링크</th>
</tr>
</thead>
<tbody><tr>
<td>드론 프레임 세트</td>
<td>F450 교육/연구용 드론 픽스호크 + GPS, 라디오링크 T8FB 8채널 조종기 포함 풀셋 - 2024 Ver</td>
<td>639,000원 + 납땜 (+50,000원)</td>
<td><a href="https://www.falconshop.co.kr/shop/goods/goods_view.php?goodsno=100005329">https://www.falconshop.co.kr/shop/goods/goods_view.php?goodsno=100005329</a></td>
</tr>
<tr>
<td>라즈베리파이 거치 패널</td>
<td>F450 용 컴패니언 컴퓨터 거치 패널 (라즈베리파이 거치대 / 높이 30mm)</td>
<td>10,000원</td>
<td><a href="https://www.falconshop.co.kr/shop/goods/goods_view.php?goodsno=100072744&amp;category=064001068">https://www.falconshop.co.kr/shop/goods/goods_view.php?goodsno=100072744&amp;category=064001068</a></td>
</tr>
<tr>
<td>픽스호크-라즈베리 연결</td>
<td>Holybro, CUAV, KOA, SIYI N7 ↔ SIYI MK15 데이터링크 연결 케이블</td>
<td>5,000원</td>
<td><a href="https://www.falconshop.co.kr/shop/goods/goods_view.php?goodsno=100083270&amp;category=064013010007">https://www.falconshop.co.kr/shop/goods/goods_view.php?goodsno=100083270&amp;category=064013010007</a></td>
</tr>
<tr>
<td>카메라모듈3 와이드</td>
<td>라즈베리파이 카메라모듈 3 와이드 (Raspberry Pi Camera Module 3 Wide)</td>
<td>53,900원</td>
<td><a href="https://www.devicemart.co.kr/goods/view?no=14933041&amp;srsltid=AfmBOoquhkw14UknI-RzVpWyT3o2GpWfXawO-tjIEd4Zeh099qGBeI5H">https://www.devicemart.co.kr/goods/view?no=14933041&amp;srsltid=AfmBOoquhkw14UknI-RzVpWyT3o2GpWfXawO-tjIEd4Zeh099qGBeI5H</a></td>
</tr>
<tr>
<td>카메라-라파5 연결 케이블</td>
<td>라즈베리파이5 FPC 카메라 케이블 300mm - 22P(0.5mm) to 15P(1mm)</td>
<td>2,970원</td>
<td><a href="https://www.devicemart.co.kr/goods/view?no=15285261">https://www.devicemart.co.kr/goods/view?no=15285261</a></td>
</tr>
</tbody></table>
<h1 id="2-제작-과정">2. 제작 과정</h1>
<p>조립은 팰콘샵의 유튜브를 참고하였다.
영상 내에서 부품이 조금씩 다른 게 있어서 여러 영상들을 참고하며 제품 조립을 완성하였다.
&lt;프레임 조립&gt;
<a href="https://www.youtube.com/watch?v=IdpUYPuSYhE">https://www.youtube.com/watch?v=IdpUYPuSYhE</a> (납땜 필요 버전)
<a href="https://www.youtube.com/watch?v=e5p7_VkZ3FQ">https://www.youtube.com/watch?v=e5p7_VkZ3FQ</a> (납땜 불필요 버전)
&lt;조종기 연결&gt;
<a href="https://www.youtube.com/watch?v=mpxnYUu3f7U">https://www.youtube.com/watch?v=mpxnYUu3f7U</a></p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/5c529cfc-7f6e-4885-a6fc-262ef633465d/image.jpeg" alt="">
첫 번째 완성된 모습!</p>
<p>드론을 만드는 건 처음이라, 프로펠러의 정방향 역방향이 대각선으로만 맞으면 된다고 생각했는데 아니었다.
비행이 잘 안되어서 팰콘샵 사이트에 문의해보니, 꼭 밑에 사진처럼 앞 방향을 기준으로 정방향 역방향의 위치가 동일해야한다고 한다.
<img src="https://velog.velcdn.com/images/dbdb_dev/post/c3f9b97b-f19d-47b8-ac19-c532d9039cc1/image.png" alt=""></p>
<p>다음 포스트에서는 드론과 조종기의 연결, 세팅에 대해서 다루어보겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java SDK 설정]]></title>
            <link>https://velog.io/@dbdb_dev/Java-SDK-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@dbdb_dev/Java-SDK-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Tue, 18 Oct 2022 14:41:48 GMT</pubDate>
            <description><![CDATA[<p>실행시키고자 하는 파일의 SDK requirement를 확인
<img src="https://velog.velcdn.com/images/dbdb_dev/post/c6a93533-f51c-494f-8da6-7f6e16e260bd/image.png" alt=""></p>
<p>=&gt; Java 18 을 쓰는데도 실행이 되지 않고,
<img src="https://velog.velcdn.com/images/dbdb_dev/post/fecde2cb-5a02-48a3-b6af-38df4546e55e/image.png" alt="">
위와 같은 오류가 발생..</p>
<hr>
<pre><code>SDK(Software Development Kit)는 특정 소프트웨어 프레임워크에 대한 응용 프로그램 개발 도구 모음이다.
예를 들어, Java로 애플리케이션을 개발하려면 Java SDK = JDK가 필요하다.</code></pre><p>나의 경우는 해당 프로젝트 파일을 다른 파일의 하위 폴더로 넣어주면 실행이 되었다..
왜인지는...아직도 모르겠어서 혹시나 이걸 보시는 분들이 계시다면 이유가 뭔지 알려주시면 감사하겠습니다 ( _ _ ) </p>
<p>어찌되었든 하위 폴더로 만들어준 후 다시 SDK 구조를 짜서 실행을 하였다.</p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/184b9374-0009-432b-bac7-192227586ae6/image.png" alt="">
IntelliJ에서 <strong>파일 -&gt; 프로젝트구조</strong>를 선택</p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/35d467bf-0f62-430d-a673-ade2af8b11f2/image.png" alt="">
SDK를 선택</p>
<p>-&gt; 모듈에서 소스폴더 지정</p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/d567d4af-57da-4caa-94dd-863eabf95426/image.png" alt="">
빌드 구성 변경</p>
<h3 id="-실행-성공">=&gt; 실행 성공!</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[github 로컬 저장소 생성]]></title>
            <link>https://velog.io/@dbdb_dev/github-%EB%A1%9C%EC%BB%AC-%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@dbdb_dev/github-%EB%A1%9C%EC%BB%AC-%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Fri, 14 Oct 2022 00:48:18 GMT</pubDate>
            <description><![CDATA[<p>소프트웨어개발실무 수업을 들으며 개발 협업 방식과 Java 프로그램 개발 과정을 기록하기 위해 작성하는 로그</p>
<hr>
<h1 id="로컬---원격저장소-연결">로컬 - 원격저장소 연결</h1>
<h3 id="깃허브-연동">깃허브 연동</h3>
<ol>
<li><p>저장소를 놓고싶은 파일에서 git bash here로 bash 창을 연다
<img src="https://velog.velcdn.com/images/dbdb_dev/post/a5d0dbdf-0ad4-45c7-bc4c-53642c6e185a/image.png" alt="">
<img src="https://velog.velcdn.com/images/dbdb_dev/post/c61751d2-058c-426f-9498-a85c0b4caeeb/image.png" alt=""></p>
</li>
<li><p>사용자 계정 설정</p>
<pre><code>git config --global user.name [이름]
</code></pre></li>
</ol>
<p>git config --global user.email [메일주소]</p>
<pre><code>
3. 원격저장소 불러오기</code></pre><p>git clone [깃허브 원격저장소 주소]</p>
<pre><code>
*git clone을 하면 안에 .git 파일이 자동생성되어 git init(깃허브를 연동하기 위한 명령어)을 입력해주지 않아도 괜찮다*
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[ROS] 아두이노 설치]]></title>
            <link>https://velog.io/@dbdb_dev/ROS-%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@dbdb_dev/ROS-%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Sat, 20 Aug 2022 16:50:14 GMT</pubDate>
            <description><![CDATA[<h1 id="아두이노-설치">아두이노 설치</h1>
<p>먼저 최신 버전의 아두이노를 확인하기 위해 아두이노 홈페이지에 접속</p>
<p>다운로드 페이지 : <a href="http://www.arduino.cc/en/software">www.arduino.cc/en/software</a></p>
<p>2022.08.21 기준 최신 버전은 Arduino IDE 1.8.19</p>
<h3 id="wget-명령어로-설치">wget 명령어로 설치</h3>
<pre><code>$ sudo wget https://downloads.arduino.cc/arduino-1.8.19-linux64.tar.xz</code></pre><p><strong>wget은 터미널의 현재 위치에 파일을 다운로드</strong>
=&gt; </p>
<pre><code>$ pwd
위 명령어로 현재 위치 파악</code></pre><p>아래 명령어로 압축을 푼다</p>
<pre><code>$ tar -xf arduino-1.8.19-lunux64.tar.xz</code></pre><p>압축을 푼 폴더로 이동한 후 설치를 진행</p>
<pre><code>$ cd arduino-1.8.19
$ sudo ./install.sh</code></pre><h1 id="사용자-권한설정-부여">사용자 권한설정 부여</h1>
<pre><code>$ cd arduino-1.8.19
$ sudo chown [사용자이름] arduino</code></pre><p><strong>터미널에서 whoami 명령어를 통해 사용자 이름 확인할 수 있음</strong></p>
<h1 id="아두이노-실행">아두이노 실행</h1>
<p>터미널에서 arduino 입력하면 실행 가능</p>
<hr>
<h1 id="아두이노-삭제">아두이노 삭제</h1>
<p>아두이노 폴더의 uninstall.sh를 실행하면 된다</p>
<pre><code>$ cd arduino-1.8.19
$ sudo ./uninstall.sh</code></pre><hr>
<h1 id="ros-serial-설치">Ros serial 설치</h1>
<h3 id="패키지-설치">패키지 설치</h3>
<pre><code>$ sudo apt-get install ros-noetic-rosserial-arduino
$ sudo apt-get install ros-noetic-rosserial</code></pre><h3 id="라이브러리-설치">라이브러리 설치</h3>
<pre><code>$ cd [arduino_path]/libraries
$ rosrun rosserial_arduino make_libraries.py .</code></pre><h3 id="아두이노-실행-1">아두이노 실행</h3>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/fd469772-3d09-4853-aa49-829e5c8dd60e/image.png" alt=""></p>
<p>해당 과정들을 잘 따라오면 아두이노를 실행시킨 후 파일 -&gt; 예시 맨 밑에 ros_lib가 생성됨</p>
<h3 id="보드--포트-설정">보드 / 포트 설정</h3>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/779d2ea3-f241-4427-83be-4cfae7183748/image.png" alt=""></p>
<pre><code>권한 바꾸기
$ sudo chmod 666 /dev/ttyS0</code></pre><p>완료!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ROS] 설치]]></title>
            <link>https://velog.io/@dbdb_dev/ROS-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@dbdb_dev/ROS-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Sat, 20 Aug 2022 16:43:17 GMT</pubDate>
            <description><![CDATA[<h1 id="ros-설치-전-기본-프로그램-설치">ROS 설치 전 기본 프로그램 설치</h1>
<h2 id="chrome-설치">Chrome 설치</h2>
<ul>
<li>firefox에  chrome 검색하여 나오는 첫 번째 창에서 deb 파일 다운 받기 (save file)</li>
<li>해당 파일 경로에서 터미널을 열어 압축 풀기<pre><code>$ sudo dpkg -i google-chrome-stable_current_amd64.deb</code></pre></li>
</ul>
<h2 id="vscode-설치">Vscode 설치</h2>
<ul>
<li>우분투 앱 스토어(Ubuntu Software)에서 VSCode 검색 후 다운받기</li>
<li>Extension 창에서 ROS Extension 설치</li>
</ul>
<h2 id="terminator-설치">terminator 설치</h2>
<pre><code>$ sudo apt install terminator</code></pre><hr>
<p><strong>설치 시 발생하는 오류</strong>
처음 ubuntu를 설치하고 dpkg 혹은 apt install 명령어를 입력하면</p>
<pre><code>dpkg: error: dpkg frontend lock is locked by another process</code></pre><p>라는 오류가 뜨며 설치가 되지 않는다</p>
<p>라는 오류가 발생</p>
<p>-&gt; 다른 프로세스들이 실행되고 있어서 다음과 같은 오류 발생
=&gt; sudo killall apt apt-get
을 실행하면 된다고 함
but!!!</p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/2018d563-54de-4ff8-86bb-c7b20d5238d5/image.png" alt=""></p>
<p>프로세스 없다고 함..
그래서 하나하나 kill 해주고 update해주는 방식으로 초기화함</p>
<pre><code>sudo killall apt apt-get
  - 진행중인 프로세스가 없다라고 뜨면, 아래와 같이 하나하나씩 디렉토리를 삭제해주세요.
sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock*
sudo dpkg --configure -a 
sudo apt update
출처: https://enant.tistory.com/18 [ENAN:티스토리]</code></pre><p>=== 해결!</p>
<hr>
<h1 id="ros-설치">ROS 설치</h1>
<pre><code>$ wget https://raw.githubusercontent.com/knowledge-intelligence/ROS_RobotManipulator/master/ros_noetic_install.sh &amp;&amp; chmod 755 ./ros_noetic_install.sh &amp;&amp; ./ros_noetic_install.sh</code></pre><p>한 번에 설치</p>
<hr>
<h1 id="ros-환경-설정">ROS 환경 설정</h1>
<pre><code>#ros 환결설정

$ gedit ~/.bashrc


# set ROS noetic

source /opt/ros/noetic/setup.bash

source ~/catkin_ws/devel/setup.bash



# set ROS Network

export ROS_MASTER_URI=http://localhost:11311

export ROS_HOSTNAME=localhost



# set ROS alias command

alias cw=&#39;cd ~/catkin_ws&#39;

alias cs=&#39;cd ~/catkin_ws/src&#39;

alias cm=&#39;cd ~/catkin_ws &amp;&amp; catkin_make&#39;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[ROS2] Hello World]]></title>
            <link>https://velog.io/@dbdb_dev/ROS2-Hello-World</link>
            <guid>https://velog.io/@dbdb_dev/ROS2-Hello-World</guid>
            <pubDate>Wed, 17 Aug 2022 17:54:41 GMT</pubDate>
            <description><![CDATA[<h1 id="패키지-생성">패키지 생성</h1>
<pre><code>$ cd ~/baqu_ws/src
$ ros2 pkg create test_rclpy_pkg --build-type ament_python --dependencies rclpy std_msgs</code></pre><h1 id="패키지-설정">패키지 설정</h1>
<h3 id="패키지-설정-파일">패키지 설정 파일</h3>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/10ab2e6f-abf3-4137-9e5a-8aa779d314ce/image.png" alt="">
<em>version만 수정함</em></p>
<h3 id="파이썬-패키지-설정-파일">파이썬 패키지 설정 파일</h3>
<p><strong>entry_points 옵션의 console_scripts 키를 사용한 실행 파일 설정</strong>
ex) helloworld_publisher와 helloworld_subscriber 콘솔 스크립트는 각각 test_rclpy_pkg.helloworld_publisher 모듈과 test_rclpy_pkg.helloworld_subscriber 모듈의 main 함수를 호출되게 한다</p>
<p>해당 설정을 통해 ros2 run 또는 ros2 launch 명령어로 해당 스크립트를 실행시킬 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/7706b9c6-378c-463b-bd36-d92cc76426a4/image.png" alt=""></p>
<p><em>version과 entry_points만 수정함</em></p>
<h3 id="파이썬-패키지-환경설정-파일">파이썬 패키지 환경설정 파일</h3>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/67a789bf-ca48-4eb5-b5de-9ae1d9fa8a4b/image.png" alt=""></p>
<p><strong>해당 파일에서 주의할 점은 test_rclpy_pkg와 같이 패키지 이름을 기재해야한다는 것과 나중에 colcon을 이용하여 빌드하게 되면 &quot;/home/[userName]/baqu_ws/install/test_rclpy_pkg/lib/test_rclpy_pkg&quot;와 같은 지정 폴더에 실행파일이 생성된다는 점이다</strong></p>
<hr>
<h1 id="노드-작성">노드 작성</h1>
<h3 id="퍼블리셔-노드-작성">퍼블리셔 노드 작성</h3>
<p>퍼블리셔 노드의 파이썬 코드는 ~/baqu_ws/src/test_rclpy_pkg/test_rclpy_pkg/ 폴더에 helloworld_publisher.py 소스코드 파일을 직접 생성한다</p>
<pre><code># import 구문
# rclpy의 Node 클래스 사용 / 퍼블리셔의 QoS 설정을 위한 QoSProfile 클래스
# 메시지 타입은 std_msgs.msg 모듈의 String 메시지 인터페이스 사용
import rclpy
from rclpy.node import Node
from rclpy.qos import QoSProfile
from std_msgs.msg import String

# 이 노드의 메인 클래스는 HelloworldPublisher이고 Node 클래스를 상속해 사용할 예정
class HelloworldPublisher(Node):

  # 클래스 생성자 정의
  # 부모 클래스(Node)의 생성자를 호출하고 노드 이름을 helloworld_publisher로 지정
  def __init__(self):
    super().__init__(&#39;helloworld_publisher&#39;)
    qos_profile = QoSProfile(depth=10)

    # Nod 클래스의 create_publisher 함수를 이용해 helloworld_publisher를 설정함
    # 매개변수로 토픽 메시지 타입은 String, 토픽 이름은 helloworld, QoS는 qos_prpfile
    self.helloworld_publisher = self.create_publisher(String, &#39;helloworld&#39;, qos_profile)
    self.timer = self.create_timer(1, self.publish_helloworld_msg)
    self.count = 0

  # 앞에서 지정한 publish_helloworld_msg 콜백함수
  # 실제 데이터는 msg.data에 저장
  def publish_helloworld_msg(self):
    msg = String()
    msg.data = &#39;Hello World: {0}&#39;.format(self.count)
    self.helloworld_publisher.publish(msg)
    self.get_logger().info(&#39;Published message: {0}&#39;.format(msg.data))
    self.count += 1


# rclpy.init을 이용해 초기화
def main(args=None):
  rclpy.init(args=args)

  # HelloworldPublisher 클래스를 node 변수로 생성
  node = HelloworldPublisher()
  try:

      # rclpy.spin 함수를 이용하여 생성한 노드를 spin 시켜 지정된 콜백 함수가 실행될 수 있도록
    rclpy.spin(node)
  except KeyboardInterrupt:
    node.get_logger().info(&#39;Keyboard Interrupt (SIGINT)&#39;)
  finally:
    node.destroy_node()
    rclpy.shutdown()


if __name__ == &#39;__main__&#39;:
  main()</code></pre><h3 id="서브스크라이버-노드-작성">서브스크라이버 노드 작성</h3>
<pre><code>import rclpy
from rclpy.node import Node
from rclpy.qos import QoSProfile
from std_msgs.msg import String

class HelloworldSubscriber(Node):

  def __init__(self):
    super().__init__(&#39;helloworld_subscriber&#39;)
    qos_profile = QoSProfile(depth=10)
    self.helloworld_subscriber = self.create_subscription(String, &#39;helloworld&#39;, self.subscribe_topic_message, qos_profile)

  def subscribe_topic_message(self, msg):
    self.get_logger().info(&#39;Reveived message: {0}&#39;.format(msg.data))


def main(args=None):
  rclpy.init(args=args)
  node = HelloworldSubscriber()
  try:
    rclpy.spin(node)
  except KeyboardInterrupt:
    node.get_logger().info(&#39;Keyboard Interrupt (SIGINT)&#39;)
  finally:
    node.destroy_node()
    rclpy.shutdown()


if __name__ == &#39;__main__&#39;:
  main()
</code></pre><hr>
<h1 id="빌드">빌드</h1>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/b6d4bfe5-cc45-45f1-8b1c-1ffda6cb10c5/image.png" alt=""></p>
<p>특정 패키지의 첫 빌드 후에는 환경설정 파일을 불러와서 실행 가능한 패키지의 노드 설정을 해줘야 빌드된 노드를 실행할 수 있다
-&gt;</p>
<pre><code>$ . ~/baqu_ws/install/local_setup.bash
혹은
$ source ~/baqu_ws/install/local_setup.bah</code></pre><p><em>해당 위치에 setup.bash는 setup.bash와 local_setup.bash가 있는데, local_setup.bash는 해당 폴더에 한정된 노드 설정을 해주는 반면 setup.bash는 전역적인 노드 설정을 해준다</em></p>
<h1 id="실행">실행</h1>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/b15e0c8c-4da3-4dd6-babc-22330c22add8/image.png" alt="">
 아직 publisher를 실행시키지 않아 터미널에 아무 것도 뜨지 않는다</p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/6efed248-7ef9-40bc-a884-afc659fe45a7/image.png" alt=""></p>
<p><em>새로 터미널을 열면 다시 source ~/...를 통해 노드 설정을 해줘야 함..</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ROS2] 패키지 생성]]></title>
            <link>https://velog.io/@dbdb_dev/ROS2-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%83%9D%EC%84%B1-uplvlxuv</link>
            <guid>https://velog.io/@dbdb_dev/ROS2-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%83%9D%EC%84%B1-uplvlxuv</guid>
            <pubDate>Wed, 17 Aug 2022 17:12:46 GMT</pubDate>
            <description><![CDATA[<h1 id="패키지-생성-명령어">패키지 생성 명령어</h1>
<pre><code>$ ros2 pkg create [package_name] --build-type [build_type] --dependencies [dependency1] [dependency n]</code></pre><p>RCL로 C++을 사용한다면 build_type에 ament_cmake를 입력
    Python을 사용한다면 build_type에 ament_python 입력</p>
<h1 id="패키지-빌드">패키지 빌드</h1>
<p>ROS 2 특정 패키지 또는 전체 패키지를 빌드할 때에는 colcon 빌드 툴을 사용</p>
<ol>
<li>소스코드가 있는 workspace로 이동</li>
<li>colcon build 명령어로 전체를 빌드</li>
</ol>
<hr>
<h1 id="패키지-파일-설정">패키지 파일 설정</h1>
<p>: 패키지 설정 파일(package.xml), 빌드 설정 파일(CMakeLists.txt), 파이썬 패키지 설정 파일(setup.py), RQt 플러그인 설정 파일(plugin.xml), 패키지 변경로그 파일(CHANGELOG.rst), 라이선스 파일(LICENSE), 패키지 설명 파일(README.md)</p>
<p>&lt;파이썬 패키지 기준&gt;</p>
<p><strong>package.xml</strong>
<img src="https://velog.velcdn.com/images/dbdb_dev/post/05405b0b-cd3b-45bc-a993-06e3b16c2f9f/image.png" alt=""></p>
<p><strong>setup.py</strong>
<img src="https://velog.velcdn.com/images/dbdb_dev/post/c9e4f9e7-f5e5-47ba-a358-4eb68ab87b03/image.png" alt=""></p>
<p><em>packages: 의존하는 패키지, 하나씩 나열해도 되지만 find_packages()를 기입해주면 자동으로 의존하는 패키지를 찾아준다
install_requires: 의존하는 패키지, 이 패키지를 pip을 통해 설치할 때 이곳에 기술된 패키지들을 함께 설치하게 된다. ROS에서는 pip으로 설치하지 않기에 setuptools, launch만을 기입해준다</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ROS2] 메시지 통신]]></title>
            <link>https://velog.io/@dbdb_dev/ROS2-%EB%A9%94%EC%8B%9C%EC%A7%80-%ED%86%B5%EC%8B%A0</link>
            <guid>https://velog.io/@dbdb_dev/ROS2-%EB%A9%94%EC%8B%9C%EC%A7%80-%ED%86%B5%EC%8B%A0</guid>
            <pubDate>Wed, 17 Aug 2022 16:49:17 GMT</pubDate>
            <description><![CDATA[<h1 id="토픽-topic">토픽 (Topic)</h1>
<p>: 비동기식 단방향 메시지 송수신 방식
msg 인터페이스 형태의 메시지를 퍼블리시하는 Publisher와 메시지를 서브스크라이브하는 Subscriber 간의 통신
1:1 통신이 기본 // 1:N, N:1, N:N 통신도 가능
ROS 메시지 통신에서 가장 많이 사용됨
<em>노드 하나가 하나 이상의 토픽을 퍼블리시할 뿐만 아니라, Publisher 기능과 동시에 토픽을 서브크라이브할 수도 있음</em></p>
<h3 id="토픽-정보-확인">토픽 정보 확인</h3>
<pre><code>$ ros2 node info [노드명]</code></pre><p>서비스, 액션, 파라미터 등의 메시지 정보를 확인할 수 있음
<strong>지정한 노드만의 정보를 확인할 수 있음
패키지/노드를 실행해야(run) 해당 토픽 정보들을 확인할 수 있음</strong></p>
<h3 id="토픽-목록-확인">토픽 목록 확인</h3>
<pre><code>$ ros2 topic list -t</code></pre><p><strong>현재 개발환경에서 동작 중인 모든 노드들의 토픽 정보를 볼 수 있음</strong>
-t 옵션: 각 메시지의 형태(Type) 함께 표시</p>
<h3 id="토픽-내용-확인">토픽 내용 확인</h3>
<pre><code>$ ros2 topic echo [토픽명]</code></pre><h2 id="토픽-퍼블리시">토픽 퍼블리시</h2>
<pre><code>$ ros2 topic pub [토픽 이름] [토픽 메시지 타입] &quot;[메시지 내용]&quot;

ex.
$ ros2 topic pub --once /turtle/cmd_vel geometry_msgs/msg/Twist &quot;{linear: {x: 2.0, y:0.0, z:0.0}, angular: {x: 0.0, y: 0.0, z:1.8}}&quot;</code></pre><p>--once 옵션: 단 한번의 퍼블리시만을 수행
--rate 1 옵션: 주기 1Hz의 지속적인 퍼블리시 생성</p>
<h3 id="rosbag을-사용하여-원하는-토픽을-기록하고-재생하도록--일정한-데이터를-갖고-테스트할-수-있음">rosbag을 사용하여 원하는 토픽을 기록하고 재생하도록 =&gt; 일정한 데이터를 갖고 테스트할 수 있음</h3>
<hr>
<h1 id="서비스-service">서비스 (Service)</h1>
<p>: 동기식 양방향 메시지 송수신 방식
서비스 요청(Request)을 하는 Service Client와 요청받은 서비스를 수행한 후 서비스 응답(Response)하는 Service Server 같의 통신</p>
<h3 id="서비스-목록-확인">서비스 목록 확인</h3>
<pre><code>$ ros2 service list</code></pre><p><strong>패키지 노트 실행해야 서비스 목록 나옴</strong></p>
<h3 id="서비스-찾기">서비스 찾기</h3>
<pre><code>$ ros2 service find [서비스 형태]</code></pre><p>=&gt; 해당 형태의 서비스를 사용하는 서비스명 확인 가능</p>
<h2 id="서비스-요청">서비스 요청</h2>
<pre><code>$ ros2 service call [서비스이름] [서비스타입] &quot;[서비스내용]&quot;</code></pre><hr>
<h1 id="액션-action">액션 (Action)</h1>
<p>: 비동기, 동기식 양방향 메시지 송수신 방식
액션 목표(Goal)를 지정하는 <em>Action Client*와 액션 목표를 받아 특정 태스크를 수행하면서 중간 결과값을 전송하는 *액션 피드백(Feedback)</em>, 그리고 최종 결과값을 담은 액션 결과(Result)를 전송하는 <em>Action Server</em> 간의 통신</p>
<h2 id="액션-목표-전달">액션 목표 전달</h2>
<pre><code>$ ros2 action send_goal [액션이름] [액션타입] &quot;[목표값]&quot;</code></pre><hr>
<h1 id="인터페이스">인터페이스</h1>
<p>: ROS 노드 간에 데이터를 주고받기 위해서는 토픽, 서비스, 액션을 사용
이때 사용되는 데이터 형태를 ROS 2 인터페이스라고 함
=&gt; IDL (Interface Definition Language)과 msg, src, action이 있음</p>
<h3 id="메시지-형태-및-이름-확인">메시지 형태 및 이름 확인</h3>
<pre><code>$ ros2 interface show [토픽형태]</code></pre><p>=&gt; 해당 토픽 형태가 가지는 자료형, 데이터 형태를 반환</p>
<h3 id="ros2-interface-packages">ros2 interface packages</h3>
<pre><code>$ ros2 interface packages</code></pre><p>=&gt; msg, srv, action 인터페이스를 담고 있는 패키지의 목록을 보여줌</p>
<hr>
<h1 id="파라미터">파라미터</h1>
<p>: 각 노드가 가진 Parameter server를 통해 외부의 Parameter client와 통신하여 파라미터를 변경하는 것 (서비스와 유사함)
cf) 파라미터는 노드 내부 또는 외부에서 노드 내 매개변수를 쉽게 지정(Set)하거나 변경할 수 있고, 쉽게 가져(Get)와서 사용할 수 있게한다
=&gt; 각 노드의 다양한 매개변수를 글로벌 매개변수처럼 사용할 수 있게 됨</p>
<p>RCL(ROS Client Libraries)의 기본 기능으로 모든 노드가 자신만의 Parameter server를 가지고 있음</p>
<h3 id="파라미터-내용-확인">파라미터 내용 확인</h3>
<p>파라미터가 어떤 형태, 목적, 데이터 형태, 최소, 최대값을 가지는지 알아볼 수 있음</p>
<pre><code>$ ros2 param describe [노드이름] [파라미터이름]</code></pre><h2 id="파라미터-읽기">파라미터 읽기</h2>
<pre><code>$ ros2 param get [노드이름] [파라미터이름]</code></pre><h2 id="파라미터-쓰기">파라미터 쓰기</h2>
<pre><code>$ ros2 param set [노드이름] [파라미터이름] [변경할파라미터값]
-&gt; 파라미터를 변경할 수 있지만 노드 종료 후 다시 실행하면 다시 초기값으로 설정됨

=&gt; set으로 파라미터 변경 후,  
$ ros2 param dump [노드이름]

-&gt; 현재 경로에 해당 노드 이름으로 설정 파일이 yaml 형태로 저장됨

-&gt; 이후 노드 재실행 시 해당 파라미터 값을 초깃값으로 사용하려면,
$ ros2 run [패키지이름] [노드이름] --ros-args --params-file [yaml파일]</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[ROS2] 노드 실행]]></title>
            <link>https://velog.io/@dbdb_dev/ROS2-%EB%85%B8%EB%93%9C-%EC%8B%A4%ED%96%89</link>
            <guid>https://velog.io/@dbdb_dev/ROS2-%EB%85%B8%EB%93%9C-%EC%8B%A4%ED%96%89</guid>
            <pubDate>Wed, 17 Aug 2022 16:08:28 GMT</pubDate>
            <description><![CDATA[<h1 id="노드node">노드(Node)</h1>
<p>: 최소 단위의 실행 가능한 프로세스를 가리키는 용어
ROS에서는 보통 최소한의 실행 단위로 프로그램을 나누어 작업 -&gt; 각 노드들간의 의존성을 줄이고 독립성을 높임 -&gt; 재사용 가능</p>
<h1 id="노드-실행-ros2-run">노드 실행 (ros2 run)</h1>
<pre><code>$ ros2 run [패키지명] [노드명]</code></pre><p>turtlesim 패키지의 노드들을 실행한다면,</p>
<pre><code>$ ros2 run turtlesim turtlesim_node
$ ros2 run turtlesim turtle_teleop_key</code></pre><p>와 같이 실행</p>
<p><strong>ros2 run은 하나의 노드를 실행
ros2 launch는 하나 이상의 노드를 실행</strong></p>
<h1 id="rqt_graph">rqt_graph</h1>
<p>: 노드와 노드 간의 메시지 통신을 그래프 형태로 표시하는 툴</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ROS2] 워크스페이스]]></title>
            <link>https://velog.io/@dbdb_dev/ROS2-%EC%9B%8C%ED%81%AC%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4</link>
            <guid>https://velog.io/@dbdb_dev/ROS2-%EC%9B%8C%ED%81%AC%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4</guid>
            <pubDate>Wed, 17 Aug 2022 16:04:05 GMT</pubDate>
            <description><![CDATA[<h1 id="워크스페이스-폴더-생성--빌드">워크스페이스 폴더 생성 / 빌드</h1>
<pre><code>$ source /opt/ros/foxy/setup.bash
$ mkdir -p ~/baqu_ws/src
$ cd ~/baqu_ws/
$ colcon build --symlink-install</code></pre><p>=&gt;
    &quot;baqu_ws&quot;라는 워크스페이스 생성
    --symlink-install 명령어로 빌드하면 워크스페이스 하위 폴더에 src 이외에도 build, install, log 폴더가 생성됨</p>
<pre><code>*--symlink-install 명령어는 빌드 후 파이썬 파일 수정을 해도 재빌드가 필요 없음
but, 1. 같은 파일 내에서의 수정일 때 적용
    2. 빌드시 관련 파일(파이썬 등)을 링크로 연결하기 때문에 쉽게 수정이 가능함*</code></pre><hr>
<h1 id="vscode-개발환경-설정">VSCode 개발환경 설정</h1>
<p>아래 위치에 해당 json 파일이 없다면 직접 생성하며 작성</p>
<pre><code>$ ~/.config/Code/User/settings.json
$ ~/baqu_ws/.vscode/c_cpp_properties.json
$ ~/baqu_ws/.vscode/tasks.json
$ ~/baqu_ws/.vscode/launch.json</code></pre><h4 id="user-settings-설정">User settings 설정</h4>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/a466e8b9-3040-43e4-94cb-70e842410734/image.png" alt=""></p>
<pre><code>{
    &quot;workbench.colorTheme&quot;: &quot;Default Dark+&quot;,

    &quot;cmake.configureOnOpen&quot;: false,
    &quot;editor.minimap.enabled&quot;: false,
    &quot;editor.mouseWheelZoom&quot;: true,
    &quot;editor.renderControlCharacters&quot;: true,
    &quot;editor.rulers&quot;: [100],
    &quot;editor.tabSize&quot;: 2,

    &quot;ros.distro&quot;: &quot;foxy&quot;,
    &quot;colcon.provideTasks&quot;: true,
    &quot;files.associations&quot;: {
    &quot;*.repos&quot;: &quot;yaml&quot;,
    &quot;*.world&quot;: &quot;xml&quot;,
    &quot;*.xacro&quot;: &quot;xml&quot;
    },
    &quot;files.insertFinalNewline&quot;: true,
    &quot;files.trimTrailingWhitespace&quot;: true,
    &quot;terminal.integrated.scrollback&quot;: 1000000
}</code></pre><p><img src="https://velog.velcdn.com/images/dbdb_dev/post/ed76c64f-1c23-4f0c-9fae-bf6ff22c12f9/image.png" alt=""></p>
<pre><code>{
  &quot;configurations&quot;: [
    {
      &quot;name&quot;: &quot;Linux&quot;,
      &quot;includePath&quot;: [
        &quot;${default}&quot;,
        &quot;${workspaceFolder}/**&quot;,
        &quot;/opt/ros/foxy/include/**&quot;
      ],
      &quot;defines&quot;: [],
      &quot;compilerPath&quot;: &quot;/usr/bin/g++&quot;,
      &quot;cStandard&quot;: &quot;c99&quot;,
      &quot;cppStandard&quot;: &quot;c++14&quot;,
      &quot;intelliSenseMode&quot;: &quot;linux-gcc-x64&quot;
    }
  ],
  &quot;version&quot;: 4
}
</code></pre><p><img src="https://velog.velcdn.com/images/dbdb_dev/post/c2270c9c-e7ef-4b28-b63c-10b3ed70f90d/image.png" alt=""></p>
<pre><code>{
  &quot;version&quot;: &quot;2.0.0&quot;,
  &quot;tasks&quot;: [
    {
      &quot;label&quot;: &quot;colcon: build&quot;,
      &quot;type&quot;: &quot;shell&quot;,
      &quot;command&quot;: &quot;colcon build --cmake-args &#39;-DCMAKE_BUILD_TYPE=Debug&#39;&quot;,
      &quot;problemMatcher&quot;: [],
      &quot;group&quot;: {
        &quot;kind&quot;: &quot;build&quot;,
        &quot;isDefault&quot;: true
      }
    },
    {
      &quot;label&quot;: &quot;colcon: test&quot;,
      &quot;type&quot;: &quot;shell&quot;,
      &quot;command&quot;: &quot;colcon test &amp;&amp; colcon test-result&quot;
    },
    {
      &quot;label&quot;: &quot;colcon: clean&quot;,
      &quot;type&quot;: &quot;shell&quot;,
      &quot;command&quot;: &quot;rm -rf build install log&quot;
    }
  ]
}</code></pre><p><strong>launch.json</strong></p>
<pre><code>{
  &quot;version&quot;: &quot;0.2.0&quot;,
  &quot;configurations&quot;: [
    {
      &quot;name&quot;: &quot;Debug-rclpy(debugpy)&quot;,
      &quot;type&quot;: &quot;python&quot;,
      &quot;request&quot;: &quot;launch&quot;,
      &quot;program&quot;: &quot;${file}&quot;,
      &quot;console&quot;: &quot;integratedTerminal&quot;
    },
    {
      &quot;name&quot;: &quot;Debug-rclcpp(gbd)&quot;,
      &quot;type&quot;: &quot;cppdbg&quot;,
      &quot;request&quot;: &quot;launch&quot;,
      &quot;program&quot;: &quot;${workspaceFolder}/install/${input:package}/lib/${input:package}/${input:node}&quot;,
      &quot;args&quot;: [],
      &quot;preLaunchTask&quot;: &quot;colcon: build&quot;,
      &quot;stopAtEntry&quot;: true,
      &quot;cwd&quot;: &quot;${workspaceFolder}&quot;,
      &quot;externalConsole&quot;: false,
      &quot;MIMode&quot;: &quot;gdb&quot;,
      &quot;setupCommands&quot;: [
        {
          &quot;description&quot;: &quot;Enable pretty-printing for gdb&quot;,
          &quot;text&quot;: &quot;-enable-pretty-printing&quot;,
          &quot;ignoreFailures&quot;: true
        }
      ]
    }
  ],
  &quot;inputs&quot;: [
    {
      &quot;id&quot;: &quot;package&quot;,
      &quot;type&quot;: &quot;promptString&quot;,
      &quot;description&quot;: &quot;package name&quot;,
      &quot;default&quot;: &quot;topic_service_action_rclpp_example&quot;
    },
    {
      &quot;id&quot;: &quot;node&quot;,
      &quot;type&quot;: &quot;promptString&quot;,
      &quot;description&quot;: &quot;node name&quot;,
      &quot;default&quot;: &quot;argument&quot;
    }
  ]
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[ROS2] ROS2 Foxy 설치 및 삭제]]></title>
            <link>https://velog.io/@dbdb_dev/ROS2-ROS2-Foxy-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AD%EC%A0%9C</link>
            <guid>https://velog.io/@dbdb_dev/ROS2-ROS2-Foxy-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AD%EC%A0%9C</guid>
            <pubDate>Wed, 17 Aug 2022 15:16:02 GMT</pubDate>
            <description><![CDATA[<h1 id="설치">설치</h1>
<p>참고 - (<a href="https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Debians.html#set-locale">https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Debians.html#set-locale</a>)</p>
<h3 id="ubuntu-linux-2004-기준">Ubuntu Linux 20.04 기준</h3>
<h4 id="set-locale">Set Locale</h4>
<pre><code>$ locale #check for UTF-8

$ sudo apt update &amp;&amp; sudo apt install locales
$ sudo locale-gen en_US en_US.UTF-8
$ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
$ export LANG=en_US.UTF-8

locale #verify settings</code></pre><h4 id="set-sources">Set Sources</h4>
<pre><code>$ sudo apt update &amp;&amp; sudo apt install curl gnupg2 lsb-release
$ sudo curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.key  -o /usr/share/keyrings/ros-archive-keyring.gpg</code></pre><h4 id="add-the-ros2-apt-repository-to-your-sysmtem">Add the Ros2 apt repository to your sysmtem</h4>
<pre><code>$ echo &quot;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release &amp;&amp; echo $UBUNTU_CODENAME) main&quot; | sudo tee /etc/apt/sources.list.d/ros2.list &gt; /dev/null</code></pre><h4 id="install-ros2-packages">Install ROS2 Packages</h4>
<pre><code>$ sudo apt update
$ sudo apt install ros-foxy-desktop</code></pre><h4 id="install-argcomplete-optional">Install argcomplete (optional)</h4>
<pre><code>$ sudo apt install -y python3-pip
$ pip3 install -U argcomplete</code></pre><hr>
<h1 id="설치-확인">설치 확인</h1>
<p>아래 코드를 실행하여 성공적으로 출력이 된다면 설치 완료된 것</p>
<h4 id="talker">Talker</h4>
<pre><code>$ source /opt/ros/foxy/setup.bash
$ ros2 run demo_nodes_cpp talker</code></pre><h4 id="listener">Listener</h4>
<pre><code>$ source /opt/ros/foxy/setup.bash
$ ros2 run demo_nodes_py listener</code></pre><p><img src="https://velog.velcdn.com/images/dbdb_dev/post/1d4ce01e-10ec-4069-af70-851b99dc426d/image.png" alt=""></p>
<hr>
<h1 id="ros-개발-tools-설치">ROS 개발 tools 설치</h1>
<pre><code>$ sudo apt update &amp;&amp; sudo apt install -y \
    build-essential \
    cmake \
    git \
    libbullet-dev \
    python3-colcon-common-extensions \
    python3-flake8 \
    python3-pip \
    python3-pytest-cov \
    python3-rosdep \
    python3-setuptools \
    python3-vcstool \
    wget

# install some pip packages needed for testing

$ python3 -m pip install -U \
    argcomplete \
    flake8-blind-except \
    flake8-builtins \
    flake8-class-newline \
    flake8-comprehensions \
    flake8-deprecated \
    flake8-docstrings \
    flake8-import-order \
    flake8-quotes \
    pytest-repeat \
    pytest-rerunfailures \
    pytest

# install Fast-RTPS dependencies

$ sudo apt install --no-install-recommends -y \
    libasio-dev \
    libtinyxml2-dev

# install Cyclone DDS dependencies

$ sudo apt install --no-install-recommends -y \
      libcunit1-dev</code></pre><p><em>ROS2 명령어의 자동 완성 기능을 사용하기 위해서 아래 명령어를 설치해주어야 한다 (option)</em></p>
<pre><code>$ sudo apt install -y python3-argcomplete</code></pre><hr>
<h1 id="ros2-환경-설정-및-단축키-관리">ROS2 환경 설정 및 단축키 관리</h1>
<h4 id="source-file-실행">Source file 실행</h4>
<p>ROS2 사용을 위해 아래 명령어를 터미널 창에 입력해주어야 한다</p>
<pre><code>$ source /opt/ros/foxy/setup.bash</code></pre><p>매번 실행시키기 귀찮으니 Shell Script 파일에 Source file 실행 명령어를 추가</p>
<pre><code>$ echo &quot;source /opt/ros/foxy/setup.bash&quot; &gt;&gt; ~/.bashrc</code></pre><h4 id="shell-script-파일에-colcon_cd-추가">Shell Script 파일에 colcon_cd 추가</h4>
<pre><code>$ echo &quot;source /usr/share/colcon_cd/function/colcon_cd.sh&quot; &gt;&gt; ~/.bashrc
$ echo &quot;export _colcon_cd_root=~/ros2_install&quot; &gt;&gt; ~/.bashrc</code></pre><h4 id="run-commands-설정">Run Commands 설정</h4>
<pre><code>$ nano ~/.bashrc


// bashrc 파일 맨 끝에 alias 지정해줌

alias ccd=&#39;colcon_cd&#39;

alias cb=&#39;cd ~/baqu_ws(본인 워크스페이스) &amp;&amp; colcon build --symlink-install&#39;
alias cba=&#39;colcon build --symlink-install&#39;
alias cbp=&#39;colcon build --symlink-install --packages-select&#39;
alias cbu=&#39;colcon build --symlink-install --packages-up-to&#39;

alias rt=&#39;ros2 topic list&#39;
alias re=&#39;ros2 topid echo&#39;
alias rn=&#39;ros2 node list&#39;</code></pre><h1 id="삭제">삭제</h1>
<p>참고 - (<a href="https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Debians.html#uninstall">https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Debians.html#uninstall</a>)</p>
<pre><code>sudo apt remove ~nros-foxy-* &amp;&amp; sudo apt autoremove</code></pre><p>관련 레포지터리 삭제</p>
<pre><code>sudo rm /etc/apt/sources.list.d/ros2.list
sudo apt update
sudo apt autoremove
# Consider upgrading for packages previously shadowed.
sudo apt upgrade</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Front] 컴포넌트 위치 일정 조정]]></title>
            <link>https://velog.io/@dbdb_dev/Front-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%9C%84%EC%B9%98-%EC%9D%BC%EC%A0%95-%EC%A1%B0%EC%A0%95</link>
            <guid>https://velog.io/@dbdb_dev/Front-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%9C%84%EC%B9%98-%EC%9D%BC%EC%A0%95-%EC%A1%B0%EC%A0%95</guid>
            <pubDate>Tue, 16 Aug 2022 01:42:52 GMT</pubDate>
            <description><![CDATA[<p>커뮤니티 페이지에 스크랩 버튼을 만들려고 함</p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/1f1d50a8-f1f7-4c95-a09d-0c5a7ca85f6b/image.png" alt=""></p>
<p>-&gt; 위와 아래의 객체 사이즈가 달라서 버튼 컴포넌트의 위치를 조정해도 일정하게 되지 않았음</p>
<p>-&gt; 각 객체를 덮는 div에 width와 height를 미리 정해주어서 이미지 객체에 여백이 생기지 않게함</p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/eea6f8cf-e4cb-4a08-88bf-b0b518700cf2/image.png" alt="">
(아래 끝에 일정하게 맞춰짐)</p>
<p>이제 버튼 컴포넌트 위치를 조정하면 모든 객체에 일정하게 위치가 조정됨</p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/ef82c019-75a6-44e9-93e5-6ff95720edfa/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ROS] Turlesim 패키지 노드 실행]]></title>
            <link>https://velog.io/@dbdb_dev/ROS-Turlesim-%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%85%B8%EB%93%9C-%EC%8B%A4%ED%96%89</link>
            <guid>https://velog.io/@dbdb_dev/ROS-Turlesim-%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%85%B8%EB%93%9C-%EC%8B%A4%ED%96%89</guid>
            <pubDate>Mon, 15 Aug 2022 07:20:39 GMT</pubDate>
            <description><![CDATA[<p>ROS를 다 깔아준 후 Turtlesim 패키지를 실행하기 위하여</p>
<pre><code>$ sudo apt update
$ sudo apt install ros-foxy-turtlesim</code></pre><p>함수로 turtlesim 패키지를 설치해주었다.</p>
<p>이후 </p>
<pre><code>$ ros2 run turtlesim turtlesim_node
$ ros2 run turtlesim turtle-teleop_key</code></pre><p>를 입력해주었다</p>
<p><strong>오류발생</strong>
ros2: command not found
라는 오류가 발생!!</p>
<p>=&gt;</p>
<pre><code>cd /opt/ros/foxy/</code></pre><p>해당 폴더에서 ls 로 파일들을 확인하여볼 때 파일들이 나온다면 ros2가 깔리긴 한 것임
근데 설치를 안해주어서 인식을 못하는 것!</p>
<p>해당 /opt/ros/foxy/ 폴더에서</p>
<pre><code>$ source setup.bash</code></pre><p>명령어를 통해 ros2를 설치해준 후 다시 위 명령어들을 실행하면 </p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/d33f3432-e109-4d7e-9aac-c47b5c4ba067/image.png" alt=""></p>
<p>잘 실행이 된다</p>
<hr>
<p>그래프로 노드와 토픽 등 확인</p>
<pre><code>rqt_graph</code></pre><p><img src="https://velog.velcdn.com/images/dbdb_dev/post/6998b8f3-c67c-43aa-a0d2-31bd289eb362/image.png" alt=""></p>
<p><strong>rqt_grpah로 실행시켰을 때 노드들이 한 번에 출력되지 않음.. 걍 빈 화면 출력됨
왜 그러는지는 모르겠는데 왼쪽 위에 새로고침 누르면 출력됨</strong></p>
<p>새로고침 옆에 Nodes/Topics(all) 해주면 토픽들 뿐만 아니라 액션 등까지 다 표시해줌</p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/95a5c399-133c-4f6f-969b-50cf6171af77/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자율주행] Ubuntu 개발환경 세팅]]></title>
            <link>https://velog.io/@dbdb_dev/%EC%9E%90%EC%9C%A8%EC%A3%BC%ED%96%89-Ubuntu-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85</link>
            <guid>https://velog.io/@dbdb_dev/%EC%9E%90%EC%9C%A8%EC%A3%BC%ED%96%89-Ubuntu-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85</guid>
            <pubDate>Mon, 15 Aug 2022 06:43:31 GMT</pubDate>
            <description><![CDATA[<h1 id="arduino-설치">Arduino 설치</h1>
<p><a href="http://www.arduino.cc/en/software">www.arduino.cc/en/software</a>
아두이노 다운로드 페이지에 방문하여 최신 버전을 확인한다.</p>
<p>2022.08.15 기준 최신버전은 Arduino IDE 1.8.19</p>
<ol>
<li>wget 명령어를 이용해 다운로드를 해주자</li>
</ol>
<pre><code>$ sudo wget https://downloads.arduino.cc/arduino-1.8.13-linux64.tar.xz</code></pre><ol start="2">
<li>wget은 터미널의 현재 위치에 파일을 다운로드 하기 때문에 <pre><code>$ pwd</code></pre>이 명령어를 통해 현재 위치를 파악한다</li>
</ol>
<ol start="3">
<li>아래 명령어를 통해 압축을 풀어준다<pre><code>$ tar -xf arduino-1.8.13-linux64.tar.xz</code></pre></li>
</ol>
<ol start="4">
<li>아래 명령어를 통해 압축을 푼 폴더로 이동한다<pre><code>$ cd arduino-1.8.13</code></pre></li>
</ol>
<ol start="5">
<li>설치를 진행한다<pre><code>$ sudo ./install.sh</code></pre></li>
</ol>
<p><em>나중에 삭제할 때는 arduion-1.8.13 폴더의 unistall.sh를 실행하면 된다</em></p>
<ol start="6">
<li>(추후에 권한문제가 있을 수도 있으니) 사용자에게 권한설정을 부여한다<pre><code>$ cd arduino-1.8.13
sudo chown 사용자이름 arduino</code></pre></li>
</ol>
<ol start="7">
<li>아두이노를 실행</li>
</ol>
<p>검색창에서 arduino ide를 검색해서 실행하거나</p>
<p>터미널에서 arduino를 입력하면 </p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/75d5053f-5708-4470-ac33-ff77f45271ad/image.png" alt=""></p>
<p>실행 완료</p>
<hr>
<p>*<em>참고
<a href="https://ieworld.tistory.com/11">https://ieworld.tistory.com/11</a> *</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자율주행] ROS 공부]]></title>
            <link>https://velog.io/@dbdb_dev/%EC%9E%90%EC%9C%A8%EC%A3%BC%ED%96%89-ROS-%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@dbdb_dev/%EC%9E%90%EC%9C%A8%EC%A3%BC%ED%96%89-ROS-%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Tue, 09 Aug 2022 14:35:11 GMT</pubDate>
            <description><![CDATA[<p><em>참고 자료</em>
<a href="https://www.youtube.com/watch?v=5RBqGt1hvpM&amp;list=PLRG6WP3c31_VIFtFAxSke2NG_DumVZPgw&amp;index=5">https://www.youtube.com/watch?v=5RBqGt1hvpM&amp;list=PLRG6WP3c31_VIFtFAxSke2NG_DumVZPgw&amp;index=5</a></p>
<hr>
<h1 id="ros-용어-정리">ROS 용어 정리</h1>
<ol>
<li><p>master
 노드와 노드 사이의 연결과 메시지 통신을 위한 네임버서와 같은 역할
 master 없이는 노드 간의 접속, 토픽과 서비스 같은 메시지 통신 불가
 ROS_MASTER_URI 변수에 기재된 URI 주소와 포트를 가짐
 기본 값으로 URI 주소는 현재 로컬 IP, 포트는 11311</p>
</li>
<li><p>노드
 ROS에서 실행되는 최소 단위의 프로세서
 <strong>하나의 목적에 하나의 노드가 가장 적합함</strong>
 재사용이 쉽게 구성하여 개발하기를 추천 (각 프로그램을 최대한 세분화 시켜서 작은 노드들을 이용하기)
 노드는 구동과 함께 마스터에 노드 이름과 publisher, subscriber, service server, service client에서 사용하는 토픽 및 서비스 이름, 메시지 형태, URI 주소와 포트를 등록
 이 정보들을 기반으로 각 노드는 노드끼리 토픽과 서비스를 이용하여 메시지를 주고받음</p>
</li>
<li><p>패키지
 ROS를 구성하는 기본 단위
 ROS의 응용 프로그램은 패키지 단위로 개발됨
 패키지는 최소한 하나 이상의 노드를 포함하거나 다른 패키지의 노드를 실행하기 위한 설정 파일들을 포함함
 각종 프로세스를 구동하기 위한 ROS 의존성 라이브러리, 데이터셋, 설정 파일 등 패키지에 필요한 모든 파일을 포함</p>
</li>
<li><p>메타패키지
 공통된 목적을 지닌 패키지들의 집합
 (ex. Navigation 메타 패키지 : AMCL, DWA, EKF, map_server 등의 패키지로 구성)</p>
</li>
<li><p><strong>메시지</strong>
 노드는 메시지를 통해 노드 간 데이터를 주고받음
 메시지는 integer, floating, point, boolean과 같은 변수 형태
 메시지 안에 메시지를 품고 있는 간단한 데이터 구조나 메시지들이 나열된 배열과 같은 구조도 사용할 수 있음
 단방향 메시지 송수신 방식의 토픽과, 양방향 메시지 요청/응답 방식의 서비스를 이용</p>
</li>
<li><p>토픽
 publisher 노드가 하나의 이야깃거리에 대해서 토픽으로 마스터에 등록한 후, 토픽에 대한 이야기를 메시지 형태로 publish함
 이 토픽을 수신받기를 원하는 subscriber 노드는 마스터에 등록된 토픽의 이름에 해당하는 publisher 노드의 정보를 받음
 이 정보를 기반으로 subscriber 노드는 publisher 노드와 직접 연결하여 메시지를 토픽으로 송수신함</p>
</li>
<li><p>publish / publisher
 publish는 토픽의 내용에 해당하는 메시지 형태의 데이터를 송신하는 것
 publisher 노드는 publish를 수행하기 위하여 토픽을 포함한 자신의 정보들을 마스터에 등록
 subscribe를 원하는 subscriber 노드에 메시지 보냄
 publisher는 이를 실행하는 개체로써 노드에서 선언하며 하나의 노드에서 복수로 선언할 수도 있음</p>
</li>
<li><p>subscribe / subscriber
 subscribe는 토픽의 내용에 해당하는 메시지 현태의 데이터를 수신하는 것
 subscriber 노드는 subscribe를 수행하기 위하여 토픽을 포함한 자신의 정보들을 마스터에 등록, 구독하고자 하는 토픽을 publish하는 publisher 노드의 정보를 마스터로부터 받음
 <em>(=&gt; 마스터에서 정보를 주고받는 노드들의 정보를 확인할 수 있음)</em>
 subscriber는 이를 실행하는 개체로써 노드에서 선언하며 하나의 노드에서 복수로 선언할 수도 있음</p>
</li>
</ol>
<p><strong><em>publish와 subscirbe 개념의 토픽 통신 방식은 비동기 방식</em></strong>
-&gt; 필요에 따라서 주어진 데이터를 송수신하기에 적합
한 번의 접속으로 지속적인 메시지를 송수신함 -&gt; 지속해서 메시지를 발송해야하는 센서 데이터에 적합</p>
<ol start="9">
<li><p>service
 서비스 메시지 통신은 특정 목적의 작업에 해당되는 서비스를 요청하는 서비스 클라이언트와 서비스 응답을 담당하는 서비스 서버 간의 <strong>동기적</strong> 양방향 서비스 메시지 통신임</p>
</li>
<li><p>service server
서비스 서버는 요청을 입력으로 받고, 응답을 출력으로 하는 서비스 메시지 통신의 서버 역할
요청과 응답은 모두 메시지로 되어 있음
서비스 요청을 받으면 지정된 서비스를 수행한 다음 그 결과를 서비스 클라이언트에 전달
서비스 서버는 정해진 명령을 받아 수행하는 노드에 사용됨</p>
</li>
<li><p>파라미터
ROS에서의 파라미터는 노드에서 사용되는 파라미터를 말함
ex. 윈도우 프로그램에서 <em>ini 설정 파일과 같다고 생각하면 됨
디폴트로 설정값들이 지정되어 있고, 필요에 따라 외부에서 읽거나 쓸 수 있음
특히 외부에서 쓰기 기능을 이용하여 상황에 따라 설정갑을 실시간으로 바꿀 수 있음
예를 들어 *</em>외부 장치와 연결되는 PC의 USB 포트나 카메라 캘리브레이션 값, 모터 속도나 명령어들의 최댓값과 최솟값 등의 설정을 지정할 수 있음**</p>
</li>
<li><p>파라미터 서버
파라미터 서버는 패키지에서 파라미터를 사용할 때, 각 파라미터를 등록하는 서버를 말함
파라미터 서버는 마스터의 한 기능이기도 함</p>
</li>
</ol>
<hr>
<h1 id="ros-명령어">ROS 명령어</h1>
<h2 id="ros-셸-명령어">ROS 셸 명령어</h2>
<p>(터미널에 쓰면서 사용할 수 있는 명령어)</p>
<ol>
<li><p>roscd
 ros+cd(changes directory)
 : 지정한 ros 패키지의 디렉토리로 이동</p>
</li>
<li><p>rosls
 ros+ls(lists files)
 : ros 패키지의 파일 목록 확인</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/c7bb50d5-cf55-43f7-906c-be93cffc716a/image.png" alt=""></p>
<h2 id="ros-실행-명령어-중요">ROS 실행 명령어 !!중요</h2>
<ol>
<li><p>roscore
 : master (ROS 네임 서비스)
 rosout (로그 기록)
 parameter server (파라미터 관리)</p>
</li>
<li><p>rosrun
 : 노드 실행</p>
</li>
<li><p>roslaunch
 : 노드를 여러 개 실행 및 실행 옵션 설정</p>
</li>
<li><p>rosclean
 : ROS 로그 파일을 검사하거나 삭제</p>
</li>
</ol>
<h2 id="ros-정보-명령어-중요">ROS 정보 명령어 !!중요</h2>
<ol>
<li><p><strong>rostopic</strong>
 : ROS 토픽 정보 확인</p>
</li>
<li><p><strong>rosservice</strong>
 : ROS 서비스 정보 확인</p>
</li>
<li><p><strong>rosnode</strong>
 : ROS 노드 정보 확인</p>
</li>
<li><p><strong>rosparam</strong>
 : ROS 파라미터 정보 확인, 수정</p>
</li>
<li><p>rosbag
 : ROS 메시지 기록, 재생</p>
</li>
<li><p>rosmsg
 : ROS 메시지 정보 확인</p>
</li>
<li><p>rossrv
 : ROS 서비스 정보 확인</p>
</li>
<li><p>rosversioin
 : ROS 패키지 및 배포 릴리즈 버전 정보 확인</p>
</li>
<li><p>roswtf
 : ROS 시스템 검사</p>
</li>
</ol>
<h2 id="catkin-명령어">catkin 명령어</h2>
<p>: ros의 컴파일, 빌드와 관련된 시스템
catkin 명령어를 통해 실행하고 </p>
<ol>
<li><p>catkin_create_pkg
 : 패키지 자동 생성</p>
</li>
<li><p>catkin_make
 : catkin 빌드 시스템에 기반을 둔 빌드</p>
<p> <img src="https://velog.velcdn.com/images/dbdb_dev/post/09e0f3dd-bc30-4fb4-9c0b-fd04251a812d/image.png" alt=""></p>
</li>
</ol>
<h2 id="ros-패키지-명령어">ROS 패키지 명령어</h2>
<ol>
<li><p>rospack
 : ROS 패키지와 관련된 정보 보기</p>
</li>
<li><p>rosinstall
 : ROS 추가 패키지 설치</p>
</li>
<li><p>rosdep
 : 해당 패키지의 의존성 파일 설치</p>
</li>
</ol>
<hr>
<h1 id="ros-도구">ROS 도구</h1>
<ol>
<li>RViz (ROS Visualization Tool)
 : ROS의 3D 시각화 툴<pre><code> - 센서 데이터의 시각화 (레이저 거리 센서의 거리 데이터)
 - Depth Camera의 포인트 클라우드 데이터
 - 카메라의 영상 데이터</code></pre> : 내비게이션, 매니퓰레이션, 원격 제어 ...</li>
</ol>
<hr>
<h1 id="ros-기본-프로그래밍">ROS 기본 프로그래밍</h1>
<p>기본 규칙
<img src="https://velog.velcdn.com/images/dbdb_dev/post/217f0ff4-c3fb-49bc-8ccd-a08a0bed0e20/image.png" alt=""></p>
<p>catkin 프로그램 만든 후 package.xml 수정</p>
<pre><code>&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;package format=&quot;2&quot;&gt;
  &lt;name&gt;detect_stopLines&lt;/name&gt;
  &lt;version&gt;0.1.0&lt;/version&gt;
  &lt;description&gt;The detecting system to stop the car when detects the stop line&lt;/description&gt;
  &lt;maintainer email=&quot;dabeen@todo.todo&quot;&gt;dabeen&lt;/maintainer&gt;
  &lt;license&gt;Apache License 2.0&lt;/license&gt;
  &lt;url type=&quot;website&quot;&gt;http://wiki.ros.org/beginner_tutorials&lt;/url&gt;
  &lt;author email=&quot;dabeen@todo.todo&quot;&gt;dabeen&lt;/author&gt;
  &lt;buildtool_depend&gt;catkin&lt;/buildtool_depend&gt;
  &lt;build_depend&gt;roscpp&lt;/build_depend&gt;
  &lt;build_depend&gt;rospy&lt;/build_depend&gt;
  &lt;build_depend&gt;std_msgs&lt;/build_depend&gt;
  &lt;exec_depend&gt;roscpp&lt;/exec_depend&gt;
  &lt;exec_depend&gt;rospy&lt;/exec_depend&gt;
  &lt;exec_depend&gt;std_msgs&lt;/exec_depend&gt;

&lt;/package&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Front] onFocus 이벤트]]></title>
            <link>https://velog.io/@dbdb_dev/Front-onFocus-%EC%9D%B4%EB%B2%A4%ED%8A%B8</link>
            <guid>https://velog.io/@dbdb_dev/Front-onFocus-%EC%9D%B4%EB%B2%A4%ED%8A%B8</guid>
            <pubDate>Tue, 09 Aug 2022 02:42:59 GMT</pubDate>
            <description><![CDATA[<p>해당 svg 버튼을 눌렀을 때 탭창이 뜨게 구현하고자 함</p>
<hr>
<pre><code>javaScript
//초기 코드 일부

&lt;div
                  className=&quot;relative justify-center items-center&quot;
                  onBlur={() =&gt; {
                    setQuickTab(false);
                  }}
                  onClick={() =&gt; {
                    setQuickTab(!quickTab);
                  }}
                &gt;
                  &lt;svg
                    width=&quot;40&quot;
                    height=&quot;40&quot;
                    viewBox=&quot;0 0 40 40&quot;
                    fill=&quot;none&quot;
                    xmlns=&quot;http://www.w3.org/2000/svg&quot;
                  &gt;</code></pre><p>OnBlur 이벤트와 OnFocus 이벤트가 작동하지 않음</p>
<p>찾아보니
<strong>OnFocus 이벤트는 대화형 요소에만 작용함</strong>
대화형 요소 : a, button, details, input, select, textarea
이외의 요소들은 비대화형 요소이며ㅠ포커싱이 작동하지 않는다. (ex. div, span, ul ...)</p>
<p>=&gt;</p>
<pre><code>&lt;button
                  className=&quot;relative justify-center items-center&quot;
                  onBlur={() =&gt; {
                    setQuickTab(false);
                  }}
                  onClick={() =&gt; {
                    setQuickTab(!quickTab);
                  }}
                &gt;
                  &lt;svg
                    width=&quot;40&quot;
                    height=&quot;40&quot;
                    viewBox=&quot;0 0 40 40&quot;
                    fill=&quot;none&quot;
                    xmlns=&quot;http://www.w3.org/2000/svg&quot;
                  &gt;</code></pre><p>해당 svg를 감싸를 요소를 div에서 button으로 바꾸어주었더니 잘 작동함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자율주행] VScode로 ROS 실행]]></title>
            <link>https://velog.io/@dbdb_dev/%EC%9E%90%EC%9C%A8%EC%A3%BC%ED%96%89-VScode%EB%A1%9C-ROS-%EC%8B%A4%ED%96%89</link>
            <guid>https://velog.io/@dbdb_dev/%EC%9E%90%EC%9C%A8%EC%A3%BC%ED%96%89-VScode%EB%A1%9C-ROS-%EC%8B%A4%ED%96%89</guid>
            <pubDate>Mon, 08 Aug 2022 23:18:56 GMT</pubDate>
            <description><![CDATA[<h1 id="ros-플로그인-설치">ROS 플로그인 설치</h1>
<h4 id="vscode-플러그인-설치-창에-ros를-검색하고-설치">VScode 플러그인 설치 창에 ros를 검색하고 설치</h4>
<h4 id="xml-tools-설치">XML Tools 설치</h4>
<h1 id="vscode-환경-설정">VScode 환경 설정</h1>
<p>VScode에서 ctrl+,를 눌러 setting 할 수 있는 항목들의 검색창을 띄움
ROS를 검색하여 자신에게 맞는 distro 적어줌
(나는 Ubuntu 20.04이므로 noetic)</p>
<p><img src="https://velog.velcdn.com/images/dbdb_dev/post/e3b79a77-99a6-47ce-b859-b88ea35f61ca/image.png" alt=""></p>
<h3 id="mavros-관련-패키지-설치">mavros 관련 패키지 설치</h3>
<p>(mavros : ROS(1)과 MAVLink 프로토콜 간의 공식 지원 브리지.
모든 MAVLink 지원 자동 조종 장치와 통신할 수 있음)</p>
<pre><code>sudo apt-get install ros-noetic-mav*</code></pre><h3 id="catkin-작업공간-만들기">catkin 작업공간 만들기</h3>
<pre><code>$ mkdir -p ~/catkin_ws/src

$ cd ~/catkin_ws/src 

$ catkin_init_workspace
[출처] catkin_make 후 에러 source devel/setup.bash|작성자 봄봄바라기</code></pre><p>위의 명령들을 실행하고 난 뒤에도 작업공간이 비어있지만(src폴더 안에는 어떤 패키지도 없고 CMakeLists.txt만 존재한다.) 이 작업공간을 &quot;빌드&quot;하는 것이 가능</p>
<pre><code>$ cd ~/catkin_ws/ 

$ catkin_make</code></pre><p>이후 ~/.bashrc 에 </p>
<pre><code>source devel/setup.bash</code></pre><p>를 추가해줌</p>
<p>(gedit ~/.bashrc
로 들어가 추가해줌)</p>
<hr>
<h1 id="활용하기">활용하기</h1>
<h3 id="내가-원하는-파일에서-catkin_make-실행">내가 원하는 파일에서 catkin_make 실행</h3>
<ol>
<li>VScode 들어가서 Ctrl + Shift + P를 누른 후 ros를 입력
ROS:Create Catkin Package로 패키지 생성
1-2. 패키지 이름 설정 -&gt; 필요한 dependency 입력 (ex. rospy, std_msgs)</li>
</ol>
<ol start="2">
<li>src 폴더 아래에 새 폴더 생성</li>
</ol>
<p>끝!</p>
<p>..이 아니라 내가 원하는 파일에서 catkin하려 하니까 하면서 생긴 오류들 (위에는 ~/catkin_ws/src 경로에서 진행하는 절차)</p>
<pre><code>Invoking &quot;make cmake_check_build_system&quot; failed</code></pre><p>home에 catkin_ws 파일이 있지만, ~/dabeen/Dev/ros/ 에 catkin_ws를 넣고 프로그램을 돌리고 싶음
-&gt; CMake어쩌고.txt에 있는 경로가 다른 경로가 해당 폴더의 경로가 아니어서 그런 듯</p>
<p>-&gt; gedit ~/.bashrc를 통해 경로들을 모두 기본 경로(ex. ~/catkin_make)로 바꾼 후 home에 있는 catkin 파일 삭제</p>
<pre><code>The specified base path &quot;/home/catkin_ws&quot; does not exist 오류 발생</code></pre><p>아직 미해결. . . 일단은 ~/catkin_ws/src에서 진행하기로 함</p>
<hr>
]]></description>
        </item>
    </channel>
</rss>