[ROS2-001] 개발환경 구축
본 글은 표윤석님의 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]는 다음과 같다.
- 느리고 리소스를 많이 소모하는 Ubuntu Software Center와 달리 Linux Mint의 Software Manager는 더 가볍고 빠르다.
- Linux Mint는 외부 패키지 제거, 누락된 키 추가, 중복 항목 제거 등 Ubuntu에서 얻을 수 없는 옵션들을 제공한다.
- Ubuntu는 모든 AMD 시스템에서 정기적으로 충돌하는 반면 Linux Mint는 안정적이다.
- Unity 기반 그래픽인 Ubuntu와 달리, Linux Mint의 Cinnamon은 가벼운 그래픽 환경을 제공하여 속도가 빠르다.
사실 Linux Mint가 절대적으로 Ubuntu보다 좋다고 말할 수는 없다(Ubuntu의 사용자의 수가 Linux Mint보다 훨씬 많다). 찾아 본 결과, 둘이 큰 차이가 있는 것 같진 않다. 만일 기존에 windows를 사용했었고, 초보자라면 Ubuntu보다는 Linux Mint를 추천한다.
부팅 방법
나는 하나의 노트북으로 Windows와 Linux Mint를 모두 사용해야 한다. 두 가지 OS를 하나의 PC에서 동시에 사용하는 방법은 아래와 같이 크게 두 가지가 있다.
- Virtual Machine(가상 머신)
- Dual Booting (듀얼 부팅)
① Virtual Machine
Virtual Machine은 컴퓨팅 환경을 소프트웨어로 구현한 것이다. 즉, 하나의 PC안에 가상의 PC를 생성하여 사용하는 것이다. Virtual Machine을 구현하는 소프트웨어는 크게 세 가지가 있다.
위 이미지(출처: VirtualBox)처럼 새 창 자체가 하나의 PC처럼 동작한다.
Virutal Machine은 설치 및 제거가 비교적 쉽지만 실제 물리적 PC가 아니므로 오류가 심하고, 느리고, 일부 소프트웨어를 지원하지 않는다는 단점이 있다. 따라서 간단한 작업을 할 때에는 유용하지만 개발을 하기에는 적합하지 않은 환경이다. 따라서 나는 두 번째 방법을 사용했다.
② Dual Booting
멀티 부팅은 하나의 PC의 자원을 나누어 여러 OS를 동시에 사용하는 것이다. 자원을 나눈다는 것은 partition을 나눈다는 것과 같으며, ~~~Virtual Machine과 달리 물리적 PC를 기반으로 하기때문에 일반적인 사용감과 동일하다.
Windows+Ubuntu를 사용하든 Windows+Linux Mint를 사용하든, 기본적으로 파티션 나누는 방식은 동일하다. 듀얼부팅 방법은 검색어(“windows linux mint dual boot”) 결과로 나오는 여러 포스팅 중 하나를 골라서 따라하면 된다.
Dual Booting을 사용하면, PC의 전원을 켤 때 위와 같은 화면이 나오며 OS를 선택할 수 있다.
Linux Mint 20.x 설치
.ISO파일 다운로드
LinuxMint에서 Linux Mint 20.2 Cinnamon Edition의 .ISO파일을 다운로드 받는다. 나는 Download mirrors에서 KAIST를 통해 다운로드받았다.
라이브 USB로 만들기
Rufus를 이용하여 USB를 만들 수 있다. 사이트에서 사용 방법을 참고하여 ISO 파일로부터 부팅 가능한 USB 드라이브를 생성해준다.
Installation
전원이 켜질 때 F2(또는 F10 또는 F12; 삼성 노트북은 F2)를 눌러 BIOS 설정으로 들어간다. BIOS 설정에서 [Boot] 를 선택한다. 이후 Priority선택에서 위 USB 드라이브를 1순위로 선택 & Save & Exit하여 해당 OS로 들어간다. 이후 바탕화면에 있는 설치파일을 이용하여 설치해주면 된다.
※ 설치할 때에는 꼭 language를 영어로 하는 것을 추천한다. 개발할 때에는 영어 설정이 무조건 디폴트이다..! ※
- [참고] BIOS에서 부팅 순서 변경 방법 : https://steemit.com/kr/@nightofwin/4fsdnu
- [참고] Linux Mint 20설치 방법(ISO다운로드부터 설치까지): https://websetnet.net/ko/how-to-install-linux-mint-20-the-simplest-way-possible/
Linux Mint 초기 세팅
한글 사용 가능
초반에 설치할 때 language를 영어로했다면, 한글이 입력되지 않을 것이다. 한글을 사용하는 방법은 여러가지가 있는데, 그 중 Nabi 소프트웨어를 이용한 방법을 소개한다.
-
Software manager에서 “Nabi”를 검색 및 다운로드한다.
-
[System Settings]-[Input Method]에 들어간다.
-
[Korean]에서 Input method framework를 “Hangul”로 변경해준다.
-
이후 종료 후 다시 접속하면 우측 아래에 나비모양 아이콘이 생성된 것을 확인할 수 있다.
-
나비모양 아이콘을 클릭 및 설정을 변경하여 한영 변환키를 설정할 수 있다.
한국에 있는 mirror로 변경
mirror는 컴퓨팅에서 자료 모음의 복사본이다 (출처: 위키백과). 세계 각 지역에 다양하게 분포된 사용자가 해당 파일을 빠르게 다운로드할 수 있도록 하기 위해 지역별로 mirror를 두어 일종의 cache처럼 사용한다. 따라서 나는 mirror site를 한국으로 변경해주었다.
-
[Software Sources]을 연다.
-
Mirrors의 site를 한국 국기가 있는 것들로 바꿔준다.
로봇 운영체제
로봇 운영체제로는 ROS 2 Foxy FItzroy를 사용한다. 설치 방법은 크게 세 가지가 있다.
- 소스 빌드
- 미리 빌드된 파일 사용
- 데비안 패키지 사용
이 중 세 번째 방법(데비안 패키지 사용)이 설치 및 업데이트가 가장 간단하므로 해당 방법을 사용하여 설치한다.
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를 시스템에 추가해야한다.
데비안 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
-
실행결과
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
폴더가 생성되었다면 빌드에 성공한 것이다.
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 파일을 다운로드 및 실행하여 설치한다.
2. 실행
터미널을 열어 아래 명령어를 통해 실행한다.
code
3. Extensions 설치
위 이미지에서 왼쪽 다섯 번째 줄의 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의 문서를 참고했다.
-
설치파일 다운로드
ROS Industrial Website의 Docs » How to Install (Users)에서 가장 최신 버전의 설치 파일을 다운로드 받는다. 나는 Bionic Online Installer(.run)를 설치하였다.
-
설치
.run파일은 linux에서 직접적으로 설치가 불가능하다. 따라서 아래의 명령어를 통해 실행가능한 파일로 바꿔준 뒤, 실행한다.
cd ~/Downloadschmod +x qtcreator-ros-bionic-latest-online-installer.runsudo ./qtcreator-ros-bionic-latest-online-installer.run
※ .run 파일이 설치된 경로로 이동해주어야한다. 나는
~/Downloads
경로에 설치했으므로 해당 디렉토리로 이동하였다. ※기본세팅은
/root/QtCreator
인데, 여기에 저장하면 관리가 어렵기때문에 설치 경로는/home/(유저네임)/QtCreator
로 지정해주었다.Qt Creator 컴포넌트를 선택해준다.
Next를 눌러가며 설치를 완료해준다.
-
업데이트
QtCreator를 열어서 [Help]-[Check Updates]를 눌러준다.
-
설치가 잘 되었는지 확인
[File]-[New File or Project]-[Projects]-[Other Project]에 “ROS Workspace” 항목이 존재한다면 모든 설치가 정상적으로 완료된 것이다.
Delete ROS 2
만일 추후에 ROS 2를 삭제하고싶다면(재설치 등의 이유로), 아래의 명령어를 통해 삭제 가능하다.
sudo apt remove ros-foxy-* && sudo apt autoremove
References
- “000 로봇 운영체제 ROS 강좌 목차”, 네이버카페 오로카 : https://cafe.naver.com/openrt
- Linux-mint vs. Ubuntu : https://itsfoss.com/linux-mint-vs-ubuntu/
- BIOS에서 부팅 순서 변경 방법 : https://steemit.com/kr/@nightofwin/4fsdnu