[ROS2-001] 개발환경 구축

10 minutes to read



본 글은 표윤석님의 001 ROS 2 개발 환경 구축 (오픈소스 소프트웨어 & 하드웨어: 로봇 기술 공유 카페 (오로카)) 글을 바탕으로 작성되었습니다.



ROS2 개발 환경 구축

ROS 2 개발을 위해 다음과 같이 개발 환경을 구축한다.

구분 내용
기본 운영 체제 Linux Mint 20.2
로봇 운영 체제 ROS 2 Foxy FItzroy
통합 개발 환경 (IDE) Visual Studio Code
프로그래밍 언어 Python 3(3.8.0), C++ 14
기타 CMake 3.16.3, Qt 5.12.5, OpenCV 4.2.0

개발환경은 오로카-001 ROS 2 개발 환경 구축에서 추천하는 설정으로 맞추었다. 이 외의 다른 선택사항이 궁금하다면 본 글을 참고하길 바란다.



기본 운영 체제

Linux Mint 20.x 대신에 Ubuntu 20.04.x LTS를 사용해도 된다. 이전에 졸업프로젝트할 때 Ubuntu 18.04 LTS를 사용한 경험이 있는데, Linux Mint는 써본 적이 없어서 궁금하기도 했다.


Linux Mint vs. Ubuntu

Feature Ubuntu 20.04 Linux Mint 20
Release Dates 2020.04.23 2020.06.25
Support Period 2025 2025
Based on Debian Ubuntu 20.04
Linux Kernel Linux 5.4 kernel Linux 5.4 kernel

Ubuntu 대신 Linux Mint를 사용하는 대략적인 이유[1]는 다음과 같다.

  1. 느리고 리소스를 많이 소모하는 Ubuntu Software Center와 달리 Linux Mint의 Software Manager는 더 가볍고 빠르다.
  2. Linux Mint는 외부 패키지 제거, 누락된 키 추가, 중복 항목 제거 등 Ubuntu에서 얻을 수 없는 옵션들을 제공한다.
  3. Ubuntu는 모든 AMD 시스템에서 정기적으로 충돌하는 반면 Linux Mint는 안정적이다.
  4. Unity 기반 그래픽인 Ubuntu와 달리, Linux Mint의 Cinnamon은 가벼운 그래픽 환경을 제공하여 속도가 빠르다.

사실 Linux Mint가 절대적으로 Ubuntu보다 좋다고 말할 수는 없다(Ubuntu의 사용자의 수가 Linux Mint보다 훨씬 많다). 찾아 본 결과, 둘이 큰 차이가 있는 것 같진 않다. 만일 기존에 windows를 사용했었고, 초보자라면 Ubuntu보다는 Linux Mint를 추천한다.


부팅 방법

나는 하나의 노트북으로 Windows와 Linux Mint를 모두 사용해야 한다. 두 가지 OS를 하나의 PC에서 동시에 사용하는 방법은 아래와 같이 크게 두 가지가 있다.

  1. Virtual Machine(가상 머신)
  2. Dual Booting (듀얼 부팅)


① Virtual Machine

Virtual Machine은 컴퓨팅 환경을 소프트웨어로 구현한 것이다. 즉, 하나의 PC안에 가상의 PC를 생성하여 사용하는 것이다. Virtual Machine을 구현하는 소프트웨어는 크게 세 가지가 있다.

  1. VirtualBox
  2. VMware
  3. 클라우드 가상머신
    EC2(Amazon Web Services), Google Compute Engine(Google Cloud Platform)

OpenSuse13.2_on_Windows_7.png

위 이미지(출처: VirtualBox)처럼 새 창 자체가 하나의 PC처럼 동작한다.

Virutal Machine은 설치 및 제거가 비교적 쉽지만 실제 물리적 PC가 아니므로 오류가 심하고, 느리고, 일부 소프트웨어를 지원하지 않는다는 단점이 있다. 따라서 간단한 작업을 할 때에는 유용하지만 개발을 하기에는 적합하지 않은 환경이다. 따라서 나는 두 번째 방법을 사용했다.


