TurtleBot3 조립 #2

13. 2번 레이어에 서포터와 PCB 서포터 고정

필요한 부품들입니다.

2번 레이어 서포터 고정용 부품들입니다.

서포터를 모두 고정했습니다.

PCB 서포터 고정용 부품들입니다.

필요한 부품들만 선택합니다.

PCB 서포터의 상단에 볼트를 끼워 넣습니다.

순서대로 PCB 서포터를 고정합니다.

파워 케이블 연장선을 배치합니다.

1번 레이어 위에 올려 놓고 모터 제어신호 선 2개를 레이어 홀에 배치합니다.

14. 2번 레이어에 OpenCR 보드 고정

고정용 부품입니다.

보드에 고정용 리버를 먼저 고정합니다.

OpenCR 보드를 PCB 서포터에 고정합니다.

모터 케이블을 연결하고 OpenCR 보드의 전원 커넥터를 연결했습니다.

이 상태에서 전원을 켜고 PUSH SW1과 SW2를 길게 눌러 직진 이동과 회전을 테스트 할 수 있습니다.

15. 1번 레이어와 2번 레이어 결합

필요한 볼트부품입니다.

볼트 4개를 고정했습니다.

16. 3번 레이어 작업

필요한 부품들입니다.

5개 서포트를 모두 고정했습니다.

17. Raspberry Pi 보드에 방열판 부착

보드와 전원선, 방열판 부품들입니다

방열패드 3개를 보드 부품 위에 장착합니다.

방열팬 모듈을 분해했습니다.

방열판 모듈 사이에 보드를 끼워 넣고 임시로 조립한 모습입니다.

라즈베리 파이 보드와 연결하는 케이블과 전원선, USB2LDS 모듈입니다.

방열판의 전원은 그림과 같이 4, 6번 핀에 VV, GND를 연결합니다.

18. USB2LDS 설치

USB 케이블과 고정핀입니다.

USB2LDS 모듈에 리벳을 끼웁니다.

3번 레이어 팔레트에 모듈을 고정합니다.

케이블의 VCC를 분리하여 새로운 커넥터를 연결합니다. 방열판 전원 연결 때문에 커넥터 작업이 진행되어야 합니다.

라즈베리 파이 전원선은 2번 핀에 VCC를 연결하고 GND 커넥터는 9번, 10번 핀에 연결합니다.

3번 레이어 결합 예상 모양입니다.

19. Ubuntu 구동 테스트

micro SD 카드를 라즈베리 파이 모듈에 장착합니다.

모니터 케이블을 준비합니다.

라즈베리 파이 보드의 전원은 터틀봇3의 OpenCR 보드에서 연결하고 OpenCR 보드는 어뎁터를 연결합니다.

Ubuntu 부팅을 시작합니다.

방열판을 제거하고 라즈베리 파이 보드에 전원과 HDMI를 연결하고 키보드와 마우스 동글도 연결했습니다.

micro HDMI 커넥터는 왼쪽에 있는 것을 사용합니다.

처음 부팅시에는 로그인 후에도 설치를 계속합니다.

재부팅 후에 다시 로그인한 화면입니다.

20. Raspberry Pi Camera 동작 확인

라즈베리 파이용 카메라와 고정용 브라켓입니다.

Raspberry Pi 4의 카메라 포트는 micro HDMI 우측에 있는 긴 CSI 커넥터 입니다. 케이블 연결시 파란색 보강면이 USB/ LAN 포트 방향으로 향하게 연결합니다.

부팅 후 SSH로 접속합니다. 접속 후 아래의 명령어를 수행하여 Ubuntu 설치 환경과 아키텍처를 확인합니다.

uname -a
lsb_release -a

먼저 비디오 장치가 생성되었는지 확인합니다.

ls /dev/video*

위의 결과를 보면 정상적으로 설치되었습니다.

v4l2-utils를 설치합니다.

sudo apt update
sudo apt install -y v4l-utils
v4l2-ctl --list-devices

카메라 장치가 정상적으로 설치되었습니다.

libcamera-tools를 설치합니다.

sudo apt update
sudo apt install -y libcamera-tools v4l-utils

