이번에 대학원 수업 로봇 OS
를 들으며 TurtleBot3 Burger
를 사용할 연구비로 살 기회가 생겼다.
TurtleBot3
는 친절하게도 Official emanual이 제공되지만, 우분투 및 각종 라이브러리의 버전업이 되어서인지 이를 그대로 따라해도 여러 에러들이 존재했다.
따라서 이번 기회에 TurtleBot3에 ROS, ROS2를 설치하고 이를 정리하는 포스팅을 진행한다.
TurtleBot3 emanual : TurtleBot3 emanual Link
설치에 앞서서, ROS
버전이 무엇인지에 따라 설치해야 하는(권장하는) OS도 달라진다. TurtleBot3
은 ROS 1
과 ROS 2
모두 지원하고 있으니 필요에 따라 버전을 선택할 수 있다.
Remote PC의 OS는 개인적으로 보유한 베어본PC
에 설치했다. 이 PC는 자체적으로 와이파이 모듈이 존재하기에, 추후에 있을 무선 네트워크 세팅에서 이점이 있을까 하여 이것으로 세팅했다.
ROS를 제어하기 위해서는 같은 네트워크 안에 있어야 하는데, 이를 충족할 수 있다면 Virtual Box를 사용하여 Ubuntu를 가상환경으로 만들어도 좋고 PC의 듀얼부팅 등을 이용하여 만들어도 좋을 것 같다.
참고로 나는 앞으로 있을 프로젝트의 확장성과 지원을 위하여 ROS 2 Foxy
를 선택했다.
물론 ROS 1 Noetic
버전도 TurtleBot3
에서 동작한다.
ROS 1 기반
OS : Ubuntu 20.04 LTS
ROS : ROS1 Noetic Ninjemys
ROS 1의 Kinetic
, Melodic
버전도 존재하지만, 선택하지 않았다.
이유는 아래에서 자세히 후술하겠지만, 라즈베리파이 4 B
에 해당 버전들을 올릴 때 정상적으로 OS를 설치할 수 없었기 때문이다.
그런 이유로 나는 RemotePC 세팅보다 TurtleBot3의 ROS 설치를 먼저 하기를 권장한다. SD카드에 이미지 파일의 쓰기 에러가 발생할 때도 많고, 하드웨어에 따라 해당 이미지가 호환이 되지 않을 가능성도 많기 때문이다. 내가 가진 라즈베리파이4B에는 ROS 1 Noetic
, ROS 2 Foxy
버전이 정상적으로 설치되었다.
개요에 작성한 TurtleBot3
의 emanual 링크를 클릭하면 아래와 같은 웹페이지로 접속된다.
Noetic
을 클릭하고 좌측의 3. Quick Start Guide -> 3.1. PC Setup
을 클릭하면 ROS 1 Noetic Ninjemys
버전 설치 가이드를 볼 수 있다.
ROS 2 기반
OS : Ubuntu 20.04 LTS
ROS : ROS2 Foxy Fitzroy
ROS 2 에는 Dashing
, Foxy
버전이 존재한다. Foxy가 최근에 나온 조금 더 업그레이드 버전이며 이를 선택하여 설치하였다. Dashing은 설치 시도를 해보지 않았는데, 이유는 지금까지 공부하던 ROS2 버전이 Foxy이기도 했고, 이미 ROS 1 Noetic을 설치하기 위해 Ubuntu 20.04버전을 설치했기 때문에, 이와 호환되는 Foxy로 선택했다.
emanual 가이드에 따라 Ubuntu 20.04를 다운로드하는 링크로 이동하여 ubuntu-20.04.6-desktop-amd64.iso
또는 ubuntu-20.04.6-live-server-amd64.iso
를 받는다. 이는 GUI 사용 버전인지, Server용으로 DOS만 출력하는 버전인지에 따라 나뉜다. 나는 GUI도 쓸 일이 있겠지 싶어 desktop버전을 설치했다.
iso파일을 USB에 굽기 위하여 Rufus 프로그램을 사용했으며, 우분투 설치의 자세한 방법을 적지는 않겠다.
Rufus Download Link
여기서부터는 베어본PC(RemotePC)에 putty를 이용한 ssh 원격 접속으로 작업을 진행했다.
베어본 PC에 와이파이를 연결하고, 해당 공유기에 DHCP, 포트포워드 설정을 진행하여 원격 접속이 가능하게 하였다.
emanual대로 쭉 진행했는데 에러없이 모두 설치되었다.
ros2 foxy를 설치하는 과정이다. 다른 과정보다 상당히 오래 걸린다.
$ wget https://raw.githubusercontent.com/ROBOTIS-GIT/robotis_tools/master/install_ros2_foxy.sh
$ sudo chmod 755 ./install_ros2_foxy.sh
$ bash ./install_ros2_foxy.sh
$ sudo apt-get install ros-foxy-gazebo-*
Install Cartographer
$ sudo apt install ros-foxy-cartographer
$ sudo apt install ros-foxy-cartographer-ros
Install Navigation2
$ sudo apt install ros-foxy-navigation2
$ sudo apt install ros-foxy-nav2-bringup
$ source ~/.bashrc
$ sudo apt install ros-foxy-dynamixel-sdk
$ sudo apt install ros-foxy-turtlebot3-msgs
$ sudo apt install ros-foxy-turtlebot3
$ echo 'export ROS_DOMAIN_ID=30 #TURTLEBOT3' >> ~/.bashrc
$ source ~/.bashrc
ROS_DOMAIN
은 RemotePC와 TurtleBot3이 동일해야 한다. 또한 같은 네트워크에 다른 ROS 시스템이 존재하면 혼선이 일어나므로, 상황에 맞게 달리 해야한다.
Remote PC 세팅을 끝내고, 이제는 TurtleBot3에 들어있는 라즈베리파이4B를 세팅해야한다.
이 또한 Turtlebot3 emanual을 참고하였다.
Turtlebot3 emanual에서 Raspberry Pi 4B ROS2 Foxy image
와, Raspberry Pi Imager
를 받아준다.
이후 SD카드를 컴퓨터에 연결한 후 Raspberry Pi Imager
를 사용하여 SD카드에 이미지를 설치하면 된다. 아래 사진처럼 운영체제 선택 부분에 사용자 정의 사용 탭을 클릭한 후 다운받은 이미지를 선택하면 된다.
이미지를 설치하는 과정에서 많은 에러를 볼 수 있었는데, ROS 1 Kinetic, Melodic은 설치가 되지 않았다. 설치하는 과정에서 SD카드 쓰기 에러가 발생하거나, 운영체제 부팅 후 에러가 발생한다.
해당 에러는 커널 및 소프트웨어의 노후화로 인하여 발생한다고 하는데, 아마 하드웨어가 업그레이드되면서 이와 호환이 잘 되지 않는 것 같다.
Ubuntu error : "This board requires newer software"
참고로 ROS 1 Noetic image도 설치에 성공했다. 처음 한두번은 SD카드 쓰기 에러가 발생했지만, 세번째즈음에 설치에 성공했고 정상 부팅되었다.
miniHDMI로 모니터와 연결하고 부팅하면 로그인 화면이 뜬다. 아래 계정으로 접속 가능하다.
Ubuntu Login
id : ubuntu
pw : turtlebot
emanual에서는 sd카드 경로에 들어가서 와이파이 정보를 수정하도록 안내하고 있지만, 윈도우 환경에서 SD카드 내부에 진입하는 방법이 잘 되지 않아 Ubuntu 내부에서 네트워크 정보를 변경하였다.
$ sudo vi /etc/netplan/50-cloud-init.yaml
녹색으로 표시된 글자를 WIFI SSID, Password로 바꾼 후 저장, 재부팅하면 라즈베리파이가 부팅된 직후 스스로 네트워크에 연결된다.
위에서의 Remote PC에 설정한 아이디와 동일하게 ID를 세팅하여 bashrc에 저장한다.
$ echo "export ROS_DOMAIN_ID=30" #TURTLEBOT3 >> ~/.bashrc
$ source ~/.bashrc
TurtleBot3 패키지는 360도 레이저 측정기인 LDS-O2
가 제공된다. 해당 패키지 또한 설치한다.
$ sudo apt update
$ sudo apt install libudev-dev
$ cd ~/turtlebot3_ws/src
$ git clone -b ros2-devel https://github.com/ROBOTIS-GIT/ld08_driver.git
$ cd ~/turtlebot3_ws/src/turtlebot3 && git pull
$ rm -r turtlebot3_cartographer turtlebot3_navigation2
$ cd ~/turtlebot3_ws && colcon build --symlink-install
여기서, $ sudo apt update
적용 시 에러가 발생할 수 있다.
error : Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 5572
해당 에러는 캐시 lock을 모두 지우고 다시 update를 진행하면 해결된다.
$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
이후 LDS-01
인지, LDS-02
인지를 선택하여 아래 export 부분에 적용하면 된다.
$ echo 'export LDS_MODEL=LDS-02' >> ~/.bashrc
$ source ~/.bashrc
이것의 세팅 또한 emanual의 3.3. OpenCR Setup
에서 확인할 수 있다. 해당 작업은 라즈베리파이와 OpenCR 보드가 microUSB Cable로 연결되어 있어야 적용할 수 있다.
$ sudo dpkg --add-architecture armhf
$ sudo apt update
$ sudo apt install libc6:armhf
$ export OPENCR_PORT=/dev/ttyACM0
$ export OPENCR_MODEL=burger
$ rm -rf ./opencr_update.tar.bz2
$ wget https://github.com/ROBOTIS-GIT/OpenCR-Binaries/raw/master/turtlebot3/ROS2/latest/opencr_update.tar.bz2
$ tar -xvf ./opencr_update.tar.bz2
$ cd ~/opencr_update
$ ./update.sh $OPENCR_PORT $OPENCR_MODEL.opencr
해당 설치가 정상적으로 끝나면 OpenCR에서 뾰로롱 소리가 출력된다
해당 포스팅은 RemotePC 및 TurtleBot3 모두 우분투를 설치한 후 아래와 같은 방법으로 SSH를 구성한 후 원격 접속했다. 나중에 따로 정리예정...
공유기 iptime 관리자페이지 접속 (192.168.0.1)
NAT/라우터관리 -> 포트포워드 설정 -> turtlebot3가 연결한 ip, 오픈할 포트 ##번(tcp) 내부, 외부 열기
네트워크 관리 - DHCP 서버 설정 - 사용중인 ip 주소 정보에서 turtlebot3의 주소, mac 등록
$ sudo apt install openssh-server
$ sudo vi /etc/ssh/sshd_config
수정 : Port 22 -> Port #####
$ systemctl restart sshd
$ systemctl restart ssh
ssh 상태 확인 -> running 상태 뜨면 OK
$ sudo systemctl status ssh
$ ssh -p <port> username@ip_address
저도 따라서 wasd로 터틀봇3 움직이게는 해보았는데
생각해보니 ssh로 원격에서 로그인해서 결국 로컬로 움직인거 같은데
실제적 ros2 리모트 제어하는 방식은 아닌거 같은데 맞나요