② Dual Booting

멀티 부팅은 하나의 PC의 자원을 나누어 여러 OS를 동시에 사용하는 것이다. 자원을 나눈다는 것은 partition을 나눈다는 것과 같으며, ~~~Virtual Machine과 달리 물리적 PC를 기반으로 하기때문에 일반적인 사용감과 동일하다.

Windows+Ubuntu를 사용하든 Windows+Linux Mint를 사용하든, 기본적으로 파티션 나누는 방식은 동일하다. 듀얼부팅 방법은 검색어(“windows linux mint dual boot”) 결과로 나오는 여러 포스팅 중 하나를 골라서 따라하면 된다.

img

Dual Booting을 사용하면, PC의 전원을 켤 때 위와 같은 화면이 나오며 OS를 선택할 수 있다.



Linux Mint 20.x 설치

.ISO파일 다운로드

LinuxMint에서 Linux Mint 20.2 Cinnamon Edition의 .ISO파일을 다운로드 받는다. 나는 Download mirrors에서 KAIST를 통해 다운로드받았다.

라이브 USB로 만들기

image-20210928235522477

Rufus를 이용하여 USB를 만들 수 있다. 사이트에서 사용 방법을 참고하여 ISO 파일로부터 부팅 가능한 USB 드라이브를 생성해준다.

Installation

전원이 켜질 때 F2(또는 F10 또는 F12; 삼성 노트북은 F2)를 눌러 BIOS 설정으로 들어간다. BIOS 설정에서 [Boot] 를 선택한다. 이후 Priority선택에서 위 USB 드라이브를 1순위로 선택 & Save & Exit하여 해당 OS로 들어간다. 이후 바탕화면에 있는 설치파일을 이용하여 설치해주면 된다.

※ 설치할 때에는 꼭 language를 영어로 하는 것을 추천한다. 개발할 때에는 영어 설정이 무조건 디폴트이다..! ※



Linux Mint 초기 세팅

한글 사용 가능

초반에 설치할 때 language를 영어로했다면, 한글이 입력되지 않을 것이다. 한글을 사용하는 방법은 여러가지가 있는데, 그 중 Nabi 소프트웨어를 이용한 방법을 소개한다.

  1. Software manager에서 “Nabi”를 검색 및 다운로드한다.

    image-20211004225104860

  2. [System Settings]-[Input Method]에 들어간다.

    image-20211004225157071

  3. [Korean]에서 Input method framework를 “Hangul”로 변경해준다.

    image-20211004225238531

  4. 이후 종료 후 다시 접속하면 우측 아래에 나비모양 아이콘이 생성된 것을 확인할 수 있다.

    image-20211004225341910

  5. 나비모양 아이콘을 클릭 및 설정을 변경하여 한영 변환키를 설정할 수 있다.


한국에 있는 mirror로 변경

mirror는 컴퓨팅에서 자료 모음의 복사본이다 (출처: 위키백과). 세계 각 지역에 다양하게 분포된 사용자가 해당 파일을 빠르게 다운로드할 수 있도록 하기 위해 지역별로 mirror를 두어 일종의 cache처럼 사용한다. 따라서 나는 mirror site를 한국으로 변경해주었다.

  1. [Software Sources]을 연다.

    image-20211004225704806

  2. Mirrors의 site를 한국 국기가 있는 것들로 바꿔준다.

    image-20211004225740164



로봇 운영체제

로봇 운영체제로는 ROS 2 Foxy FItzroy를 사용한다. 설치 방법은 크게 세 가지가 있다.

  1. 소스 빌드
  2. 미리 빌드된 파일 사용
  3. 데비안 패키지 사용