설치 완료 후 재부팅을 실행합니다.

v4l2 명령어로 카메라 지원 정보를 확인할 수 있습니다.

v4l2-ctl --device=/dev/video0 --all
v4l2-ctl --device=/dev/video0 --list-formats-ext

아래의 명령을 실행하고 프레임 카운트가 정상적으로 증가하는지 확인합니다.

v4l2-ctl -d /dev/video0 \
--set-fmt-video=width=3280,height=2464,pixelformat=RG10 \
--stream-mmap --stream-count=10

raw 파일로 저장합니다. 명령어 실행 후 파일이 정상적으로 생성되었는지 확인합니다.

v4l2-ctl -d /dev/video0 \
--set-fmt-video=width=3280,height=2464,pixelformat=RG10 \
--stream-mmap \
--stream-count=1 \
--stream-to=frame.raw

파일이 정상적으로 생성됩니다.

21. 카메라 고정 브라켓 조립

카메라 모듈과 고정 브라켓입니다. 카메라에는 CSSI용 케이블이 연결되어 있습니다.

임시로 브라켓 연결 상태를 확인했습니다.

조립에 필요한 부품들입니다.

브라켓 안쪽으로 케이블이 통과하도록 배치합니다.

볼트에 고무링을 끼우고 브라켓에 고정합니다. 아래 그림은 4개 모두 볼트를 조인 상태입니다.

방열판의 flat 케이블용 구멍에 케이블을 먼저 끼웁니다.

케이블을 라즈베리 보드의 CSI 커넥터에 연결합니다. 방열판 모듈을 연결한 상태에서 커넥터 고정을 해야 하기 때문에 단선이나 커넥터 파손에 주의해야 합니다.

방열판 덮개까지 조립한 상태입니다.

3번 레이어를 결합한 모습입니다.

22. 4번 레이어 조립

4번 레이어 조립에 필요한 부품들입니다.

PCB 서포터에 볼트를 끼웁니다.

PCB 서포터 3개를 먼조 고정합니다. 방법은 OpenCR 고정과 동일합니다. PCB 서포터 고정이 완료되면 라이다 밑에 스페이서를 넣고 16mm 볼트로 고정합니다. 아래 그림은 3부분 모두 고정한 상태입니다.

라이다의 위치는 PCB 서포터를 움직여 조정합니다. 라이다가 로봇의 정중아에 위치하도록 조정한 후에 아래에서 볼트를 고정합니다. 커넥터는 아래로 배치합니다.

라즈베리 보드 방열판의 구조 때문에 로봇의 몸체에 부착이 불가능합니다. 따라서 3번 레이어에 PCB 고정용 서포터를 사용할 수 없는 상황에서 방열판 모듈 바닥에 양면 테이프를 사용합니다. 라즈베리 파이 보드는 마직막 조립 단계에서 붙이도록 합니다.

4번 레이어 상단에 카메라 고정 브라켓을 부착합니다. 먼저 그림처럼 앞의 2개 볼트를 체결합니다.

볼트 4개를 모두 고정했습니다.

아래쪽에서 본 모습입니다.

4번 레이어를 로봇에 얹은 모습니다.

4번 레이어를 고정하기 위해 위치를 조정했습니다.

6개의 볼트를 모두 고정했습니다.

바퀴에 스티커도 부착합니다.

23. 조립 완료

아래의 그림은 로봇 조립을 완료한 모습들입니다.

24. 조립 완료 후 부품들 처리

조립에 사용되지 않은 부품들은 박스에 잘 정리해서 추후 보수를 위해서 잘 보관합니다.

제품 구매시 동봉된 micro SD 16GB도 박스에 정리하여 반납합니다.

배터리 충전기는 사용해야 하기 때문에 조별로 보관하시기 바랍니다.

각종 볼트와 너트, 조립 부품들은 추후 유지보수를 위해서 잘 보관합니다.

25. 라즈베리 파이 보드 설정 계속

온라인 매뉴얼 참조 : https://emanual.robotis.com/docs/en/platform/turtlebot3/sbc_setup/#sbc-setup

1) 자동 업데이트 비활성화

