본문 바로가기

작업 일기

ROS2 개발 환경 구축

- 개발 환경 : Linux mint 20.3, ROS 2 Foxy

- 참조 : https://cafe.naver.com/openrt/25288

 

 

Step1. Linux mint 20.3 설치

- https://do-9un6.tistory.com/31

 

 

 

Step2. ROS 2 Foxy Fitzroy 설치

- https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Debians.html

 

1. 지역 설정

$ 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

 

2. 소스 설정

$ 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

$ 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

 

* 참고로 apt/sources.list 에서 리눅스 민트 20.1이라면 'lsb_release -cs' 명령어를 통해 ulyssa 이라고 나오겠지만 우분투에서 관리하고 있는 데비안 패키지 리스트를 사용하기 위해 우분투 20.04 코드명인 'focal'를 사용함.

 

3. ROS 2 패키지 설치

$ sudo apt update
$ sudo apt install ros-foxy-desktop ros-foxy-rmw-fastrtps* ros-foxy-rmw-cyclonedds*

 

4. ROS 2 패키지 확인

- 문제없이 설치되었다면 하기와 같이 두 터미널 창에서 ROS 2의 기본적인 퍼블리시와 서브스크라이브 동작을 확인 가능하다.

$ source /opt/ros/foxy/setup.bash
$ ros2 run demo_nodes_cpp talker
[INFO] [1612912263.574031946] [talker]: Publishing: 'Hello World: 1'
[INFO] [1612912264.574010597] [talker]: Publishing: 'Hello World: 2'
[INFO] [1612912265.574381893] [talker]: Publishing: 'Hello World: 3'
[INFO] [1612912266.574508130] [talker]: Publishing: 'Hello World: 4'
[INFO] [1612912267.574615200] [talker]: Publishing: 'Hello World: 5'
[INFO] [1612912268.574767202] [talker]: Publishing: 'Hello World: 6'
[INFO] [1612912269.574953419] [talker]: Publishing: 'Hello World: 7'
...
$ source /opt/ros/foxy/setup.bash
$ ros2 run demo_nodes_py listener
[INFO] [1612912265.593335793] [listener]: I heard: [Hello World: 3]
[INFO] [1612912266.576514520] [listener]: I heard: [Hello World: 4]
[INFO] [1612912267.576780341] [listener]: I heard: [Hello World: 5]
[INFO] [1612912268.576769156] [listener]: I heard: [Hello World: 6]
[INFO] [1612912269.577142775] [listener]: I heard: [Hello World: 7]
...

 

 

 

Step3. ROS 2 개발 툴 설치

- 아래의 소프트웨어는 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

 

 

 

Step4. ROS 2 빌드 테스트

- ROS 2 Foxy Fitzroy 설치를 마쳤으면 하기와 같이 'robot_ws' 이라는 이름으로 워크스페이스 폴더를 생성한 후 빌드를 해보자. 참고로 'robot_ws' 이름 대신에 원하는 이름이 있다면 마음껏 변경이 가능하고 아래 빌드는 워크스페이스에 패키지가 하나도 없기에 무엇인가를 빌드하는 것이 아닌 환경 셋팅을 하고 ROS 2 설치가 잘 되어 빌드에 문제가 없는지 알아보는 과정이다.

$ source /opt/ros/foxy/setup.bash
$ mkdir -p ~/robot_ws/src
$ cd ~/robot_ws/
$ colcon build --symlink-install

위 과정대로 진행하여 환경 설정 및 빌드에 문제가 없었다면 워크스페이스 폴더의 하위 폴더로 src 이외에도 build, install, log 폴더가 생성되는 것을 확인할 수 있을 것이다.



 

Step5. Run commands 설정

- 위에서 ROS 2 설치 이후에 `source /opt/ros/foxy/setup.bash` 를 설정 한 후, talker 노드 및 listener 노드를 실행하였는데 `source /opt/ros/foxy/setup.bash` 와 같은 환경 설정을 매번 불러오기란 매우 귀찮을 수 있다. 이에 하기와 같이 Run commands(rc)를 모아두는 bashrc 파일에 많이 사용되는 alias, source, export 을 설정해두면 ROS 2 개발 및 사용에 있어서 매우 편리하다.

$ nano ~/.bashrc 
(또는 vim ~/.bashrc 또는 xed ~/.bashrc)

- bashrc 파일을 편집할 때에는 nano, vim, xed 등 원하는 편집기를 사용하면 되고 bashrc 파일의 기존 내용은 그대로 두고 맨 아래에 하기 설정들을 추가해주면 된다.