이 중 세 번째 방법(데비안 패키지 사용)이 설치 및 업데이트가 가장 간단하므로 해당 방법을 사용하여 설치한다.


ROS 2 설치 (데비안 패키지 이용)

데비안 패키지를 사용하여 설치하는 방법은 ros의 공식 문서: Installing ROS 2 via Debian Packages를 참고하였다.

1. Set Locale

Locale은사용자 인터페이스에서 사용되는 언어, 지역 설정, 출력 형식 등을 정의하는 문자열이다. locale이 UTF-8을 지원하도록 다음의 명령어를 통해 설정해줄 수 있다.

locale  # check for UTF-8

sudo apt update && 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


2. Setup Sources

ROS 2 apt repositories를 시스템에 추가해야한다.

APT(Advanced Packaging Tool)란?
데비안 GNU/Linux에서 소프트웨어 설치 및 제거를 위해 사용하는 설치 응용 프로그램이다. ① 사용자가 원하는 소프트웨어 패키지를 로드하고 ② 종속 항목을 자동으로 설치해주고 ③ 설치된 모든 소프트웨어에 대한 업데이트를 자동으로 해주는 역할을 한다. 설치나 업데이트를 할 때 관련 데이터는 repository라는 소프트웨어 패키지의 DB로부터 가져올 수 있다.

이를 위해 우선 아래와 같이 GPG key를 승인받는다.

sudo apt update && sudo apt install curl gnupg2 lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key  -o /usr/share/keyrings/ros-archive-keyring.gpg

이후 repository를 sources list에 추가한다.

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


3. Install ROS 2 packages

repositories를 세팅한 후 apt repository caches를 업데이트해준다.

sudo apt update
sudo apt install ros-foxy-desktop ros-foxy-rmw-fastrtps* ros-foxy-rmw-cyclonedds*
  • ros-foxy-desktop : ROS, RViz, demos, tutorials를 포함

  • ros-foxy-rmw-fastrtps* : rmw_fastrtps는 ROS 2와 eProsima’s Fast DDS 미들웨어간의 interface를 제공
  • ros-foxy-rmw-cyclonedds* : 쉽고, 빠르고, 신뢰할 수 있고, 작은 ROS 2를 위한 Eclipse Cyclone DDS 미들웨어로, 이를 통해 Eclipse Cyclone DDS를 기본 DDS 구현으로 사용할 수 있음


4. Environment Setup

다음의 file을 소싱(Sourcing)함으로써 테스트를 위한 환경을 설정할 수 있다.

source /opt/ros/foxy/setup.bash

여기까지 문제없이 설치되었다면, 몇 가지 examples를 시도해볼 수 있다. 터미널창을 두 개 열어서 아래의 예제를 수행해보도록 한다.

  • C++ talker

    source /opt/ros/foxy/setup.bash
    ros2 run demo_nodes_cpp talker
    
  • Python listener

    source /opt/ros/foxy/setup.bash
    ros2 run demo_nodes_py listener
    
  • 실행결과

    image-20211004231206247


5. ROS 개발 툴 설치

ROS 2를 이용한 로봇 프로그래밍에 필수인 소프트웨어들을 아래와 같이 설치한다.

sudo apt update && 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
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
sudo apt install --no-install-recommends -y \  libasio-dev \  libtinyxml2-dev \  libcunit1-dev


6. ROS 2 빌드 테스트

workspace 폴더를 생성한 뒤 빌드하며 ROS 2 설치가 잘 되어 빌드에 문제가 없는지를 알아본다.

source /opt/ros/foxy/setup.bashmkdir -p ~/robot_ws/srccd ~/robot_ws/colcon build --symlink-installls

아래와 같이 하위폴더로 build, install, log, src 폴더가 생성되었다면 빌드에 성공한 것이다.

image-20211004231347445


7. Run Commands 설정