터틀봇3 같은 로봇 시스템에서는 예기치 않은 자동 업데이트가 오히려 방해가 될 수 있습니다.

예를 들어 패키지 빌드 중간에 시스템 업데이트가 걸리거나, 부팅 직후 apt 관련 프로세스가 점유되면 설치 작업이 꼬일 수 있습니다. 그래서 자동 업데이트를 꺼두는 것이 안정적입니다.

아래 파일을 엽니다.

sudo nano /etc/apt/apt.conf.d/20auto-upgrades

내용을 아래처럼 수정합니다.

APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";

저장 후 종료합니다.

Ctrl + S
Ctrl + X

2) 부팅 시 네트워크 대기 시간 줄이기

라즈베리파이가 부팅될 때 네트워크가 바로 연결되지 않으면 systemd-networkd-wait-online.service 때문에 부팅이 지연될 수 있습니다.

로봇은 전원을 넣고 빠르게 올라오는 것이 중요하므로 해당 서비스를 mask 처리합니다.

sudo systemctl mask systemd-networkd-wait-online.service

여기서 mask는 단순 disable보다 강한 비활성화입니다.
서비스가 자동으로 실행되지 않도록 막는 설정입니다.

3) 절전과 최대절전 비활성화

로봇이 동작 중인데 SBC가 절전 상태로 들어가면 통신이 끊기거나 ROS 노드가 멈출 수 있습니다.

다음 명령으로 sleep, suspend, hibernate 관련 타깃을 비활성화합니다.

sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

터틀봇3처럼 계속 켜진 상태로 동작해야 하는 로봇에서는 사실상 필수 설정에 가깝습니다.

4) 라즈베리파이 재부팅

여기까지 설정했다면 재부팅합니다.

sudo reboot

재부팅 후 Wi-Fi가 정상 연결되었는지 확인합니다.

ip addr

또는 net-tools를 설치해서 ifconfig를 사용할 수도 있습니다.

sudo apt update
sudo apt install net-tools
ifconfig

wlan0 항목에 IP 주소가 보이면 Wi-Fi 연결이 된 것입니다.

5) Remote PC에서 SSH 접속하기

라즈베리파이의 IP 주소를 확인했다면 Remote PC에서 SSH로 접속할 수 있습니다.

Remote PC 터미널에서 아래 명령을 실행합니다.

ssh ubuntu@라즈베리파이_IP주소

예를 들어 라즈베리파이 IP가 192.168.0.25라면 다음처럼 입력합니다.

ssh ubuntu@192.168.200.27

처음 접속할 때는 fingerprint 확인 메시지가 나올 수 있습니다.
yes를 입력하고, Ubuntu 설치 과정에서 설정한 비밀번호를 입력하면 접속됩니다.

이후 작업은 라즈베리파이에 직접 키보드로 입력해도 되고, SSH 접속 상태에서 진행해도 됩니다.

6) ROS 2 Humble 설치

참조 사이트 : Ubuntu 22.04에서 ROS2 설치

TurtleBot3 공식 문서에서는 ROS 2 Humble Hawksbill 설치 시 ROS-Base(Bare Bones) 설치를 권장합니다.

먼저 기본 패키지를 업데이트합니다.

sudo apt update
sudo apt upgrade -y

locale 설정을 진행합니다.

sudo apt install locales -y
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

Universe 저장소를 활성화합니다.

sudo apt install software-properties-common -y
sudo add-apt-repository universe

ROS 2 apt 저장소 설정에 필요한 패키지를 설치합니다.

sudo apt update
sudo apt install curl gnupg lsb-release -y

ROS 2 GPG key를 추가합니다.

sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
-o /usr/share/keyrings/ros-archive-keyring.gpg

ROS 2 저장소를 추가합니다.

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | \
sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

패키지 목록을 다시 업데이트합니다.

sudo apt update

ROS 2 Humble ROS-Desktop를 설치합니다. 설치에 조금은 긴 시간이 필요합니다.

sudo apt install ros-humble-desktop -y

ROS 2 환경을 .bashrc에 등록합니다.