source /opt/ros/foxy/setup.bash
source ~/robot_ws/install/local_setup.bash

source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash
source /usr/share/vcstool-completion/vcs.bash
source /usr/share/colcon_cd/function/colcon_cd.sh
export _colcon_cd_root=~/robot_ws

export ROS_DOMAIN_ID=7
export ROS_NAMESPACE=robot1

export 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=1
export RCUTILS_LOGGING_USE_STDOUT=0
export RCUTILS_LOGGING_BUFFERED_STREAM=1

alias 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'

 

 

 

Step6. 통합 개발 환경 (IDE) 설치

- ROS 2 개발 환경에서 IDE는 Visual Studio Code (이하 VSCode)를 추천한다. VSCode는 Linux, Windows, macOS와 같이 다양한 운영체제를 지원하는 크로스 플랫폼 에디터이고 다양한 프로그래밍 언어를 지원하고 있다. 그리고 32비트 계열은 물론 amd64, arm64를 지원하고 있어서 ARM 계열의 임베디드 보드에서도 사용 가능하다. 더불어 텍스트 에디터 형태로 매우 가벼우면서 IntelliSense와 Git 기능과 같은 다양한 기능을 확장(extension) 기능으로 제공하고 있다. ROS를 지원하는 IDE 중 한가지를 더 추천하자면 QtCreator이다. QtCreator는 ROS 2의 RQt의 Plugin 개발에 UI 작성할 때 편리하기에 서브로 사용하면 좋을 듯싶다.

1. Visual Studio Code 설치

- https://code.visualstudio.com/Download 에서 '.deb'의 데비안 설치파일 다운로드

 

2. 실행

$ code

 

3. 확장 설치

- Extensions (`Ctrl + Shift + x`)으로 이동

- 아래의 C/C++/Python/ROS/File Format/유용한 Extensions 추가

 

* C/C++/Python Extensions (VS Code Extensions for C++ and Python)

이름
코드명
설명
C/C++
C/C ++ IntelliSense, 디버깅 및 코드 검색
CMake
CMake 언어 지원
CMake Tools
CMake 언어 지원 및 다양한 툴
Python
린팅, 디버깅, Intellisense, 코드 서식 지정, 리팩토링, 단위 테스트 등

* ROS Extensions (VS Code Extensions for ROS, URDF, Colcon)

이름
코드명
설명
ROS
ROS 개발 지원
URDF
URDF/xacro 지원
Colcon Tasks
Colcon 명령어를 위한 VSCode Task

* File Format Extensions (VS Code Extensions for XML, YAML, Markdown)

이름
코드명
설명
XML Tools
XML, XQuery, XPath 지원
YAML
YAML 지원
Markdown All in One
Markdown 지원

* 유용한 Extensions (VS Code Extensions for Etc.)

이름
코드명
설명
Highlight Trailing White Spaces
의미 없이 사용된 공백의 스페이스 문자 강조
EOF Mark
[EOF]이 없이 끝난 파일에 [EOF] 문자 추가
Better Comments
alert, informational, TODO 등의 코멘트 강화 기능

4. 워크스페이스 설정

- "File" > "Add Folder to Workspace..." 메뉴 선택

- "robot_ws" 폴더 선택

 
5. VSCode의 개발 환경 설정
- 아래의 6 ~ 9과정은 VSCode의 개발 환경 설정이다. 이 설정 과정에서 settings.json / c_cpp_properties.json / tasks.json / launch.json 파일을 사용하는데 없다면 다음 위치에 생성해주도록 하자. 참고로 리눅스에서 '.' 이 접두어로 붙은 폴더 및 파일은 숨겨져 있는 폴더나 파일임을 기억하자.

~/.config/Code/User/settings.json

~/robot_ws/.vscode/c_cpp_properties.json

~/robot_ws/.vscode/tasks.json

~/robot_ws/.vscode/launch.json


6. User settings 설정

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

- ROS와 관련된 설정은 3가지 정도로 'ms-iot.vscode-ros'의 '"ros.distro": "foxy"'와 같이 ROS 버전을 지정하고, 'deitry.colcon-helper'의 '"colcon.provideTasks": true'와 같이 colcon이 지원되는 Task를 사용한다는 의미로 지정한다. 그리고 "files.associations"을 통해 확장자로 알 수 없는 *.repos, *.world, *.xacro 와 같이 ROS에서만 사용되는 파일명을 파일 형식이 무엇인지 명시해주는 설정을 하게된다.