source /opt/ros/foxy/setup.bash는 환경을 설정하기 위해 file을 소싱하는 명령어이다. 매번 환경설정을 불러오기가 귀찮으므로 아래와 같이 run commands(rc)만을 모아두는 bashrc 파일에 자주 사용되는 alias, source, export를 설정해두면 매우 편리하다.

nano ~/.bashrc

bashrc 파일의 기존 내용은 냅두고 맨 아래에 다음의 설정을 추가해준다.

source /opt/ros/foxy/setup.bashsource ~/robot_ws/install/local_setup.bashsource /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bashsource /usr/share/vcstool-completion/vcs.bashsource /usr/share/colcon_cd/function/colcon_cd.shexport _colcon_cd_root=~/robot_wsexport ROS_DOMAIN_ID=7export ROS_NAMESPACE=robot1export RMW_IMPLEMENTATION=rmw_fastrtps_cpp# export RMW_IMPLEMENTATION=rmw_connext_cpp# export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp# export RMW_IMPLEMENTATION=rmw_gurumdds_cpp# export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity} {time}] [{name}]: {message} ({function_name}() at {file_name}:{line_number})'export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity}]: {message}'export RCUTILS_COLORIZED_OUTPUT=1export RCUTILS_LOGGING_USE_STDOUT=0export RCUTILS_LOGGING_BUFFERED_STREAM=1alias cw='cd ~/robot_ws'alias cs='cd ~/robot_ws/src'alias ccd='colcon_cd'alias cb='cd ~/robot_ws && colcon build --symlink-install'alias cbs='colcon build --symlink-install'alias cbp='colcon build --symlink-install --packages-select'alias cbu='colcon build --symlink-install --packages-up-to'alias ct='colcon test'alias ctp='colcon test --packages-select'alias ctr='colcon test-result'alias rt='ros2 topic list'alias re='ros2 topic echo'alias rn='ros2 node list'alias killgazebo='killall -9 gazebo & killall -9 gzserver  & killall -9 gzclient'alias af='ament_flake8'alias ac='ament_cpplint'alias testpub='ros2 run demo_nodes_cpp talker'alias testsub='ros2 run demo_nodes_cpp listener'alias testpubimg='ros2 run image_tools cam2image'alias testsubimg='ros2 run image_tools showimage'


통합 개발 환경 (IDE)

VSCode는 다양한 운영체제 및 프로그래밍 언어를 지원하며, 32bit, amd64, arm64를 지원하므로 ARM 계열의 임베디드 보드에서도 사용가능하다는 장점이 있다. 따라서 ROS 2 개발 환경으로 VSCode를 설치하도록 한다.

VSCode 설치

1. 설치

visual studio-Download에서 .deb 파일을 다운로드 및 실행하여 설치한다.

image-20211004231648721


2. 실행

터미널을 열어 아래 명령어를 통해 실행한다.

code


3. Extensions 설치

image-20211004231805641

위 이미지에서 왼쪽 다섯 번째 줄의 Extensions을 클릭하여 아래의 항목들을 설치한다.

  • C/C++/Python Extensions (VS Code Extensions for C++ and Python)
    • C/C++
    • CMake
    • CMake Tools
    • Python
  • ROS Extensions (VS Code Extensions for ROS, URDF, Colcon)
    • ROS (code: ms-iot.vscode-ros)
    • URDF (code: smilerobotics.urdf)
    • Colcon Tasks (code: deitry.colcon-helper)
  • File Format Extensions (VS Code Extensions for XML, YAML, Markdown)
    • XML Tools (code: dotjoshihohnson.xml)
    • YAML (code: redhat.vscode-yaml)
    • Markdown All in One (code: yzhang.markdown-all-in-one)
  • useful Extensions (VS Code Extensions for Etc.)
    • Highlight Trailing White Spaces (code: ybaumes.highlight-trailing-white-spaces)
    • EOF Mark (code: msfukui.eof-mark)
    • Bracket Pair Colorizer (code: coenraads.bracket-pair-colorizer)
    • Better Comments (code: aaron-bond.better-comments)