echo 'source /opt/ros/humble/setup.bash' >> ~/.bashrc
source ~/.bashrc

설치 확인은 아래 명령으로 할 수 있습니다.

ros2 --help

또는 ROS 2 명령이 정상적으로 동작하는지 확인합니다.

ros2 topic list

아직 실행 중인 ROS 노드가 없다면 토픽이 거의 없거나 /parameter_events, /rosout 정도만 보일 수 있습니다.


명령 자체가 실행되면 ROS 2 환경 설정은 된 것입니다. 재부팅을 실행합니다.

7) TurtleBot3 패키지 설치 및 빌드

이제 TurtleBot3에 필요한 ROS 패키지를 설치하고 워크스페이스를 빌드합니다.

먼저 필요한 패키지를 설치합니다.

sudo apt install python3-argcomplete python3-colcon-common-extensions libboost-system-dev build-essential -y
sudo apt install ros-humble-hls-lfcd-lds-driver -y
sudo apt install ros-humble-turtlebot3-msgs -y
sudo apt install ros-humble-dynamixel-sdk -y
sudo apt install ros-humble-xacro -y
sudo apt install libudev-dev -y

TurtleBot3 워크스페이스를 만듭니다.

mkdir -p ~/turtlebot3_ws/src
cd ~/turtlebot3_ws/src

공식 TurtleBot3 패키지를 clone 합니다.

git clone -b humble https://github.com/ROBOTIS-GIT/turtlebot3.git
git clone -b humble https://github.com/ROBOTIS-GIT/ld08_driver.git
git clone -b humble https://github.com/ROBOTIS-GIT/coin_d4_driver

SBC에서는 SLAM이나 Navigation2 전체 패키지를 빌드하지 않는 구성이 일반적입니다.
공식 문서에서도 SBC 빌드 부담을 줄이기 위해 turtlebot3_cartographer, turtlebot3_navigation2를 제거합니다. 이 강의에서는 유지하기로 합니다. 아래의 명령은 실행하지 않습니다.

cd ~/turtlebot3_ws/src/turtlebot3
rm -r turtlebot3_cartographer turtlebot3_navigation2

워크스페이스 루트로 이동합니다.

cd ~/turtlebot3_ws/

ROS 2 Humble 환경을 다시 적용합니다.

source /opt/ros/humble/setup.bash

빌드를 진행합니다.

colcon build --symlink-install --parallel-workers 1

여기서 --parallel-workers 1 옵션은 빌드를 한 번에 하나씩 진행하게 해서 메모리 사용량을 줄입니다.
라즈베리파이에서는 빠른 빌드보다 안정적인 빌드가 더 중요합니다.

빌드가 완료되면 TurtleBot3 워크스페이스 환경을 .bashrc에 등록합니다.

echo 'source ~/turtlebot3_ws/install/setup.bash' >> ~/.bashrc
source ~/.bashrc

8) OpenCR USB 포트 권한 설정

TurtleBot3는 SBC와 OpenCR 보드가 USB로 연결됩니다.
ROS 2 노드가 OpenCR 장치에 접근하려면 udev rule 설정이 필요합니다.

99-turtlebot3-cdc.rules 파일의 내용은 아래와 같습니다. 이 파일을 /etc/udev/rules.d/에 복사하고 리부팅하면 파일에서 지정한 심볼릭 링크가 생성됩니다. 이 이름은 USB 장치가 바뀌어도 자동으로 연결되어 변하지 않는 고정 장치 이름이 됩니다.

아래 명령을 실행합니다.

sudo cp `ros2 pkg prefix turtlebot3_bringup`/share/turtlebot3_bringup/script/99-turtlebot3-cdc.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger

설정 후 OpenCR USB를 다시 연결하거나 시스템을 재부팅하면 장치 권한이 적용됩니다.

재부팅 후 아래의 명령어를 실행하여 USB 장치의 이름이 정상적으로 등록되었는지를 확인합니다.

cd /dev
ls -al

9) ROS_DOMAIN_ID 설정

ROS 2는 DDS 통신을 사용합니다.
같은 네트워크 안에서 Remote PC와 TurtleBot3가 서로 통신하려면 ROS_DOMAIN_ID가 같아야 합니다.