- User settings 설정의 전문은 아래와 같다. ~/.config/Code/User/ 에 위치한 settings.json 에 다음과 같이 설정하면 된다. 물론 본인이 즐겨사용하는 설정이 있다면 함께 적어주면 된다.
$ cd ~/.config/Code/User
$ touch settings.json
$ nano settings.json
{
  "cmake.configureOnOpen": false,
  "editor.minimap.enabled": false,
  "editor.mouseWheelZoom": true,
  "editor.renderControlCharacters": true,
  "editor.rulers": [100],
  "editor.tabSize": 2,
  "files.associations": {
    "*.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",
  "colcon.provideTasks": true
}
 

7. C/C++ properties 설정

- C/C++ 관련 설정이다. 현재 지정한 작업 공간 (여기서는 ~/robot_ws)의 운영체제는 무엇인지, include 폴더의 경로는 어떻게 되는지, C/C++ 규칙은 어떤 표준을 기준을 사용할지의 여부, 컴파일의 경로, intelliSense[24] 모드 등을 설정하게 된다.

$ cd ~/robot_ws/.vscode
$ touch c_cpp_properties.json
$ nano 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
}

 

8. Task 설정

- VSCode에서는 외부 프로그램을 Command Line Interface (CLI) 을 통해 연동하게 하는 기능이 있는데 이를 Task [25]라고 한다. 단순한 텍스트 에디터 기능이 기본인 VSCode가 다양한 기능을 수행하고 쉽게 기능 확장을 사용할 수 있게 된 것도 이 Task 기능이 있었기 때문이다.

- 아래의 내용은 ROS 2에서 빌드할 때 사용되는 colcon과 관려한 build, test, clean 작업을 Task로 만들었다. 이를 통해 VScode에서 `Ctrl + Shift + b`로 빌드할 수 있고 아래와 같이 기본 설정 이외의 Task도 실행할 수 있다.

- `Ctrl + Shift + p` > Tasks: Run Task > 지정한 Task 선택

$ ~/robot_ws/.vscode
$ touch tasks.json
$ nano 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"

    }
  ]
}

 

9. launch 설정

- VSCode에서의 Launch는 'Run and Debug' (`Ctrl + Shift + d`)에서 사용되는 실행 명령어로 언어별, 디버거별로 설정이 가능하고 세부 옵션으로 Launch가 실행되기 전 즉 디버깅하기 전에 사용할 Task를 지정하거나 콘솔 기능을 설정할 수도 있다.

- 여기서는 ROS 2에서 많이 사용되는 Python과 C++ 언어에 맞추어 VSCode의 디버깅 툴을 지정하였다. C++의 경우 GDB[12], Python의 경우 debugpy[13]으로 설정하였고 Python의 경우 별도 빌드 없이 디버깅하도록 하였고, C++의 경우에는 GDB를 실행하기 전에 colcon build 를 수행하도록 하였다.

$ ~/robot_ws/.vscode
$ touch launch.json
$ nano launch.json
{
  "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"
    }
  ]
}

 

10. 빌드

- `Ctrl + Shift + b` 단축키로 빌드를 진행할 수 있다.

 

11. 디버깅

- `Ctrl + Shift + d` 단축키로 빌드를 진행할 수 있다. C++, Python 과 같이 언어별로 다른데 아래의 GIF 그림과 실행 순서를 참고하여 각 언어에 맞게 디버깅해보자.

 
11-1) rclcpp

- Run and Debug (`Ctrl + Shift + d`)로 이동

- "Debug-rclcpp(gbd)" 선택

- "Package name" 입력 (예: topic_service_action_rclcpp_example)

- "node name" 입력 (예: argument)

- Start Debugging 클릭 (`F5`)



11-2) rclpy

- Run and Debug (`Ctrl + Shift + d`)로 이동

- "Debug-rclpy(debugpy)" 선택

- Start Debugging 클릭 (`F5`)



* QtCreator

더보기

- 설치

$ sudo apt install qtcreator
 
-실행
$ qtcreator

 

- QtCreator ROS 다운

https://ros-qtc-plugin.readthedocs.io/en/latest/index.html 에서 `Installation Instructions (Users)` 항목에서 신규 qtcreator-ros를 다운로드 받고 설정

 

- QtCreator ROS 실행

$ qtcreator-ros

 

* 기타

더보기

- 통합 개발 환경은 개발자 선호도에 따라 결정되는 것이 일반적인데 이 강좌에서 소개하지 못한 Vim, Eclipse, CLion, Emacs 등의 IDE들은 하기 링크에서 정보를 얻어 사용하도록 하자.

 

 

Step7. ROS 삭제

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