4. Workspace 설정

[File]-[Add Folder to Workspace]를 선택한 뒤, 이전에 만들었던 robot_ws 디렉토리(혹은 사용하고자 하는 workspace)를 선택하여 workspace를 세팅할 수 있다.


5. User Settings

다음의 세팅을 통해 VSCode 환경에서 ROS 개발을 할 수 있다.

settings.json

settings.json은 VSCode의 사용자별 글로벌 환경 설정을 지정하는 파일로, 여기에 기술된 설정들은 모든 작업 공간(workspace)에서 적용된다 (e.g., 미니맵 사용, 세로 제한 줄 표시, 탭 사이즈 등).

[참고] How to edit settings.json in Visual Studio Code? : https://supunkavinda.blog/vscode-editing-settings-json

~/.config/Code/User/settings.json 를 아래와 같이 수정해준다.

{    "cmake.configureOnOpen": false,    "editor.minimap.enabled": false,    "editor.mouseWheelZoom": true,    "editor.renderControlCharacters": true,    "editor.rulers": [100],    "editor.tabSize": 2,    "files.associations": { // Note some extensions for ROS      "*.repos": "yaml",      "*.world": "xml",      "*.xacro": "xml"    },    "files.insertFinalNewline": true,    "files.trimTrailingWhitespace": true,    "terminal.integrated.scrollback": 1000000,    "workbench.iconTheme": "vscode-icons",    "workbench.editor.pinnedTabSizing": "compact",    "ros.distro": "foxy",       // Version of ROS    "colcon.provideTasks": true // Use the task supporting colcon}


c_cpp_properties.json

C/C++을 사용하기 위한 관련 설정이다. C/C++는 어떤 표준을 기준으로 규칙을 사용할 것인지, 컴파일 경로, intelliSense 모드 등을 설정할 수 있다.

Ctrl+shift+p를 누른 뒤, “c/c++ edit configuration (json)”을 선택하여 ~/robot_ws/.vscode/c_cpp_properties.json위치에 파일을 자동으로 생성할 수 있다. 파일 내용은 다음과 같이 설정한다.

{    "configurations": [      {        "name": "Linux",        "includePath": [          "${default}",          "${workspaceFolder}/**",          "/opt/ros/foxy/include/**"        ],        "defines": [],        "compilerPath": "/usr/bin/g++",        "cStandard": "c99",        "cppStandard": "c++14",        "intelliSenseMode": "linux-gcc-x64"      }    ],    "version": 4}


tasks.json

VSCode에서 외부 프로그램을 CLI(Command Line Interface)를 통해 연동하는 기능을 task라고 한다. ROS 2에서 빌드할 때 사용되는 colcon과 관련된 build, test, clean 작업을 task로 만들 수 있다. ~/robot_ws/.vscode/tasks.json위치에 아래의 내용을 설정한다.

{  "version": "2.0.0",  "tasks": [    {      "label": "colcon: build",      "type": "shell",      "command": "colcon build --cmake-args '-DCMAKE_BUILD_TYPE=Debug'",      "problemMatcher": [],      "group": {        "kind": "build",        "isDefault": true      }    },    {      "label": "colcon: test",      "type": "shell",      "command": "colcon test && colcon test-result"    },    {      "label": "colcon: clean",      "type": "shell",      "command": "rm -rf build install log"    }  ]}


launch.json

Launch는 Run and Debug에서 사용되는 실행 명령어이다. launch.json의 설정을 통해 Launch가 실행되기 전(즉, 디버깅하기 전)에 사용할 Task를 지정하거나 콘솔 기능을 설정할 수 있다. ~/rotob_ws/.vscode/launch.json 위치에 아래의 세팅을 통해 Python과 C++언어에 맞는 디버깅 툴을 지정할 수 있다.

{  "version": "0.2.0",  "configurations": [    {      "name": "Debug-rclpy(debugpy)",      "type": "python",      "request": "launch",      "program": "${file}",      "console": "integratedTerminal"    },    {      "name": "Debug-rclcpp(gbd)",      "type": "cppdbg",      "request": "launch",      "program": "${workspaceFolder}/install/${input:package}/lib/${input:package}/${input:node}",      "args": [],      "preLaunchTask": "colcon: build",      "stopAtEntry": true,      "cwd": "${workspaceFolder}",      "externalConsole": false,      "MIMode": "gdb",      "setupCommands": [        {          "description": "Enable pretty-printing for gdb",          "text": "-enable-pretty-printing",          "ignoreFailures": true        }      ]    }  ],  "inputs": [    {      "id": "package",      "type": "promptString",      "description": "package name",      "default": "topic_service_action_rclcpp_example"    },    {      "id": "node",      "type": "promptString",      "description": "node name",      "default": "argument"    }  ]}
  • C++은 디버깅툴로 GDB를 사용. GDB를 실행하기 전에 colcon build를 수행하도록 세팅.
  • Python은 디버깅툴로 debugpy를 사용. 별도의 빌드 없이 디버깅하도록 세팅.



기타

QtCreator

QtCreator는 GUI를 개발하는 데에 사용되는 프로그램이다.

터미널에서 아래의 명령어를 통해 손쉽게 설치할 수 있다.

sudo apt install qtcreator

이후 터미널에서 qtcreator를 입력하여 실행할 수 있다.


QtCreator ROS

QtCreator ROS는 ROS의 통일된 개발환경 구축을 위해 QtCreator의 플러그인 형태로 만든 것이다. QtCreator에 ROS 개발 환경 설정을 더 편하게 해놓았다. 설치 방법은 ROS Industrial Website의 문서를 참고했다.

  1. 설치파일 다운로드

    ROS Industrial Website의 Docs » How to Install (Users)에서 가장 최신 버전의 설치 파일을 다운로드 받는다. 나는 Bionic Online Installer(.run)를 설치하였다.

  2. 설치

    .run파일은 linux에서 직접적으로 설치가 불가능하다. 따라서 아래의 명령어를 통해 실행가능한 파일로 바꿔준 뒤, 실행한다.

    cd ~/Downloadschmod +x qtcreator-ros-bionic-latest-online-installer.runsudo ./qtcreator-ros-bionic-latest-online-installer.run
    

    ※ .run 파일이 설치된 경로로 이동해주어야한다. 나는 ~/Downloads경로에 설치했으므로 해당 디렉토리로 이동하였다. ※

    image-20211004233711987

    기본세팅은 /root/QtCreator인데, 여기에 저장하면 관리가 어렵기때문에 설치 경로는 /home/(유저네임)/QtCreator로 지정해주었다.

    image-20211004233814661

    Qt Creator 컴포넌트를 선택해준다.

    Next를 눌러가며 설치를 완료해준다.

  3. 업데이트

    QtCreator를 열어서 [Help]-[Check Updates]를 눌러준다.

    image-20211004233931049

  4. 설치가 잘 되었는지 확인

    [File]-[New File or Project]-[Projects]-[Other Project]에 “ROS Workspace” 항목이 존재한다면 모든 설치가 정상적으로 완료된 것이다.


Delete ROS 2

만일 추후에 ROS 2를 삭제하고싶다면(재설치 등의 이유로), 아래의 명령어를 통해 삭제 가능하다.

sudo apt remove ros-foxy-* && sudo apt autoremove



References

  1. “000 로봇 운영체제 ROS 강좌 목차”, 네이버카페 오로카 : https://cafe.naver.com/openrt
  2. Linux-mint vs. Ubuntu : https://itsfoss.com/linux-mint-vs-ubuntu/
  3. BIOS에서 부팅 순서 변경 방법 : https://steemit.com/kr/@nightofwin/4fsdnu