TurtleBot3의 기본 권장 ID는 30입니다.

팀별로 서로 다른 ID를 사용해야 합니다. 각 팀은 30 대신에 자기 팀의 ID를 입력하시기 바랍니다.

SBC에서 다음 명령을 입력합니다.

echo 'export ROS_DOMAIN_ID=100 #TURTLEBOT3' >> ~/.bashrc
source ~/.bashrc

Remote PC에서도 같은 값을 설정해야 합니다.

echo 'export ROS_DOMAIN_ID=100 #TURTLEBOT3' >> ~/.bashrc
source ~/.bashrc

주의할 점이 있습니다.
같은 공간에서 여러 명이 ROS 2 로봇을 사용한다면 ROS_DOMAIN_ID가 겹치면 안 됩니다.

예를 들어 같은 실습실에서 모든 사람이 30을 사용하면 서로의 토픽이 섞일 수 있습니다.
혼자 쓰는 환경이면 30을 써도 괜찮지만, 여러 대를 동시에 운용한다면 로봇마다 ID를 다르게 잡는 것이 좋습니다.

예시는 다음과 같습니다.

TurtleBot3 A: ROS_DOMAIN_ID=30
TurtleBot3 B: ROS_DOMAIN_ID=31
TurtleBot3 C: ROS_DOMAIN_ID=32

10) LDS 모델 설정

사용하는 LDS 센서 모델에 따라 환경변수를 설정합니다.

LDS-01을 사용하는 경우:

echo 'export LDS_MODEL=LDS-01' >> ~/.bashrc

LDS-02를 사용하는 경우:

echo 'export LDS_MODEL=LDS-02' >> ~/.bashrc

LDS-03을 사용하는 경우:

echo 'export LDS_MODEL=LDS-03' >> ~/.bashrc

지금 사용하는 Turtlebot3는 최신버전으로 LDS03 라이다를 사용합니다. 설정 후 적용합니다.

source ~/.bashrc

자신의 터틀봇3에 장착된 LDS 모델을 확인한 뒤 하나만 설정하면 됩니다.

11) ROS_LOCALHOST_ONLY 변수 설정

기본적으로 ROS2는 로컬 네트워크 전체에서 통신이 가능하지만 특정 상황에서는 ROS2 통신을 localhost로만 제한할 수 있습니다. 이 설정은 여러 로봇이나 컴퓨터가 같은 네트워크에서 혼란을 일으키지 않도록 방지할 수 있다.

ROS2 통신을 localhost로 제한하려면 다음 명령어를 실행합니다.

export ROS_LOCALHOST_ONLY=1

.bashrc에 추가하려면 아래의 명령어를 입력합니다.

echo "export ROS_LOCALHOST_ONLY=1" >> ~/.bashrc

11) 로봇 모델 설정

TurtleBot3 모델은 대표적으로 다음과 같습니다.

burger
waffle
waffle_pi

이 글에서는 TurtleBot3 Burger 모델을 기준으로 진행합니다.

이미 모델은 설정했습니다. 만약 설정이 도지 않았으면 Raspberry Pi SSH 터미널에서 다음 명령을 입력합니다.

echo 'export TURTLEBOT3_MODEL=burger' >> ~/.bashrc
source .bashrc

현재 터미널에 모델 설정이 제대로 들어갔는지 확인하려면 다음 명령을 사용할 수 있습니다.

echo $TURTLEBOT3_MODEL

출력 결과가 아래와 같으면 정상입니다.

burger

12) 설정 확인

마지막으로 현재 환경변수가 제대로 들어갔는지 확인합니다.

echo $ROS_DOMAIN_ID
echo $LDS_MODEL
echo $TURTLEBOT3_MODEL

예상 출력 예시는 다음과 같습니다.

30
LDS-01
burger

ROS 2 패키지가 정상적으로 보이는지도 확인합니다.

ros2 pkg list | grep turtlebot3

turtlebot3_bringup, turtlebot3_msgs 같은 패키지가 보이면 빌드와 환경 설정이 정상적으로 적용된 것입니다.

Leave a Comment